From b5ce37cea56374efa89ede12bc37fc9a474f5e53 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 22 Apr 2020 10:08:28 -0700 Subject: [PATCH] Reset the preferred top focus stack when task visibility changes - The change in visibility of a task does not always trigger a stack order change, which won't trigger the previously set top focus stack to be reset for the next activity launch. Bug: 154658401 Test: Verify we don't regress on b/112084174, and open an activity from a bubbled task Change-Id: I8770448b3ac40c384e8e93ca7ee37f1f8aa80cf4 --- .../com/android/server/wm/ActivityStack.java | 10 ---------- .../core/java/com/android/server/wm/Task.java | 17 +++++++++++++++++ .../com/android/server/wm/TaskDisplayArea.java | 7 +++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index d71381ea0d795..36951caf98a06 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -1010,16 +1010,6 @@ class ActivityStack extends Task { } } - boolean isTopActivityFocusable() { - final ActivityRecord r = topRunningActivity(); - return r != null ? r.isFocusable() - : (isFocusable() && getWindowConfiguration().canReceiveKeys()); - } - - boolean isFocusableAndVisible() { - return isTopActivityFocusable() && shouldBeVisible(null /* starting */); - } - // TODO: Should each user have there own stacks? @Override void switchUser(int userId) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 7d7e6aa0d0a96..3d7d217aa0be6 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3331,6 +3331,16 @@ class Task extends WindowContainer { }); } + boolean isTopActivityFocusable() { + final ActivityRecord r = topRunningActivity(); + return r != null ? r.isFocusable() + : (isFocusable() && getWindowConfiguration().canReceiveKeys()); + } + + boolean isFocusableAndVisible() { + return isTopActivityFocusable() && shouldBeVisible(null /* starting */); + } + void positionChildAtTop(ActivityRecord child) { positionChildAt(child, POSITION_TOP); } @@ -4626,7 +4636,14 @@ class Task extends WindowContainer { if (mForceHiddenFlags == newFlags) { return false; } + final boolean wasHidden = isForceHidden(); mForceHiddenFlags = newFlags; + if (wasHidden && isFocusableAndVisible()) { + // The change in force-hidden state will change visibility without triggering a stack + // order change, so we should reset the preferred top focusable stack to ensure it's not + // used if a new activity is started from this task. + getDisplayArea().resetPreferredTopFocusableStackIfBelow(this); + } return true; } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 3dc672396c299..2b0de9b7f2df1 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -680,6 +680,13 @@ final class TaskDisplayArea extends DisplayArea { onStackOrderChanged(stack); } + void resetPreferredTopFocusableStackIfBelow(Task task) { + if (mPreferredTopFocusableStack != null + && mPreferredTopFocusableStack.compareTo(task) < 0) { + mPreferredTopFocusableStack = null; + } + } + void positionStackAt(int position, ActivityStack child, boolean includingParents) { positionChildAt(position, child, includingParents); mDisplayContent.layoutAndAssignWindowLayersIfNeeded();