ScrimController.java revision bf370992508c55d1f2493923bdc1834a0710e4ba
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; 21ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.animation.ValueAnimator; 22ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.graphics.Color; 23ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.graphics.drawable.ColorDrawable; 24bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport android.util.Log; 25ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.View; 26ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.ViewTreeObserver; 27ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.DecelerateInterpolator; 28ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport android.view.animation.Interpolator; 29ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 30bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlockimport com.android.systemui.R; 31bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 32ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi/** 33ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * Controls both the scrim behind the notifications and in front of the notifications (when a 34ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi * security method gets shown). 35ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi */ 36ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggipublic class ScrimController implements ViewTreeObserver.OnPreDrawListener { 37bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final String TAG = "ScrimController"; 38bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final boolean DEBUG = false; 39ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 40ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA = 0.62f; 41ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.5f; 42ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final float SCRIM_IN_FRONT_ALPHA = 0.75f; 43ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private static final long ANIMATION_DURATION = 220; 44bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final int TAG_KEY_ANIM = R.id.scrim; 45bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 46bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final int NUM_TEASES = 3; 47bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final long TEASE_IN_ANIMATION_DURATION = 500; 48bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final long TEASE_VISIBLE_DURATION = 3000; 49bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final long TEASE_OUT_ANIMATION_DURATION = 1000; 50bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final long TEASE_INVISIBLE_DURATION = 1000; 51bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private static final long TEASE_DURATION = TEASE_IN_ANIMATION_DURATION 52bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock + TEASE_VISIBLE_DURATION + TEASE_OUT_ANIMATION_DURATION + TEASE_INVISIBLE_DURATION; 53ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 54ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final View mScrimBehind; 55ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final View mScrimInFront; 56ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final UnlockMethodCache mUnlockMethodCache; 57ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 58ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mKeyguardShowing; 59ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private float mFraction; 60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 61ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mDarkenWhileDragging; 62ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mBouncerShowing; 63ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mAnimateChange; 64ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private boolean mUpdatePending; 652fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi private boolean mExpanding; 66e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private boolean mAnimateKeyguardFadingOut; 67e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mDurationOverride = -1; 68e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private long mAnimationDelay; 69e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private Runnable mOnAnimationFinished; 70e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private boolean mAnimationStarted; 71bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private boolean mDozing; 72bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private int mTeasesRemaining; 73ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 74ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private final Interpolator mInterpolator = new DecelerateInterpolator(); 75ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 76ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public ScrimController(View scrimBehind, View scrimInFront) { 77ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind = scrimBehind; 78ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront = scrimInFront; 79ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUnlockMethodCache = UnlockMethodCache.getInstance(scrimBehind.getContext()); 80ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 81ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 82ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setKeyguardShowing(boolean showing) { 83ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mKeyguardShowing = showing; 84ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 85ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 86ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 87ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onTrackingStarted() { 882fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = true; 89ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mDarkenWhileDragging = !mUnlockMethodCache.isMethodInsecure(); 90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 91ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 922fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi public void onExpandingFinished() { 932fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mExpanding = false; 942fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } 952fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi 96ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setPanelExpansion(float fraction) { 97ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mFraction = fraction; 98ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 99ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 100ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 101ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void setBouncerShowing(boolean showing) { 102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mBouncerShowing = showing; 1032fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi mAnimateChange = !mExpanding; 104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scheduleUpdate(); 105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 106ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 107e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) { 108e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateKeyguardFadingOut = true; 109e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = duration; 110e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = delay; 111e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateChange = true; 112e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = onAnimationFinished; 113e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi scheduleUpdate(); 114e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 115e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 116bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void setDozing(boolean dozing) { 117bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mDozing == dozing) return; 118bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mDozing = dozing; 119bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mDozing) { 120bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock cancelTeasing(); 121bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 122bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scheduleUpdate(); 123bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 124bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 125bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock /** When dozing, fade screen contents in and out a few times using the front scrim. */ 126bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public long tease() { 127bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mDozing) return 0; 128bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mTeasesRemaining = NUM_TEASES; 129bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mScrimInFront.post(mTeaseIn); 130bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock return NUM_TEASES * TEASE_DURATION; 131bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 132bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 133bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private void cancelTeasing() { 134bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mTeasesRemaining = 0; 135bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mScrimInFront.removeCallbacks(mTeaseIn); 136bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mScrimInFront.removeCallbacks(mTeaseOut); 137bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 138bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 139ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void scheduleUpdate() { 140ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (mUpdatePending) return; 141e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 142e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that a frame gets scheduled. 143e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mScrimBehind.invalidate(); 144ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this); 145ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = true; 146ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 147ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 148ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrims() { 149e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (!mKeyguardShowing || mAnimateKeyguardFadingOut) { 150ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimNormal(); 151ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0); 152ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 153ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrimKeyguard(); 154ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 155ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mAnimateChange = false; 156ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 157ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 158ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimKeyguard() { 1592fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi if (mExpanding && mDarkenWhileDragging) { 160ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float behindFraction = Math.max(0, Math.min(mFraction, 1)); 161ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float fraction = 1 - behindFraction; 162ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA); 163ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(behindFraction * SCRIM_BEHIND_ALPHA_KEYGUARD); 1642fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi } else if (mBouncerShowing) { 1652fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA); 1662fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi setScrimBehindColor(0f); 167bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } else if (mDozing) { 168bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock setScrimInFrontColor(1); 169ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 170ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimInFrontColor(0f); 171ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(SCRIM_BEHIND_ALPHA_KEYGUARD); 172ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 173ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 174ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 175ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void updateScrimNormal() { 176ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi float frac = mFraction; 177ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // let's start this 20% of the way down the screen 178ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi frac = frac * 1.2f - 0.2f; 179ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (frac <= 0) { 180ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(0); 181ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 182ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // woo, special effects 183ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f)))); 184ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimBehindColor(k * SCRIM_BEHIND_ALPHA); 185ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 186ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 187ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 188ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimBehindColor(float alpha) { 189ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimBehind, alpha); 190ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 191ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 192ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimInFrontColor(float alpha) { 193ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi setScrimColor(mScrimInFront, alpha); 194ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (alpha == 0f) { 195ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront.setClickable(false); 196ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 197ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 198ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi // Eat touch events. 199ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimInFront.setClickable(true); 200ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 201ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 202ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 203ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void setScrimColor(View scrim, float alpha) { 204ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi int color = Color.argb((int) (alpha * 255), 0, 0, 0); 205ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (mAnimateChange) { 206ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi startScrimAnimation(scrim, color); 207ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 208ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scrim.setBackgroundColor(color); 209ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 210ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 211ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 212ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private void startScrimAnimation(final View scrim, int targetColor) { 213ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi int current = getBackgroundAlpha(scrim); 214ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi int target = Color.alpha(targetColor); 215ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (current == targetColor) { 216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi return; 217ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 218bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock Object runningAnim = scrim.getTag(TAG_KEY_ANIM); 219bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (runningAnim instanceof ValueAnimator) { 220bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock ((ValueAnimator) runningAnim).cancel(); 221bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 222ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi ValueAnimator anim = ValueAnimator.ofInt(current, target); 223ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 224ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 225ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public void onAnimationUpdate(ValueAnimator animation) { 226ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi int value = (int) animation.getAnimatedValue(); 227ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi scrim.setBackgroundColor(Color.argb(value, 0, 0, 0)); 228ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 229ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi }); 230ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.setInterpolator(mInterpolator); 231e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setStartDelay(mAnimationDelay); 232e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION); 233e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi anim.addListener(new AnimatorListenerAdapter() { 234e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 235e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi @Override 236e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void onAnimationEnd(Animator animation) { 237e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (mOnAnimationFinished != null) { 238e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 239e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 240e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 241bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, null); 242e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 243e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi }); 244ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi anim.start(); 245bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock scrim.setTag(TAG_KEY_ANIM, anim); 246e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationStarted = true; 247ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 248ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 249ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi private int getBackgroundAlpha(View scrim) { 250ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi if (scrim.getBackground() instanceof ColorDrawable) { 251ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi ColorDrawable drawable = (ColorDrawable) scrim.getBackground(); 252ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi return Color.alpha(drawable.getColor()); 253ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } else { 254ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi return 0; 255ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 256ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 257ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi 258ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi @Override 259ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi public boolean onPreDraw() { 260ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this); 261ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi mUpdatePending = false; 262ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi updateScrims(); 263e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimateKeyguardFadingOut = false; 264e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mDurationOverride = -1; 265e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationDelay = 0; 266e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 267e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi // Make sure that we always call the listener even if we didn't start an animation. 268e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi if (!mAnimationStarted && mOnAnimationFinished != null) { 269e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished.run(); 270e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mOnAnimationFinished = null; 271e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 272e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mAnimationStarted = false; 273ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi return true; 274ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi } 275bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 276bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private final Runnable mTeaseIn = new Runnable() { 277bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock @Override 278bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void run() { 279bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (DEBUG) Log.d(TAG, "Tease in, mDozing=" + mDozing 280bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock + " mTeasesRemaining=" + mTeasesRemaining); 281bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mDozing || mTeasesRemaining == 0) return; 282bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mTeasesRemaining--; 283bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mDurationOverride = TEASE_IN_ANIMATION_DURATION; 284bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mAnimationDelay = 0; 285bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mAnimateChange = true; 286bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mOnAnimationFinished = mTeaseInFinished; 287bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock setScrimColor(mScrimInFront, 0); 288bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 289bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock }; 290bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 291bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private final Runnable mTeaseInFinished = new Runnable() { 292bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock @Override 293bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void run() { 294bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (DEBUG) Log.d(TAG, "Tease in finished, mDozing=" + mDozing); 295bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mDozing) return; 296bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mScrimInFront.postDelayed(mTeaseOut, TEASE_VISIBLE_DURATION); 297bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 298bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock }; 299bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 300bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private final Runnable mTeaseOut = new Runnable() { 301bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock @Override 302bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void run() { 303bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (DEBUG) Log.d(TAG, "Tease in finished, mDozing=" + mDozing); 304bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mDozing) return; 305bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mDurationOverride = TEASE_OUT_ANIMATION_DURATION; 306bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mAnimationDelay = 0; 307bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mAnimateChange = true; 308bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mOnAnimationFinished = mTeaseOutFinished; 309bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock setScrimColor(mScrimInFront, 1); 310bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 311bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock }; 312bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 313bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private final Runnable mTeaseOutFinished = new Runnable() { 314bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock @Override 315bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void run() { 316bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (DEBUG) Log.d(TAG, "Tease out finished, mTeasesRemaining=" + mTeasesRemaining); 317bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mTeasesRemaining > 0) { 318bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mScrimInFront.postDelayed(mTeaseIn, TEASE_INVISIBLE_DURATION); 319bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 320bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 321bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock }; 322ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi} 323