Loading services/core/java/com/android/server/wm/DisplayRotation.java +3 −2 Original line number Diff line number Diff line Loading @@ -295,7 +295,7 @@ public class DisplayRotation { && mDeviceStateController .shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay()) { mDisplayRotationCoordinator.setDefaultDisplayRotationChangedCallback( mDefaultDisplayRotationChangedCallback); displayContent.getDisplayId(), mDefaultDisplayRotationChangedCallback); } if (isDefaultDisplay) { Loading Loading @@ -1659,7 +1659,8 @@ public class DisplayRotation { void removeDefaultDisplayRotationChangedCallback() { if (DisplayRotationCoordinator.isSecondaryInternalDisplay(mDisplayContent)) { mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback(); mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback( mDefaultDisplayRotationChangedCallback); } } Loading services/core/java/com/android/server/wm/DisplayRotationCoordinator.java +17 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -40,6 +41,7 @@ class DisplayRotationCoordinator { @Nullable @VisibleForTesting Runnable mDefaultDisplayRotationChangedCallback; private int mCallbackDisplayId = Display.INVALID_DISPLAY; @Surface.Rotation private int mDefaultDisplayCurrentRotation; Loading Loading @@ -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(); Loading @@ -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) { Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +0 −2 Original line number Diff line number Diff line Loading @@ -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()) Loading Loading @@ -1922,7 +1921,6 @@ public class DisplayContentTests extends WindowTestsBase { final DisplayRotationCoordinator coordinator = mRootWindowContainer.getDisplayRotationCoordinator(); coordinator.removeDefaultDisplayRotationChangedCallback(); DeviceStateController deviceStateController = mock(DeviceStateController.class); when(deviceStateController.shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay()) Loading services/tests/wmtests/src/com/android/server/wm/DisplayRotationCoordinatorTests.java +34 −8 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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()); } Loading Loading
services/core/java/com/android/server/wm/DisplayRotation.java +3 −2 Original line number Diff line number Diff line Loading @@ -295,7 +295,7 @@ public class DisplayRotation { && mDeviceStateController .shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay()) { mDisplayRotationCoordinator.setDefaultDisplayRotationChangedCallback( mDefaultDisplayRotationChangedCallback); displayContent.getDisplayId(), mDefaultDisplayRotationChangedCallback); } if (isDefaultDisplay) { Loading Loading @@ -1659,7 +1659,8 @@ public class DisplayRotation { void removeDefaultDisplayRotationChangedCallback() { if (DisplayRotationCoordinator.isSecondaryInternalDisplay(mDisplayContent)) { mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback(); mDisplayRotationCoordinator.removeDefaultDisplayRotationChangedCallback( mDefaultDisplayRotationChangedCallback); } } Loading
services/core/java/com/android/server/wm/DisplayRotationCoordinator.java +17 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -40,6 +41,7 @@ class DisplayRotationCoordinator { @Nullable @VisibleForTesting Runnable mDefaultDisplayRotationChangedCallback; private int mCallbackDisplayId = Display.INVALID_DISPLAY; @Surface.Rotation private int mDefaultDisplayCurrentRotation; Loading Loading @@ -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(); Loading @@ -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) { Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +0 −2 Original line number Diff line number Diff line Loading @@ -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()) Loading Loading @@ -1922,7 +1921,6 @@ public class DisplayContentTests extends WindowTestsBase { final DisplayRotationCoordinator coordinator = mRootWindowContainer.getDisplayRotationCoordinator(); coordinator.removeDefaultDisplayRotationChangedCallback(); DeviceStateController deviceStateController = mock(DeviceStateController.class); when(deviceStateController.shouldMatchBuiltInDisplayOrientationToReverseDefaultDisplay()) Loading
services/tests/wmtests/src/com/android/server/wm/DisplayRotationCoordinatorTests.java +34 −8 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); Loading @@ -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()); } Loading