11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/* 21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License. 61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at 71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and 141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License. 151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 195dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.ActivityManagerNative; 205dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.IUserSwitchObserver; 218f09fd2e3123c7713d50886dc3745d330a1879c5Jim Millerimport android.app.PendingIntent; 22b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport android.app.admin.DevicePolicyManager; 231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.database.ContentObserver; 288f09fd2e3123c7713d50886dc3745d330a1879c5Jim Millerimport android.graphics.Bitmap; 298f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport static android.os.BatteryManager.BATTERY_STATUS_FULL; 311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; 3216464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN; 3316464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_STATUS; 3416464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_PLUGGED; 3516464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_LEVEL; 3616464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_HEALTH; 3747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Millerimport android.media.AudioManager; 388f09fd2e3123c7713d50886dc3745d330a1879c5Jim Millerimport android.media.IRemoteControlDisplay; 3979a444a0cd78bc6528e19336a0d49ef4a17b263cJim Millerimport android.os.BatteryManager; 408f09fd2e3123c7713d50886dc3745d330a1879c5Jim Millerimport android.os.Bundle; 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 425dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.os.IRemoteCallback; 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 445dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.os.RemoteException; 45e8e93a143eaec158450c146e96e8fe05fd2401e7Amith Yamasaniimport android.os.UserHandle; 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.provider.Settings; 47a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 48a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.IccCardConstants; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.telephony.TelephonyIntents; 50c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 51c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport android.telephony.TelephonyManager; 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log; 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.google.android.collect.Lists; 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport java.lang.ref.WeakReference; 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport java.util.ArrayList; 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Watches for updates that may be interesting to the keyguard, and provides 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the up to date information as well as a registration for callbacks that care 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * to be updated. 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: under time crunch, this has been extended to include some stuff that 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * doesn't really belong here. see {@link #handleBatteryUpdate} where it shutdowns 65258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * the device, and {@link #getFailedUnlockAttempts()}, {@link #reportFailedAttempt()} 66258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller * and {@link #clearFailedUnlockAttempts()}. Maybe we should rename this 'KeyguardContext'... 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class KeyguardUpdateMonitor { 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 70bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final String TAG = "KeyguardUpdateMonitor"; 71bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final boolean DEBUG = false; 72bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final boolean DEBUG_SIM_STATES = DEBUG || false; 73bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP = 3; 74bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int LOW_BATTERY_THRESHOLD = 20; 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 76bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Callback messages 77bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_TIME_UPDATE = 301; 78bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_BATTERY_UPDATE = 302; 79bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_CARRIER_INFO_UPDATE = 303; 80bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_SIM_STATE_CHANGE = 304; 81bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_RINGER_MODE_CHANGED = 305; 82bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_PHONE_STATE_CHANGED = 306; 83bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_CLOCK_VISIBILITY_CHANGED = 307; 84bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_DEVICE_PROVISIONED = 308; 855737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private static final int MSG_DPM_STATE_CHANGED = 309; 86f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren private static final int MSG_USER_SWITCHING = 310; 875737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private static final int MSG_USER_REMOVED = 311; 88f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett private static final int MSG_KEYGUARD_VISIBILITY_CHANGED = 312; 89efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen protected static final int MSG_BOOT_COMPLETED = 313; 90f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren private static final int MSG_USER_SWITCH_COMPLETE = 314; 918f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller private static final int MSG_SET_CURRENT_CLIENT_ID = 315; 928f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller protected static final int MSG_SET_PLAYBACK_STATE = 316; 936fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani protected static final int MSG_USER_INFO_CHANGED = 317; 947fce38021694925295f5d14bfba71f28cba19404Brian Colonna protected static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318; 9520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller private static final int MSG_SCREEN_TURNED_ON = 319; 9620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller private static final int MSG_SCREEN_TURNED_OFF = 320; 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static KeyguardUpdateMonitor sInstance; 99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final Context mContext; 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 102bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Telephony state 103a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville private IccCardConstants.State mSimState = IccCardConstants.State.READY; 104bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private CharSequence mTelephonyPlmn; 105bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private CharSequence mTelephonySpn; 106bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private int mRingMode; 107bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private int mPhoneState; 1085d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett private boolean mKeyguardIsVisible; 1094eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen private boolean mBootCompleted; 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Device provisioning state 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mDeviceProvisioned; 11347088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Battery status 11516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller private BatteryStatus mBatteryStatus; 11679a444a0cd78bc6528e19336a0d49ef4a17b263cJim Miller 117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // Password attempts 1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mFailedAttempts = 0; 119ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna private int mFailedBiometricUnlockAttempts = 0; 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1210ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller private boolean mAlternateUnlockEnabled; 122cc4104fd71225ed092f16b11882d9a10084e34acBrian Colonna 123054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey private boolean mClockVisible; 124054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 1256212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>> 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallbacks = Lists.newArrayList(); 127fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka private ContentObserver mDeviceProvisionedObserver; 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 129a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna private boolean mSwitchingUser; 130a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna 13120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller private boolean mScreenOn; 13220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 133bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private final Handler mHandler = new Handler() { 134bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 135bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void handleMessage(Message msg) { 136bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller switch (msg.what) { 137bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_TIME_UPDATE: 138bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleTimeUpdate(); 139bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 140bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_BATTERY_UPDATE: 141bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleBatteryUpdate((BatteryStatus) msg.obj); 142bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 143bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_CARRIER_INFO_UPDATE: 144bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleCarrierInfoUpdate(); 145bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 146bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_SIM_STATE_CHANGE: 147bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleSimStateChange((SimArgs) msg.obj); 148bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 149bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_RINGER_MODE_CHANGED: 150bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleRingerModeChange(msg.arg1); 151bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 152bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_PHONE_STATE_CHANGED: 153bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handlePhoneStateChanged((String)msg.obj); 154bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 155bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_CLOCK_VISIBILITY_CHANGED: 156bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleClockVisibilityChanged(); 157bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 158bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_DEVICE_PROVISIONED: 159bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleDeviceProvisioned(); 160bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 161bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_DPM_STATE_CHANGED: 162bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleDevicePolicyManagerStateChanged(); 163bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 164f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren case MSG_USER_SWITCHING: 165f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren handleUserSwitching(msg.arg1, (IRemoteCallback)msg.obj); 166f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren break; 167f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren case MSG_USER_SWITCH_COMPLETE: 168f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren handleUserSwitchComplete(msg.arg1); 169bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 170bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_USER_REMOVED: 171bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleUserRemoved(msg.arg1); 172bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 173f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett case MSG_KEYGUARD_VISIBILITY_CHANGED: 174f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett handleKeyguardVisibilityChanged(msg.arg1); 175f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett break; 176efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen case MSG_BOOT_COMPLETED: 177efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen handleBootCompleted(); 178efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen break; 1798f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller case MSG_SET_CURRENT_CLIENT_ID: 1808f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller handleSetGenerationId(msg.arg1, msg.arg2 != 0, (PendingIntent) msg.obj); 1818f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller break; 1828f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller case MSG_SET_PLAYBACK_STATE: 1838f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller handleSetPlaybackState(msg.arg1, msg.arg2, (Long) msg.obj); 1848f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller break; 1856fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani case MSG_USER_INFO_CHANGED: 1866fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani handleUserInfoChanged(msg.arg1); 1876fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani break; 1887fce38021694925295f5d14bfba71f28cba19404Brian Colonna case MSG_REPORT_EMERGENCY_CALL_ACTION: 1897fce38021694925295f5d14bfba71f28cba19404Brian Colonna handleReportEmergencyCallAction(); 1907fce38021694925295f5d14bfba71f28cba19404Brian Colonna break; 19120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller case MSG_SCREEN_TURNED_OFF: 19220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller handleScreenTurnedOff(msg.arg1); 19320daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller break; 19420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller case MSG_SCREEN_TURNED_ON: 19520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller handleScreenTurnedOn(); 19620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller break; 197bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 198bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 199bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 200bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 2018f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller private AudioManager mAudioManager; 2028f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2038f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller static class DisplayClientState { 2048f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public int clientGeneration; 2058f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public boolean clearing; 2068f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public PendingIntent intent; 2078f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public int playbackState; 2088f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public long playbackEventTime; 2098f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2108f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2118f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller private DisplayClientState mDisplayClientState = new DisplayClientState(); 2128f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2138f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller /** 2148f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller * This currently implements the bare minimum required to enable showing and hiding 2158f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller * KeyguardTransportControl. There's a lot of client state to maintain which is why 2168f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller * KeyguardTransportControl maintains an independent connection while it's showing. 2178f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller */ 2188f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller private final IRemoteControlDisplay.Stub mRemoteControlDisplay = 2198f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller new IRemoteControlDisplay.Stub() { 2208f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 221bc43b4c2f24fd03c0d0546895c97918c1736d9fbJean-Michel Trivi public void setPlaybackState(int generationId, int state, long stateChangeTimeMs, 222bc43b4c2f24fd03c0d0546895c97918c1736d9fbJean-Michel Trivi long currentPosMs, float speed) { 2238f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller Message msg = mHandler.obtainMessage(MSG_SET_PLAYBACK_STATE, 2248f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller generationId, state, stateChangeTimeMs); 2258f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mHandler.sendMessage(msg); 2268f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2278f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2288f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public void setMetadata(int generationId, Bundle metadata) { 2298f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2308f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2318f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2323261b537c5fdec824575a1f6ad6d8942715e82e2Jean-Michel Trivi public void setTransportControlInfo(int generationId, int flags, int posCapabilities) { 2338f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2348f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2358f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2368f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public void setArtwork(int generationId, Bitmap bitmap) { 2378f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2388f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2398f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2408f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public void setAllMetadata(int generationId, Bundle metadata, Bitmap bitmap) { 2418f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 2428f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2438f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 244f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi public void setEnabled(boolean enabled) { 245f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi // no-op: this RemoteControlDisplay is not subject to being disabled. 246f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi } 247f108cdd9ee5efe354d87edd02a07b323298c116cJean-Michel Trivi 2488f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public void setCurrentClientId(int clientGeneration, PendingIntent mediaIntent, 2498f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller boolean clearing) throws RemoteException { 2508f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller Message msg = mHandler.obtainMessage(MSG_SET_CURRENT_CLIENT_ID, 2518f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller clientGeneration, (clearing ? 1 : 0), mediaIntent); 2528f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mHandler.sendMessage(msg); 2538f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 2548f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller }; 2558f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 256bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 257bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 258bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void onReceive(Context context, Intent intent) { 259bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final String action = intent.getAction(); 260bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.d(TAG, "received broadcast " + action); 261bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 262bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (Intent.ACTION_TIME_TICK.equals(action) 263bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller || Intent.ACTION_TIME_CHANGED.equals(action) 264bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { 26590873d53fba63afcd15b11008eead07b4c88bba0Jim Miller mHandler.sendEmptyMessage(MSG_TIME_UPDATE); 266bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyIntents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 267bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mTelephonyPlmn = getTelephonyPlmnFrom(intent); 268bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mTelephonySpn = getTelephonySpnFrom(intent); 26990873d53fba63afcd15b11008eead07b4c88bba0Jim Miller mHandler.sendEmptyMessage(MSG_CARRIER_INFO_UPDATE); 270bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 271bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int status = intent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN); 272bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int plugged = intent.getIntExtra(EXTRA_PLUGGED, 0); 273bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int level = intent.getIntExtra(EXTRA_LEVEL, 0); 274bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int health = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN); 275bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final Message msg = mHandler.obtainMessage( 276bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller MSG_BATTERY_UPDATE, new BatteryStatus(status, level, plugged, health)); 277bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(msg); 278bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { 279bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG_SIM_STATES) { 280bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller Log.v(TAG, "action " + action + " state" + 281bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)); 282bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 283bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage( 284bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller MSG_SIM_STATE_CHANGE, SimArgs.fromIntent(intent))); 285bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { 286bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED, 287bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0)); 288bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) { 289bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 290bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_PHONE_STATE_CHANGED, state)); 291bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED 292bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller .equals(action)) { 29390873d53fba63afcd15b11008eead07b4c88bba0Jim Miller mHandler.sendEmptyMessage(MSG_DPM_STATE_CHANGED); 294bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (Intent.ACTION_USER_REMOVED.equals(action)) { 295bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_REMOVED, 296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0)); 297efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { 29890873d53fba63afcd15b11008eead07b4c88bba0Jim Miller dispatchBootCompleted(); 299bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 300bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 301bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 3022de5ee84636739dc82a4c4dda76666bf38cf281cJim Miller 3036fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani private final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() { 3046fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani 3056fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani public void onReceive(Context context, Intent intent) { 3066fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani final String action = intent.getAction(); 3076fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani if (Intent.ACTION_USER_INFO_CHANGED.equals(action)) { 3086fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_INFO_CHANGED, 3096fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()), 0)); 3106fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 3116fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 3126fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani }; 3136fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 31547088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * When we receive a 31647088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast, 31737c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville * and then pass a result via our handler to {@link KeyguardUpdateMonitor#handleSimStateChange}, 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we need a single object to pass to the handler. This class helps decode 31947088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * the intent and provide a {@link SimCard.State} result. 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static class SimArgs { 322a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville public final IccCardConstants.State simState; 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 324a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville SimArgs(IccCardConstants.State state) { 32590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller simState = state; 32690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } 32790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller 32890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller static SimArgs fromIntent(Intent intent) { 329a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville IccCardConstants.State state; 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) { 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project throw new IllegalArgumentException("only handles intent ACTION_SIM_STATE_CHANGED"); 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 333a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); 334a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) { 335b0b24b3df50988d23f571b83d829fecc986ec497John Wang final String absentReason = intent 336a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON); 337b0b24b3df50988d23f571b83d829fecc986ec497John Wang 338a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals( 339b0b24b3df50988d23f571b83d829fecc986ec497John Wang absentReason)) { 340a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PERM_DISABLED; 341b0b24b3df50988d23f571b83d829fecc986ec497John Wang } else { 342a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.ABSENT; 343b0b24b3df50988d23f571b83d829fecc986ec497John Wang } 344a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) { 345a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.READY; 346a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) { 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final String lockedReason = intent 348a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON); 349a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) { 350a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PIN_REQUIRED; 351a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) { 352a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PUK_REQUIRED; 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 354a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.UNKNOWN; 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 356a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_LOCKED_NETWORK.equals(stateExtra)) { 357a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.NETWORK_LOCKED; 358109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(stateExtra) 359109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller || IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(stateExtra)) { 360109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller // This is required because telephony doesn't return to "READY" after 361109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller // these state transitions. See bug 7197471. 362109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller state = IccCardConstants.State.READY; 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 364a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.UNKNOWN; 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 36690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller return new SimArgs(state); 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public String toString() { 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return simState.toString(); 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 374bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /* package */ static class BatteryStatus { 37516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int status; 37616464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int level; 37716464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int plugged; 37816464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int health; 37916464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public BatteryStatus(int status, int level, int plugged, int health) { 38016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.status = status; 38116464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.level = level; 38216464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.plugged = plugged; 38316464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.health = health; 38416464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller } 38516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 386bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 387a92a01bb0bb458401af90bed5a46d932278160d7Brian Muramatsu * Determine whether the device is plugged in (USB, power, or wireless). 388bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if the device is plugged in. 389bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 390bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller boolean isPluggedIn() { 391bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return plugged == BatteryManager.BATTERY_PLUGGED_AC 392a92a01bb0bb458401af90bed5a46d932278160d7Brian Muramatsu || plugged == BatteryManager.BATTERY_PLUGGED_USB 393a92a01bb0bb458401af90bed5a46d932278160d7Brian Muramatsu || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; 394bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 395bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 396bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 397bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Whether or not the device is charged. Note that some devices never return 100% for 398bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * battery level, so this allows either battery level or status to determine if the 399bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * battery is charged. 400bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if the device is charged 401bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 402bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public boolean isCharged() { 403bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return status == BATTERY_STATUS_FULL || level >= 100; 404bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 405bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 406bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 407bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Whether battery is low and needs to be charged. 408bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if battery is low 409bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 410bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public boolean isBatteryLow() { 411bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return level < LOW_BATTERY_THRESHOLD; 412bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 413bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 41416464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller } 41516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 416dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public static KeyguardUpdateMonitor getInstance(Context context) { 417dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (sInstance == null) { 418dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller sInstance = new KeyguardUpdateMonitor(context); 419dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 420dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return sInstance; 421dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 422dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 42320daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller protected void handleScreenTurnedOn() { 42420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller final int count = mCallbacks.size(); 42520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller for (int i = 0; i < count; i++) { 42620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 42720daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller if (cb != null) { 42820daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller cb.onScreenTurnedOn(); 42920daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 43020daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 43120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 43220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 43320daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller protected void handleScreenTurnedOff(int arg1) { 43420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller final int count = mCallbacks.size(); 43520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller for (int i = 0; i < count; i++) { 43620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 43720daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller if (cb != null) { 43820daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller cb.onScreenTurnedOff(arg1); 43920daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 44020daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 44120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 44220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 44343a372f38ad642f86047e8112e3d43edb7300439Adam Powell /** 44443a372f38ad642f86047e8112e3d43edb7300439Adam Powell * IMPORTANT: Must be called from UI thread. 44543a372f38ad642f86047e8112e3d43edb7300439Adam Powell */ 44643a372f38ad642f86047e8112e3d43edb7300439Adam Powell public void dispatchSetBackground(Bitmap bmp) { 44743a372f38ad642f86047e8112e3d43edb7300439Adam Powell if (DEBUG) Log.d(TAG, "dispatchSetBackground"); 44843a372f38ad642f86047e8112e3d43edb7300439Adam Powell final int count = mCallbacks.size(); 44943a372f38ad642f86047e8112e3d43edb7300439Adam Powell for (int i = 0; i < count; i++) { 45043a372f38ad642f86047e8112e3d43edb7300439Adam Powell KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 45143a372f38ad642f86047e8112e3d43edb7300439Adam Powell if (cb != null) { 45243a372f38ad642f86047e8112e3d43edb7300439Adam Powell cb.onSetBackground(bmp); 45343a372f38ad642f86047e8112e3d43edb7300439Adam Powell } 45443a372f38ad642f86047e8112e3d43edb7300439Adam Powell } 45543a372f38ad642f86047e8112e3d43edb7300439Adam Powell } 45643a372f38ad642f86047e8112e3d43edb7300439Adam Powell 4578f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller protected void handleSetGenerationId(int clientGeneration, boolean clearing, PendingIntent p) { 4588f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.clientGeneration = clientGeneration; 4598f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.clearing = clearing; 4608f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.intent = p; 4614894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller if (DEBUG) 4624894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller Log.v(TAG, "handleSetGenerationId(g=" + clientGeneration + ", clear=" + clearing + ")"); 4638f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 4648f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 4658f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller if (cb != null) { 4668f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller cb.onMusicClientIdChanged(clientGeneration, clearing, p); 4678f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4688f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4698f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4708f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 4718f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller protected void handleSetPlaybackState(int generationId, int playbackState, long eventTime) { 4724894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller if (DEBUG) 4734894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller Log.v(TAG, "handleSetPlaybackState(gen=" + generationId 4744894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller + ", state=" + playbackState + ", t=" + eventTime + ")"); 4754894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller mDisplayClientState.playbackState = playbackState; 4764894a016f41f7ccbaf3b2d03395ff6838bb0828cJim Miller mDisplayClientState.playbackEventTime = eventTime; 4778f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller if (generationId == mDisplayClientState.clientGeneration) { 4788f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 4798f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 4808f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller if (cb != null) { 4818f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller cb.onMusicPlaybackStateChanged(playbackState, eventTime); 4828f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4838f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4848f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } else { 4858f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller Log.w(TAG, "Ignoring generation id " + generationId + " because it's not current"); 4868f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4878f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 4888f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 4896fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani private void handleUserInfoChanged(int userId) { 4906fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani for (int i = 0; i < mCallbacks.size(); i++) { 4916fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 4926fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani if (cb != null) { 4936fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani cb.onUserInfoChanged(userId); 4946fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 4956fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 4966fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani } 4976fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani 498dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardUpdateMonitor(Context context) { 4991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 50047088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 501fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); 5021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // Since device can't be un-provisioned, we only need to register a content observer 5031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to update mDeviceProvisioned when we are... 5041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned) { 505bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller watchForDeviceProvisioning(); 5061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 50747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 508bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Take a guess at initial SIM state, battery status and PLMN until we get an update 509bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mSimState = IccCardConstants.State.NOT_READY; 51016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0); 5111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTelephonyPlmn = getDefaultPlmn(); 5121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 513bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Watch for interesting updates 5141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final IntentFilter filter = new IntentFilter(); 5151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIME_TICK); 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIME_CHANGED); 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_BATTERY_CHANGED); 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 5191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 520c23024d32779b170dde32a50fbdd945ce521b874Jim Miller filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 521a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); 52247088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); 523b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 52452c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani filter.addAction(Intent.ACTION_USER_REMOVED); 525bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller context.registerReceiver(mBroadcastReceiver, filter); 5265dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn 527c276e82dd070e75017192507df33958a10cadb87Adam Cohen final IntentFilter bootCompleteFilter = new IntentFilter(); 528c276e82dd070e75017192507df33958a10cadb87Adam Cohen bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 529c276e82dd070e75017192507df33958a10cadb87Adam Cohen bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED); 530c276e82dd070e75017192507df33958a10cadb87Adam Cohen context.registerReceiver(mBroadcastReceiver, bootCompleteFilter); 531c276e82dd070e75017192507df33958a10cadb87Adam Cohen 5326fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani final IntentFilter userInfoFilter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED); 5336fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, userInfoFilter, 5346fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani null, null); 5356fc1d4e8e6549b0d58ea23b4dd3f26329ec19f38Amith Yamasani 5365dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn try { 5375dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn ActivityManagerNative.getDefault().registerUserSwitchObserver( 5385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn new IUserSwitchObserver.Stub() { 5395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn @Override 5405dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn public void onUserSwitching(int newUserId, IRemoteCallback reply) { 541f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING, 5425dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn newUserId, 0, reply)); 543a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna mSwitchingUser = true; 5445dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } 5455dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn @Override 5465dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn public void onUserSwitchComplete(int newUserId) throws RemoteException { 547f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE, 548f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren newUserId)); 549a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna mSwitchingUser = false; 5505dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } 5515dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn }); 5525dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } catch (RemoteException e) { 5535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn // TODO Auto-generated catch block 5545dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn e.printStackTrace(); 5555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } 556bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 557bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 558fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka private boolean isDeviceProvisionedInSettingsDb() { 559fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka return Settings.Global.getInt(mContext.getContentResolver(), 560fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka Settings.Global.DEVICE_PROVISIONED, 0) != 0; 561fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka } 562fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka 563bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private void watchForDeviceProvisioning() { 564fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mDeviceProvisionedObserver = new ContentObserver(mHandler) { 565bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 566bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void onChange(boolean selfChange) { 567bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller super.onChange(selfChange); 568fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); 569bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (mDeviceProvisioned) { 57090873d53fba63afcd15b11008eead07b4c88bba0Jim Miller mHandler.sendEmptyMessage(MSG_DEVICE_PROVISIONED); 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 572bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.d(TAG, "DEVICE_PROVISIONED state = " + mDeviceProvisioned); 573bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 574bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 575bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 576bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mContext.getContentResolver().registerContentObserver( 577bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), 578fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka false, mDeviceProvisionedObserver); 579bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 580bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // prevent a race condition between where we check the flag and where we register the 581bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // observer by grabbing the value once again... 582fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka boolean provisioned = isDeviceProvisionedInSettingsDb(); 583bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (provisioned != mDeviceProvisioned) { 584bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mDeviceProvisioned = provisioned; 585bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (mDeviceProvisioned) { 58690873d53fba63afcd15b11008eead07b4c88bba0Jim Miller mHandler.sendEmptyMessage(MSG_DEVICE_PROVISIONED); 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 588bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 591bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 592bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_DPM_STATE_CHANGED} 593bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 594b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller protected void handleDevicePolicyManagerStateChanged() { 595dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller for (int i = mCallbacks.size() - 1; i >= 0; i--) { 596dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 597dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 598dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onDevicePolicyManagerStateChanged(); 599dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 600b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 601b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 602b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 603bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 604f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren * Handle {@link #MSG_USER_SWITCHING} 605bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 606f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren protected void handleUserSwitching(int userId, IRemoteCallback reply) { 607bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 608dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 609dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 610f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren cb.onUserSwitching(userId); 611dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 61252c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani } 6135dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn try { 6145dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn reply.sendResult(null); 6155dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } catch (RemoteException e) { 6165dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn } 61752c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani } 61852c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani 619bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 620f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren * Handle {@link #MSG_USER_SWITCH_COMPLETE} 621f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren */ 622f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren protected void handleUserSwitchComplete(int userId) { 623f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren for (int i = 0; i < mCallbacks.size(); i++) { 624f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 625f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren if (cb != null) { 626f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren cb.onUserSwitchComplete(userId); 627f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren } 628f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren } 629f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren } 630f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren 631f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren /** 63290873d53fba63afcd15b11008eead07b4c88bba0Jim Miller * This is exposed since {@link Intent#ACTION_BOOT_COMPLETED} is not sticky. If 63390873d53fba63afcd15b11008eead07b4c88bba0Jim Miller * keyguard crashes sometime after boot, then it will never receive this 63490873d53fba63afcd15b11008eead07b4c88bba0Jim Miller * broadcast and hence not handle the event. This method is ultimately called by 63590873d53fba63afcd15b11008eead07b4c88bba0Jim Miller * PhoneWindowManager in this case. 63690873d53fba63afcd15b11008eead07b4c88bba0Jim Miller */ 63790873d53fba63afcd15b11008eead07b4c88bba0Jim Miller protected void dispatchBootCompleted() { 638174236381bfb7c49994667905a6fc6e1b8356a38Jim Miller mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED); 63990873d53fba63afcd15b11008eead07b4c88bba0Jim Miller } 64090873d53fba63afcd15b11008eead07b4c88bba0Jim Miller 64190873d53fba63afcd15b11008eead07b4c88bba0Jim Miller /** 642efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen * Handle {@link #MSG_BOOT_COMPLETED} 643efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen */ 644efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen protected void handleBootCompleted() { 645174236381bfb7c49994667905a6fc6e1b8356a38Jim Miller if (mBootCompleted) return; 6464eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen mBootCompleted = true; 6478f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mAudioManager = new AudioManager(mContext); 6488f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mAudioManager.registerRemoteControlDisplay(mRemoteControlDisplay); 649efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen for (int i = 0; i < mCallbacks.size(); i++) { 650efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 651efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen if (cb != null) { 652efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen cb.onBootCompleted(); 653efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 654efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 655efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen } 656efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen 657efb3ffb029efcc180b3233b6f25d2dba11e28f03Adam Cohen /** 6585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller * We need to store this state in the KeyguardUpdateMonitor since this class will not be 6594eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen * destroyed. 6604eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen */ 6614eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen public boolean hasBootCompleted() { 6624eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen return mBootCompleted; 6634eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen } 6644eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen 6654eb36cfdcabb51f67a887d867de9559966606d86Adam Cohen /** 666f41c61bc1551c98c681fe3e6ae197fefed2bc856Chris Wren * Handle {@link #MSG_USER_REMOVED} 667bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 668bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected void handleUserRemoved(int userId) { 669bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 670dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 671dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 672dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onUserRemoved(userId); 673dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 674bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 675bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 676bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 677bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 678bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_DEVICE_PROVISIONED} 679bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 68024d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly protected void handleDeviceProvisioned() { 681bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 682dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 683dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 684dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onDeviceProvisioned(); 685dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 68624d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 687fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka if (mDeviceProvisionedObserver != null) { 68824d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly // We don't need the observer anymore... 689fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mContext.getContentResolver().unregisterContentObserver(mDeviceProvisionedObserver); 690fff5614caecb0d2944b1bc206aaab0d3acb17670Michael Jurka mDeviceProvisionedObserver = null; 69124d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 69224d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 69324d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly 694bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 695bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_PHONE_STATE_CHANGED} 696bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 697c23024d32779b170dde32a50fbdd945ce521b874Jim Miller protected void handlePhoneStateChanged(String newState) { 698c23024d32779b170dde32a50fbdd945ce521b874Jim Miller if (DEBUG) Log.d(TAG, "handlePhoneStateChanged(" + newState + ")"); 6993f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (TelephonyManager.EXTRA_STATE_IDLE.equals(newState)) { 7003f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_IDLE; 7013f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(newState)) { 7023f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_OFFHOOK; 7033f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(newState)) { 7043f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_RINGING; 7053f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 706bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 707dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 708dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 709dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onPhoneStateChanged(mPhoneState); 710dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 711c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 712c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 713c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 714bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 715bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_RINGER_MODE_CHANGED} 716bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 71747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller protected void handleRingerModeChange(int mode) { 71847088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")"); 7193f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mRingMode = mode; 720bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 721dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 722dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 723dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onRingerModeChanged(mode); 724dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 72547088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller } 72647088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller } 72747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 7281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_TIME_UPDATE} 7301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleTimeUpdate() { 7321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleTimeUpdate"); 733bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 734dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 735dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 736dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onTimeChanged(); 737dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 7381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_BATTERY_UPDATE} 7431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 744bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private void handleBatteryUpdate(BatteryStatus status) { 7451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleBatteryUpdate"); 746bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean batteryUpdateInteresting = isBatteryUpdateInteresting(mBatteryStatus, status); 747bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mBatteryStatus = status; 74816464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (batteryUpdateInteresting) { 749bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 750dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 751dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 752dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onRefreshBatteryInfo(status); 753dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 7541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_CARRIER_INFO_UPDATE} 7601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleCarrierInfoUpdate() { 7621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleCarrierInfoUpdate: plmn = " + mTelephonyPlmn 7631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + ", spn = " + mTelephonySpn); 7641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 765bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 766dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 767dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 768dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); 769dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 7701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 7741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_SIM_STATE_CHANGE} 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleSimStateChange(SimArgs simArgs) { 777a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final IccCardConstants.State state = simArgs.simState; 7781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) { 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.d(TAG, "handleSimStateChange: intentValue = " + simArgs + " " 7811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "state resolved to " + state.toString()); 7821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 784a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (state != IccCardConstants.State.UNKNOWN && state != mSimState) { 7851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimState = state; 786bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 787dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 788dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 789dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onSimStateChanged(state); 790dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 7911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 795bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 796bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_CLOCK_VISIBILITY_CHANGED} 797bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 798054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey private void handleClockVisibilityChanged() { 799054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey if (DEBUG) Log.d(TAG, "handleClockVisibilityChanged()"); 800bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 801dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 802dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (cb != null) { 803dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller cb.onClockVisibilityChanged(); 804dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 805054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 806054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 807054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 808f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett /** 809f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett * Handle {@link #MSG_KEYGUARD_VISIBILITY_CHANGED} 810f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett */ 811f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett private void handleKeyguardVisibilityChanged(int showing) { 812f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett if (DEBUG) Log.d(TAG, "handleKeyguardVisibilityChanged(" + showing + ")"); 8135d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett boolean isShowing = (showing == 1); 8145d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett mKeyguardIsVisible = isShowing; 815f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett for (int i = 0; i < mCallbacks.size(); i++) { 816f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 817f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett if (cb != null) { 8185d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett cb.onKeyguardVisibilityChanged(isShowing); 819f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett } 820f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett } 821f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett } 822f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett 8237fce38021694925295f5d14bfba71f28cba19404Brian Colonna /** 8247fce38021694925295f5d14bfba71f28cba19404Brian Colonna * Handle {@link #MSG_REPORT_EMERGENCY_CALL_ACTION} 8257fce38021694925295f5d14bfba71f28cba19404Brian Colonna */ 8267fce38021694925295f5d14bfba71f28cba19404Brian Colonna private void handleReportEmergencyCallAction() { 8277fce38021694925295f5d14bfba71f28cba19404Brian Colonna for (int i = 0; i < mCallbacks.size(); i++) { 8287fce38021694925295f5d14bfba71f28cba19404Brian Colonna KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); 8297fce38021694925295f5d14bfba71f28cba19404Brian Colonna if (cb != null) { 8307fce38021694925295f5d14bfba71f28cba19404Brian Colonna cb.onEmergencyCallAction(); 8317fce38021694925295f5d14bfba71f28cba19404Brian Colonna } 8327fce38021694925295f5d14bfba71f28cba19404Brian Colonna } 8337fce38021694925295f5d14bfba71f28cba19404Brian Colonna } 8347fce38021694925295f5d14bfba71f28cba19404Brian Colonna 8355d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett public boolean isKeyguardVisible() { 8365d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett return mKeyguardIsVisible; 8375d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett } 8385d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett 839a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna public boolean isSwitchingUser() { 840a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna return mSwitchingUser; 841a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna } 842a5239891dc324db21beb87535f90ea76fba803b9Brian Colonna 84316464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller private static boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus current) { 844bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean nowPluggedIn = current.isPluggedIn(); 845bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean wasPluggedIn = old.isPluggedIn(); 84679a444a0cd78bc6528e19336a0d49ef4a17b263cJim Miller final boolean stateChangedWhilePluggedIn = 84716464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller wasPluggedIn == true && nowPluggedIn == true 84816464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller && (old.status != current.status); 84916464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 85016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller // change in plug state is always interesting 85116464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) { 8521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 8531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // change in battery level while plugged in 85616464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (nowPluggedIn && old.level != current.level) { 8571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 8581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 86016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller // change where battery needs charging 861bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (!nowPluggedIn && current.isBatteryLow() && current.level != old.level) { 86216464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller return true; 8631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 8651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 868a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville * @param intent The intent with action {@link TelephonyIntents#SPN_STRINGS_UPDATED_ACTION} 8691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The string to use for the plmn, or null if it should not be shown. 8701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getTelephonyPlmnFrom(Intent intent) { 872a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false)) { 873a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final String plmn = intent.getStringExtra(TelephonyIntents.EXTRA_PLMN); 874bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return (plmn != null) ? plmn : getDefaultPlmn(); 8751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return null; 8771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The default plmn (no service) 8811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getDefaultPlmn() { 8835ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller return mContext.getResources().getText(R.string.keyguard_carrier_default); 8841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 8871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param intent The intent with action {@link Telephony.Intents#SPN_STRINGS_UPDATED_ACTION} 8881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The string to use for the plmn, or null if it should not be shown. 8891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 8901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getTelephonySpnFrom(Intent intent) { 891a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false)) { 892a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final String spn = intent.getStringExtra(TelephonyIntents.EXTRA_SPN); 8931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (spn != null) { 8941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return spn; 8951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return null; 8981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 901bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Remove the given observer's callback. 902bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * 9036212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller * @param callback The callback to remove 9041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9056212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller public void removeCallback(KeyguardUpdateMonitorCallback callback) { 9066212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller if (DEBUG) Log.v(TAG, "*** unregister callback for " + callback); 9076212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller for (int i = mCallbacks.size() - 1; i >= 0; i--) { 9086212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller if (mCallbacks.get(i).get() == callback) { 9096212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller mCallbacks.remove(i); 9106212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller } 9116212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller } 9121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 9151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Register to receive notifications about general keyguard information 9161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * (see {@link InfoCallback}. 9176212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller * @param callback The callback to register 9181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 919bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void registerCallback(KeyguardUpdateMonitorCallback callback) { 9206212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller if (DEBUG) Log.v(TAG, "*** register callback for " + callback); 9216212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller // Prevent adding duplicate callbacks 9226212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 9236212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller if (mCallbacks.get(i).get() == callback) { 9246212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller if (DEBUG) Log.e(TAG, "Object tried to add another callback", 9256212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller new Exception("Called by")); 9266212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller return; 927dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 928dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 9296212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller mCallbacks.add(new WeakReference<KeyguardUpdateMonitorCallback>(callback)); 9306212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller removeCallback(null); // remove unused references 9316212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller sendUpdates(callback); 9326212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller } 9336212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller 9346212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller private void sendUpdates(KeyguardUpdateMonitorCallback callback) { 9356212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller // Notify listener of the current state 9366212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onRefreshBatteryInfo(mBatteryStatus); 9376212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onTimeChanged(); 9386212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onRingerModeChanged(mRingMode); 9396212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onPhoneStateChanged(mPhoneState); 9406212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); 9416212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onClockVisibilityChanged(); 9426212cc0d3f59139421ceeaf630f6494239d81cd1Jim Miller callback.onSimStateChanged(mSimState); 9438f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller callback.onMusicClientIdChanged( 9448f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.clientGeneration, 9458f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.clearing, 9468f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.intent); 9478f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller callback.onMusicPlaybackStateChanged(mDisplayClientState.playbackState, 9488f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller mDisplayClientState.playbackEventTime); 9491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 951f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett public void sendKeyguardVisibilityChanged(boolean showing) { 952f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett if (DEBUG) Log.d(TAG, "sendKeyguardVisibilityChanged(" + showing + ")"); 953f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett Message message = mHandler.obtainMessage(MSG_KEYGUARD_VISIBILITY_CHANGED); 954f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett message.arg1 = showing ? 1 : 0; 955f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett message.sendToTarget(); 956f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett } 957f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett 958054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey public void reportClockVisible(boolean visible) { 959054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey mClockVisible = visible; 960054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey mHandler.obtainMessage(MSG_CLOCK_VISIBILITY_CHANGED).sendToTarget(); 961054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 962054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 963a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville public IccCardConstants.State getSimState() { 9641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mSimState; 9651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 96890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * Report that the user successfully entered the SIM PIN or PUK/SIM PIN so we 9691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * have the information earlier than waiting for the intent 9701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * broadcast from the telephony code. 97190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * 97290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * NOTE: Because handleSimStateChange() invokes callbacks immediately without going 97390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * through mHandler, this *must* be called from the UI thread. 9741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 9750f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang public void reportSimUnlocked() { 976a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville handleSimStateChange(new SimArgs(IccCardConstants.State.READY)); 9771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9797fce38021694925295f5d14bfba71f28cba19404Brian Colonna /** 9807fce38021694925295f5d14bfba71f28cba19404Brian Colonna * Report that the emergency call button has been pressed and the emergency dialer is 9817fce38021694925295f5d14bfba71f28cba19404Brian Colonna * about to be displayed. 9827fce38021694925295f5d14bfba71f28cba19404Brian Colonna * 9837fce38021694925295f5d14bfba71f28cba19404Brian Colonna * @param bypassHandler runs immediately. 9847fce38021694925295f5d14bfba71f28cba19404Brian Colonna * 9857fce38021694925295f5d14bfba71f28cba19404Brian Colonna * NOTE: Must be called from UI thread if bypassHandler == true. 9867fce38021694925295f5d14bfba71f28cba19404Brian Colonna */ 9877fce38021694925295f5d14bfba71f28cba19404Brian Colonna public void reportEmergencyCallAction(boolean bypassHandler) { 9887fce38021694925295f5d14bfba71f28cba19404Brian Colonna if (!bypassHandler) { 9897fce38021694925295f5d14bfba71f28cba19404Brian Colonna mHandler.obtainMessage(MSG_REPORT_EMERGENCY_CALL_ACTION).sendToTarget(); 9907fce38021694925295f5d14bfba71f28cba19404Brian Colonna } else { 9917fce38021694925295f5d14bfba71f28cba19404Brian Colonna handleReportEmergencyCallAction(); 9927fce38021694925295f5d14bfba71f28cba19404Brian Colonna } 9937fce38021694925295f5d14bfba71f28cba19404Brian Colonna } 9947fce38021694925295f5d14bfba71f28cba19404Brian Colonna 9951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public CharSequence getTelephonyPlmn() { 9961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mTelephonyPlmn; 9971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 9981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 9991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public CharSequence getTelephonySpn() { 10001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mTelephonySpn; 10011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 10031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 10041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether the device is provisioned (whether they have gone through 10051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the setup wizard) 10061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 10071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isDeviceProvisioned() { 10081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mDeviceProvisioned; 10091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1011258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public int getFailedUnlockAttempts() { 10121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mFailedAttempts; 10131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1015258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void clearFailedUnlockAttempts() { 10161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFailedAttempts = 0; 1017ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna mFailedBiometricUnlockAttempts = 0; 10181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1020258341c377b6aa9f1bd29a9b507a97967e432dfeJim Miller public void reportFailedUnlockAttempt() { 10211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFailedAttempts++; 10221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 10231c18828d20807342d37000746b18a3c1696f3b2eJim Miller 1024054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey public boolean isClockVisible() { 1025054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey return mClockVisible; 1026054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 1027054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 1028267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna public int getPhoneState() { 1029267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna return mPhoneState; 1030267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna } 1031b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross 1032ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna public void reportFailedBiometricUnlockAttempt() { 1033ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna mFailedBiometricUnlockAttempts++; 1034b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross } 1035b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross 1036ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna public boolean getMaxBiometricUnlockAttemptsReached() { 1037ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna return mFailedBiometricUnlockAttempts >= FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP; 1038b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross } 1039b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 10400ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller public boolean isAlternateUnlockEnabled() { 10410ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller return mAlternateUnlockEnabled; 1042cc4104fd71225ed092f16b11882d9a10084e34acBrian Colonna } 1043cc4104fd71225ed092f16b11882d9a10084e34acBrian Colonna 10440ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller public void setAlternateUnlockEnabled(boolean enabled) { 10450ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller mAlternateUnlockEnabled = enabled; 1046cc4104fd71225ed092f16b11882d9a10084e34acBrian Colonna } 1047cc4104fd71225ed092f16b11882d9a10084e34acBrian Colonna 1048b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller public boolean isSimLocked() { 1049dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return isSimLocked(mSimState); 1050dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1051dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1052dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public static boolean isSimLocked(IccCardConstants.State state) { 1053dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return state == IccCardConstants.State.PIN_REQUIRED 1054dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || state == IccCardConstants.State.PUK_REQUIRED 1055dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || state == IccCardConstants.State.PERM_DISABLED; 1056dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1057dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1058dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean isSimPinSecure() { 1059dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return isSimPinSecure(mSimState); 1060dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1061dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1062dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public static boolean isSimPinSecure(IccCardConstants.State state) { 1063dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final IccCardConstants.State simState = state; 1064dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return (simState == IccCardConstants.State.PIN_REQUIRED 1065dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || simState == IccCardConstants.State.PUK_REQUIRED 1066dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller || simState == IccCardConstants.State.PERM_DISABLED); 1067b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 10688f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller 10698f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller public DisplayClientState getCachedDisplayClientState() { 10708f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller return mDisplayClientState; 10718f09fd2e3123c7713d50886dc3745d330a1879c5Jim Miller } 107220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 107320daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller // TODO: use these callbacks elsewhere in place of the existing notifyScreen*() 107420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller // (KeyguardViewMediator, KeyguardHostView) 107520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller public void dispatchScreenTurnedOn() { 107620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller synchronized (this) { 107720daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller mScreenOn = true; 107820daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 107920daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON); 108020daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 108120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 108220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller public void dispatchScreenTurndOff(int why) { 108320daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller synchronized(this) { 108420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller mScreenOn = false; 108520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 108620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREEN_TURNED_OFF, why, 0)); 108720daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 108820daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller 108920daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller public boolean isScreenOn() { 109020daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller return mScreenOn; 109120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller } 10921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 1093