From 08f79506ae1a19ffa60ff69a868d6c3ee5aac846 Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Tue, 11 Jun 2024 08:30:55 +0000 Subject: Don't return half folded state when display in transition When unfolding device, device returns true for tabletop for a split second. Tabletop has different default letterbox position multiplier (top). When device is fully unfolded, tabletop position is false and if position multiplier returns bottom/middle, app will flicker from top to final position. Flag: EXEMPT bugfix Fix: 345735235 Test: Unfold with landscape app Open YT in tabletop atest SizeCompatTests Change-Id: Iefaf6e2422e9c38fff7c3a931d94e94061bb5dd2 --- .../android/server/wm/LetterboxUiController.java | 4 ++- .../src/com/android/server/wm/SizeCompatTests.java | 29 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 5e93e8930bab..864ac6582ece 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -871,12 +871,14 @@ final class LetterboxUiController { // Check if we are in the given pose and in fullscreen mode. // Note that we check the task rather than the parent as with ActivityEmbedding the parent might // be a TaskFragment, and its windowing mode is always MULTI_WINDOW, even if the task is - // actually fullscreen. + // actually fullscreen. If display is still in transition e.g. unfolding, don't return true + // for HALF_FOLDED state or app will flicker. private boolean isDisplayFullScreenAndInPosture(boolean isTabletop) { Task task = mActivityRecord.getTask(); return mActivityRecord.mDisplayContent != null && task != null && mActivityRecord.mDisplayContent.getDisplayRotation().isDeviceInPosture( DeviceStateController.DeviceState.HALF_FOLDED, isTabletop) + && !mActivityRecord.mDisplayContent.inTransition() && task.getWindowingMode() == WINDOWING_MODE_FULLSCREEN; } diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 1a366b3e3a4f..ac1aa20b322f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -4120,6 +4120,35 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(letterboxNoFold, mActivity.getBounds()); } + @Test + public void testUpdateResolvedBoundsVerticalPosition_unfoldDisplay_notTabletop() { + // Set up a display in portrait with a fixed-orientation LANDSCAPE app. + setUpDisplaySizeWithApp(1000, 2000); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + mActivity.mWmService.mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier( + 1.0f /*letterboxVerticalPositionMultiplier*/); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); + + // Make the activity full-screen. + mTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + + // Simulate display unfolding. + setFoldablePosture(true /* isHalfFolded */, true /* isTabletop */); + doReturn(true).when(mActivity.mDisplayContent).inTransition(); + resizeDisplay(mTask.mDisplayContent, 1400, 2800); + + // Make sure app doesn't jump to top (default tabletop position) when unfolding. + assertEquals(1.0f, mActivity.mLetterboxUiController.getVerticalPositionMultiplier( + mActivity.getParent().getConfiguration()), 0); + + // Simulate display fully open after unfolding. + setFoldablePosture(false /* isHalfFolded */, false /* isTabletop */); + doReturn(false).when(mActivity.mDisplayContent).inTransition(); + + assertEquals(1.0f, mActivity.mLetterboxUiController.getVerticalPositionMultiplier( + mActivity.getParent().getConfiguration()), 0); + } + @Test public void testGetFixedOrientationLetterboxAspectRatio_tabletop_centered() { // Set up a display in portrait with a fixed-orientation LANDSCAPE app -- cgit v1.2.3-59-g8ed1b