ScrimController.java revision 3e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9
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
33bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport com.android.systemui.R;
34aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow;
35aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.NotificationData;
36a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport com.android.systemui.statusbar.ScrimView;
37aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
38aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.stack.StackStateAnimator;
39bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
40ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/**
41ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Controls both the scrim behind the notifications and in front of the notifications (when a
42ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * security method gets shown).
43ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */
44aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekpublic class ScrimController implements ViewTreeObserver.OnPreDrawListener,
45aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        HeadsUpManager.OnHeadsUpChangedListener {
468b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock    public static final long ANIMATION_DURATION = 220;
4783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR
4883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            = new PathInterpolator(0f, 0, 0.7f, 1f);
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;
555104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private static final int TAG_START_ALPHA = R.id.scrim_alpha_start;
565104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private static final int TAG_END_ALPHA = R.id.scrim_alpha_end;
57bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
585da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected final ScrimView mScrimBehind;
59a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final ScrimView mScrimInFront;
60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final UnlockMethodCache mUnlockMethodCache;
61aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private final View mHeadsUpScrim;
62ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
634dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlpha = SCRIM_BEHIND_ALPHA;
644dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;
654dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    private float mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING;
664dab4b504896d785da840484af41779bb9692b6fXiaohui Chen
675da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected boolean mKeyguardShowing;
68ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private float mFraction;
69ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
70ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mDarkenWhileDragging;
715da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected boolean mBouncerShowing;
720d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mWakeAndUnlocking;
73ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mAnimateChange;
74ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private boolean mUpdatePending;
752fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    private boolean mExpanding;
76e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private boolean mAnimateKeyguardFadingOut;
77e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mDurationOverride = -1;
78e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private long mAnimationDelay;
79e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    private Runnable mOnAnimationFinished;
80ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private final Interpolator mInterpolator = new DecelerateInterpolator();
81048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private boolean mDozing;
82048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeInFrontAlpha;
83048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mDozeBehindAlpha;
84048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentInFrontAlpha;
85048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float mCurrentBehindAlpha;
86aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mCurrentHeadsUpAlpha = 1;
87684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    private int mPinnedHeadsUpCount;
88aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float mTopHeadsUpDragAmount;
89aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private View mDraggedHeadsUpView;
9037c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    private boolean mForceHideScrims;
91ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    private boolean mSkipFirstFrame;
92372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    private boolean mDontAnimateBouncerChanges;
935f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos    private boolean mKeyguardFadingOutInProgress;
94ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
95255032591826a8a0373505a163d5c96d681541cfSelim Cinek    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim) {
96ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind = scrimBehind;
97ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimInFront = scrimInFront;
98aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mHeadsUpScrim = headsUpScrim;
99d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        final Context context = scrimBehind.getContext();
100d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
101aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mKeyguardShowing = showing;
106ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
107ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
108ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1094dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    public void setShowScrimBehind(boolean show) {
1104dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        if (show) {
1114dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlpha = SCRIM_BEHIND_ALPHA;
1124dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;
1134dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING;
1144dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        } else {
1154dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlpha = 0;
1164dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaKeyguard = 0;
1174dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            mScrimBehindAlphaUnlocking = 0;
1184dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        }
1194dab4b504896d785da840484af41779bb9692b6fXiaohui Chen        scheduleUpdate();
1204dab4b504896d785da840484af41779bb9692b6fXiaohui Chen    }
1214dab4b504896d785da840484af41779bb9692b6fXiaohui Chen
122ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void onTrackingStarted() {
1232fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = true;
124e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek        mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
125ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
126ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1272fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
1282fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = false;
1292fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
1302fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
131ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setPanelExpansion(float fraction) {
13293439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        if (mFraction != fraction) {
13393439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            mFraction = fraction;
13493439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            scheduleUpdate();
135131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            if (mPinnedHeadsUpCount != 0) {
136131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek                updateHeadsUpScrim(false);
137131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            }
13893439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        }
139ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
140ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
141ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setBouncerShowing(boolean showing) {
142ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mBouncerShowing = showing;
143372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mAnimateChange = !mExpanding && !mDontAnimateBouncerChanges;
144ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
145ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
146ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1470d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void setWakeAndUnlocking() {
1480d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = true;
1490d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        scheduleUpdate();
1500d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
1510d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
152ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished,
153ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            boolean skipFirstFrame) {
1540d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mWakeAndUnlocking = false;
155e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateKeyguardFadingOut = true;
156e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = duration;
157e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = delay;
158e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateChange = true;
159ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = skipFirstFrame;
160e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mOnAnimationFinished = onAnimationFinished;
161e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        scheduleUpdate();
162ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi
163ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        // No need to wait for the next frame to be drawn for this case - onPreDraw will execute
164ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        // the changes we just scheduled.
165ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        onPreDraw();
166e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
167e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
168edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    public void abortKeyguardFadingOut() {
169edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        if (mAnimateKeyguardFadingOut) {
17083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            endAnimateKeyguardFadingOut(true /* force */);
171edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        }
172edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
173edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
174dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    public void animateGoingToFullShade(long delay, long duration) {
175dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mDurationOverride = duration;
176dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimationDelay = delay;
177dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimateChange = true;
178dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        scheduleUpdate();
179dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    }
180dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi
1815104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    public void animateNextChange() {
1825104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        mAnimateChange = true;
1835104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    }
1845104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek
185048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozing(boolean dozing) {
1860d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (mDozing != dozing) {
1870d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mDozing = dozing;
1880d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            scheduleUpdate();
1890d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
190bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
191bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
192048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeInFrontAlpha(float alpha) {
193048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeInFrontAlpha = alpha;
194048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimInFront);
195d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock    }
196d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock
197048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeBehindAlpha(float alpha) {
198048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeBehindAlpha = alpha;
199048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimBehind);
200bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
201bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
202048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeBehindAlpha() {
203048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeBehindAlpha;
2044d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown    }
2054d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown
206048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeInFrontAlpha() {
207048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeInFrontAlpha;
208bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
209bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
210ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void scheduleUpdate() {
211ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mUpdatePending) return;
212e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
213e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that a frame gets scheduled.
214e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mScrimBehind.invalidate();
215ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this);
216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = true;
217ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
218ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
2195da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen    protected void updateScrims() {
22037c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        if (mAnimateKeyguardFadingOut || mForceHideScrims) {
221baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimInFrontColor(0f);
222baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimBehindColor(0f);
2230d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        } else if (mWakeAndUnlocking) {
2240d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
2250d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // During wake and unlock, we first hide everything behind a black scrim, which then
2260d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            // gets faded out from animateKeyguardFadingOut.
22783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            if (mDozing) {
22883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(0f);
22983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(1f);
23083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            } else {
23183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimInFrontColor(1f);
23283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                setScrimBehindColor(0f);
23383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            }
2348b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock        } else if (!mKeyguardShowing && !mBouncerShowing) {
235ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimNormal();
236ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0);
237ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
238ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimKeyguard();
239ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
240ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mAnimateChange = false;
241ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
242ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
243ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimKeyguard() {
2442fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        if (mExpanding && mDarkenWhileDragging) {
245ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float behindFraction = Math.max(0, Math.min(mFraction, 1));
246ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float fraction = 1 - behindFraction;
24776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            fraction = (float) Math.pow(fraction, 0.8f);
24876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            behindFraction = (float) Math.pow(behindFraction, 0.8f);
249ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA);
2504dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            setScrimBehindColor(behindFraction * mScrimBehindAlphaKeyguard);
2512fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        } else if (mBouncerShowing) {
2522fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA);
2532fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimBehindColor(0f);
254ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
25576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            float fraction = Math.max(0, Math.min(mFraction, 1));
256ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0f);
25776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            setScrimBehindColor(fraction
2584dab4b504896d785da840484af41779bb9692b6fXiaohui Chen                    * (mScrimBehindAlphaKeyguard - mScrimBehindAlphaUnlocking)
2594dab4b504896d785da840484af41779bb9692b6fXiaohui Chen                    + mScrimBehindAlphaUnlocking);
260ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
261ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
262ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
263ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimNormal() {
264ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        float frac = mFraction;
265ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        // let's start this 20% of the way down the screen
266ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        frac = frac * 1.2f - 0.2f;
267ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (frac <= 0) {
268ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(0);
269ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
270ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            // woo, special effects
271ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
2724dab4b504896d785da840484af41779bb9692b6fXiaohui Chen            setScrimBehindColor(k * mScrimBehindAlpha);
273ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
274ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
275ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
276ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimBehindColor(float alpha) {
277ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimBehind, alpha);
278ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
279ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
280ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimInFrontColor(float alpha) {
281ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimInFront, alpha);
282ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (alpha == 0f) {
283ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimInFront.setClickable(false);
284ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
285ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
2868b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // Eat touch events (unless dozing).
2878b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            mScrimInFront.setClickable(!mDozing);
288ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
289ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
290ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
291aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void setScrimColor(View scrim, float alpha) {
2925104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        updateScrim(mAnimateChange, scrim, alpha, getCurrentScrimAlpha(scrim));
293ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
294ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
295048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getDozeAlpha(View scrim) {
296048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha;
297048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
298048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
299048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getCurrentScrimAlpha(View scrim) {
300aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        return scrim == mScrimBehind ? mCurrentBehindAlpha
301aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : scrim == mScrimInFront ? mCurrentInFrontAlpha
302aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : mCurrentHeadsUpAlpha;
303048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
304048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
305048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private void setCurrentScrimAlpha(View scrim, float alpha) {
306048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        if (scrim == mScrimBehind) {
307048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentBehindAlpha = alpha;
308aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else if (scrim == mScrimInFront) {
309048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentInFrontAlpha = alpha;
310aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
311aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            alpha = Math.max(0.0f, Math.min(1.0f, alpha));
312aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            mCurrentHeadsUpAlpha = alpha;
313ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
314048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
315048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
316aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateScrimColor(View scrim) {
317048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float alpha1 = getCurrentScrimAlpha(scrim);
318aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (scrim instanceof ScrimView) {
319aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha2 = getDozeAlpha(scrim);
320aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha = 1 - (1 - alpha1) * (1 - alpha2);
321aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0));
322aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
323aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            scrim.setAlpha(alpha1);
324aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
325048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
326048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
327aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void startScrimAnimation(final View scrim, float target) {
328048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float current = getCurrentScrimAlpha(scrim);
329048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        ValueAnimator anim = ValueAnimator.ofFloat(current, target);
330ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
331ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            @Override
332ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
333048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                float alpha = (float) animation.getAnimatedValue();
334048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                setCurrentScrimAlpha(scrim, alpha);
335048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                updateScrimColor(scrim);
336ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            }
337ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        });
33816423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi        anim.setInterpolator(getInterpolator());
339e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setStartDelay(mAnimationDelay);
340e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION);
341e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.addListener(new AnimatorListenerAdapter() {
342e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            @Override
343e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            public void onAnimationEnd(Animator animation) {
344e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                if (mOnAnimationFinished != null) {
345e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished.run();
346e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished = null;
3475f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos                    mKeyguardFadingOutInProgress = false;
348e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                }
349bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock                scrim.setTag(TAG_KEY_ANIM, null);
35083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                scrim.setTag(TAG_KEY_ANIM_TARGET, null);
351e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            }
352e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        });
353ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.start();
3545f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        if (mAnimateKeyguardFadingOut) {
3555f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            mKeyguardFadingOutInProgress = true;
3565f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        }
357ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        if (mSkipFirstFrame) {
358ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            anim.setCurrentPlayTime(16);
359ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        }
360bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        scrim.setTag(TAG_KEY_ANIM, anim);
36183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        scrim.setTag(TAG_KEY_ANIM_TARGET, target);
362ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
363ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
36416423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    private Interpolator getInterpolator() {
36583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        return mAnimateKeyguardFadingOut ? KEYGUARD_FADE_OUT_INTERPOLATOR : mInterpolator;
36616423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    }
36716423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi
368ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    @Override
369ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public boolean onPreDraw() {
370ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this);
371ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = false;
372372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        if (mDontAnimateBouncerChanges) {
373372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek            mDontAnimateBouncerChanges = false;
374372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        }
375ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        updateScrims();
376e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = -1;
377e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = 0;
378ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        mSkipFirstFrame = false;
379e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
380e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that we always call the listener even if we didn't start an animation.
38183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        endAnimateKeyguardFadingOut(false /* force */);
382edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        return true;
383edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek    }
384edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek
38583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void endAnimateKeyguardFadingOut(boolean force) {
386edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        mAnimateKeyguardFadingOut = false;
38783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if ((force || (!isAnimating(mScrimInFront) && !isAnimating(mScrimBehind)))
38883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                && mOnAnimationFinished != null) {
389e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished.run();
390e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished = null;
3915f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            mKeyguardFadingOutInProgress = false;
392e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
393ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
394bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
39583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private boolean isAnimating(View scrim) {
39683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        return scrim.getTag(TAG_KEY_ANIM) != null;
39783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
39883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
399255032591826a8a0373505a163d5c96d681541cfSelim Cinek    public void setDrawBehindAsSrc(boolean asSrc) {
400a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mScrimBehind.setDrawAsSrc(asSrc);
401a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
402aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
403aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
404b349af573121cc659d775696066a13ed7101c308John Spurlock    public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
405aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
406aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
407aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
408684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
409684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount++;
410684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        updateHeadsUpScrim(true);
411684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    }
412684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
413684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    @Override
414684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
415684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount--;
416684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (headsUp == mDraggedHeadsUpView) {
417684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mDraggedHeadsUpView = null;
418684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mTopHeadsUpDragAmount = 0.0f;
419aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
420aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(true);
421aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
422aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
423aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
424684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
425aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
426aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
427aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateHeadsUpScrim(boolean animate) {
4285104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        updateScrim(animate, mHeadsUpScrim, calculateHeadsUpAlpha(), mCurrentHeadsUpAlpha);
4295104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    }
4305104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek
4315104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek    private void updateScrim(boolean animate, View scrim, float alpha, float currentAlpha) {
4325f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        if (mKeyguardFadingOutInProgress) {
4335f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos            return;
4345f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos        }
4355f72c92e2b7b624e2b2f639a1b295a3a1f7fc47fAdrian Roos
4365104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        ValueAnimator previousAnimator = StackStateAnimator.getChildTag(scrim,
437aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                TAG_KEY_ANIM);
438aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float animEndValue = -1;
439aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (previousAnimator != null) {
4405104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek            if (animate || alpha == currentAlpha) {
441aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                previousAnimator.cancel();
442737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek            } else {
4435104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                animEndValue = StackStateAnimator.getChildTag(scrim, TAG_END_ALPHA);
444aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
445aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
4465104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek        if (alpha != currentAlpha && alpha != animEndValue) {
447aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            if (animate) {
4485104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                startScrimAnimation(scrim, alpha);
4495104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                scrim.setTag(TAG_START_ALPHA, currentAlpha);
4505104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                scrim.setTag(TAG_END_ALPHA, alpha);
451aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            } else {
452aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                if (previousAnimator != null) {
4535104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    float previousStartValue = StackStateAnimator.getChildTag(scrim,
4545104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                            TAG_START_ALPHA);
4555104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    float previousEndValue = StackStateAnimator.getChildTag(scrim,
4565104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                            TAG_END_ALPHA);
457aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // we need to increase all animation keyframes of the previous animator by the
458aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // relative change to the end value
459aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    PropertyValuesHolder[] values = previousAnimator.getValues();
460aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float relativeDiff = alpha - previousEndValue;
461aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float newStartValue = previousStartValue + relativeDiff;
462aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    values[0].setFloatValues(newStartValue, alpha);
4635104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    scrim.setTag(TAG_START_ALPHA, newStartValue);
4645104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    scrim.setTag(TAG_END_ALPHA, alpha);
465aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime());
466aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                } else {
467aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // update the alpha directly
4685104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    setCurrentScrimAlpha(scrim, alpha);
4695104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek                    updateScrimColor(scrim);
470aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                }
471aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
472aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
473aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
474aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
475684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
476684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means
477684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the heads up is in its resting space and 1 means it's fully dragged out.
478684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
479684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param draggedHeadsUpView the dragged view
480684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param topHeadsUpDragAmount how far is it dragged
481684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
482aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) {
483aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mTopHeadsUpDragAmount = topHeadsUpDragAmount;
484aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mDraggedHeadsUpView = draggedHeadsUpView;
485aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
486aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
487aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
488aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float calculateHeadsUpAlpha() {
489131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float alpha;
490684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (mPinnedHeadsUpCount >= 2) {
491131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f;
492684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        } else if (mPinnedHeadsUpCount == 0) {
493131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 0.0f;
494aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
495131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek            alpha = 1.0f - mTopHeadsUpDragAmount;
496aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
497131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        float expandFactor = (1.0f - mFraction);
498131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        expandFactor = Math.max(expandFactor, 0.0f);
499131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek        return alpha * expandFactor;
500aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
50137c110fa14aed2bb54f685f3855feb30000322faSelim Cinek
50237c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    public void forceHideScrims(boolean hide) {
50337c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mForceHideScrims = hide;
50437c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        mAnimateChange = false;
50537c110fa14aed2bb54f685f3855feb30000322faSelim Cinek        scheduleUpdate();
50637c110fa14aed2bb54f685f3855feb30000322faSelim Cinek    }
507372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek
508372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    public void dontAnimateBouncerChangesUntilNextFrame() {
509372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        mDontAnimateBouncerChanges = true;
510372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    }
5116811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek
5126811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek    public void setExcludedBackgroundArea(Rect area) {
5136811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek        mScrimBehind.setExcludedArea(area);
5146811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek    }
515d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek
516d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    public int getScrimBehindColor() {
517d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek        return mScrimBehind.getScrimColorWithAlpha();
518d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    }
519d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek
520d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    public void setScrimBehindChangeRunnable(Runnable changeRunnable) {
521d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek        mScrimBehind.setChangeRunnable(changeRunnable);
522d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek    }
523e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek
5243e7592d0cbbde5b0b85d98b82d991ee5d2aab8a9Selim Cinek    public void onDensityOrFontScaleChanged() {
525e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        ViewGroup.LayoutParams layoutParams = mHeadsUpScrim.getLayoutParams();
526e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        layoutParams.height = mHeadsUpScrim.getResources().getDimensionPixelSize(
527e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek                R.dimen.heads_up_scrim_height);
528e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek        mHeadsUpScrim.setLayoutParams(layoutParams);
529e803491cb0f4a3d3cb842771757fcf26bed080a0Selim Cinek    }
530ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi}
531