diff options
3 files changed, 61 insertions, 31 deletions
diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java index 975fdc0ade5d..0f9e5b0b2892 100644 --- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java +++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java @@ -179,6 +179,12 @@ public class DeferredDisplayUpdater implements DisplayUpdater { if (physicalDisplayUpdated) { onDisplayUpdated(transition, fromRotation, startBounds); } else { + final TransitionRequestInfo.DisplayChange displayChange = + getCurrentDisplayChange(fromRotation, startBounds); + mDisplayContent.mTransitionController.requestStartTransition(transition, + /* startTask= */ null, /* remoteTransition= */ null, displayChange); + mDisplayContent.mTransitionController.setDisplaySyncMethod(displayChange, + mDisplayContent); transition.setAllReady(); } }); @@ -204,6 +210,22 @@ public class DeferredDisplayUpdater implements DisplayUpdater { return new DisplayInfo(mNonOverrideDisplayInfo); } + @NonNull + private TransitionRequestInfo.DisplayChange getCurrentDisplayChange(int fromRotation, + @NonNull Rect startBounds) { + final Rect endBounds = new Rect(0, 0, mDisplayContent.mInitialDisplayWidth, + mDisplayContent.mInitialDisplayHeight); + final int toRotation = mDisplayContent.getRotation(); + + final TransitionRequestInfo.DisplayChange displayChange = + new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId()); + displayChange.setStartAbsBounds(startBounds); + displayChange.setEndAbsBounds(endBounds); + displayChange.setStartRotation(fromRotation); + displayChange.setEndRotation(toRotation); + return displayChange; + } + /** * Called when physical display is updated, this could happen e.g. on foldable * devices when the physical underlying display is replaced. This method should be called @@ -214,16 +236,10 @@ public class DeferredDisplayUpdater implements DisplayUpdater { */ private void onDisplayUpdated(@NonNull Transition transition, int fromRotation, @NonNull Rect startBounds) { - final Rect endBounds = new Rect(0, 0, mDisplayContent.mInitialDisplayWidth, - mDisplayContent.mInitialDisplayHeight); final int toRotation = mDisplayContent.getRotation(); final TransitionRequestInfo.DisplayChange displayChange = - new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId()); - displayChange.setStartAbsBounds(startBounds); - displayChange.setEndAbsBounds(endBounds); - displayChange.setStartRotation(fromRotation); - displayChange.setEndRotation(toRotation); + getCurrentDisplayChange(fromRotation, startBounds); displayChange.setPhysicalDisplayChanged(true); mDisplayContent.mTransitionController.requestStartTransition(transition, diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index c3aca6fe84d1..708d63e27ec2 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -634,8 +634,8 @@ class TransitionController { } /** Sets the sync method for the display change. */ - private void setDisplaySyncMethod(@NonNull TransitionRequestInfo.DisplayChange displayChange, - @NonNull Transition displayTransition, @NonNull DisplayContent displayContent) { + void setDisplaySyncMethod(@NonNull TransitionRequestInfo.DisplayChange displayChange, + @NonNull DisplayContent displayContent) { final Rect startBounds = displayChange.getStartAbsBounds(); final Rect endBounds = displayChange.getEndAbsBounds(); if (startBounds == null || endBounds == null) return; @@ -686,7 +686,7 @@ class TransitionController { trigger != null ? trigger.asTask() : null, remoteTransition, displayChange); if (newTransition != null && displayChange != null && trigger != null && trigger.asDisplayContent() != null) { - setDisplaySyncMethod(displayChange, newTransition, trigger.asDisplayContent()); + setDisplaySyncMethod(displayChange, trigger.asDisplayContent()); } } if (trigger != null) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java index dfa595c23e44..99d354aa0505 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java @@ -55,6 +55,11 @@ import org.mockito.ArgumentCaptor; @RunWith(WindowTestRunner.class) public class DisplayContentDeferredUpdateTests extends WindowTestsBase { + // The fields to override the current DisplayInfo. + private String mUniqueId; + private int mColorMode; + private int mLogicalDensityDpi; + @Override protected void onBeforeSystemServicesCreated() { // Set other flags to their default values @@ -73,7 +78,7 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { public void testUpdate_deferrableFieldChangedTransitionStarted_deferrableFieldUpdated() { performInitialDisplayUpdate(); - givenDisplayInfo(/* uniqueId= */ "old"); + mUniqueId = "old"; Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); @@ -82,11 +87,21 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { verify(onUpdated).run(); clearInvocations(mDisplayContent.mTransitionController, onUpdated); - givenDisplayInfo(/* uniqueId= */ "new"); + mUniqueId = "new"; mDisplayContent.requestDisplayUpdate(onUpdated); captureStartTransitionCollection().getValue().onCollectStarted(/* deferred= */ true); verify(onUpdated).run(); + verify(mDisplayContent.mTransitionController).requestStartTransition( + any(), any(), any(), any()); assertThat(mDisplayContent.getDisplayInfo().uniqueId).isEqualTo("new"); + clearInvocations(mDisplayContent.mTransitionController, onUpdated); + + mLogicalDensityDpi += 100; + mDisplayContent.requestDisplayUpdate(onUpdated); + captureStartTransitionCollection().getValue().onCollectStarted(/* deferred= */ true); + verify(onUpdated).run(); + verify(mDisplayContent.mTransitionController).requestStartTransition( + any(), any(), any(), any()); } @Test @@ -94,7 +109,8 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { performInitialDisplayUpdate(); // Update only color mode (non-deferrable field) and keep the same unique id - givenDisplayInfo(/* uniqueId= */ "initial_unique_id", /* colorMode= */ 123); + mUniqueId = "initial_unique_id"; + mColorMode = 123; Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); @@ -107,7 +123,8 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { performInitialDisplayUpdate(); // Update only color mode (non-deferrable field) and keep the same unique id - givenDisplayInfo(/* uniqueId= */ "initial_unique_id", /* colorMode= */ 123); + mUniqueId = "initial_unique_id"; + mColorMode = 123; mDisplayContent.requestDisplayUpdate(mock(Runnable.class)); assertThat(mDisplayContent.getDisplayInfo().colorMode).isEqualTo(123); @@ -116,7 +133,7 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { // Update unique id (deferrable field), keep the same color mode, // this update should be deferred - givenDisplayInfo(/* uniqueId= */ "new_unique_id", /* colorMode= */ 123); + mUniqueId = "new_unique_id"; mDisplayContent.requestDisplayUpdate(mock(Runnable.class)); assertThat(mDisplayContent.getDisplayInfo().colorMode).isEqualTo(123); @@ -126,7 +143,7 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { // Update color mode again and keep the same unique id, color mode update // should not be deferred, unique id update is still deferred as transition // has not started collecting yet - givenDisplayInfo(/* uniqueId= */ "new_unique_id", /* colorMode= */ 456); + mColorMode = 456; Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); @@ -146,14 +163,14 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { @Test public void testUpdate_deferrableFieldUpdatedTransitionPending_fieldNotUpdated() { performInitialDisplayUpdate(); - givenDisplayInfo(/* uniqueId= */ "old"); + mUniqueId = "old"; Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); captureStartTransitionCollection().getValue().onCollectStarted(/* deferred= */ true); verify(onUpdated).run(); clearInvocations(mDisplayContent.mTransitionController, onUpdated); - givenDisplayInfo(/* uniqueId= */ "new"); + mUniqueId = "new"; mDisplayContent.requestDisplayUpdate(onUpdated); captureStartTransitionCollection(); // do not continue by not starting the collection @@ -164,7 +181,7 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { @Test public void testTwoDisplayUpdates_transitionStarted_displayUpdated() { performInitialDisplayUpdate(); - givenDisplayInfo(/* uniqueId= */ "old"); + mUniqueId = "old"; Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); captureStartTransitionCollection().getValue() @@ -173,10 +190,10 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { clearInvocations(mDisplayContent.mTransitionController, onUpdated); // Perform two display updates while WM is 'busy' - givenDisplayInfo(/* uniqueId= */ "new1"); + mUniqueId = "new1"; Runnable onUpdated1 = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated1); - givenDisplayInfo(/* uniqueId= */ "new2"); + mUniqueId = "new2"; Runnable onUpdated2 = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated2); @@ -215,22 +232,19 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase { return callbackCaptor; } - private void givenDisplayInfo(String uniqueId) { - givenDisplayInfo(uniqueId, /* colorMode= */ 0); - } + private void performInitialDisplayUpdate() { + mUniqueId = "initial_unique_id"; + mColorMode = 0; + mLogicalDensityDpi = 400; - private void givenDisplayInfo(String uniqueId, int colorMode) { spyOn(mDisplayContent.mDisplay); doAnswer(invocation -> { DisplayInfo info = invocation.getArgument(0); - info.uniqueId = uniqueId; - info.colorMode = colorMode; + info.uniqueId = mUniqueId; + info.colorMode = mColorMode; + info.logicalDensityDpi = mLogicalDensityDpi; return null; }).when(mDisplayContent.mDisplay).getDisplayInfo(any()); - } - - private void performInitialDisplayUpdate() { - givenDisplayInfo(/* uniqueId= */ "initial_unique_id", /* colorMode= */ 0); Runnable onUpdated = mock(Runnable.class); mDisplayContent.requestDisplayUpdate(onUpdated); } |