diff options
| author | 2024-05-21 13:46:09 +0000 | |
|---|---|---|
| committer | 2024-06-04 15:11:56 +0000 | |
| commit | 4c630c11b57c59aa717fcbe739b47ca515b14db0 (patch) | |
| tree | 2e19491f78526f8f9c60faba1a2334167563b3fa | |
| parent | 7e725e0696eb2e17c559e076391305fa0a781e62 (diff) | |
Processing autobrightness mode in async
setAutomaticScreenBrightnessMode function is currently executed from the
display thread, while the automaitc brightness controller utilities
should only be accessed from the power thread. To achieve this, the
logic is now being executed via the handler event
Bug: 341026483
Test: atest DisplayPowerControllerTest
Change-Id: I0f228ee76119780dc278e37b7cf06738a3a9dee6
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayPowerController.java | 21 | ||||
| -rw-r--r-- | services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java | 33 |
2 files changed, 41 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 8d71c701cf87..15010f723daa 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -159,7 +159,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private static final int MSG_STATSD_HBM_BRIGHTNESS = 11; private static final int MSG_SWITCH_USER = 12; private static final int MSG_BOOT_COMPLETED = 13; - private static final int MSG_SET_DWBC_STRONG_MODE = 14; + private static final int MSG_SWITCH_AUTOBRIGHTNESS_MODE = 14; private static final int MSG_SET_DWBC_COLOR_OVERRIDE = 15; private static final int MSG_SET_DWBC_LOGGING_ENABLED = 16; private static final int MSG_SET_BRIGHTNESS_FROM_OFFLOAD = 17; @@ -1184,15 +1184,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call @Override public void setAutomaticScreenBrightnessMode( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { - boolean isIdle = mode == AUTO_BRIGHTNESS_MODE_IDLE; - if (mAutomaticBrightnessController != null) { - // Set sendUpdate to true to make sure that updatePowerState() gets called - mAutomaticBrightnessController.switchMode(mode, /* sendUpdate= */ true); - setAnimatorRampSpeeds(isIdle); - } Message msg = mHandler.obtainMessage(); - msg.what = MSG_SET_DWBC_STRONG_MODE; - msg.arg1 = isIdle ? 1 : 0; + msg.what = MSG_SWITCH_AUTOBRIGHTNESS_MODE; + msg.arg1 = mode; mHandler.sendMessageAtTime(msg, mClock.uptimeMillis()); } @@ -1868,7 +1862,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private void setDwbcStrongMode(int arg) { if (mDisplayWhiteBalanceController != null) { - final boolean isIdle = (arg == 1); + final boolean isIdle = (arg == AUTO_BRIGHTNESS_MODE_IDLE); mDisplayWhiteBalanceController.setStrongModeEnabled(isIdle); } } @@ -3034,7 +3028,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call updatePowerState(); break; - case MSG_SET_DWBC_STRONG_MODE: + case MSG_SWITCH_AUTOBRIGHTNESS_MODE: + boolean isIdle = msg.arg1 == AUTO_BRIGHTNESS_MODE_IDLE; + if (mAutomaticBrightnessController != null) { + mAutomaticBrightnessController.switchMode(msg.arg1, /* sendUpdate= */ true); + setAnimatorRampSpeeds(isIdle); + } setDwbcStrongMode(msg.arg1); break; diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index 8fd1e6baf522..efa224f28c8c 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager; @@ -1284,14 +1285,37 @@ public final class DisplayPowerControllerTest { @Test public void testDwbcCallsHappenOnHandler() { + when(mDisplayManagerFlagsMock.isAdaptiveTone1Enabled()).thenReturn(true); mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); + // Send a display power request + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; + dpr.useProximitySensor = true; + mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */); + + // Run updatePowerState + advanceTime(1); + + setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), + mHolder.config, /* isEnabled= */ true); + + // dispatch handler looper + advanceTime(1); + clearInvocations(mDisplayWhiteBalanceControllerMock, mHolder.automaticBrightnessController, + mHolder.animator); mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); - verify(mDisplayWhiteBalanceControllerMock, never()).setStrongModeEnabled(true); + verifyNoMoreInteractions(mDisplayWhiteBalanceControllerMock, + mHolder.automaticBrightnessController, + mHolder.animator); // dispatch handler looper advanceTime(1); - verify(mDisplayWhiteBalanceControllerMock, times(1)).setStrongModeEnabled(true); + verify(mHolder.automaticBrightnessController).switchMode(AUTO_BRIGHTNESS_MODE_IDLE, + /* sendUpdate= */ true); + verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE, + BRIGHTNESS_RAMP_DECREASE_MAX_IDLE); + verify(mDisplayWhiteBalanceControllerMock).setStrongModeEnabled(true); } @Test @@ -1506,6 +1530,9 @@ public final class DisplayPowerControllerTest { // switch to idle mode mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); + // Process the MSG_SWITCH_AUTOBRIGHTNESS_MODE event + advanceTime(1); + // A second time when switching to idle mode. verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX, BRIGHTNESS_RAMP_DECREASE_MAX); @@ -1532,6 +1559,8 @@ public final class DisplayPowerControllerTest { // switch to idle mode mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); + // Process the MSG_SWITCH_AUTOBRIGHTNESS_MODE event + advanceTime(1); verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE, BRIGHTNESS_RAMP_DECREASE_MAX_IDLE); } |