From 73dee75148b8ddbfb0edcfebff6d3449d4956da4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Thu, 2 Mar 2023 10:52:50 +0000 Subject: [PATCH] Translate the float scale value to a nit value when transferring the short-term model Note: if the device does not support nits, the short-term model will not be transferred. Bug: 270715892 Test: Manual with extra logs Change-Id: I15c0da84c87f73c0eba2748c1da107384867023d --- .../display/DisplayPowerController.java | 12 +++- .../display/DisplayPowerController2.java | 12 +++- .../display/DisplayPowerController2Test.java | 69 +++++++++++++++++-- .../display/DisplayPowerControllerTest.java | 68 ++++++++++++++++-- 4 files changed, 149 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index e12cd8c9a43b4..656882f3f6158 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -1056,10 +1056,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } float userLux = BrightnessMappingStrategy.NO_USER_LUX; - float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + float userNits = -1; if (mInteractiveModeBrightnessMapper != null) { userLux = mInteractiveModeBrightnessMapper.getUserLux(); - userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); + float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); + userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness); } final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( @@ -1179,6 +1180,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); } + float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + if (userNits >= 0) { + userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits); + if (userBrightness == PowerManager.BRIGHTNESS_INVALID_FLOAT) { + userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + } + } mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController( this, handler.getLooper(), mSensorManager, mLightSensor, mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig, diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index fbc354eb4c110..3e01222bbae6e 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -893,10 +893,11 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } float userLux = BrightnessMappingStrategy.NO_USER_LUX; - float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + float userNits = -1; if (mInteractiveModeBrightnessMapper != null) { userLux = mInteractiveModeBrightnessMapper.getUserLux(); - userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); + float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); + userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness); } final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( @@ -1016,6 +1017,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); } + float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + if (userNits >= 0) { + userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits); + if (userBrightness == PowerManager.BRIGHTNESS_INVALID_FLOAT) { + userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + } + } mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController( this, handler.getLooper(), mSensorManager, mLightSensor, mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig, diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index 51dcc0323a96d..0ab984bd93819 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -21,11 +21,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; @@ -672,6 +675,7 @@ public final class DisplayPowerController2Test { @Test public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() { + // New display device setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), mock(DisplayDeviceConfig.class), /* isEnabled= */ true); @@ -711,6 +715,56 @@ public final class DisplayPowerController2Test { verify(mHolder.animator, times(2)).animateTo(eq(newBrightness), anyFloat(), anyFloat()); } + @Test + public void testShortTermModelPersistsWhenDisplayDeviceChanges() { + float lux = 2000; + float brightness = 0.4f; + float nits = 500; + when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux); + when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness); + when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits); + when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); + clearInvocations(mHolder.injector); + + // New display device + setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), + mock(DisplayDeviceConfig.class), /* isEnabled= */ true); + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + advanceTime(1); + + verify(mHolder.injector).getAutomaticBrightnessController( + any(AutomaticBrightnessController.Callbacks.class), + any(Looper.class), + eq(mSensorManagerMock), + any(), + eq(mHolder.brightnessMappingStrategy), + anyInt(), + anyFloat(), + anyFloat(), + anyFloat(), + anyInt(), + anyInt(), + anyLong(), + anyLong(), + anyBoolean(), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + eq(mContextSpy), + any(HighBrightnessModeController.class), + any(BrightnessThrottler.class), + isNull(), + anyInt(), + anyInt(), + eq(lux), + eq(brightness) + ); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -796,9 +850,9 @@ public final class DisplayPowerController2Test { final ScreenOffBrightnessSensorController screenOffBrightnessSensorController = mock(ScreenOffBrightnessSensorController.class); - TestInjector injector = new TestInjector(displayPowerState, animator, + TestInjector injector = spy(new TestInjector(displayPowerState, animator, automaticBrightnessController, wakelockController, brightnessMappingStrategy, - hysteresisLevels, screenOffBrightnessSensorController); + hysteresisLevels, screenOffBrightnessSensorController)); final LogicalDisplay display = mock(LogicalDisplay.class); final DisplayDevice device = mock(DisplayDevice.class); @@ -816,7 +870,8 @@ public final class DisplayPowerController2Test { return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting, animator, automaticBrightnessController, wakelockController, - screenOffBrightnessSensorController, hbmMetadata); + screenOffBrightnessSensorController, hbmMetadata, brightnessMappingStrategy, + injector); } /** @@ -833,6 +888,8 @@ public final class DisplayPowerController2Test { public final WakelockController wakelockController; public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController; public final HighBrightnessModeMetadata hbmMetadata; + public final BrightnessMappingStrategy brightnessMappingStrategy; + public final DisplayPowerController2.Injector injector; DisplayPowerControllerHolder(DisplayPowerController2 dpc, LogicalDisplay display, DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting, @@ -840,7 +897,9 @@ public final class DisplayPowerController2Test { AutomaticBrightnessController automaticBrightnessController, WakelockController wakelockController, ScreenOffBrightnessSensorController screenOffBrightnessSensorController, - HighBrightnessModeMetadata hbmMetadata) { + HighBrightnessModeMetadata hbmMetadata, + BrightnessMappingStrategy brightnessMappingStrategy, + DisplayPowerController2.Injector injector) { this.dpc = dpc; this.display = display; this.displayPowerState = displayPowerState; @@ -850,6 +909,8 @@ public final class DisplayPowerController2Test { this.wakelockController = wakelockController; this.screenOffBrightnessSensorController = screenOffBrightnessSensorController; this.hbmMetadata = hbmMetadata; + this.brightnessMappingStrategy = brightnessMappingStrategy; + this.injector = injector; } } diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 0a1bf1c9ed990..c021ef65a2915 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -21,11 +21,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; @@ -676,6 +679,7 @@ public final class DisplayPowerControllerTest { @Test public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() { + // New display device setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), mock(DisplayDeviceConfig.class), /* isEnabled= */ true); @@ -715,6 +719,56 @@ public final class DisplayPowerControllerTest { verify(mHolder.animator, times(2)).animateTo(eq(newBrightness), anyFloat(), anyFloat()); } + @Test + public void testShortTermModelPersistsWhenDisplayDeviceChanges() { + float lux = 2000; + float brightness = 0.4f; + float nits = 500; + when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux); + when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness); + when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits); + when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); + clearInvocations(mHolder.injector); + + // New display device + setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), + mock(DisplayDeviceConfig.class), /* isEnabled= */ true); + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + advanceTime(1); + + verify(mHolder.injector).getAutomaticBrightnessController( + any(AutomaticBrightnessController.Callbacks.class), + any(Looper.class), + eq(mSensorManagerMock), + any(), + eq(mHolder.brightnessMappingStrategy), + anyInt(), + anyFloat(), + anyFloat(), + anyFloat(), + anyInt(), + anyInt(), + anyLong(), + anyLong(), + anyBoolean(), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + any(HysteresisLevels.class), + eq(mContextSpy), + any(HighBrightnessModeController.class), + any(BrightnessThrottler.class), + isNull(), + anyInt(), + anyInt(), + eq(lux), + eq(brightness) + ); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -799,9 +853,9 @@ public final class DisplayPowerControllerTest { final ScreenOffBrightnessSensorController screenOffBrightnessSensorController = mock(ScreenOffBrightnessSensorController.class); - DisplayPowerController.Injector injector = new TestInjector(displayPowerState, animator, + DisplayPowerController.Injector injector = spy(new TestInjector(displayPowerState, animator, automaticBrightnessController, brightnessMappingStrategy, hysteresisLevels, - screenOffBrightnessSensorController); + screenOffBrightnessSensorController)); final LogicalDisplay display = mock(LogicalDisplay.class); final DisplayDevice device = mock(DisplayDevice.class); @@ -819,7 +873,7 @@ public final class DisplayPowerControllerTest { return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting, animator, automaticBrightnessController, screenOffBrightnessSensorController, - hbmMetadata); + hbmMetadata, brightnessMappingStrategy, injector); } /** @@ -835,13 +889,17 @@ public final class DisplayPowerControllerTest { public final AutomaticBrightnessController automaticBrightnessController; public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController; public final HighBrightnessModeMetadata hbmMetadata; + public final BrightnessMappingStrategy brightnessMappingStrategy; + public final DisplayPowerController.Injector injector; DisplayPowerControllerHolder(DisplayPowerController dpc, LogicalDisplay display, DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting, DualRampAnimator animator, AutomaticBrightnessController automaticBrightnessController, ScreenOffBrightnessSensorController screenOffBrightnessSensorController, - HighBrightnessModeMetadata hbmMetadata) { + HighBrightnessModeMetadata hbmMetadata, + BrightnessMappingStrategy brightnessMappingStrategy, + DisplayPowerController.Injector injector) { this.dpc = dpc; this.display = display; this.displayPowerState = displayPowerState; @@ -850,6 +908,8 @@ public final class DisplayPowerControllerTest { this.automaticBrightnessController = automaticBrightnessController; this.screenOffBrightnessSensorController = screenOffBrightnessSensorController; this.hbmMetadata = hbmMetadata; + this.brightnessMappingStrategy = brightnessMappingStrategy; + this.injector = injector; } }