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

Commit 49413be1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow same displayId to override DisplayRotationCoordinator callback" into main

parents f7af0707 d56fb4d6
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -295,7 +295,7 @@ public class DisplayRotation {
                && mDeviceStateController
                        .shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay()) {
            mDisplayRotationCoordinator.setDefaultDisplayRotationChangedCallback(
                    mDefaultDisplayRotationChangedCallback);
                    displayContent.getDisplayId(), mDefaultDisplayRotationChangedCallback);
        }

        if (isDefaultDisplay) {
@@ -1659,7 +1659,8 @@ public class DisplayRotation {

    void removeDefaultDisplayRotationChangedCallback() {
        if (DisplayRotationCoordinator.isSecondaryInternalDisplay(mDisplayContent)) {
            mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback();
            mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback(
                    mDefaultDisplayRotationChangedCallback);
        }
    }

+17 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.wm;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Slog;
import android.view.Display;
import android.view.Surface;

@@ -40,6 +41,7 @@ class DisplayRotationCoordinator {
    @Nullable
    @VisibleForTesting
    Runnable mDefaultDisplayRotationChangedCallback;
    private int mCallbackDisplayId = Display.INVALID_DISPLAY;

    @Surface.Rotation
    private int mDefaultDisplayCurrentRotation;
@@ -68,12 +70,15 @@ class DisplayRotationCoordinator {
     * Register a callback to be notified when the default display's rotation changes. Clients can
     * query the default display's current rotation via {@link #getDefaultDisplayCurrentRotation()}.
     */
    void setDefaultDisplayRotationChangedCallback(@NonNull Runnable callback) {
        if (mDefaultDisplayRotationChangedCallback != null) {
            throw new UnsupportedOperationException("Multiple clients unsupported");
    void setDefaultDisplayRotationChangedCallback(int displayId, @NonNull Runnable callback) {
        if (mDefaultDisplayRotationChangedCallback != null && displayId != mCallbackDisplayId) {
            throw new UnsupportedOperationException("Multiple clients unsupported"
                    + ". Incoming displayId: " + displayId
                    + ", existing displayId: " + mCallbackDisplayId);
        }

        mDefaultDisplayRotationChangedCallback = callback;
        mCallbackDisplayId = displayId;

        if (mDefaultDisplayCurrentRotation != mDefaultDisplayDefaultRotation) {
            callback.run();
@@ -82,10 +87,17 @@ class DisplayRotationCoordinator {

    /**
     * Removes the callback that was added via
     * {@link #setDefaultDisplayRotationChangedCallback(Runnable)}.
     * {@link #setDefaultDisplayRotationChangedCallback(int, Runnable)}.
     */
    void removeDefaultDisplayRotationChangedCallback() {
    void removeDefaultDisplayRotationChangedCallback(@NonNull Runnable callback) {
        if (callback != mDefaultDisplayRotationChangedCallback) {
            Slog.w(TAG, "Attempted to remove non-matching callback."
                    + " DisplayId: " + mCallbackDisplayId);
            return;
        }

        mDefaultDisplayRotationChangedCallback = null;
        mCallbackDisplayId = Display.INVALID_DISPLAY;
    }

    static boolean isSecondaryInternalDisplay(@NonNull DisplayContent displayContent) {
+0 −2
Original line number Diff line number Diff line
@@ -1865,7 +1865,6 @@ public class DisplayContentTests extends WindowTestsBase {
                mRootWindowContainer.getDisplayRotationCoordinator();
        final DisplayContent defaultDisplayContent = mDisplayContent;
        final DisplayRotation defaultDisplayRotation = defaultDisplayContent.getDisplayRotation();
        coordinator.removeDefaultDisplayRotationChangedCallback();

        DeviceStateController deviceStateController = mock(DeviceStateController.class);
        when(deviceStateController.shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay())
@@ -1922,7 +1921,6 @@ public class DisplayContentTests extends WindowTestsBase {

        final DisplayRotationCoordinator coordinator =
                mRootWindowContainer.getDisplayRotationCoordinator();
        coordinator.removeDefaultDisplayRotationChangedCallback();

        DeviceStateController deviceStateController = mock(DeviceStateController.class);
        when(deviceStateController.shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay())
+34 −8
Original line number Diff line number Diff line
@@ -40,6 +40,9 @@ import org.junit.Test;
@Presubmit
public class DisplayRotationCoordinatorTests {

    private static final int FIRST_DISPLAY_ID = 1;
    private static final int SECOND_DISPLAY_ID = 2;

    @NonNull
    private final DisplayRotationCoordinator mCoordinator = new DisplayRotationCoordinator();

@@ -50,22 +53,45 @@ public class DisplayRotationCoordinatorTests {
    }

    @Test (expected = UnsupportedOperationException.class)
    public void testSecondRegistrationWithoutRemovingFirst() {
    public void testSecondRegistrationWithoutRemovingFirstWhenDifferentDisplay() {
        Runnable callback1 = mock(Runnable.class);
        Runnable callback2 = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback1);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback2);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback1);
        mCoordinator.setDefaultDisplayRotationChangedCallback(SECOND_DISPLAY_ID, callback2);
        assertEquals(callback1, mCoordinator.mDefaultDisplayRotationChangedCallback);
    }

    @Test
    public void testSecondRegistrationWithoutRemovingFirstWhenSameDisplay() {
        Runnable callback1 = mock(Runnable.class);
        Runnable callback2 = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback1);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback2);
        assertEquals(callback2, mCoordinator.mDefaultDisplayRotationChangedCallback);
    }

    @Test
    public void testRemoveIncorrectRegistration() {
        Runnable callback1 = mock(Runnable.class);
        Runnable callback2 = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback1);
        mCoordinator.removeDefaultDisplayRotationChangedCallback(callback2);
        assertEquals(callback1, mCoordinator.mDefaultDisplayRotationChangedCallback);

        // FIRST_DISPLAY_ID is still able to register another callback because the previous
        // removal should not have succeeded.
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback2);
        assertEquals(callback2, mCoordinator.mDefaultDisplayRotationChangedCallback);
    }

    @Test
    public void testSecondRegistrationAfterRemovingFirst() {
        Runnable callback1 = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback1);
        mCoordinator.removeDefaultDisplayRotationChangedCallback();
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback1);
        mCoordinator.removeDefaultDisplayRotationChangedCallback(callback1);

        Runnable callback2 = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback2);
        mCoordinator.setDefaultDisplayRotationChangedCallback(SECOND_DISPLAY_ID, callback2);

        mCoordinator.onDefaultDisplayRotationChanged(Surface.ROTATION_90);
        verify(callback2).run();
@@ -75,7 +101,7 @@ public class DisplayRotationCoordinatorTests {
    @Test
    public void testRegisterThenDefaultDisplayRotationChanged() {
        Runnable callback = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback);
        assertEquals(Surface.ROTATION_0, mCoordinator.getDefaultDisplayCurrentRotation());
        verify(callback, never()).run();

@@ -88,7 +114,7 @@ public class DisplayRotationCoordinatorTests {
    public void testDefaultDisplayRotationChangedThenRegister() {
        mCoordinator.onDefaultDisplayRotationChanged(Surface.ROTATION_90);
        Runnable callback = mock(Runnable.class);
        mCoordinator.setDefaultDisplayRotationChangedCallback(callback);
        mCoordinator.setDefaultDisplayRotationChangedCallback(FIRST_DISPLAY_ID, callback);
        verify(callback).run();
        assertEquals(Surface.ROTATION_90, mCoordinator.getDefaultDisplayCurrentRotation());
    }