diff --git a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionConstants.java b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionConstants.java index 0262db176..4bbe64645 100644 --- a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionConstants.java +++ b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionConstants.java @@ -16,6 +16,7 @@ final class PermissionConstants { static final int PERMISSION_CODE_REQUEST_INSTALL_PACKAGES = 212; static final int PERMISSION_CODE_ACCESS_NOTIFICATION_POLICY = 213; static final int PERMISSION_CODE_SCHEDULE_EXACT_ALARM = 214; + static final int PERMISSION_CODE_USE_FULL_SCREEN_INTENT = 215; // PERMISSION_GROUP @@ -62,6 +63,7 @@ final class PermissionConstants { static final int PERMISSION_GROUP_CALENDAR_FULL_ACCESS = 37; static final int PERMISSION_GROUP_ASSISTANT = 38; static final int PERMISSION_GROUP_BACKGROUND_REFRESH = 39; + static final int PERMISSION_GROUP_USE_FULL_SCREEN_INTENT = 40; @Retention(RetentionPolicy.SOURCE) @IntDef({ @@ -101,6 +103,8 @@ final class PermissionConstants { PERMISSION_GROUP_CALENDAR_WRITE_ONLY, PERMISSION_GROUP_CALENDAR_FULL_ACCESS, PERMISSION_GROUP_ASSISTANT, + PERMISSION_GROUP_BACKGROUND_REFRESH, + PERMISSION_GROUP_USE_FULL_SCREEN_INTENT, }) @interface PermissionGroup { } diff --git a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionManager.java b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionManager.java index 807ca3370..6b2b301fe 100644 --- a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionManager.java +++ b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionManager.java @@ -266,6 +266,16 @@ public boolean onRequestPermissionsResult( requestResults.put( permission, determinePermissionStatus(permission)); + } else if (permission == PermissionConstants.PERMISSION_GROUP_USE_FULL_SCREEN_INTENT) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + int status = notificationManager.canUseFullScreenIntent() + ? PermissionConstants.PERMISSION_STATUS_GRANTED + : PermissionConstants.PERMISSION_STATUS_DENIED; + requestResults.put(permission, status); + } else { + requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_GRANTED); + } } else if (!requestResults.containsKey(permission)) { requestResults.put( permission, @@ -421,6 +431,10 @@ void requestPermissions( } else { requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_DENIED); } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && permission == PermissionConstants.PERMISSION_GROUP_USE_FULL_SCREEN_INTENT) { + launchSpecialPermission( + Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT, + PermissionConstants.PERMISSION_CODE_USE_FULL_SCREEN_INTENT); } else { permissionsToRequest.addAll(names); pendingRequestCount += names.size(); @@ -565,7 +579,17 @@ private int determinePermissionStatus(final @PermissionConstants.PermissionGroup }else { permissionStatuses.add(PermissionUtils.determineDeniedVariant(activity, name)); } - }else { + } else if (permission == PermissionConstants.PERMISSION_GROUP_USE_FULL_SCREEN_INTENT) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + int status = notificationManager.canUseFullScreenIntent() + ? PermissionConstants.PERMISSION_STATUS_GRANTED + : PermissionConstants.PERMISSION_STATUS_DENIED; + permissionStatuses.add(status); + } else { + permissionStatuses.add(PermissionConstants.PERMISSION_STATUS_GRANTED); + } + } else { final int permissionStatus = ContextCompat.checkSelfPermission(context, name); if (permissionStatus != PackageManager.PERMISSION_GRANTED) { permissionStatuses.add(PermissionUtils.determineDeniedVariant(activity, name)); diff --git a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java index c56bcfdfb..6eda8f40f 100644 --- a/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java +++ b/permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java @@ -95,6 +95,8 @@ static int parseManifestName(String permission) { return PermissionConstants.PERMISSION_GROUP_AUDIO; case Manifest.permission.SCHEDULE_EXACT_ALARM: return PermissionConstants.PERMISSION_GROUP_SCHEDULE_EXACT_ALARM; + case Manifest.permission.USE_FULL_SCREEN_INTENT: + return PermissionConstants.PERMISSION_GROUP_USE_FULL_SCREEN_INTENT; default: return PermissionConstants.PERMISSION_GROUP_UNKNOWN; } @@ -354,6 +356,11 @@ static List getManifestNames(Context context, @PermissionConstants.Permi if (hasPermissionInManifest(context, permissionNames, Manifest.permission.SCHEDULE_EXACT_ALARM)) permissionNames.add(Manifest.permission.SCHEDULE_EXACT_ALARM); break; + case PermissionConstants.PERMISSION_GROUP_USE_FULL_SCREEN_INTENT: + // The USE_FULL_SCREEN_INTENT permission is introduced in Android UPSIDE_DOWN_CAKE, before Android 34 it should alway return Granted + if (hasPermissionInManifest(context, permissionNames, Manifest.permission.USE_FULL_SCREEN_INTENT)) + permissionNames.add(Manifest.permission.USE_FULL_SCREEN_INTENT); + break; case PermissionConstants.PERMISSION_GROUP_MEDIA_LIBRARY: case PermissionConstants.PERMISSION_GROUP_REMINDERS: case PermissionConstants.PERMISSION_GROUP_UNKNOWN: diff --git a/permission_handler_platform_interface/lib/src/permissions.dart b/permission_handler_platform_interface/lib/src/permissions.dart index 15edb6ac7..e81ae4932 100644 --- a/permission_handler_platform_interface/lib/src/permissions.dart +++ b/permission_handler_platform_interface/lib/src/permissions.dart @@ -326,6 +326,11 @@ class Permission { /// Permission for reading the current background refresh status. (iOS only) static const backgroundRefresh = Permission._(39); + /// Permission for allowing full screen on the device for alarms and calls + /// + /// Android 14+ (API 34+) + static const fullScreen = Permission._(40); + /// Returns a list of all possible [PermissionGroup] values. static const List values = [ // ignore: deprecated_member_use_from_same_package @@ -369,6 +374,7 @@ class Permission { calendarFullAccess, assistant, backgroundRefresh, + fullScreen, ]; static const List _names = [ @@ -412,6 +418,7 @@ class Permission { 'calendarFullAccess', 'assistant', 'backgroundRefresh', + 'fullScreen', ]; @override