Defer ensuring visibility on enter/exit split-screen
Windowing mode changes also ensure activity visibility and config
after the change, so recursive calls may do this too early and
cause redundant configuration change/relaunch messages sent to
client.
For example, when a fullscreen non-resizeable activity is launched
when split-screen stack is active, then split-screen stacks are
also becoming fullscreen and get a new configuration. But this
shouldn't happen because they are about to be occluded by the newly
launched activity.
Bug: 74375006
Test: ActivityLifecycleTests
Change-Id: I6b701fba40f9b66873d0ec12201b4e8c5fd3ffa6
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index fac3f92..0f42103 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -420,7 +420,9 @@
if (!otherStack.inSplitScreenSecondaryWindowingMode()) {
continue;
}
- otherStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ otherStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN, false /* animate */,
+ false /* showRecents */, false /* enteringSplitScreenMode */,
+ true /* deferEnsuringVisibility */);
}
} finally {
final ActivityStack topFullscreenStack =
@@ -450,7 +452,7 @@
}
otherStack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
false /* animate */, false /* showRecents */,
- true /* enteringSplitScreenMode */);
+ true /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */);
}
} finally {
mSupervisor.mWindowManager.continueSurfaceLayout();
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 137e6ab..7552749 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -11253,7 +11253,7 @@
stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task);
}
stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents,
- false /* enteringSplitScreenMode */);
+ false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */);
return windowingMode != task.getWindowingMode();
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 9fb3e11..e86850e 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -515,11 +515,11 @@
@Override
public void setWindowingMode(int windowingMode) {
setWindowingMode(windowingMode, false /* animate */, false /* showRecents */,
- false /* enteringSplitScreenMode */);
+ false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */);
}
void setWindowingMode(int preferredWindowingMode, boolean animate, boolean showRecents,
- boolean enteringSplitScreenMode) {
+ boolean enteringSplitScreenMode, boolean deferEnsuringVisibility) {
final boolean creating = mWindowContainerController == null;
final int currentMode = getWindowingMode();
final ActivityDisplay display = getDisplay();
@@ -555,7 +555,9 @@
// doesn't support split-screen mode, go ahead an dismiss split-screen and display a
// warning toast about it.
mService.mTaskChangeNotificationController.notifyActivityDismissingDockedStack();
- display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN,
+ false /* animate */, false /* showRecents */,
+ false /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */);
}
}
@@ -646,9 +648,7 @@
wm.continueSurfaceLayout();
}
- // Don't ensure visible activities if the windowing mode change was a side effect of us
- // entering split-screen mode.
- if (!enteringSplitScreenMode) {
+ if (!deferEnsuringVisibility) {
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
mStackSupervisor.resumeFocusedStackTopActivityLocked();
}