From 4c630c11b57c59aa717fcbe739b47ca515b14db0 Mon Sep 17 00:00:00 2001 From: Rupesh Bansal Date: Tue, 21 May 2024 13:46:09 +0000 Subject: 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 --- .../server/display/DisplayPowerController.java | 21 +++++++------- .../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); } -- cgit v1.2.3-59-g8ed1b