diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 1cb4684b718ee..db5e97250cd2b 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 8903609ddaeda..44a8daaba1b14 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3334,6 +3334,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); } @@ -4552,7 +4562,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 75295e6d248e9..0a1ee2b79711c 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();