blob: 2070c965754c96cfc9f54326308e093cd5690c0b [file] [log] [blame]
Jorim Jaggi5cf17872014-03-26 18:31:48 +01001/*
2 * Copyright (C) 2014 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
17package com.android.systemui.statusbar.phone;
18
Jorim Jaggi786afcb2014-09-25 02:41:29 +020019import android.content.ComponentCallbacks2;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010020import android.content.Context;
21import android.os.Bundle;
Jorim Jaggie29b2db2014-05-30 23:17:03 +020022import android.os.SystemClock;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070023import android.os.Trace;
Jorim Jaggidf993512014-05-13 23:06:35 +020024import android.view.KeyEvent;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010025import android.view.View;
26import android.view.ViewGroup;
Jorim Jaggi786afcb2014-09-25 02:41:29 +020027import android.view.WindowManagerGlobal;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010028
Jorim Jaggi5cf17872014-03-26 18:31:48 +010029import com.android.internal.widget.LockPatternUtils;
Adrian Roosb6011622014-05-14 15:52:53 +020030import com.android.keyguard.KeyguardUpdateMonitor;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010031import com.android.keyguard.ViewMediatorCallback;
Jim Miller25d7e512015-03-03 17:12:09 -080032import com.android.systemui.statusbar.CommandQueue;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010033
Jorim Jaggi6b88cdf2014-12-22 20:56:50 +010034import static com.android.keyguard.KeyguardHostView.OnDismissAction;
Adrian Roos7d7090d2014-05-21 13:10:23 +020035
Jorim Jaggi5cf17872014-03-26 18:31:48 +010036/**
37 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
38 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
39 * which is in turn, reported to this class by the current
40 * {@link com.android.keyguard.KeyguardViewBase}.
41 */
42public class StatusBarKeyguardViewManager {
Jorim Jaggi76a16232014-08-08 17:00:47 +020043
44 // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
45 private static final long HIDE_TIMING_CORRECTION_MS = -3 * 16;
46
Jorim Jaggi416493b2014-09-13 03:57:32 +020047 // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
48 // with the appear animations of the PIN/pattern/password views.
49 private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
50
Jorim Jaggi007f0e82015-08-14 13:56:01 -070051 private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
52
Jorim Jaggi5cf17872014-03-26 18:31:48 +010053 private static String TAG = "StatusBarKeyguardViewManager";
54
55 private final Context mContext;
56
57 private LockPatternUtils mLockPatternUtils;
58 private ViewMediatorCallback mViewMediatorCallback;
59 private PhoneStatusBar mPhoneStatusBar;
Jorim Jaggiecc798e2014-05-26 18:14:37 +020060 private ScrimController mScrimController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010061
Jorim Jaggi5cf17872014-03-26 18:31:48 +010062 private ViewGroup mContainer;
63 private StatusBarWindowManager mStatusBarWindowManager;
64
Jorim Jaggi0d210f62015-07-10 14:24:44 -070065 private boolean mDeviceInteractive = false;
66 private boolean mScreenTurnedOn;
Jorim Jaggi03c701e2014-04-02 12:39:51 +020067 private KeyguardBouncer mBouncer;
68 private boolean mShowing;
Jorim Jaggia6310292014-04-16 14:11:52 +020069 private boolean mOccluded;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010070
Adrian Roosb6011622014-05-14 15:52:53 +020071 private boolean mFirstUpdate = true;
72 private boolean mLastShowing;
73 private boolean mLastOccluded;
74 private boolean mLastBouncerShowing;
75 private boolean mLastBouncerDismissible;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070076 private boolean mLastDeferScrimFadeOut;
Jorim Jaggi746f7fa2014-08-27 17:52:46 +020077 private OnDismissAction mAfterKeyguardGoneAction;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070078 private boolean mDeviceWillWakeUp;
79 private boolean mWakeAndUnlocking;
80 private boolean mDeferScrimFadeOut;
Adrian Roosb6011622014-05-14 15:52:53 +020081
Jorim Jaggi5cf17872014-03-26 18:31:48 +010082 public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
83 LockPatternUtils lockPatternUtils) {
84 mContext = context;
85 mViewMediatorCallback = callback;
86 mLockPatternUtils = lockPatternUtils;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010087 }
88
89 public void registerStatusBar(PhoneStatusBar phoneStatusBar,
Jorim Jaggiecc798e2014-05-26 18:14:37 +020090 ViewGroup container, StatusBarWindowManager statusBarWindowManager,
91 ScrimController scrimController) {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010092 mPhoneStatusBar = phoneStatusBar;
93 mContainer = container;
94 mStatusBarWindowManager = statusBarWindowManager;
Jorim Jaggiecc798e2014-05-26 18:14:37 +020095 mScrimController = scrimController;
Jorim Jaggi03c701e2014-04-02 12:39:51 +020096 mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils,
97 mStatusBarWindowManager, container);
Jorim Jaggi5cf17872014-03-26 18:31:48 +010098 }
99
100 /**
101 * Show the keyguard. Will handle creating and attaching to the view manager
102 * lazily.
103 */
104 public void show(Bundle options) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200105 mShowing = true;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200106 mStatusBarWindowManager.setKeyguardShowing(true);
Selim Cinekedd32b82015-06-23 22:05:58 -0400107 mScrimController.abortKeyguardFadingOut();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200108 reset();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100109 }
110
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200111 /**
112 * Shows the notification keyguard or the bouncer depending on
113 * {@link KeyguardBouncer#needsFullscreenBouncer()}.
114 */
115 private void showBouncerOrKeyguard() {
116 if (mBouncer.needsFullscreenBouncer()) {
117
118 // The keyguard might be showing (already). So we need to hide it.
119 mPhoneStatusBar.hideKeyguard();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100120 mBouncer.show(true /* resetSecuritySelection */);
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200121 } else {
122 mPhoneStatusBar.showKeyguard();
Jorim Jaggia0be6d52014-05-26 03:01:13 +0200123 mBouncer.hide(false /* destroyView */);
Jorim Jaggi2fbad7b2014-05-26 22:38:00 +0200124 mBouncer.prepare();
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200125 }
126 }
127
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200128 private void showBouncer() {
Adrian Roos0002a452014-07-03 13:46:07 +0200129 if (mShowing) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100130 mBouncer.show(false /* resetSecuritySelection */);
Dan Sandler3806c772014-05-08 14:52:10 -0400131 }
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200132 updateStates();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100133 }
134
Jorim Jaggid9449862015-05-29 14:49:08 -0700135 public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
136 boolean afterKeyguardGone) {
Adrian Roos0002a452014-07-03 13:46:07 +0200137 if (mShowing) {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200138 if (!afterKeyguardGone) {
Jorim Jaggid9449862015-05-29 14:49:08 -0700139 mBouncer.showWithDismissAction(r, cancelAction);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200140 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100141 mBouncer.show(false /* resetSecuritySelection */);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200142 mAfterKeyguardGoneAction = r;
143 }
Adrian Roos7d7090d2014-05-21 13:10:23 +0200144 }
145 updateStates();
146 }
147
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100148 /**
149 * Reset the state of the view.
150 */
151 public void reset() {
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200152 if (mShowing) {
153 if (mOccluded) {
154 mPhoneStatusBar.hideKeyguard();
Adrian Roosd322f1a2015-04-23 15:19:45 -0700155 mPhoneStatusBar.stopWaitingForKeyguardExit();
Jorim Jaggia0be6d52014-05-26 03:01:13 +0200156 mBouncer.hide(false /* destroyView */);
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200157 } else {
158 showBouncerOrKeyguard();
159 }
Selim Cinek1fcafc42015-07-20 14:39:25 -0700160 KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200161 updateStates();
Dan Sandler3806c772014-05-08 14:52:10 -0400162 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100163 }
164
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700165 public void onFinishedGoingToSleep() {
166 mDeviceInteractive = false;
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700167 mPhoneStatusBar.onFinishedGoingToSleep();
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200168 mBouncer.onScreenTurnedOff();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100169 }
170
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700171 public void onStartedWakingUp() {
172 mDeviceInteractive = true;
173 mDeviceWillWakeUp = false;
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700174 mPhoneStatusBar.onStartedWakingUp();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100175 }
176
Jorim Jaggi93739112015-08-13 15:53:14 -0700177 public void onScreenTurningOn() {
178 mPhoneStatusBar.onScreenTurningOn();
179 }
180
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700181 public void onScreenTurnedOn() {
182 mScreenTurnedOn = true;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700183 if (mDeferScrimFadeOut) {
184 mDeferScrimFadeOut = false;
Jorim Jaggi007f0e82015-08-14 13:56:01 -0700185 animateScrimControllerKeyguardFadingOut(0, WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS);
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700186 updateStates();
187 }
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700188 mPhoneStatusBar.onScreenTurnedOn();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700189 }
190
191 public void onScreenTurnedOff() {
Jorim Jaggi007f0e82015-08-14 13:56:01 -0700192 mWakeAndUnlocking = false;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700193 mScreenTurnedOn = false;
194 }
195
196 public void notifyDeviceWakeUpRequested() {
197 mDeviceWillWakeUp = !mDeviceInteractive;
Selim Cinekf8fbc2a72015-06-22 16:42:07 -0400198 }
199
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100200 public void verifyUnlock() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200201 dismiss();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100202 }
203
204 public void setNeedsInput(boolean needsInput) {
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200205 mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100206 }
207
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100208 public void setOccluded(boolean occluded) {
Selim Cinekbaa23272014-07-08 18:01:07 +0200209 if (occluded && !mOccluded && mShowing) {
210 if (mPhoneStatusBar.isInLaunchTransition()) {
211 mOccluded = true;
212 mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
213 new Runnable() {
214 @Override
215 public void run() {
Jorim Jaggi826730a2014-12-08 21:05:13 +0100216 mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
Jorim Jaggifbc88e12014-08-14 23:38:15 +0200217 reset();
Selim Cinekbaa23272014-07-08 18:01:07 +0200218 }
219 });
220 return;
221 }
222 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200223 mOccluded = occluded;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200224 mStatusBarWindowManager.setKeyguardOccluded(occluded);
Dan Sandler3806c772014-05-08 14:52:10 -0400225 reset();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100226 }
227
Dan Sandler4b22bdf2014-06-05 00:58:02 -0400228 public boolean isOccluded() {
229 return mOccluded;
230 }
231
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100232 /**
Jorim Jaggi76a16232014-08-08 17:00:47 +0200233 * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
234 * security view of the bouncer.
235 *
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200236 * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
237 * no action should be run
Jorim Jaggi76a16232014-08-08 17:00:47 +0200238 */
239 public void startPreHideAnimation(Runnable finishRunnable) {
240 if (mBouncer.isShowing()) {
241 mBouncer.startPreHideAnimation(finishRunnable);
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200242 } else if (finishRunnable != null) {
Jorim Jaggi76a16232014-08-08 17:00:47 +0200243 finishRunnable.run();
244 }
245 }
246
247 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100248 * Hides the keyguard view
249 */
Selim Cinekbaa23272014-07-08 18:01:07 +0200250 public void hide(long startTime, final long fadeoutDuration) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200251 mShowing = false;
Jorim Jaggi44cf9192014-06-17 19:16:00 -0700252
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200253 long uptimeMillis = SystemClock.uptimeMillis();
Jorim Jaggi76a16232014-08-08 17:00:47 +0200254 long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
Selim Cinekbaa23272014-07-08 18:01:07 +0200255
256 if (mPhoneStatusBar.isInLaunchTransition() ) {
257 mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
258 @Override
259 public void run() {
260 mStatusBarWindowManager.setKeyguardShowing(false);
261 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jorim Jaggi76a16232014-08-08 17:00:47 +0200262 mBouncer.hide(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200263 updateStates();
264 mScrimController.animateKeyguardFadingOut(
265 PhoneStatusBar.FADE_KEYGUARD_START_DELAY,
266 PhoneStatusBar.FADE_KEYGUARD_DURATION, null);
267 }
268 }, new Runnable() {
269 @Override
270 public void run() {
271 mPhoneStatusBar.hideKeyguard();
272 mStatusBarWindowManager.setKeyguardFadingAway(false);
273 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200274 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200275 }
276 });
277 } else {
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100278 mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200279 boolean staying = mPhoneStatusBar.hideKeyguard();
280 if (!staying) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700281 mStatusBarWindowManager.setKeyguardFadingAway(true);
282 if (mWakeAndUnlocking && !mScreenTurnedOn) {
283 mDeferScrimFadeOut = true;
Jorim Jaggi007f0e82015-08-14 13:56:01 -0700284 } else if (mWakeAndUnlocking){
285
286 // Screen is already on, don't defer with fading out.
287 animateScrimControllerKeyguardFadingOut(0,
288 WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS);
289 } else {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700290 animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration);
Jorim Jaggi740452e2015-07-09 12:13:59 -0700291 }
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200292 } else {
293 mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
294 mPhoneStatusBar.finishKeyguardFadingAway();
295 }
Selim Cinekbaa23272014-07-08 18:01:07 +0200296 mStatusBarWindowManager.setKeyguardShowing(false);
Jorim Jaggi76a16232014-08-08 17:00:47 +0200297 mBouncer.hide(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200298 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200299 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200300 updateStates();
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200301 }
Jorim Jaggi007f0e82015-08-14 13:56:01 -0700302 mWakeAndUnlocking = false;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100303 }
304
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700305 private void animateScrimControllerKeyguardFadingOut(long delay, long duration) {
306 Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0);
307 mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() {
308 @Override
309 public void run() {
310 mStatusBarWindowManager.setKeyguardFadingAway(false);
311 mPhoneStatusBar.finishKeyguardFadingAway();
312 if (mPhoneStatusBar.getNavigationBarView() != null) {
313 mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
314 }
315 WindowManagerGlobal.getInstance().trimMemory(
316 ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
317 Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0);
318 }
319 });
320 }
321
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200322 private void executeAfterKeyguardGoneAction() {
323 if (mAfterKeyguardGoneAction != null) {
324 mAfterKeyguardGoneAction.onDismiss();
325 mAfterKeyguardGoneAction = null;
326 }
327 }
328
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100329 /**
330 * Dismisses the keyguard by going to the next screen or making it gone.
331 */
332 public void dismiss() {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700333 if (mDeviceInteractive || mDeviceWillWakeUp) {
Jorim Jaggi0bed7f22014-04-03 16:12:54 +0200334 showBouncer();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100335 }
336 }
337
Christoph Studer2231c6e2014-12-19 12:40:13 +0100338 /**
339 * WARNING: This method might cause Binder calls.
340 */
Jorim Jaggi15682502014-04-23 12:01:36 +0200341 public boolean isSecure() {
342 return mBouncer.isSecure();
343 }
344
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100345 /**
346 * @return Whether the keyguard is showing
347 */
348 public boolean isShowing() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200349 return mShowing;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100350 }
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200351
352 /**
353 * Notifies this manager that the back button has been pressed.
354 *
355 * @return whether the back press has been handled
356 */
357 public boolean onBackPressed() {
358 if (mBouncer.isShowing()) {
Jorim Jaggi6bad2442014-08-26 15:16:57 +0200359 reset();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200360 return true;
361 }
362 return false;
363 }
364
Jim Millerf41fc962014-06-18 16:33:51 -0700365 public boolean isBouncerShowing() {
366 return mBouncer.isShowing();
367 }
368
Jorim Jaggi416493b2014-09-13 03:57:32 +0200369 private long getNavBarShowDelay() {
370 if (mPhoneStatusBar.isKeyguardFadingAway()) {
371 return mPhoneStatusBar.getKeyguardFadingAwayDelay();
372 } else {
373
374 // Keyguard is not going away, thus we are showing the navigation bar because the
375 // bouncer is appearing.
376 return NAV_BAR_SHOW_DELAY_BOUNCER;
377 }
378 }
379
380 private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
381 @Override
382 public void run() {
383 mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE);
384 }
385 };
386
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200387 private void updateStates() {
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200388 int vis = mContainer.getSystemUiVisibility();
Adrian Roosb6011622014-05-14 15:52:53 +0200389 boolean showing = mShowing;
390 boolean occluded = mOccluded;
391 boolean bouncerShowing = mBouncer.isShowing();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100392 boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700393 boolean deferScrimFadeOut = mDeferScrimFadeOut;
Adrian Roosb6011622014-05-14 15:52:53 +0200394
395 if ((bouncerDismissible || !showing) != (mLastBouncerDismissible || !mLastShowing)
396 || mFirstUpdate) {
397 if (bouncerDismissible || !showing) {
398 mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400399 } else {
Adrian Roosb6011622014-05-14 15:52:53 +0200400 mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400401 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200402 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700403
404 // Hide navigation bar on Keyguard but not on bouncer and also if we are deferring a scrim
405 // fade out, i.e. we are waiting for the screen to have turned on.
406 boolean navBarVisible = !deferScrimFadeOut && (!(showing && !occluded) || bouncerShowing);
407 boolean lastNavBarVisible = !mLastDeferScrimFadeOut && (!(mLastShowing && !mLastOccluded)
408 || mLastBouncerShowing);
409 if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
Adrian Roosb6011622014-05-14 15:52:53 +0200410 if (mPhoneStatusBar.getNavigationBarView() != null) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700411 if (navBarVisible) {
Jorim Jaggi416493b2014-09-13 03:57:32 +0200412 mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
413 getNavBarShowDelay());
Adrian Roosb6011622014-05-14 15:52:53 +0200414 } else {
Jorim Jaggi416493b2014-09-13 03:57:32 +0200415 mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
Adrian Roosb6011622014-05-14 15:52:53 +0200416 mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE);
417 }
418 }
419 }
420
421 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
422 mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
423 mPhoneStatusBar.setBouncerShowing(bouncerShowing);
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200424 mScrimController.setBouncerShowing(bouncerShowing);
Adrian Roosb6011622014-05-14 15:52:53 +0200425 }
426
427 KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
428 if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
429 updateMonitor.sendKeyguardVisibilityChanged(showing && !occluded);
430 }
431 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
432 updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
433 }
434
435 mFirstUpdate = false;
436 mLastShowing = showing;
437 mLastOccluded = occluded;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700438 mLastDeferScrimFadeOut = deferScrimFadeOut;
Adrian Roosb6011622014-05-14 15:52:53 +0200439 mLastBouncerShowing = bouncerShowing;
440 mLastBouncerDismissible = bouncerDismissible;
Christoph Studer2231c6e2014-12-19 12:40:13 +0100441
442 mPhoneStatusBar.onKeyguardViewManagerStatesUpdated();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200443 }
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200444
445 public boolean onMenuPressed() {
446 return mBouncer.onMenuPressed();
447 }
Jorim Jaggidf993512014-05-13 23:06:35 +0200448
449 public boolean interceptMediaKey(KeyEvent event) {
450 return mBouncer.interceptMediaKey(event);
451 }
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200452
453 public void onActivityDrawn() {
454 if (mPhoneStatusBar.isCollapsing()) {
455 mPhoneStatusBar.addPostCollapseAction(new Runnable() {
456 @Override
457 public void run() {
458 mViewMediatorCallback.readyForKeyguardDone();
459 }
460 });
461 } else {
462 mViewMediatorCallback.readyForKeyguardDone();
463 }
464 }
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200465
466 public boolean shouldDisableWindowAnimationsForUnlock() {
467 return mPhoneStatusBar.isInLaunchTransition();
468 }
469
470 public boolean isGoingToNotificationShade() {
471 return mPhoneStatusBar.isGoingToNotificationShade();
472 }
Adrian Roos31b844b2014-11-21 13:55:09 +0100473
474 public boolean isSecure(int userId) {
475 return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
476 }
Jim Millerab954542014-10-10 18:21:49 -0700477
478 public boolean isInputRestricted() {
479 return mViewMediatorCallback.isInputRestricted();
480 }
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100481
482 public void keyguardGoingAway() {
483 mPhoneStatusBar.keyguardGoingAway();
484 }
Jim Miller25d7e512015-03-03 17:12:09 -0800485
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700486 public void animateCollapsePanels(float speedUpFactor) {
487 mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
488 false /* delayed */, speedUpFactor);
Jim Miller25d7e512015-03-03 17:12:09 -0800489 }
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700490
491 /**
492 * Notifies that the user has authenticated by other means than using the bouncer, for example,
493 * fingerprint.
494 */
Jorim Jaggi25b4d4b2015-08-11 15:54:06 -0700495 public void notifyKeyguardAuthenticated(boolean strongAuth) {
496 mBouncer.notifyKeyguardAuthenticated(strongAuth);
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700497 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700498
499 public void setWakeAndUnlocking() {
500 mWakeAndUnlocking = true;
501 mScrimController.setWakeAndUnlocking();
502 if (mPhoneStatusBar.getNavigationBarView() != null) {
503 mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
504 }
505 }
Selim Cinekcfafe4e2015-08-11 14:58:44 -0700506
507 public void showBouncerMessage(String message, int color) {
508 mBouncer.showMessage(message, color);
509 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100510}