Don't allow focus on activity in minimized split-screen.
Return false for ActivityRecord.isFocusable() for activities in minimized
split-screen since their windows can't be focused or interacted with.
Also, move focus off split-screen primary stack when we enter minimize
mode.
Change-Id: Iecec5d55123f1c3530c461314fa69498575ef5c3
Fixes: 74404706
Fixes: 74837107
Fixes: 74919175
Test: Put an app in split-screen, launch it from launch again, and observe ANR.
Test: atest ActivityManagerAppConfigurationTests#testDialogWhenLargeSplitSmall
Test: atest ActivityManagerSplitScreenTests#testNoUserLeaveHintOnMultiWindowModeChanged
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 8c49472..68c47d5 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -1193,6 +1193,9 @@
}
boolean isFocusable() {
+ if (inSplitScreenPrimaryWindowingMode() && mStackSupervisor.mIsDockMinimized) {
+ return false;
+ }
return getWindowConfiguration().canReceiveKeys() || isAlwaysFocusable();
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 2c4eac0..1223632 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -3416,7 +3416,7 @@
}
/** Find next proper focusable stack and make it focused. */
- private boolean adjustFocusToNextFocusableStack(String reason) {
+ boolean adjustFocusToNextFocusableStack(String reason) {
return adjustFocusToNextFocusableStack(reason, false /* allowFocusSelf */);
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index efc0d7d..be826f7 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2455,19 +2455,20 @@
if (currentWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
&& candidate == null && stack.inSplitScreenPrimaryWindowingMode()) {
- // If the currently focused stack is in split-screen secondary we would prefer
- // the focus to move to another split-screen secondary stack or fullscreen stack
- // over the primary split screen stack to avoid:
- // - Moving the focus to the primary split-screen stack when it can't be focused
- // because it will be minimized, but AM doesn't know that yet
- // - primary split-screen stack overlapping with a fullscreen stack when a
- // fullscreen stack is higher in z than the next split-screen stack. Assistant
- // stack, I am looking at you...
+ // If the currently focused stack is in split-screen secondary we save off the
+ // top primary split-screen stack as a candidate for focus because we might
+ // prefer focus to move to an other stack to avoid primary split-screen stack
+ // overlapping with a fullscreen stack when a fullscreen stack is higher in z
+ // than the next split-screen stack. Assistant stack, I am looking at you...
// We only move the focus to the primary-split screen stack if there isn't a
// better alternative.
candidate = stack;
continue;
}
+ if (candidate != null && stack.inSplitScreenSecondaryWindowingMode()) {
+ // Use the candidate stack since we are now at the secondary split-screen.
+ return candidate;
+ }
return stack;
}
}
@@ -4413,6 +4414,14 @@
void setDockedStackMinimized(boolean minimized) {
mIsDockMinimized = minimized;
+ if (mIsDockMinimized) {
+ final ActivityStack current = getFocusedStack();
+ if (current.inSplitScreenPrimaryWindowingMode()) {
+ // The primary split-screen stack can't be focused while it is minimize, so move
+ // focus to something else.
+ current.adjustFocusToNextFocusableStack("setDockedStackMinimized");
+ }
+ }
}
void wakeUp(String reason) {