From 72b25d65d3f65c6f5f2ee0f414b588898bf9225e Mon Sep 17 00:00:00 2001 From: tmfang Date: Thu, 29 Nov 2018 23:35:26 +0800 Subject: [PATCH] Add an open button in App info page. Per new UX, we need to add an "Open" button in App info page. When user clicks this button, it will launch application. Test: visual, robotest Bug: 116346008 Change-Id: Ic4a36979d08bf8d58f792474cd3c9b34a147fef8 --- .../AppButtonsPreferenceController.java | 51 ++++++++++++------- .../AppButtonsPreferenceControllerTest.java | 47 +++++++++++------ 2 files changed, 65 insertions(+), 33 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index ebcb6edafd1..2e528a71e6f 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -101,6 +101,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp @VisibleForTesting ActionButtonsPreference mButtonsPref; + private final int mUserId; private final int mRequestUninstall; private final int mRequestRemoveDeviceAdmin; private final DevicePolicyManager mDpm; @@ -110,8 +111,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp private final InstrumentedPreferenceFragment mFragment; private final MetricsFeatureProvider mMetricsFeatureProvider; private final ApplicationFeatureProvider mApplicationFeatureProvider; - private final int mUserId; + private Intent mAppLaunchIntent; private ApplicationsState.Session mSession; private RestrictedLockUtils.EnforcedAdmin mAppsControlDisallowedAdmin; @@ -144,6 +145,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp mUserId = UserHandle.myUserId(); mRequestUninstall = requestUninstall; mRequestRemoveDeviceAdmin = requestRemoveDeviceAdmin; + mAppLaunchIntent = mPm.getLaunchIntentForPackage(mPackageName); if (packageName != null) { mAppEntry = mState.getEntry(packageName, mUserId); @@ -167,13 +169,16 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp if (isAvailable()) { mButtonsPref = ((ActionButtonsPreference) screen.findPreference( KEY_ACTION_BUTTONS)) - .setButton1Text(R.string.uninstall_text) - .setButton1Icon(R.drawable.ic_settings_delete) - .setButton2Text(R.string.force_stop) - .setButton2Icon(R.drawable.ic_settings_force_stop) - .setButton1OnClickListener(new UninstallAndDisableButtonListener()) - .setButton2OnClickListener(new ForceStopButtonListener()) - .setButton2Enabled(false); + .setButton1Text(R.string.launch_instant_app) + .setButton1Icon(R.drawable.ic_settings_open) + .setButton1OnClickListener(v -> launchApplication()) + .setButton2Text(R.string.uninstall_text) + .setButton2Icon(R.drawable.ic_settings_delete) + .setButton2OnClickListener(new UninstallAndDisableButtonListener()) + .setButton3Text(R.string.force_stop) + .setButton3Icon(R.drawable.ic_settings_force_stop) + .setButton3OnClickListener(new ForceStopButtonListener()) + .setButton3Enabled(false); } } @@ -361,6 +366,12 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp } } + @VisibleForTesting + void updateOpenButton() { + mAppLaunchIntent = mPm.getLaunchIntentForPackage(mPackageName); + mButtonsPref.setButton1Visible(mAppLaunchIntent != null); + } + @VisibleForTesting void updateUninstallButton() { final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; @@ -431,7 +442,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp enabled = false; } - mButtonsPref.setButton1Enabled(enabled); + mButtonsPref.setButton2Enabled(enabled); } /** @@ -498,9 +509,9 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp @VisibleForTesting void updateForceStopButtonInner(boolean enabled) { if (mAppsControlDisallowedBySystem) { - mButtonsPref.setButton2Enabled(false); + mButtonsPref.setButton3Enabled(false); } else { - mButtonsPref.setButton2Enabled(enabled); + mButtonsPref.setButton3Enabled(enabled); } } @@ -548,16 +559,16 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp if (mHomePackages.contains(mAppEntry.info.packageName) || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. - mButtonsPref.setButton1Text(R.string.uninstall_text) - .setButton1Icon(R.drawable.ic_settings_delete); + mButtonsPref.setButton2Text(R.string.uninstall_text) + .setButton2Icon(R.drawable.ic_settings_delete); } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { - mButtonsPref.setButton1Text(R.string.uninstall_text) - .setButton1Icon(R.drawable.ic_settings_delete); + mButtonsPref.setButton2Text(R.string.uninstall_text) + .setButton2Icon(R.drawable.ic_settings_delete); disableable = !mApplicationFeatureProvider.getKeepEnabledPackages() .contains(mAppEntry.info.packageName); } else { - mButtonsPref.setButton1Text(R.string.install_text) - .setButton1Icon(R.drawable.ic_settings_install); + mButtonsPref.setButton2Text(R.string.install_text) + .setButton2Icon(R.drawable.ic_settings_install); disableable = true; } @@ -640,6 +651,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp } } + updateOpenButton(); updateUninstallButton(); updateForceStopButton(); @@ -664,6 +676,11 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp mActivity.unregisterReceiver(mPackageRemovedReceiver); } + private void launchApplication() { + if (mAppLaunchIntent != null) { + mContext.startActivityAsUser(mAppLaunchIntent, new UserHandle(mUserId)); + } + } /** * Changes the status of disable/enable for a package diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java index e40a88553f4..f8dd11bb726 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java @@ -100,9 +100,8 @@ public class AppButtonsPreferenceControllerTest { @Mock private PackageInfo mPackageInfo; - private ActionButtonsPreference mButtonPrefs; - private Intent mUninstallIntent; + private ActionButtonsPreference mButtonPrefs; private AppButtonsPreferenceController mController; @Before @@ -175,6 +174,22 @@ public class AppButtonsPreferenceControllerTest { assertThat(mController.mPackageInfo).isNull(); } + @Test + public void updateOpenButton_noLaunchIntent_buttonShouldBeDisable() { + mController.updateOpenButton(); + + verify(mButtonPrefs).setButton1Visible(false); + } + + @Test + public void updateOpenButton_haveLaunchIntent_buttonShouldBeEnable() { + doReturn(new Intent()).when(mPackageManger).getLaunchIntentForPackage(anyString()); + + mController.updateOpenButton(); + + verify(mButtonPrefs).setButton1Visible(true); + } + @Test public void updateUninstallButton_isSystemApp_handleAsDisableableButton() { doReturn(false).when(mController).handleDisableable(); @@ -183,7 +198,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); verify(mController).handleDisableable(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -221,7 +236,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); verify(mController).handleDisableable(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -230,7 +245,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -240,7 +255,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -249,7 +264,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -259,7 +274,7 @@ public class AppButtonsPreferenceControllerTest { mController.updateUninstallButton(); - verify(mButtonPrefs).setButton1Enabled(false); + verify(mButtonPrefs).setButton2Enabled(false); } @Test @@ -309,7 +324,7 @@ public class AppButtonsPreferenceControllerTest { final boolean controllable = mController.handleDisableable(); - verify(mButtonPrefs).setButton1Text(R.string.uninstall_text); + verify(mButtonPrefs).setButton2Text(R.string.uninstall_text); assertThat(controllable).isFalse(); } @@ -321,7 +336,7 @@ public class AppButtonsPreferenceControllerTest { final boolean controllable = mController.handleDisableable(); - verify(mButtonPrefs).setButton1Text(R.string.uninstall_text); + verify(mButtonPrefs).setButton2Text(R.string.uninstall_text); assertThat(controllable).isTrue(); } @@ -333,7 +348,7 @@ public class AppButtonsPreferenceControllerTest { final boolean controllable = mController.handleDisableable(); - verify(mButtonPrefs).setButton1Text(R.string.install_text); + verify(mButtonPrefs).setButton2Text(R.string.install_text); assertThat(controllable).isTrue(); } @@ -394,11 +409,11 @@ public class AppButtonsPreferenceControllerTest { private ActionButtonsPreference createMock() { final ActionButtonsPreference pref = mock(ActionButtonsPreference.class); - when(pref.setButton1Text(anyInt())).thenReturn(pref); - when(pref.setButton1Icon(anyInt())).thenReturn(pref); - when(pref.setButton1Enabled(anyBoolean())).thenReturn(pref); - when(pref.setButton1Visible(anyBoolean())).thenReturn(pref); - when(pref.setButton1OnClickListener(any(View.OnClickListener.class))).thenReturn(pref); + when(pref.setButton2Text(anyInt())).thenReturn(pref); + when(pref.setButton2Icon(anyInt())).thenReturn(pref); + when(pref.setButton2Enabled(anyBoolean())).thenReturn(pref); + when(pref.setButton2Visible(anyBoolean())).thenReturn(pref); + when(pref.setButton2OnClickListener(any(View.OnClickListener.class))).thenReturn(pref); return pref; }