diff options
author | 2019-11-19 09:30:20 -0800 | |
---|---|---|
committer | 2019-11-19 09:49:12 -0800 | |
commit | 1efb2265382de61595fa85da3a0c79d11b8ba474 (patch) | |
tree | cb64ce8d0acf7d2258c08b3c712ff04bc4baac2a | |
parent | 7f6620987562ba3dfee93d507261d2947c7442ef (diff) |
Set location provider state on group level
Change the location provider and extra location package's location grant
state on the package level, not the individual permission level. This
prevents packages being incorrectly marked as user sensitive.
Test: Go to the location permissions screen, on a device with google
play services as its location provider. Google play services should not
be shown unless you select "show system"
Change-Id: I50cd37237365c020b086c710c577b5c49bdadb3d
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 9c3bb8a23..eee67e474 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 } }
\ No newline at end of file |