Commit 52d2bc4b by Maurits van Beusekom

Allow requesting permissions when location services are disabled

parent 7f9322c6
# Flutter Permission handler Plugin # 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. 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 ## Features
* Check if a permission is granted. * Check if a permission is granted.
......
...@@ -100,15 +100,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -100,15 +100,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
//PERMISSION_STATUS //PERMISSION_STATUS
private static final int PERMISSION_STATUS_DENIED = 0; private static final int PERMISSION_STATUS_DENIED = 0;
private static final int PERMISSION_STATUS_DISABLED = 1; private static final int PERMISSION_STATUS_GRANTED = 1;
private static final int PERMISSION_STATUS_GRANTED = 2; private static final int PERMISSION_STATUS_RESTRICTED = 2;
private static final int PERMISSION_STATUS_RESTRICTED = 3; private static final int PERMISSION_STATUS_UNKNOWN = 3;
private static final int PERMISSION_STATUS_UNKNOWN = 4; private static final int PERMISSION_STATUS_NEWER_ASK_AGAIN = 4;
private static final int PERMISSION_STATUS_NEWER_ASK_AGAIN = 5;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
PERMISSION_STATUS_DENIED, PERMISSION_STATUS_DENIED,
PERMISSION_STATUS_DISABLED,
PERMISSION_STATUS_GRANTED, PERMISSION_STATUS_GRANTED,
PERMISSION_STATUS_RESTRICTED, PERMISSION_STATUS_RESTRICTED,
PERMISSION_STATUS_UNKNOWN, PERMISSION_STATUS_UNKNOWN,
...@@ -318,11 +316,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -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; return PERMISSION_STATUS_GRANTED;
} }
...@@ -474,13 +467,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -474,13 +467,13 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
mRequestResults.put(PERMISSION_GROUP_SPEECH, toPermissionStatus(permission, result)); mRequestResults.put(PERMISSION_GROUP_SPEECH, toPermissionStatus(permission, result));
} }
} else if (permission == PERMISSION_GROUP_LOCATION_ALWAYS) { } 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)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus); mRequestResults.put(PERMISSION_GROUP_LOCATION_ALWAYS, permissionStatus);
} }
} else if (permission == PERMISSION_GROUP_LOCATION) { } 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 (VERSION.SDK_INT < VERSION_CODES.Q) {
if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) { if (!mRequestResults.containsKey(PERMISSION_GROUP_LOCATION_ALWAYS)) {
...@@ -503,23 +496,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler { ...@@ -503,23 +496,6 @@ public class PermissionHandlerPlugin implements MethodCallHandler {
processResult(); 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) { private void handleIgnoreBatteryOptimizationsRequest(boolean granted) {
if (mResult == null) { if (mResult == null) {
return; return;
......
...@@ -241,7 +241,7 @@ ...@@ -241,7 +241,7 @@
); );
inputPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${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"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( outputPaths = (
......
...@@ -34,7 +34,7 @@ class MyApp extends StatelessWidget { ...@@ -34,7 +34,7 @@ class MyApp extends StatelessWidget {
permission != PermissionGroup.storage && permission != PermissionGroup.storage &&
permission != permission !=
PermissionGroup.ignoreBatteryOptimizations && PermissionGroup.ignoreBatteryOptimizations &&
permission != PermissionGroup.access_media_location; permission != PermissionGroup.accessMediaLocation;
} else { } else {
return permission != PermissionGroup.unknown && return permission != PermissionGroup.unknown &&
permission != PermissionGroup.mediaLibrary && permission != PermissionGroup.mediaLibrary &&
......
...@@ -105,7 +105,6 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -105,7 +105,6 @@ typedef NS_ENUM(int, PermissionGroup) {
typedef NS_ENUM(int, PermissionStatus) { typedef NS_ENUM(int, PermissionStatus) {
PermissionStatusDenied = 0, PermissionStatusDenied = 0,
PermissionStatusDisabled,
PermissionStatusGranted, PermissionStatusGranted,
PermissionStatusRestricted, PermissionStatusRestricted,
PermissionStatusUnknown, PermissionStatusUnknown,
......
...@@ -96,11 +96,6 @@ ...@@ -96,11 +96,6 @@
PermissionStatus status = [LocationPermissionStrategy PermissionStatus status = [LocationPermissionStrategy
determinePermissionStatus:permission authorizationStatus:authorizationStatus]; determinePermissionStatus:permission authorizationStatus:authorizationStatus];
if ((status == PermissionStatusGranted || status == PermissionStatusDenied)
&& ![CLLocationManager locationServicesEnabled]) {
return PermissionStatusDisabled;
}
return status; return status;
} }
......
...@@ -69,12 +69,7 @@ ...@@ -69,12 +69,7 @@
permissionStatus = PermissionStatusGranted; permissionStatus = PermissionStatusGranted;
} }
return permissionStatus;
if ((permissionStatus == PermissionStatusGranted || permissionStatus == PermissionStatusDenied) && ![CMMotionActivityManager isActivityAvailable]) {
return PermissionStatusDisabled;
} else {
return permissionStatus;
}
} }
return PermissionStatusUnknown; return PermissionStatusUnknown;
......
...@@ -8,28 +8,24 @@ class PermissionStatus { ...@@ -8,28 +8,24 @@ class PermissionStatus {
/// Permission to access the requested feature is denied by the user. /// Permission to access the requested feature is denied by the user.
static const PermissionStatus denied = PermissionStatus._(0); 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. /// 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 /// 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 /// iOS). The user cannot change this app's status, possibly due to active
/// restrictions such as parental controls being in place. /// 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 /// 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 /// Permission to access the requested feature is denied by the user and
/// never show selected (only on Android). /// 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. /// Returns a list of all possible [PermissionStatus] values.
static const List<PermissionStatus> values = <PermissionStatus>[ static const List<PermissionStatus> values = <PermissionStatus>[
denied, denied,
disabled,
granted, granted,
restricted, restricted,
unknown, unknown,
...@@ -38,7 +34,6 @@ class PermissionStatus { ...@@ -38,7 +34,6 @@ class PermissionStatus {
static const List<String> _names = <String>[ static const List<String> _names = <String>[
'denied', 'denied',
'disabled',
'granted', 'granted',
'restricted', 'restricted',
'unknown', 'unknown',
...@@ -169,12 +164,12 @@ class PermissionGroup { ...@@ -169,12 +164,12 @@ class PermissionGroup {
/// Android: Allows an application to access any geographic locations /// Android: Allows an application to access any geographic locations
/// persisted in the user's shared collection. /// 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 and above: Activity Recognition
/// When running on Android < Q: Nothing /// When running on Android < Q: Nothing
/// iOS: 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 /// The unknown permission only used for return type, never requested
static const PermissionGroup unknown = PermissionGroup._(19); static const PermissionGroup unknown = PermissionGroup._(19);
...@@ -198,8 +193,8 @@ class PermissionGroup { ...@@ -198,8 +193,8 @@ class PermissionGroup {
storage, storage,
ignoreBatteryOptimizations, ignoreBatteryOptimizations,
notification, notification,
access_media_location, accessMediaLocation,
activity_recognition, activityRecognition,
unknown, 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