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