diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 581b0aff486..29dd5d19cf2 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); @@ -572,6 +556,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(); + } + }