Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f191c7ef authored by Pablo Gamito's avatar Pablo Gamito Committed by Automerger Merge Worker
Browse files

Merge "Prevent flicker on orientation change while starting" into tm-qpr-dev...

Merge "Prevent flicker on orientation change while starting" into tm-qpr-dev am: ceebff75 am: 9a283c1e am: 33a3e413

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22335688



Change-Id: I4bd6c2e99becffdec05b3b9c85c00d46c45a736e
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents dd91b0e7 33a3e413
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4068,7 +4068,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    }

    void finishRelaunching() {
        mLetterboxUiController.setRelauchingAfterRequestedOrientationChanged(false);
        mLetterboxUiController.setRelaunchingAfterRequestedOrientationChanged(false);
        mTaskSupervisor.getActivityMetricsLogger().notifyActivityRelaunched(this);

        if (mPendingRelaunchCount > 0) {
@@ -9500,7 +9500,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
                mRelaunchReason = RELAUNCH_REASON_NONE;
            }
            if (isRequestedOrientationChanged) {
                mLetterboxUiController.setRelauchingAfterRequestedOrientationChanged(true);
                mLetterboxUiController.setRelaunchingAfterRequestedOrientationChanged(true);
            }
            if (mState == PAUSING) {
                // A little annoying: we are waiting for this activity to finish pausing. Let's not
+27 −5
Original line number Diff line number Diff line
@@ -237,7 +237,9 @@ final class LetterboxUiController {
    @Nullable
    private final Boolean mBooleanPropertyFakeFocus;

    private boolean mIsRelauchingAfterRequestedOrientationChanged;
    private boolean mIsRelaunchingAfterRequestedOrientationChanged;

    private boolean mLastShouldShowLetterboxUi;

    private boolean mDoubleTapEvent;

@@ -387,7 +389,7 @@ final class LetterboxUiController {
                        ::isPolicyForIgnoringRequestedOrientationEnabled,
                mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled,
                mBooleanPropertyIgnoreRequestedOrientation)) {
            if (mIsRelauchingAfterRequestedOrientationChanged) {
            if (mIsRelaunchingAfterRequestedOrientationChanged) {
                Slog.w(TAG, "Ignoring orientation update to "
                        + screenOrientationToString(requestedOrientation)
                        + " due to relaunching after setRequestedOrientation for "
@@ -476,8 +478,8 @@ final class LetterboxUiController {
     * Sets whether an activity is relaunching after the app has called {@link
     * android.app.Activity#setRequestedOrientation}.
     */
    void setRelauchingAfterRequestedOrientationChanged(boolean isRelaunching) {
        mIsRelauchingAfterRequestedOrientationChanged = isRelaunching;
    void setRelaunchingAfterRequestedOrientationChanged(boolean isRelaunching) {
        mIsRelaunchingAfterRequestedOrientationChanged = isRelaunching;
    }

    /**
@@ -1154,12 +1156,28 @@ final class LetterboxUiController {

    @VisibleForTesting
    boolean shouldShowLetterboxUi(WindowState mainWindow) {
        return (mActivityRecord.isInLetterboxAnimation() || isSurfaceVisible(mainWindow))
        if (mIsRelaunchingAfterRequestedOrientationChanged || !isSurfaceReadyToShow(mainWindow)) {
            return mLastShouldShowLetterboxUi;
        }

        final boolean shouldShowLetterboxUi =
                (mActivityRecord.isInLetterboxAnimation() || isSurfaceVisible(mainWindow))
                && mainWindow.areAppWindowBoundsLetterboxed()
                // Check for FLAG_SHOW_WALLPAPER explicitly instead of using
                // WindowContainer#showWallpaper because the later will return true when this
                // activity is using blurred wallpaper for letterbox background.
                && (mainWindow.getAttrs().flags & FLAG_SHOW_WALLPAPER) == 0;

        mLastShouldShowLetterboxUi = shouldShowLetterboxUi;

        return shouldShowLetterboxUi;
    }

    @VisibleForTesting
    boolean isSurfaceReadyToShow(WindowState mainWindow) {
        return mainWindow.isDrawn() // Regular case
                // Waiting for relayoutWindow to call preserveSurface
                || mainWindow.isDragResizeChanged();
    }

    @VisibleForTesting
@@ -1297,6 +1315,10 @@ final class LetterboxUiController {
        return null;
    }

    boolean getIsRelaunchingAfterRequestedOrientationChanged() {
        return mIsRelaunchingAfterRequestedOrientationChanged;
    }

    private void adjustBoundsForTaskbar(final WindowState mainWindow, final Rect bounds) {
        // Rounded corners should be displayed above the taskbar. When taskbar is hidden,
        // an insets frame is equal to a navigation bar which shouldn't affect position of
+11 −2
Original line number Diff line number Diff line
@@ -5230,8 +5230,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            if (surfaceInsetsChanged) {
                mLastSurfaceInsets.set(mAttrs.surfaceInsets);
            }
            if (surfaceSizeChanged && mWinAnimator.getShown() && !canPlayMoveAnimation()
                    && okToDisplay() && mSyncState == SYNC_STATE_NONE) {
            final boolean surfaceResizedWithoutMoveAnimation = surfaceSizeChanged
                    && mWinAnimator.getShown() && !canPlayMoveAnimation() && okToDisplay()
                    && mSyncState == SYNC_STATE_NONE;
            final ActivityRecord activityRecord = getActivityRecord();
            // If this window belongs to an activity that is relaunching due to an orientation
            // change then delay the position update until it has redrawn to avoid any flickers.
            final boolean isLetterboxedAndRelaunching = activityRecord != null
                    && activityRecord.areBoundsLetterboxed()
                    && activityRecord.mLetterboxUiController
                        .getIsRelaunchingAfterRequestedOrientationChanged();
            if (surfaceResizedWithoutMoveAnimation || isLetterboxedAndRelaunching) {
                applyWithNextDraw(mSetSurfacePositionConsumer);
            } else {
                mSetSurfacePositionConsumer.accept(t);
+2 −2
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase {
        mActivity = setUpActivityWithComponent();
        mController = new LetterboxUiController(mWm, mActivity);
        prepareActivityThatShouldIgnoreRequestedOrientationDuringRelaunch();
        mController.setRelauchingAfterRequestedOrientationChanged(false);
        mController.setRelaunchingAfterRequestedOrientationChanged(false);

        spyOn(mDisplayContent.mDisplayRotationCompatPolicy);
        doReturn(true).when(mDisplayContent.mDisplayRotationCompatPolicy)
@@ -870,7 +870,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase {
    private void prepareActivityThatShouldIgnoreRequestedOrientationDuringRelaunch() {
        doReturn(true).when(mLetterboxConfiguration)
                .isPolicyForIgnoringRequestedOrientationEnabled();
        mController.setRelauchingAfterRequestedOrientationChanged(true);
        mController.setRelaunchingAfterRequestedOrientationChanged(true);
    }

    private ActivityRecord setUpActivityWithComponent() {
+2 −0
Original line number Diff line number Diff line
@@ -812,6 +812,8 @@ public class SizeCompatTests extends WindowTestsBase {
        assertEquals(window, mActivity.findMainWindow());

        spyOn(mActivity.mLetterboxUiController);
        doReturn(true).when(mActivity.mLetterboxUiController)
                .isSurfaceReadyToShow(any());
        doReturn(true).when(mActivity.mLetterboxUiController)
                .isSurfaceVisible(any());