diff options
4 files changed, 23 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 9f16a8441533..3ac655ad5ebb 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8294,6 +8294,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } mIsAspectRatioApplied = false; + mIsEligibleForFixedOrientationLetterbox = false; + mLetterboxBoundsForFixedOrientationAndAspectRatio = null; // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be // different from windowing mode of the task (PiP) during transition from fullscreen to PiP @@ -8303,8 +8305,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean isFixedOrientationLetterboxAllowed = parentWindowingMode == WINDOWING_MODE_MULTI_WINDOW || parentWindowingMode == WINDOWING_MODE_FULLSCREEN - // Switching from PiP to fullscreen. - || (parentWindowingMode == WINDOWING_MODE_PINNED + // When starting to switch between PiP and fullscreen, the task is pinned + // and the activity is fullscreen. But only allow to apply letterbox if the + // activity is exiting PiP because an entered PiP should fill the task. + || (!mWaitForEnteringPinnedMode + && parentWindowingMode == WINDOWING_MODE_PINNED && resolvedConfig.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); // TODO(b/181207944): Consider removing the if condition and always run @@ -8698,8 +8703,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * in this method. */ private void resolveFixedOrientationConfiguration(@NonNull Configuration newParentConfig) { - mLetterboxBoundsForFixedOrientationAndAspectRatio = null; - mIsEligibleForFixedOrientationLetterbox = false; final Rect parentBounds = newParentConfig.windowConfiguration.getBounds(); final Rect stableBounds = new Rect(); // If orientation is respected when insets are applied, then stableBounds will be empty. diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index bc7fa31125f9..b544196cda8d 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2013,7 +2013,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // from doing work and changing the activity visuals while animating // TODO(task-org): Figure-out more structured way to do this long term. r.setWindowingMode(r.getWindowingMode()); - r.mWaitForEnteringPinnedMode = true; final TaskFragment organizedTf = r.getOrganizedTaskFragment(); final boolean singleActivity = task.getNonFinishingActivityCount() == 1; @@ -2140,6 +2139,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } rootTask.setDeferTaskAppear(false); + // After setting this, it is not expected to change activity configuration until the + // transition animation is finished. So the activity can keep consistent appearance + // when animating. + r.mWaitForEnteringPinnedMode = true; // Reset the state that indicates it can enter PiP while pausing after we've moved it // to the root pinned task r.supportsEnterPipOnTaskSwitch = false; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 8f49384f6101..b899b4f58106 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3883,15 +3883,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } /** - * @return {@code true} if activity bounds are letterboxed or letterboxed for display cutout. - * Note that it's always {@code false} if the activity is in pip mode. + * Returns {@code true} if activity bounds are letterboxed or letterboxed for display cutout. * * <p>Note that letterbox UI may not be shown even when this returns {@code true}. See {@link * LetterboxUiController#shouldShowLetterboxUi} for more context. */ boolean areAppWindowBoundsLetterboxed() { return mActivityRecord != null - && !mActivityRecord.inPinnedWindowingMode() && (mActivityRecord.areBoundsLetterboxed() || isLetterboxedForDisplayCutout()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index d173ce9d522a..3bc6450ae591 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -337,6 +337,17 @@ public class RootWindowContainerTests extends WindowTestsBase { // Ensure a task has moved over. ensureTaskPlacement(task, activity); assertTrue(task.inPinnedWindowingMode()); + + // The activity with fixed orientation should not apply letterbox when entering PiP. + final int requestedOrientation = task.getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT + ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT; + doReturn(requestedOrientation).when(activity).getRequestedConfigurationOrientation(); + doReturn(false).when(activity).handlesOrientationChangeFromDescendant(anyInt()); + final Rect bounds = new Rect(task.getBounds()); + bounds.scale(0.5f); + task.setBounds(bounds); + assertFalse(activity.isLetterboxedForFixedOrientationAndAspectRatio()); } /** |