Clear "restore" mode when setting windowing mode
Whenever Task#setWindowingMode is called,
mMultiwindowRestoreWindowingMode is cleared.
Activity#requestMultiwindowFullscreen will now set the task's
mMultiwindowRestoreWindowingMode after setting the new windowing mode
when requesting to enter freefrom. That way, the request fullscreen api
can only restore the windowing mode if no windowing mode change occurs
between the time a task requests to enter and exit fullscreen.
Bug: 331649648
Test: Enter fullscreen using api, exit and re-enter fullscreen using the
caption handle, attemt to exit fullscreen using the api. App should stay
in fullscreen.
Change-Id: Ia379d8dc4b9a57352a35b0504815a88f1c9fdbd6
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index 981c4c0..fe4522a 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -1254,14 +1254,16 @@
private static void executeMultiWindowFullscreenRequest(int fullscreenRequest, Task requester) {
final int targetWindowingMode;
if (fullscreenRequest == FULLSCREEN_MODE_REQUEST_ENTER) {
- requester.mMultiWindowRestoreWindowingMode =
- requester.getRequestedOverrideWindowingMode();
+ final int restoreWindowingMode = requester.getRequestedOverrideWindowingMode();
targetWindowingMode = WINDOWING_MODE_FULLSCREEN;
+ requester.setWindowingMode(targetWindowingMode);
+ // The restore windowing mode must be set after the windowing mode is set since
+ // Task#setWindowingMode resets the restore windowing mode to WINDOWING_MODE_INVALID.
+ requester.mMultiWindowRestoreWindowingMode = restoreWindowingMode;
} else {
targetWindowingMode = requester.mMultiWindowRestoreWindowingMode;
- requester.mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+ requester.setWindowingMode(targetWindowingMode);
}
- requester.setWindowingMode(targetWindowingMode);
if (targetWindowingMode == WINDOWING_MODE_FULLSCREEN) {
requester.setBounds(null);
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 6f1c834..bb90790 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4681,9 +4681,10 @@
@Override
public void setWindowingMode(int windowingMode) {
- // Calling Task#setWindowingMode() for leaf task since this is the a specialization of
+ // Calling Task#setWindowingMode() for leaf task since this is a specialization of
// {@link #setWindowingMode(int)} for root task.
if (!isRootTask()) {
+ mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
super.setWindowingMode(windowingMode);
return;
}
@@ -4727,6 +4728,9 @@
return;
}
+ // Reset multi-window restore windowing mode.
+ mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+
final ActivityRecord topActivity = getTopNonFinishingActivity();
// For now, assume that the root task's windowing mode is what will actually be used