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

Commit 40301c43 authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Move dark amount to StatusBarStateController"

parents 6b9404da 1a8b33da
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -21,11 +21,6 @@ package com.android.systemui.doze;
 */
public interface DozeReceiver {

    /**
     * If device enters or leaves doze mode
     */
    void setDozing(boolean dozing);

    /**
     * Invoked every time a minute is elapsed in doze mode
     */
+106 −3
Original line number Diff line number Diff line
@@ -18,11 +18,17 @@ package com.android.systemui.statusbar;

import static java.lang.annotation.RetentionPolicy.SOURCE;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.IntDef;
import android.util.ArraySet;
import android.util.Log;
import android.util.FloatProperty;
import android.view.animation.Interpolator;

import com.android.internal.annotations.GuardedBy;
import com.android.systemui.Interpolators;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.StatusBar;

import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.Comparator;
@@ -38,14 +44,51 @@ public class StatusBarStateController {

    private static final Comparator <RankedListener> mComparator
            = (o1, o2) -> Integer.compare(o1.rank, o2.rank);
    private static final FloatProperty<StatusBarStateController> SET_DARK_AMOUNT_PROPERTY =
            new FloatProperty<StatusBarStateController>("mDozeAmount") {

                @Override
                public void setValue(StatusBarStateController object, float value) {
                    object.setDozeAmountInternal(value);
                }

                @Override
                public Float get(StatusBarStateController object) {
                    return object.mDozeAmount;
                }
            };

    private final ArrayList<RankedListener> mListeners = new ArrayList<>();
    private boolean mIsDozing;
    private int mState;
    private int mLastState;
    private boolean mLeaveOpenOnKeyguardHide;
    private boolean mKeyguardRequested;

    /**
     * If the device is currently dozing or not.
     */
    private boolean mIsDozing;

    /**
     * Current {@link #mDozeAmount} animator.
     */
    private ValueAnimator mDarkAnimator;

    /**
     * Current doze amount in this frame.
     */
    private float mDozeAmount;

    /**
     * Where the animator will stop.
     */
    private float mDozeAmountTarget;

    /**
     * The type of interpolator that should be used to the doze animation.
     */
    private Interpolator mDozeInterpolator = Interpolators.FAST_OUT_SLOW_IN;

    // TODO: b/115739177 (remove this explicit ordering if we can)
    @Retention(SOURCE)
    @IntDef({RANK_STATUS_BAR, RANK_STATUS_BAR_WINDOW_CONTROLLER, RANK_STACK_SCROLLER, RANK_SHELF})
@@ -94,6 +137,14 @@ public class StatusBarStateController {
        return mIsDozing;
    }

    public float getDozeAmount() {
        return mDozeAmount;
    }

    public float getInterpolatedDozeAmount() {
        return mDozeInterpolator.getInterpolation(mDozeAmount);
    }

    /**
     * Update the dozing state from {@link StatusBar}'s perspective
     * @param isDozing well, are we dozing?
@@ -116,6 +167,51 @@ public class StatusBarStateController {
        return true;
    }

    /**
     * Changes the current doze amount.
     *
     * @param dozeAmount New doze/dark amount.
     * @param animated If change should be animated or not. This will cancel current animations.
     */
    public void setDozeAmount(float dozeAmount, boolean animated) {
        if (mDarkAnimator != null && mDarkAnimator.isRunning()) {
            if (animated && mDozeAmountTarget == dozeAmount) {
                return;
            } else {
                mDarkAnimator.cancel();
            }
        }

        mDozeAmountTarget = dozeAmount;
        if (animated) {
            startDozeAnimation();
        } else {
            setDozeAmountInternal(dozeAmount);
        }
    }

    private void startDozeAnimation() {
        if (mDozeAmount == 0f || mDozeAmount == 1f) {
            mDozeInterpolator = mIsDozing
                    ? Interpolators.FAST_OUT_SLOW_IN
                    : Interpolators.TOUCH_RESPONSE_REVERSE;
        }
        mDarkAnimator = ObjectAnimator.ofFloat(this, SET_DARK_AMOUNT_PROPERTY, mDozeAmountTarget);
        mDarkAnimator.setInterpolator(Interpolators.LINEAR);
        mDarkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
        mDarkAnimator.start();
    }

    private void setDozeAmountInternal(float dozeAmount) {
        mDozeAmount = dozeAmount;
        float interpolatedAmount = mDozeInterpolator.getInterpolation(dozeAmount);
        synchronized (mListeners) {
            for (RankedListener rl : new ArrayList<>(mListeners)) {
                rl.listener.onDozeAmountChanged(mDozeAmount, interpolatedAmount);
            }
        }
    }

    public boolean goingToFullShade() {
        return mState == StatusBarState.SHADE && mLeaveOpenOnKeyguardHide;
    }
@@ -230,5 +326,12 @@ public class StatusBarStateController {
         * @param isDozing {@code true} if dozing according to {@link StatusBar}
         */
        public default void onDozingChanged(boolean isDozing) {}

        /**
         * Callback to be notified when the doze amount changes. Useful for animations.
         * @param linear A number from 0 to 1, where 1 means that the device is dozing.
         * @param eased Same as {@code linear} but transformed by an interpolator.
         */
        default void onDozeAmountChanged(float linear, float eased) {}
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ import android.widget.ImageView;

import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.NotificationPanelView;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;

import java.util.function.Consumer;

@@ -63,13 +63,14 @@ public class NotificationDozeHelper {
        }
    }

    // TODO: this should be using StatusBarStateController#getDozeAmount
    public void startIntensityAnimation(ValueAnimator.AnimatorUpdateListener updateListener,
            boolean dark, long delay, Animator.AnimatorListener listener) {
        float startIntensity = dark ? 0f : 1f;
        float endIntensity = dark ? 1f : 0f;
        ValueAnimator animator = ValueAnimator.ofFloat(startIntensity, endIntensity);
        animator.addUpdateListener(updateListener);
        animator.setDuration(NotificationPanelView.DOZE_ANIMATION_DURATION);
        animator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
        animator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
        animator.setStartDelay(delay);
        if (listener != null) {
+0 −10
Original line number Diff line number Diff line
@@ -4398,16 +4398,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
        }
    }

    @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
    public long getDarkAnimationDuration(boolean dark) {
        long duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
        // Longer animation when sleeping with more than 1 notification
        if (dark && getNotGoneChildCount() > 2) {
            duration *= 1.2f;
        }
        return duration;
    }

    @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
    private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) {
        if (screenLocation == null || screenLocation.y < mTopPadding) {
+15 −61
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.ActivityManager;
import android.app.Fragment;
@@ -41,7 +40,6 @@ import android.graphics.Rect;
import android.os.PowerManager;
import android.os.SystemProperties;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Log;
import android.util.MathUtils;
import android.view.LayoutInflater;
@@ -51,7 +49,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;

import com.android.internal.logging.MetricsLogger;
@@ -104,7 +101,7 @@ public class NotificationPanelView extends PanelView implements
        View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
        KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener,
        OnHeadsUpChangedListener, QS.HeightListener, ZenModeController.Callback,
        ConfigurationController.ConfigurationListener {
        ConfigurationController.ConfigurationListener, StateListener {

    private static final boolean DEBUG = false;

@@ -139,25 +136,9 @@ public class NotificationPanelView extends PanelView implements

    private static final Rect mDummyDirtyRect = new Rect(0, 0, 1, 1);

    public static final long DOZE_ANIMATION_DURATION = 700;

    private static final AnimationProperties CLOCK_ANIMATION_PROPERTIES = new AnimationProperties()
            .setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
    private static final FloatProperty<NotificationPanelView> SET_DARK_AMOUNT_PROPERTY =
            new FloatProperty<NotificationPanelView>("mInterpolatedDarkAmount") {

                @Override
                public void setValue(NotificationPanelView object, float value) {
                    object.setDarkAmount(value, object.mDarkInterpolator.getInterpolation(value));
                }

                @Override
                public Float get(NotificationPanelView object) {
                    return object.mLinearDarkAmount;
                }
            };

    private Interpolator mDarkInterpolator;
    private final PowerManager mPowerManager;
    private final AccessibilityManager mAccessibilityManager;

@@ -295,11 +276,9 @@ public class NotificationPanelView extends PanelView implements
     */
    private boolean mSemiAwake;

    private float mDarkAmountTarget;
    private boolean mPulsing;
    private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
    private boolean mNoVisibleNotifications = true;
    private ValueAnimator mDarkAnimator;
    private boolean mUserSetupComplete;
    private int mQsNotificationTopPadding;
    private float mExpandOffset;
@@ -339,7 +318,6 @@ public class NotificationPanelView extends PanelView implements
    private final NotificationEntryManager mEntryManager =
            Dependency.get(NotificationEntryManager.class);

    private final StateListener mListener = this::setBarState;
    private final CommandQueue mCommandQueue;
    private final NotificationLockscreenUserManager mLockscreenUserManager =
            Dependency.get(NotificationLockscreenUserManager.class);
@@ -388,7 +366,7 @@ public class NotificationPanelView extends PanelView implements
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        FragmentHostManager.get(this).addTagListener(QS.TAG, mFragmentListener);
        Dependency.get(StatusBarStateController.class).addListener(mListener);
        Dependency.get(StatusBarStateController.class).addListener(this);
        Dependency.get(ZenModeController.class).addCallback(this);
        Dependency.get(ConfigurationController.class).addCallback(this);
    }
@@ -397,7 +375,7 @@ public class NotificationPanelView extends PanelView implements
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        FragmentHostManager.get(this).removeTagListener(QS.TAG, mFragmentListener);
        Dependency.get(StatusBarStateController.class).removeListener(mListener);
        Dependency.get(StatusBarStateController.class).removeListener(this);
        Dependency.get(ZenModeController.class).removeCallback(this);
        Dependency.get(ConfigurationController.class).removeCallback(this);
    }
@@ -475,7 +453,8 @@ public class NotificationPanelView extends PanelView implements
        mKeyguardBottomArea.initFrom(oldBottomArea);
        addView(mKeyguardBottomArea, index);
        initBottomArea();
        setDarkAmount(mLinearDarkAmount, mInterpolatedDarkAmount);
        onDozeAmountChanged(mStatusBarStateController.getDozeAmount(),
                mStatusBarStateController.getInterpolatedDozeAmount());

        if (mKeyguardStatusBar != null) {
            mKeyguardStatusBar.onThemeChanged();
@@ -1221,7 +1200,8 @@ public class NotificationPanelView extends PanelView implements
        }
    }

    private void setBarState(int statusBarState) {
    @Override
    public void onStateChanged(int statusBarState) {
        boolean goingToFullShade = mStatusBarStateController.goingToFullShade();
        boolean keyguardFadingAway = mKeyguardMonitor.isKeyguardFadingAway();
        int oldState = mBarState;
@@ -2806,24 +2786,10 @@ public class NotificationPanelView extends PanelView implements
            updateDozingVisibilities(animate);
        }

        final float darkAmount = dozing ? 1 : 0;
        if (mDarkAnimator != null && mDarkAnimator.isRunning()) {
            if (animate && mDarkAmountTarget == darkAmount) {
                return;
            } else {
                mDarkAnimator.cancel();
            }
            if (mSemiAwake) {
                setDarkAmount(0, 0);
            }
        }
        mDarkAmountTarget = darkAmount;
        if (!mSemiAwake) {
        final float darkAmount = dozing && !mSemiAwake ? 1 : 0;
        mStatusBarStateController.setDozeAmount(darkAmount, animate);
        if (animate) {
                startDarkAnimation();
            } else {
                setDarkAmount(darkAmount, darkAmount);
            }
            mNotificationStackScroller.notifyDarkAnimationStart(mDozing);
        }
    }

@@ -2831,21 +2797,8 @@ public class NotificationPanelView extends PanelView implements
        return mSemiAwake;
    }

    private void startDarkAnimation() {
        if (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f) {
            mDarkInterpolator = mDozing
                    ? Interpolators.FAST_OUT_SLOW_IN
                    : Interpolators.TOUCH_RESPONSE_REVERSE;
        }
        mNotificationStackScroller.notifyDarkAnimationStart(mDozing);
        mDarkAnimator = ObjectAnimator.ofFloat(this, SET_DARK_AMOUNT_PROPERTY, mDozing ? 1 : 0);
        mDarkAnimator.setInterpolator(Interpolators.LINEAR);
        mDarkAnimator.setDuration(
                mNotificationStackScroller.getDarkAnimationDuration(mDozing));
        mDarkAnimator.start();
    }

    private void setDarkAmount(float linearAmount, float amount) {
    @Override
    public void onDozeAmountChanged(float linearAmount, float amount) {
        mInterpolatedDarkAmount = amount;
        mLinearDarkAmount = linearAmount;
        mKeyguardStatusBar.setDarkAmount(mInterpolatedDarkAmount);
@@ -3047,7 +3000,8 @@ public class NotificationPanelView extends PanelView implements
            mSemiAwake = false;
            mNotificationStackScroller.setDark(false /* dark */, true /* animate */,
                    null /* touchLocation */);
            startDarkAnimation();
            mStatusBarStateController.setDozeAmount(0f, true /* animated */);
            mNotificationStackScroller.notifyDarkAnimationStart(mDozing);
            mStatusBar.updateScrimController();

            return WAKE_UP_TO_SHADE;