diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 9917bfc3aca65..76b3138c24063 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -885,7 +885,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); - mHandler.post(() -> { + mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { changed = true; @@ -916,7 +916,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (changed) { updatePowerState(); } - }); + }, mClock.uptimeMillis()); } /** @@ -940,10 +940,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAutomaticBrightnessController.stop(); } - if (mScreenOffBrightnessSensorController != null) { - mScreenOffBrightnessSensorController.stop(); - } - if (mBrightnessSetting != null) { mBrightnessSetting.unregisterListener(mBrightnessSettingListener); } @@ -1190,6 +1186,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mScreenOffBrightnessSensorController != null) { mScreenOffBrightnessSensorController.stop(); + mScreenOffBrightnessSensorController = null; } loadScreenOffBrightnessSensor(); int[] sensorValueToLux = mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux(); @@ -1311,6 +1308,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mPowerState.stop(); mPowerState = null; } + + if (mScreenOffBrightnessSensorController != null) { + mScreenOffBrightnessSensorController.stop(); + } } private void updatePowerState() { diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index f49419cf789ea..bdb87d22a9089 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -729,7 +729,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); - mHandler.post(() -> { + mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { changed = true; @@ -761,7 +761,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (changed) { updatePowerState(); } - }); + }, mClock.uptimeMillis()); } /** @@ -1028,6 +1028,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mBrightnessEventRingBuffer = new RingBuffer<>(BrightnessEvent.class, RINGBUFFER_MAX); + if (mScreenOffBrightnessSensorController != null) { + mScreenOffBrightnessSensorController.stop(); + mScreenOffBrightnessSensorController = null; + } loadScreenOffBrightnessSensor(); int[] sensorValueToLux = mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux(); if (mScreenOffBrightnessSensor != null && sensorValueToLux != null) { @@ -1133,6 +1137,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mPowerState.stop(); mPowerState = null; } + + if (mScreenOffBrightnessSensorController != null) { + mScreenOffBrightnessSensorController.stop(); + } } private void updatePowerState() { 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 96b63455598d1..3e0e5a8414dd5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -64,6 +64,7 @@ import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.color.ColorDisplayService; +import com.android.server.display.layout.Layout; import com.android.server.display.whitebalance.DisplayWhiteBalanceController; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; @@ -240,12 +241,15 @@ public final class DisplayPowerController2Test { boolean isEnabled) { DisplayInfo info = new DisplayInfo(); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); + deviceInfo.uniqueId = uniqueId; when(logicalDisplayMock.getDisplayIdLocked()).thenReturn(displayId); when(logicalDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(displayDeviceMock); when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); + when(logicalDisplayMock.getBrightnessThrottlingDataIdLocked()).thenReturn( + DisplayDeviceConfig.DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); @@ -626,6 +630,19 @@ public final class DisplayPowerController2Test { .setLightSensorEnabled(false); } + @Test + public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() { + 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); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.screenOffBrightnessSensorController).stop(); + } + private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId) { return createDisplayPowerController(displayId, uniqueId, /* isEnabled= */ true); @@ -662,8 +679,8 @@ public final class DisplayPowerController2Test { mBrightnessTrackerMock, brightnessSetting, () -> {}, hbmMetadata, /* bootCompleted= */ false); - return new DisplayPowerControllerHolder(dpc, displayPowerState, brightnessSetting, animator, - automaticBrightnessController, wakelockController, + return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting, + animator, automaticBrightnessController, wakelockController, screenOffBrightnessSensorController, hbmMetadata); } @@ -673,6 +690,7 @@ public final class DisplayPowerController2Test { */ private static class DisplayPowerControllerHolder { public final DisplayPowerController2 dpc; + public final LogicalDisplay display; public final DisplayPowerState displayPowerState; public final BrightnessSetting brightnessSetting; public final DualRampAnimator animator; @@ -681,7 +699,7 @@ public final class DisplayPowerController2Test { public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController; public final HighBrightnessModeMetadata hbmMetadata; - DisplayPowerControllerHolder(DisplayPowerController2 dpc, + DisplayPowerControllerHolder(DisplayPowerController2 dpc, LogicalDisplay display, DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting, DualRampAnimator animator, AutomaticBrightnessController automaticBrightnessController, @@ -689,6 +707,7 @@ public final class DisplayPowerController2Test { ScreenOffBrightnessSensorController screenOffBrightnessSensorController, HighBrightnessModeMetadata hbmMetadata) { this.dpc = dpc; + this.display = display; this.displayPowerState = displayPowerState; this.brightnessSetting = brightnessSetting; this.animator = animator; 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 28319acc5f1b0..6c4afd37d8b1d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -64,6 +64,7 @@ import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.color.ColorDisplayService; +import com.android.server.display.layout.Layout; import com.android.server.display.whitebalance.DisplayWhiteBalanceController; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; @@ -243,12 +244,15 @@ public final class DisplayPowerControllerTest { boolean isEnabled) { DisplayInfo info = new DisplayInfo(); DisplayDeviceInfo deviceInfo = new DisplayDeviceInfo(); + deviceInfo.uniqueId = uniqueId; when(logicalDisplayMock.getDisplayIdLocked()).thenReturn(displayId); when(logicalDisplayMock.getPrimaryDisplayDeviceLocked()).thenReturn(displayDeviceMock); when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); + when(logicalDisplayMock.getBrightnessThrottlingDataIdLocked()).thenReturn( + DisplayDeviceConfig.DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); @@ -630,6 +634,19 @@ public final class DisplayPowerControllerTest { .setLightSensorEnabled(false); } + @Test + public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() { + 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); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.screenOffBrightnessSensorController).stop(); + } + private DisplayPowerControllerHolder createDisplayPowerController(int displayId, String uniqueId) { return createDisplayPowerController(displayId, uniqueId, /* isEnabled= */ true); @@ -665,8 +682,9 @@ public final class DisplayPowerControllerTest { mBrightnessTrackerMock, brightnessSetting, () -> {}, hbmMetadata, /* bootCompleted= */ false); - return new DisplayPowerControllerHolder(dpc, displayPowerState, brightnessSetting, animator, - automaticBrightnessController, screenOffBrightnessSensorController, hbmMetadata); + return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting, + animator, automaticBrightnessController, screenOffBrightnessSensorController, + hbmMetadata); } /** @@ -675,6 +693,7 @@ public final class DisplayPowerControllerTest { */ private static class DisplayPowerControllerHolder { public final DisplayPowerController dpc; + public final LogicalDisplay display; public final DisplayPowerState displayPowerState; public final BrightnessSetting brightnessSetting; public final DualRampAnimator animator; @@ -682,13 +701,14 @@ public final class DisplayPowerControllerTest { public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController; public final HighBrightnessModeMetadata hbmMetadata; - DisplayPowerControllerHolder(DisplayPowerController dpc, + DisplayPowerControllerHolder(DisplayPowerController dpc, LogicalDisplay display, DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting, DualRampAnimator animator, AutomaticBrightnessController automaticBrightnessController, ScreenOffBrightnessSensorController screenOffBrightnessSensorController, HighBrightnessModeMetadata hbmMetadata) { this.dpc = dpc; + this.display = display; this.displayPowerState = displayPowerState; this.brightnessSetting = brightnessSetting; this.animator = animator;