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; 255f892c130a9799067686ac47640f9f70c8916103Mike Lockwoodimport android.app.StatusBarManager; 261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 27db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.content.ContentResolver; 281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 31aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandlerimport android.media.AudioManager; 32db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.media.Ringtone; 33db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.media.RingtoneManager; 34db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.net.Uri; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 36e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandlerimport android.os.IBinder; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.LocalPowerManager; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.PowerManager; 404994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackbornimport android.os.RemoteException; 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.SystemClock; 421b152029cc681eca6fad21d3f9e81c84c334087bJim Millerimport android.os.SystemProperties; 43db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.provider.Settings; 44ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.telephony.TelephonyManager; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Config; 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.EventLog; 47ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.util.Log; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerImpl; 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerPolicy; 511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Mediates requests related to the keyguard. This includes queries about the 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * state of the keyguard, power management events that effect whether the keyguard 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * should be shown or reset, callbacks to the phone window manager to notify 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it of when the keyguard is showing, and events from the keyguard view itself 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * stating that the keyguard was succesfully unlocked. 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note that the keyguard view is shown when the screen is off (as appropriate) 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * so that once the screen comes on, it will be ready immediately. 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example queries about the keyguard: 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is {movement, key} one that should wake the keygaurd? 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is the keyguard showing? 661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - are input events restricted due to the state of the keyguard? 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks to the phone window manager: 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - the keyguard is showing 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example external events that translate to keyguard view changes: 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - screen turned off -> reset the keyguard, and show it so it will be ready 731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * next time the screen turns on 741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - keyboard is slid open -> if the keyguard is not secure, hide it 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Events from the keyguard view: 771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - user succesfully unlocked keyguard -> hide keyguard view, and no longer 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * restrict input events. 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: in addition to normal power managment events that effect the state of 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * whether the keyguard should be showing, external apps and services may request 821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that the keyguard be disabled via {@link #setKeyguardEnabled(boolean)}. When 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false, this will override all other conditions for turning on the keyguard. 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Threading and synchronization: 861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This class is created by the initialization routine of the {@link WindowManagerPolicy}, 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and runs on its thread. The keyguard UI is created from that thread in the 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * constructor of this class. The apis may be called from other threads, including the 8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * {@link com.android.server.InputManager}'s and {@link android.view.WindowManager}'s. 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Therefore, methods on this class are synchronized, and any action that is pointed 911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * directly to the keyguard UI is posted to a {@link Handler} to ensure it is taken on the UI 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * thread of the keyguard. 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class KeyguardViewMediator implements KeyguardViewCallback, 95b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn KeyguardUpdateMonitor.SimStateCallback { 96431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato private final static boolean DEBUG = false; 97431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato private final static boolean DBG_WAKE = false; 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static String TAG = "KeyguardViewMediator"; 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1019c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller private static final String DELAYED_KEYGUARD_ACTION = 10237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD"; 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // used for handler messages 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int TIMEOUT = 1; 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int SHOW = 2; 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int HIDE = 3; 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int RESET = 4; 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int VERIFY_UNLOCK = 5; 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_OFF = 6; 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_ON = 7; 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int WAKE_WHEN_READY = 8; 1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE = 9; 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING = 10; 11539c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn private static final int KEYGUARD_DONE_AUTHENTICATING = 11; 1169200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood private static final int SET_HIDDEN = 12; 11728569306e3fb136488cade5ed908a1be66128c2dMike Lockwood private static final int KEYGUARD_TIMEOUT = 13; 1189c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_MS = 5000; 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) when 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyboard is open 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS = 10000; 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long to wait after the screen turns off due to timeout before 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * turning on the keyguard (i.e, the user has this much time to turn 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the screen back on without having to face the keyguard). 1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1364994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn private static final int KEYGUARD_DELAY_MS = 5000; 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long we'll wait for the {@link KeyguardViewCallback#keyguardDoneDrawing()} 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * callback before unblocking a call to {@link #setKeyguardEnabled(boolean)} 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that is reenabling the keyguard. 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING_TIMEOUT_MS = 2000; 1449c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Context mContext; 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlarmManager mAlarmManager; 1475f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private StatusBarManager mStatusBarManager; 1480cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private boolean mShowLockIcon; 1490cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private boolean mShowingLockIcon; 1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mSystemReady; 1520060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 1530060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // Whether the next call to playSounds() should be skipped. Defaults to 1540060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // true because the first lock (on boot) should be silent. 1550060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler private boolean mSuppressNextLockSound = true; 1560060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 1579c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** Low level access to the power manager for enableUserActivity. Having this 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * requires that we run in the system process. */ 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager mRealPowerManager; 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** High level access to the power manager for WakeLocks */ 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager mPM; 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Used to keep the device awake while the keyguard is showing, i.e for 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * calls to {@link #pokeWakelock()} 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeLock; 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 172674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * Used to keep the device awake while to ensure the keyguard finishes opening before 173674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * we sleep. 174674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood */ 175674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood private PowerManager.WakeLock mShowKeyguardWakeLock; 176674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood 177674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood /** 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Does not turn on screen, held while a call to {@link KeyguardViewManager#wakeWhenReadyTq(int)} 1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is called to make sure the device doesn't sleep before it has a chance to poke 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock. 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #wakeWhenReadyLocked(int) 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeAndHandOff; 1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewManager mKeyguardViewManager; 1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // these are protected by synchronized (this) 1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1905d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood * External apps (like the phone app) can tell us to disable the keygaurd. 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mExternallyEnabled = true; 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Remember if an external call to {@link #setKeyguardEnabled} with value 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false caused us to hide the keyguard, so that we need to reshow it once 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keygaurd is reenabled with another call with value true. 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mNeedToReshowWhenReenabled = false; 2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // cached value of whether we are showing (need to know this to quickly 2021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // answer whether the input should be restricted) 2031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mShowing = false; 2041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 20509a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood // true if the keyguard is hidden by another window 20609a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood private boolean mHidden = false; 20709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helps remember whether the screen has turned on since the last time 2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it turned off due to timeout. see {@link #onScreenTurnedOff(int)} 2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mDelayedShowingSequence; 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mWakelockSequence; 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PhoneWindowManager mCallback; 2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * If the user has disabled the keyguard, then requests to exit, this is 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * how we'll ultimately let them know whether it was successful. We use this 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * var being non-null as an indicator that there is an in progress request. 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private WindowManagerPolicy.OnKeyguardExitResult mExitSecureCallback; 2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the properties of the keyguard 2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewProperties mKeyguardViewProperties; 2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardUpdateMonitor mUpdateMonitor; 2291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mKeyboardOpen = false; 2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 232ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen private boolean mScreenOn = false; 233ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 234f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // last known state of the cellular connection 235f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler private String mPhoneState = TelephonyManager.EXTRA_STATE_IDLE; 236f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 238c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project * we send this intent when the keyguard is dismissed. 239c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project */ 240c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project private Intent mUserPresentIntent; 241c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project 242c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project /** 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link #setKeyguardEnabled} waits on this condition when it reenables 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard. 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mWaitingUntilKeyguardVisible = false; 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public KeyguardViewMediator(Context context, PhoneWindowManager callback, 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager powerManager) { 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mRealPowerManager = powerManager; 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock = mPM.newWakeLock( 2559c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguard"); 2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.setReferenceCounted(false); 258674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard"); 259674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.setReferenceCounted(false); 2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff = mPM.newWakeLock( 2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PowerManager.PARTIAL_WAKE_LOCK, 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguardWakeAndHandOff"); 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.setReferenceCounted(false); 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project IntentFilter filter = new IntentFilter(); 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(DELAYED_KEYGUARD_ACTION); 268ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context.registerReceiver(mBroadCastReceiver, filter); 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager = (AlarmManager) context 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .getSystemService(Context.ALARM_SERVICE); 2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback = callback; 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor = new KeyguardUpdateMonitor(context); 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.registerSimStateCallback(this); 2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2789c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller mKeyguardViewProperties = new LockPatternKeyguardViewProperties( 2799c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller new LockPatternUtils(mContext), mUpdateMonitor); 2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager = new KeyguardViewManager( 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context, WindowManagerImpl.getDefault(), this, 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewProperties, mUpdateMonitor); 2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 285c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT); 286818ba11cd680de336fb9278b64a21dc2efb7517eDianne Hackborn mUserPresentIntent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 287687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler 288687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler final ContentResolver cr = mContext.getContentResolver(); 289687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler mShowLockIcon = (Settings.System.getInt(cr, "show_status_bar_lock", 0) == 1); 2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let us know that the system is ready after startup. 2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onSystemReady() { 2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 2971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSystemReady"); 2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSystemReady = true; 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Called to let us know the screen was turned off. 305ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, 306ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or 307ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}. 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOff(int why) { 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 311ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = false; 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")"); 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "pending exit secure callback cancelled"); 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 3199c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller hideLocked(); 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mShowing) { 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOffLocked(); 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT) { 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the screen turned off because of timeout, set an alarm 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to enable it a little bit later (i.e, give the user a chance 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to turn the screen back on within a certain window without 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // having to unlock the screen) 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project long when = SystemClock.elapsedRealtime() + KEYGUARD_DELAY_MS; 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Intent intent = new Intent(DELAYED_KEYGUARD_ACTION); 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project intent.putExtra("seq", mDelayedShowingSequence); 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PendingIntent sender = PendingIntent.getBroadcast(mContext, 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project sender); 3369c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = " 33737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville + mDelayedShowingSequence); 338ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) { 339ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood // Do not enable the keyguard if the prox sensor forced the screen off. 340016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood } else { 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let's us know the screen was turned on. 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOn() { 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 351ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = true; 3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDelayedShowingSequence++; 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOn, seq = " + mDelayedShowingSequence); 3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOnLocked(); 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * a way for external stuff to override normal keyguard behavior. For instance 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the phone app disables the keyguard when it receives incoming calls. 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void setKeyguardEnabled(boolean enabled) { 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")"); 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = enabled; 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!enabled && mShowing) { 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring"); 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // we're in the process of handling a request to verify the user 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // can get past the keyguard. ignore extraneous requests to disable / reenable 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // hiding keyguard that is showing, remember to reshow later 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, " 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "disabling status bar expansion"); 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = true; 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project hideLocked(); 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (enabled && mNeedToReshowWhenReenabled) { 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // reenabled after previously hidden, reshow 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling " 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "status bar expansion"); 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting"); 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // block until we know the keygaurd is done drawing (and post a message 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to unblock us after a timeout so we don't risk blocking too long 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // and causing an ANR). 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = true; 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS); 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false"); 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project while (mWaitingUntilKeyguardVisible) { 4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 4051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wait(); 4061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (InterruptedException e) { 4071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Thread.currentThread().interrupt(); 4081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible"); 4111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 4181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void verifyUnlock(WindowManagerPolicy.OnKeyguardExitResult callback) { 4201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 4211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlock"); 4221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 4231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // don't allow this api when the device isn't provisioned 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "ignoring because device isn't provisioned"); 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4265d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood } else if (mExternallyEnabled) { 4275d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // this only applies when the user has externally disabled the 4285d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // keyguard. this is unexpected and means the user is not 4295d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // using the api properly. 4305d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood Log.w(TAG, "verifyUnlock called when not externally disabled"); 4315d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood callback.onKeyguardExitResult(false); 4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mExitSecureCallback != null) { 4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // already in progress with someone else 4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = callback; 4371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project verifyUnlockLocked(); 4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Is the keyguard currently showing? 4441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isShowing() { 4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing; 4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4509dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn * Is the keyguard currently showing and not being force hidden? 4519dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn */ 4529dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn public boolean isShowingAndNotHidden() { 4539dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn return mShowing && !mHidden; 4549dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn } 4559dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn 4569dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn /** 45709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood * Notify us when the keyguard is hidden by another window 45809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood */ 45909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood public void setHidden(boolean isHidden) { 460b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (DEBUG) Log.d(TAG, "setHidden " + isHidden); 4619200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHandler.removeMessages(SET_HIDDEN); 4629200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood Message msg = mHandler.obtainMessage(SET_HIDDEN, (isHidden ? 1 : 0), 0); 4639200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHandler.sendMessage(msg); 4649200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 4659200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood 4669200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood /** 4679200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood * Handles SET_HIDDEN message sent by setHidden() 4689200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood */ 4699200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood private void handleSetHidden(boolean isHidden) { 47009a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood synchronized (KeyguardViewMediator.this) { 4719200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood if (mHidden != isHidden) { 4729200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHidden = isHidden; 4739200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood adjustUserActivityLocked(); 4745f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 4759200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 47609a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 47709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 47809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 47909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood /** 48028569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * Used by PhoneWindowManager to enable the keyguard due to a user activity timeout. 48128569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * This must be safe to call from any thread and with any window manager locks held. 48228569306e3fb136488cade5ed908a1be66128c2dMike Lockwood */ 48328569306e3fb136488cade5ed908a1be66128c2dMike Lockwood public void doKeyguardTimeout() { 48428569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.removeMessages(KEYGUARD_TIMEOUT); 48528569306e3fb136488cade5ed908a1be66128c2dMike Lockwood Message msg = mHandler.obtainMessage(KEYGUARD_TIMEOUT); 48628569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.sendMessage(msg); 48728569306e3fb136488cade5ed908a1be66128c2dMike Lockwood } 48828569306e3fb136488cade5ed908a1be66128c2dMike Lockwood 48928569306e3fb136488cade5ed908a1be66128c2dMike Lockwood /** 4901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Given the state of the keyguard, is the input restricted? 4911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Input is restricted when the keyguard is showing, or when the keyguard 4921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was suppressed by an app that disabled the keyguard or we haven't been provisioned yet. 4931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isInputRestricted() { 4951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing || mNeedToReshowWhenReenabled || !mUpdateMonitor.isDeviceProvisioned(); 4961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 498b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn /** 499b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * Returns true if the change is resulting in the keyguard beign dismissed, 500b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * meaning the screen can turn on immediately. Otherwise returns false. 501b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn */ 502b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean doLidChangeTq(boolean isLidOpen) { 503b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn mKeyboardOpen = isLidOpen; 504b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn 505b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (mUpdateMonitor.isKeyguardBypassEnabled() && mKeyboardOpen 506b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn && !mKeyguardViewProperties.isSecure() && mKeyguardViewManager.isShowing()) { 507b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (DEBUG) Log.d(TAG, "bypassing keyguard on sliding open of keyboard with non-secure keyguard"); 50839c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn mHandler.sendEmptyMessage(KEYGUARD_DONE_AUTHENTICATING); 509b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return true; 510b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 511b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return false; 512b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 5131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Enable the keyguard if the settings are appropriate. 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void doKeyguard() { 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 5191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if another app is disabling us, don't show 5201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 5211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); 522ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 523ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // note: we *should* set mNeedToReshowWhenReenabled=true here, but that makes 524ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for an occasional ugly flicker in this situation: 525ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 1) receive a call with the screen on (no keyguard) or make a call 526ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 2) screen times out 527ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 3) user hits key to turn screen back on 528ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // instead, we reenable the keyguard when we know the screen is off and the call 529ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // ends (see the broadcast receiver below) 530ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // TODO: clean this up when we have better support at the window manager level 531ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for apps that wish to be on top of the keyguard 5321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the keyguard is already showing, don't bother 5361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardViewManager.isShowing()) { 5371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); 5381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5409c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 5411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the setup wizard hasn't run yet, don't show 5421b152029cc681eca6fad21d3f9e81c84c334087bJim Miller final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim", 5431b152029cc681eca6fad21d3f9e81c84c334087bJim Miller false); 5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean provisioned = mUpdateMonitor.isDeviceProvisioned(); 54537c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville final IccCard.State state = mUpdateMonitor.getSimState(); 5461b152029cc681eca6fad21d3f9e81c84c334087bJim Miller final boolean lockedOrMissing = state.isPinLocked() 5471b152029cc681eca6fad21d3f9e81c84c334087bJim Miller || ((state == IccCard.State.ABSENT) && requireSim); 5481b152029cc681eca6fad21d3f9e81c84c334087bJim Miller 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!lockedOrMissing && !provisioned) { 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned" 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + " and the sim is not locked or missing"); 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5549c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 5551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); 5561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 5571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to reset its state. 5621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleReset() 5631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void resetStateLocked() { 5651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "resetStateLocked"); 5661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(RESET); 5671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to verify unlock 5721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleVerifyUnlock() 5731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void verifyUnlockLocked() { 5751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlockLocked"); 5761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(VERIFY_UNLOCK); 5771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onScreenTurnedOff(int) 5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOff 5841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOffLocked() { 5861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); 5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5929c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #onScreenTurnedOn() 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOn 5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOnLocked() { 5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); 5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_ON); 5981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it about a wake key so it can adjust 6021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * its state accordingly and then poke the wake lock when it is ready. 6031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The wake key. 6041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleWakeWhenReady 6051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onWakeKeyWhenKeyguardShowingTq(int) 6061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void wakeWhenReadyLocked(int keyCode) { 608431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato if (true || DBG_WAKE) Log.d(TAG, "wakeWhenReadyLocked(" + keyCode + ")"); 6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * acquire the handoff lock that will keep the cpu running. this will 6121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be released once the keyguard has set itself up and poked the other wakelock 6131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * in {@link #handleWakeWhenReady(int)} 6141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.acquire(); 6161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(WAKE_WHEN_READY, keyCode, 0); 6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to show itself 6231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleShow() 6241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void showLocked() { 6261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "showLocked"); 627674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood // ensure we stay awake until we are finished displaying the keyguard 628674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.acquire(); 6291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(SHOW); 6301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to hide itself 6359c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #handleHide() 6361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void hideLocked() { 6381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "hideLocked"); 6391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(HIDE); 6401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 64437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void onSimStateChanged(IccCard.State simState) { 6451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSimStateChanged: " + simState); 6461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (simState) { 6481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case ABSENT: 6491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // only force lock screen in case of missing sim if user hasn't 6501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // gone through setup wizard 6511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 6521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 65337c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_ABSENT and keygaurd isn't showing, we need " 6541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard since the device isn't provisioned yet."); 6551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PIN_REQUIRED: 6621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PUK_REQUIRED: 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 66437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_LOCKED and keygaurd isn't showing, we need " 6651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard so the user can enter their sim pin"); 6661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case READY: 6731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isShowing()) { 6741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 680b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean isSecure() { 681b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return mKeyguardViewProperties.isSecure(); 682b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 6839c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 6841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private BroadcastReceiver mBroadCastReceiver = new BroadcastReceiver() { 6851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 6861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 6871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final String action = intent.getAction(); 6881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (action.equals(DELAYED_KEYGUARD_ACTION)) { 6891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int sequence = intent.getIntExtra("seq", 0); 6911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "received DELAYED_KEYGUARD_ACTION with seq = " 6931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + sequence + ", mDelayedShowingSequence = " + mDelayedShowingSequence); 6941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mDelayedShowingSequence == sequence) { 6960060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // Don't play lockscreen SFX if the screen went off due to 6970060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // timeout. 6980060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler mSuppressNextLockSound = true; 6990060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 7001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 7011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 702f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) { 703f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler mPhoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 704f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 705f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState) // call ending 706f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler && !mScreenOn // screen off 707f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler && mExternallyEnabled) { // not disabled by any app 708f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 709f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // note: this is a way to gracefully reenable the keyguard when the call 710f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // ends and the screen is off without always reenabling the keyguard 711f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // each time the screen turns off while in call (and having an occasional ugly 712f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // flicker while turning back on the screen and disabling the keyguard again). 713f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (DEBUG) Log.d(TAG, "screen is off and call ended, let's make sure the " 714f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler + "keyguard is showing"); 715f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler doKeyguard(); 716f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 7171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 7201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * When a key is received when the screen is off and the keyguard is showing, 7241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we need to decide whether to actually turn on the screen, and if so, tell 7251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard to prepare itself and poke the wake lock when it is ready. 7261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The 'Tq' suffix is per the documentation in {@link WindowManagerPolicy}. 7281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Be sure not to take any action that takes a long time; any significant 7291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * action should be posted to a handler. 7309c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * 7311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The keycode of the key that woke the device 7321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether we poked the wake lock (and turned the screen on) 7331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean onWakeKeyWhenKeyguardShowingTq(int keyCode) { 7351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onWakeKeyWhenKeyguardShowing(" + keyCode + ")"); 7361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isWakeKeyWhenKeyguardShowing(keyCode)) { 7381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // give the keyguard view manager a chance to adjust the state of the 7391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // keyguard based on the key that woke the device before poking 7401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the wake lock 7411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wakeWhenReadyLocked(keyCode); 7421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 7431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 7441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 7451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean isWakeKeyWhenKeyguardShowing(int keyCode) { 7491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (keyCode) { 7501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_UP: 7511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_DOWN: 7521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_MUTE: 7539c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_HEADSETHOOK: 7549c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 7559c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_STOP: 7569c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_NEXT: 7579c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 7589c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_REWIND: 7598b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 7601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_CAMERA: 7611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 7621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 7641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks from {@link KeyguardViewManager}. 7681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 7711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock() { 7721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project pokeWakelock(mKeyboardOpen ? 7731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS : AWAKE_INTERVAL_DEFAULT_MS); 7741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 7771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock(int holdMs) { 7781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "pokeWakelock(" + holdMs + ")"); 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.acquire(); 7811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(TIMEOUT); 7821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakelockSequence++; 7831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(TIMEOUT, mWakelockSequence, 0); 7841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessageDelayed(msg, holdMs); 7851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@inheritDoc} 7901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7919c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #handleKeyguardDone 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDone(boolean authenticated) { 7940572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn keyguardDone(authenticated, true); 7950572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn } 7960572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn 7970572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn public void keyguardDone(boolean authenticated, boolean wakeup) { 7981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7999c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller EventLog.writeEvent(70000, 2); 8001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")"); 8011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(KEYGUARD_DONE); 8020572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn msg.arg1 = wakeup ? 1 : 0; 8031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 8041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 8069c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller mUpdateMonitor.clearFailedAttempts(); 8071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 8101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(authenticated); 8111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 8121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 8141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // after succesfully exiting securely, no need to reshow 8151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the keyguard when they've released the lock 8161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = true; 8171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 8181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 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 * {@inheritDoc} 8251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 8261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleKeyguardDoneDrawing 8271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDoneDrawing() { 8291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(KEYGUARD_DONE_DRAWING); 8301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This handler will be associated with the policy thread, which will also 8341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be the UI thread of the keyguard. Since the apis of the policy, and therefore 8351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * this class, can be called by other threads, any action that directly 8361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * interacts with the keyguard ui should be posted to this handler, rather 8371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * than called directly. 8381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Handler mHandler = new Handler() { 8401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 84137c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void handleMessage(Message msg) { 84237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville switch (msg.what) { 8431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case TIMEOUT: 8441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleTimeout(msg.arg1); 8451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case SHOW: 8471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleShow(); 8481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case HIDE: 8501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 8511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case RESET: 8531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleReset(); 8541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case VERIFY_UNLOCK: 8561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleVerifyUnlock(); 8571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_OFF: 8591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOff(); 8601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_ON: 8621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOn(); 8631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case WAKE_WHEN_READY: 8651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleWakeWhenReady(msg.arg1); 8661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE: 8680572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn handleKeyguardDone(msg.arg1 != 0); 8691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE_DRAWING: 8711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleKeyguardDoneDrawing(); 872b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 87339c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn case KEYGUARD_DONE_AUTHENTICATING: 874b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn keyguardDone(true); 875b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 8769200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood case SET_HIDDEN: 8779200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood handleSetHidden(msg.arg1 != 0); 8789200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood break; 87928569306e3fb136488cade5ed908a1be66128c2dMike Lockwood case KEYGUARD_TIMEOUT: 88028569306e3fb136488cade5ed908a1be66128c2dMike Lockwood doKeyguard(); 88128569306e3fb136488cade5ed908a1be66128c2dMike Lockwood break; 8821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 8851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDone 8881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE 8891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8900572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn private void handleKeyguardDone(boolean wakeup) { 8911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDone"); 8921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 8930572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn if (wakeup) { 8940572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn mPM.userActivity(SystemClock.uptimeMillis(), true); 8950572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn } 8961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 897c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mContext.sendBroadcast(mUserPresentIntent); 8981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDoneDrawing 9021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE_DRAWING 9031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleKeyguardDoneDrawing() { 9051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized(this) { 9061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "handleKeyguardDoneDrawing"); 9071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mWaitingUntilKeyguardVisible) { 9081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDoneDrawing: notifying mWaitingUntilKeyguardVisible"); 9091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = false; 9101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyAll(); 9111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // there will usually be two of these sent, one as a timeout, and one 9131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // as a result of the callback, so remove any remaining messages from 9141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the queue 9151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(KEYGUARD_DONE_DRAWING); 9161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handles the message sent by {@link #pokeWakelock} 9221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param seq used to determine if anything has changed since the message 9231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was sent. 9241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #TIMEOUT 9251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleTimeout(int seq) { 9271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleTimeout"); 9291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (seq == mWakelockSequence) { 9301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 9311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 935db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler private void playSounds(boolean locked) { 936db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler // User feedback for keyguard. 9370060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 9380060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler if (mSuppressNextLockSound) { 9390060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler mSuppressNextLockSound = false; 9400060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler return; 9410060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler } 9420060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 943db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final ContentResolver cr = mContext.getContentResolver(); 944db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (Settings.System.getInt(cr, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) == 1) 945db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler { 946db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final String whichSound = locked 947db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler ? Settings.System.LOCK_SOUND 948db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler : Settings.System.UNLOCK_SOUND; 949db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final String soundPath = Settings.System.getString(cr, whichSound); 950db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (soundPath != null) { 951db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final Uri soundUri = Uri.parse("file://" + soundPath); 952db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (soundUri != null) { 953db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); 954aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler if (sfx != null) { 955aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler sfx.setStreamType(AudioManager.STREAM_SYSTEM); 956aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler sfx.play(); 957aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler } else { 958aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler Log.d(TAG, "playSounds: failed to load ringtone from uri: " + soundUri); 959aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandler } 960db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } else { 961db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler Log.d(TAG, "playSounds: could not parse Uri: " + soundPath); 962db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 963db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } else { 964db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler Log.d(TAG, "playSounds: whichSound = " + whichSound + "; soundPath was null"); 965db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 966db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 967db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 968db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 9691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #showLocked}. 9711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #SHOW 9721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleShow() { 9741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleShow"); 9761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mSystemReady) return; 9779c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 9780060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler playSounds(true); 979db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 9801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.show(); 9811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 98209a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood adjustUserActivityLocked(); 9835f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 9844994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn try { 9854994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn ActivityManagerNative.getDefault().closeSystemDialogs("lock"); 9864994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn } catch (RemoteException e) { 9874994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn } 988674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.release(); 9891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #hideLocked()} 9941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #HIDE 9951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleHide() { 9971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleHide"); 999b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood if (mWakeAndHandOff.isHeld()) { 1000b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood Log.w(TAG, "attempt to hide the keyguard while waking, ignored"); 1001b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood return; 1002b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood } 10031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1004f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // only play "unlock" noises if not on a call (since the incall UI 1005f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // disables the keyguard) 1006f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) { 1007f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler playSounds(false); 1008f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 1009db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 10101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.hide(); 10111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = false; 101209a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood adjustUserActivityLocked(); 10135f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 10141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 101709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood private void adjustUserActivityLocked() { 101809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood // disable user activity if we are shown and not hidden 1019b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (DEBUG) Log.d(TAG, "adjustUserActivityLocked mShowing: " + mShowing + " mHidden: " + mHidden); 1020b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood boolean enabled = !mShowing || mHidden; 1021b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood mRealPowerManager.enableUserActivity(enabled); 1022b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (!enabled && mScreenOn) { 1023b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood // reinstate our short screen timeout policy 1024b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood pokeWakelock(); 1025b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood } 102609a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 102709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 10285f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private void adjustStatusBarLocked() { 10295f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 10305f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mStatusBarManager = (StatusBarManager) 10315f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mContext.getSystemService(Context.STATUS_BAR_SERVICE); 10325f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10335f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 10345f892c130a9799067686ac47640f9f70c8916103Mike Lockwood Log.w(TAG, "Could not get status bar manager"); 10355f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } else { 1036687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler if (mShowLockIcon) { 1037687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler // Give feedback to user when secure keyguard is active and engaged 1038687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler if (mShowing && isSecure()) { 10390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (!mShowingLockIcon) { 10400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mStatusBarManager.setIcon("secure", 10410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato com.android.internal.R.drawable.stat_sys_secure, 0); 10420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mShowingLockIcon = true; 1043687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler } 1044687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler } else { 10450cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mShowingLockIcon) { 10460cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mStatusBarManager.removeIcon("secure"); 10470cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mShowingLockIcon = false; 1048687a3274f054ec2c48e70c56d8fcb508f2f82363Daniel Sandler } 1049e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } 1050e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } 1051e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler 10525f892c130a9799067686ac47640f9f70c8916103Mike Lockwood // if the keyguard is shown, allow the status bar to open 10535f892c130a9799067686ac47640f9f70c8916103Mike Lockwood // only if the keyguard is insecure and is covered by another window 10545f892c130a9799067686ac47640f9f70c8916103Mike Lockwood boolean enable = !mShowing || (mHidden && !isSecure()); 10555f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mStatusBarManager.disable(enable ? 10565f892c130a9799067686ac47640f9f70c8916103Mike Lockwood StatusBarManager.DISABLE_NONE : 10575f892c130a9799067686ac47640f9f70c8916103Mike Lockwood StatusBarManager.DISABLE_EXPAND); 10585f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10595f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10605f892c130a9799067686ac47640f9f70c8916103Mike Lockwood 10611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #wakeWhenReadyLocked(int)} 10631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The key that woke the device. 10641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #WAKE_WHEN_READY 10651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleWakeWhenReady(int keyCode) { 10671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "handleWakeWhenReady(" + keyCode + ")"); 10691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // this should result in a call to 'poke wakelock' which will set a timeout 10711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // on releasing the wakelock 10723754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood if (!mKeyguardViewManager.wakeWhenReadyTq(keyCode)) { 10733754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood // poke wakelock ourselves if keyguard is no longer active 1074206f07d3bebb6716bca8d1bcd56d507a5c97bf76Mike Lockwood Log.w(TAG, "mKeyguardViewManager.wakeWhenReadyTq did not poke wake lock, so poke it ourselves"); 10753754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood pokeWakelock(); 10763754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood } 10771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Now that the keyguard is ready and has poked the wake lock, we can 10801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * release the handoff wakelock 10811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.release(); 10831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mWakeLock.isHeld()) { 1085206f07d3bebb6716bca8d1bcd56d507a5c97bf76Mike Lockwood Log.w(TAG, "mWakeLock not held in mKeyguardViewManager.wakeWhenReadyTq"); 10861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10919c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * Handle message sent by {@link #resetStateLocked()} 10921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 10931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleReset() { 10951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleReset"); 10971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.reset(); 10981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #verifyUnlock} 11031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 11041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 11051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleVerifyUnlock() { 11061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 11071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); 11081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.verifyUnlock(); 11091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 11101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOffLocked()} 11151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_OFF 11161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 11171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOff() { 11181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 11191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); 11201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOff(); 11211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOnLocked()} 11261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_ON 11271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 11281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOn() { 11291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 11301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); 11311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOn(); 11321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 113537c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 113637c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 1137