StatusBarKeyguardViewManager.java revision 5cc86599ce0e5596655859d09c52934030da240b
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;
225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.RemoteException;
23e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggiimport android.os.SystemClock;
245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.util.Slog;
25df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggiimport android.view.KeyEvent;
265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View;
275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup;
28786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggiimport android.view.WindowManagerGlobal;
295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.policy.IKeyguardShowCallback;
315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.widget.LockPatternUtils;
32b601162a60663329355720083bfa199909dbf6efAdrian Roosimport com.android.keyguard.KeyguardUpdateMonitor;
335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.ViewMediatorCallback;
3425d7e51a10828e4433fcca90410d13a4b2342c34Jim Millerimport com.android.systemui.statusbar.CommandQueue;
355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
366b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggiimport static com.android.keyguard.KeyguardHostView.OnDismissAction;
377d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos
385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/**
395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * which is in turn, reported to this class by the current
425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * {@link com.android.keyguard.KeyguardViewBase}.
435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipublic class StatusBarKeyguardViewManager {
4576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
4676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
4776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private static final long HIDE_TIMING_CORRECTION_MS = -3 * 16;
4876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
49416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
50416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    // with the appear animations of the PIN/pattern/password views.
51416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
52416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static String TAG = "StatusBarKeyguardViewManager";
545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final Context mContext;
565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private LockPatternUtils mLockPatternUtils;
585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private ViewMediatorCallback mViewMediatorCallback;
595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private PhoneStatusBar mPhoneStatusBar;
60ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi    private ScrimController mScrimController;
615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private ViewGroup mContainer;
635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private StatusBarWindowManager mStatusBarWindowManager;
645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private boolean mScreenOn = false;
6603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private KeyguardBouncer mBouncer;
6703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private boolean mShowing;
68a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi    private boolean mOccluded;
695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
70b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mFirstUpdate = true;
71b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastShowing;
72b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastOccluded;
73b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastBouncerShowing;
74b601162a60663329355720083bfa199909dbf6efAdrian Roos    private boolean mLastBouncerDismissible;
75746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    private OnDismissAction mAfterKeyguardGoneAction;
76b601162a60663329355720083bfa199909dbf6efAdrian Roos
775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            LockPatternUtils lockPatternUtils) {
795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContext = context;
805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mViewMediatorCallback = callback;
815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLockPatternUtils = lockPatternUtils;
825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void registerStatusBar(PhoneStatusBar phoneStatusBar,
85ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            ViewGroup container, StatusBarWindowManager statusBarWindowManager,
86ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            ScrimController scrimController) {
875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mPhoneStatusBar = phoneStatusBar;
885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContainer = container;
895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mStatusBarWindowManager = statusBarWindowManager;
90ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi        mScrimController = scrimController;
9103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils,
9203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                mStatusBarWindowManager, container);
935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Show the keyguard.  Will handle creating and attaching to the view manager
975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * lazily.
985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void show(Bundle options) {
10003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mShowing = true;
101cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardShowing(true);
10243bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi        reset();
1035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
105a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    /**
106a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     * Shows the notification keyguard or the bouncer depending on
107a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     * {@link KeyguardBouncer#needsFullscreenBouncer()}.
108a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi     */
109a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    private void showBouncerOrKeyguard() {
110a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        if (mBouncer.needsFullscreenBouncer()) {
111a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
112a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            // The keyguard might be showing (already). So we need to hide it.
113a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            mPhoneStatusBar.hideKeyguard();
11495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mBouncer.show(true /* resetSecuritySelection */);
115a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        } else {
116a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi            mPhoneStatusBar.showKeyguard();
117a0be6d53a823f8115d3863773398d640ec2a8c44Jorim Jaggi            mBouncer.hide(false /* destroyView */);
1182fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi            mBouncer.prepare();
119a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        }
120a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    }
121a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
1224222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    private void showBouncer() {
1230002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos        if (mShowing) {
12495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mBouncer.show(false /* resetSecuritySelection */);
1253806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        }
1264222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi        updateStates();
1275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
129d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi    public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
130d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi            boolean afterKeyguardGone) {
1310002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos        if (mShowing) {
132746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            if (!afterKeyguardGone) {
133d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi                mBouncer.showWithDismissAction(r, cancelAction);
134746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            } else {
13595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mBouncer.show(false /* resetSecuritySelection */);
136746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi                mAfterKeyguardGoneAction = r;
137746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            }
1387d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos        }
1397d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos        updateStates();
1407d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos    }
1417d7090d66692170b0584a5b9f4fe3e47285ee615Adrian Roos
1425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
1435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Reset the state of the view.
1445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
1455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void reset() {
14643bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi        if (mShowing) {
14743bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            if (mOccluded) {
14843bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi                mPhoneStatusBar.hideKeyguard();
149d322f1af916038816ef2a5b56fef4d9648d8433eAdrian Roos                mPhoneStatusBar.stopWaitingForKeyguardExit();
150a0be6d53a823f8115d3863773398d640ec2a8c44Jorim Jaggi                mBouncer.hide(false /* destroyView */);
15143bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            } else {
15243bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi                showBouncerOrKeyguard();
15343bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            }
15443bdbbdad6c54c732b2caa09d7544cfdd677ac5bJorim Jaggi            updateStates();
1553806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        }
1565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void onScreenTurnedOff() {
1595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mScreenOn = false;
16075c95044a8c5c073d30dcc9bd21157939f161043Jorim Jaggi        mPhoneStatusBar.onScreenTurnedOff();
16103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mBouncer.onScreenTurnedOff();
1625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void onScreenTurnedOn(final IKeyguardShowCallback callback) {
1655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mScreenOn = true;
16675c95044a8c5c073d30dcc9bd21157939f161043Jorim Jaggi        mPhoneStatusBar.onScreenTurnedOn();
16703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        if (callback != null) {
16803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi            callbackAfterDraw(callback);
1695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void callbackAfterDraw(final IKeyguardShowCallback callback) {
17303c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mContainer.post(new Runnable() {
1745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            @Override
1755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            public void run() {
1765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                try {
17703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                    callback.onShown(mContainer.getWindowToken());
1785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                } catch (RemoteException e) {
1795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                    Slog.w(TAG, "Exception calling onShown():", e);
1805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                }
1815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            }
1825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        });
1835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void verifyUnlock() {
18603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        dismiss();
1875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setNeedsInput(boolean needsInput) {
190cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
1915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setOccluded(boolean occluded) {
194baa23274596246d03741457701ac515a73aa8818Selim Cinek        if (occluded && !mOccluded && mShowing) {
195baa23274596246d03741457701ac515a73aa8818Selim Cinek            if (mPhoneStatusBar.isInLaunchTransition()) {
196baa23274596246d03741457701ac515a73aa8818Selim Cinek                mOccluded = true;
197baa23274596246d03741457701ac515a73aa8818Selim Cinek                mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
198baa23274596246d03741457701ac515a73aa8818Selim Cinek                        new Runnable() {
199baa23274596246d03741457701ac515a73aa8818Selim Cinek                            @Override
200baa23274596246d03741457701ac515a73aa8818Selim Cinek                            public void run() {
201826730aeb98040cd01c9b5f0656c8b9036bc07deJorim Jaggi                                mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
202fbc88e19cb77c303b47a427a40123ccf4ba5cca7Jorim Jaggi                                reset();
203baa23274596246d03741457701ac515a73aa8818Selim Cinek                            }
204baa23274596246d03741457701ac515a73aa8818Selim Cinek                        });
205baa23274596246d03741457701ac515a73aa8818Selim Cinek                return;
206baa23274596246d03741457701ac515a73aa8818Selim Cinek            }
207baa23274596246d03741457701ac515a73aa8818Selim Cinek        }
208a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi        mOccluded = occluded;
209cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi        mStatusBarWindowManager.setKeyguardOccluded(occluded);
2103806c771336a378b650b2ec14aa1ae7e5927f137Dan Sandler        reset();
2115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2134b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler    public boolean isOccluded() {
2144b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler        return mOccluded;
2154b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler    }
2164b22bdfa84eb3b62f83982281798145e56fce21dDan Sandler
2175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
21876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
21976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     * security view of the bouncer.
22076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     *
2218de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi     * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
2228de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi     *                       no action should be run
22376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi     */
22476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public void startPreHideAnimation(Runnable finishRunnable) {
22576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        if (mBouncer.isShowing()) {
22676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            mBouncer.startPreHideAnimation(finishRunnable);
2278de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        } else if (finishRunnable != null) {
22876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            finishRunnable.run();
22976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        }
23076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
23176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
23276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    /**
2335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Hides the keyguard view
2345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
235baa23274596246d03741457701ac515a73aa8818Selim Cinek    public void hide(long startTime, final long fadeoutDuration) {
23603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        mShowing = false;
23744cf91960d74eccec45b9adec291ddb8baf84b4dJorim Jaggi
238e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        long uptimeMillis = SystemClock.uptimeMillis();
23976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
240baa23274596246d03741457701ac515a73aa8818Selim Cinek
241baa23274596246d03741457701ac515a73aa8818Selim Cinek        if (mPhoneStatusBar.isInLaunchTransition() ) {
242baa23274596246d03741457701ac515a73aa8818Selim Cinek            mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
243baa23274596246d03741457701ac515a73aa8818Selim Cinek                @Override
244baa23274596246d03741457701ac515a73aa8818Selim Cinek                public void run() {
245baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardShowing(false);
246baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardFadingAway(true);
24776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                    mBouncer.hide(true /* destroyView */);
248baa23274596246d03741457701ac515a73aa8818Selim Cinek                    updateStates();
249baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mScrimController.animateKeyguardFadingOut(
250baa23274596246d03741457701ac515a73aa8818Selim Cinek                            PhoneStatusBar.FADE_KEYGUARD_START_DELAY,
251baa23274596246d03741457701ac515a73aa8818Selim Cinek                            PhoneStatusBar.FADE_KEYGUARD_DURATION, null);
252baa23274596246d03741457701ac515a73aa8818Selim Cinek                }
253baa23274596246d03741457701ac515a73aa8818Selim Cinek            }, new Runnable() {
254baa23274596246d03741457701ac515a73aa8818Selim Cinek                @Override
255baa23274596246d03741457701ac515a73aa8818Selim Cinek                public void run() {
256baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mPhoneStatusBar.hideKeyguard();
257baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mStatusBarWindowManager.setKeyguardFadingAway(false);
258baa23274596246d03741457701ac515a73aa8818Selim Cinek                    mViewMediatorCallback.keyguardGone();
259746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi                    executeAfterKeyguardGoneAction();
260baa23274596246d03741457701ac515a73aa8818Selim Cinek                }
261baa23274596246d03741457701ac515a73aa8818Selim Cinek            });
262baa23274596246d03741457701ac515a73aa8818Selim Cinek        } else {
26333ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi            mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
264dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            boolean staying = mPhoneStatusBar.hideKeyguard();
265dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            if (!staying) {
266dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                mStatusBarWindowManager.setKeyguardFadingAway(true);
267dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() {
268dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                    @Override
269dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                    public void run() {
270dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                        mStatusBarWindowManager.setKeyguardFadingAway(false);
271dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                        mPhoneStatusBar.finishKeyguardFadingAway();
272786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggi                        WindowManagerGlobal.getInstance().trimMemory(
273786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggi                                ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
274dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                    }
275dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                });
276dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            } else {
277dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
278dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi                mPhoneStatusBar.finishKeyguardFadingAway();
279dbc3dce886cb7abba23a9f18e60d0f5af5c93226Jorim Jaggi            }
280baa23274596246d03741457701ac515a73aa8818Selim Cinek            mStatusBarWindowManager.setKeyguardShowing(false);
28176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi            mBouncer.hide(true /* destroyView */);
282baa23274596246d03741457701ac515a73aa8818Selim Cinek            mViewMediatorCallback.keyguardGone();
283746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            executeAfterKeyguardGoneAction();
284baa23274596246d03741457701ac515a73aa8818Selim Cinek            updateStates();
285e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        }
28644cf91960d74eccec45b9adec291ddb8baf84b4dJorim Jaggi
2875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
289746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    private void executeAfterKeyguardGoneAction() {
290746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi        if (mAfterKeyguardGoneAction != null) {
291746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            mAfterKeyguardGoneAction.onDismiss();
292746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi            mAfterKeyguardGoneAction = null;
293746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi        }
294746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi    }
295746f7facf2c5f9a7362387806b5926b951bb024aJorim Jaggi
2965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
2975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Dismisses the keyguard by going to the next screen or making it gone.
2985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
2995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void dismiss() {
3005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (mScreenOn) {
3010bed7f258ba1fffc10f986ee043b769f1fd40ad3Jorim Jaggi            showBouncer();
3025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
3035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
3052231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer    /**
3062231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer     * WARNING: This method might cause Binder calls.
3072231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer     */
3081568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi    public boolean isSecure() {
3091568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi        return mBouncer.isSecure();
3101568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi    }
3111568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi
3125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
3135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @return Whether the keyguard is showing
3145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
3155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public boolean isShowing() {
31603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        return mShowing;
3175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
318e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi
319e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    /**
320e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     * Notifies this manager that the back button has been pressed.
321e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     *
322e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     * @return whether the back press has been handled
323e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi     */
324e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    public boolean onBackPressed() {
325e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        if (mBouncer.isShowing()) {
3266bad244c4e0bcfba1652f3cc3593a9034f84fd9bJorim Jaggi            reset();
327e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi            return true;
328e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        }
329e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        return false;
330e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    }
331e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi
332f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller    public boolean isBouncerShowing() {
333f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller        return mBouncer.isShowing();
334f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller    }
335f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller
336416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private long getNavBarShowDelay() {
337416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        if (mPhoneStatusBar.isKeyguardFadingAway()) {
338416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            return mPhoneStatusBar.getKeyguardFadingAwayDelay();
339416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        } else {
340416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
341416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            // Keyguard is not going away, thus we are showing the navigation bar because the
342416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            // bouncer is appearing.
343416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            return NAV_BAR_SHOW_DELAY_BOUNCER;
344416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        }
345416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    }
346416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
347416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
348416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        @Override
349416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        public void run() {
350416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE);
351416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi        }
352416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi    };
353416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi
3544222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    private void updateStates() {
355e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi        int vis = mContainer.getSystemUiVisibility();
356b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean showing = mShowing;
357b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean occluded = mOccluded;
358b601162a60663329355720083bfa199909dbf6efAdrian Roos        boolean bouncerShowing = mBouncer.isShowing();
35995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
360b601162a60663329355720083bfa199909dbf6efAdrian Roos
361b601162a60663329355720083bfa199909dbf6efAdrian Roos        if ((bouncerDismissible || !showing) != (mLastBouncerDismissible || !mLastShowing)
362b601162a60663329355720083bfa199909dbf6efAdrian Roos                || mFirstUpdate) {
363b601162a60663329355720083bfa199909dbf6efAdrian Roos            if (bouncerDismissible || !showing) {
364b601162a60663329355720083bfa199909dbf6efAdrian Roos                mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
3651e68fb3c3842bb90ed3f474cef0ddf7116eace0eJason Monk            } else {
366b601162a60663329355720083bfa199909dbf6efAdrian Roos                mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
367b601162a60663329355720083bfa199909dbf6efAdrian Roos            }
368b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
369b601162a60663329355720083bfa199909dbf6efAdrian Roos        if ((!(showing && !occluded) || bouncerShowing)
370b601162a60663329355720083bfa199909dbf6efAdrian Roos                != (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing) || mFirstUpdate) {
371b601162a60663329355720083bfa199909dbf6efAdrian Roos            if (mPhoneStatusBar.getNavigationBarView() != null) {
372b601162a60663329355720083bfa199909dbf6efAdrian Roos                if (!(showing && !occluded) || bouncerShowing) {
373416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
374416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                            getNavBarShowDelay());
375b601162a60663329355720083bfa199909dbf6efAdrian Roos                } else {
376416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
377b601162a60663329355720083bfa199909dbf6efAdrian Roos                    mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE);
378b601162a60663329355720083bfa199909dbf6efAdrian Roos                }
3791e68fb3c3842bb90ed3f474cef0ddf7116eace0eJason Monk            }
380a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi        }
381b601162a60663329355720083bfa199909dbf6efAdrian Roos
382b601162a60663329355720083bfa199909dbf6efAdrian Roos        if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
383b601162a60663329355720083bfa199909dbf6efAdrian Roos            mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
384b601162a60663329355720083bfa199909dbf6efAdrian Roos            mPhoneStatusBar.setBouncerShowing(bouncerShowing);
385ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi            mScrimController.setBouncerShowing(bouncerShowing);
386b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
387b601162a60663329355720083bfa199909dbf6efAdrian Roos
388b601162a60663329355720083bfa199909dbf6efAdrian Roos        KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
389b601162a60663329355720083bfa199909dbf6efAdrian Roos        if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
390b601162a60663329355720083bfa199909dbf6efAdrian Roos            updateMonitor.sendKeyguardVisibilityChanged(showing && !occluded);
391b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
392b601162a60663329355720083bfa199909dbf6efAdrian Roos        if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
393b601162a60663329355720083bfa199909dbf6efAdrian Roos            updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
394b601162a60663329355720083bfa199909dbf6efAdrian Roos        }
395b601162a60663329355720083bfa199909dbf6efAdrian Roos
396b601162a60663329355720083bfa199909dbf6efAdrian Roos        mFirstUpdate = false;
397b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastShowing = showing;
398b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastOccluded = occluded;
399b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastBouncerShowing = bouncerShowing;
400b601162a60663329355720083bfa199909dbf6efAdrian Roos        mLastBouncerDismissible = bouncerDismissible;
4012231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer
4022231c6e1adefdb7636d9fe38a388f1b0660d30eaChristoph Studer        mPhoneStatusBar.onKeyguardViewManagerStatesUpdated();
403e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi    }
4048c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi
4058c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi    public boolean onMenuPressed() {
4068c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi        return mBouncer.onMenuPressed();
4078c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi    }
408df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi
409df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi    public boolean interceptMediaKey(KeyEvent event) {
410df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        return mBouncer.interceptMediaKey(event);
411df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi    }
4128de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi
4138de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    public void onActivityDrawn() {
4148de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        if (mPhoneStatusBar.isCollapsing()) {
4158de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            mPhoneStatusBar.addPostCollapseAction(new Runnable() {
4168de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                @Override
4178de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                public void run() {
4188de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                    mViewMediatorCallback.readyForKeyguardDone();
4198de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi                }
4208de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            });
4218de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        } else {
4228de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            mViewMediatorCallback.readyForKeyguardDone();
4238de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        }
4248de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    }
42584a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi
42684a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    public boolean shouldDisableWindowAnimationsForUnlock() {
42784a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi        return mPhoneStatusBar.isInLaunchTransition();
42884a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    }
42984a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi
43084a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    public boolean isGoingToNotificationShade() {
43184a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi        return mPhoneStatusBar.isGoingToNotificationShade();
43284a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi    }
43331b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos
43431b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos    public boolean isSecure(int userId) {
43531b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos        return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
43631b844ba0cf418b758fbe45023d0202f208c0191Adrian Roos    }
437ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller
438ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller    public boolean isInputRestricted() {
439ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        return mViewMediatorCallback.isInputRestricted();
440ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller    }
44133ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi
44233ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi    public void keyguardGoingAway() {
44333ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi        mPhoneStatusBar.keyguardGoingAway();
44433ae80e35a1b170309999c9b33b310ca91eb3f05Jorim Jaggi    }
44525d7e51a10828e4433fcca90410d13a4b2342c34Jim Miller
446f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi    public void animateCollapsePanels(float speedUpFactor) {
447f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi        mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
448f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi                false /* delayed */, speedUpFactor);
44925d7e51a10828e4433fcca90410d13a4b2342c34Jim Miller    }
4505cc86599ce0e5596655859d09c52934030da240bJorim Jaggi
4515cc86599ce0e5596655859d09c52934030da240bJorim Jaggi    /**
4525cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     * Notifies that the user has authenticated by other means than using the bouncer, for example,
4535cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     * fingerprint.
4545cc86599ce0e5596655859d09c52934030da240bJorim Jaggi     */
4555cc86599ce0e5596655859d09c52934030da240bJorim Jaggi    public void notifyKeyguardAuthenticated() {
4565cc86599ce0e5596655859d09c52934030da240bJorim Jaggi        mBouncer.notifyKeyguardAuthenticated();
4575cc86599ce0e5596655859d09c52934030da240bJorim Jaggi    }
4585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
459