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