Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c630c11 authored by Rupesh Bansal's avatar Rupesh Bansal
Browse files

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
parent 7e725e06
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -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;

+31 −2
Original line number Diff line number Diff line
@@ -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);
    }