ScrimController.java revision 4dab4b504896d785da840484af41779bb9692b6f
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; 27ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.ViewTreeObserver; 28ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.DecelerateInterpolator; 29ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.Interpolator; 300d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggiimport android.view.animation.PathInterpolator; 31ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 32bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport com.android.systemui.R; 33aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow; 34aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.NotificationData; 35a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport com.android.systemui.statusbar.ScrimView; 36aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager; 37aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekimport com.android.systemui.statusbar.stack.StackStateAnimator; 38bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 39ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/** 40ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Controls both the scrim behind the notifications and in front of the notifications (when a 41ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * security method gets shown). 42ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */ 43aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinekpublic class ScrimController implements ViewTreeObserver.OnPreDrawListener, 44aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek HeadsUpManager.OnHeadsUpChangedListener { 458b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock public static final long ANIMATION_DURATION = 220; 4683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR 4783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi = new PathInterpolator(0f, 0, 0.7f, 1f); 48ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA = 0.62f; 49e5716222a1a11922267193d5815fb083fc4e11d3Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f; 5076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f; 51ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_IN_FRONT_ALPHA = 0.75f; 52bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final int TAG_KEY_ANIM = R.id.scrim; 5383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target; 545104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek private static final int TAG_START_ALPHA = R.id.scrim_alpha_start; 555104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek private static final int TAG_END_ALPHA = R.id.scrim_alpha_end; 56bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 575da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen protected final ScrimView mScrimBehind; 58a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek private final ScrimView mScrimInFront; 59ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final UnlockMethodCache mUnlockMethodCache; 60aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private final View mHeadsUpScrim; 61ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 624dab4b504896d785da840484af41779bb9692b6fXiaohui Chen private float mScrimBehindAlpha = SCRIM_BEHIND_ALPHA; 634dab4b504896d785da840484af41779bb9692b6fXiaohui Chen private float mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD; 644dab4b504896d785da840484af41779bb9692b6fXiaohui Chen private float mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING; 654dab4b504896d785da840484af41779bb9692b6fXiaohui Chen 665da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen protected boolean mKeyguardShowing; 67ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private float mFraction; 68ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 69ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mDarkenWhileDragging; 705da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen protected boolean mBouncerShowing; 710d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi private boolean mWakeAndUnlocking; 72ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mAnimateChange; 73ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mUpdatePending; 742fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi private boolean mExpanding; 75e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private boolean mAnimateKeyguardFadingOut; 76e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mDurationOverride = -1; 77e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mAnimationDelay; 78e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private Runnable mOnAnimationFinished; 79ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final Interpolator mInterpolator = new DecelerateInterpolator(); 80048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private boolean mDozing; 81048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mDozeInFrontAlpha; 82048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mDozeBehindAlpha; 83048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mCurrentInFrontAlpha; 84048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mCurrentBehindAlpha; 85aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float mCurrentHeadsUpAlpha = 1; 86684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek private int mPinnedHeadsUpCount; 87aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float mTopHeadsUpDragAmount; 88aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private View mDraggedHeadsUpView; 8937c110fa14aed2bb54f685f3855feb30000322faSelim Cinek private boolean mForceHideScrims; 90ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi private boolean mSkipFirstFrame; 91372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek private boolean mDontAnimateBouncerChanges; 92ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 93255032591826a8a0373505a163d5c96d681541cfSelim Cinek public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim) { 94ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind = scrimBehind; 95ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront = scrimInFront; 96aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim = headsUpScrim; 97d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock final Context context = scrimBehind.getContext(); 98d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock mUnlockMethodCache = UnlockMethodCache.getInstance(context); 99aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(false); 100ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 101ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setKeyguardShowing(boolean showing) { 103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mKeyguardShowing = showing; 104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 106ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 1074dab4b504896d785da840484af41779bb9692b6fXiaohui Chen public void setShowScrimBehind(boolean show) { 1084dab4b504896d785da840484af41779bb9692b6fXiaohui Chen if (show) { 1094dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlpha = SCRIM_BEHIND_ALPHA; 1104dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD; 1114dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING; 1124dab4b504896d785da840484af41779bb9692b6fXiaohui Chen } else { 1134dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlpha = 0; 1144dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlphaKeyguard = 0; 1154dab4b504896d785da840484af41779bb9692b6fXiaohui Chen mScrimBehindAlphaUnlocking = 0; 1164dab4b504896d785da840484af41779bb9692b6fXiaohui Chen } 1174dab4b504896d785da840484af41779bb9692b6fXiaohui Chen scheduleUpdate(); 1184dab4b504896d785da840484af41779bb9692b6fXiaohui Chen } 1194dab4b504896d785da840484af41779bb9692b6fXiaohui Chen 120ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onTrackingStarted() { 1212fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = true; 122e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer(); 123ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 124ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 1252fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi public void onExpandingFinished() { 1262fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = false; 1272fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } 1282fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi 129ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setPanelExpansion(float fraction) { 13093439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi if (mFraction != fraction) { 13193439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi mFraction = fraction; 13293439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi scheduleUpdate(); 133131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek if (mPinnedHeadsUpCount != 0) { 134131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek updateHeadsUpScrim(false); 135131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek } 13693439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi } 137ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 138ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 139ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setBouncerShowing(boolean showing) { 140ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mBouncerShowing = showing; 141372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek mAnimateChange = !mExpanding && !mDontAnimateBouncerChanges; 142ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 143ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 144ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 1450d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi public void setWakeAndUnlocking() { 1460d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi mWakeAndUnlocking = true; 1470d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi scheduleUpdate(); 1480d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi } 1490d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi 150ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished, 151ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi boolean skipFirstFrame) { 1520d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi mWakeAndUnlocking = false; 153e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateKeyguardFadingOut = true; 154e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = duration; 155e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = delay; 156e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateChange = true; 157ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi mSkipFirstFrame = skipFirstFrame; 158e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = onAnimationFinished; 159e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi scheduleUpdate(); 160ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi 161ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi // No need to wait for the next frame to be drawn for this case - onPreDraw will execute 162ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi // the changes we just scheduled. 163ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi onPreDraw(); 164e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 165e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 166edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek public void abortKeyguardFadingOut() { 167edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek if (mAnimateKeyguardFadingOut) { 16883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi endAnimateKeyguardFadingOut(true /* force */); 169edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek } 170edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek } 171edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek 172dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi public void animateGoingToFullShade(long delay, long duration) { 173dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mDurationOverride = duration; 174dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mAnimationDelay = delay; 175dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mAnimateChange = true; 176dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi scheduleUpdate(); 177dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi } 178dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi 1795104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek public void animateNextChange() { 1805104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek mAnimateChange = true; 1815104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek } 1825104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek 183048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozing(boolean dozing) { 1840d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi if (mDozing != dozing) { 1850d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi mDozing = dozing; 1860d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi scheduleUpdate(); 1870d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi } 188bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 189bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 190048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozeInFrontAlpha(float alpha) { 191048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mDozeInFrontAlpha = alpha; 192048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(mScrimInFront); 193d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock } 194d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock 195048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozeBehindAlpha(float alpha) { 196048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mDozeBehindAlpha = alpha; 197048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(mScrimBehind); 198bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 199bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 200048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public float getDozeBehindAlpha() { 201048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return mDozeBehindAlpha; 2024d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown } 2034d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown 204048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public float getDozeInFrontAlpha() { 205048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return mDozeInFrontAlpha; 206bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 207bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 208ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void scheduleUpdate() { 209ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (mUpdatePending) return; 210e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 211e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that a frame gets scheduled. 212e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mScrimBehind.invalidate(); 213ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this); 214ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = true; 215ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 2175da713599f4e83c99b5c52291c967c813350e669Xiaohui Chen protected void updateScrims() { 21837c110fa14aed2bb54f685f3855feb30000322faSelim Cinek if (mAnimateKeyguardFadingOut || mForceHideScrims) { 219baa23274596246d03741457701ac515a73aa8818Selim Cinek setScrimInFrontColor(0f); 220baa23274596246d03741457701ac515a73aa8818Selim Cinek setScrimBehindColor(0f); 2210d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi } else if (mWakeAndUnlocking) { 2220d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi 2230d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi // During wake and unlock, we first hide everything behind a black scrim, which then 2240d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi // gets faded out from animateKeyguardFadingOut. 22583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi if (mDozing) { 22683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi setScrimInFrontColor(0f); 22783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi setScrimBehindColor(1f); 22883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } else { 22983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi setScrimInFrontColor(1f); 23083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi setScrimBehindColor(0f); 23183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } 2328b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock } else if (!mKeyguardShowing && !mBouncerShowing) { 233ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimNormal(); 234ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0); 235ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 236ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimKeyguard(); 237ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 238ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mAnimateChange = false; 239ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 240ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 241ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimKeyguard() { 2422fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi if (mExpanding && mDarkenWhileDragging) { 243ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float behindFraction = Math.max(0, Math.min(mFraction, 1)); 244ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float fraction = 1 - behindFraction; 24576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi fraction = (float) Math.pow(fraction, 0.8f); 24676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi behindFraction = (float) Math.pow(behindFraction, 0.8f); 247ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA); 2484dab4b504896d785da840484af41779bb9692b6fXiaohui Chen setScrimBehindColor(behindFraction * mScrimBehindAlphaKeyguard); 2492fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } else if (mBouncerShowing) { 2502fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA); 2512fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimBehindColor(0f); 252ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 25376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi float fraction = Math.max(0, Math.min(mFraction, 1)); 254ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0f); 25576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi setScrimBehindColor(fraction 2564dab4b504896d785da840484af41779bb9692b6fXiaohui Chen * (mScrimBehindAlphaKeyguard - mScrimBehindAlphaUnlocking) 2574dab4b504896d785da840484af41779bb9692b6fXiaohui Chen + mScrimBehindAlphaUnlocking); 258ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 259ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 260ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 261ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimNormal() { 262ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float frac = mFraction; 263ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // let's start this 20% of the way down the screen 264ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi frac = frac * 1.2f - 0.2f; 265ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (frac <= 0) { 266ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(0); 267ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 268ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // woo, special effects 269ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f)))); 2704dab4b504896d785da840484af41779bb9692b6fXiaohui Chen setScrimBehindColor(k * mScrimBehindAlpha); 271ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 272ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 273ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 274ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimBehindColor(float alpha) { 275ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimBehind, alpha); 276ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 277ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 278ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimInFrontColor(float alpha) { 279ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimInFront, alpha); 280ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (alpha == 0f) { 281ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront.setClickable(false); 282ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 283ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 2848b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock // Eat touch events (unless dozing). 2858b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock mScrimInFront.setClickable(!mDozing); 286ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 287ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 288ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 289aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void setScrimColor(View scrim, float alpha) { 2905104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek updateScrim(mAnimateChange, scrim, alpha, getCurrentScrimAlpha(scrim)); 291ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 292ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 293048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float getDozeAlpha(View scrim) { 294048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha; 295048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 296048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 297048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float getCurrentScrimAlpha(View scrim) { 298aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek return scrim == mScrimBehind ? mCurrentBehindAlpha 299aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek : scrim == mScrimInFront ? mCurrentInFrontAlpha 300aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek : mCurrentHeadsUpAlpha; 301048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 302048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 303048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private void setCurrentScrimAlpha(View scrim, float alpha) { 304048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi if (scrim == mScrimBehind) { 305048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mCurrentBehindAlpha = alpha; 306aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else if (scrim == mScrimInFront) { 307048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mCurrentInFrontAlpha = alpha; 308aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 309aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek alpha = Math.max(0.0f, Math.min(1.0f, alpha)); 310aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mCurrentHeadsUpAlpha = alpha; 311ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 312048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 313048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 314aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void updateScrimColor(View scrim) { 315048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float alpha1 = getCurrentScrimAlpha(scrim); 316aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (scrim instanceof ScrimView) { 317aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float alpha2 = getDozeAlpha(scrim); 318aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float alpha = 1 - (1 - alpha1) * (1 - alpha2); 319aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0)); 320aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 321aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek scrim.setAlpha(alpha1); 322aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 323048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 324048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 325aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void startScrimAnimation(final View scrim, float target) { 326048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float current = getCurrentScrimAlpha(scrim); 327048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi ValueAnimator anim = ValueAnimator.ofFloat(current, target); 328ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 329ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 330ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onAnimationUpdate(ValueAnimator animation) { 331048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float alpha = (float) animation.getAnimatedValue(); 332048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi setCurrentScrimAlpha(scrim, alpha); 333048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(scrim); 334ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 335ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi }); 33616423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi anim.setInterpolator(getInterpolator()); 337e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setStartDelay(mAnimationDelay); 338e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION); 339e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.addListener(new AnimatorListenerAdapter() { 340e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi @Override 341e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void onAnimationEnd(Animator animation) { 342e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (mOnAnimationFinished != null) { 343e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 344e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 345e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 346bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, null); 34783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi scrim.setTag(TAG_KEY_ANIM_TARGET, null); 348e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 349e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi }); 350ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.start(); 351ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi if (mSkipFirstFrame) { 352ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi anim.setCurrentPlayTime(16); 353ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi } 354bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, anim); 35583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi scrim.setTag(TAG_KEY_ANIM_TARGET, target); 356ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 357ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 35816423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi private Interpolator getInterpolator() { 35983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi return mAnimateKeyguardFadingOut ? KEYGUARD_FADE_OUT_INTERPOLATOR : mInterpolator; 36016423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi } 36116423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi 362ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 363ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public boolean onPreDraw() { 364ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this); 365ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = false; 366372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek if (mDontAnimateBouncerChanges) { 367372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek mDontAnimateBouncerChanges = false; 368372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } 369ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrims(); 370e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = -1; 371e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = 0; 372ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi mSkipFirstFrame = false; 373e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 374e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that we always call the listener even if we didn't start an animation. 37583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi endAnimateKeyguardFadingOut(false /* force */); 376edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek return true; 377edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek } 378edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek 37983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi private void endAnimateKeyguardFadingOut(boolean force) { 380edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek mAnimateKeyguardFadingOut = false; 38183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi if ((force || (!isAnimating(mScrimInFront) && !isAnimating(mScrimBehind))) 38283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi && mOnAnimationFinished != null) { 383e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 384e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 385e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 386ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 387bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 38883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi private boolean isAnimating(View scrim) { 38983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi return scrim.getTag(TAG_KEY_ANIM) != null; 39083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } 39183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi 392255032591826a8a0373505a163d5c96d681541cfSelim Cinek public void setDrawBehindAsSrc(boolean asSrc) { 393a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek mScrimBehind.setDrawAsSrc(asSrc); 394a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek } 395aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 396aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 397b349af573121cc659d775696066a13ed7101c308John Spurlock public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { 398aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 399aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 400aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 401684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpPinned(ExpandableNotificationRow headsUp) { 402684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mPinnedHeadsUpCount++; 403684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek updateHeadsUpScrim(true); 404684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek } 405684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek 406684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek @Override 407684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) { 408684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mPinnedHeadsUpCount--; 409684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek if (headsUp == mDraggedHeadsUpView) { 410684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mDraggedHeadsUpView = null; 411684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mTopHeadsUpDragAmount = 0.0f; 412aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 413aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(true); 414aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 415aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 416aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 417684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) { 418aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 419aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 420aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void updateHeadsUpScrim(boolean animate) { 4215104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek updateScrim(animate, mHeadsUpScrim, calculateHeadsUpAlpha(), mCurrentHeadsUpAlpha); 4225104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek } 4235104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek 4245104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek private void updateScrim(boolean animate, View scrim, float alpha, float currentAlpha) { 4255104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek ValueAnimator previousAnimator = StackStateAnimator.getChildTag(scrim, 426aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek TAG_KEY_ANIM); 427aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float animEndValue = -1; 428aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (previousAnimator != null) { 4295104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek if (animate || alpha == currentAlpha) { 430aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek previousAnimator.cancel(); 431737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek } else { 4325104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek animEndValue = StackStateAnimator.getChildTag(scrim, TAG_END_ALPHA); 433aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 434aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 4355104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek if (alpha != currentAlpha && alpha != animEndValue) { 436aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (animate) { 4375104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek startScrimAnimation(scrim, alpha); 4385104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek scrim.setTag(TAG_START_ALPHA, currentAlpha); 4395104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek scrim.setTag(TAG_END_ALPHA, alpha); 440aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 441aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (previousAnimator != null) { 4425104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek float previousStartValue = StackStateAnimator.getChildTag(scrim, 4435104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek TAG_START_ALPHA); 4445104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek float previousEndValue = StackStateAnimator.getChildTag(scrim, 4455104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek TAG_END_ALPHA); 446aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // we need to increase all animation keyframes of the previous animator by the 447aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // relative change to the end value 448aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek PropertyValuesHolder[] values = previousAnimator.getValues(); 449aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float relativeDiff = alpha - previousEndValue; 450aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float newStartValue = previousStartValue + relativeDiff; 451aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek values[0].setFloatValues(newStartValue, alpha); 4525104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek scrim.setTag(TAG_START_ALPHA, newStartValue); 4535104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek scrim.setTag(TAG_END_ALPHA, alpha); 454aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); 455aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 456aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // update the alpha directly 4575104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek setCurrentScrimAlpha(scrim, alpha); 4585104a6db2eb748fafd3918dcb939dd9d3ac281ddSelim Cinek updateScrimColor(scrim); 459aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 460aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 461aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 462aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 463aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 464684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek /** 465684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means 466684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * the heads up is in its resting space and 1 means it's fully dragged out. 467684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * 468684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * @param draggedHeadsUpView the dragged view 469684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * @param topHeadsUpDragAmount how far is it dragged 470684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek */ 471aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) { 472aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mTopHeadsUpDragAmount = topHeadsUpDragAmount; 473aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mDraggedHeadsUpView = draggedHeadsUpView; 474aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(false); 475aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 476aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 477aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float calculateHeadsUpAlpha() { 478131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek float alpha; 479684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek if (mPinnedHeadsUpCount >= 2) { 480131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 1.0f; 481684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek } else if (mPinnedHeadsUpCount == 0) { 482131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 0.0f; 483aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 484131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 1.0f - mTopHeadsUpDragAmount; 485aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 486131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek float expandFactor = (1.0f - mFraction); 487131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek expandFactor = Math.max(expandFactor, 0.0f); 488131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek return alpha * expandFactor; 489aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 49037c110fa14aed2bb54f685f3855feb30000322faSelim Cinek 49137c110fa14aed2bb54f685f3855feb30000322faSelim Cinek public void forceHideScrims(boolean hide) { 49237c110fa14aed2bb54f685f3855feb30000322faSelim Cinek mForceHideScrims = hide; 49337c110fa14aed2bb54f685f3855feb30000322faSelim Cinek mAnimateChange = false; 49437c110fa14aed2bb54f685f3855feb30000322faSelim Cinek scheduleUpdate(); 49537c110fa14aed2bb54f685f3855feb30000322faSelim Cinek } 496372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek 497372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek public void dontAnimateBouncerChangesUntilNextFrame() { 498372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek mDontAnimateBouncerChanges = true; 499372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } 5006811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek 5016811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek public void setExcludedBackgroundArea(Rect area) { 5026811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek mScrimBehind.setExcludedArea(area); 5036811d728fb988a32cbfc836b768a261a7f60c98aSelim Cinek } 504d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek 505d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek public int getScrimBehindColor() { 506d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek return mScrimBehind.getScrimColorWithAlpha(); 507d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek } 508d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek 509d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek public void setScrimBehindChangeRunnable(Runnable changeRunnable) { 510d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek mScrimBehind.setChangeRunnable(changeRunnable); 511d35c2793a3f4986f0513c17d729bdca57086c994Selim Cinek } 512ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi} 513