summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java27
-rw-r--r--framework-s/api/system-current.txt1
-rw-r--r--framework-s/java/android/app/ecm/EnhancedConfirmationManager.java10
-rw-r--r--tests/cts/permissionmultidevice/AndroidManifest.xml1
-rw-r--r--tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt5
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt5
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