From 910089a8abead84676944bf0fc17395e08740977 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Fri, 12 Jun 2020 14:58:41 -0700 Subject: [PATCH] Track recents like home for times when it is separated when using 3p launchers, recents is a separate stack. As such we need to make sure that the recents root is provided when asked for just like home is. Bug: 158851728 Test: Using 3p launcher in split-secondary, open recents Change-Id: I90dc6e75a718aa142c870b87bd93081e259acdea --- .../android/server/wm/TaskDisplayArea.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 102c2a6364f4e..10f2aabe1ddee 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; @@ -99,6 +100,9 @@ final class TaskDisplayArea extends DisplayArea { private ActivityStack mRootPinnedTask; private ActivityStack mRootSplitScreenPrimaryTask; + // TODO(b/159029784): Remove when getStack() behavior is cleaned-up + private ActivityStack mRootRecentsTask; + private final ArrayList mTmpAlwaysOnTopStacks = new ArrayList<>(); private final ArrayList mTmpNormalStacks = new ArrayList<>(); private final ArrayList mTmpHomeStacks = new ArrayList<>(); @@ -163,6 +167,8 @@ final class TaskDisplayArea extends DisplayArea { ActivityStack getStack(int windowingMode, int activityType) { if (activityType == ACTIVITY_TYPE_HOME) { return mRootHomeTask; + } else if (activityType == ACTIVITY_TYPE_RECENTS) { + return mRootRecentsTask; } if (windowingMode == WINDOWING_MODE_PINNED) { return mRootPinnedTask; @@ -199,6 +205,10 @@ final class TaskDisplayArea extends DisplayArea { return mRootHomeTask; } + @Nullable ActivityStack getRootRecentsTask() { + return mRootRecentsTask; + } + ActivityStack getRootPinnedTask() { return mRootPinnedTask; } @@ -237,6 +247,16 @@ final class TaskDisplayArea extends DisplayArea { } else { mRootHomeTask = stack; } + } else if (stack.isActivityTypeRecents()) { + if (mRootRecentsTask != null) { + if (!stack.isDescendantOf(mRootRecentsTask)) { + throw new IllegalArgumentException("addStackReferenceIfNeeded: recents stack=" + + mRootRecentsTask + " already exist on display=" + this + + " stack=" + stack); + } + } else { + mRootRecentsTask = stack; + } } if (!stack.isRootTask()) { @@ -264,6 +284,8 @@ final class TaskDisplayArea extends DisplayArea { void removeStackReferenceIfNeeded(ActivityStack stack) { if (stack == mRootHomeTask) { mRootHomeTask = null; + } else if (stack == mRootRecentsTask) { + mRootRecentsTask = null; } else if (stack == mRootPinnedTask) { mRootPinnedTask = null; } else if (stack == mRootSplitScreenPrimaryTask) {