summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DeferredDisplayUpdater.java30
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java56
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);
}