summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt13
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt25
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt39
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt4
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)
}
/**