1 /*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17 package com.android.systemui.statusbar.phone;
18
19 import android.graphics.Color;
20 import android.os.Trace;
21 import android.util.MathUtils;
22
23 import com.android.keyguard.KeyguardUpdateMonitor;
24 import com.android.systemui.statusbar.ScrimView;
25 import com.android.systemui.statusbar.stack.StackStateAnimator;
26
27 /**
28 * Possible states of the ScrimController state machine.
29 */
30 public enum ScrimState {
31
32 /**
33 * Initial state.
34 */
35 UNINITIALIZED(-1),
36
37 /**
38 * On the lock screen.
39 */
40 KEYGUARD(0) {
41
42 @Override
43 public void prepare(ScrimState previousState) {
44 mBlankScreen = false;
45 if (previousState == ScrimState.AOD) {
46 mAnimationDuration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
47 if (mDisplayRequiresBlanking) {
48 // DisplayPowerManager will blank the screen, we'll just
49 // set our scrim to black in this frame to avoid flickering and
50 // fade it out afterwards.
51 mBlankScreen = true;
52 }
53 } else {
54 mAnimationDuration = ScrimController.ANIMATION_DURATION;
55 }
56 mCurrentBehindAlpha = mScrimBehindAlphaKeyguard;
57 mCurrentInFrontAlpha = 0;
58 }
59
60 @Override
61 public float getBehindAlpha(float busynessFactor) {
62 return MathUtils.map(0 /* start */, 1 /* stop */,
63 mScrimBehindAlphaKeyguard, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY,
64 busynessFactor);
65 }
66 },
67
68 /**
69 * Showing password challenge on the keyguard.
70 */
71 BOUNCER(1) {
72 @Override
73 public void prepare(ScrimState previousState) {
74 mCurrentBehindAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY;
75 mCurrentInFrontAlpha = 0f;
76 }
77 },
78
79 /**
80 * Showing password challenge on top of a FLAG_SHOW_WHEN_LOCKED activity.
81 */
82 BOUNCER_SCRIMMED(2) {
83 @Override
84 public void prepare(ScrimState previousState) {
85 mCurrentBehindAlpha = 0;
86 mCurrentInFrontAlpha = ScrimController.GRADIENT_SCRIM_ALPHA_BUSY;
87 }
88 },
89
90 /**
91 * Changing screen brightness from quick settings.
92 */
93 BRIGHTNESS_MIRROR(3) {
94 @Override
95 public void prepare(ScrimState previousState) {
96 mCurrentBehindAlpha = 0;
97 mCurrentInFrontAlpha = 0;
98 }
99 },
100
101 /**
102 * Always on display or screen off.
103 */
104 AOD(4) {
105 @Override
106 public void prepare(ScrimState previousState) {
107 final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
108 mBlankScreen = mDisplayRequiresBlanking;
109 mCurrentBehindAlpha = mWallpaperSupportsAmbientMode
110 && !mKeyguardUpdateMonitor.hasLockscreenWallpaper() ? 0f : 1f;
111 mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f;
112 mCurrentInFrontTint = Color.BLACK;
113 mCurrentBehindTint = Color.BLACK;
114 mAnimationDuration = ScrimController.ANIMATION_DURATION_LONG;
115 // DisplayPowerManager may blank the screen for us,
116 // in this case we just need to set our state.
117 mAnimateChange = mDozeParameters.shouldControlScreenOff();
118 }
119
120 @Override
121 public boolean isLowPowerState() {
122 return true;
123 }
124 },
125
126 /**
127 * When phone wakes up because you received a notification.
128 */
129 PULSING(5) {
130 @Override
131 public void prepare(ScrimState previousState) {
132 mCurrentInFrontAlpha = 0;
133 mCurrentInFrontTint = Color.BLACK;
134 mCurrentBehindAlpha = mWallpaperSupportsAmbientMode
135 && !mKeyguardUpdateMonitor.hasLockscreenWallpaper() ? 0f : 1f;
136 mCurrentBehindTint = Color.BLACK;
137 mBlankScreen = mDisplayRequiresBlanking;
138 }
139 },
140
141 /**
142 * Unlocked on top of an app (launcher or any other activity.)
143 */
144 UNLOCKED(6) {
145 @Override
146 public void prepare(ScrimState previousState) {
147 mCurrentBehindAlpha = 0;
148 mCurrentInFrontAlpha = 0;
149 mAnimationDuration = StatusBar.FADE_KEYGUARD_DURATION;
150
151 if (previousState == ScrimState.AOD || previousState == ScrimState.PULSING) {
152 // Fade from black to transparent when coming directly from AOD
153 updateScrimColor(mScrimInFront, 1, Color.BLACK);
154 updateScrimColor(mScrimBehind, 1, Color.BLACK);
155 // Scrims should still be black at the end of the transition.
156 mCurrentInFrontTint = Color.BLACK;
157 mCurrentBehindTint = Color.BLACK;
158 mBlankScreen = true;
159 } else {
160 mCurrentInFrontTint = Color.TRANSPARENT;
161 mCurrentBehindTint = Color.TRANSPARENT;
162 mBlankScreen = false;
163 }
164 }
165 };
166
167 boolean mBlankScreen = false;
168 long mAnimationDuration = ScrimController.ANIMATION_DURATION;
169 int mCurrentInFrontTint = Color.TRANSPARENT;
170 int mCurrentBehindTint = Color.TRANSPARENT;
171 boolean mAnimateChange = true;
172 float mCurrentInFrontAlpha;
173 float mCurrentBehindAlpha;
174 float mAodFrontScrimAlpha;
175 float mScrimBehindAlphaKeyguard;
176 ScrimView mScrimInFront;
177 ScrimView mScrimBehind;
178 DozeParameters mDozeParameters;
179 boolean mDisplayRequiresBlanking;
180 boolean mWallpaperSupportsAmbientMode;
181 KeyguardUpdateMonitor mKeyguardUpdateMonitor;
182 int mIndex;
183
184 ScrimState(int index) {
185 mIndex = index;
186 }
187
188 public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) {
189 mScrimInFront = scrimInFront;
190 mScrimBehind = scrimBehind;
191 mDozeParameters = dozeParameters;
192 mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
193 mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(scrimInFront.getContext());
194 }
195
196 public void prepare(ScrimState previousState) {
197 }
198
199 public int getIndex() {
200 return mIndex;
201 }
202
203 public float getFrontAlpha() {
204 return mCurrentInFrontAlpha;
205 }
206
207 public float getBehindAlpha(float busyness) {
208 return mCurrentBehindAlpha;
209 }
210
211 public int getFrontTint() {
212 return mCurrentInFrontTint;
213 }
214
215 public int getBehindTint() {
216 return mCurrentBehindTint;
217 }
218
219 public long getAnimationDuration() {
220 return mAnimationDuration;
221 }
222
223 public boolean getBlanksScreen() {
224 return mBlankScreen;
225 }
226
227 public void updateScrimColor(ScrimView scrim, float alpha, int tint) {
228 Trace.traceCounter(Trace.TRACE_TAG_APP,
229 scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha",
230 (int) (alpha * 255));
231
232 Trace.traceCounter(Trace.TRACE_TAG_APP,
233 scrim == mScrimInFront ? "front_scrim_tint" : "back_scrim_tint",
234 Color.alpha(tint));
235
236 scrim.setTint(tint);
237 scrim.setViewAlpha(alpha);
238 }
239
240 public boolean getAnimateChange() {
241 return mAnimateChange;
242 }
243
244 public void setAodFrontScrimAlpha(float aodFrontScrimAlpha) {
245 mAodFrontScrimAlpha = aodFrontScrimAlpha;
246 }
247
248 public void setScrimBehindAlphaKeyguard(float scrimBehindAlphaKeyguard) {
249 mScrimBehindAlphaKeyguard = scrimBehindAlphaKeyguard;
250 }
251
252 public void setWallpaperSupportsAmbientMode(boolean wallpaperSupportsAmbientMode) {
253 mWallpaperSupportsAmbientMode = wallpaperSupportsAmbientMode;
254 }
255
256 public boolean isLowPowerState() {
257 return false;
258 }
259 }