diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 566af3c434534..5ff40d0e14eec 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -450,7 +450,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { // Determine whether the active color mode is still there. if (!mSupportedColorModes.contains(mActiveColorMode)) { - if (mActiveColorMode != 0) { + if (mActiveColorMode != Display.COLOR_MODE_DEFAULT) { Slog.w(TAG, "Active color mode no longer available, reverting" + " to default mode."); mActiveColorMode = Display.COLOR_MODE_DEFAULT; diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 93402681271a3..9d2393b4a8f7f 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -188,10 +188,10 @@ public class LocalDisplayAdapterTest { } @Test - public void testAfterDisplayChange_ModesAreUpdated() throws Exception { - SurfaceControl.DisplayConfig displayInfo = createFakeDisplayConfig(1920, 1080, 60f); + public void testAfterDisplayChange_DisplayModesAreUpdated() throws Exception { + SurfaceControl.DisplayConfig displayConfig = createFakeDisplayConfig(1920, 1080, 60f); SurfaceControl.DisplayConfig[] configs = - new SurfaceControl.DisplayConfig[]{displayInfo}; + new SurfaceControl.DisplayConfig[]{displayConfig}; FakeDisplay display = new FakeDisplay(PORT_A, configs, 0); setUpDisplay(display); updateAvailableDisplays(); @@ -205,20 +205,20 @@ public class LocalDisplayAdapterTest { 0).getDisplayDeviceInfoLocked(); assertThat(displayDeviceInfo.supportedModes.length).isEqualTo(configs.length); - assertModeIsSupported(displayDeviceInfo.supportedModes, displayInfo); + assertModeIsSupported(displayDeviceInfo.supportedModes, displayConfig); Display.Mode defaultMode = getModeById(displayDeviceInfo, displayDeviceInfo.defaultModeId); - assertThat(defaultMode.matches(displayInfo.width, displayInfo.height, - displayInfo.refreshRate)).isTrue(); + assertThat(defaultMode.matches(displayConfig.width, displayConfig.height, + displayConfig.refreshRate)).isTrue(); Display.Mode activeMode = getModeById(displayDeviceInfo, displayDeviceInfo.modeId); - assertThat(activeMode.matches(displayInfo.width, displayInfo.height, - displayInfo.refreshRate)).isTrue(); + assertThat(activeMode.matches(displayConfig.width, displayConfig.height, + displayConfig.refreshRate)).isTrue(); // Change the display SurfaceControl.DisplayConfig addedDisplayInfo = createFakeDisplayConfig(3840, 2160, 60f); - configs = new SurfaceControl.DisplayConfig[]{displayInfo, addedDisplayInfo}; + configs = new SurfaceControl.DisplayConfig[]{displayConfig, addedDisplayInfo}; display.configs = configs; display.activeConfig = 1; setUpDisplay(display); @@ -236,7 +236,7 @@ public class LocalDisplayAdapterTest { displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); assertThat(displayDeviceInfo.supportedModes.length).isEqualTo(configs.length); - assertModeIsSupported(displayDeviceInfo.supportedModes, displayInfo); + assertModeIsSupported(displayDeviceInfo.supportedModes, displayConfig); assertModeIsSupported(displayDeviceInfo.supportedModes, addedDisplayInfo); activeMode = getModeById(displayDeviceInfo, displayDeviceInfo.modeId); @@ -248,6 +248,80 @@ public class LocalDisplayAdapterTest { addedDisplayInfo.refreshRate)).isTrue(); } + @Test + public void testAfterDisplayChange_HdrCapabilitiesAreUpdated() throws Exception { + FakeDisplay display = new FakeDisplay(PORT_A); + Display.HdrCapabilities initialHdrCapabilities = new Display.HdrCapabilities(new int[0], + 1000, 1000, 0); + display.hdrCapabilities = initialHdrCapabilities; + setUpDisplay(display); + updateAvailableDisplays(); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays).isEmpty(); + + DisplayDeviceInfo displayDeviceInfo = mListener.addedDisplays.get( + 0).getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.hdrCapabilities).isEqualTo(initialHdrCapabilities); + + // Change the display + Display.HdrCapabilities changedHdrCapabilities = new Display.HdrCapabilities( + new int[Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS], 1000, 1000, 0); + display.hdrCapabilities = changedHdrCapabilities; + setUpDisplay(display); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays.size()).isEqualTo(1); + + DisplayDevice displayDevice = mListener.changedDisplays.get(0); + displayDevice.applyPendingDisplayDeviceInfoChangesLocked(); + displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.hdrCapabilities).isEqualTo(changedHdrCapabilities); + } + + @Test + public void testAfterDisplayChange_ColorModesAreUpdated() throws Exception { + FakeDisplay display = new FakeDisplay(PORT_A); + final int[] initialColorModes = new int[]{Display.COLOR_MODE_BT709}; + display.colorModes = initialColorModes; + setUpDisplay(display); + updateAvailableDisplays(); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays).isEmpty(); + + DisplayDeviceInfo displayDeviceInfo = mListener.addedDisplays.get(0) + .getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.colorMode).isEqualTo(Display.COLOR_MODE_BT709); + assertThat(displayDeviceInfo.supportedColorModes).isEqualTo(initialColorModes); + + // Change the display + final int[] changedColorModes = new int[]{Display.COLOR_MODE_DEFAULT}; + display.colorModes = changedColorModes; + setUpDisplay(display); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays.size()).isEqualTo(1); + + DisplayDevice displayDevice = mListener.changedDisplays.get(0); + displayDevice.applyPendingDisplayDeviceInfoChangesLocked(); + displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.colorMode).isEqualTo(Display.COLOR_MODE_DEFAULT); + assertThat(displayDeviceInfo.supportedColorModes).isEqualTo(changedColorModes); + } + private void assertDisplayDpi(DisplayDeviceInfo info, int expectedPort, float expectedXdpi, float expectedYDpi, @@ -279,6 +353,9 @@ public class LocalDisplayAdapterTest { public final SurfaceControl.DisplayInfo info; public SurfaceControl.DisplayConfig[] configs; public int activeConfig; + public int[] colorModes = new int[]{ Display.COLOR_MODE_DEFAULT }; + public Display.HdrCapabilities hdrCapabilities = new Display.HdrCapabilities(new int[0], + 1000, 1000, 0); private FakeDisplay(int port) { this.address = createDisplayAddress(port); @@ -306,8 +383,10 @@ public class LocalDisplayAdapterTest { () -> SurfaceControl.getDisplayConfigs(display.token)); doReturn(display.activeConfig).when(() -> SurfaceControl.getActiveConfig(display.token)); doReturn(0).when(() -> SurfaceControl.getActiveColorMode(display.token)); - doReturn(new int[] { 0 }).when( + doReturn(display.colorModes).when( () -> SurfaceControl.getDisplayColorModes(display.token)); + doReturn(display.hdrCapabilities).when( + () -> SurfaceControl.getHdrCapabilities(display.token)); doReturn(new SurfaceControl.DesiredDisplayConfigSpecs(0, 60.f, 60.f, 60.f, 60.f)) .when(() -> SurfaceControl.getDesiredDisplayConfigSpecs(display.token)); }