Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90f1b976 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Request to start transition for non physical switch change

For non-physicalDisplayUpdated case, it didn't request to
start transition.

Fix: 318679910
Test: DisplayContentDeferredUpdateTests
Change-Id: Id777e34995c591cee23b513a6121e3a5acbdc2cf
parent 429020dd
Loading
Loading
Loading
Loading
+23 −7
Original line number Diff line number Diff line
@@ -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,
+3 −3
Original line number Diff line number Diff line
@@ -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) {
+35 −21
Original line number Diff line number Diff line
@@ -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);
    }