ScrimController.java revision 37c110fa14aed2bb54f685f3855feb30000322fa
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; 2776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggiimport android.view.animation.AnimationUtils; 28ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.DecelerateInterpolator; 29ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.Interpolator; 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; 468b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock 47ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA = 0.62f; 48e5716222a1a11922267193d5815fb083fc4e11d3Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f; 4976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f; 50ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_IN_FRONT_ALPHA = 0.75f; 51bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final int TAG_KEY_ANIM = R.id.scrim; 52aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private static final int TAG_HUN_START_ALPHA = R.id.hun_scrim_alpha_start; 53aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private static final int TAG_HUN_END_ALPHA = R.id.hun_scrim_alpha_end; 54bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 55a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek private final ScrimView mScrimBehind; 56a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek private final ScrimView mScrimInFront; 57ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final UnlockMethodCache mUnlockMethodCache; 58aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private final View mHeadsUpScrim; 59ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mKeyguardShowing; 61ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private float mFraction; 62ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 63ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mDarkenWhileDragging; 64ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mBouncerShowing; 65ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mAnimateChange; 66ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mUpdatePending; 672fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi private boolean mExpanding; 68e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private boolean mAnimateKeyguardFadingOut; 69e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mDurationOverride = -1; 70e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mAnimationDelay; 71e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private Runnable mOnAnimationFinished; 72e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private boolean mAnimationStarted; 73ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final Interpolator mInterpolator = new DecelerateInterpolator(); 7476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi private final Interpolator mLinearOutSlowInInterpolator; 75a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek private BackDropView mBackDropView; 760e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi private boolean mScrimSrcEnabled; 77048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private boolean mDozing; 78048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mDozeInFrontAlpha; 79048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mDozeBehindAlpha; 80048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mCurrentInFrontAlpha; 81048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float mCurrentBehindAlpha; 82aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float mCurrentHeadsUpAlpha = 1; 83684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek private int mPinnedHeadsUpCount; 84aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float mTopHeadsUpDragAmount; 85aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private View mDraggedHeadsUpView; 8637c110fa14aed2bb54f685f3855feb30000322faSelim Cinek private boolean mForceHideScrims; 87ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 88aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim, 89aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek boolean scrimSrcEnabled) { 90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind = scrimBehind; 91ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront = scrimInFront; 92aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim = headsUpScrim; 93d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock final Context context = scrimBehind.getContext(); 94d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock mUnlockMethodCache = UnlockMethodCache.getInstance(context); 95d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, 9676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi android.R.interpolator.linear_out_slow_in); 970e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi mScrimSrcEnabled = scrimSrcEnabled; 98aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(false); 99ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 100ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 101ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setKeyguardShowing(boolean showing) { 102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mKeyguardShowing = showing; 103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 106ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onTrackingStarted() { 1072fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = true; 1082231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer mDarkenWhileDragging = !mUnlockMethodCache.isCurrentlyInsecure(); 109ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 110ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 1112fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi public void onExpandingFinished() { 1122fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = false; 1132fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } 1142fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi 115ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setPanelExpansion(float fraction) { 11693439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi if (mFraction != fraction) { 11793439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi mFraction = fraction; 11893439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi scheduleUpdate(); 119131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek if (mPinnedHeadsUpCount != 0) { 120131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek updateHeadsUpScrim(false); 121131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek } 12293439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi } 123ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 124ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 125ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setBouncerShowing(boolean showing) { 126ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mBouncerShowing = showing; 1272fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mAnimateChange = !mExpanding; 128ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 129ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 130ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 131e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) { 132e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateKeyguardFadingOut = true; 133e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = duration; 134e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = delay; 135e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateChange = true; 136e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = onAnimationFinished; 137e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi scheduleUpdate(); 138e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 139e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 140dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi public void animateGoingToFullShade(long delay, long duration) { 141dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mDurationOverride = duration; 142dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mAnimationDelay = delay; 143dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi mAnimateChange = true; 144dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi scheduleUpdate(); 145dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi } 146dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi 147048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozing(boolean dozing) { 148bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mDozing = dozing; 149bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scheduleUpdate(); 150bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 151bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 152048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozeInFrontAlpha(float alpha) { 153048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mDozeInFrontAlpha = alpha; 154048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(mScrimInFront); 155d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock } 156d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock 157048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public void setDozeBehindAlpha(float alpha) { 158048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mDozeBehindAlpha = alpha; 159048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(mScrimBehind); 160bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 161bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 162048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public float getDozeBehindAlpha() { 163048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return mDozeBehindAlpha; 1644d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown } 1654d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown 166048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi public float getDozeInFrontAlpha() { 167048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return mDozeInFrontAlpha; 168bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 169bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 170ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void scheduleUpdate() { 171ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (mUpdatePending) return; 172e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 173e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that a frame gets scheduled. 174e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mScrimBehind.invalidate(); 175ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this); 176ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = true; 177ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 178ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 179ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrims() { 18037c110fa14aed2bb54f685f3855feb30000322faSelim Cinek if (mAnimateKeyguardFadingOut || mForceHideScrims) { 181baa23274596246d03741457701ac515a73aa8818Selim Cinek setScrimInFrontColor(0f); 182baa23274596246d03741457701ac515a73aa8818Selim Cinek setScrimBehindColor(0f); 1838b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock } else if (!mKeyguardShowing && !mBouncerShowing) { 184ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimNormal(); 185ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0); 186ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 187ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimKeyguard(); 188ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 189ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mAnimateChange = false; 190ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 191ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 192ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimKeyguard() { 1932fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi if (mExpanding && mDarkenWhileDragging) { 194ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float behindFraction = Math.max(0, Math.min(mFraction, 1)); 195ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float fraction = 1 - behindFraction; 19676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi fraction = (float) Math.pow(fraction, 0.8f); 19776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi behindFraction = (float) Math.pow(behindFraction, 0.8f); 198ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA); 199ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(behindFraction * SCRIM_BEHIND_ALPHA_KEYGUARD); 2002fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } else if (mBouncerShowing) { 2012fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA); 2022fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimBehindColor(0f); 203ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 20476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi float fraction = Math.max(0, Math.min(mFraction, 1)); 205ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0f); 20676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi setScrimBehindColor(fraction 20776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi * (SCRIM_BEHIND_ALPHA_KEYGUARD - SCRIM_BEHIND_ALPHA_UNLOCKING) 20876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi + SCRIM_BEHIND_ALPHA_UNLOCKING); 209ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 210ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 211ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 212ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimNormal() { 213ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float frac = mFraction; 214ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // let's start this 20% of the way down the screen 215ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi frac = frac * 1.2f - 0.2f; 216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (frac <= 0) { 217ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(0); 218ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 219ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // woo, special effects 220ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f)))); 221ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(k * SCRIM_BEHIND_ALPHA); 222ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 223ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 224ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 225ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimBehindColor(float alpha) { 226ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimBehind, alpha); 227ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 228ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 229ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimInFrontColor(float alpha) { 230ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimInFront, alpha); 231ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (alpha == 0f) { 232ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront.setClickable(false); 233ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 234ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 2358b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock // Eat touch events (unless dozing). 2368b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock mScrimInFront.setClickable(!mDozing); 237ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 238ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 239ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 240aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void setScrimColor(View scrim, float alpha) { 2415e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi Object runningAnim = scrim.getTag(TAG_KEY_ANIM); 2425e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi if (runningAnim instanceof ValueAnimator) { 2435e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi ((ValueAnimator) runningAnim).cancel(); 2445e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi scrim.setTag(TAG_KEY_ANIM, null); 2455e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi } 246ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (mAnimateChange) { 247048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi startScrimAnimation(scrim, alpha); 248ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 249048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi setCurrentScrimAlpha(scrim, alpha); 250048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(scrim); 251ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 252ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 253ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 254048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float getDozeAlpha(View scrim) { 255048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha; 256048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 257048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 258048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private float getCurrentScrimAlpha(View scrim) { 259aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek return scrim == mScrimBehind ? mCurrentBehindAlpha 260aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek : scrim == mScrimInFront ? mCurrentInFrontAlpha 261aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek : mCurrentHeadsUpAlpha; 262048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 263048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 264048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi private void setCurrentScrimAlpha(View scrim, float alpha) { 265048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi if (scrim == mScrimBehind) { 266048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mCurrentBehindAlpha = alpha; 267aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else if (scrim == mScrimInFront) { 268048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi mCurrentInFrontAlpha = alpha; 269aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 270aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek alpha = Math.max(0.0f, Math.min(1.0f, alpha)); 271aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mCurrentHeadsUpAlpha = alpha; 272ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 273048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 274048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 275aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void updateScrimColor(View scrim) { 276048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float alpha1 = getCurrentScrimAlpha(scrim); 277aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (scrim instanceof ScrimView) { 278aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float alpha2 = getDozeAlpha(scrim); 279aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float alpha = 1 - (1 - alpha1) * (1 - alpha2); 280aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0)); 281aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 282aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek scrim.setAlpha(alpha1); 283aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 284048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi } 285048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi 286aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void startScrimAnimation(final View scrim, float target) { 287048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float current = getCurrentScrimAlpha(scrim); 288048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi ValueAnimator anim = ValueAnimator.ofFloat(current, target); 289ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 290ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 291ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onAnimationUpdate(ValueAnimator animation) { 292048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi float alpha = (float) animation.getAnimatedValue(); 293048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi setCurrentScrimAlpha(scrim, alpha); 294048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi updateScrimColor(scrim); 295ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 296ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi }); 29716423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi anim.setInterpolator(getInterpolator()); 298e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setStartDelay(mAnimationDelay); 299e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION); 300e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.addListener(new AnimatorListenerAdapter() { 301e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi @Override 302e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void onAnimationEnd(Animator animation) { 303e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (mOnAnimationFinished != null) { 304e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 305e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 306e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 307bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, null); 308e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 309e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi }); 310ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.start(); 311bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, anim); 312e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationStarted = true; 313ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 314ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 31516423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi private Interpolator getInterpolator() { 316048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi return mAnimateKeyguardFadingOut ? mLinearOutSlowInInterpolator : mInterpolator; 31716423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi } 31816423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi 319ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 320ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public boolean onPreDraw() { 321ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this); 322ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = false; 323ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrims(); 324e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateKeyguardFadingOut = false; 325e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = -1; 326e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = 0; 327e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 328e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that we always call the listener even if we didn't start an animation. 329e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (!mAnimationStarted && mOnAnimationFinished != null) { 330e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 331e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 332e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 333e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationStarted = false; 334ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi return true; 335ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 336bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 337a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek public void setBackDropView(BackDropView backDropView) { 338a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek mBackDropView = backDropView; 339a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek mBackDropView.setOnVisibilityChangedRunnable(new Runnable() { 340a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek @Override 341a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek public void run() { 342a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek updateScrimBehindDrawingMode(); 343a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek } 344a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek }); 345a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek updateScrimBehindDrawingMode(); 346a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek } 347a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek 348a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek private void updateScrimBehindDrawingMode() { 3490e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE && mScrimSrcEnabled; 350a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek mScrimBehind.setDrawAsSrc(asSrc); 351a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek } 352aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 353aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 354b349af573121cc659d775696066a13ed7101c308John Spurlock public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { 355aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 356aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 357aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 358684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpPinned(ExpandableNotificationRow headsUp) { 359684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mPinnedHeadsUpCount++; 360684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek updateHeadsUpScrim(true); 361684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek } 362684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek 363684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek @Override 364684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) { 365684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mPinnedHeadsUpCount--; 366684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek if (headsUp == mDraggedHeadsUpView) { 367684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mDraggedHeadsUpView = null; 368684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek mTopHeadsUpDragAmount = 0.0f; 369aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 370aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(true); 371aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 372aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 373aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek @Override 374684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) { 375aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 376aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 377aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private void updateHeadsUpScrim(boolean animate) { 378aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float alpha = calculateHeadsUpAlpha(); 379aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek ValueAnimator previousAnimator = StackStateAnimator.getChildTag(mHeadsUpScrim, 380aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek TAG_KEY_ANIM); 381aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float animEndValue = -1; 382aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (previousAnimator != null) { 383684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek if (animate || alpha == mCurrentHeadsUpAlpha) { 384aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek previousAnimator.cancel(); 385737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek } else { 386737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek animEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, TAG_HUN_END_ALPHA); 387aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 388aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 389aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (alpha != mCurrentHeadsUpAlpha && alpha != animEndValue) { 390aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (animate) { 391aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek startScrimAnimation(mHeadsUpScrim, alpha); 392aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, mCurrentHeadsUpAlpha); 393aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha); 394aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 395aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek if (previousAnimator != null) { 396aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float previousStartValue = StackStateAnimator.getChildTag(mHeadsUpScrim, 397aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek TAG_HUN_START_ALPHA); 398684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek float previousEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, 399aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek TAG_HUN_END_ALPHA); 400aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // we need to increase all animation keyframes of the previous animator by the 401aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // relative change to the end value 402aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek PropertyValuesHolder[] values = previousAnimator.getValues(); 403aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float relativeDiff = alpha - previousEndValue; 404aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek float newStartValue = previousStartValue + relativeDiff; 405aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek values[0].setFloatValues(newStartValue, alpha); 406aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, newStartValue); 407aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha); 408aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); 409aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 410aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek // update the alpha directly 411aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek setCurrentScrimAlpha(mHeadsUpScrim, alpha); 412aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateScrimColor(mHeadsUpScrim); 413aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 414aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 415aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 416aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 417aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 418684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek /** 419684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means 420684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * the heads up is in its resting space and 1 means it's fully dragged out. 421684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * 422684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * @param draggedHeadsUpView the dragged view 423684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek * @param topHeadsUpDragAmount how far is it dragged 424684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek */ 425aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) { 426aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mTopHeadsUpDragAmount = topHeadsUpDragAmount; 427aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek mDraggedHeadsUpView = draggedHeadsUpView; 428aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek updateHeadsUpScrim(false); 429aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 430aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek 431aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek private float calculateHeadsUpAlpha() { 432131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek float alpha; 433684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek if (mPinnedHeadsUpCount >= 2) { 434131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 1.0f; 435684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek } else if (mPinnedHeadsUpCount == 0) { 436131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 0.0f; 437aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } else { 438131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek alpha = 1.0f - mTopHeadsUpDragAmount; 439aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 440131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek float expandFactor = (1.0f - mFraction); 441131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek expandFactor = Math.max(expandFactor, 0.0f); 442131c1e2960fa5bdf54bfb6fcd5ac98c9f728f796Selim Cinek return alpha * expandFactor; 443aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek } 44437c110fa14aed2bb54f685f3855feb30000322faSelim Cinek 44537c110fa14aed2bb54f685f3855feb30000322faSelim Cinek public void forceHideScrims(boolean hide) { 44637c110fa14aed2bb54f685f3855feb30000322faSelim Cinek mForceHideScrims = hide; 44737c110fa14aed2bb54f685f3855feb30000322faSelim Cinek mAnimateChange = false; 44837c110fa14aed2bb54f685f3855feb30000322faSelim Cinek scheduleUpdate(); 44937c110fa14aed2bb54f685f3855feb30000322faSelim Cinek } 450ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi} 451