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