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

Commit 130b5355 authored by petsjonkin's avatar petsjonkin Committed by Oleg Petšjonkin
Browse files

BrightnessClamperController state recalculation blocked until started

Modifiers can trigger recalculateModifiersState in their constructors, that can be executed before mStatefulModifiers is updated.

Bug: b/381747990
Test: atest BrightnessClamperControllerTest
Flag: EXEMPT simple bugfix
Change-Id: I99579f23a053655b583a6147b38197b9878051c7
parent 02d89d42
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -81,6 +81,8 @@ public class BrightnessClamperController {
                }
                }
            };
            };


    private volatile boolean mStarted = false;

    public BrightnessClamperController(Handler handler,
    public BrightnessClamperController(Handler handler,
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
            DisplayManagerFlags flags, SensorManager sensorManager, float currentBrightness) {
            DisplayManagerFlags flags, SensorManager sensorManager, float currentBrightness) {
@@ -100,10 +102,10 @@ public class BrightnessClamperController {
        mClamperChangeListenerExternal = clamperChangeListener;
        mClamperChangeListenerExternal = clamperChangeListener;
        mExecutor = new HandlerExecutor(handler);
        mExecutor = new HandlerExecutor(handler);


        Runnable clamperChangeRunnableInternal = this::recalculateBrightnessCap;
        Runnable modifiersChangeRunnableInternal = this::recalculateModifiersState;
        ClamperChangeListener clamperChangeListenerInternal = () -> {
        ClamperChangeListener clamperChangeListenerInternal = () -> {
            if (!mHandler.hasCallbacks(clamperChangeRunnableInternal)) {
            if (mStarted && !mHandler.hasCallbacks(modifiersChangeRunnableInternal)) {
                mHandler.post(clamperChangeRunnableInternal);
                mHandler.post(modifiersChangeRunnableInternal);
            }
            }
        };
        };


@@ -187,6 +189,7 @@ public class BrightnessClamperController {
     * Called in DisplayControllerHandler
     * Called in DisplayControllerHandler
     */
     */
    public void stop() {
    public void stop() {
        mStarted = false;
        mDeviceConfigParameterProvider.removeOnPropertiesChangedListener(
        mDeviceConfigParameterProvider.removeOnPropertiesChangedListener(
                mOnPropertiesChangedListener);
                mOnPropertiesChangedListener);
        mLightSensorController.stop();
        mLightSensorController.stop();
@@ -195,9 +198,9 @@ public class BrightnessClamperController {




    // Called in DisplayControllerHandler
    // Called in DisplayControllerHandler
    private void recalculateBrightnessCap() {
    private void recalculateModifiersState() {
        ModifiersAggregatedState newAggregatedState = new ModifiersAggregatedState();
        ModifiersAggregatedState newAggregatedState = new ModifiersAggregatedState();
        mStatefulModifiers.forEach((clamper) -> clamper.applyStateChange(newAggregatedState));
        mStatefulModifiers.forEach((modifier) -> modifier.applyStateChange(newAggregatedState));


        if (needToNotifyExternalListener(mModifiersAggregatedState, newAggregatedState)) {
        if (needToNotifyExternalListener(mModifiersAggregatedState, newAggregatedState)) {
            mClamperChangeListenerExternal.onChanged();
            mClamperChangeListenerExternal.onChanged();
@@ -223,6 +226,7 @@ public class BrightnessClamperController {
                    mExecutor, mOnPropertiesChangedListener);
                    mExecutor, mOnPropertiesChangedListener);
        }
        }
        adjustLightSensorSubscription();
        adjustLightSensorSubscription();
        mStarted = true;
    }
    }


    private void adjustLightSensorSubscription() {
    private void adjustLightSensorSubscription() {
+20 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.server.display.brightness.clamper;
import static android.view.Display.STATE_OFF;
import static android.view.Display.STATE_OFF;
import static android.view.Display.STATE_ON;
import static android.view.Display.STATE_ON;


import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
@@ -269,6 +271,24 @@ public class BrightnessClamperControllerTest {
        verify(mMockExternalListener).onChanged();
        verify(mMockExternalListener).onChanged();
    }
    }


    @Test
    public void test_doesNotScheduleRecalculateBeforeStart() {
        mTestInjector = new TestInjector(List.of()) {
            @Override
            List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
                    Handler handler, BrightnessClamperController.ClamperChangeListener listener,
                    BrightnessClamperController.DisplayDeviceData displayDeviceData,
                    float currentBrightness) {
                listener.onChanged();
                return super.getModifiers(flags, context, handler, listener, displayDeviceData,
                        currentBrightness);
            }
        };
        mClamperController = createBrightnessClamperController();

        assertThat(mTestHandler.getPendingMessages()).isEmpty();
    }

    private BrightnessClamperController createBrightnessClamperController() {
    private BrightnessClamperController createBrightnessClamperController() {
        return new BrightnessClamperController(mTestInjector, mTestHandler, mMockExternalListener,
        return new BrightnessClamperController(mTestInjector, mTestHandler, mMockExternalListener,
                mMockDisplayDeviceData, mMockContext, mFlags, mSensorManager, 0);
                mMockDisplayDeviceData, mMockContext, mFlags, mSensorManager, 0);