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();
     }