diff options
5 files changed, 36 insertions, 29 deletions
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml index 4cf69f4c3..04a786e4e 100644 --- a/PermissionController/res/xml/roles.xml +++ b/PermissionController/res/xml/roles.xml @@ -131,6 +131,8 @@ <permission name="android.permission.ACCESS_BLOBS_ACROSS_USERS" minSdkVersion="31" /> <permission name="android.permission.READ_ASSISTANT_APP_SEARCH_DATA" minSdkVersion="33"/> + <permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" + minSdkVersion="33" /> </permissions> <app-op-permissions> <app-op-permission name="android.permission.SYSTEM_ALERT_WINDOW" /> @@ -592,6 +594,8 @@ minSdkVersion="33" /> <permission name="android.permission.ADD_TRUSTED_DISPLAY" minSdkVersion="33" /> <permission name="android.permission.ADD_ALWAYS_UNLOCKED_DISPLAY" minSdkVersion="33" /> + <permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" + minSdkVersion="33" /> </permissions> </role> diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java index 157e20f0d..020bf9a31 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java @@ -409,7 +409,8 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem // If this category is empty, and this isn't the "allowed" category of the storage // permission, set up the empty preference. - if (packages.size() == 0 && (!isStorageAndLessThanT || !grantCategory.equals(ALLOWED))) { + if (packages.size() == 0 + && (!isStorageAndLessThanT || !grantCategory.equals(ALLOWED))) { Preference empty = new Preference(context); empty.setSelectable(false); empty.setKey(category.getKey() + KEY_EMPTY); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/dashboard/PermissionDetailsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/dashboard/PermissionDetailsFragment.java index 2e29fda20..89a1375e1 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/dashboard/PermissionDetailsFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/dashboard/PermissionDetailsFragment.java @@ -335,6 +335,10 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement PreferenceScreen finalScreen = screen; new PermissionApps.AppDataLoader(context, () -> { + if (getActivity() == null) { + // Fragment has no Activity, return. + return; + } mViewModel.renderTimelinePreferences(usages, category, finalScreen, preferenceFactory); setLoading(false, true); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt index a87761d6a..01495aecc 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt @@ -192,14 +192,15 @@ class AppPermissionViewModel( private val appPermGroupLiveData = LightAppPermGroupLiveData[packageName, permGroupName, user] - private val mediaStorageSupergroupLiveData = mutableMapOf<String,LightAppPermGroupLiveData>() + private val mediaStorageSupergroupLiveData = + mutableMapOf<String, LightAppPermGroupLiveData>() init { addSource(appPermGroupLiveData) { appPermGroup -> lightAppPermGroup = appPermGroup if (permGroupName in Utils.STORAGE_SUPERGROUP_PERMISSIONS) { - observeMediaPermGroup(permGroupName, appPermGroup) + onMediaPermGroupUpdate(permGroupName, appPermGroup) } if (appPermGroupLiveData.isInitialized && appPermGroup == null) { value = null @@ -228,14 +229,13 @@ class AppPermissionViewModel( for (permGroupName in mediaStorageSupergroupLiveData.keys) { val liveData = mediaStorageSupergroupLiveData[permGroupName]!! addSource(liveData) { permGroup -> - observeMediaPermGroup(permGroupName, permGroup) + onMediaPermGroupUpdate(permGroupName, permGroup) } } } - } - private fun observeMediaPermGroup(permGroupName: String, permGroup: LightAppPermGroup?) { + private fun onMediaPermGroupUpdate(permGroupName: String, permGroup: LightAppPermGroup?) { if (permGroup == null) { mediaStorageSupergroupPermGroups.remove(permGroupName) value = null @@ -248,7 +248,9 @@ class AppPermissionViewModel( override fun onUpdate() { val group = appPermGroupLiveData.value ?: return for (mediaGroupLiveData in mediaStorageSupergroupLiveData.values) { - mediaGroupLiveData.isInitialized || return + if (!mediaGroupLiveData.isInitialized) { + return + } } val admin = RestrictedLockUtils.getProfileOrDeviceOwner(app, user) @@ -600,7 +602,7 @@ class AppPermissionViewModel( return } - if (isPartOfStorageSupergroup(group)) { + if (expandsToStorageSupergroup(group)) { if (changeRequest == ChangeRequest.GRANT_FOREGROUND) { defaultDeny.showConfirmDialog(ChangeRequest.GRANT_STORAGE_SUPERGROUP, R.string.storage_supergroup_warning_allow, buttonClicked, false) @@ -668,21 +670,17 @@ class AppPermissionViewModel( FullStoragePermissionAppsLiveData.recalculate() } } - } - private fun isPartOfStorageSupergroup(group: LightAppPermGroup): Boolean { - val mediaSupergroup = Utils.STORAGE_SUPERGROUP_PERMISSIONS - .mapNotNull { mediaStorageSupergroupPermGroups[it] } - val targetSdk = group.packageInfo.targetSdkVersion - return targetSdk < Build.VERSION_CODES.TIRAMISU && group in mediaSupergroup + private fun expandsToStorageSupergroup(group: LightAppPermGroup): Boolean { + return group.packageInfo.targetSdkVersion < Build.VERSION_CODES.TIRAMISU && + group.permGroupName in Utils.STORAGE_SUPERGROUP_PERMISSIONS } private fun expandToSupergroup(group: LightAppPermGroup): List<LightAppPermGroup> { val mediaSupergroup = Utils.STORAGE_SUPERGROUP_PERMISSIONS .mapNotNull { mediaStorageSupergroupPermGroups[it] } - val targetSdk = group.packageInfo.targetSdkVersion - return if (targetSdk < Build.VERSION_CODES.TIRAMISU && group in mediaSupergroup) { + return if (expandsToStorageSupergroup(group)) { mediaSupergroup } else { listOf(group) @@ -713,7 +711,8 @@ class AppPermissionViewModel( if (changeRequest andValue ChangeRequest.REVOKE_BACKGROUND != 0 && group.hasBackgroundGroup) { - newGroup = KotlinUtils.revokeBackgroundRuntimePermissions(app, newGroup, false, oneTime) + newGroup = + KotlinUtils.revokeBackgroundRuntimePermissions(app, newGroup, false, oneTime) if (wasBackgroundGranted) { SafetyNetLogger.logPermissionToggled(newGroup) @@ -723,7 +722,8 @@ class AppPermissionViewModel( } if (changeRequest andValue ChangeRequest.REVOKE_FOREGROUND != 0) { - newGroup = KotlinUtils.revokeForegroundRuntimePermissions(app, newGroup, false, oneTime) + newGroup = + KotlinUtils.revokeForegroundRuntimePermissions(app, newGroup, false, oneTime) if (wasForegroundGranted) { SafetyNetLogger.logPermissionToggled(newGroup) } @@ -739,7 +739,6 @@ class AppPermissionViewModel( FullStoragePermissionAppsLiveData.recalculate() } } - } /** diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt index abe3ad5fd..dbcb34f55 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt @@ -145,7 +145,7 @@ class GrantPermissionsViewModel( private val splitPermissionTargetSdkMap = mutableMapOf<String, Int>() - private var appPermGroupLiveDatasCache = mutableMapOf<String, LightAppPermGroupLiveData>() + private var appPermGroupLiveDatas = mutableMapOf<String, LightAppPermGroupLiveData>() /** * A class which represents a correctly requested permission group, and the buttons and messages @@ -171,7 +171,6 @@ class GrantPermissionsViewModel( SmartUpdateMediatorLiveData<List<RequestInfo>>() { private val LOG_TAG = GrantPermissionsViewModel::class.java.simpleName private val packagePermissionsLiveData = PackagePermissionsLiveData[packageName, user] - private val appPermGroupLiveDatas = mutableMapOf<String, LightAppPermGroupLiveData>() init { GlobalScope.launch(Main.immediate) { @@ -231,7 +230,6 @@ class GrantPermissionsViewModel( if (appPermGroupLiveDatas.any { it.value.isStale }) { return } - appPermGroupLiveDatasCache = appPermGroupLiveDatas var newGroups = false for ((groupName, groupLiveData) in appPermGroupLiveDatas) { val appPermGroup = groupLiveData.value @@ -799,26 +797,27 @@ class GrantPermissionsViewModel( affectedForegroundPermissions: List<String>?, result: Int ) { - onPermissionGrantResult(groupName, affectedForegroundPermissions, result, true) + onPermissionGrantResult(groupName, affectedForegroundPermissions, result, false) } private fun onPermissionGrantResult( groupName: String?, affectedForegroundPermissions: List<String>?, result: Int, - canRecurse: Boolean + alreadyRequestedStorageGroupsIfNeeded: Boolean ) { if (groupName == null) { return } // If this is a legacy app, and a storage group is requested: request all storage groups - if (canRecurse && groupName in Utils.STORAGE_SUPERGROUP_PERMISSIONS && - packageInfo.targetSdkVersion <= Build.VERSION_CODES.S_V2) { + if (!alreadyRequestedStorageGroupsIfNeeded && + groupName in Utils.STORAGE_SUPERGROUP_PERMISSIONS && + packageInfo.targetSdkVersion <= Build.VERSION_CODES.S_V2) { for (groupName in Utils.STORAGE_SUPERGROUP_PERMISSIONS) { - val groupPerms = appPermGroupLiveDatasCache[groupName] - ?.value?.allPermissions?.keys?.toList() - onPermissionGrantResult(groupName, groupPerms, result, false) + val groupPerms = appPermGroupLiveDatas[groupName] + ?.value?.allPermissions?.keys?.toList() + onPermissionGrantResult(groupName, groupPerms, result, true) } return } |