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

Commit a7b30e3c authored by Beverly's avatar Beverly Committed by Beverly Tai
Browse files

Synchronize calls to updateDoze

And hold a lock when updating doze
screen state and doze brightness changes.

So updates from different threads are always
ordered to ensure the latest information
is sent to DreamManagerService.

This is more robust than volatile because the actual IPC
call to mDreamManager could still be called out of order if
the calls to DreamManager aren't synchronized.

Fixes: 358578071
Flag: EXEMPT bugfix
Test: manually request display and brightness changes
from separate threads; latest requested values get
sent to DreamManagerService

Change-Id: I0377cce2aa4d30db3850ed98b9f5f6aa050fec49
parent 1c60a274
Loading
Loading
Loading
Loading
+30 −18
Original line number Diff line number Diff line
@@ -267,10 +267,10 @@ public class DreamService extends Service implements Window.Callback {
    private boolean mDozing;
    private boolean mWindowless;
    private boolean mPreviewMode;
    private volatile int mDozeScreenState = Display.STATE_UNKNOWN;
    private volatile @Display.StateReason int mDozeScreenStateReason = Display.STATE_REASON_UNKNOWN;
    private volatile int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
    private volatile float mDozeScreenBrightnessFloat = PowerManager.BRIGHTNESS_INVALID_FLOAT;
    private int mDozeScreenState = Display.STATE_UNKNOWN;
    private @Display.StateReason int mDozeScreenStateReason = Display.STATE_REASON_UNKNOWN;
    private int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
    private float mDozeScreenBrightnessFloat = PowerManager.BRIGHTNESS_INVALID_FLOAT;

    private boolean mDebug = false;

@@ -913,13 +913,15 @@ public class DreamService extends Service implements Window.Callback {
     */
    @UnsupportedAppUsage
    public void startDozing() {
        synchronized (this) {
            if (mCanDoze && !mDozing) {
                mDozing = true;
                updateDoze();
            }
        }
    }

    private void updateDoze() {
    private synchronized void updateDoze() {
        if (mDreamToken == null) {
            Slog.w(mTag, "Updating doze without a dream token.");
            return;
@@ -927,6 +929,9 @@ public class DreamService extends Service implements Window.Callback {

        if (mDozing) {
            try {
                Slog.v(mTag, "UpdateDoze mDozeScreenState=" + mDozeScreenState
                        + " mDozeScreenBrightness=" + mDozeScreenBrightness
                        + " mDozeScreenBrightnessFloat=" + mDozeScreenBrightnessFloat);
                if (startAndStopDozingInBackground()) {
                    mDreamManager.startDozingOneway(
                            mDreamToken, mDozeScreenState, mDozeScreenStateReason,
@@ -1048,12 +1053,14 @@ public class DreamService extends Service implements Window.Callback {
     */
    @UnsupportedAppUsage
    public void setDozeScreenState(int state, @Display.StateReason int reason) {
        synchronized (this) {
            if (mDozeScreenState != state) {
                mDozeScreenState = state;
                mDozeScreenStateReason = reason;
                updateDoze();
            }
        }
    }

    /**
     * Gets the screen brightness to use while dozing.
@@ -1103,11 +1110,13 @@ public class DreamService extends Service implements Window.Callback {
        if (brightness != PowerManager.BRIGHTNESS_DEFAULT) {
            brightness = clampAbsoluteBrightness(brightness);
        }
        synchronized (this) {
            if (mDozeScreenBrightness != brightness) {
                mDozeScreenBrightness = brightness;
                updateDoze();
            }
        }
    }

    /**
     * Sets the screen brightness to use while dozing.
@@ -1141,11 +1150,14 @@ public class DreamService extends Service implements Window.Callback {
        if (!Float.isNaN(brightness)) {
            brightness = clampAbsoluteBrightnessFloat(brightness);
        }

        synchronized (this) {
            if (!BrightnessSynchronizer.floatEquals(mDozeScreenBrightnessFloat, brightness)) {
                mDozeScreenBrightnessFloat = brightness;
                updateDoze();
            }
        }
    }

    /**
     * Called when this Dream is constructed.