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();