Loading services/core/java/com/android/server/wm/DeferredDisplayUpdater.java +23 −7 Original line number Diff line number Diff line Loading @@ -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(); } }); Loading @@ -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 Loading @@ -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, Loading services/core/java/com/android/server/wm/TransitionController.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java +35 −21 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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); Loading @@ -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 Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading @@ -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() Loading @@ -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); Loading Loading @@ -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); } Loading Loading
services/core/java/com/android/server/wm/DeferredDisplayUpdater.java +23 −7 Original line number Diff line number Diff line Loading @@ -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(); } }); Loading @@ -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 Loading @@ -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, Loading
services/core/java/com/android/server/wm/TransitionController.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java +35 −21 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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); Loading @@ -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 Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading @@ -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() Loading @@ -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); Loading Loading @@ -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); } Loading