Fix app uninstalling/stopping possible in screen pinning mode
Bug: 135604684
Test: maunal & robotest
Change-Id: I96eddb11ff32c6c46915682eb58857be7d24ed99
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 8274634..07925f6 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -19,6 +19,7 @@
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 @@
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 @@
return;
}
startListeningToPackageRemove();
-
setHasOptionsMenu(true);
}
@@ -314,9 +318,8 @@
@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 @@
@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 @@
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 e46cd06..01304ea 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.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 @@
private DevicePolicyManager mDevicePolicyManager;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private ActivityManager mActivityManager;
private AppInfoDashboardFragment mFragment;
private Context mShadowContext;
@@ -93,11 +96,13 @@
@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 @@
ShadowAppUtils.addHiddenModule(PACKAGE_NAME);
ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME);
-
assertThat(mFragment.ensureDisplayableModule(mActivity)).isFalse();
}
@@ -215,6 +219,14 @@
}
@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 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();
}