KeyguardViewMediator.java revision 39c2d71950a5ecccb2881613dd69b74ba8de55f9
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 171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1937c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Savilleimport com.android.internal.telephony.IccCard; 20ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport com.android.internal.widget.LockPatternUtils; 21ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.AlarmManager; 231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.PendingIntent; 241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.StatusBarManager; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport static android.app.StatusBarManager.DISABLE_EXPAND; 26ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport static android.app.StatusBarManager.DISABLE_NONE; 271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.LocalPowerManager; 331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.PowerManager; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.SystemClock; 36ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.telephony.TelephonyManager; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Config; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.EventLog; 39ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.util.Log; 401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent; 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerImpl; 421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerPolicy; 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Mediates requests related to the keyguard. This includes queries about the 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * state of the keyguard, power management events that effect whether the keyguard 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * should be shown or reset, callbacks to the phone window manager to notify 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it of when the keyguard is showing, and events from the keyguard view itself 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * stating that the keyguard was succesfully unlocked. 511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note that the keyguard view is shown when the screen is off (as appropriate) 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * so that once the screen comes on, it will be ready immediately. 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example queries about the keyguard: 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is {movement, key} one that should wake the keygaurd? 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is the keyguard showing? 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - are input events restricted due to the state of the keyguard? 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks to the phone window manager: 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - the keyguard is showing 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example external events that translate to keyguard view changes: 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - screen turned off -> reset the keyguard, and show it so it will be ready 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * next time the screen turns on 661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - keyboard is slid open -> if the keyguard is not secure, hide it 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Events from the keyguard view: 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - user succesfully unlocked keyguard -> hide keyguard view, and no longer 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * restrict input events. 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: in addition to normal power managment events that effect the state of 731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * whether the keyguard should be showing, external apps and services may request 741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that the keyguard be disabled via {@link #setKeyguardEnabled(boolean)}. When 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false, this will override all other conditions for turning on the keyguard. 761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Threading and synchronization: 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This class is created by the initialization routine of the {@link WindowManagerPolicy}, 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and runs on its thread. The keyguard UI is created from that thread in the 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * constructor of this class. The apis may be called from other threads, including the 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link com.android.server.KeyInputQueue}'s and {@link android.view.WindowManager}'s. 821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Therefore, methods on this class are synchronized, and any action that is pointed 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * directly to the keyguard UI is posted to a {@link Handler} to ensure it is taken on the UI 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * thread of the keyguard. 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class KeyguardViewMediator implements KeyguardViewCallback, 87b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn KeyguardUpdateMonitor.SimStateCallback { 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static boolean DEBUG = false && Config.LOGD; 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static boolean DBG_WAKE = DEBUG || true; 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static String TAG = "KeyguardViewMediator"; 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9337c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville private static final String DELAYED_KEYGUARD_ACTION = 9437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD"; 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // used for handler messages 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int TIMEOUT = 1; 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int SHOW = 2; 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int HIDE = 3; 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int RESET = 4; 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int VERIFY_UNLOCK = 5; 1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_OFF = 6; 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_ON = 7; 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int WAKE_WHEN_READY = 8; 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE = 9; 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING = 10; 10739c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn private static final int KEYGUARD_DONE_AUTHENTICATING = 11; 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_MS = 5000; 1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) when 1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyboard is open 1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS = 10000; 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long to wait after the screen turns off due to timeout before 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * turning on the keyguard (i.e, the user has this much time to turn 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the screen back on without having to face the keyguard). 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DELAY_MS = 0; 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long we'll wait for the {@link KeyguardViewCallback#keyguardDoneDrawing()} 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * callback before unblocking a call to {@link #setKeyguardEnabled(boolean)} 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that is reenabling the keyguard. 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING_TIMEOUT_MS = 2000; 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Context mContext; 1361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlarmManager mAlarmManager; 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mSystemReady; 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** Low level access to the power manager for enableUserActivity. Having this 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * requires that we run in the system process. */ 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager mRealPowerManager; 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** High level access to the power manager for WakeLocks */ 1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager mPM; 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Used to keep the device awake while the keyguard is showing, i.e for 1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * calls to {@link #pokeWakelock()} 1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeLock; 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Does not turn on screen, held while a call to {@link KeyguardViewManager#wakeWhenReadyTq(int)} 1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is called to make sure the device doesn't sleep before it has a chance to poke 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock. 1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #wakeWhenReadyLocked(int) 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeAndHandOff; 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Used to disable / reenable status bar expansion. 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private StatusBarManager mStatusBarManager; 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewManager mKeyguardViewManager; 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // these are protected by synchronized (this) 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * External apps (like the phone app) can tell us to disable the keygaurd. 1721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mExternallyEnabled = true; 1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Remember if an external call to {@link #setKeyguardEnabled} with value 1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false caused us to hide the keyguard, so that we need to reshow it once 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keygaurd is reenabled with another call with value true. 1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mNeedToReshowWhenReenabled = false; 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // cached value of whether we are showing (need to know this to quickly 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // answer whether the input should be restricted) 1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mShowing = false; 1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helps remember whether the screen has turned on since the last time 1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it turned off due to timeout. see {@link #onScreenTurnedOff(int)} 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mDelayedShowingSequence; 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mWakelockSequence; 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PhoneWindowManager mCallback; 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * If the user has disabled the keyguard, then requests to exit, this is 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * how we'll ultimately let them know whether it was successful. We use this 1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * var being non-null as an indicator that there is an in progress request. 2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private WindowManagerPolicy.OnKeyguardExitResult mExitSecureCallback; 2021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the properties of the keyguard 2041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewProperties mKeyguardViewProperties; 2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardUpdateMonitor mUpdateMonitor; 2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mKeyboardOpen = false; 2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 210ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen private boolean mScreenOn = false; 211ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 213c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project * we send this intent when the keyguard is dismissed. 214c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project */ 215c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project private Intent mUserPresentIntent; 216c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project 217c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project /** 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link #setKeyguardEnabled} waits on this condition when it reenables 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard. 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mWaitingUntilKeyguardVisible = false; 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public KeyguardViewMediator(Context context, PhoneWindowManager callback, 2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager powerManager) { 2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mRealPowerManager = powerManager; 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 2291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock = mPM.newWakeLock( 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguard"); 2321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.setReferenceCounted(false); 2331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff = mPM.newWakeLock( 2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PowerManager.PARTIAL_WAKE_LOCK, 2361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguardWakeAndHandOff"); 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.setReferenceCounted(false); 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project IntentFilter filter = new IntentFilter(); 2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(DELAYED_KEYGUARD_ACTION); 241ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context.registerReceiver(mBroadCastReceiver, filter); 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager = (AlarmManager) context 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .getSystemService(Context.ALARM_SERVICE); 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback = callback; 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor = new KeyguardUpdateMonitor(context); 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.registerSimStateCallback(this); 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewProperties = 2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project new LockPatternKeyguardViewProperties( 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project new LockPatternUtils(mContext.getContentResolver()), 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor); 2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager = new KeyguardViewManager( 2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context, WindowManagerImpl.getDefault(), this, 2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewProperties, mUpdateMonitor); 2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 260c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT); 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let us know that the system is ready after startup. 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onSystemReady() { 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSystemReady"); 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSystemReady = true; 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Called to let us know the screen was turned off. 276016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER} or 277016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT}. 2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOff(int why) { 2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 281ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = false; 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")"); 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "pending exit secure callback cancelled"); 2861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 2871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 2881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 2891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project hideLocked(); 2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mShowing) { 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOffLocked(); 2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT) { 2951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the screen turned off because of timeout, set an alarm 2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to enable it a little bit later (i.e, give the user a chance 2971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to turn the screen back on within a certain window without 2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // having to unlock the screen) 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project long when = SystemClock.elapsedRealtime() + KEYGUARD_DELAY_MS; 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Intent intent = new Intent(DELAYED_KEYGUARD_ACTION); 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project intent.putExtra("seq", mDelayedShowingSequence); 3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PendingIntent sender = PendingIntent.getBroadcast(mContext, 3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project sender); 30637c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = " 30737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville + mDelayedShowingSequence); 308016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood } else { 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let's us know the screen was turned on. 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOn() { 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 319ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = true; 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDelayedShowingSequence++; 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOn, seq = " + mDelayedShowingSequence); 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOnLocked(); 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * a way for external stuff to override normal keyguard behavior. For instance 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the phone app disables the keyguard when it receives incoming calls. 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void setKeyguardEnabled(boolean enabled) { 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")"); 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = enabled; 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!enabled && mShowing) { 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring"); 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // we're in the process of handling a request to verify the user 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // can get past the keyguard. ignore extraneous requests to disable / reenable 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // hiding keyguard that is showing, remember to reshow later 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, " 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "disabling status bar expansion"); 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = true; 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project setStatusBarExpandable(false); 3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project hideLocked(); 3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (enabled && mNeedToReshowWhenReenabled) { 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // reenabled after previously hidden, reshow 3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling " 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "status bar expansion"); 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project setStatusBarExpandable(true); 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting"); 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // block until we know the keygaurd is done drawing (and post a message 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to unblock us after a timeout so we don't risk blocking too long 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // and causing an ANR). 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = true; 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS); 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false"); 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project while (mWaitingUntilKeyguardVisible) { 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wait(); 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (InterruptedException e) { 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Thread.currentThread().interrupt(); 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible"); 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void verifyUnlock(WindowManagerPolicy.OnKeyguardExitResult callback) { 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlock"); 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // don't allow this api when the device isn't provisioned 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "ignoring because device isn't provisioned"); 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mExternallyEnabled) { 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // this only applies when the user has externally disabled the 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // keyguard. this is unexpected and means the user is not 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // using the api properly. 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.w(TAG, "verifyUnlock called when not externally disabled"); 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mExitSecureCallback != null) { 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // already in progress with someone else 4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 4061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = callback; 4071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project verifyUnlockLocked(); 4081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void setStatusBarExpandable(boolean isExpandable) { 4141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mStatusBarManager == null) { 4151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mStatusBarManager = 4161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project (StatusBarManager) mContext.getSystemService(Context.STATUS_BAR_SERVICE); 4171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mStatusBarManager.disable(isExpandable ? DISABLE_NONE : DISABLE_EXPAND); 4191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Is the keyguard currently showing? 4231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isShowing() { 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing; 4261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Given the state of the keyguard, is the input restricted? 4301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Input is restricted when the keyguard is showing, or when the keyguard 4311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was suppressed by an app that disabled the keyguard or we haven't been provisioned yet. 4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isInputRestricted() { 4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing || mNeedToReshowWhenReenabled || !mUpdateMonitor.isDeviceProvisioned(); 4351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 437b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn /** 438b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * Returns true if the change is resulting in the keyguard beign dismissed, 439b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * meaning the screen can turn on immediately. Otherwise returns false. 440b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn */ 441b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean doLidChangeTq(boolean isLidOpen) { 442b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn mKeyboardOpen = isLidOpen; 443b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn 444b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (mUpdateMonitor.isKeyguardBypassEnabled() && mKeyboardOpen 445b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn && !mKeyguardViewProperties.isSecure() && mKeyguardViewManager.isShowing()) { 446b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (DEBUG) Log.d(TAG, "bypassing keyguard on sliding open of keyboard with non-secure keyguard"); 44739c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn mHandler.sendEmptyMessage(KEYGUARD_DONE_AUTHENTICATING); 448b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return true; 449b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 450b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return false; 451b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 4521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Enable the keyguard if the settings are appropriate. 4551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void doKeyguard() { 4571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 4581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if another app is disabling us, don't show 4591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 4601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); 461ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 462ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // note: we *should* set mNeedToReshowWhenReenabled=true here, but that makes 463ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for an occasional ugly flicker in this situation: 464ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 1) receive a call with the screen on (no keyguard) or make a call 465ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 2) screen times out 466ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 3) user hits key to turn screen back on 467ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // instead, we reenable the keyguard when we know the screen is off and the call 468ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // ends (see the broadcast receiver below) 469ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // TODO: clean this up when we have better support at the window manager level 470ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for apps that wish to be on top of the keyguard 4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 4721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the keyguard is already showing, don't bother 4751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardViewManager.isShowing()) { 4761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); 4771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 4781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the setup wizard hasn't run yet, don't show 4811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean provisioned = mUpdateMonitor.isDeviceProvisioned(); 48237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville final IccCard.State state = mUpdateMonitor.getSimState(); 48337c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville final boolean lockedOrMissing = state.isPinLocked() || (state == IccCard.State.ABSENT); 4841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!lockedOrMissing && !provisioned) { 4851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned" 4861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + " and the sim is not locked or missing"); 4871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 4881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); 4911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 4921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to reset its state. 4971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleReset() 4981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void resetStateLocked() { 5001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "resetStateLocked"); 5011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(RESET); 5021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to verify unlock 5071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleVerifyUnlock() 5081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void verifyUnlockLocked() { 5101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlockLocked"); 5111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(VERIFY_UNLOCK); 5121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onScreenTurnedOff(int) 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOff 5191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOffLocked() { 5211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); 5221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); 5231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onScreenTurnedOn() 5281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOn 5291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOnLocked() { 5311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); 5321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_ON); 5331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it about a wake key so it can adjust 5371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * its state accordingly and then poke the wake lock when it is ready. 5381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The wake key. 5391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleWakeWhenReady 5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onWakeKeyWhenKeyguardShowingTq(int) 5411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void wakeWhenReadyLocked(int keyCode) { 5431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "wakeWhenReadyLocked(" + keyCode + ")"); 5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * acquire the handoff lock that will keep the cpu running. this will 5471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be released once the keyguard has set itself up and poked the other wakelock 5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * in {@link #handleWakeWhenReady(int)} 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.acquire(); 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(WAKE_WHEN_READY, keyCode, 0); 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to show itself 5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleShow() 5591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void showLocked() { 5611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "showLocked"); 5621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(SHOW); 5631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to hide itself 5681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleHide() 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void hideLocked() { 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "hideLocked"); 5721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(HIDE); 5731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 57737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void onSimStateChanged(IccCard.State simState) { 5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSimStateChanged: " + simState); 5791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (simState) { 5811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case ABSENT: 5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // only force lock screen in case of missing sim if user hasn't 5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // gone through setup wizard 5841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 5851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 58637c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_ABSENT and keygaurd isn't showing, we need " 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard since the device isn't provisioned yet."); 5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 5911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PIN_REQUIRED: 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PUK_REQUIRED: 5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 59737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_LOCKED and keygaurd isn't showing, we need " 5981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard so the user can enter their sim pin"); 5991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case READY: 6061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isShowing()) { 6071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 613b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean isSecure() { 614b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return mKeyguardViewProperties.isSecure(); 615b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 616b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn 6171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private BroadcastReceiver mBroadCastReceiver = new BroadcastReceiver() { 6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 6191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 6201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final String action = intent.getAction(); 6211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (action.equals(DELAYED_KEYGUARD_ACTION)) { 6221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int sequence = intent.getIntExtra("seq", 0); 6241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "received DELAYED_KEYGUARD_ACTION with seq = " 6261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + sequence + ", mDelayedShowingSequence = " + mDelayedShowingSequence); 6271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mDelayedShowingSequence == sequence) { 6291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 631ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action) 632ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen && TelephonyManager.EXTRA_STATE_IDLE.equals(intent.getStringExtra( 633ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen TelephonyManager.EXTRA_STATE)) // call ending 634ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen && !mScreenOn // screen off 635ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen && mExternallyEnabled) { // not disabled by any app 636ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 637ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // note: this is a way to gracefully reenable the keyguard when the call 638ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // ends and the screen is off without always reenabling the keyguard 639ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // each time the screen turns off while in call (and having an occasional ugly 640ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // flicker while turning back on the screen and disabling the keyguard again). 641ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen if (DEBUG) Log.d(TAG, "screen is off and call ended, let's make sure the " 642ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen + "keyguard is showing"); 643ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen doKeyguard(); 6441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 6471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * When a key is received when the screen is off and the keyguard is showing, 6511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we need to decide whether to actually turn on the screen, and if so, tell 6521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard to prepare itself and poke the wake lock when it is ready. 6531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 6541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The 'Tq' suffix is per the documentation in {@link WindowManagerPolicy}. 6551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Be sure not to take any action that takes a long time; any significant 6561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * action should be posted to a handler. 6571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 6581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The keycode of the key that woke the device 6591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether we poked the wake lock (and turned the screen on) 6601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean onWakeKeyWhenKeyguardShowingTq(int keyCode) { 6621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onWakeKeyWhenKeyguardShowing(" + keyCode + ")"); 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isWakeKeyWhenKeyguardShowing(keyCode)) { 6651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // give the keyguard view manager a chance to adjust the state of the 6661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // keyguard based on the key that woke the device before poking 6671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the wake lock 6681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wakeWhenReadyLocked(keyCode); 6691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 6701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 6721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean isWakeKeyWhenKeyguardShowing(int keyCode) { 6761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (keyCode) { 6771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_UP: 6781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_DOWN: 6791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_MUTE: 6801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_HEADSETHOOK: 6818b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 6828b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_STOP: 6838b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_NEXT: 6848b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 6858b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_REWIND: 6868b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 6871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_CAMERA: 6881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 6891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 6911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks from {@link KeyguardViewManager}. 6951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 6981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock() { 6991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project pokeWakelock(mKeyboardOpen ? 7001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS : AWAKE_INTERVAL_DEFAULT_MS); 7011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 7041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock(int holdMs) { 7051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "pokeWakelock(" + holdMs + ")"); 7071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.acquire(); 7081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(TIMEOUT); 7091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakelockSequence++; 7101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(TIMEOUT, mWakelockSequence, 0); 7111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessageDelayed(msg, holdMs); 7121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@inheritDoc} 7171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleKeyguardDone 7191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDone(boolean authenticated) { 7211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project EventLog.writeEvent(70000, 2); 7231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")"); 7241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(KEYGUARD_DONE); 7251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 7261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 7281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.clearFailedAttempts(); 7291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 7321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(authenticated); 7331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 7341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 7361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // after succesfully exiting securely, no need to reshow 7371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the keyguard when they've released the lock 7381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = true; 7391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 7401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project setStatusBarExpandable(true); 7411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@inheritDoc} 7481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleKeyguardDoneDrawing 7501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDoneDrawing() { 7521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(KEYGUARD_DONE_DRAWING); 7531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This handler will be associated with the policy thread, which will also 7571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be the UI thread of the keyguard. Since the apis of the policy, and therefore 7581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * this class, can be called by other threads, any action that directly 7591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * interacts with the keyguard ui should be posted to this handler, rather 7601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * than called directly. 7611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Handler mHandler = new Handler() { 7631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 76437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void handleMessage(Message msg) { 76537c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville switch (msg.what) { 7661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case TIMEOUT: 7671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleTimeout(msg.arg1); 7681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 7691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case SHOW: 7701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleShow(); 7711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 7721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case HIDE: 7731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 7741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case RESET: 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleReset(); 7771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 7781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case VERIFY_UNLOCK: 7791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleVerifyUnlock(); 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_OFF: 7821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOff(); 7831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_ON: 7851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOn(); 7861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case WAKE_WHEN_READY: 7881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleWakeWhenReady(msg.arg1); 7891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE: 7911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleKeyguardDone(); 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE_DRAWING: 7941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleKeyguardDoneDrawing(); 795b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 79639c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn case KEYGUARD_DONE_AUTHENTICATING: 797b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn keyguardDone(true); 798b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 7991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 8021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDone 8051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE 8061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleKeyguardDone() { 8081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDone"); 8091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 8101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPM.userActivity(SystemClock.uptimeMillis(), true); 8111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 812c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mContext.sendBroadcast(mUserPresentIntent); 8131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDoneDrawing 8171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE_DRAWING 8181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleKeyguardDoneDrawing() { 8201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized(this) { 8211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "handleKeyguardDoneDrawing"); 8221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mWaitingUntilKeyguardVisible) { 8231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDoneDrawing: notifying mWaitingUntilKeyguardVisible"); 8241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = false; 8251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyAll(); 8261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // there will usually be two of these sent, one as a timeout, and one 8281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // as a result of the callback, so remove any remaining messages from 8291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the queue 8301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(KEYGUARD_DONE_DRAWING); 8311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handles the message sent by {@link #pokeWakelock} 8371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param seq used to determine if anything has changed since the message 8381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was sent. 8391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #TIMEOUT 8401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleTimeout(int seq) { 8421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 8431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleTimeout"); 8441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (seq == mWakelockSequence) { 8451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 8461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #showLocked}. 8521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #SHOW 8531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleShow() { 8551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 8561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleShow"); 8571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mSystemReady) return; 8581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // while we're showing, we control the wake state, so ask the power 8601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // manager not to honor request for userActivity. 8611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mRealPowerManager.enableUserActivity(false); 8621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.show(); 8641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 8651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #hideLocked()} 8701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #HIDE 8711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleHide() { 8731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 8741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleHide"); 8751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // When we go away, tell the poewr manager to honor requests from userActivity. 8761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mRealPowerManager.enableUserActivity(true); 8771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.hide(); 8791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = false; 8801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #wakeWhenReadyLocked(int)} 8851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The key that woke the device. 8861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #WAKE_WHEN_READY 8871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleWakeWhenReady(int keyCode) { 8891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 8901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "handleWakeWhenReady(" + keyCode + ")"); 8911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // this should result in a call to 'poke wakelock' which will set a timeout 8931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // on releasing the wakelock 8941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.wakeWhenReadyTq(keyCode); 8951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Now that the keyguard is ready and has poked the wake lock, we can 8981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * release the handoff wakelock 8991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.release(); 9011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mWakeLock.isHeld()) { 9031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.w(TAG, "mKeyguardViewManager.wakeWhenReadyTq did not poke wake lock"); 9041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #resetStateLocked()} 9101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 9111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleReset() { 9131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleReset"); 9151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.reset(); 9161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #verifyUnlock} 9211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 9221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleVerifyUnlock() { 9241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); 9261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.verifyUnlock(); 9271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 9281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOffLocked()} 9331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_OFF 9341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOff() { 9361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); 9381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOff(); 9391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOnLocked()} 9441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_ON 9451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOn() { 9471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); 9491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOn(); 9501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 95337c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 95437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 955