Loading src/com/android/settings/applications/InstalledAppDetails.java +23 −3 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.applications; package com.android.settings.applications; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest.permission; import android.Manifest.permission; import android.app.Activity; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager; Loading Loading @@ -68,7 +66,6 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem; import android.view.View; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup; import android.webkit.IWebViewUpdateService; import android.webkit.IWebViewUpdateService; import android.widget.Button; import android.widget.Button; Loading Loading @@ -115,6 +112,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; /** /** * Activity to display application information from Settings. This activity presents * Activity to display application information from Settings. This activity presents * extended information associated with a package like code, data, total size, permissions * extended information associated with a package like code, data, total size, permissions Loading Loading @@ -325,6 +324,10 @@ public class InstalledAppDetails extends AppInfoBase super.onCreate(icicle); super.onCreate(icicle); final Activity activity = getActivity(); final Activity activity = getActivity(); if (!ensurePackageInfoAvailable(activity)) { return; } setHasOptionsMenu(true); setHasOptionsMenu(true); addPreferencesFromResource(R.xml.installed_app_details_ia); addPreferencesFromResource(R.xml.installed_app_details_ia); addDynamicPrefs(); addDynamicPrefs(); Loading Loading @@ -434,6 +437,23 @@ public class InstalledAppDetails extends AppInfoBase refreshUi(); refreshUi(); } } /** * Ensures the {@link PackageInfo} is available to proceed. If it's not available, the fragment * will finish. * * @return true if packageInfo is available. */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) boolean ensurePackageInfoAvailable(Activity activity) { if (mPackageInfo == null) { mFinishing = true; Log.w(LOG_TAG, "Package info not available. Is this package already uninstalled?"); activity.finishAndRemoveTask(); return false; } return true; } private void prepareUninstallAndStop() { private void prepareUninstallAndStop() { mForceStopButton = (Button) mFooter.findViewById(R.id.right_button); mForceStopButton = (Button) mFooter.findViewById(R.id.right_button); mForceStopButton.setText(R.string.force_stop); mForceStopButton.setText(R.string.force_stop); Loading tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +31 −11 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,8 @@ package com.android.settings.applications; package com.android.settings.applications; 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; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; Loading @@ -44,6 +40,14 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; 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.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public final class InstalledAppDetailsTest { public final class InstalledAppDetailsTest { Loading @@ -51,16 +55,20 @@ public final class InstalledAppDetailsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS) private UserManager mUserManager; private UserManager mUserManager; @Mock @Mock private Activity mActivity; @Mock private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager; private InstalledAppDetails mAppDetail; @Before @Before public void setUp() { public void setUp() { MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this); mAppDetail = new InstalledAppDetails(); } } @Test @Test public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); assertThat(mAppDetail.getInstallationStatus(new ApplicationInfo())) assertThat(mAppDetail.getInstallationStatus(new ApplicationInfo())) .isEqualTo(R.string.not_installed); .isEqualTo(R.string.not_installed); Loading @@ -68,7 +76,6 @@ public final class InstalledAppDetailsTest { @Test @Test public void getInstallationStatus_enabled_shouldReturnInstalled() { public void getInstallationStatus_enabled_shouldReturnInstalled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = true; info.enabled = true; Loading @@ -78,7 +85,6 @@ public final class InstalledAppDetailsTest { @Test @Test public void getInstallationStatus_disabled_shouldReturnDisabled() { public void getInstallationStatus_disabled_shouldReturnDisabled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = false; info.enabled = false; Loading @@ -90,7 +96,6 @@ public final class InstalledAppDetailsTest { public void shouldShowUninstallForAll_installForOneOtherUserOnly_shouldReturnTrue() { public void shouldShowUninstallForAll_installForOneOtherUserOnly_shouldReturnTrue() { when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mUserManager.getUsers().size()).thenReturn(2); when(mUserManager.getUsers().size()).thenReturn(2); final InstalledAppDetails mAppDetail = new InstalledAppDetails(); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); Loading @@ -107,7 +112,6 @@ public final class InstalledAppDetailsTest { public void shouldShowUninstallForAll_installForSelfOnly_shouldReturnFalse() { public void shouldShowUninstallForAll_installForSelfOnly_shouldReturnFalse() { when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mUserManager.getUsers().size()).thenReturn(2); when(mUserManager.getUsers().size()).thenReturn(2); final InstalledAppDetails mAppDetail = new InstalledAppDetails(); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); Loading Loading @@ -139,6 +143,22 @@ public final class InstalledAppDetailsTest { assertThat(InstalledAppDetails.getStorageSummary(context, stats, false)) assertThat(InstalledAppDetails.getStorageSummary(context, stats, false)) .isEqualTo("1.00B used in Internal storage"); .isEqualTo("1.00B used in Internal storage"); } @Test public void launchFragment_hasNoPackageInfo_shouldFinish() { ReflectionHelpers.setField(mAppDetail, "mPackageInfo", null); assertThat(mAppDetail.ensurePackageInfoAvailable(mActivity)).isFalse(); verify(mActivity).finishAndRemoveTask(); } @Test public void launchFragment_hasPackageInfo_shouldReturnTrue() { final PackageInfo packageInfo = mock(PackageInfo.class); ReflectionHelpers.setField(mAppDetail, "mPackageInfo", packageInfo); assertThat(mAppDetail.ensurePackageInfoAvailable(mActivity)).isTrue(); verify(mActivity, never()).finishAndRemoveTask(); } } } } Loading
src/com/android/settings/applications/InstalledAppDetails.java +23 −3 Original line number Original line Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.applications; package com.android.settings.applications; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.Manifest.permission; import android.Manifest.permission; import android.app.Activity; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager; Loading Loading @@ -68,7 +66,6 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem; import android.view.View; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup; import android.webkit.IWebViewUpdateService; import android.webkit.IWebViewUpdateService; import android.widget.Button; import android.widget.Button; Loading Loading @@ -115,6 +112,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; /** /** * Activity to display application information from Settings. This activity presents * Activity to display application information from Settings. This activity presents * extended information associated with a package like code, data, total size, permissions * extended information associated with a package like code, data, total size, permissions Loading Loading @@ -325,6 +324,10 @@ public class InstalledAppDetails extends AppInfoBase super.onCreate(icicle); super.onCreate(icicle); final Activity activity = getActivity(); final Activity activity = getActivity(); if (!ensurePackageInfoAvailable(activity)) { return; } setHasOptionsMenu(true); setHasOptionsMenu(true); addPreferencesFromResource(R.xml.installed_app_details_ia); addPreferencesFromResource(R.xml.installed_app_details_ia); addDynamicPrefs(); addDynamicPrefs(); Loading Loading @@ -434,6 +437,23 @@ public class InstalledAppDetails extends AppInfoBase refreshUi(); refreshUi(); } } /** * Ensures the {@link PackageInfo} is available to proceed. If it's not available, the fragment * will finish. * * @return true if packageInfo is available. */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) boolean ensurePackageInfoAvailable(Activity activity) { if (mPackageInfo == null) { mFinishing = true; Log.w(LOG_TAG, "Package info not available. Is this package already uninstalled?"); activity.finishAndRemoveTask(); return false; } return true; } private void prepareUninstallAndStop() { private void prepareUninstallAndStop() { mForceStopButton = (Button) mFooter.findViewById(R.id.right_button); mForceStopButton = (Button) mFooter.findViewById(R.id.right_button); mForceStopButton.setText(R.string.force_stop); mForceStopButton.setText(R.string.force_stop); Loading
tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +31 −11 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,8 @@ package com.android.settings.applications; package com.android.settings.applications; 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; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; Loading @@ -44,6 +40,14 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; 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.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public final class InstalledAppDetailsTest { public final class InstalledAppDetailsTest { Loading @@ -51,16 +55,20 @@ public final class InstalledAppDetailsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS) private UserManager mUserManager; private UserManager mUserManager; @Mock @Mock private Activity mActivity; @Mock private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager; private InstalledAppDetails mAppDetail; @Before @Before public void setUp() { public void setUp() { MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this); mAppDetail = new InstalledAppDetails(); } } @Test @Test public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { public void getInstallationStatus_notInstalled_shouldReturnUninstalled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); assertThat(mAppDetail.getInstallationStatus(new ApplicationInfo())) assertThat(mAppDetail.getInstallationStatus(new ApplicationInfo())) .isEqualTo(R.string.not_installed); .isEqualTo(R.string.not_installed); Loading @@ -68,7 +76,6 @@ public final class InstalledAppDetailsTest { @Test @Test public void getInstallationStatus_enabled_shouldReturnInstalled() { public void getInstallationStatus_enabled_shouldReturnInstalled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = true; info.enabled = true; Loading @@ -78,7 +85,6 @@ public final class InstalledAppDetailsTest { @Test @Test public void getInstallationStatus_disabled_shouldReturnDisabled() { public void getInstallationStatus_disabled_shouldReturnDisabled() { final InstalledAppDetails mAppDetail = new InstalledAppDetails(); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); info.flags = ApplicationInfo.FLAG_INSTALLED; info.flags = ApplicationInfo.FLAG_INSTALLED; info.enabled = false; info.enabled = false; Loading @@ -90,7 +96,6 @@ public final class InstalledAppDetailsTest { public void shouldShowUninstallForAll_installForOneOtherUserOnly_shouldReturnTrue() { public void shouldShowUninstallForAll_installForOneOtherUserOnly_shouldReturnTrue() { when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mUserManager.getUsers().size()).thenReturn(2); when(mUserManager.getUsers().size()).thenReturn(2); final InstalledAppDetails mAppDetail = new InstalledAppDetails(); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); Loading @@ -107,7 +112,6 @@ public final class InstalledAppDetailsTest { public void shouldShowUninstallForAll_installForSelfOnly_shouldReturnFalse() { public void shouldShowUninstallForAll_installForSelfOnly_shouldReturnFalse() { when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mDevicePolicyManager.packageHasActiveAdmins(anyString())).thenReturn(false); when(mUserManager.getUsers().size()).thenReturn(2); when(mUserManager.getUsers().size()).thenReturn(2); final InstalledAppDetails mAppDetail = new InstalledAppDetails(); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mDpm", mDevicePolicyManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); ReflectionHelpers.setField(mAppDetail, "mUserManager", mUserManager); final ApplicationInfo info = new ApplicationInfo(); final ApplicationInfo info = new ApplicationInfo(); Loading Loading @@ -139,6 +143,22 @@ public final class InstalledAppDetailsTest { assertThat(InstalledAppDetails.getStorageSummary(context, stats, false)) assertThat(InstalledAppDetails.getStorageSummary(context, stats, false)) .isEqualTo("1.00B used in Internal storage"); .isEqualTo("1.00B used in Internal storage"); } @Test public void launchFragment_hasNoPackageInfo_shouldFinish() { ReflectionHelpers.setField(mAppDetail, "mPackageInfo", null); assertThat(mAppDetail.ensurePackageInfoAvailable(mActivity)).isFalse(); verify(mActivity).finishAndRemoveTask(); } @Test public void launchFragment_hasPackageInfo_shouldReturnTrue() { final PackageInfo packageInfo = mock(PackageInfo.class); ReflectionHelpers.setField(mAppDetail, "mPackageInfo", packageInfo); assertThat(mAppDetail.ensurePackageInfoAvailable(mActivity)).isTrue(); verify(mActivity, never()).finishAndRemoveTask(); } } } }