From 2508ed56ca1ae3c8a775507090b31f57b61c188a Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Thu, 2 Mar 2017 11:39:51 -0800 Subject: [PATCH] Show uninstall for all users option menu in app info. - when there is only 1 user installed the app, also check if it is installed by the current user or by other user to determine whether or not to show the uninstall for all button. Change-Id: I1eecb13a7748c92159cb0626e2b6fe1ed6987d15 Fix: 34760157 Test: make RunSettingsRoboTests --- .../applications/InstalledAppDetails.java | 40 +++++++------ .../applications/InstalledAppDetailsTest.java | 57 +++++++++++++++++++ 2 files changed, 80 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 0be4d9e8614..c2732d5bb08 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -490,23 +490,7 @@ public class InstalledAppDetails extends AppInfoBase if (mFinishing) { return; } - boolean showIt = true; - if (mUpdatedSysApp) { - showIt = false; - } else if (mAppEntry == null) { - showIt = false; - } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - showIt = false; - } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { - showIt = false; - } else if (UserHandle.myUserId() != 0) { - showIt = false; - } else if (mUserManager.getUsers().size() < 2) { - showIt = false; - } else if (PackageUtil.countPackageInUsers(mPm, mUserManager, mPackageName) < 2) { - showIt = false; - } - menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); + menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(shouldShowUninstallForAll(mAppEntry)); mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES); uninstallUpdatesItem.setVisible(mUpdatedSysApp && !mAppsControlDisallowedBySystem); @@ -571,6 +555,28 @@ public class InstalledAppDetails extends AppInfoBase } } + @VisibleForTesting + boolean shouldShowUninstallForAll(ApplicationsState.AppEntry appEntry) { + boolean showIt = true; + if (mUpdatedSysApp) { + showIt = false; + } else if (appEntry == null) { + showIt = false; + } else if ((appEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + showIt = false; + } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { + showIt = false; + } else if (UserHandle.myUserId() != 0) { + showIt = false; + } else if (mUserManager.getUsers().size() < 2) { + showIt = false; + } else if (PackageUtil.countPackageInUsers(mPm, mUserManager, mPackageName) < 2 + && (appEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) != 0) { + showIt = false; + } + return showIt; + } + @VisibleForTesting int getInstallationStatus(ApplicationInfo info) { if ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index dc370791c55..2a703ef2eaa 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -16,22 +16,44 @@ package com.android.settings.applications; +import android.app.admin.DevicePolicyManager; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.os.UserManager; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settingslib.applications.ApplicationsState.AppEntry; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public final class InstalledAppDetailsTest { + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private UserManager mUserManager; + @Mock + private DevicePolicyManager mDevicePolicyManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + @Test public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); @@ -60,4 +82,39 @@ public final class InstalledAppDetailsTest { assertThat(mAppDetail.getInstallationStatus(info)).isEqualTo(R.string.disabled); } + @Test + public void shouldShowUninstallForAll_installForOneOtherUserOnly_shouldReturnTrue() { + when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); + when(mUserManager.getUsers().size()).thenReturn(2); + final InstalledAppDetails mAppDetail = new InstalledAppDetails(); + ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); + ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); + final ApplicationInfo info = new ApplicationInfo(); + info.enabled = true; + final AppEntry appEntry = mock(AppEntry.class); + appEntry.info = info; + final PackageInfo packageInfo = mock(PackageInfo.class); + ReflectionHelpers.setField(mAppDetail, "mPackageInfo", packageInfo); + + assertThat(mAppDetail.shouldShowUninstallForAll(appEntry)).isTrue(); + } + + @Test + public void shouldShowUninstallForAll_installForSelfOnly_shouldReturnFalse() { + when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); + when(mUserManager.getUsers().size()).thenReturn(2); + final InstalledAppDetails mAppDetail = new InstalledAppDetails(); + ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); + ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); + final ApplicationInfo info = new ApplicationInfo(); + info.flags = ApplicationInfo.FLAG_INSTALLED; + info.enabled = true; + final AppEntry appEntry = mock(AppEntry.class); + appEntry.info = info; + final PackageInfo packageInfo = mock(PackageInfo.class); + ReflectionHelpers.setField(mAppDetail, "mPackageInfo", packageInfo); + + assertThat(mAppDetail.shouldShowUninstallForAll(appEntry)).isFalse(); + } + }