From 49d3e348107215920ddf4e18903db96bb1c8768a Mon Sep 17 00:00:00 2001 From: Adam Bookatz Date: Mon, 16 Dec 2024 10:48:31 -0800 Subject: [PATCH] Expand uninstallForAll to Admins Currently, user 0 can uninstall other users' apps. It really has that ability by virtue of it being an Admin user. But non-user-0 Admins don't currently have this ability, so we expand that here. This also allows this ability on HSUM, where human Admin users aren't user 0. Bug: 384514936 Test: manual confirmation that overflow appears on HSUM device Test: atest SettingsSpaUnitTests:com.android.settings.spa.app.appinfo.AppInfoSettingsMoreOptionsTest Flag: EXEMPT bugfix Change-Id: I976bb63ecced3c128f8109c63c85067f4a0cdf9b --- .../appinfo/AppInfoDashboardFragment.java | 2 +- .../app/appinfo/AppInfoSettingsMoreOptions.kt | 2 +- .../appinfo/AppInfoSettingsMoreOptionsTest.kt | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index 1712e85259c..432b71121de 100644 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -572,7 +572,7 @@ public class AppInfoDashboardFragment extends DashboardFragment showIt = false; } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { showIt = false; - } else if (UserHandle.myUserId() != 0) { + } else if (!mUserManager.isAdminUser()) { showIt = false; } else if (mUserManager.getUsers().size() < 2) { showIt = false; diff --git a/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptions.kt b/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptions.kt index e05340271f5..1a3dd6eaa1b 100644 --- a/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptions.kt +++ b/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptions.kt @@ -167,7 +167,7 @@ private fun ApplicationInfo.isShowUninstallUpdates(context: Context): Boolean = private fun ApplicationInfo.isShowUninstallForAllUsers( userManager: UserManager, packageManagers: IPackageManagers, -): Boolean = userId == 0 && !isSystemApp && !isInstantApp && +): Boolean = userManager.isUserAdmin(userId) && !isSystemApp && !isInstantApp && isOtherUserHasInstallPackage(userManager, packageManagers) private fun ApplicationInfo.isOtherUserHasInstallPackage( diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptionsTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptionsTest.kt index d4a989cc3ab..11ba67f75f6 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptionsTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppInfoSettingsMoreOptionsTest.kt @@ -159,6 +159,7 @@ class AppInfoSettingsMoreOptionsTest { packageName = PACKAGE_NAME uid = UID } + whenever(userManager.isUserAdmin(app.userId)).thenReturn(true) whenever(userManager.aliveUsers).thenReturn(listOf(OTHER_USER)) whenever(packageManagers.isPackageInstalledAsUser(PACKAGE_NAME, OTHER_USER_ID)) .thenReturn(true) @@ -171,12 +172,30 @@ class AppInfoSettingsMoreOptionsTest { ) } + @Test + fun uninstallForAllUsers_NotAdminUser_notDisplayed() { + val app = ApplicationInfo().apply { + packageName = PACKAGE_NAME + uid = UID + } + whenever(userManager.isUserAdmin(app.userId)).thenReturn(false) + whenever(userManager.aliveUsers).thenReturn(listOf(OTHER_USER)) + whenever(packageManagers.isPackageInstalledAsUser(PACKAGE_NAME, OTHER_USER_ID)) + .thenReturn(true) + + setContent(app) + composeTestRule.onRoot().performClick() + + composeTestRule.onRoot().assertIsNotDisplayed() + } + @Test fun uninstallForAllUsers_appHiddenNotInQuietModeAndPrimaryUser_displayed() { val app = ApplicationInfo().apply { packageName = PACKAGE_NAME uid = UID } + whenever(userManager.isUserAdmin(app.userId)).thenReturn(true) whenever(userManager.aliveUsers).thenReturn(listOf(OTHER_USER)) whenever(packageManagers .isPackageInstalledAsUser(PACKAGE_NAME, OTHER_USER_ID)) @@ -198,6 +217,7 @@ class AppInfoSettingsMoreOptionsTest { packageName = PACKAGE_NAME uid = UID } + whenever(userManager.isUserAdmin(app.userId)).thenReturn(true) whenever(userManager.aliveUsers).thenReturn(listOf(OTHER_USER)) whenever(packageManagers .isPackageInstalledAsUser(PACKAGE_NAME, OTHER_USER_ID))