Commit f031921f by Sebastian Roth

Merge branch 'develop' into ignore-battery-android-m

parents f9f6781e e89eaa91
[![pub package](https://img.shields.io/pub/v/permission_handler.svg)](https://pub.dartlang.org/packages/permission_handler) ![Build status](https://github.com/Baseflow/flutter-permission-handler/workflows/permission_handler/badge.svg?branch=master) [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://github.com/tenhobi/effective_dart) [![pub package](https://img.shields.io/pub/v/permission_handler.svg)](https://pub.dartlang.org/packages/permission_handler) [![Build status](https://github.com/Baseflow/flutter-permission-handler/actions/workflows/app_facing_package.yaml/badge.svg?branch=master)](https://github.com/Baseflow/flutter-permission-handler/actions/workflows/app_facing_package.yaml) [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://github.com/tenhobi/effective_dart)
On most operating systems, permissions aren't just granted to apps at install time. On most operating systems, permissions aren't just granted to apps at install time.
Rather, developers have to ask the user for permissions while the app is running. Rather, developers have to ask the user for permissions while the app is running.
...@@ -137,12 +137,12 @@ You can remove permissions you don't use: ...@@ -137,12 +137,12 @@ You can remove permissions you don't use:
## How to use ## How to use
There are a number of [`Permission`](https://pub.dev/documentation/permission_handler_platform_interface/latest/permission_handler_platform_interface/Permission-class.html#constants)s. There are a number of [`Permission`](https://pub.dev/documentation/permission_handler_platform_interface/latest/permission_handler_platform_interface/Permission-class.html#constants)s.
You can get a `Permission`'s `status`, which is either `undetermined`, `granted`, `denied`, `restricted` or `permanentlyDenied`. You can get a `Permission`'s `status`, which is either `granted`, `denied`, `restricted` or `permanentlyDenied`.
```dart ```dart
var status = await Permission.camera.status; var status = await Permission.camera.status;
if (status.isUndetermined) { if (status.denied) {
// We didn't ask for permission yet. // We didn't ask for permission yet or the permission has been denied before but not permanently.
} }
// You can can also directly ask the permission about its status. // You can can also directly ask the permission about its status.
......
## 6.0.1
* Fixed deprecation warning when building Android project.
## 6.0.0 ## 6.0.0
This release includes the following **breaking changes**:
* Migrated to null safety * Migrated to null safety
* Removed PermissionStatus.undetermined, PermissionStatus.denied will be used instead (see our "[Changes in 6.0.0](https://github.com/Baseflow/flutter-permission-handler/wiki/Changes-in-6.0.0)" wiki page for more details).
## 5.1.0+2 ## 5.1.0+2
......
group 'com.baseflow.permissionhandler' group 'com.baseflow.permissionhandler'
version '1.0-SNAPSHOT' version '1.0-SNAPSHOT'
def args = ["-Xlint:deprecation","-Xlint:unchecked","-Werror"]
buildscript { buildscript {
repositories { repositories {
...@@ -20,6 +21,10 @@ rootProject.allprojects { ...@@ -20,6 +21,10 @@ rootProject.allprojects {
} }
} }
project.getTasks().withType(JavaCompile){
options.compilerArgs.addAll(args)
}
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
android { android {
......
...@@ -63,16 +63,14 @@ final class PermissionConstants { ...@@ -63,16 +63,14 @@ final class PermissionConstants {
static final int PERMISSION_STATUS_DENIED = 0; static final int PERMISSION_STATUS_DENIED = 0;
static final int PERMISSION_STATUS_GRANTED = 1; static final int PERMISSION_STATUS_GRANTED = 1;
static final int PERMISSION_STATUS_RESTRICTED = 2; static final int PERMISSION_STATUS_RESTRICTED = 2;
static final int PERMISSION_STATUS_NOT_DETERMINED = 3; static final int PERMISSION_STATUS_LIMITED = 3;
static final int PERMISSION_STATUS_LIMITED = 4; static final int PERMISSION_STATUS_NEVER_ASK_AGAIN = 4;
static final int PERMISSION_STATUS_NEVER_ASK_AGAIN = 5;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
PERMISSION_STATUS_DENIED, PERMISSION_STATUS_DENIED,
PERMISSION_STATUS_GRANTED, PERMISSION_STATUS_GRANTED,
PERMISSION_STATUS_RESTRICTED, PERMISSION_STATUS_RESTRICTED,
PERMISSION_STATUS_NOT_DETERMINED,
PERMISSION_STATUS_LIMITED, PERMISSION_STATUS_LIMITED,
PERMISSION_STATUS_NEVER_ASK_AGAIN, PERMISSION_STATUS_NEVER_ASK_AGAIN,
}) })
......
...@@ -11,7 +11,6 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware; ...@@ -11,7 +11,6 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry.Registrar;
/** /**
* Platform implementation of the permission_handler Flutter plugin. * Platform implementation of the permission_handler Flutter plugin.
...@@ -19,8 +18,8 @@ import io.flutter.plugin.common.PluginRegistry.Registrar; ...@@ -19,8 +18,8 @@ import io.flutter.plugin.common.PluginRegistry.Registrar;
* <p>Instantiate this in an add to app scenario to gracefully handle activity and context changes. * <p>Instantiate this in an add to app scenario to gracefully handle activity and context changes.
* See {@code com.example.permissionhandlerexample.MainActivity} for an example. * See {@code com.example.permissionhandlerexample.MainActivity} for an example.
* *
* <p>Call {@link #registerWith(Registrar)} to register an implementation of this that uses the * <p>Call {@link #registerWith(io.flutter.plugin.common.PluginRegistry.Registrar)} to register an
* stable {@code io.flutter.plugin.common} package. * implementation of this that uses the stable {@code io.flutter.plugin.common} package.
*/ */
public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAware { public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAware {
...@@ -36,7 +35,8 @@ public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAwa ...@@ -36,7 +35,8 @@ public final class PermissionHandlerPlugin implements FlutterPlugin, ActivityAwa
* <p>Calling this automatically initializes the plugin. However plugins initialized this way * <p>Calling this automatically initializes the plugin. However plugins initialized this way
* won't react to changes in activity or context, unlike {@link PermissionHandlerPlugin}. * won't react to changes in activity or context, unlike {@link PermissionHandlerPlugin}.
*/ */
public static void registerWith(Registrar registrar) { @SuppressWarnings("deprecation")
public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
final PermissionHandlerPlugin plugin = new PermissionHandlerPlugin(); final PermissionHandlerPlugin plugin = new PermissionHandlerPlugin();
plugin.startListening(registrar.context(), registrar.messenger()); plugin.startListening(registrar.context(), registrar.messenger());
......
...@@ -109,7 +109,7 @@ final class PermissionManager { ...@@ -109,7 +109,7 @@ final class PermissionManager {
if (permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_RESTRICTED); requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_RESTRICTED);
} else { } else {
requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_NOT_DETERMINED); requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_DENIED);
} }
} }
...@@ -118,7 +118,7 @@ final class PermissionManager { ...@@ -118,7 +118,7 @@ final class PermissionManager {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permission == PermissionConstants.PERMISSION_GROUP_IGNORE_BATTERY_OPTIMIZATIONS) {
activityRegistry.addListener( activityRegistry.addListener(
new ActivityResultListener(successCallback) new ActivityResultListener(successCallback)
); );
String packageName = activity.getPackageName(); String packageName = activity.getPackageName();
...@@ -187,7 +187,7 @@ final class PermissionManager { ...@@ -187,7 +187,7 @@ final class PermissionManager {
} }
} }
return PermissionConstants.PERMISSION_STATUS_NOT_DETERMINED; return PermissionConstants.PERMISSION_STATUS_DENIED;
} }
final boolean targetsMOrHigher = context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M; final boolean targetsMOrHigher = context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
...@@ -210,21 +210,11 @@ final class PermissionManager { ...@@ -210,21 +210,11 @@ final class PermissionManager {
} }
} }
final int permissionStatus = ContextCompat.checkSelfPermission(context, name); final int permissionStatus = ContextCompat.checkSelfPermission(context, name);
if (permissionStatus == PackageManager.PERMISSION_DENIED) { if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
if (!PermissionUtils.getRequestedPermissionBefore(context, name)) {
return PermissionConstants.PERMISSION_STATUS_NOT_DETERMINED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
PermissionUtils.isNeverAskAgainSelected(activity, name)) {
return PermissionConstants.PERMISSION_STATUS_NEVER_ASK_AGAIN;
} else {
return PermissionConstants.PERMISSION_STATUS_DENIED;
}
} else if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
return PermissionConstants.PERMISSION_STATUS_DENIED; return PermissionConstants.PERMISSION_STATUS_DENIED;
} }
} }
} }
return PermissionConstants.PERMISSION_STATUS_GRANTED; return PermissionConstants.PERMISSION_STATUS_GRANTED;
} }
...@@ -271,7 +261,7 @@ final class PermissionManager { ...@@ -271,7 +261,7 @@ final class PermissionManager {
@VisibleForTesting @VisibleForTesting
static final class ActivityResultListener static final class ActivityResultListener
implements PluginRegistry.ActivityResultListener { implements PluginRegistry.ActivityResultListener {
// There's no way to unregister permission listeners in the v1 embedding, so we'll be called // There's no way to unregister permission listeners in the v1 embedding, so we'll be called
// duplicate times in cases where the user denies and then grants a permission. Keep track of if // duplicate times in cases where the user denies and then grants a permission. Keep track of if
...@@ -288,7 +278,7 @@ final class PermissionManager { ...@@ -288,7 +278,7 @@ final class PermissionManager {
@Override @Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) { public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if(alreadyCalled || requestCode != PermissionConstants.PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS) { if (alreadyCalled || requestCode != PermissionConstants.PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS) {
return false; return false;
} }
...@@ -306,7 +296,7 @@ final class PermissionManager { ...@@ -306,7 +296,7 @@ final class PermissionManager {
@VisibleForTesting @VisibleForTesting
static final class RequestPermissionsListener static final class RequestPermissionsListener
implements PluginRegistry.RequestPermissionsResultListener { implements PluginRegistry.RequestPermissionsResultListener {
// There's no way to unregister permission listeners in the v1 embedding, so we'll be called // There's no way to unregister permission listeners in the v1 embedding, so we'll be called
// duplicate times in cases where the user denies and then grants a permission. Keep track of if // duplicate times in cases where the user denies and then grants a permission. Keep track of if
...@@ -329,8 +319,7 @@ final class PermissionManager { ...@@ -329,8 +319,7 @@ final class PermissionManager {
} }
@Override @Override
public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) {
{
if (alreadyCalled || id != PermissionConstants.PERMISSION_CODE) { if (alreadyCalled || id != PermissionConstants.PERMISSION_CODE) {
return false; return false;
} }
......
...@@ -3,7 +3,6 @@ package com.baseflow.permissionhandler; ...@@ -3,7 +3,6 @@ package com.baseflow.permissionhandler;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
...@@ -262,10 +261,6 @@ public class PermissionUtils { ...@@ -262,10 +261,6 @@ public class PermissionUtils {
if (names == null || names.isEmpty()) { if (names == null || names.isEmpty()) {
return; return;
} }
for (String name : names) {
PermissionUtils.setRequestedPermission(activity, name);
}
} }
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
...@@ -274,25 +269,7 @@ public class PermissionUtils { ...@@ -274,25 +269,7 @@ public class PermissionUtils {
return false; return false;
} }
return PermissionUtils.neverAskAgainSelected(activity, name); final boolean shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity, name);
return !shouldShowRequestPermissionRationale;
} }
@RequiresApi(api = Build.VERSION_CODES.M)
static boolean neverAskAgainSelected(final Activity activity, final String permission) {
final boolean hasRequestedPermissionBefore = getRequestedPermissionBefore(activity, permission);
final boolean shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
return hasRequestedPermissionBefore && !shouldShowRequestPermissionRationale;
}
static void setRequestedPermission(final Context context, final String permission) {
SharedPreferences genPrefs = context.getSharedPreferences("GENERIC_PREFERENCES", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = genPrefs.edit();
editor.putBoolean(permission, true);
editor.apply();
}
static boolean getRequestedPermissionBefore(final Context context, final String permission) {
SharedPreferences genPrefs = context.getSharedPreferences("GENERIC_PREFERENCES", Context.MODE_PRIVATE);
return genPrefs.getBoolean(permission, false);
}
} }
...@@ -17,7 +17,7 @@ class _PermissionState extends State<PermissionWidget> { ...@@ -17,7 +17,7 @@ class _PermissionState extends State<PermissionWidget> {
_PermissionState(this._permission); _PermissionState(this._permission);
final Permission _permission; final Permission _permission;
PermissionStatus _permissionStatus = PermissionStatus.undetermined; PermissionStatus _permissionStatus = PermissionStatus.denied;
@override @override
void initState() { void initState() {
......
...@@ -113,10 +113,10 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -113,10 +113,10 @@ typedef NS_ENUM(int, PermissionGroup) {
typedef NS_ENUM(int, PermissionStatus) { typedef NS_ENUM(int, PermissionStatus) {
PermissionStatusDenied = 0, PermissionStatusDenied = 0,
PermissionStatusGranted, PermissionStatusGranted = 1,
PermissionStatusRestricted, PermissionStatusRestricted = 2,
PermissionStatusNotDetermined, PermissionStatusLimited = 3,
PermissionStatusLimited, PermissionStatusPermanentlyDenied = 4
}; };
typedef NS_ENUM(int, ServiceStatus) { typedef NS_ENUM(int, ServiceStatus) {
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
result([[NSNumber alloc] initWithBool:success]); result([[NSNumber alloc] initWithBool:success]);
} else { } else {
result(@false); result(@false);
} }
} }
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeAudio]; return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeAudio];
#endif #endif
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission { - (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -40,18 +40,18 @@ ...@@ -40,18 +40,18 @@
#if PERMISSION_CAMERA #if PERMISSION_CAMERA
mediaType = AVMediaTypeVideo; mediaType = AVMediaTypeVideo;
#else #else
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
return; return;
#endif #endif
} else if (permission == PermissionGroupMicrophone) { } else if (permission == PermissionGroupMicrophone) {
#if PERMISSION_MICROPHONE #if PERMISSION_MICROPHONE
mediaType = AVMediaTypeAudio; mediaType = AVMediaTypeAudio;
#else #else
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
return; return;
#endif #endif
} else { } else {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
return; return;
} }
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
if (granted) { if (granted) {
completionHandler(PermissionStatusGranted); completionHandler(PermissionStatusGranted);
} else { } else {
completionHandler(PermissionStatusDenied); completionHandler(PermissionStatusPermanentlyDenied);
} }
}]; }];
} }
...@@ -69,16 +69,16 @@ ...@@ -69,16 +69,16 @@
switch (status) { switch (status) {
case AVAuthorizationStatusNotDetermined: case AVAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case AVAuthorizationStatusRestricted: case AVAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case AVAuthorizationStatusDenied: case AVAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case AVAuthorizationStatusAuthorized: case AVAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
} }
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
switch (status) { switch (status) {
case CNAuthorizationStatusNotDetermined: case CNAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case CNAuthorizationStatusRestricted: case CNAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case CNAuthorizationStatusDenied: case CNAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case CNAuthorizationStatusAuthorized: case CNAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
...@@ -51,17 +51,17 @@ ...@@ -51,17 +51,17 @@
switch (status) { switch (status) {
case kABAuthorizationStatusNotDetermined: case kABAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case kABAuthorizationStatusRestricted: case kABAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case kABAuthorizationStatusDenied: case kABAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case kABAuthorizationStatusAuthorized: case kABAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
+ (void)requestPermissionsFromContactStore:(PermissionStatusHandler)completionHandler API_AVAILABLE(ios(9)) { + (void)requestPermissionsFromContactStore:(PermissionStatusHandler)completionHandler API_AVAILABLE(ios(9)) {
...@@ -71,18 +71,9 @@ ...@@ -71,18 +71,9 @@
if (granted) { if (granted) {
completionHandler(PermissionStatusGranted); completionHandler(PermissionStatusGranted);
} else { } else {
completionHandler(PermissionStatusDenied); completionHandler(PermissionStatusPermanentlyDenied);
} }
}]; }];
ABAddressBookRequestAccessWithCompletion(ABAddressBookCreate(), ^(bool granted, CFErrorRef error) {
if (granted) {
completionHandler(PermissionStatusGranted);
} else {
completionHandler(PermissionStatusDenied);
}
});
} }
+ (void)requestPermissionsFromAddressBook:(PermissionStatusHandler)completionHandler { + (void)requestPermissionsFromAddressBook:(PermissionStatusHandler)completionHandler {
...@@ -90,7 +81,7 @@ ...@@ -90,7 +81,7 @@
if (granted) { if (granted) {
completionHandler(PermissionStatusGranted); completionHandler(PermissionStatusGranted);
} else { } else {
completionHandler(PermissionStatusDenied); completionHandler(PermissionStatusPermanentlyDenied);
} }
}); });
} }
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#endif #endif
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission { - (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus permissionStatus = [self checkPermissionStatus:permission]; PermissionStatus permissionStatus = [self checkPermissionStatus:permission];
if (permissionStatus != PermissionStatusNotDetermined) { if (permissionStatus != PermissionStatusDenied) {
completionHandler(permissionStatus); completionHandler(permissionStatus);
return; return;
} }
...@@ -41,18 +41,18 @@ ...@@ -41,18 +41,18 @@
#if PERMISSION_EVENTS #if PERMISSION_EVENTS
entityType = EKEntityTypeEvent; entityType = EKEntityTypeEvent;
#else #else
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
return; return;
#endif #endif
} else if (permission == PermissionGroupReminders) { } else if (permission == PermissionGroupReminders) {
#if PERMISSION_REMINDERS #if PERMISSION_REMINDERS
entityType = EKEntityTypeReminder; entityType = EKEntityTypeReminder;
#else #else
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
return; return;
#endif #endif
} else { } else {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusPermanentlyDenied);
return; return;
} }
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
if (granted) { if (granted) {
completionHandler(PermissionStatusGranted); completionHandler(PermissionStatusGranted);
} else { } else {
completionHandler(PermissionStatusDenied); completionHandler(PermissionStatusPermanentlyDenied);
} }
}]; }];
} }
...@@ -71,16 +71,16 @@ ...@@ -71,16 +71,16 @@
switch (status) { switch (status) {
case EKAuthorizationStatusNotDetermined: case EKAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case EKAuthorizationStatusRestricted: case EKAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case EKAuthorizationStatusDenied: case EKAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case EKAuthorizationStatusAuthorized: case EKAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse && permission == PermissionGroupLocationAlways) { if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse && permission == PermissionGroupLocationAlways) {
// don't do anything and continue requesting permissions // don't do anything and continue requesting permissions
} else if (status != PermissionStatusNotDetermined) { } else if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
} }
...@@ -105,12 +105,12 @@ ...@@ -105,12 +105,12 @@
if (permission == PermissionGroupLocationAlways) { if (permission == PermissionGroupLocationAlways) {
switch (authorizationStatus) { switch (authorizationStatus) {
case kCLAuthorizationStatusNotDetermined: case kCLAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case kCLAuthorizationStatusRestricted: case kCLAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case kCLAuthorizationStatusAuthorizedWhenInUse: case kCLAuthorizationStatusAuthorizedWhenInUse:
case kCLAuthorizationStatusDenied: case kCLAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case kCLAuthorizationStatusAuthorizedAlways: case kCLAuthorizationStatusAuthorizedAlways:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
...@@ -118,11 +118,11 @@ ...@@ -118,11 +118,11 @@
switch (authorizationStatus) { switch (authorizationStatus) {
case kCLAuthorizationStatusNotDetermined: case kCLAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case kCLAuthorizationStatusRestricted: case kCLAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case kCLAuthorizationStatusDenied: case kCLAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case kCLAuthorizationStatusAuthorizedWhenInUse: case kCLAuthorizationStatusAuthorizedWhenInUse:
case kCLAuthorizationStatusAuthorizedAlways: case kCLAuthorizationStatusAuthorizedAlways:
return PermissionStatusGranted; return PermissionStatusGranted;
...@@ -134,15 +134,15 @@ ...@@ -134,15 +134,15 @@
switch (authorizationStatus) { switch (authorizationStatus) {
case kCLAuthorizationStatusNotDetermined: case kCLAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case kCLAuthorizationStatusRestricted: case kCLAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case kCLAuthorizationStatusDenied: case kCLAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case kCLAuthorizationStatusAuthorized: case kCLAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
default: default:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
#pragma clang diagnostic pop #pragma clang diagnostic pop
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]); completionHandler([MediaLibraryPermissionStrategy determinePermissionStatus:status]);
}]; }];
} else { } else {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusPermanentlyDenied);
return; return;
} }
} }
...@@ -41,22 +41,22 @@ ...@@ -41,22 +41,22 @@
return [MediaLibraryPermissionStrategy determinePermissionStatus:status]; return [MediaLibraryPermissionStrategy determinePermissionStatus:status];
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
+ (PermissionStatus)determinePermissionStatus:(MPMediaLibraryAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(9.3)){ + (PermissionStatus)determinePermissionStatus:(MPMediaLibraryAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(9.3)){
switch (authorizationStatus) { switch (authorizationStatus) {
case MPMediaLibraryAuthorizationStatusNotDetermined: case MPMediaLibraryAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined;
case MPMediaLibraryAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusDenied;
case MPMediaLibraryAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case MPMediaLibraryAuthorizationStatusRestricted: case MPMediaLibraryAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case MPMediaLibraryAuthorizationStatusAuthorized: case MPMediaLibraryAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -33,8 +33,8 @@ ...@@ -33,8 +33,8 @@
authorizationOptions += UNAuthorizationOptionAlert; authorizationOptions += UNAuthorizationOptionAlert;
authorizationOptions += UNAuthorizationOptionBadge; authorizationOptions += UNAuthorizationOptionBadge;
[center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) { [center requestAuthorizationWithOptions:(authorizationOptions) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted || error != nil) { if (error != nil || !granted) {
completionHandler(PermissionStatusDenied); completionHandler(PermissionStatusPermanentlyDenied);
return; return;
} }
...@@ -64,9 +64,9 @@ ...@@ -64,9 +64,9 @@
dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusDenied) { if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
permissionStatus = PermissionStatusDenied; permissionStatus = PermissionStatusPermanentlyDenied;
} else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { } else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
permissionStatus = PermissionStatusNotDetermined; permissionStatus = PermissionStatusDenied;
} }
dispatch_semaphore_signal(sem); dispatch_semaphore_signal(sem);
}]; }];
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings]; UIUserNotificationSettings * setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied; if (setting.types == UIUserNotificationTypeNone) permissionStatus = PermissionStatusDenied;
} else { } else {
permissionStatus = PermissionStatusDenied; permissionStatus = PermissionStatusPermanentlyDenied;
} }
return permissionStatus; return permissionStatus;
} }
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
@implementation PhonePermissionStrategy @implementation PhonePermissionStrategy
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission { - (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
} }
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusPermanentlyDenied);
} }
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -61,18 +61,18 @@ ...@@ -61,18 +61,18 @@
+ (PermissionStatus)determinePermissionStatus:(PHAuthorizationStatus)authorizationStatus { + (PermissionStatus)determinePermissionStatus:(PHAuthorizationStatus)authorizationStatus {
switch (authorizationStatus) { switch (authorizationStatus) {
case PHAuthorizationStatusNotDetermined: case PHAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined; return PermissionStatusDenied;
case PHAuthorizationStatusRestricted: case PHAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case PHAuthorizationStatusDenied: case PHAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusPermanentlyDenied;
case PHAuthorizationStatusAuthorized: case PHAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
case PHAuthorizationStatusLimited: case PHAuthorizationStatusLimited:
return PermissionStatusLimited; return PermissionStatusLimited;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -35,14 +35,11 @@ ...@@ -35,14 +35,11 @@
NSDate *today = [NSDate new]; NSDate *today = [NSDate new];
[motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray<CMMotionActivity *> *__nullable activities, NSError *__nullable error) { [motionManager queryActivityStartingFromDate:today toDate:today toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray<CMMotionActivity *> *__nullable activities, NSError *__nullable error) {
if (error != nil && error.code == CMErrorMotionActivityNotAuthorized) { PermissionStatus status = [SensorPermissionStrategy permissionStatus];
completionHandler(PermissionStatusDenied); completionHandler(status);
} else {
completionHandler(PermissionStatusGranted);
}
}]; }];
} else { } else {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
} }
} }
...@@ -54,13 +51,13 @@ ...@@ -54,13 +51,13 @@
switch (status) { switch (status) {
case CMAuthorizationStatusNotDetermined: case CMAuthorizationStatusNotDetermined:
permissionStatus = PermissionStatusNotDetermined; permissionStatus = PermissionStatusDenied;
break; break;
case CMAuthorizationStatusRestricted: case CMAuthorizationStatusRestricted:
permissionStatus = PermissionStatusRestricted; permissionStatus = PermissionStatusRestricted;
break; break;
case CMAuthorizationStatusDenied: case CMAuthorizationStatusDenied:
permissionStatus = PermissionStatusDenied; permissionStatus = PermissionStatusPermanentlyDenied;
break; break;
case CMAuthorizationStatusAuthorized: case CMAuthorizationStatusAuthorized:
permissionStatus = PermissionStatusGranted; permissionStatus = PermissionStatusGranted;
...@@ -72,7 +69,7 @@ ...@@ -72,7 +69,7 @@
return permissionStatus; return permissionStatus;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
PermissionStatus status = [self checkPermissionStatus:permission]; PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusNotDetermined) { if (status != PermissionStatusDenied) {
completionHandler(status); completionHandler(status);
return; return;
} }
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
completionHandler([SpeechPermissionStrategy determinePermissionStatus:authorizationStatus]); completionHandler([SpeechPermissionStrategy determinePermissionStatus:authorizationStatus]);
}]; }];
} else { } else {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusDenied);
} }
} }
...@@ -40,22 +40,22 @@ ...@@ -40,22 +40,22 @@
return [SpeechPermissionStrategy determinePermissionStatus:status]; return [SpeechPermissionStrategy determinePermissionStatus:status];
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
+ (PermissionStatus)determinePermissionStatus:(SFSpeechRecognizerAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(10.0)){ + (PermissionStatus)determinePermissionStatus:(SFSpeechRecognizerAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(10.0)){
switch (authorizationStatus) { switch (authorizationStatus) {
case SFSpeechRecognizerAuthorizationStatusNotDetermined: case SFSpeechRecognizerAuthorizationStatusNotDetermined:
return PermissionStatusNotDetermined;
case SFSpeechRecognizerAuthorizationStatusDenied:
return PermissionStatusDenied; return PermissionStatusDenied;
case SFSpeechRecognizerAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case SFSpeechRecognizerAuthorizationStatusRestricted: case SFSpeechRecognizerAuthorizationStatusRestricted:
return PermissionStatusRestricted; return PermissionStatusRestricted;
case SFSpeechRecognizerAuthorizationStatusAuthorized: case SFSpeechRecognizerAuthorizationStatusAuthorized:
return PermissionStatusGranted; return PermissionStatusGranted;
} }
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
@end @end
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
@implementation UnknownPermissionStrategy @implementation UnknownPermissionStrategy
- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission { - (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
return PermissionStatusNotDetermined; return PermissionStatusDenied;
} }
- (ServiceStatus)checkServiceStatus:(PermissionGroup)permission { - (ServiceStatus)checkServiceStatus:(PermissionGroup)permission {
...@@ -17,6 +17,6 @@ ...@@ -17,6 +17,6 @@
} }
- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler { - (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler {
completionHandler(PermissionStatusNotDetermined); completionHandler(PermissionStatusPermanentlyDenied);
} }
@end @end
...@@ -53,9 +53,6 @@ extension PermissionActions on Permission { ...@@ -53,9 +53,6 @@ extension PermissionActions on Permission {
/// Shortcuts for checking the [status] of a [Permission]. /// Shortcuts for checking the [status] of a [Permission].
extension PermissionCheckShortcuts on Permission { extension PermissionCheckShortcuts on Permission {
/// If this permission was never requested before.
Future<bool> get isUndetermined => status.isUndetermined;
/// If the user granted this permission. /// If the user granted this permission.
Future<bool> get isGranted => status.isGranted; Future<bool> get isGranted => status.isGranted;
......
name: permission_handler name: permission_handler
description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. description: Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
version: 6.0.0 version: 6.0.1
homepage: https://github.com/baseflowit/flutter-permission-handler homepage: https://github.com/baseflowit/flutter-permission-handler
flutter: flutter:
...@@ -16,12 +16,12 @@ dependencies: ...@@ -16,12 +16,12 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
meta: ^1.3.0 meta: ^1.3.0
permission_handler_platform_interface: ^3.0.0 permission_handler_platform_interface: ^3.0.0+1
dev_dependencies: dev_dependencies:
effective_dart: ^1.3.0 effective_dart: ^1.3.0
plugin_platform_interface: ^2.0.0 plugin_platform_interface: ^2.0.0
environment: environment:
sdk: ">=2.12.0-259.9.beta <3.0.0" sdk: ">=2.12.0 <3.0.0"
flutter: ">=1.12.8 <2.0.0" flutter: ">=1.12.8"
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