Remove Settings from recents after app uninstall

SettingsActivity now calls finishAndRemoveTask
instead of only finish() to prevent blank
recent task from showing in overview.

Test: Visually inspected bug doesn't exist. Wrote
Roboelectric tests

Fixes: 129733119

Change-Id: I5b73c1b611e6eb52bb6665c215276efdc85c19b2
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3b01b32..b822a83 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -16,6 +16,8 @@
 
 package com.android.settings;
 
+import static com.android.settings.applications.appinfo.AppButtonsPreferenceController.KEY_REMOVE_TASK_WHEN_FINISHING;
+
 import android.app.ActionBar;
 import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
@@ -542,7 +544,12 @@
      */
     public void finishPreferencePanel(int resultCode, Intent resultData) {
         setResult(resultCode, resultData);
-        finish();
+        if (resultData != null &&
+                resultData.getBooleanExtra(KEY_REMOVE_TASK_WHEN_FINISHING, false)) {
+            finishAndRemoveTask();
+        } else {
+            finish();
+        }
     }
 
     /**
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index e15b0e3..1676829 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -80,6 +80,7 @@
         PreferenceControllerMixin, LifecycleObserver, OnResume, OnDestroy,
         ApplicationsState.Callbacks {
     public static final String APP_CHG = "chg";
+    public static final String KEY_REMOVE_TASK_WHEN_FINISHING = "remove_task_when_finishing";
 
     private static final String TAG = "AppButtonsPrefCtl";
     private static final String KEY_ACTION_BUTTONS = "action_buttons";
@@ -196,7 +197,7 @@
                     mActivity, UserManager.DISALLOW_APPS_CONTROL, mUserId);
 
             if (!refreshUi()) {
-                setIntentAndFinish(true);
+                setIntentAndFinish(true, false);
             }
         }
     }
@@ -278,9 +279,9 @@
                 AsyncTask.execute(new DisableChangerRunnable(mPm, mAppEntry.info.packageName,
                         PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER));
             }
-            refreshAndFinishIfPossible();
+            refreshAndFinishIfPossible(true);
         } else if (requestCode == mRequestRemoveDeviceAdmin) {
-            refreshAndFinishIfPossible();
+            refreshAndFinishIfPossible(false);
         }
     }
 
@@ -466,19 +467,20 @@
     /**
      * Finish this fragment and return data if possible
      */
-    private void setIntentAndFinish(boolean appChanged) {
+    private void setIntentAndFinish(boolean appChanged, boolean removeTaskWhenFinishing) {
         if (LOCAL_LOGV) {
             Log.i(TAG, "appChanged=" + appChanged);
         }
         Intent intent = new Intent();
         intent.putExtra(APP_CHG, appChanged);
+        intent.putExtra(KEY_REMOVE_TASK_WHEN_FINISHING, removeTaskWhenFinishing);
         mActivity.finishPreferencePanel(Activity.RESULT_OK, intent);
         mFinishing = true;
     }
 
-    private void refreshAndFinishIfPossible() {
+    private void refreshAndFinishIfPossible(boolean removeTaskWhenFinishing) {
         if (!refreshUi()) {
-            setIntentAndFinish(true);
+            setIntentAndFinish(true, removeTaskWhenFinishing);
         } else {
             startListeningToPackageRemove();
         }
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 e42c3d2..eee2da7 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.applications.appinfo;
 
+import static com.android.settings.applications.appinfo.AppButtonsPreferenceController.KEY_REMOVE_TASK_WHEN_FINISHING;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -450,6 +452,30 @@
                 AppButtonsPreferenceController.DISABLED_FOR_USER);
     }
 
+    @Test
+    public void handleActivityResult_onAppUninstall_removeTask() {
+        mController.handleActivityResult(REQUEST_UNINSTALL, 0, new Intent());
+
+        ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mSettingsActivity).finishPreferencePanel(anyInt(), argumentCaptor.capture());
+
+        final Intent i = argumentCaptor.getValue();
+        assertThat(i).isNotNull();
+        assertThat(i.getBooleanExtra(KEY_REMOVE_TASK_WHEN_FINISHING, false)).isTrue();
+    }
+
+    @Test
+    public void handleActivityResult_onAppNotUninstall_persistTask() {
+        mController.handleActivityResult(REQUEST_UNINSTALL + 1, 0, new Intent());
+
+        ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mSettingsActivity).finishPreferencePanel(anyInt(), argumentCaptor.capture());
+
+        final Intent i = argumentCaptor.getValue();
+        assertThat(i).isNotNull();
+        assertThat(i.getBooleanExtra(KEY_REMOVE_TASK_WHEN_FINISHING, false)).isFalse();
+    }
+
     /**
      * The test fragment which implements
      * {@link ButtonActionDialogFragment.AppButtonsDialogListener}