From 0cadae1c718e5e448f70b459cbafb0aa5a63504a Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 3 May 2021 14:51:24 +0800 Subject: [PATCH] Avoid intermediate orientation change The onDescendantOrientationChanged in Task was used for reporting requested orientation takes affect after display windowing mode is changed. But when calling WMS#setWindowingMode, it will call DC#reconfigureDisplayLocked that also updates orientation from display so the task orientation can still propagate to display. So just remove the invocation of onDescendantOrientationChanged from task's config change. That prevents from reporting intermediate orientation change when re-parenting multiple tasks from multi-window to fullscreen. Bug: 186657559 Test: TaskTests#testTaskOrientationOnDisplayWindowingModeChange Change-Id: Ie722a4384829c2dab4ee4c35de6ffbbb4a0e4655 --- .../core/java/com/android/server/wm/Task.java | 6 ------ .../src/com/android/server/wm/TaskTests.java | 15 ++++++++------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9fad7daa7212e..7ffc65ab342b3 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2240,7 +2240,6 @@ class Task extends WindowContainer { mTmpPrevBounds.set(getBounds()); final boolean wasInMultiWindowMode = inMultiWindowMode(); final boolean wasInPictureInPicture = inPinnedWindowingMode(); - final int oldOrientation = getOrientation(); super.onConfigurationChanged(newParentConfig); // Only need to update surface size here since the super method will handle updating // surface position. @@ -2283,11 +2282,6 @@ class Task extends WindowContainer { mForceNotOrganized = false; } - // Report orientation change such as changing from freeform to fullscreen. - if (oldOrientation != getOrientation()) { - onDescendantOrientationChanged(this); - } - saveLaunchingStateIfNeeded(); final boolean taskOrgChanged = updateTaskOrganizerState(false /* forceUpdate */); if (taskOrgChanged) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 2389d2d6e8d64..f2767470c6516 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -62,7 +62,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; import android.app.ActivityManager; import android.app.TaskInfo; @@ -1322,20 +1321,22 @@ public class TaskTests extends WindowTestsBase { } @Test - public void testNotifyOrientationChangeCausedByConfigurationChange() { + public void testTaskOrientationOnDisplayWindowingModeChange() { + // Skip unnecessary operations to speed up the test. + mAtm.deferWindowLayout(); final Task task = getTestTask(); final ActivityRecord activity = task.getTopMostActivity(); final DisplayContent display = task.getDisplayContent(); - display.setWindowingMode(WINDOWING_MODE_FREEFORM); + mWm.setWindowingMode(display.mDisplayId, WINDOWING_MODE_FREEFORM); activity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE); assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation()); - verify(display).onDescendantOrientationChanged(same(task)); - reset(display); + assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, display.getLastOrientation()); - display.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + mWm.setWindowingMode(display.mDisplayId, WINDOWING_MODE_FULLSCREEN); assertEquals(SCREEN_ORIENTATION_LANDSCAPE, task.getOrientation()); - verify(display).onDescendantOrientationChanged(same(task)); + assertEquals(SCREEN_ORIENTATION_LANDSCAPE, display.getLastOrientation()); + assertEquals(Configuration.ORIENTATION_LANDSCAPE, display.getConfiguration().orientation); } private Task getTestTask() {