Commit 8d21b7a3 by Maurits van Beusekom Committed by GitHub

Merge pull request #529 from Baseflow/system_alert_window

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