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