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