ScrimController.java revision 372d1bdd54fe977c71bdaae895687c76ac35202a
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;
25ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.View;
26ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.ViewTreeObserver;
27ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.DecelerateInterpolator;
28ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.Interpolator;
290d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggiimport android.view.animation.PathInterpolator;
30ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
31bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport com.android.systemui.R;
32a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport com.android.systemui.statusbar.BackDropView;
33aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow;
34aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.NotificationData;
35a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport com.android.systemui.statusbar.ScrimView;
36aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
37aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.stack.StackStateAnimator;
38bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
39ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/**
40ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Controls both the scrim behind the notifications and in front of the notifications (when a
41ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * security method gets shown).
42ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */
43aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekpublic class ScrimController implements ViewTreeObserver.OnPreDrawListener,
44aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        HeadsUpManager.OnHeadsUpChangedListener {
458b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock    public static final long ANIMATION_DURATION = 220;
4683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR
4783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            = new PathInterpolator(0f, 0, 0.7f, 1f);
488b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock
49ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private static final float SCRIM_BEHIND_ALPHA = 0.62f;
50e5716222a1a11922267193d5815fb083fc4e11d3Jorim Jaggi    private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f;
5176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f;
52ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private static final float SCRIM_IN_FRONT_ALPHA = 0.75f;
53bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    private static final int TAG_KEY_ANIM = R.id.scrim;
5483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;
55aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private static final int TAG_HUN_START_ALPHA = R.id.hun_scrim_alpha_start;
56aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private static final int TAG_HUN_END_ALPHA = R.id.hun_scrim_alpha_end;
57bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
58a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final ScrimView mScrimBehind;
59a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final ScrimView mScrimInFront;
60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final UnlockMethodCache mUnlockMethodCache;
61aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private final View mHeadsUpScrim;
62ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
63ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mKeyguardShowing;
64ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private float mFraction;
65ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
66ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mDarkenWhileDragging;
67ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mBouncerShowing;
680d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mWakeAndUnlocking;
69ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mAnimateChange;
70ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mUpdatePending;
712fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    private boolean mExpanding;
72e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private boolean mAnimateKeyguardFadingOut;
73e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mDurationOverride = -1;
74e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mAnimationDelay;
75e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private Runnable mOnAnimationFinished;
76ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final Interpolator mInterpolator = new DecelerateInterpolator();
77a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private BackDropView mBackDropView;
780e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi    private boolean mScrimSrcEnabled;
79048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private boolean mDozing;
80048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeInFrontAlpha;
81048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeBehindAlpha;
82048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentInFrontAlpha;
83048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentBehindAlpha;
84aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mCurrentHeadsUpAlpha = 1;
85684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    private int mPinnedHeadsUpCount;
86aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mTopHeadsUpDragAmount;
87aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private View mDraggedHeadsUpView;
8837c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    private boolean mForceHideScrims;
89ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    private boolean mSkipFirstFrame;
90372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    private boolean mDontAnimateBouncerChanges;
91ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
92aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
93aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            boolean scrimSrcEnabled) {
94ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind = scrimBehind;
95ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimInFront = scrimInFront;
96aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mHeadsUpScrim = headsUpScrim;
97d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        final Context context = scrimBehind.getContext();
98d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
990e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        mScrimSrcEnabled = scrimSrcEnabled;
100aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
101ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mKeyguardShowing = showing;
105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
106ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
107ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
108ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void onTrackingStarted() {
1092fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = true;
110e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek        mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
111ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
112ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1132fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
1142fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = false;
1152fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
1162fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
117ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setPanelExpansion(float fraction) {
11893439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        if (mFraction != fraction) {
11993439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            mFraction = fraction;
12093439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            scheduleUpdate();
121131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            if (mPinnedHeadsUpCount != 0) {
122131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek                updateHeadsUpScrim(false);
123131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            }
12493439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        }
125ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
126ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
127ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setBouncerShowing(boolean showing) {
128ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mBouncerShowing = showing;
129372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mAnimateChange = !mExpanding && !mDontAnimateBouncerChanges;
130ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
131ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
132ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1330d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void setWakeAndUnlocking() {
1340d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = true;
1350d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        scheduleUpdate();
1360d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
1370d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
138ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished,
139ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            boolean skipFirstFrame) {
1400d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = false;
141e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateKeyguardFadingOut = true;
142e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = duration;
143e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = delay;
144e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateChange = true;
145ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = skipFirstFrame;
146e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mOnAnimationFinished = onAnimationFinished;
147e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        scheduleUpdate();
148ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi
149ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        // No need to wait for the next frame to be drawn for this case - onPreDraw will execute
150ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        // the changes we just scheduled.
151ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        onPreDraw();
152e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
153e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
154edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    public void abortKeyguardFadingOut() {
155edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        if (mAnimateKeyguardFadingOut) {
15683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            endAnimateKeyguardFadingOut(true /* force */);
157edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        }
158edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
159edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
160dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    public void animateGoingToFullShade(long delay, long duration) {
161dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mDurationOverride = duration;
162dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimationDelay = delay;
163dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimateChange = true;
164dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        scheduleUpdate();
165dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    }
166dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi
167048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozing(boolean dozing) {
1680d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (mDozing != dozing) {
1690d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mDozing = dozing;
1700d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            scheduleUpdate();
1710d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
172bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
173bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
174048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeInFrontAlpha(float alpha) {
175048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeInFrontAlpha = alpha;
176048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimInFront);
177d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock    }
178d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock
179048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeBehindAlpha(float alpha) {
180048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeBehindAlpha = alpha;
181048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimBehind);
182bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
183bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
184048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeBehindAlpha() {
185048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeBehindAlpha;
1864d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown    }
1874d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown
188048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeInFrontAlpha() {
189048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeInFrontAlpha;
190bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
191bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
192ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void scheduleUpdate() {
193ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mUpdatePending) return;
194e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
195e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that a frame gets scheduled.
196e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mScrimBehind.invalidate();
197ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this);
198ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = true;
199ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
200ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
201ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrims() {
20237c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        if (mAnimateKeyguardFadingOut || mForceHideScrims) {
203baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimInFrontColor(0f);
204baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimBehindColor(0f);
2050d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        } else if (mWakeAndUnlocking) {
2060d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
2070d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // During wake and unlock, we first hide everything behind a black scrim, which then
2080d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // gets faded out from animateKeyguardFadingOut.
20983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            if (mDozing) {
21083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(0f);
21183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(1f);
21283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            } else {
21383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(1f);
21483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(0f);
21583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            }
2168b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock        } else if (!mKeyguardShowing && !mBouncerShowing) {
217ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimNormal();
218ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0);
219ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
220ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimKeyguard();
221ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
222ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mAnimateChange = false;
223ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
224ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
225ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimKeyguard() {
2262fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        if (mExpanding && mDarkenWhileDragging) {
227ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float behindFraction = Math.max(0, Math.min(mFraction, 1));
228ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float fraction = 1 - behindFraction;
22976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            fraction = (float) Math.pow(fraction, 0.8f);
23076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            behindFraction = (float) Math.pow(behindFraction, 0.8f);
231ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA);
232ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(behindFraction * SCRIM_BEHIND_ALPHA_KEYGUARD);
2332fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        } else if (mBouncerShowing) {
2342fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA);
2352fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimBehindColor(0f);
236ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
23776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            float fraction = Math.max(0, Math.min(mFraction, 1));
238ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0f);
23976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            setScrimBehindColor(fraction
24076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    * (SCRIM_BEHIND_ALPHA_KEYGUARD - SCRIM_BEHIND_ALPHA_UNLOCKING)
24176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    + SCRIM_BEHIND_ALPHA_UNLOCKING);
242ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
243ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
244ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
245ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimNormal() {
246ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        float frac = mFraction;
247ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        // let's start this 20% of the way down the screen
248ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        frac = frac * 1.2f - 0.2f;
249ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (frac <= 0) {
250ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(0);
251ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
252ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            // woo, special effects
253ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
254ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(k * SCRIM_BEHIND_ALPHA);
255ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
256ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
257ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
258ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimBehindColor(float alpha) {
259ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimBehind, alpha);
260ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
261ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
262ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimInFrontColor(float alpha) {
263ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimInFront, alpha);
264ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (alpha == 0f) {
265ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimInFront.setClickable(false);
266ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
267ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
2688b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // Eat touch events (unless dozing).
2698b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            mScrimInFront.setClickable(!mDozing);
270ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
271ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
272ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
273aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void setScrimColor(View scrim, float alpha) {
27483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        ValueAnimator runningAnim = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM);
27583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        Float target = (Float) scrim.getTag(TAG_KEY_ANIM_TARGET);
27683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if (runningAnim != null && target != null) {
27783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            if (alpha != target) {
27883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                runningAnim.cancel();
27983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            } else {
28083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                return;
28183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            }
2825e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi        }
283ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mAnimateChange) {
284048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            startScrimAnimation(scrim, alpha);
285ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
286048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            setCurrentScrimAlpha(scrim, alpha);
287048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            updateScrimColor(scrim);
288ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
289ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
290ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
291048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getDozeAlpha(View scrim) {
292048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha;
293048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
294048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
295048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getCurrentScrimAlpha(View scrim) {
296aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        return scrim == mScrimBehind ? mCurrentBehindAlpha
297aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : scrim == mScrimInFront ? mCurrentInFrontAlpha
298aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : mCurrentHeadsUpAlpha;
299048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
300048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
301048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private void setCurrentScrimAlpha(View scrim, float alpha) {
302048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        if (scrim == mScrimBehind) {
303048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentBehindAlpha = alpha;
304aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else if (scrim == mScrimInFront) {
305048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentInFrontAlpha = alpha;
306aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
307aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            alpha = Math.max(0.0f, Math.min(1.0f, alpha));
308aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            mCurrentHeadsUpAlpha = alpha;
309ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
310048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
311048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
312aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateScrimColor(View scrim) {
313048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float alpha1 = getCurrentScrimAlpha(scrim);
314aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (scrim instanceof ScrimView) {
315aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha2 = getDozeAlpha(scrim);
316aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha = 1 - (1 - alpha1) * (1 - alpha2);
317aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0));
318aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
319aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            scrim.setAlpha(alpha1);
320aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
321048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
322048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
323aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void startScrimAnimation(final View scrim, float target) {
324048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float current = getCurrentScrimAlpha(scrim);
325048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        ValueAnimator anim = ValueAnimator.ofFloat(current, target);
326ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
327ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            @Override
328ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
329048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                float alpha = (float) animation.getAnimatedValue();
330048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                setCurrentScrimAlpha(scrim, alpha);
331048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                updateScrimColor(scrim);
332ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            }
333ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        });
33416423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi        anim.setInterpolator(getInterpolator());
335e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setStartDelay(mAnimationDelay);
336e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION);
337e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.addListener(new AnimatorListenerAdapter() {
338e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            @Override
339e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            public void onAnimationEnd(Animator animation) {
340e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                if (mOnAnimationFinished != null) {
341e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished.run();
342e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished = null;
343e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                }
344bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock                scrim.setTag(TAG_KEY_ANIM, null);
34583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                scrim.setTag(TAG_KEY_ANIM_TARGET, null);
346e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            }
347e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        });
348ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.start();
349ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        if (mSkipFirstFrame) {
350ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            anim.setCurrentPlayTime(16);
351ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        }
352bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        scrim.setTag(TAG_KEY_ANIM, anim);
35383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        scrim.setTag(TAG_KEY_ANIM_TARGET, target);
354ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
355ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
35616423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    private Interpolator getInterpolator() {
35783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        return mAnimateKeyguardFadingOut ? KEYGUARD_FADE_OUT_INTERPOLATOR : mInterpolator;
35816423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    }
35916423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi
360ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    @Override
361ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public boolean onPreDraw() {
362ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this);
363ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = false;
364372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        if (mDontAnimateBouncerChanges) {
365372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek            mDontAnimateBouncerChanges = false;
366372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        }
367ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        updateScrims();
368e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = -1;
369e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = 0;
370ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = false;
371e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
372e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that we always call the listener even if we didn't start an animation.
37383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        endAnimateKeyguardFadingOut(false /* force */);
374edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        return true;
375edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
376edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
37783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void endAnimateKeyguardFadingOut(boolean force) {
378edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        mAnimateKeyguardFadingOut = false;
37983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if ((force || (!isAnimating(mScrimInFront) && !isAnimating(mScrimBehind)))
38083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                && mOnAnimationFinished != null) {
381e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished.run();
382e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished = null;
383e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
384ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
385bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
38683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private boolean isAnimating(View scrim) {
38783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        return scrim.getTag(TAG_KEY_ANIM) != null;
38883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
38983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
390a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    public void setBackDropView(BackDropView backDropView) {
391a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mBackDropView = backDropView;
392a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mBackDropView.setOnVisibilityChangedRunnable(new Runnable() {
393a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            @Override
394a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            public void run() {
395a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek                updateScrimBehindDrawingMode();
396a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            }
397a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        });
398a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        updateScrimBehindDrawingMode();
399a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
400a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek
401a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private void updateScrimBehindDrawingMode() {
4020e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE && mScrimSrcEnabled;
403a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mScrimBehind.setDrawAsSrc(asSrc);
404a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
405aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
406aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
407b349af573121cc659d775696066a13ed7101c308John Spurlock    public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
408aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
409aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
410aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
411684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
412684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount++;
413684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        updateHeadsUpScrim(true);
414684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    }
415684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
416684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    @Override
417684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
418684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount--;
419684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (headsUp == mDraggedHeadsUpView) {
420684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mDraggedHeadsUpView = null;
421684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mTopHeadsUpDragAmount = 0.0f;
422aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
423aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(true);
424aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
425aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
426aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
427684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
428aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
429aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
430aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateHeadsUpScrim(boolean animate) {
431aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float alpha = calculateHeadsUpAlpha();
432aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        ValueAnimator previousAnimator = StackStateAnimator.getChildTag(mHeadsUpScrim,
433aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                TAG_KEY_ANIM);
434aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float animEndValue = -1;
435aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (previousAnimator != null) {
436684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            if (animate || alpha == mCurrentHeadsUpAlpha) {
437aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                previousAnimator.cancel();
438737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek            } else {
439737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek                animEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, TAG_HUN_END_ALPHA);
440aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
441aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
442aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (alpha != mCurrentHeadsUpAlpha && alpha != animEndValue) {
443aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            if (animate) {
444aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                startScrimAnimation(mHeadsUpScrim, alpha);
445aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, mCurrentHeadsUpAlpha);
446aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha);
447aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            } else {
448aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                if (previousAnimator != null) {
449aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float previousStartValue = StackStateAnimator.getChildTag(mHeadsUpScrim,
450aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                            TAG_HUN_START_ALPHA);
451684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek                    float previousEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim,
452aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                           TAG_HUN_END_ALPHA);
453aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // we need to increase all animation keyframes of the previous animator by the
454aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // relative change to the end value
455aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    PropertyValuesHolder[] values = previousAnimator.getValues();
456aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float relativeDiff = alpha - previousEndValue;
457aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float newStartValue = previousStartValue + relativeDiff;
458aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    values[0].setFloatValues(newStartValue, alpha);
459aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, newStartValue);
460aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha);
461aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime());
462aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                } else {
463aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // update the alpha directly
464aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    setCurrentScrimAlpha(mHeadsUpScrim, alpha);
465aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    updateScrimColor(mHeadsUpScrim);
466aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                }
467aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
468aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
469aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
470aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
471684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
472684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means
473684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the heads up is in its resting space and 1 means it's fully dragged out.
474684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
475684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param draggedHeadsUpView the dragged view
476684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param topHeadsUpDragAmount how far is it dragged
477684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
478aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) {
479aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mTopHeadsUpDragAmount = topHeadsUpDragAmount;
480aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mDraggedHeadsUpView = draggedHeadsUpView;
481aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
482aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
483aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
484aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float calculateHeadsUpAlpha() {
485131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float alpha;
486684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (mPinnedHeadsUpCount >= 2) {
487131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f;
488684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        } else if (mPinnedHeadsUpCount == 0) {
489131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 0.0f;
490aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
491131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f - mTopHeadsUpDragAmount;
492aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
493131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float expandFactor = (1.0f - mFraction);
494131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        expandFactor = Math.max(expandFactor, 0.0f);
495131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        return alpha * expandFactor;
496aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
49737c110fa14aed2bb54f685f3855feb30000322faSelim Cinek
49837c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    public void forceHideScrims(boolean hide) {
49937c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mForceHideScrims = hide;
50037c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mAnimateChange = false;
50137c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        scheduleUpdate();
50237c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    }
503372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek
504372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    public void dontAnimateBouncerChangesUntilNextFrame() {
505372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mDontAnimateBouncerChanges = true;
506372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    }
507ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi}
508