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 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard_obsolete; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 19b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport android.app.admin.DevicePolicyManager; 201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.database.ContentObserver; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport static android.os.BatteryManager.BATTERY_STATUS_FULL; 261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; 2716464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN; 2816464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_STATUS; 2916464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_PLUGGED; 3016464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_LEVEL; 3116464b8e55020a4d77a8e5e4673db974e749dc82Jim Millerimport static android.os.BatteryManager.EXTRA_HEALTH; 3247088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Millerimport android.media.AudioManager; 3379a444a0cd78bc6528e19336a0d49ef4a17b263cJim Millerimport android.os.BatteryManager; 341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.provider.Settings; 37a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 38a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.IccCardConstants; 391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.telephony.TelephonyIntents; 40c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 41c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport android.telephony.TelephonyManager; 421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log; 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R; 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.google.android.collect.Lists; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport java.util.ArrayList; 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Watches for updates that may be interesting to the keyguard, and provides 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the up to date information as well as a registration for callbacks that care 511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * to be updated. 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Note: under time crunch, this has been extended to include some stuff that 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * doesn't really belong here. see {@link #handleBatteryUpdate} where it shutdowns 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the device, and {@link #getFailedAttempts()}, {@link #reportFailedAttempt()} 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and {@link #clearFailedAttempts()}. Maybe we should rename this 'KeyguardContext'... 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class KeyguardUpdateMonitor { 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 60bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final String TAG = "KeyguardUpdateMonitor"; 61bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final boolean DEBUG = false; 62bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final boolean DEBUG_SIM_STATES = DEBUG || false; 63bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP = 3; 64bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int LOW_BATTERY_THRESHOLD = 20; 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 66bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Callback messages 67bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_TIME_UPDATE = 301; 68bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_BATTERY_UPDATE = 302; 69bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_CARRIER_INFO_UPDATE = 303; 70bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_SIM_STATE_CHANGE = 304; 71bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_RINGER_MODE_CHANGED = 305; 72bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_PHONE_STATE_CHANGED = 306; 73bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_CLOCK_VISIBILITY_CHANGED = 307; 74bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private static final int MSG_DEVICE_PROVISIONED = 308; 75bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected static final int MSG_DPM_STATE_CHANGED = 309; 76bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected static final int MSG_USER_SWITCHED = 310; 77bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected static final int MSG_USER_REMOVED = 311; 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final Context mContext; 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 81bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Telephony state 82a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville private IccCardConstants.State mSimState = IccCardConstants.State.READY; 83bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private CharSequence mTelephonyPlmn; 84bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private CharSequence mTelephonySpn; 85bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private int mRingMode; 86bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private int mPhoneState; 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mDeviceProvisioned; 8947088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 9016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller private BatteryStatus mBatteryStatus; 9179a444a0cd78bc6528e19336a0d49ef4a17b263cJim Miller 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mFailedAttempts = 0; 93ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna private int mFailedBiometricUnlockAttempts = 0; 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 95054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey private boolean mClockVisible; 96054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 97bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private ArrayList<KeyguardUpdateMonitorCallback> mCallbacks = Lists.newArrayList(); 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ContentObserver mContentObserver; 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 100bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private final Handler mHandler = new Handler() { 101bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 102bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void handleMessage(Message msg) { 103bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller switch (msg.what) { 104bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_TIME_UPDATE: 105bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleTimeUpdate(); 106bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 107bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_BATTERY_UPDATE: 108bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleBatteryUpdate((BatteryStatus) msg.obj); 109bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 110bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_CARRIER_INFO_UPDATE: 111bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleCarrierInfoUpdate(); 112bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 113bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_SIM_STATE_CHANGE: 114bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleSimStateChange((SimArgs) msg.obj); 115bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 116bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_RINGER_MODE_CHANGED: 117bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleRingerModeChange(msg.arg1); 118bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 119bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_PHONE_STATE_CHANGED: 120bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handlePhoneStateChanged((String)msg.obj); 121bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 122bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_CLOCK_VISIBILITY_CHANGED: 123bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleClockVisibilityChanged(); 124bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 125bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_DEVICE_PROVISIONED: 126bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleDeviceProvisioned(); 127bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 128bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_DPM_STATE_CHANGED: 129bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleDevicePolicyManagerStateChanged(); 130bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 131bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_USER_SWITCHED: 132bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleUserSwitched(msg.arg1); 133bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 134bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller case MSG_USER_REMOVED: 135bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller handleUserRemoved(msg.arg1); 136bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller break; 137bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 138bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 139bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 140bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 141bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 142bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 143bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void onReceive(Context context, Intent intent) { 144bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final String action = intent.getAction(); 145bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.d(TAG, "received broadcast " + action); 146bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 147bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (Intent.ACTION_TIME_TICK.equals(action) 148bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller || Intent.ACTION_TIME_CHANGED.equals(action) 149bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { 150bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_TIME_UPDATE)); 151bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyIntents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 152bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mTelephonyPlmn = getTelephonyPlmnFrom(intent); 153bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mTelephonySpn = getTelephonySpnFrom(intent); 154bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_CARRIER_INFO_UPDATE)); 155bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 156bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int status = intent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN); 157bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int plugged = intent.getIntExtra(EXTRA_PLUGGED, 0); 158bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int level = intent.getIntExtra(EXTRA_LEVEL, 0); 159bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final int health = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN); 160bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final Message msg = mHandler.obtainMessage( 161bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller MSG_BATTERY_UPDATE, new BatteryStatus(status, level, plugged, health)); 162bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(msg); 163bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { 164bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG_SIM_STATES) { 165bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller Log.v(TAG, "action " + action + " state" + 166bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)); 167bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 168bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage( 169bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller MSG_SIM_STATE_CHANGE, SimArgs.fromIntent(intent))); 170bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { 171bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED, 172bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0)); 173bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) { 174bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 175bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_PHONE_STATE_CHANGED, state)); 176bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED 177bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller .equals(action)) { 178bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_DPM_STATE_CHANGED)); 179bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { 180bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHED, 1812a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0)); 182bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } else if (Intent.ACTION_USER_REMOVED.equals(action)) { 183bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_REMOVED, 1842a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0)); 185bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 186bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 187bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 1882de5ee84636739dc82a4c4dda76666bf38cf281cJim Miller 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 19047088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * When we receive a 19147088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast, 19237c124c3fa3078af98c0ebd3e52c9a4ca477a767Wink Saville * and then pass a result via our handler to {@link KeyguardUpdateMonitor#handleSimStateChange}, 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we need a single object to pass to the handler. This class helps decode 19447088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller * the intent and provide a {@link SimCard.State} result. 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static class SimArgs { 197a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville public final IccCardConstants.State simState; 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 199a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville SimArgs(IccCardConstants.State state) { 20090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller simState = state; 20190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } 20290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller 20390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller static SimArgs fromIntent(Intent intent) { 204a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville IccCardConstants.State state; 2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) { 2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project throw new IllegalArgumentException("only handles intent ACTION_SIM_STATE_CHANGED"); 2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 208a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); 209a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) { 210b0b24b3df50988d23f571b83d829fecc986ec497John Wang final String absentReason = intent 211a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON); 212b0b24b3df50988d23f571b83d829fecc986ec497John Wang 213a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals( 214b0b24b3df50988d23f571b83d829fecc986ec497John Wang absentReason)) { 215a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PERM_DISABLED; 216b0b24b3df50988d23f571b83d829fecc986ec497John Wang } else { 217a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.ABSENT; 218b0b24b3df50988d23f571b83d829fecc986ec497John Wang } 219a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) { 220a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.READY; 221a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) { 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final String lockedReason = intent 223a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON); 224a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) { 225a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PIN_REQUIRED; 226a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) { 227a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.PUK_REQUIRED; 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 229a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.UNKNOWN; 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 231a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } else if (IccCardConstants.INTENT_VALUE_LOCKED_NETWORK.equals(stateExtra)) { 232a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.NETWORK_LOCKED; 2331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 234a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville state = IccCardConstants.State.UNKNOWN; 2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 23690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller return new SimArgs(state); 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public String toString() { 2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return simState.toString(); 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 244bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /* package */ static class BatteryStatus { 24516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int status; 24616464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int level; 24716464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int plugged; 24816464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public final int health; 24916464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller public BatteryStatus(int status, int level, int plugged, int health) { 25016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.status = status; 25116464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.level = level; 25216464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.plugged = plugged; 25316464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller this.health = health; 25416464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller } 25516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 256bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 257bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Determine whether the device is plugged in (USB or power). 258bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if the device is plugged in. 259bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 260bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller boolean isPluggedIn() { 261bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return plugged == BatteryManager.BATTERY_PLUGGED_AC 26237a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu || plugged == BatteryManager.BATTERY_PLUGGED_USB 26337a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; 264bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 265bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 266bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 267bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Whether or not the device is charged. Note that some devices never return 100% for 268bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * battery level, so this allows either battery level or status to determine if the 269bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * battery is charged. 270bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if the device is charged 271bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 272bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public boolean isCharged() { 273bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return status == BATTERY_STATUS_FULL || level >= 100; 274bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 275bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 276bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 277bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Whether battery is low and needs to be charged. 278bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @return true if battery is low 279bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 280bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public boolean isBatteryLow() { 281bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return level < LOW_BATTERY_THRESHOLD; 282bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 283bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 28416464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller } 28516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 2861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public KeyguardUpdateMonitor(Context context) { 2871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 28847088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 289bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown mDeviceProvisioned = Settings.Global.getInt( 290bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0; 29147088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // Since device can't be un-provisioned, we only need to register a content observer 2931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // to update mDeviceProvisioned when we are... 2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned) { 295bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller watchForDeviceProvisioning(); 2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 29747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 298bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Take a guess at initial SIM state, battery status and PLMN until we get an update 299bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mSimState = IccCardConstants.State.NOT_READY; 30016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0); 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTelephonyPlmn = getDefaultPlmn(); 3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 303bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // Watch for interesting updates 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final IntentFilter filter = new IntentFilter(); 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIME_TICK); 3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIME_CHANGED); 3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_BATTERY_CHANGED); 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 310c23024d32779b170dde32a50fbdd945ce521b874Jim Miller filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 311a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); 31247088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); 313b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 31452c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani filter.addAction(Intent.ACTION_USER_SWITCHED); 31552c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani filter.addAction(Intent.ACTION_USER_REMOVED); 316bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller context.registerReceiver(mBroadcastReceiver, filter); 317bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 318bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 319bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private void watchForDeviceProvisioning() { 320bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mContentObserver = new ContentObserver(mHandler) { 321bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller @Override 322bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void onChange(boolean selfChange) { 323bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller super.onChange(selfChange); 324bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown mDeviceProvisioned = Settings.Global.getInt(mContext.getContentResolver(), 325bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown Settings.Global.DEVICE_PROVISIONED, 0) != 0; 326bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (mDeviceProvisioned) { 327bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_DEVICE_PROVISIONED)); 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 329bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.d(TAG, "DEVICE_PROVISIONED state = " + mDeviceProvisioned); 330bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 331bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller }; 332bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 333bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mContext.getContentResolver().registerContentObserver( 334bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), 335bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller false, mContentObserver); 336bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 337bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // prevent a race condition between where we check the flag and where we register the 338bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller // observer by grabbing the value once again... 339bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown boolean provisioned = Settings.Global.getInt(mContext.getContentResolver(), 340bf6f6f9de72c9fd15e6bda9f228c05a9b37d6324Jeff Brown Settings.Global.DEVICE_PROVISIONED, 0) != 0; 341bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (provisioned != mDeviceProvisioned) { 342bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mDeviceProvisioned = provisioned; 343bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (mDeviceProvisioned) { 344bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_DEVICE_PROVISIONED)); 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 346bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 349bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 350bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_DPM_STATE_CHANGED} 351bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 352b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller protected void handleDevicePolicyManagerStateChanged() { 353bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 354bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onDevicePolicyManagerStateChanged(); 355b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 356b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 357b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 358bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 359bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_USER_SWITCHED} 360bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 361bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected void handleUserSwitched(int userId) { 362bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 363bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onUserSwitched(userId); 36452c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani } 36552c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani } 36652c489cd63cca0361f374f7cb392018fabfa8bccAmith Yamasani 367bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 368bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_USER_SWITCHED} 369bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 370bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller protected void handleUserRemoved(int userId) { 371bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 372bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onUserRemoved(userId); 373bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 374bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller } 375bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller 376bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 377bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_DEVICE_PROVISIONED} 378bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 37924d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly protected void handleDeviceProvisioned() { 380bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 381bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onDeviceProvisioned(); 38224d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 38324d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly if (mContentObserver != null) { 38424d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly // We don't need the observer anymore... 38524d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly mContext.getContentResolver().unregisterContentObserver(mContentObserver); 38624d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly mContentObserver = null; 38724d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 38824d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 38924d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly 390bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 391bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_PHONE_STATE_CHANGED} 392bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 393c23024d32779b170dde32a50fbdd945ce521b874Jim Miller protected void handlePhoneStateChanged(String newState) { 394c23024d32779b170dde32a50fbdd945ce521b874Jim Miller if (DEBUG) Log.d(TAG, "handlePhoneStateChanged(" + newState + ")"); 3953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (TelephonyManager.EXTRA_STATE_IDLE.equals(newState)) { 3963f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_IDLE; 3973f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(newState)) { 3983f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_OFFHOOK; 3993f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(newState)) { 4003f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPhoneState = TelephonyManager.CALL_STATE_RINGING; 4013f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 402bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 403bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onPhoneStateChanged(mPhoneState); 404c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 405c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 406c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 407bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 408bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_RINGER_MODE_CHANGED} 409bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 41047088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller protected void handleRingerModeChange(int mode) { 41147088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")"); 4123f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mRingMode = mode; 413bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 414bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onRingerModeChanged(mode); 41547088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller } 41647088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller } 41747088bbbef61e3bd8d2930f4a2b72884129b5bd5Jim Miller 4181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_TIME_UPDATE} 4201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleTimeUpdate() { 4221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleTimeUpdate"); 423bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 424bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onTimeChanged(); 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_BATTERY_UPDATE} 4301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 431bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller private void handleBatteryUpdate(BatteryStatus status) { 4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleBatteryUpdate"); 433bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean batteryUpdateInteresting = isBatteryUpdateInteresting(mBatteryStatus, status); 434bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mBatteryStatus = status; 43516464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (batteryUpdateInteresting) { 436bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 437bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onRefreshBatteryInfo(status); 4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_CARRIER_INFO_UPDATE} 4441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleCarrierInfoUpdate() { 4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) Log.d(TAG, "handleCarrierInfoUpdate: plmn = " + mTelephonyPlmn 4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + ", spn = " + mTelephonySpn); 4481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 449bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 450bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); 4511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Handle {@link #MSG_SIM_STATE_CHANGE} 4561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void handleSimStateChange(SimArgs simArgs) { 458a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final IccCardConstants.State state = simArgs.simState; 4591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (DEBUG) { 4611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.d(TAG, "handleSimStateChange: intentValue = " + simArgs + " " 4621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + "state resolved to " + state.toString()); 4631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 465a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (state != IccCardConstants.State.UNKNOWN && state != mSimState) { 4661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimState = state; 467bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 468bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onSimStateChanged(state); 4691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 473bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller /** 474bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Handle {@link #MSG_CLOCK_VISIBILITY_CHANGED} 475bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller */ 476054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey private void handleClockVisibilityChanged() { 477054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey if (DEBUG) Log.d(TAG, "handleClockVisibilityChanged()"); 478bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller for (int i = 0; i < mCallbacks.size(); i++) { 479bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.get(i).onClockVisibilityChanged(); 480054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 481054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 482054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 48316464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller private static boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus current) { 484bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean nowPluggedIn = current.isPluggedIn(); 485bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller final boolean wasPluggedIn = old.isPluggedIn(); 48679a444a0cd78bc6528e19336a0d49ef4a17b263cJim Miller final boolean stateChangedWhilePluggedIn = 48716464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller wasPluggedIn == true && nowPluggedIn == true 48816464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller && (old.status != current.status); 48916464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller 49016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller // change in plug state is always interesting 49116464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) { 4921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 4931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // change in battery level while plugged in 49616464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller if (nowPluggedIn && old.level != current.level) { 4971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 4981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 50016464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller // change where battery needs charging 501bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (!nowPluggedIn && current.isBatteryLow() && current.level != old.level) { 50216464b8e55020a4d77a8e5e4673db974e749dc82Jim Miller return true; 5031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 5051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 508a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville * @param intent The intent with action {@link TelephonyIntents#SPN_STRINGS_UPDATED_ACTION} 5091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The string to use for the plmn, or null if it should not be shown. 5101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getTelephonyPlmnFrom(Intent intent) { 512a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false)) { 513a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final String plmn = intent.getStringExtra(TelephonyIntents.EXTRA_PLMN); 514bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return (plmn != null) ? plmn : getDefaultPlmn(); 5151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return null; 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The default plmn (no service) 5211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getDefaultPlmn() { 523bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller return mContext.getResources().getText(R.string.lockscreen_carrier_default); 5241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param intent The intent with action {@link Telephony.Intents#SPN_STRINGS_UPDATED_ACTION} 5281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return The string to use for the plmn, or null if it should not be shown. 5291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private CharSequence getTelephonySpnFrom(Intent intent) { 531a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false)) { 532a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville final String spn = intent.getStringExtra(TelephonyIntents.EXTRA_SPN); 5331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (spn != null) { 5341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return spn; 5351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return null; 5381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 541bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * Remove the given observer's callback. 542bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * 543bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller * @param observer The observer to remove 5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void removeCallback(Object observer) { 546bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.remove(observer); 5471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Register to receive notifications about general keyguard information 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * (see {@link InfoCallback}. 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param callback The callback. 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 554bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller public void registerCallback(KeyguardUpdateMonitorCallback callback) { 555bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (!mCallbacks.contains(callback)) { 556bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller mCallbacks.add(callback); 5573f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller // Notify listener of the current state 558bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller callback.onRefreshBatteryInfo(mBatteryStatus); 5593f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller callback.onTimeChanged(); 5603f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller callback.onRingerModeChanged(mRingMode); 5613f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller callback.onPhoneStateChanged(mPhoneState); 56261e159504a49cd283fea1658beaa758a3d3e0a99John Wang callback.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); 563305c78cce649056643641c51f12f2b6d2eb839f3Jim Miller callback.onClockVisibilityChanged(); 56461e159504a49cd283fea1658beaa758a3d3e0a99John Wang callback.onSimStateChanged(mSimState); 56542b432d84cd3bf860a03a10e9191738e05f2eaddJim Miller } else { 566bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller if (DEBUG) Log.e(TAG, "Object tried to add another callback", 567bbf1a743186e8e62c3918971344e8bff3dfaa737Jim Miller new Exception("Called by")); 56842b432d84cd3bf860a03a10e9191738e05f2eaddJim Miller } 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 571054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey public void reportClockVisible(boolean visible) { 572054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey mClockVisible = visible; 573054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey mHandler.obtainMessage(MSG_CLOCK_VISIBILITY_CHANGED).sendToTarget(); 574054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 575054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 576a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville public IccCardConstants.State getSimState() { 5771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mSimState; 5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 58190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * Report that the user successfully entered the SIM PIN or PUK/SIM PIN so we 5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * have the information earlier than waiting for the intent 5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * broadcast from the telephony code. 58490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * 58590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * NOTE: Because handleSimStateChange() invokes callbacks immediately without going 58690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller * through mHandler, this *must* be called from the UI thread. 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5880f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang public void reportSimUnlocked() { 589a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville handleSimStateChange(new SimArgs(IccCardConstants.State.READY)); 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public CharSequence getTelephonyPlmn() { 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mTelephonyPlmn; 5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public CharSequence getTelephonySpn() { 5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mTelephonySpn; 5981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return Whether the device is provisioned (whether they have gone through 6021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the setup wizard) 6031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isDeviceProvisioned() { 6051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mDeviceProvisioned; 6061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public int getFailedAttempts() { 6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mFailedAttempts; 6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void clearFailedAttempts() { 6131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFailedAttempts = 0; 614ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna mFailedBiometricUnlockAttempts = 0; 6151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void reportFailedAttempt() { 6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFailedAttempts++; 6191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6201c18828d20807342d37000746b18a3c1696f3b2eJim Miller 621054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey public boolean isClockVisible() { 622054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey return mClockVisible; 623054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 624054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 625267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna public int getPhoneState() { 626267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna return mPhoneState; 627267cb2b284626f910cf64352bfc494d0f8d3dc42Brian Colonna } 628b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross 629ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna public void reportFailedBiometricUnlockAttempt() { 630ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna mFailedBiometricUnlockAttempts++; 631b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross } 632b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross 633ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna public boolean getMaxBiometricUnlockAttemptsReached() { 634ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna return mFailedBiometricUnlockAttempts >= FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP; 635b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross } 636b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller 637b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller public boolean isSimLocked() { 638a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville return mSimState == IccCardConstants.State.PIN_REQUIRED 639a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville || mSimState == IccCardConstants.State.PUK_REQUIRED 640a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville || mSimState == IccCardConstants.State.PERM_DISABLED; 641b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller } 6421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 643