ScrimController.java revision b349af573121cc659d775696066a13ed7101c308
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;
4876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.55f;
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;
86ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
87aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
88aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            boolean scrimSrcEnabled) {
89ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind = scrimBehind;
90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimInFront = scrimInFront;
91aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mHeadsUpScrim = headsUpScrim;
92d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        final Context context = scrimBehind.getContext();
93d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        mUnlockMethodCache = UnlockMethodCache.getInstance(context);
94d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock        mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
9576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                android.R.interpolator.linear_out_slow_in);
960e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        mScrimSrcEnabled = scrimSrcEnabled;
97aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
98ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
99ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
100ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
101ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mKeyguardShowing = showing;
102ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
103ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
104ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
105ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void onTrackingStarted() {
1062fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = true;
1072231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer        mDarkenWhileDragging = !mUnlockMethodCache.isCurrentlyInsecure();
108ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
109ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
1102fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
1112fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mExpanding = false;
1122fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
1132fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
114ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setPanelExpansion(float fraction) {
11593439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        if (mFraction != fraction) {
11693439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            mFraction = fraction;
11793439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi            scheduleUpdate();
11893439da0ed9213bc54291b3fce4e04dd3a7f9f3aJorim Jaggi        }
119ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
120ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
121ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public void setBouncerShowing(boolean showing) {
122ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mBouncerShowing = showing;
1232fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        mAnimateChange = !mExpanding;
124ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        scheduleUpdate();
125ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
126ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
127e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    public void animateKeyguardFadingOut(long delay, long duration, Runnable onAnimationFinished) {
128e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateKeyguardFadingOut = true;
129e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = duration;
130e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = delay;
131e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateChange = true;
132e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mOnAnimationFinished = onAnimationFinished;
133e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        scheduleUpdate();
134e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
135e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
136dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    public void animateGoingToFullShade(long delay, long duration) {
137dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mDurationOverride = duration;
138dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimationDelay = delay;
139dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        mAnimateChange = true;
140dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi        scheduleUpdate();
141dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi    }
142dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi
143048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozing(boolean dozing) {
144bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        mDozing = dozing;
145bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        scheduleUpdate();
146bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
147bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
148048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeInFrontAlpha(float alpha) {
149048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeInFrontAlpha = alpha;
150048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimInFront);
151d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock    }
152d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock
153048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public void setDozeBehindAlpha(float alpha) {
154048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        mDozeBehindAlpha = alpha;
155048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        updateScrimColor(mScrimBehind);
156bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
157bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
158048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeBehindAlpha() {
159048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeBehindAlpha;
1604d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown    }
1614d69e2219390bce567b0d2c986d0bd3a3182eda5Jeff Brown
162048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    public float getDozeInFrontAlpha() {
163048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mDozeInFrontAlpha;
164bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock    }
165bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
166ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void scheduleUpdate() {
167ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mUpdatePending) return;
168e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
169e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that a frame gets scheduled.
170e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mScrimBehind.invalidate();
171ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().addOnPreDrawListener(this);
172ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = true;
173ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
174ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
175ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrims() {
176baa23274596246d03741457701ac515a73aa8818Selim Cinek        if (mAnimateKeyguardFadingOut) {
177baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimInFrontColor(0f);
178baa23274596246d03741457701ac515a73aa8818Selim Cinek            setScrimBehindColor(0f);
1798b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock        } else if (!mKeyguardShowing && !mBouncerShowing) {
180ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimNormal();
181ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0);
182ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
183ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            updateScrimKeyguard();
184ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
185ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mAnimateChange = false;
186ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
187ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
188ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimKeyguard() {
1892fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        if (mExpanding && mDarkenWhileDragging) {
190ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float behindFraction = Math.max(0, Math.min(mFraction, 1));
191ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            float fraction = 1 - behindFraction;
19276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            fraction = (float) Math.pow(fraction, 0.8f);
19376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            behindFraction = (float) Math.pow(behindFraction, 0.8f);
194ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(fraction * SCRIM_IN_FRONT_ALPHA);
195ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(behindFraction * SCRIM_BEHIND_ALPHA_KEYGUARD);
1962fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi        } else if (mBouncerShowing) {
1972fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimInFrontColor(SCRIM_IN_FRONT_ALPHA);
1982fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            setScrimBehindColor(0f);
199ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
20076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            float fraction = Math.max(0, Math.min(mFraction, 1));
201ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimInFrontColor(0f);
20276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            setScrimBehindColor(fraction
20376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    * (SCRIM_BEHIND_ALPHA_KEYGUARD - SCRIM_BEHIND_ALPHA_UNLOCKING)
20476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    + SCRIM_BEHIND_ALPHA_UNLOCKING);
205ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
206ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
207ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
208ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void updateScrimNormal() {
209ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        float frac = mFraction;
210ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        // let's start this 20% of the way down the screen
211ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        frac = frac * 1.2f - 0.2f;
212ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (frac <= 0) {
213ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(0);
214ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
215ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            // woo, special effects
216ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2f))));
217ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            setScrimBehindColor(k * SCRIM_BEHIND_ALPHA);
218ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
219ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
220ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
221ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimBehindColor(float alpha) {
222ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimBehind, alpha);
223ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
224ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
225ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private void setScrimInFrontColor(float alpha) {
226ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        setScrimColor(mScrimInFront, alpha);
227ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (alpha == 0f) {
228ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimInFront.setClickable(false);
229ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
230ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
2318b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // Eat touch events (unless dozing).
2328b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            mScrimInFront.setClickable(!mDozing);
233ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
234ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
235ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
236aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void setScrimColor(View scrim, float alpha) {
2375e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi        Object runningAnim = scrim.getTag(TAG_KEY_ANIM);
2385e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi        if (runningAnim instanceof ValueAnimator) {
2395e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi            ((ValueAnimator) runningAnim).cancel();
2405e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi            scrim.setTag(TAG_KEY_ANIM, null);
2415e08e6957d1ada027ee93a0c8f745a9f8b89bb60Jorim Jaggi        }
242ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        if (mAnimateChange) {
243048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            startScrimAnimation(scrim, alpha);
244ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        } else {
245048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            setCurrentScrimAlpha(scrim, alpha);
246048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            updateScrimColor(scrim);
247ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
248ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
249ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
250048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getDozeAlpha(View scrim) {
251048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return scrim == mScrimBehind ? mDozeBehindAlpha : mDozeInFrontAlpha;
252048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
253048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
254048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private float getCurrentScrimAlpha(View scrim) {
255aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        return scrim == mScrimBehind ? mCurrentBehindAlpha
256aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : scrim == mScrimInFront ? mCurrentInFrontAlpha
257aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                : mCurrentHeadsUpAlpha;
258048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
259048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
260048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    private void setCurrentScrimAlpha(View scrim, float alpha) {
261048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        if (scrim == mScrimBehind) {
262048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentBehindAlpha = alpha;
263aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else if (scrim == mScrimInFront) {
264048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi            mCurrentInFrontAlpha = alpha;
265aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
266aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            alpha = Math.max(0.0f, Math.min(1.0f, alpha));
267aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            mCurrentHeadsUpAlpha = alpha;
268ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        }
269048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
270048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
271aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateScrimColor(View scrim) {
272048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float alpha1 = getCurrentScrimAlpha(scrim);
273aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (scrim instanceof ScrimView) {
274aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha2 = getDozeAlpha(scrim);
275aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            float alpha = 1 - (1 - alpha1) * (1 - alpha2);
276aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0));
277aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
278aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            scrim.setAlpha(alpha1);
279aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
280048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi    }
281048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi
282aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void startScrimAnimation(final View scrim, float target) {
283048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        float current = getCurrentScrimAlpha(scrim);
284048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        ValueAnimator anim = ValueAnimator.ofFloat(current, target);
285ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
286ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            @Override
287ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
288048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                float alpha = (float) animation.getAnimatedValue();
289048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                setCurrentScrimAlpha(scrim, alpha);
290048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi                updateScrimColor(scrim);
291ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            }
292ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        });
29316423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi        anim.setInterpolator(getInterpolator());
294e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setStartDelay(mAnimationDelay);
295e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION);
296e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        anim.addListener(new AnimatorListenerAdapter() {
297e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            @Override
298e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            public void onAnimationEnd(Animator animation) {
299e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                if (mOnAnimationFinished != null) {
300e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished.run();
301e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                    mOnAnimationFinished = null;
302e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi                }
303bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock                scrim.setTag(TAG_KEY_ANIM, null);
304e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            }
305e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        });
306ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        anim.start();
307bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock        scrim.setTag(TAG_KEY_ANIM, anim);
308e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationStarted = true;
309ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
310ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi
31116423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    private Interpolator getInterpolator() {
312048af1f727dc81a6450e004391d072599ac449eeJorim Jaggi        return mAnimateKeyguardFadingOut ? mLinearOutSlowInInterpolator : mInterpolator;
31316423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi    }
31416423aa0c6d1f5a8e9abd294d876933d44361fbcJorim Jaggi
315ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    @Override
316ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    public boolean onPreDraw() {
317ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this);
318ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mUpdatePending = false;
319ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        updateScrims();
320e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimateKeyguardFadingOut = false;
321e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mDurationOverride = -1;
322e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationDelay = 0;
323e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
324e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        // Make sure that we always call the listener even if we didn't start an animation.
325e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        if (!mAnimationStarted && mOnAnimationFinished != null) {
326e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished.run();
327e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mOnAnimationFinished = null;
328e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
329e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mAnimationStarted = false;
330ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        return true;
331ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    }
332bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock
333a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    public void setBackDropView(BackDropView backDropView) {
334a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mBackDropView = backDropView;
335a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mBackDropView.setOnVisibilityChangedRunnable(new Runnable() {
336a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            @Override
337a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            public void run() {
338a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek                updateScrimBehindDrawingMode();
339a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek            }
340a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        });
341a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        updateScrimBehindDrawingMode();
342a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
343a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek
344a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private void updateScrimBehindDrawingMode() {
3450e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE && mScrimSrcEnabled;
346a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mScrimBehind.setDrawAsSrc(asSrc);
347a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    }
348aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
349aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
350b349af573121cc659d775696066a13ed7101c308John Spurlock    public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
351aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
352aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
353aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
354684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
355684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount++;
356684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        updateHeadsUpScrim(true);
357684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    }
358684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
359684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    @Override
360684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
361684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mPinnedHeadsUpCount--;
362684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (headsUp == mDraggedHeadsUpView) {
363684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mDraggedHeadsUpView = null;
364684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            mTopHeadsUpDragAmount = 0.0f;
365aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
366aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(true);
367aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
368aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
369aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    @Override
370684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
371aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
372aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
373aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private void updateHeadsUpScrim(boolean animate) {
374aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float alpha = calculateHeadsUpAlpha();
375aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        ValueAnimator previousAnimator = StackStateAnimator.getChildTag(mHeadsUpScrim,
376aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                TAG_KEY_ANIM);
377aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        float animEndValue = -1;
378aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (previousAnimator != null) {
379684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            if (animate || alpha == mCurrentHeadsUpAlpha) {
380aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                previousAnimator.cancel();
381aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
382684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            animEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, TAG_HUN_START_ALPHA);
383aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
384aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        if (alpha != mCurrentHeadsUpAlpha && alpha != animEndValue) {
385aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            if (animate) {
386aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                startScrimAnimation(mHeadsUpScrim, alpha);
387aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, mCurrentHeadsUpAlpha);
388aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha);
389aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            } else {
390aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                if (previousAnimator != null) {
391aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float previousStartValue = StackStateAnimator.getChildTag(mHeadsUpScrim,
392aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                            TAG_HUN_START_ALPHA);
393684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek                    float previousEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim,
394aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                           TAG_HUN_END_ALPHA);
395aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // we need to increase all animation keyframes of the previous animator by the
396aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // relative change to the end value
397aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    PropertyValuesHolder[] values = previousAnimator.getValues();
398aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float relativeDiff = alpha - previousEndValue;
399aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    float newStartValue = previousStartValue + relativeDiff;
400aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    values[0].setFloatValues(newStartValue, alpha);
401aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, newStartValue);
402aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha);
403aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime());
404aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                } else {
405aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    // update the alpha directly
406aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    setCurrentScrimAlpha(mHeadsUpScrim, alpha);
407aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                    updateScrimColor(mHeadsUpScrim);
408aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek                }
409aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            }
410aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
411aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
412aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
413684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
414684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means
415684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the heads up is in its resting space and 1 means it's fully dragged out.
416684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
417684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param draggedHeadsUpView the dragged view
418684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param topHeadsUpDragAmount how far is it dragged
419684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
420aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) {
421aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mTopHeadsUpDragAmount = topHeadsUpDragAmount;
422aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        mDraggedHeadsUpView = draggedHeadsUpView;
423aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        updateHeadsUpScrim(false);
424aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
425aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek
426aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    private float calculateHeadsUpAlpha() {
427684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        if (mPinnedHeadsUpCount >= 2) {
428aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            return 1.0f;
429684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        } else if (mPinnedHeadsUpCount == 0) {
430aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            return 0.0f;
431aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        } else {
432aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek            return 1.0f - mTopHeadsUpDragAmount;
433aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek        }
434aac932591d7aa05bae61d2b47ed7647f35da0001Selim Cinek    }
435ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi}
436