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

Commit 49a67de5 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Don't turn on prox until after screen is off/dozed

This change ensures that the doze related code does not turn on the
proximity sensor until after it has completed its transition to a low
power screen state.

This fixes the appearance of a white dot on devices with the proximity
sensor behind the screen.

Fixes: 155441239
Test: atest SystemUITests && manual
Change-Id: I58cc9a8e92fa0b219ada13c293478c6fc5e79c78
parent 9676b906
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -199,6 +199,12 @@ public class DozeMachine {
        requestState(State.DOZE_REQUEST_PULSE, pulseReason);
    }

    void onScreenState(int state) {
        for (Part part : mParts) {
            part.onScreenState(state);
        }
    }

    private void requestState(State requestedState, int pulseReason) {
        Assert.isMainThread();
        if (DEBUG) {
@@ -423,6 +429,9 @@ public class DozeMachine {

        /** Give the Part a chance to clean itself up. */
        default void destroy() {}

        /** Alerts that the screenstate is being changed. */
        default void onScreenState(int state) {}
    }

    /** A wrapper interface for {@link android.service.dreams.DreamService} */
+13 −8
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.provider.Settings;
import android.view.Display;

import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -68,6 +69,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
     * --ei brightness_bucket 1}
     */
    private int mDebugBrightnessBucket = -1;
    private DozeMachine.State mState;

    @VisibleForTesting
    public DozeScreenBrightness(Context context, DozeMachine.Service service,
@@ -107,17 +109,10 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi

    @Override
    public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
        mState = newState;
        switch (newState) {
            case INITIALIZED:
                resetBrightnessToDefault();
                break;
            case DOZE_AOD:
            case DOZE_REQUEST_PULSE:
            case DOZE_AOD_DOCKED:
                setLightSensorEnabled(true);
                break;
            case DOZE:
                setLightSensorEnabled(false);
                resetBrightnessToDefault();
                break;
            case FINISH:
@@ -130,6 +125,16 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
        }
    }

    @Override
    public void onScreenState(int state) {
        if (mState == DozeMachine.State.FINISH && !mScreenOff
                && (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND)) {
            setLightSensorEnabled(true);
        } else {
            setLightSensorEnabled(false);
        }
    }

    private void onDestroy() {
        setLightSensorEnabled(false);
        if (mDebuggable) {
+1 −19
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ public class DozeSensors {
    private final AlarmManager mAlarmManager;
    private final AsyncSensorManager mSensorManager;
    private final ContentResolver mResolver;
    private final TriggerSensor mPickupSensor;
    private final DozeParameters mDozeParameters;
    private final AmbientDisplayConfiguration mConfig;
    private final WakeLock mWakeLock;
@@ -80,7 +79,6 @@ public class DozeSensors {
    private long mDebounceFrom;
    private boolean mSettingRegistered;
    private boolean mListening;
    private boolean mPaused;

    @VisibleForTesting
    public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum {
@@ -121,7 +119,7 @@ public class DozeSensors {
                        dozeParameters.getPulseOnSigMotion(),
                        DozeLog.PULSE_REASON_SENSOR_SIGMOTION, false /* touchCoords */,
                        false /* touchscreen */, dozeLog),
                mPickupSensor = new TriggerSensor(
                new TriggerSensor(
                        mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
                        Settings.Secure.DOZE_PICK_UP_GESTURE,
                        true /* settingDef */,
@@ -231,18 +229,6 @@ public class DozeSensors {
        updateListening();
    }

    /**
     * Unregister sensors, when listening, unless they are prox gated.
     * @see #setListening(boolean)
     */
    public void setPaused(boolean paused) {
        if (mPaused == paused) {
            return;
        }
        mPaused = paused;
        updateListening();
    }

    /**
     * Registers/unregisters sensors based on internal state.
     */
@@ -304,10 +290,6 @@ public class DozeSensors {
        }
    };

    public void setDisableSensorsInterferingWithProximity(boolean disable) {
        mPickupSensor.setDisabled(disable);
    }

    /** Ignore the setting value of only the sensors that require the touchscreen. */
    public void ignoreTouchScreenSensorsSettingInterferingWithDocking(boolean ignore) {
        for (TriggerSensor sensor : mSensors) {
+6 −0
Original line number Diff line number Diff line
@@ -130,4 +130,10 @@ public class DozeService extends DreamService
            mDozeMachine.requestState(DozeMachine.State.DOZE);
        }
    }

    @Override
    public void setDozeScreenState(int state) {
        super.setDozeScreenState(state);
        mDozeMachine.onScreenState(state);
    }
}
+23 −8
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.text.format.Formatter;
import android.util.Log;
import android.view.Display;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
@@ -93,6 +94,9 @@ public class DozeTriggers implements DozeMachine.Part {
    private boolean mPulsePending;

    private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
    private boolean mWantProx;
    private boolean mWantSensors;
    private boolean mWantTouchScreenSensors;

    @VisibleForTesting
    public enum DozingUpdateUiEvent implements UiEventLogger.UiEventEnum {
@@ -384,24 +388,22 @@ public class DozeTriggers implements DozeMachine.Part {
                break;
            case DOZE:
            case DOZE_AOD:
                mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE);
                mDozeSensors.setListening(true);
                mDozeSensors.setPaused(false);
                mWantProx = newState != DozeMachine.State.DOZE;
                mWantSensors = true;
                mWantTouchScreenSensors = true;
                if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) {
                    onWakeScreen(false, newState);
                }
                break;
            case DOZE_AOD_PAUSED:
            case DOZE_AOD_PAUSING:
                mDozeSensors.setProxListening(true);
                mDozeSensors.setPaused(true);
                mWantProx = true;
                break;
            case DOZE_PULSING:
            case DOZE_PULSING_BRIGHT:
            case DOZE_AOD_DOCKED:
                mDozeSensors.setTouchscreenSensorsListening(false);
                mDozeSensors.setProxListening(true);
                mDozeSensors.setPaused(false);
                mWantProx = true;
                mWantTouchScreenSensors = false;
                break;
            case DOZE_PULSE_DONE:
                mDozeSensors.requestTemporaryDisable();
@@ -420,6 +422,19 @@ public class DozeTriggers implements DozeMachine.Part {
        }
    }

    @Override
    public void onScreenState(int state) {
        if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND
                || state == Display.STATE_OFF) {
            mDozeSensors.setProxListening(mWantProx);
            mDozeSensors.setListening(mWantSensors);
            mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors);
        } else {
            mDozeSensors.setProxListening(false);
            mDozeSensors.setListening(false);
        }
    }

    private void checkTriggersAtInit() {
        if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR
                || mDozeHost.isBlockingDoze()
Loading