From 161c35950813c24f3c5b912e2c4fa8df04d0f440 Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Mon, 8 Jul 2019 17:59:35 +0800 Subject: [PATCH] Fix app uninstalling/stopping possible in screen pinning mode Bug: 135604684 Test: maunal & robotest Change-Id: I96eddb11ff32c6c46915682eb58857be7d24ed99 --- .../appinfo/AppInfoDashboardFragment.java | 32 ++++++++++++++++--- .../appinfo/AppInfoDashboardFragmentTest.java | 21 +++++++++--- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index 8274634a01f..07925f687a5 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Activity; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; @@ -182,6 +183,10 @@ public class AppInfoDashboardFragment extends DashboardFragment super.onCreate(icicle); mFinishing = false; final Activity activity = getActivity(); + if (isLockTaskModePinned(activity)) { + finishActivity(activity); + return; + } mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); mPm = activity.getPackageManager(); @@ -192,7 +197,6 @@ public class AppInfoDashboardFragment extends DashboardFragment return; } startListeningToPackageRemove(); - setHasOptionsMenu(true); } @@ -314,9 +318,8 @@ public class AppInfoDashboardFragment extends DashboardFragment @VisibleForTesting boolean ensurePackageInfoAvailable(Activity activity) { if (mPackageInfo == null) { - mFinishing = true; Log.w(TAG, "Package info not available. Is this package already uninstalled?"); - activity.finishAndRemoveTask(); + finishActivity(activity); return false; } return true; @@ -331,14 +334,28 @@ public class AppInfoDashboardFragment extends DashboardFragment @VisibleForTesting boolean ensureDisplayableModule(Activity activity) { if (AppUtils.isHiddenSystemModule(activity.getApplicationContext(), mPackageName)) { - mFinishing = true; Log.w(TAG, "Package is hidden module, exiting: " + mPackageName); - activity.finishAndRemoveTask(); + finishActivity(activity); return false; } return true; } + /** + * Check the state of device lock task mode. + * + * @return true if the device lock task mode pinned. + */ + @VisibleForTesting + boolean isLockTaskModePinned(Activity activity) { + ActivityManager activityManager = activity.getSystemService(ActivityManager.class); + if (activityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED) { + Log.w(TAG, "Device lock task mode pinned."); + return true; + } + return false; + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); @@ -637,6 +654,11 @@ public class AppInfoDashboardFragment extends DashboardFragment getContext().unregisterReceiver(mPackageRemovedReceiver); } + private void finishActivity(Activity activity) { + mFinishing = true; + activity.finishAndRemoveTask(); + } + @VisibleForTesting final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() { @Override diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java index e46cd06afe6..01304eafe84 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java @@ -33,6 +33,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; @@ -86,6 +87,8 @@ public final class AppInfoDashboardFragmentTest { private DevicePolicyManager mDevicePolicyManager; @Mock private PackageManager mPackageManager; + @Mock + private ActivityManager mActivityManager; private AppInfoDashboardFragment mFragment; private Context mShadowContext; @@ -93,11 +96,13 @@ public final class AppInfoDashboardFragmentTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mShadowContext = RuntimeEnvironment.application; + mShadowContext = spy(RuntimeEnvironment.application); mFragment = spy(new AppInfoDashboardFragment()); doReturn(mActivity).when(mFragment).getActivity(); doReturn(mShadowContext).when(mFragment).getContext(); doReturn(mPackageManager).when(mActivity).getPackageManager(); + doReturn(mShadowContext).when(mActivity).getApplicationContext(); + doReturn(mActivityManager).when(mActivity).getSystemService(ActivityManager.class); when(mUserManager.isAdminUser()).thenReturn(true); ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); @@ -202,7 +207,6 @@ public final class AppInfoDashboardFragmentTest { ShadowAppUtils.addHiddenModule(PACKAGE_NAME); ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME); - assertThat(mFragment.ensureDisplayableModule(mActivity)).isFalse(); } @@ -214,6 +218,14 @@ public final class AppInfoDashboardFragmentTest { assertThat(mFragment.ensureDisplayableModule(mActivity)).isTrue(); } + @Test + public void isLockTaskModePinned_pinned_shouldReturnTrue() { + doReturn(ActivityManager.LOCK_TASK_MODE_PINNED).when( + mActivityManager).getLockTaskModeState(); + + assertThat(mFragment.isLockTaskModePinned(mActivity)).isTrue(); + } + @Test public void createPreference_hasNoPackageInfo_shouldSkip() { ReflectionHelpers.setField(mFragment, "mPackageInfo", null); @@ -267,9 +279,8 @@ public final class AppInfoDashboardFragmentTest { public void onActivityResult_uninstalledUpdates_shouldInvalidateOptionsMenu() { doReturn(true).when(mFragment).refreshUi(); - mFragment - .onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0, - mock(Intent.class)); + mFragment.onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0, + mock(Intent.class)); verify(mActivity).invalidateOptionsMenu(); }