diff --git a/permission_handler_android/CHANGELOG.md b/permission_handler_android/CHANGELOG.md index dfec82c83..22cace595 100644 --- a/permission_handler_android/CHANGELOG.md +++ b/permission_handler_android/CHANGELOG.md @@ -1,7 +1,10 @@ +## 13.0.2 + +- Adds support for USE_FULL_SCREEN_INTENT permission check on Android 14+ ## 13.0.1 -* fix: Resolve `PermissionRequestInProgressException` when app is relaunched with non-standard launchMode. +- fix: Resolve `PermissionRequestInProgressException` when app is relaunched with non-standard launchMode. ## 13.0.0 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 8da9ee2ef..d174d7f44 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 @@ -267,6 +267,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, @@ -422,6 +432,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(); @@ -566,7 +580,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 @@ + + 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 586671633..6dce893af 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.3.0 +version: 4.3.1 environment: sdk: ^3.5.0 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', () {