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

Commit a1d5520a authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Update insets position after rotation change is done

Otherwise because getWindowFrameSurfacePosition returns old position
before the display rotation transform is applied, if the position
doesn't update after the transform is done, it will show old position
in new rotation around a few frames. Such as the handle of navigation
bar may be flickering at screen center.

Bug: 338091119
Test: atest TransitionTests#testAppTransitionWithRotationChange

Change-Id: I21a0f10d4c83b6e7137ea0b389f2bbe1a4c82c2f
parent a8f99519
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -288,6 +288,17 @@ class AsyncRotationController extends FadeAnimationController implements Consume
            final SurfaceControl.Transaction t = windowToken.getSyncTransaction();
            clearTransform(t, op.mLeash);
        }
        // The insets position may be frozen by shouldFreezeInsetsPosition(), so refresh the
        // position to the latest state when it is ready to show in new rotation.
        if (mTransitionOp == OP_APP_SWITCH) {
            for (int i = windowToken.getChildCount() - 1; i >= 0; i--) {
                final WindowState w = windowToken.getChildAt(i);
                final InsetsSourceProvider insetsProvider = w.getControllableInsetProvider();
                if (insetsProvider != null) {
                    insetsProvider.updateInsetsControlPosition(w);
                }
            }
        }
    }

    private static void clearTransform(SurfaceControl.Transaction t, SurfaceControl sc) {
+37 −32
Original line number Diff line number Diff line
@@ -351,7 +351,13 @@ class InsetsSourceProvider {
                ? windowState.wouldBeVisibleIfPolicyIgnored() && windowState.isVisibleByPolicy()
                : mWindowContainer.isVisibleRequested();
        setServerVisible(isServerVisible);
        if (mControl != null) {
        updateInsetsControlPosition(windowState);
    }

    void updateInsetsControlPosition(WindowState windowState) {
        if (mControl == null) {
            return;
        }
        boolean changed = false;
        final Point position = getWindowFrameSurfacePosition();
        if (mControl.setSurfacePosition(position.x, position.y) && mControlTarget != null) {
@@ -388,7 +394,6 @@ class InsetsSourceProvider {
            mStateController.notifyControlChanged(mControlTarget);
        }
    }
    }

    private Point getWindowFrameSurfacePosition() {
        final WindowState win = mWindowContainer.asWindowState();
+7 −1
Original line number Diff line number Diff line
@@ -1236,7 +1236,9 @@ public class TransitionTests extends WindowTestsBase {
        final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, "statusBar");
        makeWindowVisible(statusBar);
        mDisplayContent.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs);
        final WindowState navBar = createWindow(null, TYPE_NAVIGATION_BAR, "navBar");
        final WindowState navBar = createNavBarWithProvidedInsets(mDisplayContent);
        final InsetsSourceProvider navBarInsetsProvider = navBar.getControllableInsetProvider();
        assertNotNull(navBarInsetsProvider);
        final ActivityRecord app = createActivityRecord(mDisplayContent);
        final Transition transition = app.mTransitionController.createTransition(TRANSIT_OPEN);
        app.mTransitionController.requestStartTransition(transition, app.getTask(),
@@ -1282,11 +1284,15 @@ public class TransitionTests extends WindowTestsBase {
        onRotationTransactionReady(player, mWm.mTransactionFactory.get()).onTransactionCommitted();
        assertEquals(ROTATION_ANIMATION_SEAMLESS, player.mLastReady.getChange(
                mDisplayContent.mRemoteToken.toWindowContainerToken()).getRotationAnimation());
        spyOn(navBarInsetsProvider);
        player.finish();

        // The controller should be cleared if the target windows are drawn.
        statusBar.finishDrawing(mWm.mTransactionFactory.get(), Integer.MAX_VALUE);
        assertNull(mDisplayContent.getAsyncRotationController());
        // The shouldFreezeInsetsPosition for navBar was true, so its insets position should be
        // updated if the transition is done.
        verify(navBarInsetsProvider).updateInsetsControlPosition(navBar);
    }

    private static void assertShouldFreezeInsetsPosition(AsyncRotationController controller,