Merge "Move the action buttons in installed app detail page in the preference xml."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4af9cc8..c20f466 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3755,7 +3755,9 @@
<!-- On Text & language settings screen, setting summary for the Auto-punctuate setting. -->
<string name="auto_punctuate_summary">Press Space key twice to insert \u0022.\u0022</string>
<!-- On Security & location settings screen, setting check box name. Title of the checkbox to set whether password edit fields will show the most recent character typed and then hide it, or just hide it right away. By hide, I mean mask it out. -->
- <string name="show_password">Make passwords visible</string>
+ <string name="show_password">Show passwords</string>
+ <!-- On Security & location settings screen. This is a short summary text describing what "Show passwords" setting does -->
+ <string name="show_password_summary">Display characters briefly as you type</string>
<!-- Warning message about security implications of enabling an input method, displayed as a dialog
message when the user selects to enable an IME. -->
<string name="ime_security_warning">This input method may be able to collect
diff --git a/res/values/themes.xml b/res/values/themes.xml
index c961cce..d6df2ab 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -216,7 +216,6 @@
</style>
<style name="Theme.ConfirmDeviceCredentials" parent="Theme.SubSettings">
- <item name="android:windowLightStatusBar">false</item>
<item name="confirmDeviceCredentialsSideMargin">@dimen/confirm_credentials_side_margin</item>
<item name="confirmDeviceCredentialsTopMargin">@dimen/confirm_credentials_top_margin</item>
</style>
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index 544769d..04272df 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -26,8 +26,10 @@
<intent android:action="android.settings.LOCATION_SOURCE_SETTINGS"/>
</Preference>
- <SwitchPreference android:key="show_password"
- android:title="@string/show_password"/>
+ <SwitchPreference
+ android:key="show_password"
+ android:title="@string/show_password"
+ android:summary="@string/show_password_summary"/>
</PreferenceCategory>
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index ad29694..da6bbc0 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -16,8 +16,6 @@
package com.android.settings.applications;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
import android.Manifest.permission;
import android.app.Activity;
import android.app.ActivityManager;
@@ -114,6 +112,8 @@
import java.util.HashSet;
import java.util.List;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
/**
* Activity to display application information from Settings. This activity presents
* extended information associated with a package like code, data, total size, permissions
@@ -324,6 +324,10 @@
super.onCreate(icicle);
final Activity activity = getActivity();
+ if (!ensurePackageInfoAvailable(activity)) {
+ return;
+ }
+
setHasOptionsMenu(true);
addPreferencesFromResource(R.xml.installed_app_details_ia);
addDynamicPrefs();
@@ -430,6 +434,23 @@
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() {
mForceStopButton = (Button) mActionButtons.findViewById(R.id.right_button);
mForceStopButton.setText(R.string.force_stop);
diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
index a5e8373..41800a2 100644
--- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
+++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
@@ -97,7 +97,7 @@
@Override
public void displayPreference(PreferenceScreen screen) {
if (mStoragePreference == null) {
- mStoragePreference = new StorageItemPreferenceAlternate(mContext);
+ mStoragePreference = new StorageItemPreferenceAlternate(screen.getContext());
PreferenceGroup group =
(PreferenceGroup) screen.findPreference(TARGET_PREFERENCE_GROUP_KEY);
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index 5da9fec..963784d 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -60,7 +60,7 @@
@Override
public void displayPreference(PreferenceScreen screen) {
- mStoragePreference = new StorageItemPreferenceAlternate(mContext);
+ mStoragePreference = new StorageItemPreferenceAlternate(screen.getContext());
mStoragePreference.setOrder(mPreferenceOrder);
mStoragePreference.setKey(PREFERENCE_KEY_BASE + mUser.id);
mStoragePreference.setTitle(mUser.name);
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index 4fe6293..b0cd8d5 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -16,12 +16,8 @@
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.content.Context;
import android.content.pm.ApplicationInfo;
@@ -44,6 +40,14 @@
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.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public final class InstalledAppDetailsTest {
@@ -51,24 +55,27 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private UserManager mUserManager;
@Mock
+ private Activity mActivity;
+ @Mock
private DevicePolicyManager mDevicePolicyManager;
+ private InstalledAppDetails mAppDetail;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mAppDetail = new InstalledAppDetails();
}
@Test
public void getInstallationStatus_notInstalled_shouldReturnUninstalled() {
- final InstalledAppDetails mAppDetail = new InstalledAppDetails();
assertThat(mAppDetail.getInstallationStatus(new ApplicationInfo()))
- .isEqualTo(R.string.not_installed);
+ .isEqualTo(R.string.not_installed);
}
@Test
public void getInstallationStatus_enabled_shouldReturnInstalled() {
- final InstalledAppDetails mAppDetail = new InstalledAppDetails();
final ApplicationInfo info = new ApplicationInfo();
info.flags = ApplicationInfo.FLAG_INSTALLED;
info.enabled = true;
@@ -78,7 +85,6 @@
@Test
public void getInstallationStatus_disabled_shouldReturnDisabled() {
- final InstalledAppDetails mAppDetail = new InstalledAppDetails();
final ApplicationInfo info = new ApplicationInfo();
info.flags = ApplicationInfo.FLAG_INSTALLED;
info.enabled = false;
@@ -90,7 +96,6 @@
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();
@@ -107,7 +112,6 @@
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();
@@ -139,6 +143,22 @@
assertThat(InstalledAppDetails.getStorageSummary(context, stats, false))
.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();
}
}
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java
index f2cf729..1ee18cf 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java
@@ -24,6 +24,7 @@
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
import org.junit.Test;
@@ -60,6 +61,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory.setupForTest(mActivity);
when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
mPicker = spy(new DefaultAutoFillPicker());
mPicker.onAttach((Context) mActivity);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
index 7222f53..c8f3069 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java
@@ -55,6 +55,10 @@
private static final String TARGET_PREFERENCE_GROUP_KEY = "pref_secondary_users";
@Mock
private UserManagerWrapper mUserManager;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private PreferenceGroup mGroup;
private Context mContext;
private SecondaryUserController mController;
@@ -66,19 +70,19 @@
mContext = RuntimeEnvironment.application;
mPrimaryUser = new UserInfo();
mController = new SecondaryUserController(mContext, mPrimaryUser);
+
+ when(mScreen.getContext()).thenReturn(mContext);
+ when(mScreen.findPreference(anyString())).thenReturn(mGroup);
+ when(mGroup.getKey()).thenReturn(TARGET_PREFERENCE_GROUP_KEY);
}
@Test
public void controllerAddsSecondaryUser() throws Exception {
mPrimaryUser.name = TEST_NAME;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- PreferenceGroup group = mock(PreferenceGroup.class);
- when(screen.findPreference(anyString())).thenReturn(group);
- when(group.getKey()).thenReturn(TARGET_PREFERENCE_GROUP_KEY);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(group).addPreference(argumentCaptor.capture());
+ verify(mGroup).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(preference.getTitle()).isEqualTo(TEST_NAME);
}
@@ -86,15 +90,11 @@
@Test
public void controllerUpdatesSummaryOfNewPreference() throws Exception {
mPrimaryUser.name = TEST_NAME;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- PreferenceGroup group = mock(PreferenceGroup.class);
- when(screen.findPreference(anyString())).thenReturn(group);
- when(group.getKey()).thenReturn(TARGET_PREFERENCE_GROUP_KEY);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
mController.setSize(10L);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(group).addPreference(argumentCaptor.capture());
+ verify(mGroup).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(preference.getSummary()).isEqualTo("10.00B");
@@ -153,11 +153,7 @@
public void controllerUpdatesPreferenceOnAcceptingResult() throws Exception {
mPrimaryUser.name = TEST_NAME;
mPrimaryUser.id = 10;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- PreferenceGroup group = mock(PreferenceGroup.class);
- when(screen.findPreference(anyString())).thenReturn(group);
- when(group.getKey()).thenReturn(TARGET_PREFERENCE_GROUP_KEY);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
StorageAsyncLoader.AppsStorageResult userResult =
new StorageAsyncLoader.AppsStorageResult();
SparseArray<StorageAsyncLoader.AppsStorageResult> result = new SparseArray<>();
@@ -166,7 +162,7 @@
mController.handleResult(result);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(group).addPreference(argumentCaptor.capture());
+ verify(mGroup).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(preference.getSummary()).isEqualTo("99.00B");
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
index 2cd4f76..ed49da4 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
@@ -53,6 +54,8 @@
@Mock
private UserManagerWrapper mUserManager;
+ @Mock
+ private PreferenceScreen mScreen;
private Context mContext;
private UserProfileController mController;
@@ -64,17 +67,17 @@
mContext = spy(RuntimeEnvironment.application);
mPrimaryProfile = new UserInfo();
mController = new UserProfileController(mContext, mPrimaryProfile, 0);
+ when(mScreen.getContext()).thenReturn(mContext);
}
@Test
public void controllerAddsPrimaryProfilePreference() throws Exception {
mPrimaryProfile.name = TEST_NAME;
mPrimaryProfile.id = 10;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(screen).addPreference(argumentCaptor.capture());
+ verify(mScreen).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(preference.getTitle()).isEqualTo(TEST_NAME);
@@ -85,11 +88,10 @@
public void tappingProfilePreferenceSendsToStorageProfileFragment() throws Exception {
mPrimaryProfile.name = TEST_NAME;
mPrimaryProfile.id = 10;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(screen).addPreference(argumentCaptor.capture());
+ verify(mScreen).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(mController.handlePreferenceTreeClick(preference)).isTrue();
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -105,8 +107,7 @@
public void acceptingResultUpdatesPreferenceSize() throws Exception {
mPrimaryProfile.name = TEST_NAME;
mPrimaryProfile.id = 10;
- PreferenceScreen screen = mock(PreferenceScreen.class);
- mController.displayPreference(screen);
+ mController.displayPreference(mScreen);
SparseArray<StorageAsyncLoader.AppsStorageResult> result = new SparseArray<>();
StorageAsyncLoader.AppsStorageResult userResult =
new StorageAsyncLoader.AppsStorageResult();
@@ -115,7 +116,7 @@
mController.handleResult(result);
final ArgumentCaptor<Preference> argumentCaptor = ArgumentCaptor.forClass(Preference.class);
- verify(screen).addPreference(argumentCaptor.capture());
+ verify(mScreen).addPreference(argumentCaptor.capture());
Preference preference = argumentCaptor.getValue();
assertThat(preference.getSummary()).isEqualTo("99.00B");