KeyguardViewMediator.java revision f2d8e74c0230f53acdc6f94652961e4adb0e134a
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; 31db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.media.Ringtone; 32db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.media.RingtoneManager; 33db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.net.Uri; 341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 35e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandlerimport android.os.IBinder; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.LocalPowerManager; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.PowerManager; 394994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackbornimport android.os.RemoteException; 401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.SystemClock; 411b152029cc681eca6fad21d3f9e81c84c334087bJim Millerimport android.os.SystemProperties; 42db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.provider.Settings; 43ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.telephony.TelephonyManager; 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Config; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.EventLog; 46ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.util.Log; 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerImpl; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerPolicy; 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5137c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Mediates requests related to the keyguard. This includes queries about the 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * state of the keyguard, power management events that effect whether the keyguard 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * should be shown or reset, callbacks to the phone window manager to notify 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it of when the keyguard is showing, and events from the keyguard view itself 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * stating that the keyguard was succesfully unlocked. 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note that the keyguard view is shown when the screen is off (as appropriate) 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * so that once the screen comes on, it will be ready immediately. 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example queries about the keyguard: 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is {movement, key} one that should wake the keygaurd? 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is the keyguard showing? 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - are input events restricted due to the state of the keyguard? 661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks to the phone window manager: 681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - the keyguard is showing 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example external events that translate to keyguard view changes: 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - screen turned off -> reset the keyguard, and show it so it will be ready 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * next time the screen turns on 731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - keyboard is slid open -> if the keyguard is not secure, hide it 741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Events from the keyguard view: 761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - user succesfully unlocked keyguard -> hide keyguard view, and no longer 771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * restrict input events. 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: in addition to normal power managment events that effect the state of 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * whether the keyguard should be showing, external apps and services may request 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that the keyguard be disabled via {@link #setKeyguardEnabled(boolean)}. When 821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false, this will override all other conditions for turning on the keyguard. 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Threading and synchronization: 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This class is created by the initialization routine of the {@link WindowManagerPolicy}, 861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and runs on its thread. The keyguard UI is created from that thread in the 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * constructor of this class. The apis may be called from other threads, including the 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link com.android.server.KeyInputQueue}'s and {@link android.view.WindowManager}'s. 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Therefore, methods on this class are synchronized, and any action that is pointed 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * directly to the keyguard UI is posted to a {@link Handler} to ensure it is taken on the UI 911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * thread of the keyguard. 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class KeyguardViewMediator implements KeyguardViewCallback, 94b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn KeyguardUpdateMonitor.SimStateCallback { 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static boolean DEBUG = false && Config.LOGD; 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static boolean DBG_WAKE = DEBUG || true; 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static String TAG = "KeyguardViewMediator"; 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1009c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller private static final String DELAYED_KEYGUARD_ACTION = 10137c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD"; 1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // used for handler messages 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int TIMEOUT = 1; 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int SHOW = 2; 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int HIDE = 3; 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int RESET = 4; 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int VERIFY_UNLOCK = 5; 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_OFF = 6; 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_ON = 7; 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int WAKE_WHEN_READY = 8; 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE = 9; 1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING = 10; 11439c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn private static final int KEYGUARD_DONE_AUTHENTICATING = 11; 1159200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood private static final int SET_HIDDEN = 12; 11628569306e3fb136488cade5ed908a1be66128c2dMike Lockwood private static final int KEYGUARD_TIMEOUT = 13; 1179c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_MS = 5000; 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) when 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyboard is open 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected static final int AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS = 10000; 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long to wait after the screen turns off due to timeout before 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * turning on the keyguard (i.e, the user has this much time to turn 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the screen back on without having to face the keyguard). 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1354994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn private static final int KEYGUARD_DELAY_MS = 5000; 1361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long we'll wait for the {@link KeyguardViewCallback#keyguardDoneDrawing()} 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * callback before unblocking a call to {@link #setKeyguardEnabled(boolean)} 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that is reenabling the keyguard. 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING_TIMEOUT_MS = 2000; 1439c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Context mContext; 1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlarmManager mAlarmManager; 1465f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private StatusBarManager mStatusBarManager; 147e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler private IBinder mSecureLockIcon = null; 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mSystemReady; 150f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler private boolean mFirstShow = true; 1519c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** Low level access to the power manager for enableUserActivity. Having this 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * requires that we run in the system process. */ 1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager mRealPowerManager; 1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** High level access to the power manager for WakeLocks */ 1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager mPM; 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Used to keep the device awake while the keyguard is showing, i.e for 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * calls to {@link #pokeWakelock()} 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeLock; 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 166674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * Used to keep the device awake while to ensure the keyguard finishes opening before 167674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * we sleep. 168674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood */ 169674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood private PowerManager.WakeLock mShowKeyguardWakeLock; 170674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood 171674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood /** 1721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Does not turn on screen, held while a call to {@link KeyguardViewManager#wakeWhenReadyTq(int)} 1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is called to make sure the device doesn't sleep before it has a chance to poke 1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the wake lock. 1751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #wakeWhenReadyLocked(int) 1761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager.WakeLock mWakeAndHandOff; 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewManager mKeyguardViewManager; 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // these are protected by synchronized (this) 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1845d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood * External apps (like the phone app) can tell us to disable the keygaurd. 1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mExternallyEnabled = true; 1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Remember if an external call to {@link #setKeyguardEnabled} with value 1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false caused us to hide the keyguard, so that we need to reshow it once 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keygaurd is reenabled with another call with value true. 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mNeedToReshowWhenReenabled = false; 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // cached value of whether we are showing (need to know this to quickly 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // answer whether the input should be restricted) 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mShowing = false; 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 19909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood // true if the keyguard is hidden by another window 20009a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood private boolean mHidden = false; 20109a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 2021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helps remember whether the screen has turned on since the last time 2041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it turned off due to timeout. see {@link #onScreenTurnedOff(int)} 2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mDelayedShowingSequence; 2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mWakelockSequence; 2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PhoneWindowManager mCallback; 2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * If the user has disabled the keyguard, then requests to exit, this is 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * how we'll ultimately let them know whether it was successful. We use this 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * var being non-null as an indicator that there is an in progress request. 2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private WindowManagerPolicy.OnKeyguardExitResult mExitSecureCallback; 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the properties of the keyguard 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardViewProperties mKeyguardViewProperties; 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardUpdateMonitor mUpdateMonitor; 2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mKeyboardOpen = false; 2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 226ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen private boolean mScreenOn = false; 227ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 228f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // last known state of the cellular connection 229f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler private String mPhoneState = TelephonyManager.EXTRA_STATE_IDLE; 230f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 232c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project * we send this intent when the keyguard is dismissed. 233c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project */ 234c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project private Intent mUserPresentIntent; 235c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project 236c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project /** 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link #setKeyguardEnabled} waits on this condition when it reenables 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard. 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mWaitingUntilKeyguardVisible = false; 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public KeyguardViewMediator(Context context, PhoneWindowManager callback, 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LocalPowerManager powerManager) { 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mRealPowerManager = powerManager; 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock = mPM.newWakeLock( 2499c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguard"); 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.setReferenceCounted(false); 252674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard"); 253674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.setReferenceCounted(false); 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff = mPM.newWakeLock( 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PowerManager.PARTIAL_WAKE_LOCK, 2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project "keyguardWakeAndHandOff"); 2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.setReferenceCounted(false); 2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project IntentFilter filter = new IntentFilter(); 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(DELAYED_KEYGUARD_ACTION); 262ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context.registerReceiver(mBroadCastReceiver, filter); 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager = (AlarmManager) context 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .getSystemService(Context.ALARM_SERVICE); 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback = callback; 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor = new KeyguardUpdateMonitor(context); 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.registerSimStateCallback(this); 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2729c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller mKeyguardViewProperties = new LockPatternKeyguardViewProperties( 2739c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller new LockPatternUtils(mContext), mUpdateMonitor); 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager = new KeyguardViewManager( 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context, WindowManagerImpl.getDefault(), this, 2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewProperties, mUpdateMonitor); 2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 279c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT); 280818ba11cd680de336fb9278b64a21dc2efb7517eDianne Hackborn mUserPresentIntent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let us know that the system is ready after startup. 2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onSystemReady() { 2871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 2881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSystemReady"); 2891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSystemReady = true; 2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Called to let us know the screen was turned off. 296ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER}, 297ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or 298ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood * {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}. 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOff(int why) { 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 302ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = false; 3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")"); 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "pending exit secure callback cancelled"); 3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 3109c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller hideLocked(); 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mShowing) { 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOffLocked(); 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT) { 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the screen turned off because of timeout, set an alarm 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to enable it a little bit later (i.e, give the user a chance 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to turn the screen back on within a certain window without 3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // having to unlock the screen) 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project long when = SystemClock.elapsedRealtime() + KEYGUARD_DELAY_MS; 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Intent intent = new Intent(DELAYED_KEYGUARD_ACTION); 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project intent.putExtra("seq", mDelayedShowingSequence); 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PendingIntent sender = PendingIntent.getBroadcast(mContext, 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project sender); 3279c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = " 32837c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville + mDelayedShowingSequence); 329ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) { 330ce27776887fb252e08667c16e6945c7fecf33368Mike Lockwood // Do not enable the keyguard if the prox sensor forced the screen off. 331016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood } else { 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let's us know the screen was turned on. 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOn() { 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 342ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = true; 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDelayedShowingSequence++; 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOn, seq = " + mDelayedShowingSequence); 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyScreenOnLocked(); 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide 3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * a way for external stuff to override normal keyguard behavior. For instance 3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the phone app disables the keyguard when it receives incoming calls. 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void setKeyguardEnabled(boolean enabled) { 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")"); 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = enabled; 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!enabled && mShowing) { 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring"); 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // we're in the process of handling a request to verify the user 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // can get past the keyguard. ignore extraneous requests to disable / reenable 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // hiding keyguard that is showing, remember to reshow later 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, " 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "disabling status bar expansion"); 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = true; 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project hideLocked(); 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (enabled && mNeedToReshowWhenReenabled) { 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // reenabled after previously hidden, reshow 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling " 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "status bar expansion"); 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting"); 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(false); 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // block until we know the keygaurd is done drawing (and post a message 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to unblock us after a timeout so we don't risk blocking too long 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // and causing an ANR). 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = true; 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS); 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false"); 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project while (mWaitingUntilKeyguardVisible) { 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wait(); 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (InterruptedException e) { 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Thread.currentThread().interrupt(); 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible"); 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 4091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void verifyUnlock(WindowManagerPolicy.OnKeyguardExitResult callback) { 4111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 4121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlock"); 4131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 4141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // don't allow this api when the device isn't provisioned 4151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "ignoring because device isn't provisioned"); 4161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4175d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood } else if (mExternallyEnabled) { 4185d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // this only applies when the user has externally disabled the 4195d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // keyguard. this is unexpected and means the user is not 4205d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // using the api properly. 4215d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood Log.w(TAG, "verifyUnlock called when not externally disabled"); 4225d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood callback.onKeyguardExitResult(false); 4231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mExitSecureCallback != null) { 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // already in progress with someone else 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project callback.onKeyguardExitResult(false); 4261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 4271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = callback; 4281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project verifyUnlockLocked(); 4291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Is the keyguard currently showing? 4351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isShowing() { 4371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing; 4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4419dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn * Is the keyguard currently showing and not being force hidden? 4429dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn */ 4439dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn public boolean isShowingAndNotHidden() { 4449dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn return mShowing && !mHidden; 4459dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn } 4469dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn 4479dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn /** 44809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood * Notify us when the keyguard is hidden by another window 44909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood */ 45009a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood public void setHidden(boolean isHidden) { 451b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (DEBUG) Log.d(TAG, "setHidden " + isHidden); 4529200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHandler.removeMessages(SET_HIDDEN); 4539200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood Message msg = mHandler.obtainMessage(SET_HIDDEN, (isHidden ? 1 : 0), 0); 4549200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHandler.sendMessage(msg); 4559200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 4569200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood 4579200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood /** 4589200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood * Handles SET_HIDDEN message sent by setHidden() 4599200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood */ 4609200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood private void handleSetHidden(boolean isHidden) { 46109a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood synchronized (KeyguardViewMediator.this) { 4629200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood if (mHidden != isHidden) { 4639200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHidden = isHidden; 4649200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood adjustUserActivityLocked(); 4655f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 4669200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 46709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 46809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 46909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 47009a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood /** 47128569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * Used by PhoneWindowManager to enable the keyguard due to a user activity timeout. 47228569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * This must be safe to call from any thread and with any window manager locks held. 47328569306e3fb136488cade5ed908a1be66128c2dMike Lockwood */ 47428569306e3fb136488cade5ed908a1be66128c2dMike Lockwood public void doKeyguardTimeout() { 47528569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.removeMessages(KEYGUARD_TIMEOUT); 47628569306e3fb136488cade5ed908a1be66128c2dMike Lockwood Message msg = mHandler.obtainMessage(KEYGUARD_TIMEOUT); 47728569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.sendMessage(msg); 47828569306e3fb136488cade5ed908a1be66128c2dMike Lockwood } 47928569306e3fb136488cade5ed908a1be66128c2dMike Lockwood 48028569306e3fb136488cade5ed908a1be66128c2dMike Lockwood /** 4811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Given the state of the keyguard, is the input restricted? 4821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Input is restricted when the keyguard is showing, or when the keyguard 4831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was suppressed by an app that disabled the keyguard or we haven't been provisioned yet. 4841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isInputRestricted() { 4861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mShowing || mNeedToReshowWhenReenabled || !mUpdateMonitor.isDeviceProvisioned(); 4871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 489b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn /** 490b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * Returns true if the change is resulting in the keyguard beign dismissed, 491b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn * meaning the screen can turn on immediately. Otherwise returns false. 492b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn */ 493b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean doLidChangeTq(boolean isLidOpen) { 494b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn mKeyboardOpen = isLidOpen; 495b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn 496b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (mUpdateMonitor.isKeyguardBypassEnabled() && mKeyboardOpen 497b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn && !mKeyguardViewProperties.isSecure() && mKeyguardViewManager.isShowing()) { 498b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn if (DEBUG) Log.d(TAG, "bypassing keyguard on sliding open of keyboard with non-secure keyguard"); 49939c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn mHandler.sendEmptyMessage(KEYGUARD_DONE_AUTHENTICATING); 500b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return true; 501b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 502b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return false; 503b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 5041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Enable the keyguard if the settings are appropriate. 5071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void doKeyguard() { 5091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 5101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if another app is disabling us, don't show 5111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 5121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); 513ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 514ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // note: we *should* set mNeedToReshowWhenReenabled=true here, but that makes 515ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for an occasional ugly flicker in this situation: 516ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 1) receive a call with the screen on (no keyguard) or make a call 517ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 2) screen times out 518ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // 3) user hits key to turn screen back on 519ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // instead, we reenable the keyguard when we know the screen is off and the call 520ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // ends (see the broadcast receiver below) 521ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // TODO: clean this up when we have better support at the window manager level 522ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen // for apps that wish to be on top of the keyguard 5231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the keyguard is already showing, don't bother 5271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardViewManager.isShowing()) { 5281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); 5291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5319c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 5321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // if the setup wizard hasn't run yet, don't show 5331b152029cc681eca6fad21d3f9e81c84c334087bJim Miller final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim", 5341b152029cc681eca6fad21d3f9e81c84c334087bJim Miller false); 5351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean provisioned = mUpdateMonitor.isDeviceProvisioned(); 53637c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville final IccCard.State state = mUpdateMonitor.getSimState(); 5371b152029cc681eca6fad21d3f9e81c84c334087bJim Miller final boolean lockedOrMissing = state.isPinLocked() 5381b152029cc681eca6fad21d3f9e81c84c334087bJim Miller || ((state == IccCard.State.ABSENT) && requireSim); 5391b152029cc681eca6fad21d3f9e81c84c334087bJim Miller 5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!lockedOrMissing && !provisioned) { 5411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned" 5421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + " and the sim is not locked or missing"); 5431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5459c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); 5471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project showLocked(); 5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to reset its state. 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleReset() 5541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void resetStateLocked() { 5561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "resetStateLocked"); 5571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(RESET); 5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 5591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to verify unlock 5631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleVerifyUnlock() 5641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void verifyUnlockLocked() { 5661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlockLocked"); 5671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(VERIFY_UNLOCK); 5681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onScreenTurnedOff(int) 5741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOff 5751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOffLocked() { 5771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); 5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); 5791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 5839c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #onScreenTurnedOn() 5841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOn 5851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOnLocked() { 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); 5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_ON); 5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it about a wake key so it can adjust 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * its state accordingly and then poke the wake lock when it is ready. 5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The wake key. 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleWakeWhenReady 5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onWakeKeyWhenKeyguardShowingTq(int) 5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void wakeWhenReadyLocked(int keyCode) { 5991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "wakeWhenReadyLocked(" + keyCode + ")"); 6001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * acquire the handoff lock that will keep the cpu running. this will 6031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be released once the keyguard has set itself up and poked the other wakelock 6041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * in {@link #handleWakeWhenReady(int)} 6051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.acquire(); 6071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(WAKE_WHEN_READY, keyCode, 0); 6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to show itself 6141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleShow() 6151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void showLocked() { 6171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "showLocked"); 618674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood // ensure we stay awake until we are finished displaying the keyguard 619674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.acquire(); 6201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(SHOW); 6211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to hide itself 6269c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #handleHide() 6271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void hideLocked() { 6291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "hideLocked"); 6301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(HIDE); 6311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 6321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 63537c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void onSimStateChanged(IccCard.State simState) { 6361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSimStateChanged: " + simState); 6371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (simState) { 6391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case ABSENT: 6401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // only force lock screen in case of missing sim if user hasn't 6411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // gone through setup wizard 6421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mUpdateMonitor.isDeviceProvisioned()) { 6431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 64437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_ABSENT and keygaurd isn't showing, we need " 6451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard since the device isn't provisioned yet."); 6461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PIN_REQUIRED: 6531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case PUK_REQUIRED: 6541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!isShowing()) { 65537c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_LOCKED and keygaurd isn't showing, we need " 6561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "to show the keyguard so the user can enter their sim pin"); 6571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 6591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case READY: 6641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isShowing()) { 6651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project resetStateLocked(); 6661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project break; 6681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 671b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean isSecure() { 672b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return mKeyguardViewProperties.isSecure(); 673b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 6749c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 6751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private BroadcastReceiver mBroadCastReceiver = new BroadcastReceiver() { 6761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 6771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 6781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final String action = intent.getAction(); 6791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (action.equals(DELAYED_KEYGUARD_ACTION)) { 6801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int sequence = intent.getIntExtra("seq", 0); 6821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "received DELAYED_KEYGUARD_ACTION with seq = " 6841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + sequence + ", mDelayedShowingSequence = " + mDelayedShowingSequence); 6851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mDelayedShowingSequence == sequence) { 6871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project doKeyguard(); 6881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 689f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) { 690f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler mPhoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 691f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 692f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState) // call ending 693f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler && !mScreenOn // screen off 694f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler && mExternallyEnabled) { // not disabled by any app 695f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 696f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // note: this is a way to gracefully reenable the keyguard when the call 697f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // ends and the screen is off without always reenabling the keyguard 698f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // each time the screen turns off while in call (and having an occasional ugly 699f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // flicker while turning back on the screen and disabling the keyguard again). 700f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (DEBUG) Log.d(TAG, "screen is off and call ended, let's make sure the " 701f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler + "keyguard is showing"); 702f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler doKeyguard(); 703f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 7041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 7071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * When a key is received when the screen is off and the keyguard is showing, 7111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we need to decide whether to actually turn on the screen, and if so, tell 7121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard to prepare itself and poke the wake lock when it is ready. 7131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The 'Tq' suffix is per the documentation in {@link WindowManagerPolicy}. 7151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Be sure not to take any action that takes a long time; any significant 7161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * action should be posted to a handler. 7179c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * 7181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The keycode of the key that woke the device 7191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether we poked the wake lock (and turned the screen on) 7201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean onWakeKeyWhenKeyguardShowingTq(int keyCode) { 7221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onWakeKeyWhenKeyguardShowing(" + keyCode + ")"); 7231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (isWakeKeyWhenKeyguardShowing(keyCode)) { 7251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // give the keyguard view manager a chance to adjust the state of the 7261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // keyguard based on the key that woke the device before poking 7271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the wake lock 7281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wakeWhenReadyLocked(keyCode); 7291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 7301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 7311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 7321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean isWakeKeyWhenKeyguardShowing(int keyCode) { 7361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project switch (keyCode) { 7371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_UP: 7381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_VOLUME_DOWN: 7391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_MUTE: 7409c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_HEADSETHOOK: 7419c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 7429c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_STOP: 7439c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_NEXT: 7449c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 7459c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller case KeyEvent.KEYCODE_MEDIA_REWIND: 7468b89d69a37bf417d14a170cfef1299c6d4987b24Andy Stadler case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 7471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KeyEvent.KEYCODE_CAMERA: 7481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 7491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 7511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks from {@link KeyguardViewManager}. 7551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 7581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock() { 7591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project pokeWakelock(mKeyboardOpen ? 7601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project AWAKE_INTERVAL_DEFAULT_KEYBOARD_OPEN_MS : AWAKE_INTERVAL_DEFAULT_MS); 7611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 7641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void pokeWakelock(int holdMs) { 7651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "pokeWakelock(" + holdMs + ")"); 7671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.acquire(); 7681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(TIMEOUT); 7691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakelockSequence++; 7701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(TIMEOUT, mWakelockSequence, 0); 7711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessageDelayed(msg, holdMs); 7721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@inheritDoc} 7771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 7789c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #handleKeyguardDone 7791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDone(boolean authenticated) { 7810572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn keyguardDone(authenticated, true); 7820572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn } 7830572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn 7840572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn public void keyguardDone(boolean authenticated, boolean wakeup) { 7851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7869c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller EventLog.writeEvent(70000, 2); 7871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")"); 7881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(KEYGUARD_DONE); 7890572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn msg.arg1 = wakeup ? 1 : 0; 7901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 7911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 7939c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller mUpdateMonitor.clearFailedAttempts(); 7941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 7971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback.onKeyguardExitResult(authenticated); 7981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 7991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (authenticated) { 8011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // after succesfully exiting securely, no need to reshow 8021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the keyguard when they've released the lock 8031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = true; 8041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 8051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@inheritDoc} 8121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 8131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleKeyguardDoneDrawing 8141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void keyguardDoneDrawing() { 8161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(KEYGUARD_DONE_DRAWING); 8171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This handler will be associated with the policy thread, which will also 8211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be the UI thread of the keyguard. Since the apis of the policy, and therefore 8221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * this class, can be called by other threads, any action that directly 8231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * interacts with the keyguard ui should be posted to this handler, rather 8241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * than called directly. 8251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Handler mHandler = new Handler() { 8271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 82837c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void handleMessage(Message msg) { 82937c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville switch (msg.what) { 8301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case TIMEOUT: 8311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleTimeout(msg.arg1); 8321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case SHOW: 8341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleShow(); 8351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case HIDE: 8371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 8381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case RESET: 8401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleReset(); 8411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return ; 8421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case VERIFY_UNLOCK: 8431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleVerifyUnlock(); 8441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_OFF: 8461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOff(); 8471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_ON: 8491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOn(); 8501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case WAKE_WHEN_READY: 8521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleWakeWhenReady(msg.arg1); 8531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE: 8550572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn handleKeyguardDone(msg.arg1 != 0); 8561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 8571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE_DRAWING: 8581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleKeyguardDoneDrawing(); 859b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 86039c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn case KEYGUARD_DONE_AUTHENTICATING: 861b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn keyguardDone(true); 862b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn return; 8639200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood case SET_HIDDEN: 8649200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood handleSetHidden(msg.arg1 != 0); 8659200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood break; 86628569306e3fb136488cade5ed908a1be66128c2dMike Lockwood case KEYGUARD_TIMEOUT: 86728569306e3fb136488cade5ed908a1be66128c2dMike Lockwood doKeyguard(); 86828569306e3fb136488cade5ed908a1be66128c2dMike Lockwood break; 8691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 8721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDone 8751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE 8761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8770572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn private void handleKeyguardDone(boolean wakeup) { 8781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDone"); 8791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 8800572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn if (wakeup) { 8810572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn mPM.userActivity(SystemClock.uptimeMillis(), true); 8820572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn } 8831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 884c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project mContext.sendBroadcast(mUserPresentIntent); 8851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDoneDrawing 8891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE_DRAWING 8901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleKeyguardDoneDrawing() { 8921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized(this) { 8931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (false) Log.d(TAG, "handleKeyguardDoneDrawing"); 8941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mWaitingUntilKeyguardVisible) { 8951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDoneDrawing: notifying mWaitingUntilKeyguardVisible"); 8961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = false; 8971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyAll(); 8981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // there will usually be two of these sent, one as a timeout, and one 9001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // as a result of the callback, so remove any remaining messages from 9011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the queue 9021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(KEYGUARD_DONE_DRAWING); 9031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handles the message sent by {@link #pokeWakelock} 9091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param seq used to determine if anything has changed since the message 9101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was sent. 9111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #TIMEOUT 9121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleTimeout(int seq) { 9141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleTimeout"); 9161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (seq == mWakelockSequence) { 9171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeLock.release(); 9181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 922db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler private void playSounds(boolean locked) { 923db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler // User feedback for keyguard. 924db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final ContentResolver cr = mContext.getContentResolver(); 925db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (Settings.System.getInt(cr, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) == 1) 926db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler { 927db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final String whichSound = locked 928db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler ? Settings.System.LOCK_SOUND 929db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler : Settings.System.UNLOCK_SOUND; 930db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final String soundPath = Settings.System.getString(cr, whichSound); 931db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (soundPath != null) { 932db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final Uri soundUri = Uri.parse("file://" + soundPath); 933db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (soundUri != null) { 934db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); 935db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler if (sfx != null) sfx.play(); 936db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler else Log.d(TAG, "playSounds: failed to load ringtone from uri: " + soundUri); 937db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } else { 938db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler Log.d(TAG, "playSounds: could not parse Uri: " + soundPath); 939db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 940db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } else { 941db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler Log.d(TAG, "playSounds: whichSound = " + whichSound + "; soundPath was null"); 942db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 943db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 944db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 945db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 9461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #showLocked}. 9481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #SHOW 9491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleShow() { 9511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleShow"); 9531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mSystemReady) return; 9549c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 955f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler if (mFirstShow) { 956f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler mFirstShow = false; 957f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler } else { 958f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler playSounds(true); 959f129859ee83fb1cce8a0549e216d57b5ddd602beDaniel Sandler } 960db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 9611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.show(); 9621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 96309a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood adjustUserActivityLocked(); 9645f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 9654994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn try { 9664994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn ActivityManagerNative.getDefault().closeSystemDialogs("lock"); 9674994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn } catch (RemoteException e) { 9684994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackborn } 969674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.release(); 9701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #hideLocked()} 9751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #HIDE 9761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleHide() { 9781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 9791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleHide"); 980b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood if (mWakeAndHandOff.isHeld()) { 981b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood Log.w(TAG, "attempt to hide the keyguard while waking, ignored"); 982b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood return; 983b4a584215719c3c2ec27d020654d9e143bc33bc1Mike Lockwood } 9841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 985f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // only play "unlock" noises if not on a call (since the incall UI 986f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // disables the keyguard) 987f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) { 988f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler playSounds(false); 989f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 990db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 9911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.hide(); 9921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = false; 99309a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood adjustUserActivityLocked(); 9945f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 9951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 99809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood private void adjustUserActivityLocked() { 99909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood // disable user activity if we are shown and not hidden 1000b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (DEBUG) Log.d(TAG, "adjustUserActivityLocked mShowing: " + mShowing + " mHidden: " + mHidden); 1001b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood boolean enabled = !mShowing || mHidden; 1002b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood mRealPowerManager.enableUserActivity(enabled); 1003b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood if (!enabled && mScreenOn) { 1004b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood // reinstate our short screen timeout policy 1005b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood pokeWakelock(); 1006b17b2fbcef9f02443be5db2cb1626f81c9dd4711Mike Lockwood } 100709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 100809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 10095f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private void adjustStatusBarLocked() { 10105f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 10115f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mStatusBarManager = (StatusBarManager) 10125f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mContext.getSystemService(Context.STATUS_BAR_SERVICE); 10135f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10145f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 10155f892c130a9799067686ac47640f9f70c8916103Mike Lockwood Log.w(TAG, "Could not get status bar manager"); 10165f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } else { 1017e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler // Give feedback to user when secure keyguard is active and engaged 1018e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler if (mShowing && isSecure()) { 1019e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler if (mSecureLockIcon == null) { 1020e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler mSecureLockIcon = mStatusBarManager.addIcon("secure", 1021e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler com.android.internal.R.drawable.stat_sys_secure, 0); 1022e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } 1023e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } else { 1024e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler if (mSecureLockIcon != null) { 1025e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler mStatusBarManager.removeIcon(mSecureLockIcon); 1026e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler mSecureLockIcon = null; 1027e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } 1028e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler } 1029e5fbe9b9122e68e16f7657989ab4b2cf5ea88958Daniel Sandler 10305f892c130a9799067686ac47640f9f70c8916103Mike Lockwood // if the keyguard is shown, allow the status bar to open 10315f892c130a9799067686ac47640f9f70c8916103Mike Lockwood // only if the keyguard is insecure and is covered by another window 10325f892c130a9799067686ac47640f9f70c8916103Mike Lockwood boolean enable = !mShowing || (mHidden && !isSecure()); 10335f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mStatusBarManager.disable(enable ? 10345f892c130a9799067686ac47640f9f70c8916103Mike Lockwood StatusBarManager.DISABLE_NONE : 10355f892c130a9799067686ac47640f9f70c8916103Mike Lockwood StatusBarManager.DISABLE_EXPAND); 10365f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10375f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 10385f892c130a9799067686ac47640f9f70c8916103Mike Lockwood 10391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #wakeWhenReadyLocked(int)} 10411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyCode The key that woke the device. 10421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #WAKE_WHEN_READY 10431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleWakeWhenReady(int keyCode) { 10451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DBG_WAKE) Log.d(TAG, "handleWakeWhenReady(" + keyCode + ")"); 10471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // this should result in a call to 'poke wakelock' which will set a timeout 10491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // on releasing the wakelock 10503754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood if (!mKeyguardViewManager.wakeWhenReadyTq(keyCode)) { 10513754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood // poke wakelock ourselves if keyguard is no longer active 1052206f07d3bebb6716bca8d1bcd56d507a5c97bf76Mike Lockwood Log.w(TAG, "mKeyguardViewManager.wakeWhenReadyTq did not poke wake lock, so poke it ourselves"); 10533754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood pokeWakelock(); 10543754b0d5635c699fac0bc24757d531b54f336c09Mike Lockwood } 10551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Now that the keyguard is ready and has poked the wake lock, we can 10581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * release the handoff wakelock 10591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWakeAndHandOff.release(); 10611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mWakeLock.isHeld()) { 1063206f07d3bebb6716bca8d1bcd56d507a5c97bf76Mike Lockwood Log.w(TAG, "mWakeLock not held in mKeyguardViewManager.wakeWhenReadyTq"); 10641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10699c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * Handle message sent by {@link #resetStateLocked()} 10701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 10711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleReset() { 10731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleReset"); 10751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.reset(); 10761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #verifyUnlock} 10811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 10821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleVerifyUnlock() { 10841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); 10861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.verifyUnlock(); 10871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mShowing = true; 10881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOffLocked()} 10931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_OFF 10941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOff() { 10961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 10971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); 10981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOff(); 10991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOnLocked()} 11041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_ON 11051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 11061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOn() { 11071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 11081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); 11091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardViewManager.onScreenTurnedOn(); 11101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 111337c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 111437c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 1115