Commit 44dc776c by Jan-Derk

Added 'SYSTEM_ALERT_WINDOW' permission

parent 84977c82
## 7.1.0
* Added support for the "SYSTEM_ALERT_WINDOW" permission on Android.
## 7.0.0 ## 7.0.0
This release contains the following **breaking changes**: This release contains the following **breaking changes**:
......
...@@ -58,13 +58,7 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler { ...@@ -58,13 +58,7 @@ final class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler {
permissionManager.checkPermissionStatus( permissionManager.checkPermissionStatus(
permission, permission,
applicationContext, applicationContext,
activity, result::success);
result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
break; break;
} }
case "requestPermissions": case "requestPermissions":
......
...@@ -10,6 +10,7 @@ final class PermissionConstants { ...@@ -10,6 +10,7 @@ final class PermissionConstants {
static final int PERMISSION_CODE = 24; static final int PERMISSION_CODE = 24;
static final int PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS = 209; static final int PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS = 209;
static final int PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE = 210; static final int PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE = 210;
static final int PERMISSION_CODE_SYSTEM_ALERT_WINDOW = 211;
//PERMISSION_GROUP //PERMISSION_GROUP
static final int PERMISSION_GROUP_CALENDAR = 0; static final int PERMISSION_GROUP_CALENDAR = 0;
...@@ -35,6 +36,7 @@ final class PermissionConstants { ...@@ -35,6 +36,7 @@ final class PermissionConstants {
static final int PERMISSION_GROUP_UNKNOWN = 20; static final int PERMISSION_GROUP_UNKNOWN = 20;
static final int PERMISSION_GROUP_BLUETOOTH = 21; static final int PERMISSION_GROUP_BLUETOOTH = 21;
static final int PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE = 22; static final int PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE = 22;
static final int PERMISSION_GROUP_SYSTEM_ALERT_WINDOW = 23;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
...@@ -59,7 +61,8 @@ final class PermissionConstants { ...@@ -59,7 +61,8 @@ final class PermissionConstants {
PERMISSION_GROUP_ACTIVITY_RECOGNITION, PERMISSION_GROUP_ACTIVITY_RECOGNITION,
PERMISSION_GROUP_UNKNOWN, PERMISSION_GROUP_UNKNOWN,
PERMISSION_GROUP_BLUETOOTH, PERMISSION_GROUP_BLUETOOTH,
PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE,
PERMISSION_GROUP_SYSTEM_ALERT_WINDOW
}) })
@interface PermissionGroup { @interface PermissionGroup {
} }
...@@ -95,4 +98,4 @@ final class PermissionConstants { ...@@ -95,4 +98,4 @@ final class PermissionConstants {
}) })
@interface ServiceStatus { @interface ServiceStatus {
} }
} }
\ No newline at end of file
...@@ -26,9 +26,6 @@ import io.flutter.plugin.common.PluginRegistry; ...@@ -26,9 +26,6 @@ import io.flutter.plugin.common.PluginRegistry;
final class PermissionManager implements PluginRegistry.ActivityResultListener, PluginRegistry.RequestPermissionsResultListener { final class PermissionManager implements PluginRegistry.ActivityResultListener, PluginRegistry.RequestPermissionsResultListener {
@Nullable @Nullable
private ErrorCallback errorCallback;
@Nullable
private RequestPermissionsSuccessCallback successCallback; private RequestPermissionsSuccessCallback successCallback;
@Nullable @Nullable
...@@ -38,7 +35,9 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -38,7 +35,9 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
@Override @Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) { public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != PermissionConstants.PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS && requestCode != PermissionConstants.PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE) { if (requestCode != PermissionConstants.PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS &&
requestCode != PermissionConstants.PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE &&
requestCode != PermissionConstants.PERMISSION_CODE_SYSTEM_ALERT_WINDOW) {
return false; return false;
} }
...@@ -55,6 +54,15 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -55,6 +54,15 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
? PermissionConstants.PERMISSION_STATUS_GRANTED ? PermissionConstants.PERMISSION_STATUS_GRANTED
: PermissionConstants.PERMISSION_STATUS_DENIED; : PermissionConstants.PERMISSION_STATUS_DENIED;
permission = PermissionConstants.PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE; permission = PermissionConstants.PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE;
} else if (requestCode == PermissionConstants.PERMISSION_CODE_SYSTEM_ALERT_WINDOW) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
status = Settings.canDrawOverlays(activity)
? PermissionConstants.PERMISSION_STATUS_GRANTED
: PermissionConstants.PERMISSION_STATUS_DENIED;
permission = PermissionConstants.PERMISSION_GROUP_SYSTEM_ALERT_WINDOW;
} else {
return false;
}
} else { } else {
return false; return false;
} }
...@@ -154,14 +162,11 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -154,14 +162,11 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
void checkPermissionStatus( void checkPermissionStatus(
@PermissionConstants.PermissionGroup int permission, @PermissionConstants.PermissionGroup int permission,
Context context, Context context,
Activity activity, CheckPermissionsSuccessCallback successCallback) {
CheckPermissionsSuccessCallback successCallback,
ErrorCallback errorCallback) {
successCallback.onSuccess(determinePermissionStatus( successCallback.onSuccess(determinePermissionStatus(
permission, permission,
context, context));
activity));
} }
void requestPermissions( void requestPermissions(
...@@ -185,14 +190,13 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -185,14 +190,13 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
return; return;
} }
this.errorCallback = errorCallback;
this.successCallback = successCallback; this.successCallback = successCallback;
this.activity = activity; this.activity = activity;
this.requestResults = new HashMap<>(); this.requestResults = new HashMap<>();
ArrayList<String> permissionsToRequest = new ArrayList<>(); ArrayList<String> permissionsToRequest = new ArrayList<>();
for (Integer permission : permissions) { for (Integer permission : permissions) {
@PermissionConstants.PermissionStatus final int permissionStatus = determinePermissionStatus(permission, activity, activity); @PermissionConstants.PermissionStatus final int permissionStatus = determinePermissionStatus(permission, activity);
if (permissionStatus == PermissionConstants.PERMISSION_STATUS_GRANTED) { if (permissionStatus == PermissionConstants.PERMISSION_STATUS_GRANTED) {
if (!requestResults.containsKey(permission)) { if (!requestResults.containsKey(permission)) {
requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_GRANTED); requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_GRANTED);
...@@ -233,6 +237,10 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -233,6 +237,10 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
executeIntent( executeIntent(
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
PermissionConstants.PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE); PermissionConstants.PERMISSION_CODE_MANAGE_EXTERNAL_STORAGE);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permission == PermissionConstants.PERMISSION_GROUP_SYSTEM_ALERT_WINDOW) {
executeIntent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
PermissionConstants.PERMISSION_CODE_SYSTEM_ALERT_WINDOW);
} else { } else {
permissionsToRequest.addAll(names); permissionsToRequest.addAll(names);
} }
...@@ -257,8 +265,7 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -257,8 +265,7 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
@PermissionConstants.PermissionStatus @PermissionConstants.PermissionStatus
private int determinePermissionStatus( private int determinePermissionStatus(
@PermissionConstants.PermissionGroup int permission, @PermissionConstants.PermissionGroup int permission,
Context context, Context context) {
@Nullable Activity activity) {
if (permission == PermissionConstants.PERMISSION_GROUP_NOTIFICATION) { if (permission == PermissionConstants.PERMISSION_GROUP_NOTIFICATION) {
return checkNotificationPermissionStatus(context); return checkNotificationPermissionStatus(context);
...@@ -328,6 +335,14 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -328,6 +335,14 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
: PermissionConstants.PERMISSION_STATUS_DENIED; : PermissionConstants.PERMISSION_STATUS_DENIED;
} }
if (permission == PermissionConstants.PERMISSION_GROUP_SYSTEM_ALERT_WINDOW) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return Settings.canDrawOverlays(context)
? PermissionConstants.PERMISSION_STATUS_GRANTED
: PermissionConstants.PERMISSION_STATUS_DENIED;
}
}
final int permissionStatus = ContextCompat.checkSelfPermission(context, name); final int permissionStatus = ContextCompat.checkSelfPermission(context, name);
if (permissionStatus != PackageManager.PERMISSION_GRANTED) { if (permissionStatus != PackageManager.PERMISSION_GRANTED) {
return PermissionConstants.PERMISSION_STATUS_DENIED; return PermissionConstants.PERMISSION_STATUS_DENIED;
......
...@@ -63,6 +63,8 @@ public class PermissionUtils { ...@@ -63,6 +63,8 @@ public class PermissionUtils {
return PermissionConstants.PERMISSION_GROUP_ACTIVITY_RECOGNITION; return PermissionConstants.PERMISSION_GROUP_ACTIVITY_RECOGNITION;
case Manifest.permission.MANAGE_EXTERNAL_STORAGE: case Manifest.permission.MANAGE_EXTERNAL_STORAGE:
return PermissionConstants.PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE; return PermissionConstants.PERMISSION_GROUP_MANAGE_EXTERNAL_STORAGE;
case Manifest.permission.SYSTEM_ALERT_WINDOW:
return PermissionConstants.PERMISSION_GROUP_SYSTEM_ALERT_WINDOW;
default: default:
return PermissionConstants.PERMISSION_GROUP_UNKNOWN; return PermissionConstants.PERMISSION_GROUP_UNKNOWN;
} }
...@@ -224,6 +226,11 @@ public class PermissionUtils { ...@@ -224,6 +226,11 @@ public class PermissionUtils {
permissionNames.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE); permissionNames.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
break; break;
case PermissionConstants.PERMISSION_GROUP_SYSTEM_ALERT_WINDOW:
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.SYSTEM_ALERT_WINDOW ))
permissionNames.add(Manifest.permission.SYSTEM_ALERT_WINDOW);
break;
case PermissionConstants.PERMISSION_GROUP_NOTIFICATION: case PermissionConstants.PERMISSION_GROUP_NOTIFICATION:
case PermissionConstants.PERMISSION_GROUP_MEDIA_LIBRARY: case PermissionConstants.PERMISSION_GROUP_MEDIA_LIBRARY:
case PermissionConstants.PERMISSION_GROUP_PHOTOS: case PermissionConstants.PERMISSION_GROUP_PHOTOS:
......
...@@ -66,6 +66,9 @@ ...@@ -66,6 +66,9 @@
<!-- Permissions options for the `manage external storage` group --> <!-- Permissions options for the `manage external storage` group -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!-- Permissions options for the `system alert windows` group -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application <application
android:name="io.flutter.app.FlutterApplication" android:name="io.flutter.app.FlutterApplication"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
......
...@@ -118,7 +118,8 @@ typedef NS_ENUM(int, PermissionGroup) { ...@@ -118,7 +118,8 @@ typedef NS_ENUM(int, PermissionGroup) {
PermissionGroupActivityRecognition, PermissionGroupActivityRecognition,
PermissionGroupUnknown, PermissionGroupUnknown,
PermissionGroupBluetooth, PermissionGroupBluetooth,
PermissionGroupManageExternalStorage PermissionGroupManageExternalStorage,
PermissionGroupSystemAlertWindow
}; };
typedef NS_ENUM(int, PermissionStatus) { typedef NS_ENUM(int, PermissionStatus) {
......
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: 7.0.0 version: 7.1.0
homepage: https://github.com/baseflowit/flutter-permission-handler homepage: https://github.com/baseflowit/flutter-permission-handler
flutter: flutter:
...@@ -16,7 +16,7 @@ dependencies: ...@@ -16,7 +16,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
meta: ^1.3.0 meta: ^1.3.0
permission_handler_platform_interface: ^3.2.0 permission_handler_platform_interface: ^3.3.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
......
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