diff options
8 files changed, 59 insertions, 5 deletions
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 826e57ece..40ee75636 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 @@ -32,6 +32,7 @@ import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle import android.os.UserHandle +import android.os.UserManager import androidx.annotation.RequiresApi import androidx.lifecycle.AbstractSavedStateViewModelFactory import androidx.lifecycle.SavedStateHandle @@ -85,6 +86,8 @@ class PermissionUsageDetailsViewModel( private val roleManager = Utils.getSystemServiceSafe(application.applicationContext, RoleManager::class.java) + private val userManager = + Utils.getSystemServiceSafe(application.applicationContext, UserManager::class.java) /** Updates whether system app permissions usage should be displayed in the UI. */ fun updateShowSystemAppsToggle(showSystem: Boolean) { @@ -191,6 +194,7 @@ class PermissionUsageDetailsViewModel( ): List<AppPermissionAccessUiInfo> { return allLightHistoricalPackageOpsLiveData .getLightHistoricalPackageOps() + ?.filter { Utils.shouldShowInSettings(it.userHandle, userManager) } ?.flatMap { it.clusterAccesses(startTime, showSystem) } ?.sortedBy { -1 * it.discreteAccesses.first().accessTimeMs } ?.map { it.buildAppPermissionAccessUiInfo() } @@ -488,7 +492,8 @@ class PermissionUsageDetailsViewModel( ?.let { getPackageLabel( it.proxy!!.packageName!!, - UserHandle.getUserHandleForUid(it.proxy.uid)) + UserHandle.getUserHandleForUid(it.proxy.uid) + ) } /** Returns the attribution label for the permission access, if any. */ 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 fa5b1b685..fc8deab79 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 @@ -22,6 +22,7 @@ import android.app.role.RoleManager import android.os.Build import android.os.Bundle import android.os.UserHandle +import android.os.UserManager import androidx.annotation.RequiresApi import androidx.lifecycle.AbstractSavedStateViewModelFactory import androidx.lifecycle.AndroidViewModel @@ -55,6 +56,8 @@ class PermissionUsageViewModel( private val state: SavedStateHandle, app: Application, ) : AndroidViewModel(app) { + private val userManager = + Utils.getSystemServiceSafe(app.applicationContext, UserManager::class.java) private val roleManager = Utils.getSystemServiceSafe(app.applicationContext, RoleManager::class.java) private val exemptedPackages: Set<String> = Utils.getExemptedPackages(roleManager) @@ -114,7 +117,10 @@ class PermissionUsageViewModel( } val eligibleLightPackageOpsList: List<LightPackageOps> = - getAllLightPackageOps()?.filterOutExemptedApps() ?: listOf() + getAllLightPackageOps()?.filterOutExemptedApps()?.filter { + Utils.shouldShowInSettings(it.userHandle, userManager) + } + ?: listOf() for (lightPackageOps: LightPackageOps in eligibleLightPackageOpsList) { val permGroupsToLastAccess: List<Map.Entry<String, Long>> = diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java index 2c36c0adc..dffc49aa2 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java @@ -68,6 +68,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; +import android.content.pm.UserProperties; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.graphics.Bitmap; @@ -1591,4 +1592,30 @@ public final class Utils { @NonNull ApplicationInfo applicationInfo) { return context.getPackageManager().getApplicationLabel(applicationInfo).toString(); } + + /** + * Returns whether the given user should be shown in the Settings UI in SdkLevel V+. This method + * will always return true for SdkLevels below V. + * + * @param userHandle The user for which to check whether it should be shown or not. + * @return true if it should be shown, false otherwise. + */ + public static boolean shouldShowInSettings(UserHandle userHandle, UserManager userManager) { + return !SdkLevel.isAtLeastV() || shouldShowInSettingsInternal(userHandle, userManager); + } + + /** + * Returns whether the given user should be shown in the Settings UI. + * + * @param userHandle The user for which to check whether it should be shown or not. + * @return true if it should be shown, false otherwise. + */ + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.VANILLA_ICE_CREAM) + private static boolean shouldShowInSettingsInternal( + UserHandle userHandle, UserManager userManager) { + var userProperties = userManager.getUserProperties(userHandle); + return !userManager.isQuietModeEnabled(userHandle) + || userProperties.getShowInQuietMode() != UserProperties.SHOW_IN_QUIET_MODE_HIDDEN; + } } diff --git a/framework-s/api/system-current.txt b/framework-s/api/system-current.txt index b4dfafba2..527407bf3 100644 --- a/framework-s/api/system-current.txt +++ b/framework-s/api/system-current.txt @@ -7,6 +7,7 @@ package android.app.ecm { method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isRestricted(@NonNull String, @NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public void setClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; + field public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG"; } } diff --git a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java index b05c361e1..d80e18f2f 100644 --- a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java +++ b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java @@ -16,9 +16,12 @@ package android.app.ecm; +import static android.annotation.SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION; + import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.RequiresPermission; +import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TargetApi; @@ -193,6 +196,13 @@ public final class EnhancedConfirmationManager { * appropriate RequiresPermission annotation. */ + /** + * Shows the "Restricted setting" dialog. Opened when a setting is blocked. + */ + @SdkConstant(BROADCAST_INTENT_ACTION) + public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = + "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG"; + /** A map of ECM states to their corresponding app op states */ @Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix = {"ECM_STATE_"}, value = {EcmState.ECM_STATE_NOT_GUARDED, diff --git a/tests/cts/permissionmultidevice/AndroidManifest.xml b/tests/cts/permissionmultidevice/AndroidManifest.xml index e7c993d57..9bad85813 100644 --- a/tests/cts/permissionmultidevice/AndroidManifest.xml +++ b/tests/cts/permissionmultidevice/AndroidManifest.xml @@ -20,6 +20,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="android.permissionmultidevice.cts"> + <uses-feature android:name="android.software.companion_device_setup" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> diff --git a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt index 0eff95a3d..e8d35e614 100644 --- a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt +++ b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt @@ -26,6 +26,7 @@ class FakeVirtualDeviceRule : FakeAssociationRule() { private lateinit var virtualDeviceManager: VirtualDeviceManager lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice + lateinit var deviceDisplayName: String var virtualDisplayId: Int = -1 override fun before() { @@ -57,6 +58,10 @@ class FakeVirtualDeviceRule : FakeAssociationRule() { ) Truth.assertThat(display).isNotNull() virtualDisplayId = display!!.display.displayId + deviceDisplayName = + virtualDeviceManager + .getDisplayNameForPersistentDeviceId(virtualDevice.persistentDeviceId!!) + .toString() } } diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index 09f4c7f08..b3efa36cb 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -94,7 +94,7 @@ class DeviceAwarePermissionGrantTest { Display.DEFAULT_DISPLAY, mFakeVirtualDeviceRule.virtualDevice.deviceId, true, - DEFAULT_REMOTE_DEVICE_NAME, + mFakeVirtualDeviceRule.deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, expectPermissionGrantedOnRemoteDevice = true ) @@ -120,7 +120,7 @@ class DeviceAwarePermissionGrantTest { mFakeVirtualDeviceRule.virtualDisplayId, mFakeVirtualDeviceRule.virtualDevice.deviceId, true, - DEFAULT_REMOTE_DEVICE_NAME, + mFakeVirtualDeviceRule.deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, expectPermissionGrantedOnRemoteDevice = true ) @@ -199,7 +199,6 @@ class DeviceAwarePermissionGrantTest { const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk" const val APP_PACKAGE_NAME = "android.permissionmultidevice.cts.accessremotedevicecamera" const val PERMISSION_MESSAGE_ID = "com.android.permissioncontroller:id/permission_message" - const val DEFAULT_REMOTE_DEVICE_NAME = "remote device" const val ALLOW_BUTTON = "com.android.permissioncontroller:id/permission_allow_foreground_only_button" const val DEVICE_ID_DEFAULT = 0 |