ScrimState.java

  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 }
原文地址:https://www.cnblogs.com/chaosDemo/p/9665236.html