11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/*
21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License.
61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at
71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and
141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License.
151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard;
181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
19dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity;
20b375632c9cf7b7be9309ff55f602499d59cfa597Dianne Hackbornimport android.app.ActivityManager;
2176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurkaimport android.appwidget.AppWidgetManager;
221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.pm.ActivityInfo;
24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.res.Configuration;
2506cc78a4e3126703cae88dbc969974267b9f2c94Jim Millerimport android.content.res.Resources;
261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.graphics.PixelFormat;
272b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Millerimport android.graphics.Rect;
28f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport android.os.Bundle;
2938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.os.IBinder;
306bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.os.Parcelable;
3156bacd76b2e8caaad6be933ceb7168e046f7253eJim Millerimport android.os.SystemProperties;
321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log;
330cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautnerimport android.util.Slog;
346bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.util.SparseArray;
35f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport android.view.KeyEvent;
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.LayoutInflater;
371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup;
391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewManager;
401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager;
411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.FrameLayout;
421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
43dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R;
44f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport com.android.internal.widget.LockPatternUtils;
456edf2637e96139735df83907c221cce16d4d7eaaJim Miller
461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Manages creating, showing, hiding and resetting the keyguard.  Calls back
48904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner * via {@link KeyguardViewMediator.ViewMediatorCallback} to poke
491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock and report that the keyguard is done, which is in turn,
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * reported to this class by the current {@link KeyguardViewBase}.
511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardViewManager {
53a71984f3da47c6e6e3164c170735362a3222d3adJim Miller    private final static boolean DEBUG = KeyguardViewMediator.DEBUG;
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static String TAG = "KeyguardViewManager";
553af630c8d18bcf4b23a5a308917319dd04cc8ed2Jim Miller    public static boolean USE_UPPER_CASE = true;
561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
579cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller    // Timeout used for keypresses
589cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller    static final int DIGIT_PRESS_WAKE_MILLIS = 5000;
599cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller
601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final Context mContext;
611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final ViewManager mViewManager;
62dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private final KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback;
631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private WindowManager.LayoutParams mWindowLayoutParams;
651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private boolean mNeedsInput = false;
6622dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller
671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private FrameLayout mKeyguardHost;
68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardHostView mKeyguardView;
691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
70ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner    private boolean mScreenOn = false;
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
7338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    public interface ShowListener {
7438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        void onShown(IBinder windowToken);
7538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    };
7638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param context Used to create views.
791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param viewManager Keyguard will be attached to this.
801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param callback Used to notify of changes.
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * @param lockPatternUtils
821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public KeyguardViewManager(Context context, ViewManager viewManager,
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            KeyguardViewMediator.ViewMediatorCallback callback,
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            LockPatternUtils lockPatternUtils) {
861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mContext = context;
871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mViewManager = viewManager;
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewMediatorCallback = callback;
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = lockPatternUtils;
901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Show the keyguard.  Will handle creating and attaching to the view manager
94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * lazily.
951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
96f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen    public synchronized void show(Bundle options) {
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView);
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean enableScreenRotation = shouldEnableScreenRotation();
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
101a71984f3da47c6e6e3164c170735362a3222d3adJim Miller        maybeCreateKeyguardLocked(enableScreenRotation, false, options);
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        maybeEnableScreenRotation(enableScreenRotation);
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
104e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // Disable common aspects of the system/status/navigation bars that are not appropriate or
105e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // useful on any keyguard screen but can be re-shown by dialogs or SHOW_WHEN_LOCKED
106e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // activities. Other disabled bits are handled by the KeyguardViewMediator talking
107e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // directly to the status bar service.
108e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        final int visFlags = View.STATUS_BAR_DISABLE_HOME;
109a71984f3da47c6e6e3164c170735362a3222d3adJim Miller        if (DEBUG) Log.v(TAG, "show:setSystemUiVisibility(" + Integer.toHexString(visFlags)+")");
110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardHost.setSystemUiVisibility(visFlags);
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardHost.setVisibility(View.VISIBLE);
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.show();
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.requestFocus();
116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean shouldEnableScreenRotation() {
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        Resources res = mContext.getResources();
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return SystemProperties.getBoolean("lockscreen.rot_override",false)
121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                || res.getBoolean(com.android.internal.R.bool.config_enableLockScreenRotation);
122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    class ViewManagerHost extends FrameLayout {
125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public ViewManagerHost(Context context) {
1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            super(context);
1275da6430fff7812e58ee7e9a05c62d72c36f366c8Adam Powell            setFitsSystemWindows(true);
1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        @Override
1312b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller        protected boolean fitSystemWindows(Rect insets) {
1322b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller            Log.v("TAG", "bug 7643792: fitSystemWindows(" + insets.toShortString() + ")");
1332b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller            return super.fitSystemWindows(insets);
1342b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller        }
1352b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller
1362b84b817e40cbd22f2a048a469d0d8ad513f7dd3Jim Miller        @Override
137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        protected void onConfigurationChanged(Configuration newConfig) {
138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            super.onConfigurationChanged(newConfig);
139d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner            post(new Runnable() {
140d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                @Override
141d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                public void run() {
142d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                    synchronized (KeyguardViewManager.this) {
143d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                        if (mKeyguardHost.getVisibility() == View.VISIBLE) {
144d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                            // only propagate configuration messages if we're currently showing
145d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                            maybeCreateKeyguardLocked(shouldEnableScreenRotation(), true, null);
146d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                        } else {
147d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                            if (DEBUG) Log.v(TAG, "onConfigurationChanged: view not visible");
148d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                        }
149d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                    }
150d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner                }
151d86159067f4feed23b5057eff726cef4a4af7f2bCraig Mautner            });
1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1530a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller
1540a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        @Override
1550a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        public boolean dispatchKeyEvent(KeyEvent event) {
15642df15e93d3eb70846270b26c024f1575e82fa06Jim Miller            if (mKeyguardView != null) {
15742df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                // Always process back and menu keys, regardless of focus
15842df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                if (event.getAction() == KeyEvent.ACTION_DOWN) {
15942df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                    int keyCode = event.getKeyCode();
16042df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                    if (keyCode == KeyEvent.KEYCODE_BACK && mKeyguardView.handleBackKey()) {
16142df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                        return true;
16242df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                    } else if (keyCode == KeyEvent.KEYCODE_MENU && mKeyguardView.handleMenuKey()) {
16342df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                        return true;
16442df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                    }
16542df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                }
16642df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                // Always process media keys, regardless of focus
16742df15e93d3eb70846270b26c024f1575e82fa06Jim Miller                if (mKeyguardView.dispatchKeyEvent(event)) {
1680a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller                    return true;
1690a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller                }
1700a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller            }
1710a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller            return super.dispatchKeyEvent(event);
1720a34d9edf02954d83c2861a8c6836865f8fa00fbJim Miller        }
1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1756bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    SparseArray<Parcelable> mStateContainer = new SparseArray<Parcelable>();
1766bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
177a71984f3da47c6e6e3164c170735362a3222d3adJim Miller    private void maybeCreateKeyguardLocked(boolean enableScreenRotation, boolean force,
178a71984f3da47c6e6e3164c170735362a3222d3adJim Miller            Bundle options) {
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final boolean isActivity = (mContext instanceof Activity); // for test activity
1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1816bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        if (mKeyguardHost != null) {
1826bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller            mKeyguardHost.saveHierarchyState(mStateContainer);
1836bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        }
1846bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardHost == null) {
1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mKeyguardHost = new ViewManagerHost(mContext);
1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1905da6430fff7812e58ee7e9a05c62d72c36f366c8Adam Powell            int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
1915da6430fff7812e58ee7e9a05c62d72c36f366c8Adam Powell                    | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
192a9fa92e889a9dbc94c25e4ba1d67ce24929b834fAdam Powell                    | WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
193d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller                    | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (!mNeedsInput) {
1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
19898365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (ActivityManager.isHighEndGfx()) {
1995d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
200b375632c9cf7b7be9309ff55f602499d59cfa597Dianne Hackborn            }
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int type = isActivity ? WindowManager.LayoutParams.TYPE_APPLICATION
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    : WindowManager.LayoutParams.TYPE_KEYGUARD;
2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    stretch, stretch, type, flags, PixelFormat.TRANSLUCENT);
2076b05d58018c2806459c121e507c005639b74aee9Jim Miller            lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
20801ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn            lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen;
20998365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (ActivityManager.isHighEndGfx()) {
2105d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
2115d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                lp.privateFlags |=
2125d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                        WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
2135d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            }
21473ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY;
21588400d3a31139c40c4014faf86c243647087ef6cCraig Mautner            if (isActivity) {
21688400d3a31139c40c4014faf86c243647087ef6cCraig Mautner                lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
21788400d3a31139c40c4014faf86c243647087ef6cCraig Mautner            }
2183dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            lp.setTitle(isActivity ? "KeyguardMock" : "Keyguard");
2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mWindowLayoutParams = lp;
2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mViewManager.addView(mKeyguardHost, lp);
2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
223c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
224a71984f3da47c6e6e3164c170735362a3222d3adJim Miller        if (force || mKeyguardView == null) {
225a71984f3da47c6e6e3164c170735362a3222d3adJim Miller            inflateKeyguardView(options);
226147f9568afe645d9bfb91f3037f5336d8a2482ccJim Miller            mKeyguardView.requestFocus();
227a71984f3da47c6e6e3164c170735362a3222d3adJim Miller        }
228c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        updateUserActivityTimeoutInWindowLayoutParams();
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
2306bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
2316bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        mKeyguardHost.restoreHierarchyState(mStateContainer);
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
234f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen    private void inflateKeyguardView(Bundle options) {
23500baebe124701903db8eb35abb087767c5d769a5Craig Mautner        View v = mKeyguardHost.findViewById(R.id.keyguard_host_view);
23600baebe124701903db8eb35abb087767c5d769a5Craig Mautner        if (v != null) {
23700baebe124701903db8eb35abb087767c5d769a5Craig Mautner            mKeyguardHost.removeView(v);
238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
23964ecc0e1015f1c6c1f949bb74ba3f0875178c737Craig Mautner        // TODO: Remove once b/7094175 is fixed
2407ff30113de68539ec840c524b8f1561f938f96c5Dianne Hackborn        if (false) Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config="
24164ecc0e1015f1c6c1f949bb74ba3f0875178c737Craig Mautner                + mContext.getResources().getConfiguration());
242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final LayoutInflater inflater = LayoutInflater.from(mContext);
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true);
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView = (KeyguardHostView) view.findViewById(R.id.keyguard_host_view);
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.setLockPatternUtils(mLockPatternUtils);
246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.setViewMediatorCallback(mViewMediatorCallback);
247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
24870bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell        // HACK
24970bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell        // The keyguard view will have set up window flags in onFinishInflate before we set
25070bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell        // the view mediator callback. Make sure it knows the correct IME state.
25170bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell        if (mViewMediatorCallback != null) {
25270bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell            KeyguardPasswordView kpv = (KeyguardPasswordView) mKeyguardView.findViewById(
25370bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell                    R.id.keyguard_password_view);
25470bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell
25570bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell            if (kpv != null) {
25670bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell                mViewMediatorCallback.setNeedsInput(kpv.needsInput());
25770bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell            }
25870bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell        }
25970bc9f24ce6098a8c82245ac1ce7721d354ecd3dAdam Powell
2600ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller        if (options != null) {
26176017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka            int widgetToShow = options.getInt(LockPatternUtils.KEYGUARD_SHOW_APPWIDGET,
26276017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka                    AppWidgetManager.INVALID_APPWIDGET_ID);
26376017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka            if (widgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) {
26476017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka                mKeyguardView.goToWidget(widgetToShow);
26576017cad4f7af95380ee5eaf6dc610bb46088a9cMichael Jurka            }
266f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen        }
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
269c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    public void updateUserActivityTimeout() {
270c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        updateUserActivityTimeoutInWindowLayoutParams();
271c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
272c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    }
273c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
274c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    private void updateUserActivityTimeoutInWindowLayoutParams() {
275c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        // Use the user activity timeout requested by the keyguard view, if any.
276c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        if (mKeyguardView != null) {
277c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            long timeout = mKeyguardView.getUserActivityTimeout();
278c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            if (timeout >= 0) {
279c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown                mWindowLayoutParams.userActivityTimeout = timeout;
280c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown                return;
281c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown            }
282c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        }
283c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
284c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        // Otherwise, use the default timeout.
285c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown        mWindowLayoutParams.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
286c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown    }
287c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown
288dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void maybeEnableScreenRotation(boolean enableScreenRotation) {
289dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // TODO: move this outside
29006cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        if (enableScreenRotation) {
291f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller            if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen On!");
29282f91963188fd87aae0b35dd0f01ab95d5bb5fd3Jim Miller            mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
29306cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        } else {
294f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller            if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen Off!");
29506cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller            mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
29606cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        }
29706cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void setNeedsInput(boolean needsInput) {
3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mNeedsInput = needsInput;
3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mWindowLayoutParams != null) {
3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (needsInput) {
3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mWindowLayoutParams.flags &=
3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else {
3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mWindowLayoutParams.flags |=
3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
310dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
311dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
312dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
313dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (java.lang.IllegalArgumentException e) {
314dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // TODO: Ensure this method isn't called on views that are changing...
315dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                Log.w(TAG,"Can't update input method on " + mKeyguardHost + " window not attached");
316dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
31922dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller
3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Reset the state of the view.
3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
323f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen    public synchronized void reset(Bundle options) {
3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "reset()");
325d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani        // User might have switched, check if we need to go back to keyguard
326d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani        // TODO: It's preferable to stay and show the correct lockscreen or unlock if none
327a71984f3da47c6e6e3164c170735362a3222d3adJim Miller        maybeCreateKeyguardLocked(shouldEnableScreenRotation(), true, options);
3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void onScreenTurnedOff() {
3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "onScreenTurnedOff()");
332ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner        mScreenOn = false;
3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.onScreenTurnedOff();
33515ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna        }
3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
33838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    public synchronized void onScreenTurnedOn(
33938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            final KeyguardViewManager.ShowListener showListener) {
3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "onScreenTurnedOn()");
341ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner        mScreenOn = true;
3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.onScreenTurnedOn();
3446edf2637e96139735df83907c221cce16d4d7eaaJim Miller
34538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            // Caller should wait for this window to be shown before turning
34638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            // on the screen.
347904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner            if (showListener != null) {
348904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                if (mKeyguardHost.getVisibility() == View.VISIBLE) {
349904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    // Keyguard may be in the process of being shown, but not yet
350904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    // updated with the window manager...  give it a chance to do so.
351904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    mKeyguardHost.post(new Runnable() {
352904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                        @Override
353904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                        public void run() {
354904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                            if (mKeyguardHost.getVisibility() == View.VISIBLE) {
355904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                                showListener.onShown(mKeyguardHost.getWindowToken());
356904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                            } else {
357904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                                showListener.onShown(null);
358904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                            }
35938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        }
360904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    });
361904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                } else {
362904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    showListener.onShown(null);
363904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                }
36438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            }
365904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner        } else if (showListener != null) {
36638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            showListener.onShown(null);
36715ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna        }
3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void verifyUnlock() {
3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "verifyUnlock()");
372f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen        show(null);
3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mKeyguardView.verifyUnlock();
3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * A key has woken the device.  We use this to potentially adjust the state
3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * of the lock screen based on the key.
3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * The 'Tq' suffix is per the documentation in {@link android.view.WindowManagerPolicy}.
3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Be sure not to take any action that takes a long time; any significant
3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * action should be posted to a handler.
3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
38456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * @param keyCode The wake key.  May be {@link KeyEvent#KEYCODE_UNKNOWN} if waking
38556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * for a reason other than a key press.
3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
3873754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood    public boolean wakeWhenReadyTq(int keyCode) {
3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "wakeWhenReady(" + keyCode + ")");
3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.wakeWhenReadyTq(keyCode);
3913754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood            return true;
3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
393904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner        Log.w(TAG, "mKeyguardView is null in wakeWhenReadyTq");
394904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner        return false;
3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Hides the keyguard view
3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void hide() {
4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "hide()");
4026edf2637e96139735df83907c221cce16d4d7eaaJim Miller
4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardHost != null) {
4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardHost.setVisibility(View.GONE);
405223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
406223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            // We really only want to preserve keyguard state for configuration changes. Hence
407223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            // we should clear state of widgets (e.g. Music) when we hide keyguard so it can
408223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            // start with a fresh state when we return.
409223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller            mStateContainer.clear();
410223ce5c7326f6d13a17ccf2624605bb62864a27aJim Miller
411a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen            // Don't do this right away, so we can let the view continue to animate
41201ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn            // as it goes away.
413a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen            if (mKeyguardView != null) {
41422dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                final KeyguardViewBase lastView = mKeyguardView;
41522dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                mKeyguardView = null;
416a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                mKeyguardHost.postDelayed(new Runnable() {
417904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner                    @Override
418a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                    public void run() {
419d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn                        synchronized (KeyguardViewManager.this) {
42022dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                            lastView.cleanUp();
4218b886fab5496b0b1f5193f21855220176deddc37Jim Miller                            mKeyguardHost.removeView(lastView);
422d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn                        }
423a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                    }
424a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                }, 500);
4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
4261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
4271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
4281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
4291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
430ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner     * Dismisses the keyguard by going to the next screen or making it gone.
431ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner     */
432ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner    public synchronized void dismiss() {
433ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner        if (mScreenOn) {
434ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner            mKeyguardView.dismiss();
435ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner        }
436ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner    }
437ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner
438ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner    /**
4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @return Whether the keyguard is showing
4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
4411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized boolean isShowing() {
4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE);
4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
4444eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller
4454eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller    public void showAssistant() {
4464eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller        if (mKeyguardView != null) {
4474eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller            mKeyguardView.showAssistant();
4484eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller        }
4494eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller    }
4501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
451