11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/* 25cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Copyright (C) 2014 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 145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * limitations under the License 151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipackage com.android.systemui.keyguard; 18bc4603b0b1f1242387655274e39649882ca391d1Jim Miller 19dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity; 20b60d47ccefc7e4bcee81a91b108244b7dbdd7081Adrian Roosimport android.app.ActivityManager; 214994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackbornimport android.app.ActivityManagerNative; 221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.AlarmManager; 231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.PendingIntent; 2443d84518f2380e45659fbb31455479ef018b9329John Spurlockimport android.app.SearchManager; 255f892c130a9799067686ac47640f9f70c8916103Mike Lockwoodimport android.app.StatusBarManager; 26481a6df99fea124bc4354da34ff668750cdc9041Adrian Roosimport android.app.trust.TrustManager; 271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 28db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.content.ContentResolver; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 32be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roosimport android.content.pm.UserInfo; 33aec967acabfdc8eb6311ee787c6ed5a3b7fa4203Daniel Sandlerimport android.media.AudioManager; 34d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissenimport android.media.SoundPool; 35f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport android.os.Bundle; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 37109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brownimport android.os.Looper; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.PowerManager; 404994c66c0982a29898c7d1bf74f6777c0d4dd559Dianne Hackbornimport android.os.RemoteException; 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.SystemClock; 421b152029cc681eca6fad21d3f9e81c84c334087bJim Millerimport android.os.SystemProperties; 436a25cbdd941ead36fbf4f1f8b27db0e6024264ceJeff Sharkeyimport android.os.UserHandle; 44b70ff9a181234ffb69e51db2148ed865eb3a6ca7Amith Yamasaniimport android.os.UserManager; 45db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandlerimport android.provider.Settings; 4652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager; 47ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.telephony.TelephonyManager; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.EventLog; 49ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaenimport android.util.Log; 5025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Millerimport android.util.Slog; 510d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggiimport android.view.IWindowManager; 52b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggiimport android.view.ViewGroup; 530d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggiimport android.view.WindowManagerGlobal; 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManagerPolicy; 550002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roosimport android.view.animation.Animation; 560002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roosimport android.view.animation.AnimationUtils; 575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.policy.IKeyguardExitCallback; 585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.policy.IKeyguardShowCallback; 59ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport com.android.internal.policy.IKeyguardStateCallback; 60f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport com.android.internal.telephony.IccCardConstants; 61f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohenimport com.android.internal.widget.LockPatternUtils; 6252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.keyguard.KeyguardConstants; 635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.KeyguardDisplayManager; 645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.KeyguardUpdateMonitor; 655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.KeyguardUpdateMonitorCallback; 665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.MultiUserAvatarCache; 675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.ViewMediatorCallback; 68cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggiimport com.android.systemui.SystemUI; 695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.systemui.statusbar.phone.PhoneStatusBar; 70ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggiimport com.android.systemui.statusbar.phone.ScrimController; 715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; 725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.systemui.statusbar.phone.StatusBarWindowManager; 7358b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos 74ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport java.util.ArrayList; 754b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franzimport java.util.List; 76ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; 785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 7937c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Mediates requests related to the keyguard. This includes queries about the 821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * state of the keyguard, power management events that effect whether the keyguard 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * should be shown or reset, callbacks to the phone window manager to notify 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it of when the keyguard is showing, and events from the keyguard view itself 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * stating that the keyguard was succesfully unlocked. 861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note that the keyguard view is shown when the screen is off (as appropriate) 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * so that once the screen comes on, it will be ready immediately. 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example queries about the keyguard: 911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is {movement, key} one that should wake the keygaurd? 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - is the keyguard showing? 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - are input events restricted due to the state of the keyguard? 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Callbacks to the phone window manager: 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - the keyguard is showing 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Example external events that translate to keyguard view changes: 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - screen turned off -> reset the keyguard, and show it so it will be ready 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * next time the screen turns on 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - keyboard is slid open -> if the keyguard is not secure, hide it 1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Events from the keyguard view: 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * - user succesfully unlocked keyguard -> hide keyguard view, and no longer 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * restrict input events. 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: in addition to normal power managment events that effect the state of 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * whether the keyguard should be showing, external apps and services may request 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that the keyguard be disabled via {@link #setKeyguardEnabled(boolean)}. When 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false, this will override all other conditions for turning on the keyguard. 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Threading and synchronization: 1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * This class is created by the initialization routine of the {@link android.view.WindowManagerPolicy}, 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and runs on its thread. The keyguard UI is created from that thread in the 1151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * constructor of this class. The apis may be called from other threads, including the 1164532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown * {@link com.android.server.input.InputManagerService}'s and {@link android.view.WindowManager}'s. 1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Therefore, methods on this class are synchronized, and any action that is pointed 1185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * directly to the keyguard UI is posted to a {@link android.os.Handler} to ensure it is taken on the UI 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * thread of the keyguard. 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 121cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggipublic class KeyguardViewMediator extends SystemUI { 122bc4603b0b1f1242387655274e39649882ca391d1Jim Miller private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000; 123f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000; 124f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi 12552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private static final boolean DEBUG = KeyguardConstants.DEBUG; 12652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; 127431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato private final static boolean DBG_WAKE = false; 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final static String TAG = "KeyguardViewMediator"; 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1319c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller private static final String DELAYED_KEYGUARD_ACTION = 13237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD"; 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // used for handler messages 1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int SHOW = 2; 1361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int HIDE = 3; 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int RESET = 4; 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int VERIFY_UNLOCK = 5; 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_OFF = 6; 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int NOTIFY_SCREEN_ON = 7; 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE = 9; 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING = 10; 14339c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn private static final int KEYGUARD_DONE_AUTHENTICATING = 11; 1445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final int SET_OCCLUDED = 12; 14528569306e3fb136488cade5ed908a1be66128c2dMike Lockwood private static final int KEYGUARD_TIMEOUT = 13; 1466001379bff6ed80341a7e23480b6e3addb96395eJim Miller private static final int DISMISS = 17; 1470d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi private static final int START_KEYGUARD_EXIT_ANIM = 18; 1488de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi private static final int ON_ACTIVITY_DRAWN = 19; 149f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20; 1509c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The default amount of time we stay awake (used for all key input) 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public static final int AWAKE_INTERVAL_DEFAULT_MS = 10000; 1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * How long to wait after the screen turns off due to timeout before 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * turning on the keyguard (i.e, the user has this much time to turn 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the screen back on without having to face the keyguard). 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 161bc4603b0b1f1242387655274e39649882ca391d1Jim Miller private static final int KEYGUARD_LOCK_AFTER_DELAY_DEFAULT = 5000; 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 164f1b674197577e815040cd75ef86d611965d603adCraig Mautner * How long we'll wait for the {@link ViewMediatorCallback#keyguardDoneDrawing()} 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * callback before unblocking a call to {@link #setKeyguardEnabled(boolean)} 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * that is reenabling the keyguard. 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int KEYGUARD_DONE_DRAWING_TIMEOUT_MS = 2000; 1699c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 17074d188c91134a255005c392770ad80d8c44e3c0cDaniel Sandler /** 17158b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos * Secure setting whether analytics are collected on the keyguard. 17258b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos */ 17358b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos private static final String KEYGUARD_ANALYTICS_SETTING = "keyguard_analytics"; 17458b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos 1758cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani /** The stream type that the lock sounds are tied to. */ 1766d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent private int mMasterStreamType; 1778cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlarmManager mAlarmManager; 1798cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani private AudioManager mAudioManager; 1805f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private StatusBarManager mStatusBarManager; 181f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren private boolean mSwitchingUser; 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mSystemReady; 184cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk private boolean mBootCompleted; 185cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk private boolean mBootSendUserPresent; 1860060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 1870060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // Whether the next call to playSounds() should be skipped. Defaults to 1880060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler // true because the first lock (on boot) should be silent. 1890060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler private boolean mSuppressNextLockSound = true; 1900060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 1919c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** High level access to the power manager for WakeLocks */ 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private PowerManager mPM; 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1950d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi /** High level access to the window manager for dismissing keyguard animation */ 1960d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi private IWindowManager mWM; 1970d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi 198481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos 199481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos /** TrustManager for letting it know when we change visibility */ 200481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos private TrustManager mTrustManager; 201b70ff9a181234ffb69e51db2148ed865eb3a6ca7Amith Yamasani 20243d84518f2380e45659fbb31455479ef018b9329John Spurlock /** SearchManager for determining whether or not search assistant is available */ 20343d84518f2380e45659fbb31455479ef018b9329John Spurlock private SearchManager mSearchManager; 20443d84518f2380e45659fbb31455479ef018b9329John Spurlock 2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 206674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * Used to keep the device awake while to ensure the keyguard finishes opening before 207674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood * we sleep. 208674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood */ 209674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood private PowerManager.WakeLock mShowKeyguardWakeLock; 210674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood 2115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // these are protected by synchronized (this) 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2165d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood * External apps (like the phone app) can tell us to disable the keygaurd. 2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mExternallyEnabled = true; 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Remember if an external call to {@link #setKeyguardEnabled} with value 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * false caused us to hide the keyguard, so that we need to reshow it once 2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keygaurd is reenabled with another call with value true. 2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mNeedToReshowWhenReenabled = false; 2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // cached value of whether we are showing (need to know this to quickly 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // answer whether the input should be restricted) 229e5f17ab5a61a69aaa36b883a9abdeab9cba6c48eJim Miller private boolean mShowing; 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 231ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller /** Cached value of #isInputRestricted */ 232ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private boolean mInputRestricted; 233ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 23409a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood // true if the keyguard is hidden by another window 2355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private boolean mOccluded = false; 23609a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helps remember whether the screen has turned on since the last time 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * it turned off due to timeout. see {@link #onScreenTurnedOff(int)} 2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mDelayedShowingSequence; 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * If the user has disabled the keyguard, then requests to exit, this is 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * how we'll ultimately let them know whether it was successful. We use this 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * var being non-null as an indicator that there is an in progress request. 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 24825190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller private IKeyguardExitCallback mExitSecureCallback; 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the properties of the keyguard 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private KeyguardUpdateMonitor mUpdateMonitor; 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2544b71686d09ef0e13e729338e3a549f2f63f80db1Daniel Hansson private boolean mScreenOn; 255ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen 256f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // last known state of the cellular connection 257f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler private String mPhoneState = TelephonyManager.EXTRA_STATE_IDLE; 258f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler 2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 26053c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi * Whether a hide is pending an we are just waiting for #startKeyguardExitAnimation to be 26153c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi * called. 26253c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi * */ 26353c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi private boolean mHiding; 26453c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi 26553c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi /** 266c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project * we send this intent when the keyguard is dismissed. 267c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project */ 26817f509aefe98f448f8f0692321415eb0ac0abc2eJim Miller private static final Intent USER_PRESENT_INTENT = new Intent(Intent.ACTION_USER_PRESENT) 26917f509aefe98f448f8f0692321415eb0ac0abc2eJim Miller .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING 27017f509aefe98f448f8f0692321415eb0ac0abc2eJim Miller | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 271c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project 272c84bf28b74972b98351e2481168833c84cfcbd85The Android Open Source Project /** 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link #setKeyguardEnabled} waits on this condition when it reenables 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyguard. 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mWaitingUntilKeyguardVisible = false; 277bc4603b0b1f1242387655274e39649882ca391d1Jim Miller private LockPatternUtils mLockPatternUtils; 27834c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock private boolean mKeyguardDonePending = false; 2798de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi private boolean mHideAnimationRun = false; 2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 281d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen private SoundPool mLockSounds; 282d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen private int mLockSoundId; 283d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen private int mUnlockSoundId; 28449e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos private int mTrustedSoundId; 285d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen private int mLockSoundStreamId; 286c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi 287c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi /** 2880002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos * The animation used for hiding keyguard. This is used to fetch the animation timings if 2890002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos * WindowManager is not providing us with them. 2900002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos */ 2910002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos private Animation mHideAnimation; 2920002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos 2930002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos /** 294c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi * The volume applied to the lock/unlock sounds. 295c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi */ 296cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi private float mLockSoundVolume; 297d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen 298dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 2993192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller * For managing external displays 3003192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller */ 3013192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller private KeyguardDisplayManager mKeyguardDisplayManager; 3023192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller 303ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private final ArrayList<IKeyguardStateCallback> mKeyguardStateCallbacks = new ArrayList<>(); 304ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 305bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { 306bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 307bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 308f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren public void onUserSwitching(int userId) { 309f1b674197577e815040cd75ef86d611965d603adCraig Mautner // Note that the mLockPatternUtils user has already been updated from setCurrentUser. 310f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen // We need to force a reset of the views, since lockNow (called by 311f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen // ActivityManagerService) will not reconstruct the keyguard if it is already showing. 312bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (KeyguardViewMediator.this) { 313f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren mSwitchingUser = true; 314f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi resetKeyguardDonePendingLocked(); 3155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 3164e6922d89e72e79a8ab31ae2cb8a19d85bee91f8John Spurlock adjustStatusBarLocked(); 317a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna // When we switch users we want to bring the new user to the biometric unlock even 318a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna // if the current user has gone to the backup. 319a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); 3205dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } 321bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 322bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 323bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 324f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren public void onUserSwitchComplete(int userId) { 325f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren mSwitchingUser = false; 326be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos if (userId != UserHandle.USER_OWNER) { 327be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos UserInfo info = UserManager.get(mContext).getUserInfo(userId); 328be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos if (info != null && info.isGuest()) { 329be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos // If we just switched to a guest, try to dismiss keyguard. 330be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos dismiss(); 331be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos } 332be47b07bef0596dd9bf7137ea08cc1112328c6e8Adrian Roos } 333f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren } 334f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren 335f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren @Override 336bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void onUserRemoved(int userId) { 337bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mLockPatternUtils.removeUser(userId); 3385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi MultiUserAvatarCache.getInstance().clear(userId); 3396fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 3406fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani 3416fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani @Override 3426fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani public void onUserInfoChanged(int userId) { 3435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi MultiUserAvatarCache.getInstance().clear(userId); 344bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 345bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 346bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 3475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onPhoneStateChanged(int phoneState) { 348bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (KeyguardViewMediator.this) { 349bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (TelephonyManager.CALL_STATE_IDLE == phoneState // call ending 350bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller && !mScreenOn // screen off 351bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller && mExternallyEnabled) { // not disabled by any app 352bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 353bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // note: this is a way to gracefully reenable the keyguard when the call 354bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // ends and the screen is off without always reenabling the keyguard 355bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // each time the screen turns off while in call (and having an occasional ugly 356bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // flicker while turning back on the screen and disabling the keyguard again). 357bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.d(TAG, "screen is off and call ended, let's make sure the " 358bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + "keyguard is showing"); 3595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 360bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 361bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 3625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 363b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 364b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller @Override 365b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller public void onClockVisibilityChanged() { 366b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller adjustStatusBarLocked(); 367b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 368b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 369b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller @Override 370b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller public void onDeviceProvisioned() { 3713fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller sendUserPresentBroadcast(); 372ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestricted(); 373b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 374b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 375bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 37652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { 37752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 37852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) { 37952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.d(TAG, "onSimStateChanged(subId=" + subId + ", slotId=" + slotId 38052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller + ",state=" + simState + ")"); 38152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 382bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 383ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller try { 384ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller int size = mKeyguardStateCallbacks.size(); 385ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller boolean simPinSecure = mUpdateMonitor.isSimPinSecure(); 386ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller for (int i = 0; i < size; i++) { 387ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mKeyguardStateCallbacks.get(i).onSimSecureStateChanged(simPinSecure); 388ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 389ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } catch (RemoteException e) { 390ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller Slog.w(TAG, "Failed to call onSimSecureStateChanged", e); 391ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 392ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 393bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller switch (simState) { 394bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case NOT_READY: 395bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case ABSENT: 396bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // only force lock screen in case of missing sim if user hasn't 397bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // gone through setup wizard 398bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (this) { 399b256e4e209afd33bff360ec2652b6ca508df74deJim Miller if (shouldWaitForProvisioning()) { 400ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (!mShowing) { 40152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) Log.d(TAG, "ICC_ABSENT isn't showing," 402bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + " we need to show the keyguard since the " 403bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + "device isn't provisioned yet."); 4045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 405bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else { 4065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 407bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 408bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 409bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 410bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 411bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case PIN_REQUIRED: 412bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case PUK_REQUIRED: 413bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (this) { 414ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (!mShowing) { 41552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) Log.d(TAG, 41652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller "INTENT_VALUE_ICC_LOCKED and keygaurd isn't " 417bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + "showing; need to show keyguard so user can enter sim pin"); 4185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 419bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else { 4205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 421bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 422bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 423bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 424bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case PERM_DISABLED: 425bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (this) { 426ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (!mShowing) { 42752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) Log.d(TAG, "PERM_DISABLED and " 428bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + "keygaurd isn't showing."); 4295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 430bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else { 43152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) Log.d(TAG, "PERM_DISABLED, resetStateLocked to" 432bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller + "show permanently disabled message in lockscreen."); 4335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 434bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 435bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 436bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 437bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case READY: 438bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller synchronized (this) { 439ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (mShowing) { 4405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 441bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 442bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 443bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 44452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller default: 44552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG_SIM_STATES) Log.v(TAG, "Ignoring state: " + simState); 44652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller break; 447bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 448bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 449bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 450f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller public void onFingerprintRecognized(int userId) { 451f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller if (mStatusBarKeyguardViewManager.isBouncerShowing()) { 452f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller mViewMediatorCallback.keyguardDone(true); 453f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller } 454f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller }; 455f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller 456b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller }; 457b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 458dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() { 4595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 460c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void userActivity() { 461c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown KeyguardViewMediator.this.userActivity(); 462c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 463c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 464dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void keyguardDone(boolean authenticated) { 46544f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (!mKeyguardDonePending) { 46644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi KeyguardViewMediator.this.keyguardDone(authenticated, true); 46744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 468dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 469dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 470dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void keyguardDoneDrawing() { 471dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mHandler.sendEmptyMessage(KEYGUARD_DONE_DRAWING); 472dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 473dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 474dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 475dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void setNeedsInput(boolean needsInput) { 4765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.setNeedsInput(needsInput); 477dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 478c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown 479c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown @Override 480c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown public void onUserActivityTimeoutChanged() { 4815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.updateUserActivityTimeout(); 482c7505bc9dddcb0655302c1598e966bf121586ebeJeff Brown } 48334c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock 48434c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock @Override 48534c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock public void keyguardDonePending() { 48634c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock mKeyguardDonePending = true; 4878de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mHideAnimationRun = true; 4888de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mStatusBarKeyguardViewManager.startPreHideAnimation(null /* finishRunnable */); 489f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_PENDING_TIMEOUT, 490f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi KEYGUARD_DONE_PENDING_TIMEOUT_MS); 49134c4fe523ad96fb59cec28832b38806d04a6bebfJohn Spurlock } 4920b9d8accc569d8b51fd76118ce2f069c24b9af90Jim Miller 4930b9d8accc569d8b51fd76118ce2f069c24b9af90Jim Miller @Override 4940b9d8accc569d8b51fd76118ce2f069c24b9af90Jim Miller public void keyguardGone() { 4950b9d8accc569d8b51fd76118ce2f069c24b9af90Jim Miller mKeyguardDisplayManager.hide(); 4960b9d8accc569d8b51fd76118ce2f069c24b9af90Jim Miller } 4978de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi 4988de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi @Override 4998de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi public void readyForKeyguardDone() { 5008de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi if (mKeyguardDonePending) { 5018de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi // Somebody has called keyguardDonePending before, which means that we are 5028de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi // authenticated 5038de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi KeyguardViewMediator.this.keyguardDone(true /* authenticated */, true /* wakeUp */); 5048de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 5058de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 50649e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos 50749e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos @Override 50849e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos public void playTrustedSound() { 50949e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos KeyguardViewMediator.this.playTrustedSound(); 51049e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 511ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 512ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override 513ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public boolean isInputRestricted() { 514ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller return KeyguardViewMediator.this.isInputRestricted(); 515ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 516dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 517dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 518b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity() { 5193dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown mPM.userActivity(SystemClock.uptimeMillis(), false); 520dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 521dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 522ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private void setupLocked() { 523cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 5240d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi mWM = WindowManagerGlobal.getWindowManagerService(); 525481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos mTrustManager = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE); 526481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos 527674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard"); 528674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.setReferenceCounted(false); 5291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 530bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mContext.registerReceiver(mBroadcastReceiver, new IntentFilter(DELAYED_KEYGUARD_ACTION)); 5311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 532cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mKeyguardDisplayManager = new KeyguardDisplayManager(mContext); 5333192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller 534cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 535b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 536cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); 5371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 538cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mLockPatternUtils = new LockPatternUtils(mContext); 539b60d47ccefc7e4bcee81a91b108244b7dbdd7081Adrian Roos mLockPatternUtils.setCurrentUser(ActivityManager.getCurrentUser()); 5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 541e5f17ab5a61a69aaa36b883a9abdeab9cba6c48eJim Miller // Assume keyguard is showing (unless it's disabled) until we know for sure... 542ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled()); 543481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos mTrustManager.reportKeyguardShowingChanged(); 544e5f17ab5a61a69aaa36b883a9abdeab9cba6c48eJim Miller 545cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(mContext, 546cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mViewMediatorCallback, mLockPatternUtils); 54758b58fe68b5b675672b8c4ad84e720365013d412Adrian Roos final ContentResolver cr = mContext.getContentResolver(); 548dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5494b71686d09ef0e13e729338e3a549f2f63f80db1Daniel Hansson mScreenOn = mPM.isScreenOn(); 5504b71686d09ef0e13e729338e3a549f2f63f80db1Daniel Hansson 551d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen mLockSounds = new SoundPool(1, AudioManager.STREAM_SYSTEM, 0); 552b14288d4b13d7629f578c4854f5a14d4d9a06783Jim Miller String soundPath = Settings.Global.getString(cr, Settings.Global.LOCK_SOUND); 553d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen if (soundPath != null) { 554d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen mLockSoundId = mLockSounds.load(soundPath, 1); 555d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen } 556d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen if (soundPath == null || mLockSoundId == 0) { 557b14288d4b13d7629f578c4854f5a14d4d9a06783Jim Miller Log.w(TAG, "failed to load lock sound from " + soundPath); 558d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen } 559b14288d4b13d7629f578c4854f5a14d4d9a06783Jim Miller soundPath = Settings.Global.getString(cr, Settings.Global.UNLOCK_SOUND); 560d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen if (soundPath != null) { 561d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen mUnlockSoundId = mLockSounds.load(soundPath, 1); 562d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen } 563d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen if (soundPath == null || mUnlockSoundId == 0) { 564b14288d4b13d7629f578c4854f5a14d4d9a06783Jim Miller Log.w(TAG, "failed to load unlock sound from " + soundPath); 565d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen } 56649e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos soundPath = Settings.Global.getString(cr, Settings.Global.TRUSTED_SOUND); 56749e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos if (soundPath != null) { 56849e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos mTrustedSoundId = mLockSounds.load(soundPath, 1); 56949e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 57049e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos if (soundPath == null || mTrustedSoundId == 0) { 57149e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos Log.w(TAG, "failed to load trusted sound from " + soundPath); 57249e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 57349e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos 574cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi int lockSoundDefaultAttenuation = mContext.getResources().getInteger( 575c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi com.android.internal.R.integer.config_lockSoundVolumeDb); 576f2b0c11f4e797e183131261724d8de310dac5431Jean-Michel Trivi mLockSoundVolume = (float)Math.pow(10, (float)lockSoundDefaultAttenuation/20); 5770002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos 5780002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos mHideAnimation = AnimationUtils.loadAnimation(mContext, 5790002a45034b1103ffc5ecf4d5a14b7d1ba225005Adrian Roos com.android.internal.R.anim.lock_screen_behind_enter); 5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 582cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi @Override 583cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi public void start() { 584ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller synchronized (this) { 585ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setupLocked(); 586ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 587cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi putComponent(KeyguardViewMediator.class, this); 588cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi } 589cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let us know that the system is ready after startup. 5921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onSystemReady() { 59443d84518f2380e45659fbb31455479ef018b9329John Spurlock mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onSystemReady"); 5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSystemReady = true; 598bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mUpdateMonitor.registerCallback(mUpdateCallback); 599086977094d96ab9352432e0941a05b09cefc92acJim Miller 600d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // Suppress biometric unlock right after boot until things have settled if it is the 601d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // selected security method, otherwise unsuppress it. It must be unsuppressed if it is 602d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // not the selected security method for the following reason: if the user starts 603d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // without a screen lock selected, the biometric unlock would be suppressed the first 604d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // time they try to use it. 605d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // 606d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // Note that the biometric unlock will still not show if it is not the selected method. 607d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // Calling setAlternateUnlockEnabled(true) simply says don't suppress it if it is the 608d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna // selected method. 609d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna if (mLockPatternUtils.usingBiometricWeak() 610d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna && mLockPatternUtils.isBiometricWeakInstalled()) { 611d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna if (DEBUG) Log.d(TAG, "suppressing biometric unlock during boot"); 612d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna mUpdateMonitor.setAlternateUnlockEnabled(false); 613d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna } else { 614d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna mUpdateMonitor.setAlternateUnlockEnabled(true); 615d4a3e5d711ef3467830205320b7f7ae2188ea2cfBrian Colonna } 616086977094d96ab9352432e0941a05b09cefc92acJim Miller 6175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6193fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller // Most services aren't available until the system reaches the ready state, so we 6203fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller // send it here when the device first boots. 6213fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller maybeSendUserPresentBroadcast(); 6221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Called to let us know the screen was turned off. 626fb0448ab4b42c1b390cd75c3660ec0de511b7b3bJeff Brown * @param why either {@link android.view.WindowManagerPolicy#OFF_BECAUSE_OF_USER} or 627fb0448ab4b42c1b390cd75c3660ec0de511b7b3bJeff Brown * {@link android.view.WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT}. 6281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onScreenTurnedOff(int why) { 6301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 631ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = false; 6321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")"); 6331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 634f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi resetKeyguardDonePendingLocked(); 6358de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mHideAnimationRun = false; 63614adfe425e67c9ec12b0841a62c5c03ce00838eaJohn Spurlock 637a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller // Lock immediately based on setting if secure (user has a pin/pattern/password). 638a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller // This also "locks" the device when not secure to provide easy access to the 639a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller // camera while preventing unwanted input. 640a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller final boolean lockImmediately = 641a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller mLockPatternUtils.getPowerButtonInstantlyLocks() || !mLockPatternUtils.isSecure(); 642a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller 6437ff6eb6429ae3b0facc93214acefd657d378f4daSelim Cinek notifyScreenOffLocked(); 6447ff6eb6429ae3b0facc93214acefd657d378f4daSelim Cinek 6451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 6461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "pending exit secure callback cancelled"); 6475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 6485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mExitSecureCallback.onKeyguardExitResult(false); 6495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 65025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); 6515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 6521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 6531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mExternallyEnabled) { 6549c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller hideLocked(); 6551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mShowing) { 6575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 658a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT 659a4edd151c5266a2c794c95444fed67d19740cee3Jim Miller || (why == WindowManagerPolicy.OFF_BECAUSE_OF_USER && !lockImmediately)) { 6606aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown doKeyguardLaterLocked(); 661016e39780b857c09ba689ec820a04c7930bd8a7fMike Lockwood } else { 6625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 66520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurndOff(why); 6661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6686aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown private void doKeyguardLaterLocked() { 6696aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // if the screen turned off because of timeout or the user hit the power button 6706aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // and we don't need to lock immediately, set an alarm 6716aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // to enable it a little bit later (i.e, give the user a chance 6726aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // to turn the screen back on within a certain window without 6736aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // having to unlock the screen) 6746aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown final ContentResolver cr = mContext.getContentResolver(); 6756aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 6766aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // From DisplaySettings 6776aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown long displayTimeout = Settings.System.getInt(cr, SCREEN_OFF_TIMEOUT, 6786aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT); 6796aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 6806aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // From SecuritySettings 6816aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown final long lockAfterTimeout = Settings.Secure.getInt(cr, 6826aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, 6836aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown KEYGUARD_LOCK_AFTER_DELAY_DEFAULT); 6846aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 6856aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // From DevicePolicyAdmin 6866aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown final long policyTimeout = mLockPatternUtils.getDevicePolicyManager() 6876aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown .getMaximumTimeToLock(null, mLockPatternUtils.getCurrentUser()); 6886aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 6896aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown long timeout; 6906aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown if (policyTimeout > 0) { 6916aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // policy in effect. Make sure we don't go beyond policy limit. 6926aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown displayTimeout = Math.max(displayTimeout, 0); // ignore negative values 6936aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown timeout = Math.min(policyTimeout - displayTimeout, lockAfterTimeout); 6946aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } else { 6956aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown timeout = lockAfterTimeout; 6966aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 6976aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 6986aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown if (timeout <= 0) { 6996aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // Lock now 7006aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown mSuppressNextLockSound = true; 7015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 7026aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } else { 7036aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown // Lock in the future 7046aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown long when = SystemClock.elapsedRealtime() + timeout; 7056aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown Intent intent = new Intent(DELAYED_KEYGUARD_ACTION); 7066aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown intent.putExtra("seq", mDelayedShowingSequence); 7076aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown PendingIntent sender = PendingIntent.getBroadcast(mContext, 7086aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 7096aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, sender); 7106aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = " 7116aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown + mDelayedShowingSequence); 7126aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7136aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7146aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 7156aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown private void cancelDoKeyguardLaterLocked() { 7166aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown mDelayedShowingSequence++; 7176aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7186aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 7191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Let's us know the screen was turned on. 7211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 72225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller public void onScreenTurnedOn(IKeyguardShowCallback callback) { 7231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 724ab1000856df7108236919ec4ab0f7ba17c445986Karl Rosaen mScreenOn = true; 7256aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown cancelDoKeyguardLaterLocked(); 7261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onScreenTurnedOn, seq = " + mDelayedShowingSequence); 72725190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller if (callback != null) { 72825190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller notifyScreenOnLocked(callback); 729d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 7301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 73120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller KeyguardUpdateMonitor.getInstance(mContext).dispatchScreenTurnedOn(); 7323fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller maybeSendUserPresentBroadcast(); 7333fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller } 7343fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller 7353fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller private void maybeSendUserPresentBroadcast() { 73661d9409239c5ed360ffc2181eee6b981aad9192bAdam Lesinski if (mSystemReady && mLockPatternUtils.isLockScreenDisabled()) { 7373fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller // Lock screen is disabled because the user has set the preference to "None". 7383fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller // In this case, send out ACTION_USER_PRESENT here instead of in 7393fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller // handleKeyguardDone() 7403fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller sendUserPresentBroadcast(); 7413fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller } 7421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7456aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown * A dream started. We should lock after the usual screen-off lock timeout but only 7466aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown * if there is a secure lock pattern. 7476aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown */ 7486aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown public void onDreamingStarted() { 7496aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown synchronized (this) { 7506aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown if (mScreenOn && mLockPatternUtils.isSecure()) { 7516aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown doKeyguardLaterLocked(); 7526aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7536aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7546aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7556aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 7566aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown /** 7576aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown * A dream stopped. 7586aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown */ 7596aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown public void onDreamingStopped() { 7606aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown synchronized (this) { 7616aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown if (mScreenOn) { 7626aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown cancelDoKeyguardLaterLocked(); 7636aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7646aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7656aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown } 7666aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown 7676aaf29589b5fbe24721740e71b272c4a830b69e7Jeff Brown /** 7685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Same semantics as {@link android.view.WindowManagerPolicy#enableKeyguard}; provide 7691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * a way for external stuff to override normal keyguard behavior. For instance 7701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the phone app disables the keyguard when it receives incoming calls. 7711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void setKeyguardEnabled(boolean enabled) { 7731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 7741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")"); 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExternallyEnabled = enabled; 7771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!enabled && mShowing) { 7791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring"); 7811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // we're in the process of handling a request to verify the user 7821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // can get past the keyguard. ignore extraneous requests to disable / reenable 7831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 7841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // hiding keyguard that is showing, remember to reshow later 7871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, " 7881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "disabling status bar expansion"); 7891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = true; 790ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestrictedLocked(); 7911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project hideLocked(); 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (enabled && mNeedToReshowWhenReenabled) { 7931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // reenabled after previously hidden, reshow 7941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling " 7951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "status bar expansion"); 7961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNeedToReshowWhenReenabled = false; 797ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestrictedLocked(); 7981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mExitSecureCallback != null) { 8001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting"); 8015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 8025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller mExitSecureCallback.onKeyguardExitResult(false); 8035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 80425190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); 8055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 8061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mExitSecureCallback = null; 8075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi resetStateLocked(); 8081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 809f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen showLocked(null); 8101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // block until we know the keygaurd is done drawing (and post a message 8121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to unblock us after a timeout so we don't risk blocking too long 8131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // and causing an ANR). 8141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = true; 8151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS); 8161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false"); 8171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project while (mWaitingUntilKeyguardVisible) { 8181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 8191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project wait(); 8201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (InterruptedException e) { 8211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Thread.currentThread().interrupt(); 8221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible"); 8251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 8321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 83325190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller public void verifyUnlock(IKeyguardExitCallback callback) { 8341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (this) { 8351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlock"); 836b256e4e209afd33bff360ec2652b6ca508df74deJim Miller if (shouldWaitForProvisioning()) { 8371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // don't allow this api when the device isn't provisioned 8381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "ignoring because device isn't provisioned"); 8395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 84025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller callback.onKeyguardExitResult(false); 8415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 84225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); 8435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 8445d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood } else if (mExternallyEnabled) { 8455d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // this only applies when the user has externally disabled the 8465d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // keyguard. this is unexpected and means the user is not 8475d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood // using the api properly. 8485d258b6b17eb258ca728f27907d0b24697ab72c9Mike Lockwood Log.w(TAG, "verifyUnlock called when not externally disabled"); 8495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 85025190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller callback.onKeyguardExitResult(false); 8515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 85225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); 8535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 8541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (mExitSecureCallback != null) { 8551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // already in progress with someone else 8565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller try { 85725190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller callback.onKeyguardExitResult(false); 8585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } catch (RemoteException e) { 85925190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(false)", e); 8605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 8611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 86225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller mExitSecureCallback = callback; 8631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project verifyUnlockLocked(); 8641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8699dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn * Is the keyguard currently showing and not being force hidden? 8709dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn */ 8715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public boolean isShowingAndNotOccluded() { 8725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi return mShowing && !mOccluded; 8739dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn } 8749dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn 8759dc06cc2a800905619470030e0f2528aa239c113Dianne Hackborn /** 8765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Notify us when the keyguard is occluded by another window 87709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood */ 8785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setOccluded(boolean isOccluded) { 8795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (DEBUG) Log.d(TAG, "setOccluded " + isOccluded); 8805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mHandler.removeMessages(SET_OCCLUDED); 8815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi Message msg = mHandler.obtainMessage(SET_OCCLUDED, (isOccluded ? 1 : 0), 0); 8829200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood mHandler.sendMessage(msg); 8839200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 8849200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood 8859200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood /** 8865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Handles SET_OCCLUDED message sent by setOccluded() 8879200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood */ 8885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void handleSetOccluded(boolean isOccluded) { 88909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood synchronized (KeyguardViewMediator.this) { 8905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (mOccluded != isOccluded) { 8915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mOccluded = isOccluded; 8925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.setOccluded(isOccluded); 893ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn updateActivityLockScreenState(); 8945f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 8959200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood } 89609a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 89709a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood } 89809a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood 89909a404081a12a4afbf61b347ec8454e1d702ea1aMike Lockwood /** 90028569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * Used by PhoneWindowManager to enable the keyguard due to a user activity timeout. 90128569306e3fb136488cade5ed908a1be66128c2dMike Lockwood * This must be safe to call from any thread and with any window manager locks held. 90228569306e3fb136488cade5ed908a1be66128c2dMike Lockwood */ 903f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen public void doKeyguardTimeout(Bundle options) { 90428569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.removeMessages(KEYGUARD_TIMEOUT); 905f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen Message msg = mHandler.obtainMessage(KEYGUARD_TIMEOUT, options); 90628569306e3fb136488cade5ed908a1be66128c2dMike Lockwood mHandler.sendMessage(msg); 90728569306e3fb136488cade5ed908a1be66128c2dMike Lockwood } 90828569306e3fb136488cade5ed908a1be66128c2dMike Lockwood 90928569306e3fb136488cade5ed908a1be66128c2dMike Lockwood /** 9101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Given the state of the keyguard, is the input restricted? 9111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Input is restricted when the keyguard is showing, or when the keyguard 9121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * was suppressed by an app that disabled the keyguard or we haven't been provisioned yet. 9131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isInputRestricted() { 915b256e4e209afd33bff360ec2652b6ca508df74deJim Miller return mShowing || mNeedToReshowWhenReenabled || shouldWaitForProvisioning(); 9161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 918ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private void updateInputRestricted() { 919ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller synchronized (this) { 920ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestrictedLocked(); 921ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 922ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 923ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private void updateInputRestrictedLocked() { 924ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller boolean inputRestricted = isInputRestricted(); 925ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (mInputRestricted != inputRestricted) { 926ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mInputRestricted = inputRestricted; 927ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller try { 928ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller int size = mKeyguardStateCallbacks.size(); 929ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller for (int i = 0; i < size; i++) { 930ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mKeyguardStateCallbacks.get(i).onInputRestrictedStateChanged(inputRestricted); 931ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 932ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } catch (RemoteException e) { 933ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller Slog.w(TAG, "Failed to call onDeviceProvisioned", e); 934ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 935ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 936ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 937ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 938b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn /** 939ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner * Enable the keyguard if the settings are appropriate. 9401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 941f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen private void doKeyguardLocked(Bundle options) { 94229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // if another app is disabling us, don't show 94329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mExternallyEnabled) { 94429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled"); 94529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 94629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // note: we *should* set mNeedToReshowWhenReenabled=true here, but that makes 94729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // for an occasional ugly flicker in this situation: 94829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // 1) receive a call with the screen on (no keyguard) or make a call 94929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // 2) screen times out 95029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // 3) user hits key to turn screen back on 95129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // instead, we reenable the keyguard when we know the screen is off and the call 95229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // ends (see the broadcast receiver below) 95329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // TODO: clean this up when we have better support at the window manager level 95429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // for apps that wish to be on top of the keyguard 95538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn return; 95629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 9579c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 95829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // if the keyguard is already showing, don't bother 9595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (mStatusBarKeyguardViewManager.isShowing()) { 96029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG) Log.d(TAG, "doKeyguard: not showing because it is already showing"); 96195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi resetStateLocked(); 96238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn return; 96329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 9649c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 96529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // if the setup wizard hasn't run yet, don't show 96652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim", false); 967a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville final boolean absent = SubscriptionManager.isValidSubscriptionId( 968a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville mUpdateMonitor.getNextSubIdForState(IccCardConstants.State.ABSENT)); 969a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville final boolean disabled = SubscriptionManager.isValidSubscriptionId( 970a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville mUpdateMonitor.getNextSubIdForState(IccCardConstants.State.PERM_DISABLED)); 97152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller final boolean lockedOrMissing = mUpdateMonitor.isSimPinSecure() 97252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller || ((absent || disabled) && requireSim); 97329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 974b256e4e209afd33bff360ec2652b6ca508df74deJim Miller if (!lockedOrMissing && shouldWaitForProvisioning()) { 97529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned" 97629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn + " and the sim is not locked or missing"); 97738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn return; 97829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 9792a98a4cbaaf3300036434dd1d44b891ea8a8c932Jim Miller 980d0b698f074a8a251781b62346a791de48d39d2a4Jorim Jaggi if (mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) { 98129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off"); 98238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn return; 9831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 98429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 985945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence if (mLockPatternUtils.checkVoldPassword()) { 986945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); 987945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence // Without this, settings is not enabled until the lock screen first appears 988ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setShowingLocked(false); 989945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence hideLocked(); 990945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence return; 991945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence } 992945490c12e32b1c13b9097c00702558260b2011fPaul Lawrence 99329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen"); 994f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen showLocked(options); 9951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 997b256e4e209afd33bff360ec2652b6ca508df74deJim Miller private boolean shouldWaitForProvisioning() { 998b256e4e209afd33bff360ec2652b6ca508df74deJim Miller return !mUpdateMonitor.isDeviceProvisioned() && !isSecure(); 999b256e4e209afd33bff360ec2652b6ca508df74deJim Miller } 1000b256e4e209afd33bff360ec2652b6ca508df74deJim Miller 10011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1002ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner * Dismiss the keyguard through the security layers. 1003ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner */ 10046001379bff6ed80341a7e23480b6e3addb96395eJim Miller public void handleDismiss() { 10055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (mShowing && !mOccluded) { 10065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.dismiss(); 100787d0366d9e41a0fb1e20cc021ba391ed92fab385Jim Miller } 1008ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner } 1009ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner 10106001379bff6ed80341a7e23480b6e3addb96395eJim Miller public void dismiss() { 10116001379bff6ed80341a7e23480b6e3addb96395eJim Miller mHandler.sendEmptyMessage(DISMISS); 10126001379bff6ed80341a7e23480b6e3addb96395eJim Miller } 10136001379bff6ed80341a7e23480b6e3addb96395eJim Miller 1014ad09bccfe4cc0a3075e97c0911a02b329023a34aCraig Mautner /** 10151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to reset its state. 10165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @see #handleReset 10171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void resetStateLocked() { 10194894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller if (DEBUG) Log.e(TAG, "resetStateLocked"); 10205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi Message msg = mHandler.obtainMessage(RESET); 10211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 10221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to verify unlock 10261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleVerifyUnlock() 10271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void verifyUnlockLocked() { 10291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "verifyUnlockLocked"); 10301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(VERIFY_UNLOCK); 10311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 10361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #onScreenTurnedOff(int) 10371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOff 10381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void notifyScreenOffLocked() { 10401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOffLocked"); 10411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(NOTIFY_SCREEN_OFF); 10421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send a message to keyguard telling it the screen just turned on. 10465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @see #onScreenTurnedOn 10471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #handleNotifyScreenOn 10481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 104925190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller private void notifyScreenOnLocked(IKeyguardShowCallback result) { 10501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "notifyScreenOnLocked"); 10515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_ON, result); 105238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn mHandler.sendMessage(msg); 10531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to show itself 10575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @see #handleShow 10581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1059f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen private void showLocked(Bundle options) { 10601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "showLocked"); 1061674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood // ensure we stay awake until we are finished displaying the keyguard 1062674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.acquire(); 1063f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen Message msg = mHandler.obtainMessage(SHOW, options); 10641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 10651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Send message to keyguard telling it to hide itself 10699c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller * @see #handleHide() 10701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void hideLocked() { 10721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "hideLocked"); 10731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Message msg = mHandler.obtainMessage(HIDE); 10741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendMessage(msg); 10751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1077b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn public boolean isSecure() { 1078dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mLockPatternUtils.isSecure() 1079dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || KeyguardUpdateMonitor.getInstance(mContext).isSimPinSecure(); 1080b446e9767a99b8b3ae4e91a9fd797beb70bf99dfDianne Hackborn } 10819c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1082f1b674197577e815040cd75ef86d611965d603adCraig Mautner /** 1083f1b674197577e815040cd75ef86d611965d603adCraig Mautner * Update the newUserId. Call while holding WindowManagerService lock. 1084ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller * NOTE: Should only be called by KeyguardViewMediator in response to the user id changing. 1085ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller * 1086f1b674197577e815040cd75ef86d611965d603adCraig Mautner * @param newUserId The id of the incoming user. 1087f1b674197577e815040cd75ef86d611965d603adCraig Mautner */ 1088f1b674197577e815040cd75ef86d611965d603adCraig Mautner public void setCurrentUser(int newUserId) { 1089f1b674197577e815040cd75ef86d611965d603adCraig Mautner mLockPatternUtils.setCurrentUser(newUserId); 1090f1b674197577e815040cd75ef86d611965d603adCraig Mautner } 1091f1b674197577e815040cd75ef86d611965d603adCraig Mautner 1092bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 10931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 10941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 1095bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DELAYED_KEYGUARD_ACTION.equals(intent.getAction())) { 1096bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int sequence = intent.getIntExtra("seq", 0); 1097f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller if (DEBUG) Log.d(TAG, "received DELAYED_KEYGUARD_ACTION with seq = " 10981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + sequence + ", mDelayedShowingSequence = " + mDelayedShowingSequence); 109929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn synchronized (KeyguardViewMediator.this) { 110029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (mDelayedShowingSequence == sequence) { 1101bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Don't play lockscreen SFX if the screen went off due to timeout. 110229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn mSuppressNextLockSound = true; 11035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller doKeyguardLocked(null); 110429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 1105f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 11061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 11091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11100572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn public void keyguardDone(boolean authenticated, boolean wakeup) { 11116001379bff6ed80341a7e23480b6e3addb96395eJim Miller if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")"); 11126001379bff6ed80341a7e23480b6e3addb96395eJim Miller EventLog.writeEvent(70000, 2); 11136001379bff6ed80341a7e23480b6e3addb96395eJim Miller Message msg = mHandler.obtainMessage(KEYGUARD_DONE, authenticated ? 1 : 0, wakeup ? 1 : 0); 11146001379bff6ed80341a7e23480b6e3addb96395eJim Miller mHandler.sendMessage(msg); 11151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * This handler will be associated with the policy thread, which will also 11191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * be the UI thread of the keyguard. Since the apis of the policy, and therefore 11201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * this class, can be called by other threads, any action that directly 11211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * interacts with the keyguard ui should be posted to this handler, rather 11221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * than called directly. 11231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Handler mHandler = new Handler(Looper.myLooper(), null, true /*async*/) { 11251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 112637c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville public void handleMessage(Message msg) { 112737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville switch (msg.what) { 11281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case SHOW: 1129f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen handleShow((Bundle) msg.obj); 11306001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case HIDE: 11321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleHide(); 11336001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case RESET: 11355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi handleReset(); 11366001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case VERIFY_UNLOCK: 11381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleVerifyUnlock(); 11396001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_OFF: 11411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleNotifyScreenOff(); 11426001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case NOTIFY_SCREEN_ON: 114425190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller handleNotifyScreenOn((IKeyguardShowCallback) msg.obj); 11456001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE: 1147e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller handleKeyguardDone(msg.arg1 != 0, msg.arg2 != 0); 11486001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project case KEYGUARD_DONE_DRAWING: 11501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project handleKeyguardDoneDrawing(); 11516001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 115239c2d71950a5ecccb2881613dd69b74ba8de55f9Dianne Hackborn case KEYGUARD_DONE_AUTHENTICATING: 1153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller keyguardDone(true, true); 11546001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi case SET_OCCLUDED: 11565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi handleSetOccluded(msg.arg1 != 0); 11579200a3987e3dc147f732e9bce34ab1c5be043f12Mike Lockwood break; 115828569306e3fb136488cade5ed908a1be66128c2dMike Lockwood case KEYGUARD_TIMEOUT: 115929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn synchronized (KeyguardViewMediator.this) { 1160f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen doKeyguardLocked((Bundle) msg.obj); 116129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn } 116229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn break; 11636001379bff6ed80341a7e23480b6e3addb96395eJim Miller case DISMISS: 11646001379bff6ed80341a7e23480b6e3addb96395eJim Miller handleDismiss(); 11656001379bff6ed80341a7e23480b6e3addb96395eJim Miller break; 11660d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi case START_KEYGUARD_EXIT_ANIM: 1167e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj; 1168e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration); 11690d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi break; 1170f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi case KEYGUARD_DONE_PENDING_TIMEOUT: 1171f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi Log.w(TAG, "Timeout while waiting for activity drawn!"); 1172f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi // Fall through. 11738de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi case ON_ACTIVITY_DRAWN: 11748de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi handleOnActivityDrawn(); 11758de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi break; 11761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 11781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 11791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 11801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 11811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #keyguardDone 11821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE 11831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1184e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller private void handleKeyguardDone(boolean authenticated, boolean wakeup) { 11851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDone"); 118644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi synchronized (this) { 1187f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi resetKeyguardDonePendingLocked(); 118844f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 1189e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller 1190e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller if (authenticated) { 1191e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller mUpdateMonitor.clearFailedUnlockAttempts(); 11920572658afdfcc08cbcdcc509b11691646d5f237dDianne Hackborn } 1193f41fc9664febbdbf138e8540fd7a8281f1278eb1Jim Miller mUpdateMonitor.clearFingerprintRecognized(); 11946a25cbdd941ead36fbf4f1f8b27db0e6024264ceJeff Sharkey 1195e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller if (mExitSecureCallback != null) { 1196e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller try { 1197e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller mExitSecureCallback.onKeyguardExitResult(authenticated); 1198e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller } catch (RemoteException e) { 1199e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller Slog.w(TAG, "Failed to call onKeyguardExitResult(" + authenticated + ")", e); 1200e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller } 1201e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller 1202e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller mExitSecureCallback = null; 1203e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller 1204e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller if (authenticated) { 1205e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller // after succesfully exiting securely, no need to reshow 1206e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller // the keyguard when they've released the lock 1207e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller mExternallyEnabled = true; 1208e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller mNeedToReshowWhenReenabled = false; 1209ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestricted(); 1210e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller } 1211e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller } 1212e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller 1213e51cf7aeb6157017801a802b4c1d74cbf51b7a01Jim Miller handleHide(); 12143fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller } 12153fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller 12163fd47af32d6be8971445f4da8deba0fadae688d3Jim Miller private void sendUserPresentBroadcast() { 1217cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk synchronized (this) { 1218cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk if (mBootCompleted) { 1219cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk final UserHandle currentUser = new UserHandle(mLockPatternUtils.getCurrentUser()); 12204b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz final UserManager um = (UserManager) mContext.getSystemService( 12214b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz Context.USER_SERVICE); 12224b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz List <UserInfo> userHandles = um.getProfiles(currentUser.getIdentifier()); 12234b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz for (UserInfo ui : userHandles) { 12244b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, ui.getUserHandle()); 12254b9f8ede4e012e5522716bba84c6037a83ee52f9Benjamin Franz } 1226cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk } else { 1227cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk mBootSendUserPresent = true; 1228cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk } 1229cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk } 12301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 12311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 12321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 12335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @see #keyguardDone 12341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #KEYGUARD_DONE_DRAWING 12351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 12361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleKeyguardDoneDrawing() { 12371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized(this) { 12385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (DEBUG) Log.d(TAG, "handleKeyguardDoneDrawing"); 12391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mWaitingUntilKeyguardVisible) { 12401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleKeyguardDoneDrawing: notifying mWaitingUntilKeyguardVisible"); 12411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mWaitingUntilKeyguardVisible = false; 12421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project notifyAll(); 12431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 12441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // there will usually be two of these sent, one as a timeout, and one 12451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // as a result of the callback, so remove any remaining messages from 12461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the queue 12471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.removeMessages(KEYGUARD_DONE_DRAWING); 12481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 12491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 12501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 12511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1252db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler private void playSounds(boolean locked) { 1253db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler // User feedback for keyguard. 12540060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 12550060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler if (mSuppressNextLockSound) { 12560060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler mSuppressNextLockSound = false; 12570060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler return; 12580060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler } 12590060a9b544e0a64ba2a7cd6f0025b6600e08f372Daniel Sandler 126049e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos playSound(locked ? mLockSoundId : mUnlockSoundId); 126149e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 126249e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos 126349e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos private void playSound(int soundId) { 126449e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos if (soundId == 0) return; 1265db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler final ContentResolver cr = mContext.getContentResolver(); 12668cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani if (Settings.System.getInt(cr, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) == 1) { 126749e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos 1268d5545bd0a9efa65a8f7436205dd88965bc60192bMarco Nelissen mLockSounds.stop(mLockSoundStreamId); 12698cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani // Init mAudioManager 12708cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani if (mAudioManager == null) { 12718cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 12728cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani if (mAudioManager == null) return; 12736d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent mMasterStreamType = mAudioManager.getMasterStreamType(); 12748cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani } 12758cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani // If the stream is muted, don't play the sound 12766d5176638c2189595cede38fb92c3e7e8700e221Eric Laurent if (mAudioManager.isStreamMute(mMasterStreamType)) return; 12778cb751b05a590a191ab4887567503269a475bbd6Amith Yamasani 127849e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos mLockSoundStreamId = mLockSounds.play(soundId, 1279c55b393efd462490cd5e27fc373bceafdd25662eJean-Michel Trivi mLockSoundVolume, mLockSoundVolume, 1/*priortiy*/, 0/*loop*/, 1.0f/*rate*/); 1280db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler } 12812a98a4cbaaf3300036434dd1d44b891ea8a8c932Jim Miller } 1282db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 128349e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos private void playTrustedSound() { 128449e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos if (mSuppressNextLockSound) { 128549e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos return; 128649e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 128749e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos playSound(mTrustedSoundId); 128849e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos } 128949e057d7eedb44f5397781254acab4e0ef08a9cfAdrian Roos 1290ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn private void updateActivityLockScreenState() { 1291ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn try { 12925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mOccluded); 1293ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn } catch (RemoteException e) { 1294ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn } 1295ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn } 1296ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn 12971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 12981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #showLocked}. 12991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #SHOW 13001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1301f752202bee88e31ce765483ba2efa6999ae9c9adAdam Cohen private void handleShow(Bundle options) { 13021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 13035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (!mSystemReady) { 13045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (DEBUG) Log.d(TAG, "ignoring handleShow because system is not ready."); 13055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return; 13065ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } else { 13075ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller if (DEBUG) Log.d(TAG, "handleShow"); 13085ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller } 13099c20d0e91bb5c0b7c540ba2f0d6c9b8add979d6fJim Miller 1310ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setShowingLocked(true); 13115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.show(options); 131253c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi mHiding = false; 1313f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi resetKeyguardDonePendingLocked(); 13148de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mHideAnimationRun = false; 1315ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn updateActivityLockScreenState(); 13165f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 13173dc524bc31a1578693ca958ef442dfa092b7aa7fJeff Brown userActivity(); 131829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 131929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn // Do this at the end to not slow down display of the keyguard. 132029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn playSounds(true); 132129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn 1322674d3e40212d077c06f46589992f6e16c6c1b22dMike Lockwood mShowKeyguardWakeLock.release(); 13231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 13243192148fb493836fa8f3008b8ec95c836ac9a515Jim Miller mKeyguardDisplayManager.show(); 13251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 13261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 13278de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi private final Runnable mKeyguardGoingAwayRunnable = new Runnable() { 13288de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi @Override 13298de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi public void run() { 13308de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi try { 13318de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi // Don't actually hide the Keyguard at the moment, wait for window 13328de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi // manager until it tells us it's safe to do so with 13338de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi // startKeyguardExitAnimation. 133484a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi mWM.keyguardGoingAway( 133584a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock(), 133684a3e7aacf6dbeccf4afb36a29f2f069dca7d486Jorim Jaggi mStatusBarKeyguardViewManager.isGoingToNotificationShade()); 13378de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } catch (RemoteException e) { 13388de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi Log.e(TAG, "Error while calling WindowManager", e); 13398de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 13408de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 13418de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi }; 13428de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi 13431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 13441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #hideLocked()} 13451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #HIDE 13461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 13471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleHide() { 13481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 13491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleHide"); 1350b9d6079120747205e2ae18162aa730fad3b58d9cJorim Jaggi 135176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi mHiding = true; 135276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi if (mShowing && !mOccluded) { 13538de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi if (!mHideAnimationRun) { 13548de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mStatusBarKeyguardViewManager.startPreHideAnimation(mKeyguardGoingAwayRunnable); 13558de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } else { 13568de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mKeyguardGoingAwayRunnable.run(); 13578de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 135876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } else { 1359b9d6079120747205e2ae18162aa730fad3b58d9cJorim Jaggi 136076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi // Don't try to rely on WindowManager - if Keyguard wasn't showing, window 136176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi // manager won't start the exit animation. 136276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi handleStartKeyguardExitAnimation( 136376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi SystemClock.uptimeMillis() + mHideAnimation.getStartOffset(), 136476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi mHideAnimation.getDuration()); 13650d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi } 13660d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi } 13670d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi } 13680d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi 13698de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi private void handleOnActivityDrawn() { 137044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (DEBUG) Log.d(TAG, "handleOnActivityDrawn: mKeyguardDonePending=" + mKeyguardDonePending); 13718de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi if (mKeyguardDonePending) { 13728de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mStatusBarKeyguardViewManager.onActivityDrawn(); 13738de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 13748de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 13758de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi 1376e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private void handleStartKeyguardExitAnimation(long startTime, long fadeoutDuration) { 13770d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi synchronized (KeyguardViewMediator.this) { 13781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 137953c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi if (!mHiding) { 138053c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi return; 138153c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi } 138253c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi mHiding = false; 138353c68a44acbd9343dda648c17652e921c28fda1dJorim Jaggi 1384f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // only play "unlock" noises if not on a call (since the incall UI 1385f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler // disables the keyguard) 1386f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState)) { 1387f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler playSounds(false); 1388f2d8e74c0230f53acdc6f94652961e4adb0e134aDaniel Sandler } 1389db783bdff33bbfcf825ec27d1b1af1fe7b3045e3Daniel Sandler 1390ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setShowingLocked(false); 1391e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); 1392f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi resetKeyguardDonePendingLocked(); 13938de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mHideAnimationRun = false; 1394ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn updateActivityLockScreenState(); 13955f892c130a9799067686ac47640f9f70c8916103Mike Lockwood adjustStatusBarLocked(); 1396705004bebf919b2d851fa86a31f17fc21b0dca34Jim Miller sendUserPresentBroadcast(); 13971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 13981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 13991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 14005f892c130a9799067686ac47640f9f70c8916103Mike Lockwood private void adjustStatusBarLocked() { 14015f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 14025f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mStatusBarManager = (StatusBarManager) 14035f892c130a9799067686ac47640f9f70c8916103Mike Lockwood mContext.getSystemService(Context.STATUS_BAR_SERVICE); 14045f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 14055f892c130a9799067686ac47640f9f70c8916103Mike Lockwood if (mStatusBarManager == null) { 14065f892c130a9799067686ac47640f9f70c8916103Mike Lockwood Log.w(TAG, "Could not get status bar manager"); 14075f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } else { 1408dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler // Disable aspects of the system/status/navigation bars that must not be re-enabled by 1409dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler // windows that appear on top, ever 1410f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey int flags = StatusBarManager.DISABLE_NONE; 1411e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood if (mShowing) { 1412e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // Permanently disable components not available when keyguard is enabled 1413e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // (like recents). Temporary enable/disable (e.g. the "back" button) are 1414e23ab8b1acea211762f1d0c4202f73a9f7700bb5Jim Miller // done in KeyguardHostView. 1415dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler flags |= StatusBarManager.DISABLE_RECENT; 1416118aecea584499fb41966fd8a0ea0ac60ac6bdb6Jorim Jaggi flags |= StatusBarManager.DISABLE_SEARCH; 1417f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey } 1418a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi if (isShowingAndNotOccluded()) { 1419a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi flags |= StatusBarManager.DISABLE_HOME; 1420a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi } 1421f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey 1422130453c2eb615bb8cc51a26afbd40822a72636c1Daniel Sandler if (DEBUG) { 14235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi Log.d(TAG, "adjustStatusBarLocked: mShowing=" + mShowing + " mOccluded=" + mOccluded 14244519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey + " isSecure=" + isSecure() + " --> flags=0x" + Integer.toHexString(flags)); 1425130453c2eb615bb8cc51a26afbd40822a72636c1Daniel Sandler } 1426f52c70b2ccf711f507723bc74a68ca8c3a12c57aJeff Sharkey 1427d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (!(mContext instanceof Activity)) { 1428d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mStatusBarManager.disable(flags); 1429d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 14305f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 14315f892c130a9799067686ac47640f9f70c8916103Mike Lockwood } 14325f892c130a9799067686ac47640f9f70c8916103Mike Lockwood 14331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 14345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Handle message sent by {@link #resetStateLocked} 14351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #RESET 14361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 14375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void handleReset() { 14381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 14391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleReset"); 14405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.reset(); 14411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 14441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 14451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #verifyUnlock} 1446904732c4573de8aa3fa79c3d741380db2457340fCraig Mautner * @see #VERIFY_UNLOCK 14471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 14481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleVerifyUnlock() { 14491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 14501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); 1451ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller setShowingLocked(true); 14525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.verifyUnlock(); 1453ff5b158f69bf453cf1fdedd175a09482c65f2bf2Dianne Hackborn updateActivityLockScreenState(); 14541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 14571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 14581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle message sent by {@link #notifyScreenOffLocked()} 14591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_OFF 14601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 14611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleNotifyScreenOff() { 14621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 14631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOff"); 14645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.onScreenTurnedOff(); 14651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 14681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 14695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Handle message sent by {@link #notifyScreenOnLocked} 14701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @see #NOTIFY_SCREEN_ON 14711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 147225190577cc69eaa5930c6fbdc2fcca03afc84982Jim Miller private void handleNotifyScreenOn(IKeyguardShowCallback callback) { 14731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project synchronized (KeyguardViewMediator.this) { 14741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleNotifyScreenOn"); 14755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.onScreenTurnedOn(callback); 14761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 14771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1478054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 1479f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi private void resetKeyguardDonePendingLocked() { 1480f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi mKeyguardDonePending = false; 1481f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi mHandler.removeMessages(KEYGUARD_DONE_PENDING_TIMEOUT); 1482f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi } 1483f8d77da969edc2f191d349f7d9a30d02edcbd388Jorim Jaggi 1484e5f910a667088ab63e017d5851f0956c77b823daJim Miller public void onBootCompleted() { 1485e5f910a667088ab63e017d5851f0956c77b823daJim Miller mUpdateMonitor.dispatchBootCompleted(); 1486cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk synchronized (this) { 1487cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk mBootCompleted = true; 1488cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk if (mBootSendUserPresent) { 1489cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk sendUserPresentBroadcast(); 1490cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk } 1491cf5a9530f7ded49e830a064526f4290f3a81062cJason Monk } 1492e5f910a667088ab63e017d5851f0956c77b823daJim Miller } 14935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 149403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi public StatusBarKeyguardViewManager registerStatusBar(PhoneStatusBar phoneStatusBar, 1495ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi ViewGroup container, StatusBarWindowManager statusBarWindowManager, 1496ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi ScrimController scrimController) { 14975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarKeyguardViewManager.registerStatusBar(phoneStatusBar, container, 1498ecc798e6668046c2f67cf30c6ab1db2eba80cab1Jorim Jaggi statusBarWindowManager, scrimController); 149903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi return mStatusBarKeyguardViewManager; 150003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi } 150103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi 1502e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { 1503e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi Message msg = mHandler.obtainMessage(START_KEYGUARD_EXIT_ANIM, 1504e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi new StartKeyguardExitAnimParams(startTime, fadeoutDuration)); 15050d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi mHandler.sendMessage(msg); 15060d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi } 15070d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi 15088de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi public void onActivityDrawn() { 15098de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mHandler.sendEmptyMessage(ON_ACTIVITY_DRAWN); 15108de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 151103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi public ViewMediatorCallback getViewMediatorCallback() { 151203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi return mViewMediatorCallback; 15135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1514e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 1515e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private static class StartKeyguardExitAnimParams { 1516e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 1517e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi long startTime; 1518e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi long fadeoutDuration; 1519e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 1520e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi private StartKeyguardExitAnimParams(long startTime, long fadeoutDuration) { 1521e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi this.startTime = startTime; 1522e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi this.fadeoutDuration = fadeoutDuration; 1523e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 1524e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 1525481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos 1526ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller private void setShowingLocked(boolean showing) { 1527ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller if (showing != mShowing) { 1528ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mShowing = showing; 1529ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller try { 1530ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller int size = mKeyguardStateCallbacks.size(); 1531ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller for (int i = 0; i < size; i++) { 1532ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mKeyguardStateCallbacks.get(i).onShowingStateChanged(showing); 1533ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 1534ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } catch (RemoteException e) { 1535ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller Slog.w(TAG, "Failed to call onShowingStateChanged", e); 1536ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 1537ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller updateInputRestrictedLocked(); 1538481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos mTrustManager.reportKeyguardShowingChanged(); 1539481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos } 1540481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos } 1541ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller 1542ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void addStateMonitorCallback(IKeyguardStateCallback callback) { 1543ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller synchronized (this) { 1544ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mKeyguardStateCallbacks.add(callback); 1545ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller try { 1546ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller callback.onSimSecureStateChanged(mUpdateMonitor.isSimPinSecure()); 1547ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller callback.onShowingStateChanged(mShowing); 1548ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } catch (RemoteException e) { 1549ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller Slog.w(TAG, "Failed to call onShowingStateChanged or onSimSecureStateChanged", e); 1550ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 1551ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 1552ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller } 15531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 1554