Refresh display bounds when display layout updated

Previoulsy mDefaultDisplayBounds & mLastVisualDisplayBounds are
incorrect after device reboot without re-register DisplayAreaOrganizer.
Then the bounds does not set correctly for transition.
When AnimationController#getAnimator() get incorrect display bounds,
either surface bounds or rounded corner does not crop correctly.

Test: manual enable OHM, reboot device and trigger
     (Bounds/Rounded corner should works when trigger)
Test: atest WMShellUnitTests
Bug: 212651010
Change-Id: Ib30edf6ecc2244f7fec7e233b0fb048d5ee40f3c
This commit is contained in:
Bill Lin
2021-12-30 14:59:13 +08:00
parent 88041a12fe
commit 630f3af989
4 changed files with 25 additions and 3 deletions

View File

@@ -277,6 +277,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
registerSettingObservers(mUserId);
setupTimeoutListener();
updateSettings();
updateDisplayLayout(mContext.getDisplayId());
mAccessibilityManager = AccessibilityManager.getInstance(context);
mAccessibilityManager.addAccessibilityStateChangeListener(
@@ -448,8 +449,13 @@ public class OneHandedController implements RemoteCallable<OneHandedController>,
onShortcutEnabledChanged();
}
private void updateDisplayLayout(int displayId) {
@VisibleForTesting
void updateDisplayLayout(int displayId) {
final DisplayLayout newDisplayLayout = mDisplayController.getDisplayLayout(displayId);
if (newDisplayLayout == null) {
Slog.w(TAG, "Failed to get new DisplayLayout.");
return;
}
mDisplayAreaOrganizer.setDisplayLayout(newDisplayLayout);
mTutorialHandler.onDisplayChanged(newDisplayLayout);
mBackgroundPanelOrganizer.onDisplayChanged(newDisplayLayout);

View File

@@ -123,9 +123,8 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
OneHandedBackgroundPanelOrganizer oneHandedBackgroundGradientOrganizer,
ShellExecutor mainExecutor) {
super(mainExecutor);
mDisplayLayout.set(displayLayout);
setDisplayLayout(displayLayout);
mOneHandedSettingsUtil = oneHandedSettingsUtil;
updateDisplayBounds();
mAnimationController = animationController;
final int animationDurationConfig = context.getResources().getInteger(
R.integer.config_one_handed_translate_animation_duration);
@@ -282,6 +281,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
@VisibleForTesting
void setDisplayLayout(@NonNull DisplayLayout displayLayout) {
mDisplayLayout.set(displayLayout);
updateDisplayBounds();
}
@VisibleForTesting
@@ -289,6 +289,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
return mDisplayAreaTokenMap;
}
@VisibleForTesting
void updateDisplayBounds() {
mDefaultDisplayBounds.set(0, 0, mDisplayLayout.width(), mDisplayLayout.height());
mLastVisualDisplayBounds.set(mDefaultDisplayBounds);

View File

@@ -109,6 +109,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
mSpiedTransitionState = spy(new OneHandedState());
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
when(mMockDisplayController.getDisplayLayout(anyInt())).thenReturn(null);
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
when(mMockDisplayAreaOrganizer.isReady()).thenReturn(true);
when(mMockBackgroundOrganizer.isRegistered()).thenReturn(true);
@@ -152,6 +153,13 @@ public class OneHandedControllerTest extends OneHandedTestCase {
assertThat(mSpiedTransitionState.getState()).isEqualTo(STATE_NONE);
}
@Test
public void testNullDisplayLayout() {
mSpiedOneHandedController.updateDisplayLayout(0);
verify(mMockDisplayAreaOrganizer, never()).setDisplayLayout(any());
}
@Test
public void testStartOneHandedShouldTriggerScheduleOffset() {
mSpiedTransitionState.setState(STATE_NONE);

View File

@@ -432,4 +432,11 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
assertThat(testSpiedDisplayAreaOrganizer.isReady()).isFalse();
}
@Test
public void testDisplayArea_setDisplayLayout_should_updateDisplayBounds() {
mSpiedDisplayAreaOrganizer.setDisplayLayout(mDisplayLayout);
verify(mSpiedDisplayAreaOrganizer).updateDisplayBounds();
}
}