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

Commit b398c207 authored by Beverly's avatar Beverly Committed by Android Build Coastguard Worker
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

(cherry picked from commit a7b30e3c)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:959dd616056f8f3a1957259f5fd3093eeb514036)
Merged-In: I0377cce2aa4d30db3850ed98b9f5f6aa050fec49
Change-Id: I0377cce2aa4d30db3850ed98b9f5f6aa050fec49
parent a90babf8
Loading
Loading
Loading
Loading
+22 −14
Original line number Diff line number Diff line
@@ -262,9 +262,9 @@ 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 int mDozeScreenState = Display.STATE_UNKNOWN;
    private @Display.StateReason int mDozeScreenStateReason = Display.STATE_REASON_UNKNOWN;
    private int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;

    private boolean mDebug = false;

@@ -906,13 +906,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;
@@ -920,6 +922,8 @@ public class DreamService extends Service implements Window.Callback {

        if (mDozing) {
            try {
                Slog.v(mTag, "UpdateDoze mDozeScreenState=" + mDozeScreenState
                        + " mDozeScreenBrightness=" + mDozeScreenBrightness);
                mDreamManager.startDozing(
                        mDreamToken, mDozeScreenState, mDozeScreenStateReason,
                        mDozeScreenBrightness);
@@ -1034,12 +1038,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.
@@ -1089,11 +1095,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();
            }
        }
    }

    /**
     * Called when this Dream is constructed.