KeyguardViewManager.java revision 6bcd73203ada36b446b05fa33f9834ac989c0621
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;
211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.pm.ActivityInfo;
23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.res.Configuration;
2406cc78a4e3126703cae88dbc969974267b9f2c94Jim Millerimport android.content.res.Resources;
251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.graphics.PixelFormat;
2638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.os.IBinder;
276bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.os.Parcelable;
2856bacd76b2e8caaad6be933ceb7168e046f7253eJim Millerimport android.os.SystemProperties;
291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log;
300cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautnerimport android.util.Slog;
316bcd73203ada36b446b05fa33f9834ac989c0621Jim Millerimport android.util.SparseArray;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.LayoutInflater;
331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup;
351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewManager;
361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager;
371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.FrameLayout;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils;
40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.R;
416edf2637e96139735df83907c221cce16d4d7eaaJim Miller
421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Manages creating, showing, hiding and resetting the keyguard.  Calls back
441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * via {@link com.android.internal.policy.impl.KeyguardViewCallback} to poke
451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock and report that the keyguard is done, which is in turn,
461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * reported to this class by the current {@link KeyguardViewBase}.
471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardViewManager {
491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final static boolean DEBUG = false;
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static String TAG = "KeyguardViewManager";
513af630c8d18bcf4b23a5a308917319dd04cc8ed2Jim Miller    public static boolean USE_UPPER_CASE = true;
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final Context mContext;
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final ViewManager mViewManager;
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private final KeyguardViewMediator.ViewMediatorCallback mViewMediatorCallback;
561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private WindowManager.LayoutParams mWindowLayoutParams;
581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private boolean mNeedsInput = false;
5922dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller
601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private FrameLayout mKeyguardHost;
61dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardHostView mKeyguardView;
621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private boolean mScreenOn = false;
64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
6638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    public interface ShowListener {
6738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        void onShown(IBinder windowToken);
6838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    };
6938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param context Used to create views.
721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param viewManager Keyguard will be attached to this.
731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @param callback Used to notify of changes.
74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * @param lockPatternUtils
751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public KeyguardViewManager(Context context, ViewManager viewManager,
77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            KeyguardViewMediator.ViewMediatorCallback callback,
78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            LockPatternUtils lockPatternUtils) {
791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mContext = context;
801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mViewManager = viewManager;
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewMediatorCallback = callback;
82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = lockPatternUtils;
831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Show the keyguard.  Will handle creating and attaching to the view manager
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * lazily.
881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public synchronized void show() {
90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView);
91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        boolean enableScreenRotation = shouldEnableScreenRotation();
93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
946bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        maybeCreateKeyguardLocked(enableScreenRotation, false);
95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        maybeEnableScreenRotation(enableScreenRotation);
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
97e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // Disable common aspects of the system/status/navigation bars that are not appropriate or
98e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // useful on any keyguard screen but can be re-shown by dialogs or SHOW_WHEN_LOCKED
99e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // activities. Other disabled bits are handled by the KeyguardViewMediator talking
100e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        // directly to the status bar service.
101e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller        final int visFlags = View.STATUS_BAR_DISABLE_HOME;
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (DEBUG) Log.v(TAG, "KGVM: Set visibility on " + mKeyguardHost + " to " + visFlags);
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardHost.setSystemUiVisibility(visFlags);
104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardHost.setVisibility(View.VISIBLE);
107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.show();
108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.requestFocus();
109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private boolean shouldEnableScreenRotation() {
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        Resources res = mContext.getResources();
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return SystemProperties.getBoolean("lockscreen.rot_override",false)
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                || res.getBoolean(com.android.internal.R.bool.config_enableLockScreenRotation);
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    class ViewManagerHost extends FrameLayout {
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public ViewManagerHost(Context context) {
1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            super(context);
1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        @Override
123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        protected void onConfigurationChanged(Configuration newConfig) {
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            super.onConfigurationChanged(newConfig);
1256bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller            maybeCreateKeyguardLocked(shouldEnableScreenRotation(), false);
1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1296bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    SparseArray<Parcelable> mStateContainer = new SparseArray<Parcelable>();
1306bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
1316bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    private void maybeCreateKeyguardLocked(boolean enableScreenRotation, boolean userSwitched) {
132dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final boolean isActivity = (mContext instanceof Activity); // for test activity
1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1346bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        if (mKeyguardHost != null) {
1356bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller            mKeyguardHost.saveHierarchyState(mStateContainer);
1366bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        }
1376bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardHost == null) {
1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mKeyguardHost = new ViewManagerHost(mContext);
1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
144d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller                    | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (!mNeedsInput) {
1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
14998365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (ActivityManager.isHighEndGfx()) {
1505d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
151b375632c9cf7b7be9309ff55f602499d59cfa597Dianne Hackborn            }
152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;
154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            final int type = isActivity ? WindowManager.LayoutParams.TYPE_APPLICATION
155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    : WindowManager.LayoutParams.TYPE_KEYGUARD;
1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    stretch, stretch, type, flags, PixelFormat.TRANSLUCENT);
1586b05d58018c2806459c121e507c005639b74aee9Jim Miller            lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
15901ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn            lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen;
16098365d7663cbd82979a5700faf0050220b01084dJeff Brown            if (ActivityManager.isHighEndGfx()) {
1615d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
1625d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                lp.privateFlags |=
1635d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                        WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
1645d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            }
16573ab6a49db2b834ce1d56c7a1164938b409ee6fcDianne Hackborn            lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY;
1663dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
1673dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown            lp.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            lp.setTitle(isActivity ? "KeyguardMock" : "Keyguard");
1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mWindowLayoutParams = lp;
1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mViewManager.addView(mKeyguardHost, lp);
1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1726bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        inflateKeyguardView(userSwitched);
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
1746bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
1756bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        mKeyguardHost.restoreHierarchyState(mStateContainer);
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1786bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    private void inflateKeyguardView(boolean userSwitched) {
17900baebe124701903db8eb35abb087767c5d769a5Craig Mautner        View v = mKeyguardHost.findViewById(R.id.keyguard_host_view);
18000baebe124701903db8eb35abb087767c5d769a5Craig Mautner        if (v != null) {
18100baebe124701903db8eb35abb087767c5d769a5Craig Mautner            mKeyguardHost.removeView(v);
182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
1830cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner        // TODO: Remove once b/7094175 is fixed
1840cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner        Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config="
1850cbfcffe7b99eea85dc17e92ef204035fa6fd4f9Craig Mautner                + mContext.getResources().getConfiguration());
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        final LayoutInflater inflater = LayoutInflater.from(mContext);
187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true);
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView = (KeyguardHostView) view.findViewById(R.id.keyguard_host_view);
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.setLockPatternUtils(mLockPatternUtils);
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardView.setViewMediatorCallback(mViewMediatorCallback);
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1926bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        if (userSwitched) {
1936bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller            mKeyguardView.goToUserSwitcher();
1946bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        }
1956bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mScreenOn) {
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mKeyguardView.show();
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private void maybeEnableScreenRotation(boolean enableScreenRotation) {
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // TODO: move this outside
20306cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        if (enableScreenRotation) {
204f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller            if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen On!");
20582f91963188fd87aae0b35dd0f01ab95d5bb5fd3Jim Miller            mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
20606cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        } else {
207f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller            if (DEBUG) Log.d(TAG, "Rotation sensor for lock screen Off!");
20806cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller            mWindowLayoutParams.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
20906cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        }
21006cc78a4e3126703cae88dbc969974267b9f2c94Jim Miller        mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void setNeedsInput(boolean needsInput) {
2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mNeedsInput = needsInput;
2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mWindowLayoutParams != null) {
2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (needsInput) {
2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mWindowLayoutParams.flags &=
2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else {
2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mWindowLayoutParams.flags |=
2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mViewManager.updateViewLayout(mKeyguardHost, mWindowLayoutParams);
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (java.lang.IllegalArgumentException e) {
227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                // TODO: Ensure this method isn't called on views that are changing...
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                Log.w(TAG,"Can't update input method on " + mKeyguardHost + " window not attached");
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
23222dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller
2331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Reset the state of the view.
2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
2366bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller    public synchronized void reset(boolean userSwitched) {
2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "reset()");
238d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani        // User might have switched, check if we need to go back to keyguard
239d979dd7fbcf053cdb4fa5691dc625d2dfa4071f5Amith Yamasani        // TODO: It's preferable to stay and show the correct lockscreen or unlock if none
2406bcd73203ada36b446b05fa33f9834ac989c0621Jim Miller        maybeCreateKeyguardLocked(shouldEnableScreenRotation(), userSwitched);
2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void onScreenTurnedOff() {
2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "onScreenTurnedOff()");
2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mScreenOn = false;
2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.onScreenTurnedOff();
24815ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna        }
2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
25138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    public synchronized void onScreenTurnedOn(
25238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            final KeyguardViewManager.ShowListener showListener) {
2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "onScreenTurnedOn()");
2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mScreenOn = true;
2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.onScreenTurnedOn();
2576edf2637e96139735df83907c221cce16d4d7eaaJim Miller
25838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            // Caller should wait for this window to be shown before turning
25938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            // on the screen.
26038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            if (mKeyguardHost.getVisibility() == View.VISIBLE) {
26138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                // Keyguard may be in the process of being shown, but not yet
26238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                // updated with the window manager...  give it a chance to do so.
26338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                mKeyguardHost.post(new Runnable() {
264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
26538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        if (mKeyguardHost.getVisibility() == View.VISIBLE) {
26638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                            showListener.onShown(mKeyguardHost.getWindowToken());
26738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        } else {
26838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                            showListener.onShown(null);
26938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        }
27038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    }
27138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                });
27238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            } else {
27338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                showListener.onShown(null);
27438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            }
27538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        } else {
27638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            showListener.onShown(null);
27715ea55a6f1ae44ca63da158e3539903d77433988Brian Colonna        }
2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void verifyUnlock() {
2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "verifyUnlock()");
2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        show();
2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mKeyguardView.verifyUnlock();
2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
2871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * A key has woken the device.  We use this to potentially adjust the state
2881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * of the lock screen based on the key.
2891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * The 'Tq' suffix is per the documentation in {@link android.view.WindowManagerPolicy}.
2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Be sure not to take any action that takes a long time; any significant
2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * action should be posted to a handler.
2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
29456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * @param keyCode The wake key.  May be {@link KeyEvent#KEYCODE_UNKNOWN} if waking
29556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * for a reason other than a key press.
2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
2973754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood    public boolean wakeWhenReadyTq(int keyCode) {
2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "wakeWhenReady(" + keyCode + ")");
2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardView != null) {
3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardView.wakeWhenReadyTq(keyCode);
3013754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood            return true;
3023754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood        } else {
3033754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood            Log.w(TAG, "mKeyguardView is null in wakeWhenReadyTq");
3043754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood            return false;
3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Hides the keyguard view
3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized void hide() {
3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (DEBUG) Log.d(TAG, "hide()");
3136edf2637e96139735df83907c221cce16d4d7eaaJim Miller
3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mKeyguardHost != null) {
3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mKeyguardHost.setVisibility(View.GONE);
316a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen            // Don't do this right away, so we can let the view continue to animate
31701ad2f4a2d86faad2058159ad67840f1797955c0Dianne Hackborn            // as it goes away.
318a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen            if (mKeyguardView != null) {
31922dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                final KeyguardViewBase lastView = mKeyguardView;
32022dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                mKeyguardView = null;
321a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                mKeyguardHost.postDelayed(new Runnable() {
322a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                    public void run() {
323d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn                        synchronized (KeyguardViewManager.this) {
32422dfe722dfb1094cfc5be0f155f3930bf39e5d61Jim Miller                            lastView.cleanUp();
3258b886fab5496b0b1f5193f21855220176deddc37Jim Miller                            mKeyguardHost.removeView(lastView);
326d7f7deb2862fcfe830df15b6dc1be041f2741d3dDianne Hackborn                        }
327a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                    }
328a35d753adda055582e319bc98f30f11b138b2936Karl Rosaen                }, 500);
3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @return Whether the keyguard is showing
3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public synchronized boolean isShowing() {
3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE);
3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
340