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

Commit 43d0d73d authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Add support for seamless transion from/to AoD

Bug: 64155983
Test: runtest -x packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
Test: manual
Change-Id: I06e72cd5964944c79fb7bfda6881fc4a5a79ca7b
parent 3ddcbc6c
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -63,7 +63,7 @@ public class DozeFactory {
                new DozeFalsingManagerAdapter(FalsingManager.getInstance(context)),
                new DozeFalsingManagerAdapter(FalsingManager.getInstance(context)),
                createDozeTriggers(context, sensorManager, host, alarmManager, config, params,
                createDozeTriggers(context, sensorManager, host, alarmManager, config, params,
                        handler, wakeLock, machine),
                        handler, wakeLock, machine),
                createDozeUi(context, host, wakeLock, machine, handler, alarmManager),
                createDozeUi(context, host, wakeLock, machine, handler, alarmManager, params),
                new DozeScreenState(wrappedService, handler),
                new DozeScreenState(wrappedService, handler),
                createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
                createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
        });
        });
@@ -89,8 +89,9 @@ public class DozeFactory {
    }
    }


    private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
    private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
            DozeMachine machine, Handler handler, AlarmManager alarmManager) {
            DozeMachine machine, Handler handler, AlarmManager alarmManager,
        return new DozeUi(context, alarmManager, machine, wakeLock, host, handler);
            DozeParameters params) {
        return new DozeUi(context, alarmManager, machine, wakeLock, host, handler, params);
    }
    }


    public static DozeHost getHost(DozeService service) {
    public static DozeHost getHost(DozeService service) {
+1 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ public interface DozeHost {
    void extendPulse();
    void extendPulse();


    void setAnimateWakeup(boolean animateWakeup);
    void setAnimateWakeup(boolean animateWakeup);
    void setAnimateScreenOff(boolean animateScreenOff);


    void onDoubleTap(float x, float y);
    void onDoubleTap(float x, float y);


+7 −2
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.SystemClock;
import android.text.format.Formatter;
import android.text.format.Formatter;
import android.util.Log;
import android.util.Log;


import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLock;


@@ -41,18 +42,22 @@ public class DozeUi implements DozeMachine.Part {
    private final WakeLock mWakeLock;
    private final WakeLock mWakeLock;
    private final DozeMachine mMachine;
    private final DozeMachine mMachine;
    private final AlarmTimeout mTimeTicker;
    private final AlarmTimeout mTimeTicker;
    private final boolean mCanAnimateWakeup;


    private long mLastTimeTickElapsed = 0;
    private long mLastTimeTickElapsed = 0;


    public DozeUi(Context context, AlarmManager alarmManager, DozeMachine machine,
    public DozeUi(Context context, AlarmManager alarmManager, DozeMachine machine,
            WakeLock wakeLock, DozeHost host, Handler handler) {
            WakeLock wakeLock, DozeHost host, Handler handler,
            DozeParameters params) {
        mContext = context;
        mContext = context;
        mMachine = machine;
        mMachine = machine;
        mWakeLock = wakeLock;
        mWakeLock = wakeLock;
        mHost = host;
        mHost = host;
        mHandler = handler;
        mHandler = handler;
        mCanAnimateWakeup = !params.getDisplayNeedsBlanking();


        mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
        mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
        mHost.setAnimateScreenOff(params.getCanControlScreenOffAnimation());
    }
    }


    private void pulseWhileDozing(int reason) {
    private void pulseWhileDozing(int reason) {
@@ -106,7 +111,7 @@ public class DozeUi implements DozeMachine.Part {
                // Keep current state.
                // Keep current state.
                break;
                break;
            default:
            default:
                mHost.setAnimateWakeup(false);
                mHost.setAnimateWakeup(mCanAnimateWakeup);
                break;
                break;
        }
        }
    }
    }
+22 −0
Original line number Original line Diff line number Diff line
@@ -119,6 +119,28 @@ public class DozeParameters {
        return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
        return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
    }
    }


    /**
     * Some screens need to be completely black before changing the display power mode,
     * unexpected behavior might happen if this parameter isn't respected.
     *
     * @return true if screen needs to be completely black before a power transition.
     */
    public boolean getDisplayNeedsBlanking() {
        return mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_displayBlanksAfterDoze);
    }

    /**
     * Whether we can implement our own screen off animation or if we need
     * to rely on DisplayPowerManager to dim the display.
     *
     * @return true if SystemUI can control the screen off animation.
     */
    public boolean getCanControlScreenOffAnimation() {
        return !mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_dozeAfterScreenOff);
    }

    private boolean getBoolean(String propName, int resId) {
    private boolean getBoolean(String propName, int resId) {
        return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
        return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
    }
    }
+22 −9
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.graphics.Color;
import android.os.Trace;
import android.os.Trace;


import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.stack.StackStateAnimator;


/**
/**
 * Possible states of the ScrimController state machine.
 * Possible states of the ScrimController state machine.
@@ -38,13 +39,19 @@ public enum ScrimState {


        @Override
        @Override
        public void prepare(ScrimState previousState) {
        public void prepare(ScrimState previousState) {
            mBlankScreen = false;
            if (previousState == ScrimState.AOD) {
                mAnimationDuration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
                if (mDisplayRequiresBlanking) {
                    // DisplayPowerManager will blank the screen, we'll just
                    // DisplayPowerManager will blank the screen, we'll just
                    // set our scrim to black in this frame to avoid flickering and
                    // set our scrim to black in this frame to avoid flickering and
                    // fade it out afterwards.
                    // fade it out afterwards.
            mBlankScreen = previousState == ScrimState.AOD;
                    mBlankScreen = true;
            if (previousState == ScrimState.AOD) {
                    updateScrimColor(mScrimInFront, 1, Color.BLACK);
                    updateScrimColor(mScrimInFront, 1, Color.BLACK);
                }
                }
            } else {
                mAnimationDuration = ScrimController.ANIMATION_DURATION;
            }
            mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
            mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
            mCurrentInFrontAlpha = 0;
            mCurrentInFrontAlpha = 0;
        }
        }
@@ -78,7 +85,7 @@ public enum ScrimState {
    AOD {
    AOD {
        @Override
        @Override
        public void prepare(ScrimState previousState) {
        public void prepare(ScrimState previousState) {
            if (previousState == ScrimState.PULSING) {
            if (previousState == ScrimState.PULSING && !mCanControlScreenOff) {
                updateScrimColor(mScrimInFront, 1, Color.BLACK);
                updateScrimColor(mScrimInFront, 1, Color.BLACK);
            }
            }
            final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
            final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
@@ -89,7 +96,7 @@ public enum ScrimState {
            mCurrentBehindTint = Color.BLACK;
            mCurrentBehindTint = Color.BLACK;
            // DisplayPowerManager will blank the screen for us, we just need
            // DisplayPowerManager will blank the screen for us, we just need
            // to set our state.
            // to set our state.
            mAnimateChange = false;
            mAnimateChange = mCanControlScreenOff;
        }
        }
    },
    },


@@ -103,9 +110,11 @@ public enum ScrimState {
            mCurrentInFrontAlpha = 0;
            mCurrentInFrontAlpha = 0;
            mCurrentInFrontTint = Color.BLACK;
            mCurrentInFrontTint = Color.BLACK;
            mCurrentBehindTint = Color.BLACK;
            mCurrentBehindTint = Color.BLACK;
            mBlankScreen = true;
            mBlankScreen = mDisplayRequiresBlanking;
            if (mDisplayRequiresBlanking) {
                updateScrimColor(mScrimInFront, 1, Color.BLACK);
                updateScrimColor(mScrimInFront, 1, Color.BLACK);
            }
            }
        }
    },
    },


    /**
    /**
@@ -147,11 +156,15 @@ public enum ScrimState {
    ScrimView mScrimInFront;
    ScrimView mScrimInFront;
    ScrimView mScrimBehind;
    ScrimView mScrimBehind;
    DozeParameters mDozeParameters;
    DozeParameters mDozeParameters;
    boolean mDisplayRequiresBlanking;
    boolean mCanControlScreenOff;


    public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) {
    public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) {
        mScrimInFront = scrimInFront;
        mScrimInFront = scrimInFront;
        mScrimBehind = scrimBehind;
        mScrimBehind = scrimBehind;
        mDozeParameters = dozeParameters;
        mDozeParameters = dozeParameters;
        mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
        mCanControlScreenOff = dozeParameters.getCanControlScreenOffAnimation();
    }
    }


    public void prepare(ScrimState previousState) {
    public void prepare(ScrimState previousState) {
Loading