diff options
4 files changed, 45 insertions, 23 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupLiveData.kt index 3433bb19f..441298665 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupLiveData.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupLiveData.kt @@ -22,6 +22,7 @@ import android.os.Build import android.os.UserHandle import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup import com.android.permissioncontroller.permission.model.livedatatypes.LightPermission +import com.android.permissioncontroller.permission.utils.LocationUtils import com.android.permissioncontroller.permission.utils.SoftRestrictedPermissionPolicy import com.android.permissioncontroller.permission.utils.Utils import com.android.permissioncontroller.permission.utils.Utils.OS_PKG @@ -37,8 +38,8 @@ import com.android.permissioncontroller.permission.utils.Utils.OS_PKG class AppPermGroupLiveData( private val app: Application, private val packageName: String, - permGroupName: String, - user: UserHandle + private val permGroupName: String, + private val user: UserHandle ) : SmartUpdateMediatorLiveData<LightAppPermGroup>() { private val permStateLiveData = PermStateRepository.getPermStateLiveData(app, packageName, @@ -101,6 +102,21 @@ class AppPermGroupLiveData( permissionMap[permName] = LightPermission(permInfo, permState) } } - value = LightAppPermGroup(packageInfo, permGroup.groupInfo, permissionMap) + + // Determine if this app permission group is a special location package or provider + var specialLocationGrant: Boolean? = null + val userContext = Utils.getUserContext(app, user) + if (LocationUtils.isLocationGroupAndProvider(userContext, permGroupName, packageName)) { + specialLocationGrant = LocationUtils.isLocationEnabled(app) + } + // The permission of the extra location controller package is determined by the status of + // the controller package itself. + if (LocationUtils.isLocationGroupAndControllerExtraPackage(app, permGroupName, + packageName)) { + specialLocationGrant = LocationUtils.isExtraLocationControllerPackageEnabled( + userContext) + } + value = LightAppPermGroup(packageInfo, permGroup.groupInfo, permissionMap, + specialLocationGrant) } }
\ No newline at end of file diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt index df6fe8ce1..63e293c85 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt @@ -27,6 +27,7 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPack import com.android.permissioncontroller.permission.model.livedatatypes.LightPermGroupInfo import com.android.permissioncontroller.permission.model.livedatatypes.LightPermInfo import com.android.permissioncontroller.permission.model.livedatatypes.PermState +import com.android.permissioncontroller.permission.utils.LocationUtils import com.android.permissioncontroller.permission.utils.Utils /** @@ -216,7 +217,7 @@ class AppPermGroupUiInfoLiveData( } } - val anyAllowed = permissionState.any { it.value.granted } + val anyAllowed = getIsSpecialLocationState() ?: permissionState.any { it.value.granted } if (anyAllowed && hasPermWithBackground) { return PermGrantState.PERMS_ALLOWED_FOREGROUND_ONLY } else if (anyAllowed) { @@ -224,6 +225,21 @@ class AppPermGroupUiInfoLiveData( } return PermGrantState.PERMS_DENIED } + + private fun getIsSpecialLocationState(): Boolean? { + val userContext = Utils.getUserContext(app, user) + if (LocationUtils.isLocationGroupAndProvider(userContext, permissionGroupName, + packageName)) { + return LocationUtils.isLocationEnabled(userContext) + } + // The permission of the extra location controller package is determined by the + // status of the controller package itself. + if (LocationUtils.isLocationGroupAndControllerExtraPackage(userContext, + permissionGroupName, packageName)) { + return LocationUtils.isExtraLocationControllerPackageEnabled(userContext) + } + return null + } } /** diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt index 3ecfcdc6c..559f55c24 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PermStateLiveData.kt @@ -16,14 +16,12 @@ package com.android.permissioncontroller.permission.data -import android.Manifest import android.app.Application import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.os.UserHandle import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo import com.android.permissioncontroller.permission.model.livedatatypes.PermState -import com.android.permissioncontroller.permission.utils.LocationUtils import com.android.permissioncontroller.permission.utils.Utils import kotlinx.coroutines.Job @@ -90,20 +88,6 @@ class PermStateLiveData( var granted = packageFlags and PackageInfo.REQUESTED_PERMISSION_GRANTED != 0 && permFlags and PackageManager.FLAG_PERMISSION_REVOKED_COMPAT == 0 - // Check if this package is a location provider - if (permissionGroupName == Manifest.permission_group.LOCATION) { - val userContext = Utils.getUserContext(app, user) - if (LocationUtils.isLocationGroupAndProvider(userContext, permissionGroupName, - packageName)) { - granted = LocationUtils.isLocationEnabled(userContext) - } - // The permission of the extra location controller package is determined by the - // status of the controller package itself. - if (LocationUtils.isLocationGroupAndControllerExtraPackage(userContext, - permissionGroupName, packageName)) { - granted = LocationUtils.isExtraLocationControllerPackageEnabled(userContext) - } - } if (job.isCancelled) { return } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt b/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt index 057f59991..db0a9e503 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt @@ -25,12 +25,18 @@ import android.os.UserHandle * @param packageInfo: Information about the package * @param permGroupInfo: Information about the permission group * @param permissions: The permissions in the permission group that the package requests + * @param specialLocationGrant: If this package is the location provider, or the extra location + * package, then the grant state of the group is not determined by the grant state of individual + * permissions, but by other system properties */ data class LightAppPermGroup( val packageInfo: LightPackageInfo, val permGroupInfo: LightPermGroupInfo, - val permissions: Map<String, LightPermission> + val permissions: Map<String, LightPermission>, + val specialLocationGrant: Boolean? ) { + constructor(pI: LightPackageInfo, pGI: LightPermGroupInfo, perms: Map<String, LightPermission>): + this(pI, pGI, perms, null) /** * The current userHandle of this AppPermGroup. */ @@ -82,14 +88,14 @@ data class LightAppPermGroup( /** * Whether any of this App Permission Group's foreground permissions are granted */ - val isForegroundGranted = permissions.any { + val isForegroundGranted = specialLocationGrant ?: permissions.any { !backgroundPermNames.contains(it.key) && it.value.grantedIncludingAppOp } /** * Whether any of this App Permission Group's background permissions are granted */ - val isBackgroundGranted = permissions.any { + val isBackgroundGranted = specialLocationGrant ?: permissions.any { backgroundPermNames.contains(it.key) && it.value.grantedIncludingAppOp } |