1ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/*
2ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi *
4ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * you may not use this file except in compliance with the License.
6ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * You may obtain a copy of the License at
7ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi *
8ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi *
10ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
11ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * See the License for the specific language governing permissions and
14ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * limitations under the License
15ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */
16ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
17ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggipackage com.android.systemui.statusbar.phone;
18ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
19ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.animation.Animator;
20ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.animation.AnimatorListenerAdapter;
21aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport android.animation.PropertyValuesHolder;
22ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.animation.ValueAnimator;
23d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlockimport android.content.Context;
24ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.graphics.Color;
256811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinekimport android.graphics.Rect;
26ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.View;
27e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinekimport android.view.ViewGroup;
28ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.ViewTreeObserver;
29ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.DecelerateInterpolator;
30ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.Interpolator;
310d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggiimport android.view.animation.PathInterpolator;
32ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
33e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggiimport com.android.keyguard.KeyguardUpdateMonitor;
34bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport com.android.systemui.R;
35aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow;
36aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.NotificationData;
37a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport com.android.systemui.statusbar.ScrimView;
38aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
39aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.stack.StackStateAnimator;
40bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
41ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/**
42ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Controls both the scrim behind the notifications and in front of the notifications (when a
43ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * security method gets shown).
44ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */
45aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekpublic class ScrimController implements ViewTreeObserver.OnPreDrawListener,
46aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        HeadsUpManager.OnHeadsUpChangedListener {
478b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock    public static final long ANIMATION_DURATION = 220;
4883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR
4983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            = new PathInterpolator(0f, 0, 0.7f, 1f);
50e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR_LOCKED
51e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            = new PathInterpolator(0.3f, 0f, 0.8f, 1f);
52ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private static final float SCRIM_BEHIND_ALPHA = 0.62f;
53e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    protected static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f;
54e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    protected static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f;
55ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private static final float SCRIM_IN_FRONT_ALPHA = 0.75f;
56e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    private static final float SCRIM_IN_FRONT_ALPHA_LOCKED = 0.85f;
57bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    private static final int TAG_KEY_ANIM = R.id.scrim;
5883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;
595104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private static final int TAG_START_ALPHA = R.id.scrim_alpha_start;
605104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private static final int TAG_END_ALPHA = R.id.scrim_alpha_end;
61bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
625da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected final ScrimView mScrimBehind;
63a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final ScrimView mScrimInFront;
64ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final UnlockMethodCache mUnlockMethodCache;
65aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private final View mHeadsUpScrim;
66e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
67ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
684dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlpha = SCRIM_BEHIND_ALPHA;
694dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;
704dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING;
714dab4b504896d785da840484af41779bb9692b6fXiaohui Chen
725da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected boolean mKeyguardShowing;
73ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private float mFraction;
74ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
75ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mDarkenWhileDragging;
765da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected boolean mBouncerShowing;
770d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mWakeAndUnlocking;
78ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mAnimateChange;
79ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mUpdatePending;
802fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    private boolean mExpanding;
81e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private boolean mAnimateKeyguardFadingOut;
82e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mDurationOverride = -1;
83e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mAnimationDelay;
84e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private Runnable mOnAnimationFinished;
85ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final Interpolator mInterpolator = new DecelerateInterpolator();
86048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private boolean mDozing;
87048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeInFrontAlpha;
88048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeBehindAlpha;
89048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentInFrontAlpha;
90048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentBehindAlpha;
91aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mCurrentHeadsUpAlpha = 1;
92684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    private int mPinnedHeadsUpCount;
93aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mTopHeadsUpDragAmount;
94aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private View mDraggedHeadsUpView;
9537c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    private boolean mForceHideScrims;
96ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    private boolean mSkipFirstFrame;
97372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    private boolean mDontAnimateBouncerChanges;
985f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos    private boolean mKeyguardFadingOutInProgress;
993281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek    private ValueAnimator mKeyguardFadeoutAnimation;
100ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
101255032591826a8a0373505a163d5c96d681541cfSelim Cinek    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim) {
102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind = scrimBehind;
103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimInFront = scrimInFront;
104aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mHeadsUpScrim = headsUpScrim;
105d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        final Context context = scrimBehind.getContext();
106d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
107e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
108aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
109ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
110ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
111ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
112ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mKeyguardShowing = showing;
113ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
114ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
115ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1164dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    public void setShowScrimBehind(boolean show) {
1174dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        if (show) {
1184dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlpha = SCRIM_BEHIND_ALPHA;
1194dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;
1204dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING;
1214dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        } else {
1224dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlpha = 0;
1234dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaKeyguard = 0;
1244dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaUnlocking = 0;
1254dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        }
1264dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        scheduleUpdate();
1274dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    }
1284dab4b504896d785da840484af41779bb9692b6fXiaohui Chen
129e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    protected void setScrimBehindValues(float scrimBehindAlphaKeyguard,
130e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi            float scrimBehindAlphaUnlocking) {
131e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi        mScrimBehindAlphaKeyguard = scrimBehindAlphaKeyguard;
132e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi        mScrimBehindAlphaUnlocking = scrimBehindAlphaUnlocking;
133e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi        scheduleUpdate();
134e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    }
135e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi
136ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void onTrackingStarted() {
1372fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = true;
138e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek        mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
139ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
140ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1412fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
1422fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = false;
1432fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
1442fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
145ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setPanelExpansion(float fraction) {
14693439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        if (mFraction != fraction) {
14793439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            mFraction = fraction;
14893439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            scheduleUpdate();
149131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            if (mPinnedHeadsUpCount != 0) {
150131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek                updateHeadsUpScrim(false);
151131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            }
1523281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek            if (mKeyguardFadeoutAnimation != null) {
1533281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek                mKeyguardFadeoutAnimation.cancel();
1543281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek            }
15593439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        }
156ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
157ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
158ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setBouncerShowing(boolean showing) {
159ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mBouncerShowing = showing;
160372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mAnimateChange = !mExpanding && !mDontAnimateBouncerChanges;
161ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
162ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
163ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1640d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void setWakeAndUnlocking() {
1650d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = true;
1660d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        scheduleUpdate();
1670d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
1680d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
169ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished,
170ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            boolean skipFirstFrame) {
1710d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = false;
172e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateKeyguardFadingOut = true;
173e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = duration;
174e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = delay;
175e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateChange = true;
176ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = skipFirstFrame;
177e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mOnAnimationFinished = onAnimationFinished;
178ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi
179031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi        if (!mKeyguardUpdateMonitor.needsSlowUnlockTransition()) {
180e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            scheduleUpdate();
181e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi
182e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            // No need to wait for the next frame to be drawn for this case - onPreDraw will execute
183e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            // the changes we just scheduled.
184e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            onPreDraw();
185e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        } else {
186e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi
187e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            // In case the user isn't unlocked, make sure to delay a bit because the system is hosed
188e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            // with too many things in this case, in order to not skip the initial frames.
189e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            mScrimInFront.postOnAnimationDelayed(this::scheduleUpdate, 16);
190e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        }
191e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
192e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
193edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    public void abortKeyguardFadingOut() {
194edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        if (mAnimateKeyguardFadingOut) {
19583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            endAnimateKeyguardFadingOut(true /* force */);
196edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        }
197edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
198edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
1996626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi    public void animateKeyguardUnoccluding(long duration) {
2006626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        mAnimateChange = false;
2016626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        setScrimBehindColor(0f);
2026626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        mAnimateChange = true;
2036626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        scheduleUpdate();
2046626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        mDurationOverride = duration;
2056626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi    }
2066626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi
207dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    public void animateGoingToFullShade(long delay, long duration) {
208dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mDurationOverride = duration;
209dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimationDelay = delay;
210dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimateChange = true;
211dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        scheduleUpdate();
212dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    }
213dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi
2145104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    public void animateNextChange() {
2155104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        mAnimateChange = true;
2165104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    }
2175104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek
218048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozing(boolean dozing) {
2190d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (mDozing != dozing) {
2200d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mDozing = dozing;
2210d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            scheduleUpdate();
2220d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
223bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
224bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
225048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeInFrontAlpha(float alpha) {
226048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeInFrontAlpha = alpha;
227048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimInFront);
228d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock    }
229d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock
230048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeBehindAlpha(float alpha) {
231048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeBehindAlpha = alpha;
232048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimBehind);
233bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
234bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
235048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeBehindAlpha() {
236048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeBehindAlpha;
2374d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown    }
2384d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown
239048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeInFrontAlpha() {
240048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeInFrontAlpha;
241bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
242bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
243e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    private float getScrimInFrontAlpha() {
244031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi        return mKeyguardUpdateMonitor.needsSlowUnlockTransition()
245031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi                ? SCRIM_IN_FRONT_ALPHA_LOCKED
246031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi                : SCRIM_IN_FRONT_ALPHA;
247e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    }
248ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void scheduleUpdate() {
249ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mUpdatePending) return;
250e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
251e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that a frame gets scheduled.
252e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mScrimBehind.invalidate();
253ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this);
254ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = true;
255ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
256ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
2575da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected void updateScrims() {
25837c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        if (mAnimateKeyguardFadingOut || mForceHideScrims) {
259baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimInFrontColor(0f);
260baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimBehindColor(0f);
2610d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        } else if (mWakeAndUnlocking) {
2620d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
2630d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // During wake and unlock, we first hide everything behind a black scrim, which then
2640d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // gets faded out from animateKeyguardFadingOut.
26583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            if (mDozing) {
26683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(0f);
26783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(1f);
26883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            } else {
26983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(1f);
27083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(0f);
27183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            }
2728b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock        } else if (!mKeyguardShowing && !mBouncerShowing) {
273ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimNormal();
274ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0);
275ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
276ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimKeyguard();
277ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
278ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mAnimateChange = false;
279ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
280ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
281ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimKeyguard() {
2822fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        if (mExpanding && mDarkenWhileDragging) {
283ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float behindFraction = Math.max(0, Math.min(mFraction, 1));
284ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float fraction = 1 - behindFraction;
28576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            fraction = (float) Math.pow(fraction, 0.8f);
28676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            behindFraction = (float) Math.pow(behindFraction, 0.8f);
287e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            setScrimInFrontColor(fraction * getScrimInFrontAlpha());
2884dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            setScrimBehindColor(behindFraction * mScrimBehindAlphaKeyguard);
2892fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        } else if (mBouncerShowing) {
290e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            setScrimInFrontColor(getScrimInFrontAlpha());
2912fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimBehindColor(0f);
292ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
29376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            float fraction = Math.max(0, Math.min(mFraction, 1));
294ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0f);
29576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            setScrimBehindColor(fraction
2964dab4b504896d785da840484af41779bb9692b6fXiaohui Chen                    * (mScrimBehindAlphaKeyguard - mScrimBehindAlphaUnlocking)
2974dab4b504896d785da840484af41779bb9692b6fXiaohui Chen                    + mScrimBehindAlphaUnlocking);
298ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
299ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
300ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
301ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimNormal() {
302ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        float frac = mFraction;
303ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        // let's start this 20% of the way down the screen
304ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        frac = frac * 1.2f - 0.2f;
305ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (frac <= 0) {
306ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(0);
307ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
308ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            // woo, special effects
309ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
3104dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            setScrimBehindColor(k * mScrimBehindAlpha);
311ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
312ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
313ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
314ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimBehindColor(float alpha) {
315ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimBehind, alpha);
316ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
317ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
318ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimInFrontColor(float alpha) {
319ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimInFront, alpha);
320ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (alpha == 0f) {
321ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimInFront.setClickable(false);
322ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
323ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
3248b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // Eat touch events (unless dozing).
3258b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            mScrimInFront.setClickable(!mDozing);
326ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
327ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
328ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
329aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void setScrimColor(View scrim, float alpha) {
3305104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        updateScrim(mAnimateChange, scrim, alpha, getCurrentScrimAlpha(scrim));
331ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
332ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
333048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getDozeAlpha(View scrim) {
334048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha;
335048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
336048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
337048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getCurrentScrimAlpha(View scrim) {
338aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        return scrim == mScrimBehind ? mCurrentBehindAlpha
339aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : scrim == mScrimInFront ? mCurrentInFrontAlpha
340aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : mCurrentHeadsUpAlpha;
341048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
342048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
343048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private void setCurrentScrimAlpha(View scrim, float alpha) {
344048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        if (scrim == mScrimBehind) {
345048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentBehindAlpha = alpha;
346aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else if (scrim == mScrimInFront) {
347048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentInFrontAlpha = alpha;
348aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
349aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            alpha = Math.max(0.0f, Math.min(1.0f, alpha));
350aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            mCurrentHeadsUpAlpha = alpha;
351ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
352048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
353048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
354aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateScrimColor(View scrim) {
355048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float alpha1 = getCurrentScrimAlpha(scrim);
356aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (scrim instanceof ScrimView) {
357aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha2 = getDozeAlpha(scrim);
358aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha = 1 - (1 - alpha1) * (1 - alpha2);
359b5d6687c56ad7a219849af3aa10a9bb5acc9dbf5Selim Cinek            alpha = Math.max(0, Math.min(1.0f, alpha));
360aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0));
361aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
362aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            scrim.setAlpha(alpha1);
363aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
364048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
365048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
366aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void startScrimAnimation(final View scrim, float target) {
367048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float current = getCurrentScrimAlpha(scrim);
368048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        ValueAnimator anim = ValueAnimator.ofFloat(current, target);
369ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
370ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            @Override
371ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
372048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                float alpha = (float) animation.getAnimatedValue();
373048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                setCurrentScrimAlpha(scrim, alpha);
374048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                updateScrimColor(scrim);
375ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            }
376ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        });
37716423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi        anim.setInterpolator(getInterpolator());
378e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setStartDelay(mAnimationDelay);
379e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION);
380e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.addListener(new AnimatorListenerAdapter() {
381e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            @Override
382e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            public void onAnimationEnd(Animator animation) {
383e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                if (mOnAnimationFinished != null) {
384e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished.run();
385e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished = null;
386e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                }
3873281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek                if (mKeyguardFadingOutInProgress) {
3883281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek                    mKeyguardFadeoutAnimation = null;
3893281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek                    mKeyguardFadingOutInProgress = false;
3903281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek                }
391bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock                scrim.setTag(TAG_KEY_ANIM, null);
39283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                scrim.setTag(TAG_KEY_ANIM_TARGET, null);
393e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            }
394e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        });
395ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.start();
3965f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        if (mAnimateKeyguardFadingOut) {
3975f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            mKeyguardFadingOutInProgress = true;
3983281fe22a12d5f3a34520eda277705f31dcf8060Selim Cinek            mKeyguardFadeoutAnimation = anim;
3995f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        }
400ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        if (mSkipFirstFrame) {
401ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            anim.setCurrentPlayTime(16);
402ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        }
403bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        scrim.setTag(TAG_KEY_ANIM, anim);
40483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        scrim.setTag(TAG_KEY_ANIM_TARGET, target);
405ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
406ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
40716423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    private Interpolator getInterpolator() {
408031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi        if (mAnimateKeyguardFadingOut && mKeyguardUpdateMonitor.needsSlowUnlockTransition()) {
409e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            return KEYGUARD_FADE_OUT_INTERPOLATOR_LOCKED;
410e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        } else if (mAnimateKeyguardFadingOut) {
411e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            return KEYGUARD_FADE_OUT_INTERPOLATOR;
412e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        } else {
413e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi            return mInterpolator;
414e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        }
41516423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    }
41616423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi
417ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    @Override
418ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public boolean onPreDraw() {
419ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this);
420ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = false;
421372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        if (mDontAnimateBouncerChanges) {
422372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek            mDontAnimateBouncerChanges = false;
423372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        }
424ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        updateScrims();
425e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = -1;
426e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = 0;
427ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = false;
428e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
429e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that we always call the listener even if we didn't start an animation.
43083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        endAnimateKeyguardFadingOut(false /* force */);
431edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        return true;
432edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
433edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
43483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void endAnimateKeyguardFadingOut(boolean force) {
435edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        mAnimateKeyguardFadingOut = false;
436ca59dc0df59c16d22f9c5ea0f1d2fc79f6b92c6cSelim Cinek        if (force || (!isAnimating(mScrimInFront) && !isAnimating(mScrimBehind))) {
437ca59dc0df59c16d22f9c5ea0f1d2fc79f6b92c6cSelim Cinek            if (mOnAnimationFinished != null) {
438ca59dc0df59c16d22f9c5ea0f1d2fc79f6b92c6cSelim Cinek                mOnAnimationFinished.run();
439ca59dc0df59c16d22f9c5ea0f1d2fc79f6b92c6cSelim Cinek                mOnAnimationFinished = null;
440ca59dc0df59c16d22f9c5ea0f1d2fc79f6b92c6cSelim Cinek            }
4415f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            mKeyguardFadingOutInProgress = false;
442e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
443ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
444bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
44583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private boolean isAnimating(View scrim) {
44683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        return scrim.getTag(TAG_KEY_ANIM) != null;
44783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
44883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
449255032591826a8a0373505a163d5c96d681541cfSelim Cinek    public void setDrawBehindAsSrc(boolean asSrc) {
450a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mScrimBehind.setDrawAsSrc(asSrc);
451a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
452aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
453aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
454b349af573121cc659d775696066a13ed7101c308John Spurlock    public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
455aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
456aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
457aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
458684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
459684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount++;
460684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        updateHeadsUpScrim(true);
461684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    }
462684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
463684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    @Override
464684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
465684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount--;
466684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (headsUp == mDraggedHeadsUpView) {
467684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mDraggedHeadsUpView = null;
468684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mTopHeadsUpDragAmount = 0.0f;
469aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
470aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(true);
471aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
472aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
473aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
474684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
475aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
476aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
477aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateHeadsUpScrim(boolean animate) {
4785104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        updateScrim(animate, mHeadsUpScrim, calculateHeadsUpAlpha(), mCurrentHeadsUpAlpha);
4795104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    }
4805104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek
4815104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private void updateScrim(boolean animate, View scrim, float alpha, float currentAlpha) {
4825f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        if (mKeyguardFadingOutInProgress) {
4835f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            return;
4845f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        }
4855f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos
4865104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        ValueAnimator previousAnimator = StackStateAnimator.getChildTag(scrim,
487aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                TAG_KEY_ANIM);
488aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float animEndValue = -1;
489aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (previousAnimator != null) {
4905104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek            if (animate || alpha == currentAlpha) {
491aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                previousAnimator.cancel();
492737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek            } else {
4935104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                animEndValue = StackStateAnimator.getChildTag(scrim, TAG_END_ALPHA);
494aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
495aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
4965104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        if (alpha != currentAlpha && alpha != animEndValue) {
497aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            if (animate) {
4985104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                startScrimAnimation(scrim, alpha);
4995104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                scrim.setTag(TAG_START_ALPHA, currentAlpha);
5005104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                scrim.setTag(TAG_END_ALPHA, alpha);
501aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            } else {
502aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                if (previousAnimator != null) {
5035104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    float previousStartValue = StackStateAnimator.getChildTag(scrim,
5045104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                            TAG_START_ALPHA);
5055104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    float previousEndValue = StackStateAnimator.getChildTag(scrim,
5065104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                            TAG_END_ALPHA);
507aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // we need to increase all animation keyframes of the previous animator by the
508aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // relative change to the end value
509aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    PropertyValuesHolder[] values = previousAnimator.getValues();
510aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float relativeDiff = alpha - previousEndValue;
511aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float newStartValue = previousStartValue + relativeDiff;
512b5d6687c56ad7a219849af3aa10a9bb5acc9dbf5Selim Cinek                    newStartValue = Math.max(0, Math.min(1.0f, newStartValue));
513aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    values[0].setFloatValues(newStartValue, alpha);
5145104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    scrim.setTag(TAG_START_ALPHA, newStartValue);
5155104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    scrim.setTag(TAG_END_ALPHA, alpha);
516aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime());
517aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                } else {
518aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // update the alpha directly
5195104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    setCurrentScrimAlpha(scrim, alpha);
5205104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    updateScrimColor(scrim);
521aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                }
522aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
523aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
524aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
525aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
526684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
527684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means
528684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the heads up is in its resting space and 1 means it's fully dragged out.
529684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
530684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param draggedHeadsUpView the dragged view
531684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param topHeadsUpDragAmount how far is it dragged
532684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
533aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) {
534aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mTopHeadsUpDragAmount = topHeadsUpDragAmount;
535aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mDraggedHeadsUpView = draggedHeadsUpView;
536aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
537aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
538aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
539aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float calculateHeadsUpAlpha() {
540131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float alpha;
541684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (mPinnedHeadsUpCount >= 2) {
542131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f;
543684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        } else if (mPinnedHeadsUpCount == 0) {
544131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 0.0f;
545aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
546131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f - mTopHeadsUpDragAmount;
547aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
548131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float expandFactor = (1.0f - mFraction);
549131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        expandFactor = Math.max(expandFactor, 0.0f);
550131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        return alpha * expandFactor;
551aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
55237c110fa14aed2bb54f685f3855feb30000322faSelim Cinek
55337c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    public void forceHideScrims(boolean hide) {
55437c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mForceHideScrims = hide;
55537c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mAnimateChange = false;
55637c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        scheduleUpdate();
55737c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    }
558372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek
559372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    public void dontAnimateBouncerChangesUntilNextFrame() {
560372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mDontAnimateBouncerChanges = true;
561372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    }
5626811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek
5636811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek    public void setExcludedBackgroundArea(Rect area) {
5646811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek        mScrimBehind.setExcludedArea(area);
5656811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek    }
566d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek
56785d202b18ada8dc95f151087ab9778d1a31f7a30Adrian Roos    public void setLeftInset(int inset) {
56885d202b18ada8dc95f151087ab9778d1a31f7a30Adrian Roos        mScrimBehind.setLeftInset(inset);
56985d202b18ada8dc95f151087ab9778d1a31f7a30Adrian Roos    }
57085d202b18ada8dc95f151087ab9778d1a31f7a30Adrian Roos
571d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    public int getScrimBehindColor() {
572d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek        return mScrimBehind.getScrimColorWithAlpha();
573d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    }
574d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek
575d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    public void setScrimBehindChangeRunnable(Runnable changeRunnable) {
576d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek        mScrimBehind.setChangeRunnable(changeRunnable);
577d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    }
578e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek
5793e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek    public void onDensityOrFontScaleChanged() {
580e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        ViewGroup.LayoutParams layoutParams = mHeadsUpScrim.getLayoutParams();
581e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        layoutParams.height = mHeadsUpScrim.getResources().getDimensionPixelSize(
582e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek                R.dimen.heads_up_scrim_height);
583e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        mHeadsUpScrim.setLayoutParams(layoutParams);
584e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek    }
585e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi
586e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    public void setCurrentUser(int currentUser) {
587e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi        // Don't care in the base class.
588e31f6b8024d1a0cfa71894e9a8ce1b39a9f85b2fJorim Jaggi    }
589ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi}
590