15cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/*
25cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
35cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
45cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
55cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * you may not use this file except in compliance with the License.
65cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * You may obtain a copy of the License at
75cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
85cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
95cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * See the License for the specific language governing permissions and
145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * limitations under the License
155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipackage com.android.systemui.statusbar.phone;
185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
19786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggiimport android.content.ComponentCallbacks2;
205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.Context;
215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.Bundle;
22e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggiimport android.os.SystemClock;
230d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggiimport android.os.Trace;
24df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggiimport android.view.KeyEvent;
255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View;
265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup;
27b774e554f32fd65cac30b43d1cf679403ef4af82Jorim Jaggiimport android.view.ViewRootImpl;
28786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggiimport android.view.WindowManagerGlobal;
295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.widget.LockPatternUtils;
31b601162a60663329355720083bfa199909dbf6efAdrian Roosimport com.android.keyguard.KeyguardUpdateMonitor;
325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.ViewMediatorCallback;
3325d7e51a10828e4433fcca90410d13a4b2342c34Jim Millerimport com.android.systemui.statusbar.CommandQueue;
345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
356b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggiimport static com.android.keyguard.KeyguardHostView.OnDismissAction;
367d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos
375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/**
385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * which is in turn, reported to this class by the current
415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * {@link com.android.keyguard.KeyguardViewBase}.
425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipublic class StatusBarKeyguardViewManager {
4476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
4576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
4676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private static final long HIDE_TIMING_CORRECTION_MS = -3 * 16;
4776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
48416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
49416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    // with the appear animations of the PIN/pattern/password views.
50416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
51416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
52007f0e8f207d3d6d2f47d725b72459edf317cce9Jorim Jaggi    private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
53007f0e8f207d3d6d2f47d725b72459edf317cce9Jorim Jaggi
545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static String TAG = "StatusBarKeyguardViewManager";
555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final Context mContext;
575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private LockPatternUtils mLockPatternUtils;
595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private ViewMediatorCallback mViewMediatorCallback;
605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private PhoneStatusBar mPhoneStatusBar;
61ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private ScrimController mScrimController;
6283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private FingerprintUnlockController mFingerprintUnlockController;
635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private ViewGroup mContainer;
655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private StatusBarWindowManager mStatusBarWindowManager;
665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
670d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mDeviceInteractive = false;
680d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mScreenTurnedOn;
6903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private KeyguardBouncer mBouncer;
7003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private boolean mShowing;
71a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi    private boolean mOccluded;
725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
73b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mFirstUpdate = true;
74b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastShowing;
75b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastOccluded;
76b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastBouncerShowing;
77b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastBouncerDismissible;
78746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    private OnDismissAction mAfterKeyguardGoneAction;
790d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mDeviceWillWakeUp;
800d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    private boolean mDeferScrimFadeOut;
81b601162a60663329355720083bfa199909dbf6efAdrian Roos
825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            LockPatternUtils lockPatternUtils) {
845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContext = context;
855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mViewMediatorCallback = callback;
865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLockPatternUtils = lockPatternUtils;
875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void registerStatusBar(PhoneStatusBar phoneStatusBar,
90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            ViewGroup container, StatusBarWindowManager statusBarWindowManager,
9183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            ScrimController scrimController,
9283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            FingerprintUnlockController fingerprintUnlockController) {
935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mPhoneStatusBar = phoneStatusBar;
945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContainer = container;
955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mStatusBarWindowManager = statusBarWindowManager;
96ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimController = scrimController;
9783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mFingerprintUnlockController = fingerprintUnlockController;
9803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils,
9903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                mStatusBarWindowManager, container);
1005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1015cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
1035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Show the keyguard.  Will handle creating and attaching to the view manager
1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * lazily.
1055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
1065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void show(Bundle options) {
10703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mShowing = true;
108cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardShowing(true);
109edd32b881780e52b4ecc43f8df3b6b091e70a863Selim Cinek        mScrimController.abortKeyguardFadingOut();
11043bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi        reset();
1115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
113a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    /**
114a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     * Shows the notification keyguard or the bouncer depending on
115a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     * {@link KeyguardBouncer#needsFullscreenBouncer()}.
116a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     */
117a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    private void showBouncerOrKeyguard() {
118a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        if (mBouncer.needsFullscreenBouncer()) {
119a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
120a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            // The keyguard might be showing (already). So we need to hide it.
121a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            mPhoneStatusBar.hideKeyguard();
12295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mBouncer.show(true /* resetSecuritySelection */);
123a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        } else {
124a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            mPhoneStatusBar.showKeyguard();
125a0be6d53a823f8115d3863773398d640ec2a8c44Jorim Jaggi            mBouncer.hide(false /* destroyView */);
1262fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            mBouncer.prepare();
127a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        }
128a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    }
129a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
1304222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    private void showBouncer() {
1310002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos        if (mShowing) {
13295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mBouncer.show(false /* resetSecuritySelection */);
1333806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        }
1344222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi        updateStates();
1355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
137d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi    public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
138d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi            boolean afterKeyguardGone) {
1390002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos        if (mShowing) {
140746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            if (!afterKeyguardGone) {
141d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi                mBouncer.showWithDismissAction(r, cancelAction);
142746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            } else {
14395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mBouncer.show(false /* resetSecuritySelection */);
144746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi                mAfterKeyguardGoneAction = r;
145746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            }
1467d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos        }
1477d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos        updateStates();
1487d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos    }
1497d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos
1505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
1515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Reset the state of the view.
1525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
1535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void reset() {
15443bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi        if (mShowing) {
15543bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            if (mOccluded) {
15643bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi                mPhoneStatusBar.hideKeyguard();
157d322f1af916038816ef2a5b56fef4d9648d8433eAdrian Roos                mPhoneStatusBar.stopWaitingForKeyguardExit();
158a0be6d53a823f8115d3863773398d640ec2a8c44Jorim Jaggi                mBouncer.hide(false /* destroyView */);
15943bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            } else {
16043bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi                showBouncerOrKeyguard();
16143bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            }
1621fcafc49ad34cb8f778862653d452ac0fe61461cSelim Cinek            KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
16343bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            updateStates();
1643806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        }
1655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
16718f18ae078ee97bbdfc9da39d4a19866dceb6a3eJorim Jaggi    public void onStartedGoingToSleep() {
16818f18ae078ee97bbdfc9da39d4a19866dceb6a3eJorim Jaggi        mPhoneStatusBar.onStartedGoingToSleep();
16918f18ae078ee97bbdfc9da39d4a19866dceb6a3eJorim Jaggi    }
17018f18ae078ee97bbdfc9da39d4a19866dceb6a3eJorim Jaggi
1710d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void onFinishedGoingToSleep() {
1720d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mDeviceInteractive = false;
17350ff3afb01f2ac4a93dba418a71d54ad8adeba9dJorim Jaggi        mPhoneStatusBar.onFinishedGoingToSleep();
17403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mBouncer.onScreenTurnedOff();
1755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1770d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void onStartedWakingUp() {
1780d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mDeviceInteractive = true;
1790d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mDeviceWillWakeUp = false;
18050ff3afb01f2ac4a93dba418a71d54ad8adeba9dJorim Jaggi        mPhoneStatusBar.onStartedWakingUp();
1815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1839373911d41c133fce80b8ecf6e688204f2c667e7Jorim Jaggi    public void onScreenTurningOn() {
1849373911d41c133fce80b8ecf6e688204f2c667e7Jorim Jaggi        mPhoneStatusBar.onScreenTurningOn();
1859373911d41c133fce80b8ecf6e688204f2c667e7Jorim Jaggi    }
1869373911d41c133fce80b8ecf6e688204f2c667e7Jorim Jaggi
187372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    public boolean isScreenTurnedOn() {
188372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        return mScreenTurnedOn;
189372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    }
190372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek
1910d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void onScreenTurnedOn() {
1920d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mScreenTurnedOn = true;
1930d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (mDeferScrimFadeOut) {
1940d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mDeferScrimFadeOut = false;
195ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            animateScrimControllerKeyguardFadingOut(0, WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
196ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                    true /* skipFirstFrame */);
1970d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            updateStates();
1980d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
19950ff3afb01f2ac4a93dba418a71d54ad8adeba9dJorim Jaggi        mPhoneStatusBar.onScreenTurnedOn();
2000d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
2010d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
2020d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void onScreenTurnedOff() {
2030d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mScreenTurnedOn = false;
2040d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
2050d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
2060d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    public void notifyDeviceWakeUpRequested() {
2070d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mDeviceWillWakeUp = !mDeviceInteractive;
208f8fbc2a7cc1449ba1f8ebc3e8f09359903293ad1Selim Cinek    }
209f8fbc2a7cc1449ba1f8ebc3e8f09359903293ad1Selim Cinek
2105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void verifyUnlock() {
21103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        dismiss();
2125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setNeedsInput(boolean needsInput) {
215cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
2165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setOccluded(boolean occluded) {
219baa23274596246d03741457701ac515a73aa8818Selim Cinek        if (occluded && !mOccluded && mShowing) {
220baa23274596246d03741457701ac515a73aa8818Selim Cinek            if (mPhoneStatusBar.isInLaunchTransition()) {
221baa23274596246d03741457701ac515a73aa8818Selim Cinek                mOccluded = true;
222baa23274596246d03741457701ac515a73aa8818Selim Cinek                mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
223baa23274596246d03741457701ac515a73aa8818Selim Cinek                        new Runnable() {
224baa23274596246d03741457701ac515a73aa8818Selim Cinek                            @Override
225baa23274596246d03741457701ac515a73aa8818Selim Cinek                            public void run() {
226826730aeb98040cd01c9b5f0656c8b9036bc07deJorim Jaggi                                mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
227fbc88e19cb77c303b47a427a40123ccf4ba5cca7Jorim Jaggi                                reset();
228baa23274596246d03741457701ac515a73aa8818Selim Cinek                            }
229baa23274596246d03741457701ac515a73aa8818Selim Cinek                        });
230baa23274596246d03741457701ac515a73aa8818Selim Cinek                return;
231baa23274596246d03741457701ac515a73aa8818Selim Cinek            }
232baa23274596246d03741457701ac515a73aa8818Selim Cinek        }
233a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi        mOccluded = occluded;
234cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardOccluded(occluded);
2353806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        reset();
2365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2384b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler    public boolean isOccluded() {
2394b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler        return mOccluded;
2404b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler    }
2414b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler
2425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
24376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
24476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     * security view of the bouncer.
24576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     *
2468de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi     * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
2478de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi     *                       no action should be run
24876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     */
24976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public void startPreHideAnimation(Runnable finishRunnable) {
25076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        if (mBouncer.isShowing()) {
25176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            mBouncer.startPreHideAnimation(finishRunnable);
2528de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        } else if (finishRunnable != null) {
25376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            finishRunnable.run();
25476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        }
25576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
25676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
25776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    /**
2585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Hides the keyguard view
2595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
260baa23274596246d03741457701ac515a73aa8818Selim Cinek    public void hide(long startTime, final long fadeoutDuration) {
26103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mShowing = false;
26244cf91960d74eccec45b9adec291ddb8baf84b4dJorim Jaggi
263e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        long uptimeMillis = SystemClock.uptimeMillis();
26476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
265baa23274596246d03741457701ac515a73aa8818Selim Cinek
266baa23274596246d03741457701ac515a73aa8818Selim Cinek        if (mPhoneStatusBar.isInLaunchTransition() ) {
267baa23274596246d03741457701ac515a73aa8818Selim Cinek            mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
268baa23274596246d03741457701ac515a73aa8818Selim Cinek                @Override
269baa23274596246d03741457701ac515a73aa8818Selim Cinek                public void run() {
270baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardShowing(false);
271baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardFadingAway(true);
27276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    mBouncer.hide(true /* destroyView */);
273baa23274596246d03741457701ac515a73aa8818Selim Cinek                    updateStates();
274baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mScrimController.animateKeyguardFadingOut(
275baa23274596246d03741457701ac515a73aa8818Selim Cinek                            PhoneStatusBar.FADE_KEYGUARD_START_DELAY,
276ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                            PhoneStatusBar.FADE_KEYGUARD_DURATION, null,
277ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                            false /* skipFirstFrame */);
278baa23274596246d03741457701ac515a73aa8818Selim Cinek                }
279baa23274596246d03741457701ac515a73aa8818Selim Cinek            }, new Runnable() {
280baa23274596246d03741457701ac515a73aa8818Selim Cinek                @Override
281baa23274596246d03741457701ac515a73aa8818Selim Cinek                public void run() {
282baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mPhoneStatusBar.hideKeyguard();
283baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardFadingAway(false);
284baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mViewMediatorCallback.keyguardGone();
285746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi                    executeAfterKeyguardGoneAction();
286baa23274596246d03741457701ac515a73aa8818Selim Cinek                }
287baa23274596246d03741457701ac515a73aa8818Selim Cinek            });
288baa23274596246d03741457701ac515a73aa8818Selim Cinek        } else {
28983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            if (mFingerprintUnlockController.getMode()
29083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING) {
29183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                mFingerprintUnlockController.startKeyguardFadingAway();
292909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                mPhoneStatusBar.setKeyguardFadingAway(startTime, 0, 240);
2930d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                mStatusBarWindowManager.setKeyguardFadingAway(true);
29483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                mPhoneStatusBar.fadeKeyguardWhilePulsing();
295909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                animateScrimControllerKeyguardFadingOut(0, 240, new Runnable() {
296909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                    @Override
297909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                    public void run() {
298909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                        mPhoneStatusBar.hideKeyguard();
299909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                    }
300ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                }, false /* skipFirstFrame */);
301dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            } else {
30283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                mFingerprintUnlockController.startKeyguardFadingAway();
30383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
30483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                boolean staying = mPhoneStatusBar.hideKeyguard();
30583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                if (!staying) {
30683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    mStatusBarWindowManager.setKeyguardFadingAway(true);
30783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    if (mFingerprintUnlockController.getMode()
30883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                            == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
30983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                        if (!mScreenTurnedOn) {
31083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                            mDeferScrimFadeOut = true;
31183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                        } else {
31283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
31383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                            // Screen is already on, don't defer with fading out.
31483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                            animateScrimControllerKeyguardFadingOut(0,
315ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                                    WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
316ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                                    true /* skipFirstFrame */);
31783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                        }
31883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    } else {
319ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                        animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration,
320ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                                false /* skipFirstFrame */);
32183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    }
32283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                } else {
32383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
32483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    mPhoneStatusBar.finishKeyguardFadingAway();
32583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                }
326dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            }
327baa23274596246d03741457701ac515a73aa8818Selim Cinek            mStatusBarWindowManager.setKeyguardShowing(false);
32876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            mBouncer.hide(true /* destroyView */);
329baa23274596246d03741457701ac515a73aa8818Selim Cinek            mViewMediatorCallback.keyguardGone();
330746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            executeAfterKeyguardGoneAction();
331baa23274596246d03741457701ac515a73aa8818Selim Cinek            updateStates();
332e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
3335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
335ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi    private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
336ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            boolean skipFirstFrame) {
337ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        animateScrimControllerKeyguardFadingOut(delay, duration, null /* endRunnable */,
338ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi                skipFirstFrame);
339909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi    }
340909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi
341909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi    private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
342ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi            final Runnable endRunnable, boolean skipFirstFrame) {
3430d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0);
3440d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() {
3450d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            @Override
3460d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            public void run() {
347909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                if (endRunnable != null) {
348909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                    endRunnable.run();
349909788500bbe54b14017be3c1f2b4fee7945c63dJorim Jaggi                }
3500d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                mStatusBarWindowManager.setKeyguardFadingAway(false);
3510d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                mPhoneStatusBar.finishKeyguardFadingAway();
35283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                mFingerprintUnlockController.finishKeyguardFadingAway();
3530d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                WindowManagerGlobal.getInstance().trimMemory(
3540d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                        ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
3550d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0);
3560d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            }
357ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        }, skipFirstFrame);
3580d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi    }
3590d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
360746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    private void executeAfterKeyguardGoneAction() {
361746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi        if (mAfterKeyguardGoneAction != null) {
362746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            mAfterKeyguardGoneAction.onDismiss();
363746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            mAfterKeyguardGoneAction = null;
364746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi        }
365746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    }
366746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi
3675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
3685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Dismisses the keyguard by going to the next screen or making it gone.
3695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
3705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void dismiss() {
3710d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (mDeviceInteractive || mDeviceWillWakeUp) {
3720bed7f258ba1fffc10f986ee043b769f1fd40ad3Jorim Jaggi            showBouncer();
3735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
3745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
3762231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer    /**
3772231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer     * WARNING: This method might cause Binder calls.
3782231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer     */
3791568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi    public boolean isSecure() {
3801568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi        return mBouncer.isSecure();
3811568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi    }
3821568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi
3835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
3845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @return Whether the keyguard is showing
3855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
3865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public boolean isShowing() {
38703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        return mShowing;
3885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
389e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi
390e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    /**
391e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     * Notifies this manager that the back button has been pressed.
392e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     *
393e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     * @return whether the back press has been handled
394e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     */
395e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    public boolean onBackPressed() {
396e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        if (mBouncer.isShowing()) {
397372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek            mPhoneStatusBar.endAffordanceLaunch();
3986bad244c4e0bcfba1652f3cc3593a9034f84fd9bJorim Jaggi            reset();
399e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi            return true;
400e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        }
401e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        return false;
402e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    }
403e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi
404f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller    public boolean isBouncerShowing() {
405f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller        return mBouncer.isShowing();
406f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller    }
407f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller
408416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private long getNavBarShowDelay() {
409416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        if (mPhoneStatusBar.isKeyguardFadingAway()) {
410416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            return mPhoneStatusBar.getKeyguardFadingAwayDelay();
411416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        } else {
412416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
413416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            // Keyguard is not going away, thus we are showing the navigation bar because the
414416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            // bouncer is appearing.
415416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            return NAV_BAR_SHOW_DELAY_BOUNCER;
416416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        }
417416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    }
418416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
419416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
420416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        @Override
421416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        public void run() {
422416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE);
423416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        }
424416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    };
425416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
4264222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    private void updateStates() {
427e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        int vis = mContainer.getSystemUiVisibility();
428b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean showing = mShowing;
429b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean occluded = mOccluded;
430b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean bouncerShowing = mBouncer.isShowing();
43195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
432b601162a60663329355720083bfa199909dbf6efAdrian Roos
433b601162a60663329355720083bfa199909dbf6efAdrian Roos        if ((bouncerDismissible || !showing) != (mLastBouncerDismissible || !mLastShowing)
434b601162a60663329355720083bfa199909dbf6efAdrian Roos                || mFirstUpdate) {
435b601162a60663329355720083bfa199909dbf6efAdrian Roos            if (bouncerDismissible || !showing) {
436b601162a60663329355720083bfa199909dbf6efAdrian Roos                mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
4371e68fb3c3842bb90ed3f474cef0ddf7116eace0eJason Monk            } else {
438b601162a60663329355720083bfa199909dbf6efAdrian Roos                mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
439b601162a60663329355720083bfa199909dbf6efAdrian Roos            }
440b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
4410d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
442ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        boolean navBarVisible = (!(showing && !occluded) || bouncerShowing);
443ab45a217b0002dcf586d529ab8581cacbbfc37e9Jorim Jaggi        boolean lastNavBarVisible = (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing);
4440d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
445b601162a60663329355720083bfa199909dbf6efAdrian Roos            if (mPhoneStatusBar.getNavigationBarView() != null) {
4460d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi                if (navBarVisible) {
44783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    long delay = getNavBarShowDelay();
44883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    if (delay == 0) {
44983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                        mMakeNavigationBarVisibleRunnable.run();
45083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    } else {
45183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                        mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
45283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                                delay);
45383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                    }
454b601162a60663329355720083bfa199909dbf6efAdrian Roos                } else {
455416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
456b601162a60663329355720083bfa199909dbf6efAdrian Roos                    mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE);
457b601162a60663329355720083bfa199909dbf6efAdrian Roos                }
4581e68fb3c3842bb90ed3f474cef0ddf7116eace0eJason Monk            }
459a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi        }
460b601162a60663329355720083bfa199909dbf6efAdrian Roos
461b601162a60663329355720083bfa199909dbf6efAdrian Roos        if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
462b601162a60663329355720083bfa199909dbf6efAdrian Roos            mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
463b601162a60663329355720083bfa199909dbf6efAdrian Roos            mPhoneStatusBar.setBouncerShowing(bouncerShowing);
464ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimController.setBouncerShowing(bouncerShowing);
465b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
466b601162a60663329355720083bfa199909dbf6efAdrian Roos
467b601162a60663329355720083bfa199909dbf6efAdrian Roos        KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
468b601162a60663329355720083bfa199909dbf6efAdrian Roos        if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
4696a15d528c0a4501389008ef945dec38b5ca6919aJorim Jaggi            updateMonitor.onKeyguardVisibilityChanged(showing && !occluded);
470b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
471b601162a60663329355720083bfa199909dbf6efAdrian Roos        if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
472b601162a60663329355720083bfa199909dbf6efAdrian Roos            updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
473b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
474b601162a60663329355720083bfa199909dbf6efAdrian Roos
475b601162a60663329355720083bfa199909dbf6efAdrian Roos        mFirstUpdate = false;
476b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastShowing = showing;
477b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastOccluded = occluded;
478b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastBouncerShowing = bouncerShowing;
479b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastBouncerDismissible = bouncerDismissible;
4802231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer
4812231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer        mPhoneStatusBar.onKeyguardViewManagerStatesUpdated();
482e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    }
4838c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi
4848c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi    public boolean onMenuPressed() {
4858c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi        return mBouncer.onMenuPressed();
4868c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi    }
487df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi
488df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi    public boolean interceptMediaKey(KeyEvent event) {
489df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        return mBouncer.interceptMediaKey(event);
490df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi    }
4918de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi
4928de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    public void onActivityDrawn() {
4938de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        if (mPhoneStatusBar.isCollapsing()) {
4948de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            mPhoneStatusBar.addPostCollapseAction(new Runnable() {
4958de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                @Override
4968de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                public void run() {
4978de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                    mViewMediatorCallback.readyForKeyguardDone();
4988de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                }
4998de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            });
5008de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        } else {
5018de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            mViewMediatorCallback.readyForKeyguardDone();
5028de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        }
5038de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    }
50484a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi
50584a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    public boolean shouldDisableWindowAnimationsForUnlock() {
50684a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi        return mPhoneStatusBar.isInLaunchTransition();
50784a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    }
50884a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi
50984a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    public boolean isGoingToNotificationShade() {
51084a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi        return mPhoneStatusBar.isGoingToNotificationShade();
51184a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    }
51231b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos
51331b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos    public boolean isSecure(int userId) {
51431b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos        return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
51531b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos    }
516ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller
517ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller    public boolean isInputRestricted() {
518ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        return mViewMediatorCallback.isInputRestricted();
519ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller    }
52033ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi
52133ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi    public void keyguardGoingAway() {
52233ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi        mPhoneStatusBar.keyguardGoingAway();
52333ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi    }
52425d7e51a10828e4433fcca90410d13a4b2342c34Jim Miller
525f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi    public void animateCollapsePanels(float speedUpFactor) {
526f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi        mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
527f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi                false /* delayed */, speedUpFactor);
52825d7e51a10828e4433fcca90410d13a4b2342c34Jim Miller    }
5295cc86599ce0e5596655859d09c52934030da240bJorim Jaggi
5305cc86599ce0e5596655859d09c52934030da240bJorim Jaggi    /**
5315cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     * Notifies that the user has authenticated by other means than using the bouncer, for example,
5325cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     * fingerprint.
5335cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     */
53425b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi    public void notifyKeyguardAuthenticated(boolean strongAuth) {
53525b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi        mBouncer.notifyKeyguardAuthenticated(strongAuth);
5365cc86599ce0e5596655859d09c52934030da240bJorim Jaggi    }
5370d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
538cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek    public void showBouncerMessage(String message, int color) {
539cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek        mBouncer.showMessage(message, color);
540cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek    }
541b774e554f32fd65cac30b43d1cf679403ef4af82Jorim Jaggi
542b774e554f32fd65cac30b43d1cf679403ef4af82Jorim Jaggi    public ViewRootImpl getViewRootImpl() {
543b774e554f32fd65cac30b43d1cf679403ef4af82Jorim Jaggi        return mPhoneStatusBar.getStatusBarView().getViewRootImpl();
544b774e554f32fd65cac30b43d1cf679403ef4af82Jorim Jaggi    }
5455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
546