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