Loading services/core/java/com/android/server/wm/AsyncRotationController.java +11 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading services/core/java/com/android/server/wm/InsetsSourceProvider.java +37 −32 Original line number Diff line number Diff line Loading @@ -350,7 +350,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) { Loading Loading @@ -387,7 +393,6 @@ class InsetsSourceProvider { mStateController.notifyControlChanged(mControlTarget); } } } private Point getWindowFrameSurfacePosition() { final WindowState win = mWindowContainer.asWindowState(); Loading services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +7 −1 Original line number Diff line number Diff line Loading @@ -1232,7 +1232,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(), Loading Loading @@ -1278,11 +1280,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, Loading Loading
services/core/java/com/android/server/wm/AsyncRotationController.java +11 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/core/java/com/android/server/wm/InsetsSourceProvider.java +37 −32 Original line number Diff line number Diff line Loading @@ -350,7 +350,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) { Loading Loading @@ -387,7 +393,6 @@ class InsetsSourceProvider { mStateController.notifyControlChanged(mControlTarget); } } } private Point getWindowFrameSurfacePosition() { final WindowState win = mWindowContainer.asWindowState(); Loading
services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +7 −1 Original line number Diff line number Diff line Loading @@ -1232,7 +1232,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(), Loading Loading @@ -1278,11 +1280,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, Loading