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}