diff options
4 files changed, 64 insertions, 17 deletions
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 c6d89876b..2af942c20 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt @@ -438,8 +438,17 @@ class GrantPermissionsViewModel( } } else if (needBgPermissions) { // Case: sdk >= R, BG/FG permission requesting BG only - requestInfos.add(RequestInfo( - groupInfo, sendToSettingsImmediately = true)) + if (storedState != null && storedState.containsKey(getInstanceStateKey( + groupInfo.name, groupState.isBackground))) { + // If we're restoring state, and we had this groupInfo in our + // previous state, that means that we likely sent the user to + // settings already. Don't send the user back. + permGroupsToSkip.add(groupInfo.name) + groupState.state = STATE_SKIPPED + } else { + requestInfos.add(RequestInfo( + groupInfo, sendToSettingsImmediately = true)) + } continue } else { // Not reached as the permissions should be auto-granted diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt index f2eb246c3..f77bfff3b 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt @@ -139,6 +139,18 @@ class PermissionUsageDetailsViewModel( ?: false } + private fun isPermissionRequestedByApp(appPermissionId: AppPermissionId): Boolean { + val appRequestedPermissions = + lightPackageInfoLiveDataMap[ + Pair(appPermissionId.packageName, appPermissionId.userHandle)] + ?.value + ?.requestedPermissions + ?: listOf() + return appRequestedPermissions.any { + PermissionMapping.getGroupOfPlatformPermission(it) == appPermissionId.permissionGroup + } + } + private fun isAppPermissionSystem(appPermissionId: AppPermissionId): Boolean { val appPermGroupUiInfo = appPermGroupUiInfoLiveDataList[appPermissionId]?.value @@ -243,6 +255,7 @@ class PermissionUsageDetailsViewModel( !Utils.getExemptedPackages(roleManager).contains(it.appPermissionId.packageName) } .filter { it.appPermissionId.permissionGroup == permissionGroup } + .filter { isPermissionRequestedByApp(it.appPermissionId) } .filter { showSystem || !isAppPermissionSystem(it.appPermissionId) } } @@ -588,19 +601,11 @@ class PermissionUsageDetailsViewModel( update() } - if (appPermGroupUiInfoLiveDataList.any { !it.value.isInitialized }) { - return - } - - if (lightPackageInfoLiveDataMap.any { !it.value.isInitialized }) { - return - } - - if (isInitialized && appPermGroupUiInfoLiveDataList.any { it.value.isStale }) { + if (appPermGroupUiInfoLiveDataList.any { it.value.isStale }) { return } - if (isInitialized && lightPackageInfoLiveDataMap.any { it.value.isStale }) { + if (lightPackageInfoLiveDataMap.any { it.value.isStale }) { return } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt index cd8f68599..eeac22124 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt @@ -29,6 +29,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.savedstate.SavedStateRegistryOwner import com.android.permissioncontroller.permission.data.AppPermGroupUiInfoLiveData +import com.android.permissioncontroller.permission.data.LightPackageInfoLiveData import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData import com.android.permissioncontroller.permission.data.StandardPermGroupNamesLiveData import com.android.permissioncontroller.permission.data.v31.AllLightPackageOpsLiveData @@ -37,6 +38,7 @@ import com.android.permissioncontroller.permission.model.livedatatypes.v31.Light import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.SHOULD_SHOW_SYSTEM_KEY import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel.Companion.SHOULD_SHOW_7_DAYS_KEY import com.android.permissioncontroller.permission.utils.KotlinUtils +import com.android.permissioncontroller.permission.utils.PermissionMapping import com.android.permissioncontroller.permission.utils.Utils import java.time.Instant import java.util.concurrent.TimeUnit @@ -59,6 +61,8 @@ class PermissionUsageViewModel( private val mAllLightPackageOpsLiveData = AllLightPackageOpsLiveData(app) private val appPermGroupUiInfoLiveDataList = mutableMapOf<AppPermissionId, AppPermGroupUiInfoLiveData>() + private val lightPackageInfoLiveDataMap = + mutableMapOf<Pair<String, UserHandle>, LightPackageInfoLiveData>() private val standardPermGroupNamesLiveData = StandardPermGroupNamesLiveData val showSystemAppsLiveData = state.getLiveData(SHOULD_SHOW_SYSTEM_KEY, false) @@ -114,6 +118,8 @@ class PermissionUsageViewModel( val permGroupsToLastAccess: List<Map.Entry<String, Long>> = lightPackageOps.lastPermissionGroupAccessTimesMs.entries .filterOutExemptedPermissionGroupsFromKeys() + .filterOutPermissionsNotRequestedByApp( + lightPackageOps.packageName, lightPackageOps.userHandle) .filterOutSystemAppPermissionsIfNecessary( showSystem, lightPackageOps.packageName, lightPackageOps.userHandle) .filterAccessTimeLaterThan(startTime) @@ -157,6 +163,18 @@ class PermissionUsageViewModel( standardPermGroupNamesLiveData.value?.filterOutExemptedPermissionGroups()?.toSet() ?: setOf() + private fun isPermissionRequestedByApp(appPermissionId: AppPermissionId): Boolean { + val appRequestedPermissions = + lightPackageInfoLiveDataMap[ + Pair(appPermissionId.packageName, appPermissionId.userHandle)] + ?.value + ?.requestedPermissions + ?: listOf() + return appRequestedPermissions.any { + PermissionMapping.getGroupOfPlatformPermission(it) == appPermissionId.permissionGroup + } + } + private fun isAppPermissionSystem(appPermissionId: AppPermissionId): Boolean { val appPermGroupUiInfo = appPermGroupUiInfoLiveDataList[appPermissionId]?.value @@ -187,6 +205,12 @@ class PermissionUsageViewModel( it.value > startTime } + /** Filters out app permissions when the permission has not been requested by the app. */ + private fun Collection<Map.Entry<String, Long>>.filterOutPermissionsNotRequestedByApp( + packageName: String, + userHandle: UserHandle + ) = filter { isPermissionRequestedByApp(AppPermissionId(packageName, userHandle, it.key)) } + /** * Filters out system app permissions from a map of permission last accesses, if showSystem is * false. @@ -263,6 +287,9 @@ class PermissionUsageViewModel( appPermissionId.userHandle, )] } + private val getLightPackageInfoLiveData = { packageUser: Pair<String, UserHandle> -> + LightPackageInfoLiveData[packageUser] + } init { addSource(mAllLightPackageOpsLiveData) { update() } @@ -272,7 +299,7 @@ class PermissionUsageViewModel( } override fun onUpdate() { - if (!mAllLightPackageOpsLiveData.isInitialized) { + if (mAllLightPackageOpsLiveData.isStale) { return } @@ -296,11 +323,17 @@ class PermissionUsageViewModel( update() } - if (appPermGroupUiInfoLiveDataList.any { !it.value.isInitialized }) { + setSourcesToDifference( + allPackages, lightPackageInfoLiveDataMap, getLightPackageInfoLiveData) { + update() + } + + if (lightPackageInfoLiveDataMap.any { it.value.isStale }) { return } - if (isInitialized && appPermGroupUiInfoLiveDataList.any { it.value.isStale }) { + + if (appPermGroupUiInfoLiveDataList.any { it.value.isStale }) { return } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt index a9d8c4e12..2939a9cff 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt @@ -282,7 +282,7 @@ object KotlinUtils { @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codename = "UpsideDownCake") fun isPermissionRationaleEnabled(): Boolean { return SdkLevel.isAtLeastU() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - PERMISSION_RATIONALE_ENABLED, false) + PERMISSION_RATIONALE_ENABLED, true) } /** @@ -291,7 +291,7 @@ object KotlinUtils { @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codename = "UpsideDownCake") fun isSafetyLabelChangeNotificationsEnabled(): Boolean { return SdkLevel.isAtLeastU() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED, false) + SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED, true) } /** |