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