diff --git a/permission_handler_android/CHANGELOG.md b/permission_handler_android/CHANGELOG.md index 37874ccd3..7b4465eee 100644 --- a/permission_handler_android/CHANGELOG.md +++ b/permission_handler_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 12.0.14 + +* Adds support for USE_FULL_SCREEN_INTENT permission check on Android 14+ + ## 12.0.13 * Updates the Android min SDK to 19 (from 16). @@ -21,7 +25,7 @@ ## 12.0.8 -* Adds support for limited photo and video permission on Android. +* Adds support for limited photo and video permission on Android. ## 12.0.7 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_android/example/android/app/src/main/AndroidManifest.xml b/permission_handler_android/example/android/app/src/main/AndroidManifest.xml index c9457c995..734cee9a0 100644 --- a/permission_handler_android/example/android/app/src/main/AndroidManifest.xml +++ b/permission_handler_android/example/android/app/src/main/AndroidManifest.xml @@ -96,6 +96,8 @@ + + =2.15.0 <4.0.0" diff --git a/permission_handler_platform_interface/CHANGELOG.md b/permission_handler_platform_interface/CHANGELOG.md index 6e3b35cc9..8968f4543 100644 --- a/permission_handler_platform_interface/CHANGELOG.md +++ b/permission_handler_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.2.4 + +* Adds support for USE_FULL_SCREEN_INTENT permission check on Android 14+ + ## 4.2.3 * Fixes class name references in the API documentation. 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 diff --git a/permission_handler_platform_interface/pubspec.yaml b/permission_handler_platform_interface/pubspec.yaml index ca3aea932..897bc0237 100644 --- a/permission_handler_platform_interface/pubspec.yaml +++ b/permission_handler_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the permission_handler plugin. homepage: https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 4.2.3 +version: 4.2.4 dependencies: flutter: diff --git a/permission_handler_platform_interface/test/src/permissions_test.dart b/permission_handler_platform_interface/test/src/permissions_test.dart index 0f8beb470..86256a40c 100644 --- a/permission_handler_platform_interface/test/src/permissions_test.dart +++ b/permission_handler_platform_interface/test/src/permissions_test.dart @@ -5,7 +5,7 @@ void main() { test('Permission has the right amount of possible Permission values', () { const values = Permission.values; - expect(values.length, 40); + expect(values.length, 41); }); test('check if byValue returns corresponding Permission value', () {