From 3fd4c55d6da41ec66ae8b26e358408c9c6366ff2 Mon Sep 17 00:00:00 2001 From: Jay Thomas Sullivan Date: Tue, 12 Apr 2022 19:45:52 -0700 Subject: [PATCH] Don't re-prompt for VISUAL/AURAL after app upgrade Background/Motivation: When a targetSDK=S-or-lesser app on a T+ platform has the STORAGE permission group granted, the READ_MEDIA_AURAL and READ_MEDIA_VISUAL permissions (due to split permission definitions) will be implicitly granted to the app. When the app is upgraded to targetSDK=T+, the split permission no longer applies, and so it will need to request the READ_MEDIA_AURAL and READ_MEDIA_VISUAL permissions explicitly. And, due to current split permission handling logic, when this upgrade occurs, the app will require a grant dialog re-prompt to be granted these new permissions. But, for READ_MEDIA_AURAL and READ_MEDIA_VISUAL, we don't want to re-prompt. Why re-prompt occurs: The reason the re-prompt occurs is that, upon app-upgrade, implicitly- granted permissions (such as split permissions) are assigned the REVOKE_WHEN_REQUESTED flag. The purpose of setting this flag for split permissions is that usually we want to perform exactly the opposite of the motive for this commit: the flag in fact forces formerly-implicit, now-explicit permissions to result in a grant dialog re- prompt. Solution: The solution is to simply not set this flag for these specific permissions. (Also: in this commit, to make things less confusing, we changed the STORAGE list to only include permissions in the STORAGE group. This required updating an if statement unrelated to this change.) Bug: 228609860 Test: manual Change-Id: If9ba2ebb22f8c777f82d7538b333f729b660fc91 --- .../PermissionManagerServiceImpl.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 423c289448c99..54656c5e26287 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -194,6 +194,11 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt /** All storage permissions */ private static final List STORAGE_PERMISSIONS = new ArrayList<>(); + + private static final Set READ_MEDIA_AURAL_PERMISSIONS = new ArraySet<>(); + + private static final Set READ_MEDIA_VISUAL_PERMISSIONS = new ArraySet<>(); + /** All nearby devices permissions */ private static final List NEARBY_DEVICES_PERMISSIONS = new ArrayList<>(); @@ -221,10 +226,10 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt Manifest.permission.INTERACT_ACROSS_USERS_FULL); STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE); STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); - STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION); - STORAGE_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO); - STORAGE_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES); - STORAGE_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO); + READ_MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO); + READ_MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO); + READ_MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES); + READ_MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION); NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_ADVERTISE); NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_CONNECT); NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_SCAN); @@ -2083,7 +2088,10 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt PermissionInfo permInfo = getPermissionInfo( newPackage.getRequestedPermissions().get(i), newPackage.getPackageName(), 0); - if (permInfo == null || !STORAGE_PERMISSIONS.contains(permInfo.name)) { + boolean isStorageOrMedia = STORAGE_PERMISSIONS.contains(permInfo.name) + || READ_MEDIA_AURAL_PERMISSIONS.contains(permInfo.name) + || READ_MEDIA_VISUAL_PERMISSIONS.contains(permInfo.name); + if (permInfo == null || !isStorageOrMedia) { continue; } @@ -3150,7 +3158,9 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt } if (bp.isRuntime()) { - if (!newPerm.equals(Manifest.permission.ACTIVITY_RECOGNITION)) { + if (!(newPerm.equals(Manifest.permission.ACTIVITY_RECOGNITION) + || READ_MEDIA_AURAL_PERMISSIONS.contains(newPerm) + || READ_MEDIA_VISUAL_PERMISSIONS.contains(newPerm))) { ps.updatePermissionFlags(bp, FLAG_PERMISSION_REVOKE_WHEN_REQUESTED, FLAG_PERMISSION_REVOKE_WHEN_REQUESTED);