From 0e2aa7a264ea91b2c4f8095efe70d081613df4a9 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 17 May 2018 14:32:48 -0700 Subject: [PATCH] Only remove task if it was uninstalled or removed from the recents list - Was missing additional checks and unconditionally removing the task whenever the task was removed from the active tasks in AM. Instead, check that the app still exists both in the system and in the recents list before removing. Bug: 79698015 Test: a) get incoming call, go to overview, end call and ensure removed b) install app, open app, go to overview, uninstall app and ensure removed Change-Id: I8901cb232ef7ff0759923d6a98f65df4e4adf88b --- .../android/quickstep/views/RecentsView.java | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 01e5cba373..aeff4765a3 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -39,6 +39,8 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Handler; +import android.os.UserHandle; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -78,6 +80,8 @@ import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.TaskStack; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.BackgroundExecutor; +import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; @@ -166,10 +170,38 @@ public abstract class RecentsView extends PagedView impl if (!mHandleTaskStackChanges) { return; } - TaskView taskView = getTaskView(taskId); - if (taskView != null) { - dismissTask(taskView, true /* animate */, false /* removeTask */); - } + BackgroundExecutor.get().submit(() -> { + TaskView taskView = getTaskView(taskId); + if (taskView == null) { + return; + } + Handler handler = taskView.getHandler(); + if (handler == null) { + return; + } + + // TODO: Add callbacks from AM reflecting adding/removing from the recents list, and + // remove all these checks + Task.TaskKey taskKey = taskView.getTask().key; + if (PackageManagerWrapper.getInstance().getActivityInfo(taskKey.getComponent(), + taskKey.userId) == null) { + // The package was uninstalled + handler.post(() -> + dismissTask(taskView, true /* animate */, false /* removeTask */)); + } else { + RecentsTaskLoadPlan loadPlan = new RecentsTaskLoadPlan(getContext()); + RecentsTaskLoadPlan.PreloadOptions opts = + new RecentsTaskLoadPlan.PreloadOptions(); + opts.loadTitles = false; + loadPlan.preloadPlan(opts, mModel.getRecentsTaskLoader(), -1, + UserHandle.myUserId()); + if (loadPlan.getTaskStack().findTaskWithId(taskId) == null) { + // The task was removed from the recents list + handler.post(() -> + dismissTask(taskView, true /* animate */, false /* removeTask */)); + } + } + }); } @Override