Make the visibility of rotated insets up-to-date
Otherwise the client app may not perform insets animation because of a stale state that is no different from the previous one. Bug: 170416293 Test: DisplayContentTests#testApplyTopFixedRotationTransform Change-Id: I6f89ba08d4996da0cf30fb18bab331678dc74622
This commit is contained in:
@@ -1674,6 +1674,28 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
}
|
||||
}
|
||||
|
||||
void notifyInsetsChanged(Consumer<WindowState> dispatchInsetsChanged) {
|
||||
if (mFixedRotationLaunchingApp != null) {
|
||||
// The insets state of fixed rotation app is a rotated copy. Make sure the visibilities
|
||||
// of insets sources are consistent with the latest state.
|
||||
final InsetsState rotatedState =
|
||||
mFixedRotationLaunchingApp.getFixedRotationTransformInsetsState();
|
||||
if (rotatedState != null) {
|
||||
final InsetsState state = mInsetsStateController.getRawInsetsState();
|
||||
for (int i = 0; i < InsetsState.SIZE; i++) {
|
||||
final InsetsSource source = state.peekSource(i);
|
||||
if (source != null) {
|
||||
rotatedState.setSourceVisible(i, source.isVisible());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
forAllWindows(dispatchInsetsChanged, true /* traverseTopToBottom */);
|
||||
if (mRemoteInsetsControlTarget != null) {
|
||||
mRemoteInsetsControlTarget.notifyInsetsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update rotation of the display.
|
||||
*
|
||||
|
||||
@@ -496,10 +496,7 @@ class InsetsStateController {
|
||||
}
|
||||
|
||||
void notifyInsetsChanged() {
|
||||
mDisplayContent.forAllWindows(mDispatchInsetsChanged, true /* traverseTopToBottom */);
|
||||
if (mDisplayContent.mRemoteInsetsControlTarget != null) {
|
||||
mDisplayContent.mRemoteInsetsControlTarget.notifyInsetsChanged();
|
||||
}
|
||||
mDisplayContent.notifyInsetsChanged(mDispatchInsetsChanged);
|
||||
}
|
||||
|
||||
void dump(String prefix, PrintWriter pw) {
|
||||
|
||||
@@ -1202,6 +1202,17 @@ public class DisplayContentTests extends WindowTestsBase {
|
||||
assertTrue(mNavBarWindow.getParent().isAnimating(WindowContainer.AnimationFlags.PARENTS,
|
||||
ANIMATION_TYPE_FIXED_TRANSFORM));
|
||||
|
||||
// If the visibility of insets state is changed, the rotated state should be updated too.
|
||||
final InsetsState rotatedState = app.getFixedRotationTransformInsetsState();
|
||||
final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState();
|
||||
assertEquals(state.getSource(ITYPE_STATUS_BAR).isVisible(),
|
||||
rotatedState.getSource(ITYPE_STATUS_BAR).isVisible());
|
||||
state.getSource(ITYPE_STATUS_BAR).setVisible(
|
||||
!rotatedState.getSource(ITYPE_STATUS_BAR).isVisible());
|
||||
mDisplayContent.getInsetsStateController().notifyInsetsChanged();
|
||||
assertEquals(state.getSource(ITYPE_STATUS_BAR).isVisible(),
|
||||
rotatedState.getSource(ITYPE_STATUS_BAR).isVisible());
|
||||
|
||||
final Rect outFrame = new Rect();
|
||||
final Rect outInsets = new Rect();
|
||||
final Rect outStableInsets = new Rect();
|
||||
|
||||
Reference in New Issue
Block a user