Commit 52d2bc4b by Maurits van Beusekom

Allow requesting permissions when location services are disabled

parent 7f9322c6
# Flutter Permission handler Plugin
[![pub package](https://img.shields.io/pub/v/permission_handler.svg)](https://pub.dartlang.org/packages/permission_handler)
[![pub package](https://img.shields.io/pub/v/permission_handler.svg)](https://pub.dartlang.org/packages/permission_handler) [![Build Status](https://app.bitrise.io/app/fa4f5d4bf452bcfb/status.svg?token=HorGpL_AOw2llYz39CjmdQ&branch=master)](https://app.bitrise.io/app/fa4f5d4bf452bcfb) [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://github.com/tenhobi/effective_dart)
A permissions plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
Branch | Build Status
------- | ------------
develop | [![Build Status](https://app.bitrise.io/app/fa4f5d4bf452bcfb/status.svg?token=HorGpL_AOw2llYz39CjmdQ&branch=develop)](https://app.bitrise.io/app/fa4f5d4bf452bcfb)
master | [![Build Status](https://app.bitrise.io/app/fa4f5d4bf452bcfb/status.svg?token=HorGpL_AOw2llYz39CjmdQ&branch=master)](https://app.bitrise.io/app/fa4f5d4bf452bcfb)
## Features
* Check if a permission is granted.
......
......@@ -100,15 +100,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
//PERMISSION_STATUS
private static final int PERMISSION_STATUS_DENIED = 0;
private static final int PERMISSION_STATUS_DISABLED = 1;
private static final int PERMISSION_STATUS_GRANTED = 2;
private static final int PERMISSION_STATUS_RESTRICTED = 3;
private static final int PERMISSION_STATUS_UNKNOWN = 4;
private static final int PERMISSION_STATUS_NEWER_ASK_AGAIN = 5;
private static final int PERMISSION_STATUS_GRANTED = 1;
private static final int PERMISSION_STATUS_RESTRICTED = 2;
private static final int PERMISSION_STATUS_UNKNOWN = 3;
private static final int PERMISSION_STATUS_NEWER_ASK_AGAIN = 4;
@Retention(RetentionPolicy.SOURCE)
@IntDef({
PERMISSION_STATUS_DENIED,
PERMISSION_STATUS_DISABLED,
PERMISSION_STATUS_GRANTED,
PERMISSION_STATUS_RESTRICTED,
PERMISSION_STATUS_UNKNOWN,
......@@ -318,11 +316,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
}
}
if (permission == PERMISSION_GROUP_LOCATION || permission == PERMISSION_GROUP_LOCATION_ALWAYS || permission == PERMISSION_GROUP_LOCATION_WHEN_IN_USE) {
if (!isLocationServiceEnabled(context)) {
return PERMISSION_STATUS_DISABLED;
}
}
return PERMISSION_STATUS_GRANTED;
}
......@@ -474,13 +467,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
mRequestResults.put(PERMISSION_GROUP_SPEECH, toPermissionStatus(permission, result));
}
} else if (permission == PERMISSION_GROUP_LOCATION_ALWAYS) {
@PermissionStatus int permissionStatus = determineActualLocationStatus(permission, result);
@PermissionStatus int permissionStatus = toPermissionStatus(permission, result);
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus);
}
} else if (permission == PERMISSION_GROUP_LOCATION) {
@PermissionStatus int permissionStatus = determineActualLocationStatus(permission, result);
@PermissionStatus int permissionStatus = toPermissionStatus(permission, result);
if (VERSION.SDK_INT < VERSION_CODES.Q) {
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
......@@ -503,23 +496,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
processResult();
}
/**
* Crosschecks a permission grant result with the location service availability.
*
* @param grantResult Grant Result as received from the Android system.
*/
@PermissionStatus
private int determineActualLocationStatus(@PermissionGroup int permission, int grantResult) {
final Context context =
mRegistrar.activity() == null ? mRegistrar.activeContext() : mRegistrar.activity();
final boolean isLocationServiceEnabled = context != null && isLocationServiceEnabled(context);
@PermissionStatus int permissionStatus = toPermissionStatus(permission, grantResult);
if (permissionStatus == PERMISSION_STATUS_GRANTED && !isLocationServiceEnabled) {
permissionStatus = PERMISSION_STATUS_DISABLED;
}
return permissionStatus;
}
private void handleIgnoreBatteryOptimizationsRequest(boolean granted) {
if (mResult == null) {
return;
......
......@@ -241,7 +241,7 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
"${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
......
......@@ -34,7 +34,7 @@ class MyApp extends StatelessWidget {
permission != PermissionGroup.storage &&
permission !=
PermissionGroup.ignoreBatteryOptimizations &&
permission != PermissionGroup.access_media_location;
permission != PermissionGroup.accessMediaLocation;
} else {
return permission != PermissionGroup.unknown &&
permission != PermissionGroup.mediaLibrary &&
......
......@@ -105,7 +105,6 @@ typedef NS_ENUM(int, PermissionGroup) {
typedef NS_ENUM(int, PermissionStatus) {
PermissionStatusDenied = 0,
PermissionStatusDisabled,
PermissionStatusGranted,
PermissionStatusRestricted,
PermissionStatusUnknown,
......
......@@ -96,11 +96,6 @@
PermissionStatus status = [LocationPermissionStrategy
determinePermissionStatus:permission authorizationStatus:authorizationStatus];
if ((status == PermissionStatusGranted || status == PermissionStatusDenied)
&& ![CLLocationManager locationServicesEnabled]) {
return PermissionStatusDisabled;
}
return status;
}
......
......@@ -69,12 +69,7 @@
permissionStatus = PermissionStatusGranted;
}
if ((permissionStatus == PermissionStatusGranted || permissionStatus == PermissionStatusDenied) && ![CMMotionActivityManager isActivityAvailable]) {
return PermissionStatusDisabled;
} else {
return permissionStatus;
}
return permissionStatus;
}
return PermissionStatusUnknown;
......
......@@ -8,28 +8,24 @@ class PermissionStatus {
/// Permission to access the requested feature is denied by the user.
static const PermissionStatus denied = PermissionStatus._(0);
/// The feature is disabled (or not available) on the device.
static const PermissionStatus disabled = PermissionStatus._(1);
/// Permission to access the requested feature is granted by the user.
static const PermissionStatus granted = PermissionStatus._(2);
static const PermissionStatus granted = PermissionStatus._(1);
/// Permission to access the requested feature is denied by the OS (only on
/// iOS). The user cannot change this app's status, possibly due to active
/// restrictions such as parental controls being in place.
static const PermissionStatus restricted = PermissionStatus._(3);
static const PermissionStatus restricted = PermissionStatus._(2);
/// Permission is in an unknown state
static const PermissionStatus unknown = PermissionStatus._(4);
static const PermissionStatus unknown = PermissionStatus._(3);
/// Permission to access the requested feature is denied by the user and
/// never show selected (only on Android).
static const PermissionStatus neverAskAgain = PermissionStatus._(5);
static const PermissionStatus neverAskAgain = PermissionStatus._(4);
/// Returns a list of all possible [PermissionStatus] values.
static const List<PermissionStatus> values = <PermissionStatus>[
denied,
disabled,
granted,
restricted,
unknown,
......@@ -38,7 +34,6 @@ class PermissionStatus {
static const List<String> _names = <String>[
'denied',
'disabled',
'granted',
'restricted',
'unknown',
......@@ -169,12 +164,12 @@ class PermissionGroup {
/// Android: Allows an application to access any geographic locations
/// persisted in the user's shared collection.
static const PermissionGroup access_media_location = PermissionGroup._(17);
static const PermissionGroup accessMediaLocation = PermissionGroup._(17);
/// When running on Android Q and above: Activity Recognition
/// When running on Android < Q: Nothing
/// iOS: Nothing
static const PermissionGroup activity_recognition = PermissionGroup._(18);
static const PermissionGroup activityRecognition = PermissionGroup._(18);
/// The unknown permission only used for return type, never requested
static const PermissionGroup unknown = PermissionGroup._(19);
......@@ -198,8 +193,8 @@ class PermissionGroup {
storage,
ignoreBatteryOptimizations,
notification,
access_media_location,
activity_recognition,
accessMediaLocation,
activityRecognition,
unknown,
];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment