• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.keyguard;
18 
19 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
20 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
21 import static android.content.Intent.ACTION_USER_UNLOCKED;
22 import static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN;
23 import static android.os.BatteryManager.BATTERY_STATUS_FULL;
24 import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
25 import static android.os.BatteryManager.EXTRA_HEALTH;
26 import static android.os.BatteryManager.EXTRA_LEVEL;
27 import static android.os.BatteryManager.EXTRA_MAX_CHARGING_CURRENT;
28 import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE;
29 import static android.os.BatteryManager.EXTRA_PLUGGED;
30 import static android.os.BatteryManager.EXTRA_STATUS;
31 
32 import android.annotation.AnyThread;
33 import android.annotation.MainThread;
34 import android.app.ActivityManager;
35 import android.app.ActivityTaskManager;
36 import android.app.AlarmManager;
37 import android.app.Instrumentation;
38 import android.app.PendingIntent;
39 import android.app.UserSwitchObserver;
40 import android.app.admin.DevicePolicyManager;
41 import android.app.trust.TrustManager;
42 import android.content.BroadcastReceiver;
43 import android.content.ComponentName;
44 import android.content.Context;
45 import android.content.Intent;
46 import android.content.IntentFilter;
47 import android.content.pm.IPackageManager;
48 import android.content.pm.PackageManager;
49 import android.content.pm.ResolveInfo;
50 import android.database.ContentObserver;
51 import android.hardware.biometrics.BiometricManager;
52 import android.hardware.biometrics.BiometricSourceType;
53 import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
54 import android.hardware.face.FaceManager;
55 import android.hardware.fingerprint.FingerprintManager;
56 import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
57 import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
58 import android.media.AudioManager;
59 import android.os.BatteryManager;
60 import android.os.CancellationSignal;
61 import android.os.Handler;
62 import android.os.IRemoteCallback;
63 import android.os.Looper;
64 import android.os.Message;
65 import android.os.RemoteException;
66 import android.os.ServiceManager;
67 import android.os.Trace;
68 import android.os.UserHandle;
69 import android.os.UserManager;
70 import android.provider.Settings;
71 import android.service.dreams.DreamService;
72 import android.service.dreams.IDreamManager;
73 import android.telephony.ServiceState;
74 import android.telephony.SubscriptionInfo;
75 import android.telephony.SubscriptionManager;
76 import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
77 import android.telephony.TelephonyManager;
78 import android.util.Log;
79 import android.util.SparseBooleanArray;
80 
81 import com.android.internal.annotations.VisibleForTesting;
82 import com.android.internal.telephony.IccCardConstants;
83 import com.android.internal.telephony.IccCardConstants.State;
84 import com.android.internal.telephony.PhoneConstants;
85 import com.android.internal.telephony.TelephonyIntents;
86 import com.android.internal.util.Preconditions;
87 import com.android.internal.widget.LockPatternUtils;
88 import com.android.settingslib.WirelessUtils;
89 import com.android.systemui.shared.system.ActivityManagerWrapper;
90 import com.android.systemui.shared.system.TaskStackChangeListener;
91 
92 import com.google.android.collect.Lists;
93 
94 import java.io.FileDescriptor;
95 import java.io.PrintWriter;
96 import java.lang.ref.WeakReference;
97 import java.util.ArrayList;
98 import java.util.HashMap;
99 import java.util.List;
100 import java.util.Map.Entry;
101 import java.util.TimeZone;
102 import java.util.function.Consumer;
103 
104 /**
105  * Watches for updates that may be interesting to the keyguard, and provides
106  * the up to date information as well as a registration for callbacks that care
107  * to be updated.
108  */
109 public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
110 
111     private static final String TAG = "KeyguardUpdateMonitor";
112     private static final boolean DEBUG = KeyguardConstants.DEBUG;
113     private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES;
114     private static final int LOW_BATTERY_THRESHOLD = 20;
115 
116     private static final String ACTION_FACE_UNLOCK_STARTED
117             = "com.android.facelock.FACE_UNLOCK_STARTED";
118     private static final String ACTION_FACE_UNLOCK_STOPPED
119             = "com.android.facelock.FACE_UNLOCK_STOPPED";
120 
121     // Callback messages
122     private static final int MSG_TIME_UPDATE = 301;
123     private static final int MSG_BATTERY_UPDATE = 302;
124     private static final int MSG_SIM_STATE_CHANGE = 304;
125     private static final int MSG_RINGER_MODE_CHANGED = 305;
126     private static final int MSG_PHONE_STATE_CHANGED = 306;
127     private static final int MSG_DEVICE_PROVISIONED = 308;
128     private static final int MSG_DPM_STATE_CHANGED = 309;
129     private static final int MSG_USER_SWITCHING = 310;
130     private static final int MSG_KEYGUARD_RESET = 312;
131     private static final int MSG_BOOT_COMPLETED = 313;
132     private static final int MSG_USER_SWITCH_COMPLETE = 314;
133     private static final int MSG_USER_INFO_CHANGED = 317;
134     private static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318;
135     private static final int MSG_STARTED_WAKING_UP = 319;
136     private static final int MSG_FINISHED_GOING_TO_SLEEP = 320;
137     private static final int MSG_STARTED_GOING_TO_SLEEP = 321;
138     private static final int MSG_KEYGUARD_BOUNCER_CHANGED = 322;
139     private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327;
140     private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328;
141     private static final int MSG_AIRPLANE_MODE_CHANGED = 329;
142     private static final int MSG_SERVICE_STATE_CHANGE = 330;
143     private static final int MSG_SCREEN_TURNED_ON = 331;
144     private static final int MSG_SCREEN_TURNED_OFF = 332;
145     private static final int MSG_DREAMING_STATE_CHANGED = 333;
146     private static final int MSG_USER_UNLOCKED = 334;
147     private static final int MSG_ASSISTANT_STACK_CHANGED = 335;
148     private static final int MSG_BIOMETRIC_AUTHENTICATION_CONTINUE = 336;
149     private static final int MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED = 337;
150     private static final int MSG_TELEPHONY_CAPABLE = 338;
151     private static final int MSG_TIMEZONE_UPDATE = 339;
152 
153     /** Biometric authentication state: Not listening. */
154     private static final int BIOMETRIC_STATE_STOPPED = 0;
155 
156     /** Biometric authentication state: Listening. */
157     private static final int BIOMETRIC_STATE_RUNNING = 1;
158 
159     /**
160      * Biometric authentication: Cancelling and waiting for the relevant biometric service to
161      * send us the confirmation that cancellation has happened.
162      */
163     private static final int BIOMETRIC_STATE_CANCELLING = 2;
164 
165     /**
166      * Biometric state: During cancelling we got another request to start listening, so when we
167      * receive the cancellation done signal, we should start listening again.
168      */
169     private static final int BIOMETRIC_STATE_CANCELLING_RESTARTING = 3;
170 
171     private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000;
172 
173     private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName(
174             "com.android.settings", "com.android.settings.FallbackHome");
175 
176 
177     /**
178      * If true, the system is in the half-boot-to-decryption-screen state.
179      * Prudently disable lockscreen.
180      */
181     public static final boolean CORE_APPS_ONLY;
182     static {
183         try {
184             CORE_APPS_ONLY = IPackageManager.Stub.asInterface(
185                     ServiceManager.getService("package")).isOnlyCoreApps();
186         } catch (RemoteException e) {
187             throw e.rethrowFromSystemServer();
188         }
189     }
190 
191     private static KeyguardUpdateMonitor sInstance;
192 
193     private final Context mContext;
194     private final boolean mIsPrimaryUser;
195     HashMap<Integer, SimData> mSimDatas = new HashMap<Integer, SimData>();
196     HashMap<Integer, ServiceState> mServiceStates = new HashMap<Integer, ServiceState>();
197 
198     private int mRingMode;
199     private int mPhoneState;
200     private boolean mKeyguardIsVisible;
201     private boolean mKeyguardGoingAway;
202     private boolean mGoingToSleep;
203     private boolean mBouncer;
204     private boolean mAuthInterruptActive;
205     private boolean mBootCompleted;
206     private boolean mNeedsSlowUnlockTransition;
207     private boolean mHasLockscreenWallpaper;
208     private boolean mAssistantVisible;
209     private boolean mKeyguardOccluded;
210     @VisibleForTesting
211     protected boolean mTelephonyCapable;
212 
213     // Device provisioning state
214     private boolean mDeviceProvisioned;
215 
216     // Battery status
217     private BatteryStatus mBatteryStatus;
218 
219     @VisibleForTesting
220     protected StrongAuthTracker mStrongAuthTracker;
221 
222     private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>>
223             mCallbacks = Lists.newArrayList();
224     private ContentObserver mDeviceProvisionedObserver;
225 
226     private boolean mSwitchingUser;
227 
228     private boolean mDeviceInteractive;
229     private boolean mScreenOn;
230     private SubscriptionManager mSubscriptionManager;
231     private List<SubscriptionInfo> mSubscriptionInfo;
232     private TrustManager mTrustManager;
233     private UserManager mUserManager;
234     private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
235     private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
236     private LockPatternUtils mLockPatternUtils;
237     private final IDreamManager mDreamManager;
238     private boolean mIsDreaming;
239     private final DevicePolicyManager mDevicePolicyManager;
240     private boolean mLogoutEnabled;
241     // If the user long pressed the lock icon, disabling face auth for the current session.
242     private boolean mLockIconPressed;
243 
244     /**
245      * Short delay before restarting biometric authentication after a successful try
246      * This should be slightly longer than the time between on<biometric>Authenticated
247      * (e.g. onFingerprintAuthenticated) and setKeyguardGoingAway(true).
248      */
249     private static final int BIOMETRIC_CONTINUE_DELAY_MS = 500;
250 
251     // If FP daemon dies, keyguard should retry after a short delay
252     private int mHardwareFingerprintUnavailableRetryCount = 0;
253     private int mHardwareFaceUnavailableRetryCount = 0;
254     private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
255     private static final int HW_UNAVAILABLE_RETRY_MAX = 3;
256 
257     private final Handler mHandler = new Handler(Looper.getMainLooper()) {
258         @Override
259         public void handleMessage(Message msg) {
260             switch (msg.what) {
261                 case MSG_TIME_UPDATE:
262                     handleTimeUpdate();
263                     break;
264                 case MSG_TIMEZONE_UPDATE:
265                     handleTimeZoneUpdate((String) msg.obj);
266                     break;
267                 case MSG_BATTERY_UPDATE:
268                     handleBatteryUpdate((BatteryStatus) msg.obj);
269                     break;
270                 case MSG_SIM_STATE_CHANGE:
271                     handleSimStateChange(msg.arg1, msg.arg2, (State) msg.obj);
272                     break;
273                 case MSG_RINGER_MODE_CHANGED:
274                     handleRingerModeChange(msg.arg1);
275                     break;
276                 case MSG_PHONE_STATE_CHANGED:
277                     handlePhoneStateChanged((String) msg.obj);
278                     break;
279                 case MSG_DEVICE_PROVISIONED:
280                     handleDeviceProvisioned();
281                     break;
282                 case MSG_DPM_STATE_CHANGED:
283                     handleDevicePolicyManagerStateChanged();
284                     break;
285                 case MSG_USER_SWITCHING:
286                     handleUserSwitching(msg.arg1, (IRemoteCallback) msg.obj);
287                     break;
288                 case MSG_USER_SWITCH_COMPLETE:
289                     handleUserSwitchComplete(msg.arg1);
290                     break;
291                 case MSG_KEYGUARD_RESET:
292                     handleKeyguardReset();
293                     break;
294                 case MSG_KEYGUARD_BOUNCER_CHANGED:
295                     handleKeyguardBouncerChanged(msg.arg1);
296                     break;
297                 case MSG_BOOT_COMPLETED:
298                     handleBootCompleted();
299                     break;
300                 case MSG_USER_INFO_CHANGED:
301                     handleUserInfoChanged(msg.arg1);
302                     break;
303                 case MSG_REPORT_EMERGENCY_CALL_ACTION:
304                     handleReportEmergencyCallAction();
305                     break;
306                 case MSG_STARTED_GOING_TO_SLEEP:
307                     handleStartedGoingToSleep(msg.arg1);
308                     break;
309                 case MSG_FINISHED_GOING_TO_SLEEP:
310                     handleFinishedGoingToSleep(msg.arg1);
311                     break;
312                 case MSG_STARTED_WAKING_UP:
313                     Trace.beginSection("KeyguardUpdateMonitor#handler MSG_STARTED_WAKING_UP");
314                     handleStartedWakingUp();
315                     Trace.endSection();
316                     break;
317                 case MSG_FACE_UNLOCK_STATE_CHANGED:
318                     Trace.beginSection("KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
319                     handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2);
320                     Trace.endSection();
321                     break;
322                 case MSG_SIM_SUBSCRIPTION_INFO_CHANGED:
323                     handleSimSubscriptionInfoChanged();
324                     break;
325                 case MSG_AIRPLANE_MODE_CHANGED:
326                     handleAirplaneModeChanged();
327                     break;
328                 case MSG_SERVICE_STATE_CHANGE:
329                     handleServiceStateChange(msg.arg1, (ServiceState) msg.obj);
330                     break;
331                 case MSG_SCREEN_TURNED_ON:
332                     handleScreenTurnedOn();
333                     break;
334                 case MSG_SCREEN_TURNED_OFF:
335                     Trace.beginSection("KeyguardUpdateMonitor#handler MSG_SCREEN_TURNED_ON");
336                     handleScreenTurnedOff();
337                     Trace.endSection();
338                     break;
339                 case MSG_DREAMING_STATE_CHANGED:
340                     handleDreamingStateChanged(msg.arg1);
341                     break;
342                 case MSG_USER_UNLOCKED:
343                     handleUserUnlocked();
344                     break;
345                 case MSG_ASSISTANT_STACK_CHANGED:
346                     setAssistantVisible((boolean) msg.obj);
347                     break;
348                 case MSG_BIOMETRIC_AUTHENTICATION_CONTINUE:
349                     updateBiometricListeningState();
350                     break;
351                 case MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED:
352                     updateLogoutEnabled();
353                     break;
354                 case MSG_TELEPHONY_CAPABLE:
355                     updateTelephonyCapable((boolean) msg.obj);
356                     break;
357                 default:
358                     super.handleMessage(msg);
359                     break;
360             }
361         }
362     };
363 
364     private boolean mFaceSettingEnabledForUser;
365     private BiometricManager mBiometricManager;
366     private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback =
367             new IBiometricEnabledOnKeyguardCallback.Stub() {
368         @Override
369         public void onChanged(BiometricSourceType type, boolean enabled) throws RemoteException {
370             if (type == BiometricSourceType.FACE) {
371                 mFaceSettingEnabledForUser = enabled;
372                 updateFaceListeningState();
373             }
374         }
375     };
376 
377     private OnSubscriptionsChangedListener mSubscriptionListener =
378             new OnSubscriptionsChangedListener() {
379         @Override
380         public void onSubscriptionsChanged() {
381             mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED);
382         }
383     };
384 
385     private SparseBooleanArray mUserHasTrust = new SparseBooleanArray();
386     private SparseBooleanArray mUserTrustIsManaged = new SparseBooleanArray();
387     private SparseBooleanArray mUserFingerprintAuthenticated = new SparseBooleanArray();
388     private SparseBooleanArray mUserFaceAuthenticated = new SparseBooleanArray();
389     private SparseBooleanArray mUserFaceUnlockRunning = new SparseBooleanArray();
390 
391     private static int sCurrentUser;
392     private Runnable mUpdateBiometricListeningState = this::updateBiometricListeningState;
393     private static boolean sDisableHandlerCheckForTesting;
394 
setCurrentUser(int currentUser)395     public synchronized static void setCurrentUser(int currentUser) {
396         sCurrentUser = currentUser;
397     }
398 
getCurrentUser()399     public synchronized static int getCurrentUser() {
400         return sCurrentUser;
401     }
402 
403     @Override
onTrustChanged(boolean enabled, int userId, int flags)404     public void onTrustChanged(boolean enabled, int userId, int flags) {
405         checkIsHandlerThread();
406         mUserHasTrust.put(userId, enabled);
407         for (int i = 0; i < mCallbacks.size(); i++) {
408             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
409             if (cb != null) {
410                 cb.onTrustChanged(userId);
411                 if (enabled && flags != 0) {
412                     cb.onTrustGrantedWithFlags(flags, userId);
413                 }
414             }
415         }
416     }
417 
418     @Override
onTrustError(CharSequence message)419     public void onTrustError(CharSequence message) {
420         dispatchErrorMessage(message);
421     }
422 
handleSimSubscriptionInfoChanged()423     private void handleSimSubscriptionInfoChanged() {
424         if (DEBUG_SIM_STATES) {
425             Log.v(TAG, "onSubscriptionInfoChanged()");
426             List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList();
427             if (sil != null) {
428                 for (SubscriptionInfo subInfo : sil) {
429                     Log.v(TAG, "SubInfo:" + subInfo);
430                 }
431             } else {
432                 Log.v(TAG, "onSubscriptionInfoChanged: list is null");
433             }
434         }
435         List<SubscriptionInfo> subscriptionInfos = getSubscriptionInfo(true /* forceReload */);
436 
437         // Hack level over 9000: Because the subscription id is not yet valid when we see the
438         // first update in handleSimStateChange, we need to force refresh all all SIM states
439         // so the subscription id for them is consistent.
440         ArrayList<SubscriptionInfo> changedSubscriptions = new ArrayList<>();
441         for (int i = 0; i < subscriptionInfos.size(); i++) {
442             SubscriptionInfo info = subscriptionInfos.get(i);
443             boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex());
444             if (changed) {
445                 changedSubscriptions.add(info);
446             }
447         }
448         for (int i = 0; i < changedSubscriptions.size(); i++) {
449             SimData data = mSimDatas.get(changedSubscriptions.get(i).getSubscriptionId());
450             for (int j = 0; j < mCallbacks.size(); j++) {
451                 KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
452                 if (cb != null) {
453                     cb.onSimStateChanged(data.subId, data.slotId, data.simState);
454                 }
455             }
456         }
457         for (int j = 0; j < mCallbacks.size(); j++) {
458             KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
459             if (cb != null) {
460                 cb.onRefreshCarrierInfo();
461             }
462         }
463     }
464 
handleAirplaneModeChanged()465     private void handleAirplaneModeChanged() {
466         for (int j = 0; j < mCallbacks.size(); j++) {
467             KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
468             if (cb != null) {
469                 cb.onRefreshCarrierInfo();
470             }
471         }
472     }
473 
474     /** @return List of SubscriptionInfo records, maybe empty but never null */
getSubscriptionInfo(boolean forceReload)475     public List<SubscriptionInfo> getSubscriptionInfo(boolean forceReload) {
476         List<SubscriptionInfo> sil = mSubscriptionInfo;
477         if (sil == null || forceReload) {
478             sil = mSubscriptionManager.getActiveSubscriptionInfoList();
479         }
480         if (sil == null) {
481             // getActiveSubscriptionInfoList was null callers expect an empty list.
482             mSubscriptionInfo = new ArrayList<SubscriptionInfo>();
483         } else {
484             mSubscriptionInfo = sil;
485         }
486         return mSubscriptionInfo;
487     }
488 
489     @Override
onTrustManagedChanged(boolean managed, int userId)490     public void onTrustManagedChanged(boolean managed, int userId) {
491         checkIsHandlerThread();
492         mUserTrustIsManaged.put(userId, managed);
493 
494         for (int i = 0; i < mCallbacks.size(); i++) {
495             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
496             if (cb != null) {
497                 cb.onTrustManagedChanged(userId);
498             }
499         }
500     }
501 
502     /**
503      * Updates KeyguardUpdateMonitor's internal state to know if keyguard is goingAway
504      * @param goingAway
505      */
setKeyguardGoingAway(boolean goingAway)506     public void setKeyguardGoingAway(boolean goingAway) {
507         mKeyguardGoingAway = goingAway;
508         updateFingerprintListeningState();
509     }
510 
511     /**
512      * Updates KeyguardUpdateMonitor's internal state to know if keyguard is occluded
513      * @param occluded
514      */
setKeyguardOccluded(boolean occluded)515     public void setKeyguardOccluded(boolean occluded) {
516         mKeyguardOccluded = occluded;
517         updateBiometricListeningState();
518     }
519 
520     /**
521      * @return a cached version of DreamManager.isDreaming()
522      */
isDreaming()523     public boolean isDreaming() {
524         return mIsDreaming;
525     }
526 
527     /**
528      * If the device is dreaming, awakens the device
529      */
awakenFromDream()530     public void awakenFromDream() {
531         if (mIsDreaming && mDreamManager != null) {
532             try {
533                 mDreamManager.awaken();
534             } catch (RemoteException e) {
535                 Log.e(TAG, "Unable to awaken from dream");
536             }
537         }
538     }
539 
540     @VisibleForTesting
onFingerprintAuthenticated(int userId)541     protected void onFingerprintAuthenticated(int userId) {
542         Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated");
543         mUserFingerprintAuthenticated.put(userId, true);
544         // Update/refresh trust state only if user can skip bouncer
545         if (getUserCanSkipBouncer(userId)) {
546             mTrustManager.unlockedByBiometricForUser(userId, BiometricSourceType.FINGERPRINT);
547         }
548         // Don't send cancel if authentication succeeds
549         mFingerprintCancelSignal = null;
550         for (int i = 0; i < mCallbacks.size(); i++) {
551             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
552             if (cb != null) {
553                 cb.onBiometricAuthenticated(userId, BiometricSourceType.FINGERPRINT);
554             }
555         }
556 
557         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE),
558                 BIOMETRIC_CONTINUE_DELAY_MS);
559 
560         // Only authenticate fingerprint once when assistant is visible
561         mAssistantVisible = false;
562 
563         Trace.endSection();
564     }
565 
handleFingerprintAuthFailed()566     private void handleFingerprintAuthFailed() {
567         for (int i = 0; i < mCallbacks.size(); i++) {
568             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
569             if (cb != null) {
570                 cb.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);
571             }
572         }
573         handleFingerprintHelp(-1, mContext.getString(R.string.kg_fingerprint_not_recognized));
574     }
575 
handleFingerprintAcquired(int acquireInfo)576     private void handleFingerprintAcquired(int acquireInfo) {
577         if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
578             return;
579         }
580         for (int i = 0; i < mCallbacks.size(); i++) {
581             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
582             if (cb != null) {
583                 cb.onBiometricAcquired(BiometricSourceType.FINGERPRINT);
584             }
585         }
586     }
587 
handleFingerprintAuthenticated(int authUserId)588     private void handleFingerprintAuthenticated(int authUserId) {
589         Trace.beginSection("KeyGuardUpdateMonitor#handlerFingerPrintAuthenticated");
590         try {
591             final int userId;
592             try {
593                 userId = ActivityManager.getService().getCurrentUser().id;
594             } catch (RemoteException e) {
595                 Log.e(TAG, "Failed to get current user id: ", e);
596                 return;
597             }
598             if (userId != authUserId) {
599                 Log.d(TAG, "Fingerprint authenticated for wrong user: " + authUserId);
600                 return;
601             }
602             if (isFingerprintDisabled(userId)) {
603                 Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId);
604                 return;
605             }
606             onFingerprintAuthenticated(userId);
607         } finally {
608             setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
609         }
610         Trace.endSection();
611     }
612 
handleFingerprintHelp(int msgId, String helpString)613     private void handleFingerprintHelp(int msgId, String helpString) {
614         for (int i = 0; i < mCallbacks.size(); i++) {
615             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
616             if (cb != null) {
617                 cb.onBiometricHelp(msgId, helpString, BiometricSourceType.FINGERPRINT);
618             }
619         }
620     }
621 
622     private Runnable mRetryFingerprintAuthentication = new Runnable() {
623         @Override
624         public void run() {
625             Log.w(TAG, "Retrying fingerprint after HW unavailable, attempt " +
626                     mHardwareFingerprintUnavailableRetryCount);
627             updateFingerprintListeningState();
628         }
629     };
630 
handleFingerprintError(int msgId, String errString)631     private void handleFingerprintError(int msgId, String errString) {
632         if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
633                 && mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
634             setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
635             updateFingerprintListeningState();
636         } else {
637             setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
638         }
639 
640         if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
641             if (mHardwareFingerprintUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
642                 mHardwareFingerprintUnavailableRetryCount++;
643                 mHandler.removeCallbacks(mRetryFingerprintAuthentication);
644                 mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT);
645             }
646         }
647 
648         if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) {
649             mLockPatternUtils.requireStrongAuth(
650                     LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
651                     getCurrentUser());
652         }
653 
654         for (int i = 0; i < mCallbacks.size(); i++) {
655             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
656             if (cb != null) {
657                 cb.onBiometricError(msgId, errString, BiometricSourceType.FINGERPRINT);
658             }
659         }
660     }
661 
handleFingerprintLockoutReset()662     private void handleFingerprintLockoutReset() {
663         updateFingerprintListeningState();
664     }
665 
setFingerprintRunningState(int fingerprintRunningState)666     private void setFingerprintRunningState(int fingerprintRunningState) {
667         boolean wasRunning = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING;
668         boolean isRunning = fingerprintRunningState == BIOMETRIC_STATE_RUNNING;
669         mFingerprintRunningState = fingerprintRunningState;
670         Log.d(TAG, "fingerprintRunningState: " + mFingerprintRunningState);
671         // Clients of KeyguardUpdateMonitor don't care about the internal state about the
672         // asynchronousness of the cancel cycle. So only notify them if the actually running state
673         // has changed.
674         if (wasRunning != isRunning) {
675             notifyFingerprintRunningStateChanged();
676         }
677     }
678 
notifyFingerprintRunningStateChanged()679     private void notifyFingerprintRunningStateChanged() {
680         checkIsHandlerThread();
681         for (int i = 0; i < mCallbacks.size(); i++) {
682             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
683             if (cb != null) {
684                 cb.onBiometricRunningStateChanged(isFingerprintDetectionRunning(),
685                         BiometricSourceType.FINGERPRINT);
686             }
687         }
688     }
689 
690     @VisibleForTesting
onFaceAuthenticated(int userId)691     protected void onFaceAuthenticated(int userId) {
692         Trace.beginSection("KeyGuardUpdateMonitor#onFaceAuthenticated");
693         mUserFaceAuthenticated.put(userId, true);
694         // Update/refresh trust state only if user can skip bouncer
695         if (getUserCanSkipBouncer(userId)) {
696             mTrustManager.unlockedByBiometricForUser(userId, BiometricSourceType.FACE);
697         }
698         // Don't send cancel if authentication succeeds
699         mFaceCancelSignal = null;
700         for (int i = 0; i < mCallbacks.size(); i++) {
701             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
702             if (cb != null) {
703                 cb.onBiometricAuthenticated(userId,
704                         BiometricSourceType.FACE);
705             }
706         }
707 
708         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE),
709                 BIOMETRIC_CONTINUE_DELAY_MS);
710 
711         // Only authenticate face once when assistant is visible
712         mAssistantVisible = false;
713 
714         Trace.endSection();
715     }
716 
handleFaceAuthFailed()717     private void handleFaceAuthFailed() {
718         setFaceRunningState(BIOMETRIC_STATE_STOPPED);
719         for (int i = 0; i < mCallbacks.size(); i++) {
720             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
721             if (cb != null) {
722                 cb.onBiometricAuthFailed(BiometricSourceType.FACE);
723             }
724         }
725         handleFaceHelp(-1, mContext.getString(R.string.kg_face_not_recognized));
726     }
727 
handleFaceAcquired(int acquireInfo)728     private void handleFaceAcquired(int acquireInfo) {
729         if (acquireInfo != FaceManager.FACE_ACQUIRED_GOOD) {
730             return;
731         }
732         for (int i = 0; i < mCallbacks.size(); i++) {
733             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
734             if (cb != null) {
735                 cb.onBiometricAcquired(BiometricSourceType.FACE);
736             }
737         }
738     }
739 
handleFaceAuthenticated(int authUserId)740     private void handleFaceAuthenticated(int authUserId) {
741         Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated");
742         try {
743             final int userId;
744             try {
745                 userId = ActivityManager.getService().getCurrentUser().id;
746             } catch (RemoteException e) {
747                 Log.e(TAG, "Failed to get current user id: ", e);
748                 return;
749             }
750             if (userId != authUserId) {
751                 Log.d(TAG, "Face authenticated for wrong user: " + authUserId);
752                 return;
753             }
754             if (isFaceDisabled(userId)) {
755                 Log.d(TAG, "Face authentication disabled by DPM for userId: " + userId);
756                 return;
757             }
758             onFaceAuthenticated(userId);
759         } finally {
760             setFaceRunningState(BIOMETRIC_STATE_STOPPED);
761         }
762         Trace.endSection();
763     }
764 
handleFaceHelp(int msgId, String helpString)765     private void handleFaceHelp(int msgId, String helpString) {
766         for (int i = 0; i < mCallbacks.size(); i++) {
767             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
768             if (cb != null) {
769                 cb.onBiometricHelp(msgId, helpString, BiometricSourceType.FACE);
770             }
771         }
772     }
773 
774     private Runnable mRetryFaceAuthentication = new Runnable() {
775         @Override
776         public void run() {
777             Log.w(TAG, "Retrying face after HW unavailable, attempt " +
778                     mHardwareFaceUnavailableRetryCount);
779             updateFaceListeningState();
780         }
781     };
782 
handleFaceError(int msgId, String errString)783     private void handleFaceError(int msgId, String errString) {
784         if (msgId == FaceManager.FACE_ERROR_CANCELED
785                 && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
786             setFaceRunningState(BIOMETRIC_STATE_STOPPED);
787             updateFaceListeningState();
788         } else {
789             setFaceRunningState(BIOMETRIC_STATE_STOPPED);
790         }
791 
792         if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE) {
793             if (mHardwareFaceUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
794                 mHardwareFaceUnavailableRetryCount++;
795                 mHandler.removeCallbacks(mRetryFaceAuthentication);
796                 mHandler.postDelayed(mRetryFaceAuthentication, HW_UNAVAILABLE_TIMEOUT);
797             }
798         }
799 
800         if (msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
801             mLockPatternUtils.requireStrongAuth(
802                     LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
803                     getCurrentUser());
804         }
805 
806         for (int i = 0; i < mCallbacks.size(); i++) {
807             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
808             if (cb != null) {
809                 cb.onBiometricError(msgId, errString,
810                         BiometricSourceType.FACE);
811             }
812         }
813     }
814 
handleFaceLockoutReset()815     private void handleFaceLockoutReset() {
816         updateFaceListeningState();
817     }
818 
setFaceRunningState(int faceRunningState)819     private void setFaceRunningState(int faceRunningState) {
820         boolean wasRunning = mFaceRunningState == BIOMETRIC_STATE_RUNNING;
821         boolean isRunning = faceRunningState == BIOMETRIC_STATE_RUNNING;
822         mFaceRunningState = faceRunningState;
823         Log.d(TAG, "faceRunningState: " + mFaceRunningState);
824         // Clients of KeyguardUpdateMonitor don't care about the internal state or about the
825         // asynchronousness of the cancel cycle. So only notify them if the actually running state
826         // has changed.
827         if (wasRunning != isRunning) {
828             notifyFaceRunningStateChanged();
829         }
830     }
831 
notifyFaceRunningStateChanged()832     private void notifyFaceRunningStateChanged() {
833         for (int i = 0; i < mCallbacks.size(); i++) {
834             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
835             if (cb != null) {
836                 cb.onBiometricRunningStateChanged(isFaceDetectionRunning(),
837                         BiometricSourceType.FACE);
838             }
839         }
840     }
841 
handleFaceUnlockStateChanged(boolean running, int userId)842     private void handleFaceUnlockStateChanged(boolean running, int userId) {
843         checkIsHandlerThread();
844         mUserFaceUnlockRunning.put(userId, running);
845         for (int i = 0; i < mCallbacks.size(); i++) {
846             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
847             if (cb != null) {
848                 cb.onFaceUnlockStateChanged(running, userId);
849             }
850         }
851     }
852 
isFaceUnlockRunning(int userId)853     public boolean isFaceUnlockRunning(int userId) {
854         return mUserFaceUnlockRunning.get(userId);
855     }
856 
isFingerprintDetectionRunning()857     public boolean isFingerprintDetectionRunning() {
858         return mFingerprintRunningState == BIOMETRIC_STATE_RUNNING;
859     }
860 
isFaceDetectionRunning()861     public boolean isFaceDetectionRunning() {
862         return mFaceRunningState == BIOMETRIC_STATE_RUNNING;
863     }
864 
isTrustDisabled(int userId)865     private boolean isTrustDisabled(int userId) {
866         // Don't allow trust agent if device is secured with a SIM PIN. This is here
867         // mainly because there's no other way to prompt the user to enter their SIM PIN
868         // once they get past the keyguard screen.
869         final boolean disabledBySimPin = isSimPinSecure();
870         return disabledBySimPin;
871     }
872 
isFingerprintDisabled(int userId)873     private boolean isFingerprintDisabled(int userId) {
874         final DevicePolicyManager dpm =
875                 (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
876         return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId)
877                     & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0
878                 || isSimPinSecure();
879     }
880 
isFaceDisabled(int userId)881     private boolean isFaceDisabled(int userId) {
882         final DevicePolicyManager dpm =
883                 (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
884         return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId)
885                 & DevicePolicyManager.KEYGUARD_DISABLE_FACE) != 0
886                 || isSimPinSecure();
887     }
888 
889 
getUserCanSkipBouncer(int userId)890     public boolean getUserCanSkipBouncer(int userId) {
891         return getUserHasTrust(userId) || getUserUnlockedWithBiometric(userId);
892     }
893 
getUserHasTrust(int userId)894     public boolean getUserHasTrust(int userId) {
895         return !isTrustDisabled(userId) && mUserHasTrust.get(userId);
896     }
897 
898     /**
899      * Returns whether the user is unlocked with biometrics.
900      */
getUserUnlockedWithBiometric(int userId)901     public boolean getUserUnlockedWithBiometric(int userId) {
902         boolean fingerprintOrFace = mUserFingerprintAuthenticated.get(userId)
903                 || mUserFaceAuthenticated.get(userId);
904         return fingerprintOrFace && isUnlockingWithBiometricAllowed();
905     }
906 
getUserTrustIsManaged(int userId)907     public boolean getUserTrustIsManaged(int userId) {
908         return mUserTrustIsManaged.get(userId) && !isTrustDisabled(userId);
909     }
910 
isUnlockingWithBiometricAllowed()911     public boolean isUnlockingWithBiometricAllowed() {
912         return mStrongAuthTracker.isUnlockingWithBiometricAllowed();
913     }
914 
isUserInLockdown(int userId)915     public boolean isUserInLockdown(int userId) {
916         return mStrongAuthTracker.getStrongAuthForUser(userId)
917                 == LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
918     }
919 
needsSlowUnlockTransition()920     public boolean needsSlowUnlockTransition() {
921         return mNeedsSlowUnlockTransition;
922     }
923 
getStrongAuthTracker()924     public StrongAuthTracker getStrongAuthTracker() {
925         return mStrongAuthTracker;
926     }
927 
notifyStrongAuthStateChanged(int userId)928     private void notifyStrongAuthStateChanged(int userId) {
929         checkIsHandlerThread();
930         for (int i = 0; i < mCallbacks.size(); i++) {
931             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
932             if (cb != null) {
933                 cb.onStrongAuthStateChanged(userId);
934             }
935         }
936     }
937 
isScreenOn()938     public boolean isScreenOn() {
939         return mScreenOn;
940     }
941 
dispatchErrorMessage(CharSequence message)942     private void dispatchErrorMessage(CharSequence message) {
943         for (int i = 0; i < mCallbacks.size(); i++) {
944             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
945             if (cb != null) {
946                 cb.onTrustAgentErrorMessage(message);
947             }
948         }
949     }
950 
951     @VisibleForTesting
setAssistantVisible(boolean assistantVisible)952     void setAssistantVisible(boolean assistantVisible) {
953         mAssistantVisible = assistantVisible;
954         updateBiometricListeningState();
955     }
956 
957     static class DisplayClientState {
958         public int clientGeneration;
959         public boolean clearing;
960         public PendingIntent intent;
961         public int playbackState;
962         public long playbackEventTime;
963     }
964 
965     private DisplayClientState mDisplayClientState = new DisplayClientState();
966 
967     @VisibleForTesting
968     protected final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
969 
970         @Override
971         public void onReceive(Context context, Intent intent) {
972             final String action = intent.getAction();
973             if (DEBUG) Log.d(TAG, "received broadcast " + action);
974 
975             if (Intent.ACTION_TIME_TICK.equals(action)
976                     || Intent.ACTION_TIME_CHANGED.equals(action)) {
977                 mHandler.sendEmptyMessage(MSG_TIME_UPDATE);
978             } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
979                 final Message msg = mHandler.obtainMessage(
980                         MSG_TIMEZONE_UPDATE, intent.getStringExtra("time-zone"));
981                 mHandler.sendMessage(msg);
982             } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
983                 final int status = intent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN);
984                 final int plugged = intent.getIntExtra(EXTRA_PLUGGED, 0);
985                 final int level = intent.getIntExtra(EXTRA_LEVEL, 0);
986                 final int health = intent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);
987 
988                 final int maxChargingMicroAmp = intent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, -1);
989                 int maxChargingMicroVolt = intent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);
990                 final int maxChargingMicroWatt;
991 
992                 if (maxChargingMicroVolt <= 0) {
993                     maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;
994                 }
995                 if (maxChargingMicroAmp > 0) {
996                     // Calculating muW = muA * muV / (10^6 mu^2 / mu); splitting up the divisor
997                     // to maintain precision equally on both factors.
998                     maxChargingMicroWatt = (maxChargingMicroAmp / 1000)
999                             * (maxChargingMicroVolt / 1000);
1000                 } else {
1001                     maxChargingMicroWatt = -1;
1002                 }
1003                 final Message msg = mHandler.obtainMessage(
1004                         MSG_BATTERY_UPDATE, new BatteryStatus(status, level, plugged, health,
1005                                 maxChargingMicroWatt));
1006                 mHandler.sendMessage(msg);
1007             } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
1008                 SimData args = SimData.fromIntent(intent);
1009                 // ACTION_SIM_STATE_CHANGED is rebroadcast after unlocking the device to
1010                 // keep compatibility with apps that aren't direct boot aware.
1011                 // SysUI should just ignore this broadcast because it was already received
1012                 // and processed previously.
1013                 if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
1014                     // Guarantee mTelephonyCapable state after SysUI crash and restart
1015                     if (args.simState == State.ABSENT) {
1016                         mHandler.obtainMessage(MSG_TELEPHONY_CAPABLE, true).sendToTarget();
1017                     }
1018                     return;
1019                 }
1020                 if (DEBUG_SIM_STATES) {
1021                     Log.v(TAG, "action " + action
1022                         + " state: " + intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)
1023                         + " slotId: " + args.slotId + " subid: " + args.subId);
1024                 }
1025                 mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, args.subId, args.slotId, args.simState)
1026                         .sendToTarget();
1027             } else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
1028                 mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED,
1029                         intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0));
1030             } else if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
1031                 String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
1032                 mHandler.sendMessage(mHandler.obtainMessage(MSG_PHONE_STATE_CHANGED, state));
1033             } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
1034                 mHandler.sendEmptyMessage(MSG_AIRPLANE_MODE_CHANGED);
1035             } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
1036                 dispatchBootCompleted();
1037             } else if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(action)) {
1038                 ServiceState serviceState = ServiceState.newFromBundle(intent.getExtras());
1039                 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
1040                         SubscriptionManager.INVALID_SUBSCRIPTION_ID);
1041                 if (DEBUG) {
1042                     Log.v(TAG, "action " + action + " serviceState=" + serviceState + " subId="
1043                             + subId);
1044                 }
1045                 mHandler.sendMessage(
1046                         mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState));
1047             } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals(
1048                     action)) {
1049                 mHandler.sendEmptyMessage(MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED);
1050             }
1051         }
1052     };
1053 
1054     @VisibleForTesting
1055     protected final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
1056 
1057         @Override
1058         public void onReceive(Context context, Intent intent) {
1059             final String action = intent.getAction();
1060             if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(action)) {
1061                 mHandler.sendEmptyMessage(MSG_TIME_UPDATE);
1062             } else if (Intent.ACTION_USER_INFO_CHANGED.equals(action)) {
1063                 mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_INFO_CHANGED,
1064                         intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()), 0));
1065             } else if (ACTION_FACE_UNLOCK_STARTED.equals(action)) {
1066                 Trace.beginSection("KeyguardUpdateMonitor.mBroadcastAllReceiver#onReceive ACTION_FACE_UNLOCK_STARTED");
1067                 mHandler.sendMessage(mHandler.obtainMessage(MSG_FACE_UNLOCK_STATE_CHANGED, 1,
1068                         getSendingUserId()));
1069                 Trace.endSection();
1070             } else if (ACTION_FACE_UNLOCK_STOPPED.equals(action)) {
1071                 mHandler.sendMessage(mHandler.obtainMessage(MSG_FACE_UNLOCK_STATE_CHANGED, 0,
1072                         getSendingUserId()));
1073             } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
1074                     .equals(action)) {
1075                 mHandler.sendEmptyMessage(MSG_DPM_STATE_CHANGED);
1076             } else if (ACTION_USER_UNLOCKED.equals(action)) {
1077                 mHandler.sendEmptyMessage(MSG_USER_UNLOCKED);
1078             }
1079         }
1080     };
1081 
1082     private final FingerprintManager.LockoutResetCallback mFingerprintLockoutResetCallback
1083             = new FingerprintManager.LockoutResetCallback() {
1084         @Override
1085         public void onLockoutReset() {
1086             handleFingerprintLockoutReset();
1087         }
1088     };
1089 
1090     private final FaceManager.LockoutResetCallback mFaceLockoutResetCallback
1091             = new FaceManager.LockoutResetCallback() {
1092         @Override
1093         public void onLockoutReset() {
1094             handleFaceLockoutReset();
1095         }
1096     };
1097 
1098     private FingerprintManager.AuthenticationCallback mFingerprintAuthenticationCallback
1099             = new AuthenticationCallback() {
1100 
1101         @Override
1102         public void onAuthenticationFailed() {
1103             handleFingerprintAuthFailed();
1104         }
1105 
1106         @Override
1107         public void onAuthenticationSucceeded(AuthenticationResult result) {
1108             Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");
1109             handleFingerprintAuthenticated(result.getUserId());
1110             Trace.endSection();
1111         }
1112 
1113         @Override
1114         public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
1115             handleFingerprintHelp(helpMsgId, helpString.toString());
1116         }
1117 
1118         @Override
1119         public void onAuthenticationError(int errMsgId, CharSequence errString) {
1120             handleFingerprintError(errMsgId, errString.toString());
1121         }
1122 
1123         @Override
1124         public void onAuthenticationAcquired(int acquireInfo) {
1125             handleFingerprintAcquired(acquireInfo);
1126         }
1127     };
1128 
1129     @VisibleForTesting
1130     FaceManager.AuthenticationCallback mFaceAuthenticationCallback
1131             = new FaceManager.AuthenticationCallback() {
1132 
1133         @Override
1134         public void onAuthenticationFailed() {
1135             handleFaceAuthFailed();
1136         }
1137 
1138         @Override
1139         public void onAuthenticationSucceeded(FaceManager.AuthenticationResult result) {
1140             Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");
1141             handleFaceAuthenticated(result.getUserId());
1142             Trace.endSection();
1143         }
1144 
1145         @Override
1146         public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
1147             handleFaceHelp(helpMsgId, helpString.toString());
1148         }
1149 
1150         @Override
1151         public void onAuthenticationError(int errMsgId, CharSequence errString) {
1152             handleFaceError(errMsgId, errString.toString());
1153         }
1154 
1155         @Override
1156         public void onAuthenticationAcquired(int acquireInfo) {
1157             handleFaceAcquired(acquireInfo);
1158         }
1159     };
1160 
1161     private CancellationSignal mFingerprintCancelSignal;
1162     private CancellationSignal mFaceCancelSignal;
1163     private FingerprintManager mFpm;
1164     private FaceManager mFaceManager;
1165 
1166     /**
1167      * When we receive a
1168      * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast,
1169      * and then pass a result via our handler to {@link KeyguardUpdateMonitor#handleSimStateChange},
1170      * we need a single object to pass to the handler.  This class helps decode
1171      * the intent and provide a {@link SimCard.State} result.
1172      */
1173     private static class SimData {
1174         public State simState;
1175         public int slotId;
1176         public int subId;
1177 
SimData(State state, int slot, int id)1178         SimData(State state, int slot, int id) {
1179             simState = state;
1180             slotId = slot;
1181             subId = id;
1182         }
1183 
fromIntent(Intent intent)1184         static SimData fromIntent(Intent intent) {
1185             State state;
1186             if (!TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {
1187                 throw new IllegalArgumentException("only handles intent ACTION_SIM_STATE_CHANGED");
1188             }
1189             String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
1190             int slotId = intent.getIntExtra(PhoneConstants.PHONE_KEY, 0);
1191             int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
1192                     SubscriptionManager.INVALID_SUBSCRIPTION_ID);
1193             if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
1194                 final String absentReason = intent
1195                     .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
1196 
1197                 if (IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals(
1198                         absentReason)) {
1199                     state = IccCardConstants.State.PERM_DISABLED;
1200                 } else {
1201                     state = IccCardConstants.State.ABSENT;
1202                 }
1203             } else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
1204                 state = IccCardConstants.State.READY;
1205             } else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
1206                 final String lockedReason = intent
1207                         .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
1208                 if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
1209                     state = IccCardConstants.State.PIN_REQUIRED;
1210                 } else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
1211                     state = IccCardConstants.State.PUK_REQUIRED;
1212                 } else {
1213                     state = IccCardConstants.State.UNKNOWN;
1214                 }
1215             } else if (IccCardConstants.INTENT_VALUE_LOCKED_NETWORK.equals(stateExtra)) {
1216                 state = IccCardConstants.State.NETWORK_LOCKED;
1217             } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR.equals(stateExtra)) {
1218                 state = IccCardConstants.State.CARD_IO_ERROR;
1219             } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(stateExtra)
1220                         || IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(stateExtra)) {
1221                 // This is required because telephony doesn't return to "READY" after
1222                 // these state transitions. See bug 7197471.
1223                 state = IccCardConstants.State.READY;
1224             } else {
1225                 state = IccCardConstants.State.UNKNOWN;
1226             }
1227             return new SimData(state, slotId, subId);
1228         }
1229 
1230         @Override
toString()1231         public String toString() {
1232             return "SimData{state=" + simState + ",slotId=" + slotId + ",subId=" + subId + "}";
1233         }
1234     }
1235 
1236     public static class BatteryStatus {
1237         public static final int CHARGING_UNKNOWN = -1;
1238         public static final int CHARGING_SLOWLY = 0;
1239         public static final int CHARGING_REGULAR = 1;
1240         public static final int CHARGING_FAST = 2;
1241 
1242         public final int status;
1243         public final int level;
1244         public final int plugged;
1245         public final int health;
1246         public final int maxChargingWattage;
BatteryStatus(int status, int level, int plugged, int health, int maxChargingWattage)1247         public BatteryStatus(int status, int level, int plugged, int health,
1248                 int maxChargingWattage) {
1249             this.status = status;
1250             this.level = level;
1251             this.plugged = plugged;
1252             this.health = health;
1253             this.maxChargingWattage = maxChargingWattage;
1254         }
1255 
1256         /**
1257          * Determine whether the device is plugged in (USB, power, or wireless).
1258          * @return true if the device is plugged in.
1259          */
isPluggedIn()1260         public boolean isPluggedIn() {
1261             return plugged == BatteryManager.BATTERY_PLUGGED_AC
1262                     || plugged == BatteryManager.BATTERY_PLUGGED_USB
1263                     || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
1264         }
1265 
1266         /**
1267          * Determine whether the device is plugged in (USB, power).
1268          * @return true if the device is plugged in wired (as opposed to wireless)
1269          */
isPluggedInWired()1270         public boolean isPluggedInWired() {
1271             return plugged == BatteryManager.BATTERY_PLUGGED_AC
1272                     || plugged == BatteryManager.BATTERY_PLUGGED_USB;
1273         }
1274 
1275         /**
1276          * Whether or not the device is charged. Note that some devices never return 100% for
1277          * battery level, so this allows either battery level or status to determine if the
1278          * battery is charged.
1279          * @return true if the device is charged
1280          */
isCharged()1281         public boolean isCharged() {
1282             return status == BATTERY_STATUS_FULL || level >= 100;
1283         }
1284 
1285         /**
1286          * Whether battery is low and needs to be charged.
1287          * @return true if battery is low
1288          */
isBatteryLow()1289         public boolean isBatteryLow() {
1290             return level < LOW_BATTERY_THRESHOLD;
1291         }
1292 
getChargingSpeed(int slowThreshold, int fastThreshold)1293         public final int getChargingSpeed(int slowThreshold, int fastThreshold) {
1294             return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :
1295                     maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :
1296                     maxChargingWattage > fastThreshold ? CHARGING_FAST :
1297                     CHARGING_REGULAR;
1298         }
1299 
1300         @Override
toString()1301         public String toString() {
1302             return "BatteryStatus{status=" + status + ",level=" + level + ",plugged=" + plugged
1303                     + ",health=" + health + ",maxChargingWattage=" + maxChargingWattage + "}";
1304         }
1305     }
1306 
1307     public static class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
1308         private final Consumer<Integer> mStrongAuthRequiredChangedCallback;
1309 
StrongAuthTracker(Context context, Consumer<Integer> strongAuthRequiredChangedCallback)1310         public StrongAuthTracker(Context context,
1311                 Consumer<Integer> strongAuthRequiredChangedCallback) {
1312             super(context);
1313             mStrongAuthRequiredChangedCallback = strongAuthRequiredChangedCallback;
1314         }
1315 
isUnlockingWithBiometricAllowed()1316         public boolean isUnlockingWithBiometricAllowed() {
1317             int userId = getCurrentUser();
1318             return isBiometricAllowedForUser(userId);
1319         }
1320 
hasUserAuthenticatedSinceBoot()1321         public boolean hasUserAuthenticatedSinceBoot() {
1322             int userId = getCurrentUser();
1323             return (getStrongAuthForUser(userId)
1324                     & STRONG_AUTH_REQUIRED_AFTER_BOOT) == 0;
1325         }
1326 
1327         @Override
onStrongAuthRequiredChanged(int userId)1328         public void onStrongAuthRequiredChanged(int userId) {
1329             mStrongAuthRequiredChangedCallback.accept(userId);
1330         }
1331     }
1332 
getInstance(Context context)1333     public static KeyguardUpdateMonitor getInstance(Context context) {
1334         if (sInstance == null) {
1335             sInstance = new KeyguardUpdateMonitor(context);
1336         }
1337         return sInstance;
1338     }
1339 
handleStartedWakingUp()1340     protected void handleStartedWakingUp() {
1341         Trace.beginSection("KeyguardUpdateMonitor#handleStartedWakingUp");
1342         updateBiometricListeningState();
1343         final int count = mCallbacks.size();
1344         for (int i = 0; i < count; i++) {
1345             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1346             if (cb != null) {
1347                 cb.onStartedWakingUp();
1348             }
1349         }
1350         Trace.endSection();
1351     }
1352 
handleStartedGoingToSleep(int arg1)1353     protected void handleStartedGoingToSleep(int arg1) {
1354         clearBiometricRecognized();
1355         final int count = mCallbacks.size();
1356         for (int i = 0; i < count; i++) {
1357             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1358             if (cb != null) {
1359                 cb.onStartedGoingToSleep(arg1);
1360             }
1361         }
1362         mGoingToSleep = true;
1363         updateBiometricListeningState();
1364     }
1365 
handleFinishedGoingToSleep(int arg1)1366     protected void handleFinishedGoingToSleep(int arg1) {
1367         mGoingToSleep = false;
1368         final int count = mCallbacks.size();
1369         for (int i = 0; i < count; i++) {
1370             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1371             if (cb != null) {
1372                 cb.onFinishedGoingToSleep(arg1);
1373             }
1374         }
1375         updateBiometricListeningState();
1376     }
1377 
handleScreenTurnedOn()1378     private void handleScreenTurnedOn() {
1379         final int count = mCallbacks.size();
1380         for (int i = 0; i < count; i++) {
1381             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1382             if (cb != null) {
1383                 cb.onScreenTurnedOn();
1384             }
1385         }
1386     }
1387 
handleScreenTurnedOff()1388     private void handleScreenTurnedOff() {
1389         mLockIconPressed = false;
1390         mHardwareFingerprintUnavailableRetryCount = 0;
1391         mHardwareFaceUnavailableRetryCount = 0;
1392         final int count = mCallbacks.size();
1393         for (int i = 0; i < count; i++) {
1394             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1395             if (cb != null) {
1396                 cb.onScreenTurnedOff();
1397             }
1398         }
1399     }
1400 
handleDreamingStateChanged(int dreamStart)1401     private void handleDreamingStateChanged(int dreamStart) {
1402         final int count = mCallbacks.size();
1403         mIsDreaming = dreamStart == 1;
1404         for (int i = 0; i < count; i++) {
1405             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1406             if (cb != null) {
1407                 cb.onDreamingStateChanged(mIsDreaming);
1408             }
1409         }
1410         updateBiometricListeningState();
1411     }
1412 
handleUserInfoChanged(int userId)1413     private void handleUserInfoChanged(int userId) {
1414         for (int i = 0; i < mCallbacks.size(); i++) {
1415             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1416             if (cb != null) {
1417                 cb.onUserInfoChanged(userId);
1418             }
1419         }
1420     }
1421 
handleUserUnlocked()1422     private void handleUserUnlocked() {
1423         mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition();
1424         for (int i = 0; i < mCallbacks.size(); i++) {
1425             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1426             if (cb != null) {
1427                 cb.onUserUnlocked();
1428             }
1429         }
1430     }
1431 
1432     @VisibleForTesting
KeyguardUpdateMonitor(Context context)1433     protected KeyguardUpdateMonitor(Context context) {
1434         mContext = context;
1435         mSubscriptionManager = SubscriptionManager.from(context);
1436         mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
1437         mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
1438 
1439         // Since device can't be un-provisioned, we only need to register a content observer
1440         // to update mDeviceProvisioned when we are...
1441         if (!mDeviceProvisioned) {
1442             watchForDeviceProvisioning();
1443         }
1444 
1445         // Take a guess at initial SIM state, battery status and PLMN until we get an update
1446         mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0);
1447 
1448         // Watch for interesting updates
1449         final IntentFilter filter = new IntentFilter();
1450         filter.addAction(Intent.ACTION_TIME_TICK);
1451         filter.addAction(Intent.ACTION_TIME_CHANGED);
1452         filter.addAction(Intent.ACTION_BATTERY_CHANGED);
1453         filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
1454         filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
1455         filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
1456         filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
1457         filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
1458         filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
1459         filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
1460         context.registerReceiver(mBroadcastReceiver, filter, null, mHandler);
1461 
1462         final IntentFilter bootCompleteFilter = new IntentFilter();
1463         bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
1464         bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
1465         context.registerReceiver(mBroadcastReceiver, bootCompleteFilter, null, mHandler);
1466 
1467         final IntentFilter allUserFilter = new IntentFilter();
1468         allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED);
1469         allUserFilter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
1470         allUserFilter.addAction(ACTION_FACE_UNLOCK_STARTED);
1471         allUserFilter.addAction(ACTION_FACE_UNLOCK_STOPPED);
1472         allUserFilter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
1473         allUserFilter.addAction(ACTION_USER_UNLOCKED);
1474         context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter,
1475                 null, mHandler);
1476 
1477         mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
1478         try {
1479             ActivityManager.getService().registerUserSwitchObserver(
1480                     new UserSwitchObserver() {
1481                         @Override
1482                         public void onUserSwitching(int newUserId, IRemoteCallback reply) {
1483                             mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING,
1484                                     newUserId, 0, reply));
1485                         }
1486                         @Override
1487                         public void onUserSwitchComplete(int newUserId) throws RemoteException {
1488                             mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE,
1489                                     newUserId, 0));
1490                         }
1491                     }, TAG);
1492         } catch (RemoteException e) {
1493             e.rethrowAsRuntimeException();
1494         }
1495 
1496         mTrustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE);
1497         mTrustManager.registerTrustListener(this);
1498         mLockPatternUtils = new LockPatternUtils(context);
1499         mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker);
1500 
1501         mDreamManager = IDreamManager.Stub.asInterface(
1502                 ServiceManager.getService(DreamService.DREAM_SERVICE));
1503 
1504         if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
1505             mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
1506         }
1507         if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
1508             mFaceManager = (FaceManager) context.getSystemService(Context.FACE_SERVICE);
1509         }
1510 
1511         if (mFpm != null || mFaceManager != null) {
1512             mBiometricManager = context.getSystemService(BiometricManager.class);
1513             mBiometricManager.registerEnabledOnKeyguardCallback(mBiometricEnabledCallback);
1514         }
1515 
1516         updateBiometricListeningState();
1517         if (mFpm != null) {
1518             mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback);
1519         }
1520         if (mFaceManager != null) {
1521             mFaceManager.addLockoutResetCallback(mFaceLockoutResetCallback);
1522         }
1523 
1524         ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
1525         mUserManager = context.getSystemService(UserManager.class);
1526         mIsPrimaryUser = mUserManager.isPrimaryUser();
1527         mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
1528         mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled();
1529         updateAirplaneModeState();
1530     }
1531 
updateAirplaneModeState()1532     private void updateAirplaneModeState() {
1533         // ACTION_AIRPLANE_MODE_CHANGED do not broadcast if device set AirplaneMode ON and boot
1534         if (!WirelessUtils.isAirplaneModeOn(mContext)
1535                 || mHandler.hasMessages(MSG_AIRPLANE_MODE_CHANGED)) {
1536             return;
1537         }
1538         mHandler.sendEmptyMessage(MSG_AIRPLANE_MODE_CHANGED);
1539     }
1540 
updateBiometricListeningState()1541     private void updateBiometricListeningState() {
1542         updateFingerprintListeningState();
1543         updateFaceListeningState();
1544     }
1545 
updateFingerprintListeningState()1546     private void updateFingerprintListeningState() {
1547         // If this message exists, we should not authenticate again until this message is
1548         // consumed by the handler
1549         if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) {
1550             return;
1551         }
1552         mHandler.removeCallbacks(mRetryFingerprintAuthentication);
1553         boolean shouldListenForFingerprint = shouldListenForFingerprint();
1554         boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
1555                 || mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING;
1556         if (runningOrRestarting && !shouldListenForFingerprint) {
1557             stopListeningForFingerprint();
1558         } else if (!runningOrRestarting && shouldListenForFingerprint) {
1559             startListeningForFingerprint();
1560         }
1561     }
1562 
1563     /**
1564      * Called whenever passive authentication is requested or aborted by a sensor.
1565      * @param active If the interrupt started or ended.
1566      */
onAuthInterruptDetected(boolean active)1567     public void onAuthInterruptDetected(boolean active) {
1568         if (DEBUG) Log.d(TAG, "onAuthInterruptDetected(" + active + ")");
1569         if (mAuthInterruptActive == active) {
1570             return;
1571         }
1572         mAuthInterruptActive = active;
1573         updateFaceListeningState();
1574     }
1575 
1576     /**
1577      * Requests face authentication if we're on a state where it's allowed.
1578      * This will re-trigger auth in case it fails.
1579      */
requestFaceAuth()1580     public void requestFaceAuth() {
1581         if (DEBUG) Log.d(TAG, "requestFaceAuth()");
1582         updateFaceListeningState();
1583     }
1584 
updateFaceListeningState()1585     private void updateFaceListeningState() {
1586         // If this message exists, we should not authenticate again until this message is
1587         // consumed by the handler
1588         if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) {
1589             return;
1590         }
1591         mHandler.removeCallbacks(mRetryFaceAuthentication);
1592         boolean shouldListenForFace = shouldListenForFace();
1593         if (mFaceRunningState == BIOMETRIC_STATE_RUNNING && !shouldListenForFace) {
1594             stopListeningForFace();
1595         } else if (mFaceRunningState != BIOMETRIC_STATE_RUNNING
1596                 && shouldListenForFace) {
1597             startListeningForFace();
1598         }
1599     }
1600 
shouldListenForFingerprintAssistant()1601     private boolean shouldListenForFingerprintAssistant() {
1602         return mAssistantVisible && mKeyguardOccluded
1603                 && !mUserFingerprintAuthenticated.get(getCurrentUser(), false)
1604                 && !mUserHasTrust.get(getCurrentUser(), false);
1605     }
1606 
shouldListenForFaceAssistant()1607     private boolean shouldListenForFaceAssistant() {
1608         return mAssistantVisible && mKeyguardOccluded
1609                 && !mUserFaceAuthenticated.get(getCurrentUser(), false)
1610                 && !mUserHasTrust.get(getCurrentUser(), false);
1611     }
1612 
shouldListenForFingerprint()1613     private boolean shouldListenForFingerprint() {
1614         // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
1615         // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
1616         final boolean shouldListen = (mKeyguardIsVisible || !mDeviceInteractive ||
1617                 (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
1618                 shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming))
1619                 && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser())
1620                 && (!mKeyguardGoingAway || !mDeviceInteractive) && mIsPrimaryUser;
1621         return shouldListen;
1622     }
1623 
shouldListenForFace()1624     private boolean shouldListenForFace() {
1625         final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep;
1626         final int user = getCurrentUser();
1627         // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
1628         // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
1629         return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant())
1630                 && !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user)
1631                 && !mKeyguardGoingAway && mFaceSettingEnabledForUser && !mLockIconPressed
1632                 && mUserManager.isUserUnlocked(user) && mIsPrimaryUser;
1633     }
1634 
1635     /**
1636      * Whenever the lock icon is long pressed, disabling trust agents.
1637      * This means that we cannot auth passively (face) until the user presses power.
1638      */
onLockIconPressed()1639     public void onLockIconPressed() {
1640         mLockIconPressed = true;
1641         mUserFaceAuthenticated.put(getCurrentUser(), false);
1642         updateFaceListeningState();
1643     }
1644 
startListeningForFingerprint()1645     private void startListeningForFingerprint() {
1646         if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING) {
1647             setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING);
1648             return;
1649         }
1650         if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
1651             // Waiting for restart via handleFingerprintError().
1652             return;
1653         }
1654         if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
1655         int userId = getCurrentUser();
1656         if (isUnlockWithFingerprintPossible(userId)) {
1657             if (mFingerprintCancelSignal != null) {
1658                 mFingerprintCancelSignal.cancel();
1659             }
1660             mFingerprintCancelSignal = new CancellationSignal();
1661             mFpm.authenticate(null, mFingerprintCancelSignal, 0, mFingerprintAuthenticationCallback,
1662                     null, userId);
1663             setFingerprintRunningState(BIOMETRIC_STATE_RUNNING);
1664         }
1665     }
1666 
startListeningForFace()1667     private void startListeningForFace() {
1668         if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING) {
1669             setFaceRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING);
1670             return;
1671         }
1672         if (DEBUG) Log.v(TAG, "startListeningForFace()");
1673         int userId = getCurrentUser();
1674         if (isUnlockWithFacePossible(userId)) {
1675             if (mFaceCancelSignal != null) {
1676                 mFaceCancelSignal.cancel();
1677             }
1678             mFaceCancelSignal = new CancellationSignal();
1679             mFaceManager.authenticate(null, mFaceCancelSignal, 0,
1680                     mFaceAuthenticationCallback, null, userId);
1681             setFaceRunningState(BIOMETRIC_STATE_RUNNING);
1682         }
1683     }
1684 
1685     /**
1686      * If biometrics hardware is available, not disabled, and user has enrolled templates.
1687      * This does NOT check if the device is encrypted or in lockdown.
1688      *
1689      * @param userId User that's trying to unlock.
1690      * @return {@code true} if possible.
1691      */
isUnlockingWithBiometricsPossible(int userId)1692     public boolean isUnlockingWithBiometricsPossible(int userId) {
1693         return isUnlockWithFacePossible(userId) || isUnlockWithFingerprintPossible(userId);
1694     }
1695 
isUnlockWithFingerprintPossible(int userId)1696     private boolean isUnlockWithFingerprintPossible(int userId) {
1697         return mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId)
1698                 && mFpm.getEnrolledFingerprints(userId).size() > 0;
1699     }
1700 
1701     /**
1702      * If face hardware is available and user has enrolled. Not considering encryption or
1703      * lockdown state.
1704      */
isUnlockWithFacePossible(int userId)1705     public boolean isUnlockWithFacePossible(int userId) {
1706         return mFaceManager != null && mFaceManager.isHardwareDetected()
1707                 && !isFaceDisabled(userId)
1708                 && mFaceManager.hasEnrolledTemplates(userId);
1709     }
1710 
stopListeningForFingerprint()1711     private void stopListeningForFingerprint() {
1712         if (DEBUG) Log.v(TAG, "stopListeningForFingerprint()");
1713         if (mFingerprintRunningState == BIOMETRIC_STATE_RUNNING) {
1714             if (mFingerprintCancelSignal != null) {
1715                 mFingerprintCancelSignal.cancel();
1716                 mFingerprintCancelSignal = null;
1717             }
1718             setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING);
1719         }
1720         if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
1721             setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING);
1722         }
1723     }
1724 
stopListeningForFace()1725     private void stopListeningForFace() {
1726         if (DEBUG) Log.v(TAG, "stopListeningForFace()");
1727         if (mFaceRunningState == BIOMETRIC_STATE_RUNNING) {
1728             if (mFaceCancelSignal != null) {
1729                 mFaceCancelSignal.cancel();
1730                 mFaceCancelSignal = null;
1731             }
1732             setFaceRunningState(BIOMETRIC_STATE_CANCELLING);
1733         }
1734         if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
1735             setFaceRunningState(BIOMETRIC_STATE_CANCELLING);
1736         }
1737     }
1738 
isDeviceProvisionedInSettingsDb()1739     private boolean isDeviceProvisionedInSettingsDb() {
1740         return Settings.Global.getInt(mContext.getContentResolver(),
1741                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
1742     }
1743 
watchForDeviceProvisioning()1744     private void watchForDeviceProvisioning() {
1745         mDeviceProvisionedObserver = new ContentObserver(mHandler) {
1746             @Override
1747             public void onChange(boolean selfChange) {
1748                 super.onChange(selfChange);
1749                 mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
1750                 if (mDeviceProvisioned) {
1751                     mHandler.sendEmptyMessage(MSG_DEVICE_PROVISIONED);
1752                 }
1753                 if (DEBUG) Log.d(TAG, "DEVICE_PROVISIONED state = " + mDeviceProvisioned);
1754             }
1755         };
1756 
1757         mContext.getContentResolver().registerContentObserver(
1758                 Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),
1759                 false, mDeviceProvisionedObserver);
1760 
1761         // prevent a race condition between where we check the flag and where we register the
1762         // observer by grabbing the value once again...
1763         boolean provisioned = isDeviceProvisionedInSettingsDb();
1764         if (provisioned != mDeviceProvisioned) {
1765             mDeviceProvisioned = provisioned;
1766             if (mDeviceProvisioned) {
1767                 mHandler.sendEmptyMessage(MSG_DEVICE_PROVISIONED);
1768             }
1769         }
1770     }
1771 
1772     /**
1773      * Update the state whether Keyguard currently has a lockscreen wallpaper.
1774      *
1775      * @param hasLockscreenWallpaper Whether Keyguard has a lockscreen wallpaper.
1776      */
setHasLockscreenWallpaper(boolean hasLockscreenWallpaper)1777     public void setHasLockscreenWallpaper(boolean hasLockscreenWallpaper) {
1778         checkIsHandlerThread();
1779         if (hasLockscreenWallpaper != mHasLockscreenWallpaper) {
1780             mHasLockscreenWallpaper = hasLockscreenWallpaper;
1781             for (int i = mCallbacks.size() - 1; i >= 0; i--) {
1782                 KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1783                 if (cb != null) {
1784                     cb.onHasLockscreenWallpaperChanged(hasLockscreenWallpaper);
1785                 }
1786             }
1787         }
1788     }
1789 
1790     /**
1791      * @return Whether Keyguard has a lockscreen wallpaper.
1792      */
hasLockscreenWallpaper()1793     public boolean hasLockscreenWallpaper() {
1794         return mHasLockscreenWallpaper;
1795     }
1796 
1797     /**
1798      * Handle {@link #MSG_DPM_STATE_CHANGED}
1799      */
handleDevicePolicyManagerStateChanged()1800     private void handleDevicePolicyManagerStateChanged() {
1801         updateFingerprintListeningState();
1802         for (int i = mCallbacks.size() - 1; i >= 0; i--) {
1803             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1804             if (cb != null) {
1805                 cb.onDevicePolicyManagerStateChanged();
1806             }
1807         }
1808     }
1809 
1810     /**
1811      * Handle {@link #MSG_USER_SWITCHING}
1812      */
handleUserSwitching(int userId, IRemoteCallback reply)1813     private void handleUserSwitching(int userId, IRemoteCallback reply) {
1814         for (int i = 0; i < mCallbacks.size(); i++) {
1815             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1816             if (cb != null) {
1817                 cb.onUserSwitching(userId);
1818             }
1819         }
1820         try {
1821             reply.sendResult(null);
1822         } catch (RemoteException e) {
1823         }
1824     }
1825 
1826     /**
1827      * Handle {@link #MSG_USER_SWITCH_COMPLETE}
1828      */
handleUserSwitchComplete(int userId)1829     private void handleUserSwitchComplete(int userId) {
1830         for (int i = 0; i < mCallbacks.size(); i++) {
1831             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1832             if (cb != null) {
1833                 cb.onUserSwitchComplete(userId);
1834             }
1835         }
1836     }
1837 
1838     /**
1839      * This is exposed since {@link Intent#ACTION_BOOT_COMPLETED} is not sticky. If
1840      * keyguard crashes sometime after boot, then it will never receive this
1841      * broadcast and hence not handle the event. This method is ultimately called by
1842      * PhoneWindowManager in this case.
1843      */
dispatchBootCompleted()1844     public void dispatchBootCompleted() {
1845         mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED);
1846     }
1847 
1848     /**
1849      * Handle {@link #MSG_BOOT_COMPLETED}
1850      */
handleBootCompleted()1851     private void handleBootCompleted() {
1852         if (mBootCompleted) return;
1853         mBootCompleted = true;
1854         for (int i = 0; i < mCallbacks.size(); i++) {
1855             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1856             if (cb != null) {
1857                 cb.onBootCompleted();
1858             }
1859         }
1860     }
1861 
1862     /**
1863      * We need to store this state in the KeyguardUpdateMonitor since this class will not be
1864      * destroyed.
1865      */
hasBootCompleted()1866     public boolean hasBootCompleted() {
1867         return mBootCompleted;
1868     }
1869 
1870     /**
1871      * Handle {@link #MSG_DEVICE_PROVISIONED}
1872      */
handleDeviceProvisioned()1873     private void handleDeviceProvisioned() {
1874         for (int i = 0; i < mCallbacks.size(); i++) {
1875             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1876             if (cb != null) {
1877                 cb.onDeviceProvisioned();
1878             }
1879         }
1880         if (mDeviceProvisionedObserver != null) {
1881             // We don't need the observer anymore...
1882             mContext.getContentResolver().unregisterContentObserver(mDeviceProvisionedObserver);
1883             mDeviceProvisionedObserver = null;
1884         }
1885     }
1886 
1887     /**
1888      * Handle {@link #MSG_PHONE_STATE_CHANGED}
1889      */
handlePhoneStateChanged(String newState)1890     private void handlePhoneStateChanged(String newState) {
1891         if (DEBUG) Log.d(TAG, "handlePhoneStateChanged(" + newState + ")");
1892         if (TelephonyManager.EXTRA_STATE_IDLE.equals(newState)) {
1893             mPhoneState = TelephonyManager.CALL_STATE_IDLE;
1894         } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(newState)) {
1895             mPhoneState = TelephonyManager.CALL_STATE_OFFHOOK;
1896         } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(newState)) {
1897             mPhoneState = TelephonyManager.CALL_STATE_RINGING;
1898         }
1899         for (int i = 0; i < mCallbacks.size(); i++) {
1900             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1901             if (cb != null) {
1902                 cb.onPhoneStateChanged(mPhoneState);
1903             }
1904         }
1905     }
1906 
1907     /**
1908      * Handle {@link #MSG_RINGER_MODE_CHANGED}
1909      */
handleRingerModeChange(int mode)1910     private void handleRingerModeChange(int mode) {
1911         if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")");
1912         mRingMode = mode;
1913         for (int i = 0; i < mCallbacks.size(); i++) {
1914             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1915             if (cb != null) {
1916                 cb.onRingerModeChanged(mode);
1917             }
1918         }
1919     }
1920 
1921     /**
1922      * Handle {@link #MSG_TIME_UPDATE}
1923      */
handleTimeUpdate()1924     private void handleTimeUpdate() {
1925         if (DEBUG) Log.d(TAG, "handleTimeUpdate");
1926         for (int i = 0; i < mCallbacks.size(); i++) {
1927             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1928             if (cb != null) {
1929                 cb.onTimeChanged();
1930             }
1931         }
1932     }
1933 
1934     /**
1935      * Handle (@line #MSG_TIMEZONE_UPDATE}
1936      */
handleTimeZoneUpdate(String timeZone)1937     private void handleTimeZoneUpdate(String timeZone) {
1938         if (DEBUG) Log.d(TAG, "handleTimeZoneUpdate");
1939         for (int i = 0; i < mCallbacks.size(); i++) {
1940             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1941             if (cb != null) {
1942                 cb.onTimeZoneChanged(TimeZone.getTimeZone(timeZone));
1943                 // Also notify callbacks about time change to remain compatible.
1944                 cb.onTimeChanged();
1945             }
1946         }
1947     }
1948 
1949     /**
1950      * Handle {@link #MSG_BATTERY_UPDATE}
1951      */
handleBatteryUpdate(BatteryStatus status)1952     private void handleBatteryUpdate(BatteryStatus status) {
1953         if (DEBUG) Log.d(TAG, "handleBatteryUpdate");
1954         final boolean batteryUpdateInteresting = isBatteryUpdateInteresting(mBatteryStatus, status);
1955         mBatteryStatus = status;
1956         if (batteryUpdateInteresting) {
1957             for (int i = 0; i < mCallbacks.size(); i++) {
1958                 KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
1959                 if (cb != null) {
1960                     cb.onRefreshBatteryInfo(status);
1961                 }
1962             }
1963         }
1964     }
1965 
1966     /**
1967      * Handle Telephony status during Boot for CarrierText display policy
1968      */
1969     @VisibleForTesting
updateTelephonyCapable(boolean capable)1970     void updateTelephonyCapable(boolean capable){
1971         if (capable == mTelephonyCapable) {
1972             return;
1973         }
1974         mTelephonyCapable = capable;
1975         for (WeakReference<KeyguardUpdateMonitorCallback> ref : mCallbacks) {
1976             KeyguardUpdateMonitorCallback cb = ref.get();
1977             if (cb != null) {
1978                 cb.onTelephonyCapable(mTelephonyCapable);
1979             }
1980         }
1981     }
1982 
1983     /**
1984      * Handle {@link #MSG_SIM_STATE_CHANGE}
1985      */
1986     @VisibleForTesting
handleSimStateChange(int subId, int slotId, State state)1987     void handleSimStateChange(int subId, int slotId, State state) {
1988         checkIsHandlerThread();
1989         if (DEBUG_SIM_STATES) {
1990             Log.d(TAG, "handleSimStateChange(subId=" + subId + ", slotId="
1991                     + slotId + ", state=" + state +")");
1992         }
1993 
1994         boolean becameAbsent = false;
1995         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
1996             Log.w(TAG, "invalid subId in handleSimStateChange()");
1997             /* Only handle No SIM(ABSENT) and Card Error(CARD_IO_ERROR) due to
1998              * handleServiceStateChange() handle other case */
1999             if (state == State.ABSENT) {
2000                 updateTelephonyCapable(true);
2001                 // Even though the subscription is not valid anymore, we need to notify that the
2002                 // SIM card was removed so we can update the UI.
2003                 becameAbsent = true;
2004                 for (SimData data : mSimDatas.values()) {
2005                     // Set the SIM state of all SimData associated with that slot to ABSENT se we
2006                     // do not move back into PIN/PUK locked and not detect the change below.
2007                     if (data.slotId == slotId) {
2008                         data.simState = State.ABSENT;
2009                     }
2010                 }
2011             } else if (state == State.CARD_IO_ERROR) {
2012                 updateTelephonyCapable(true);
2013             } else {
2014                 return;
2015             }
2016         }
2017 
2018         SimData data = mSimDatas.get(subId);
2019         final boolean changed;
2020         if (data == null) {
2021             data = new SimData(state, slotId, subId);
2022             mSimDatas.put(subId, data);
2023             changed = true; // no data yet; force update
2024         } else {
2025             changed = (data.simState != state || data.subId != subId || data.slotId != slotId);
2026             data.simState = state;
2027             data.subId = subId;
2028             data.slotId = slotId;
2029         }
2030         if ((changed || becameAbsent) && state != State.UNKNOWN) {
2031             for (int i = 0; i < mCallbacks.size(); i++) {
2032                 KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
2033                 if (cb != null) {
2034                     cb.onSimStateChanged(subId, slotId, state);
2035                 }
2036             }
2037         }
2038     }
2039 
2040     /**
2041      * Handle {@link #MSG_SERVICE_STATE_CHANGE}
2042      */
2043     @VisibleForTesting
handleServiceStateChange(int subId, ServiceState serviceState)2044     void handleServiceStateChange(int subId, ServiceState serviceState) {
2045         if (DEBUG) {
2046             Log.d(TAG,
2047                     "handleServiceStateChange(subId=" + subId + ", serviceState=" + serviceState);
2048         }
2049 
2050         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
2051             Log.w(TAG, "invalid subId in handleServiceStateChange()");
2052             return;
2053         } else {
2054             updateTelephonyCapable(true);
2055         }
2056 
2057         mServiceStates.put(subId, serviceState);
2058 
2059         for (int j = 0; j < mCallbacks.size(); j++) {
2060             KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
2061             if (cb != null) {
2062                 cb.onRefreshCarrierInfo();
2063             }
2064         }
2065     }
2066 
isKeyguardVisible()2067     public boolean isKeyguardVisible() {
2068         return mKeyguardIsVisible;
2069     }
2070 
2071     /**
2072      * Notifies that the visibility state of Keyguard has changed.
2073      *
2074      * <p>Needs to be called from the main thread.
2075      */
onKeyguardVisibilityChanged(boolean showing)2076     public void onKeyguardVisibilityChanged(boolean showing) {
2077         checkIsHandlerThread();
2078         Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")");
2079         mKeyguardIsVisible = showing;
2080         for (int i = 0; i < mCallbacks.size(); i++) {
2081             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
2082             if (cb != null) {
2083                 cb.onKeyguardVisibilityChangedRaw(showing);
2084             }
2085         }
2086         updateBiometricListeningState();
2087     }
2088 
2089     /**
2090      * Handle {@link #MSG_KEYGUARD_RESET}
2091      */
handleKeyguardReset()2092     private void handleKeyguardReset() {
2093         if (DEBUG) Log.d(TAG, "handleKeyguardReset");
2094         updateBiometricListeningState();
2095         mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition();
2096     }
2097 
resolveNeedsSlowUnlockTransition()2098     private boolean resolveNeedsSlowUnlockTransition() {
2099         if (mUserManager.isUserUnlocked(getCurrentUser())) {
2100             return false;
2101         }
2102         Intent homeIntent = new Intent(Intent.ACTION_MAIN)
2103                 .addCategory(Intent.CATEGORY_HOME);
2104         ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(homeIntent,
2105                 0 /* flags */);
2106         return FALLBACK_HOME_COMPONENT.equals(resolveInfo.getComponentInfo().getComponentName());
2107     }
2108 
2109     /**
2110      * Handle {@link #MSG_KEYGUARD_BOUNCER_CHANGED}
2111      * @see #sendKeyguardBouncerChanged(boolean)
2112      */
handleKeyguardBouncerChanged(int bouncer)2113     private void handleKeyguardBouncerChanged(int bouncer) {
2114         if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")");
2115         boolean isBouncer = (bouncer == 1);
2116         mBouncer = isBouncer;
2117         for (int i = 0; i < mCallbacks.size(); i++) {
2118             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
2119             if (cb != null) {
2120                 cb.onKeyguardBouncerChanged(isBouncer);
2121             }
2122         }
2123         updateBiometricListeningState();
2124     }
2125 
2126     /**
2127      * Handle {@link #MSG_REPORT_EMERGENCY_CALL_ACTION}
2128      */
handleReportEmergencyCallAction()2129     private void handleReportEmergencyCallAction() {
2130         for (int i = 0; i < mCallbacks.size(); i++) {
2131             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
2132             if (cb != null) {
2133                 cb.onEmergencyCallAction();
2134             }
2135         }
2136     }
2137 
isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus current)2138     private boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus current) {
2139         final boolean nowPluggedIn = current.isPluggedIn();
2140         final boolean wasPluggedIn = old.isPluggedIn();
2141         final boolean stateChangedWhilePluggedIn = wasPluggedIn && nowPluggedIn
2142             && (old.status != current.status);
2143 
2144         // change in plug state is always interesting
2145         if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) {
2146             return true;
2147         }
2148 
2149         // change in battery level
2150         if (old.level != current.level) {
2151             return true;
2152         }
2153 
2154         // change in charging current while plugged in
2155         if (nowPluggedIn && current.maxChargingWattage != old.maxChargingWattage) {
2156             return true;
2157         }
2158 
2159         return false;
2160     }
2161 
2162     /**
2163      * Remove the given observer's callback.
2164      *
2165      * @param callback The callback to remove
2166      */
removeCallback(KeyguardUpdateMonitorCallback callback)2167     public void removeCallback(KeyguardUpdateMonitorCallback callback) {
2168         checkIsHandlerThread();
2169         if (DEBUG) Log.v(TAG, "*** unregister callback for " + callback);
2170         for (int i = mCallbacks.size() - 1; i >= 0; i--) {
2171             if (mCallbacks.get(i).get() == callback) {
2172                 mCallbacks.remove(i);
2173             }
2174         }
2175     }
2176 
2177     /**
2178      * Register to receive notifications about general keyguard information
2179      * (see {@link InfoCallback}.
2180      * @param callback The callback to register
2181      */
registerCallback(KeyguardUpdateMonitorCallback callback)2182     public void registerCallback(KeyguardUpdateMonitorCallback callback) {
2183         checkIsHandlerThread();
2184         if (DEBUG) Log.v(TAG, "*** register callback for " + callback);
2185         // Prevent adding duplicate callbacks
2186         for (int i = 0; i < mCallbacks.size(); i++) {
2187             if (mCallbacks.get(i).get() == callback) {
2188                 if (DEBUG) Log.e(TAG, "Object tried to add another callback",
2189                         new Exception("Called by"));
2190                 return;
2191             }
2192         }
2193         mCallbacks.add(new WeakReference<KeyguardUpdateMonitorCallback>(callback));
2194         removeCallback(null); // remove unused references
2195         sendUpdates(callback);
2196     }
2197 
isSwitchingUser()2198     public boolean isSwitchingUser() {
2199         return mSwitchingUser;
2200     }
2201 
2202     @AnyThread
setSwitchingUser(boolean switching)2203     public void setSwitchingUser(boolean switching) {
2204         mSwitchingUser = switching;
2205         // Since this comes in on a binder thread, we need to post if first
2206         mHandler.post(mUpdateBiometricListeningState);
2207     }
2208 
sendUpdates(KeyguardUpdateMonitorCallback callback)2209     private void sendUpdates(KeyguardUpdateMonitorCallback callback) {
2210         // Notify listener of the current state
2211         callback.onRefreshBatteryInfo(mBatteryStatus);
2212         callback.onTimeChanged();
2213         callback.onRingerModeChanged(mRingMode);
2214         callback.onPhoneStateChanged(mPhoneState);
2215         callback.onRefreshCarrierInfo();
2216         callback.onClockVisibilityChanged();
2217         callback.onKeyguardVisibilityChangedRaw(mKeyguardIsVisible);
2218         callback.onTelephonyCapable(mTelephonyCapable);
2219         for (Entry<Integer, SimData> data : mSimDatas.entrySet()) {
2220             final SimData state = data.getValue();
2221             callback.onSimStateChanged(state.subId, state.slotId, state.simState);
2222         }
2223     }
2224 
sendKeyguardReset()2225     public void sendKeyguardReset() {
2226         mHandler.obtainMessage(MSG_KEYGUARD_RESET).sendToTarget();
2227     }
2228 
2229     /**
2230      * @see #handleKeyguardBouncerChanged(int)
2231      */
sendKeyguardBouncerChanged(boolean showingBouncer)2232     public void sendKeyguardBouncerChanged(boolean showingBouncer) {
2233         if (DEBUG) Log.d(TAG, "sendKeyguardBouncerChanged(" + showingBouncer + ")");
2234         Message message = mHandler.obtainMessage(MSG_KEYGUARD_BOUNCER_CHANGED);
2235         message.arg1 = showingBouncer ? 1 : 0;
2236         message.sendToTarget();
2237     }
2238 
2239     /**
2240      * Report that the user successfully entered the SIM PIN or PUK/SIM PIN so we
2241      * have the information earlier than waiting for the intent
2242      * broadcast from the telephony code.
2243      *
2244      * NOTE: Because handleSimStateChange() invokes callbacks immediately without going
2245      * through mHandler, this *must* be called from the UI thread.
2246      */
2247     @MainThread
reportSimUnlocked(int subId)2248     public void reportSimUnlocked(int subId) {
2249         if (DEBUG_SIM_STATES) Log.v(TAG, "reportSimUnlocked(subId=" + subId + ")");
2250         int slotId = SubscriptionManager.getSlotIndex(subId);
2251         handleSimStateChange(subId, slotId, State.READY);
2252     }
2253 
2254     /**
2255      * Report that the emergency call button has been pressed and the emergency dialer is
2256      * about to be displayed.
2257      *
2258      * @param bypassHandler runs immediately.
2259      *
2260      * NOTE: Must be called from UI thread if bypassHandler == true.
2261      */
reportEmergencyCallAction(boolean bypassHandler)2262     public void reportEmergencyCallAction(boolean bypassHandler) {
2263         if (!bypassHandler) {
2264             mHandler.obtainMessage(MSG_REPORT_EMERGENCY_CALL_ACTION).sendToTarget();
2265         } else {
2266             checkIsHandlerThread();
2267             handleReportEmergencyCallAction();
2268         }
2269     }
2270 
2271     /**
2272      * @return Whether the device is provisioned (whether they have gone through
2273      *   the setup wizard)
2274      */
isDeviceProvisioned()2275     public boolean isDeviceProvisioned() {
2276         return mDeviceProvisioned;
2277     }
2278 
getServiceState(int subId)2279     public ServiceState getServiceState(int subId) {
2280         return mServiceStates.get(subId);
2281     }
2282 
clearBiometricRecognized()2283     public void clearBiometricRecognized() {
2284         mUserFingerprintAuthenticated.clear();
2285         mUserFaceAuthenticated.clear();
2286         mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FINGERPRINT);
2287         mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FACE);
2288     }
2289 
isSimPinVoiceSecure()2290     public boolean isSimPinVoiceSecure() {
2291         // TODO: only count SIMs that handle voice
2292         return isSimPinSecure();
2293     }
2294 
2295     /**
2296      * If any SIM cards are currently secure.
2297      * @see #isSimPinSecure(State)
2298      */
isSimPinSecure()2299     public boolean isSimPinSecure() {
2300         // True if any SIM is pin secure
2301         for (SubscriptionInfo info : getSubscriptionInfo(false /* forceReload */)) {
2302             if (isSimPinSecure(getSimState(info.getSubscriptionId()))) return true;
2303         }
2304         return false;
2305     }
2306 
getSimState(int subId)2307     public State getSimState(int subId) {
2308         if (mSimDatas.containsKey(subId)) {
2309             return mSimDatas.get(subId).simState;
2310         } else {
2311             return State.UNKNOWN;
2312         }
2313     }
2314 
2315     private final TaskStackChangeListener
2316             mTaskStackListener = new TaskStackChangeListener() {
2317         @Override
2318         public void onTaskStackChangedBackground() {
2319             try {
2320                 ActivityManager.StackInfo info = ActivityTaskManager.getService().getStackInfo(
2321                         WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_ASSISTANT);
2322                 if (info == null) {
2323                     return;
2324                 }
2325                 mHandler.sendMessage(mHandler.obtainMessage(MSG_ASSISTANT_STACK_CHANGED,
2326                         info.visible));
2327             } catch (RemoteException e) {
2328                 Log.e(TAG, "unable to check task stack", e);
2329             }
2330         }
2331     };
2332 
2333     /**
2334      * @return true if and only if the state has changed for the specified {@code slotId}
2335      */
refreshSimState(int subId, int slotId)2336     private boolean refreshSimState(int subId, int slotId) {
2337 
2338         // This is awful. It exists because there are two APIs for getting the SIM status
2339         // that don't return the complete set of values and have different types. In Keyguard we
2340         // need IccCardConstants, but TelephonyManager would only give us
2341         // TelephonyManager.SIM_STATE*, so we retrieve it manually.
2342         final TelephonyManager tele = TelephonyManager.from(mContext);
2343         int simState =  tele.getSimState(slotId);
2344         State state;
2345         try {
2346             state = State.intToState(simState);
2347         } catch(IllegalArgumentException ex) {
2348             Log.w(TAG, "Unknown sim state: " + simState);
2349             state = State.UNKNOWN;
2350         }
2351         SimData data = mSimDatas.get(subId);
2352         final boolean changed;
2353         if (data == null) {
2354             data = new SimData(state, slotId, subId);
2355             mSimDatas.put(subId, data);
2356             changed = true; // no data yet; force update
2357         } else {
2358             changed = data.simState != state;
2359             data.simState = state;
2360         }
2361         return changed;
2362     }
2363 
2364     /**
2365      * If the {@code state} is currently requiring a SIM PIN, PUK, or is disabled.
2366      */
isSimPinSecure(IccCardConstants.State state)2367     public static boolean isSimPinSecure(IccCardConstants.State state) {
2368         return (state == IccCardConstants.State.PIN_REQUIRED
2369                 || state == IccCardConstants.State.PUK_REQUIRED
2370                 || state == IccCardConstants.State.PERM_DISABLED);
2371     }
2372 
getCachedDisplayClientState()2373     public DisplayClientState getCachedDisplayClientState() {
2374         return mDisplayClientState;
2375     }
2376 
2377     // TODO: use these callbacks elsewhere in place of the existing notifyScreen*()
2378     // (KeyguardViewMediator, KeyguardHostView)
dispatchStartedWakingUp()2379     public void dispatchStartedWakingUp() {
2380         synchronized (this) {
2381             mDeviceInteractive = true;
2382         }
2383         mHandler.sendEmptyMessage(MSG_STARTED_WAKING_UP);
2384     }
2385 
dispatchStartedGoingToSleep(int why)2386     public void dispatchStartedGoingToSleep(int why) {
2387         mHandler.sendMessage(mHandler.obtainMessage(MSG_STARTED_GOING_TO_SLEEP, why, 0));
2388     }
2389 
dispatchFinishedGoingToSleep(int why)2390     public void dispatchFinishedGoingToSleep(int why) {
2391         synchronized(this) {
2392             mDeviceInteractive = false;
2393         }
2394         mHandler.sendMessage(mHandler.obtainMessage(MSG_FINISHED_GOING_TO_SLEEP, why, 0));
2395     }
2396 
dispatchScreenTurnedOn()2397     public void dispatchScreenTurnedOn() {
2398         synchronized (this) {
2399             mScreenOn = true;
2400         }
2401         mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_ON);
2402     }
2403 
dispatchScreenTurnedOff()2404     public void dispatchScreenTurnedOff() {
2405         synchronized(this) {
2406             mScreenOn = false;
2407         }
2408         mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_OFF);
2409     }
2410 
dispatchDreamingStarted()2411     public void dispatchDreamingStarted() {
2412         mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 1, 0));
2413     }
2414 
dispatchDreamingStopped()2415     public void dispatchDreamingStopped() {
2416         mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 0, 0));
2417     }
2418 
isDeviceInteractive()2419     public boolean isDeviceInteractive() {
2420         return mDeviceInteractive;
2421     }
2422 
isGoingToSleep()2423     public boolean isGoingToSleep() {
2424         return mGoingToSleep;
2425     }
2426 
2427     /**
2428      * Find the next SubscriptionId for a SIM in the given state, favoring lower slot numbers first.
2429      * @param state
2430      * @return subid or {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID} if none found
2431      */
getNextSubIdForState(State state)2432     public int getNextSubIdForState(State state) {
2433         List<SubscriptionInfo> list = getSubscriptionInfo(false /* forceReload */);
2434         int resultId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
2435         int bestSlotId = Integer.MAX_VALUE; // Favor lowest slot first
2436         for (int i = 0; i < list.size(); i++) {
2437             final SubscriptionInfo info = list.get(i);
2438             final int id = info.getSubscriptionId();
2439             int slotId = SubscriptionManager.getSlotIndex(id);
2440             if (state == getSimState(id) && bestSlotId > slotId ) {
2441                 resultId = id;
2442                 bestSlotId = slotId;
2443             }
2444         }
2445         return resultId;
2446     }
2447 
getSubscriptionInfoForSubId(int subId)2448     public SubscriptionInfo getSubscriptionInfoForSubId(int subId) {
2449         List<SubscriptionInfo> list = getSubscriptionInfo(false /* forceReload */);
2450         for (int i = 0; i < list.size(); i++) {
2451             SubscriptionInfo info = list.get(i);
2452             if (subId == info.getSubscriptionId()) return info;
2453         }
2454         return null; // not found
2455     }
2456 
2457     /**
2458      * @return a cached version of DevicePolicyManager.isLogoutEnabled()
2459      */
isLogoutEnabled()2460     public boolean isLogoutEnabled() {
2461         return mLogoutEnabled;
2462     }
2463 
updateLogoutEnabled()2464     private void updateLogoutEnabled() {
2465         checkIsHandlerThread();
2466         boolean logoutEnabled = mDevicePolicyManager.isLogoutEnabled();
2467         if (mLogoutEnabled != logoutEnabled) {
2468             mLogoutEnabled = logoutEnabled;
2469             for (int i = 0; i < mCallbacks.size(); i++) {
2470                 KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
2471                 if (cb != null) {
2472                     cb.onLogoutEnabledChanged();
2473                 }
2474             }
2475         }
2476     }
2477 
checkIsHandlerThread()2478     private void checkIsHandlerThread() {
2479         if (sDisableHandlerCheckForTesting) {
2480             return;
2481         }
2482         if (!mHandler.getLooper().isCurrentThread()) {
2483             Log.wtf(TAG, "must call on mHandler's thread "
2484                     + mHandler.getLooper().getThread() + ", not " + Thread.currentThread());
2485         }
2486     }
2487 
2488     /**
2489      * Turn off the handler check for testing.
2490      *
2491      * This is necessary because currently tests are not too careful about which thread they call
2492      * into this class on.
2493      *
2494      * Note that this must be called before scheduling any work involving KeyguardUpdateMonitor
2495      * instances.
2496      *
2497      * TODO: fix the tests and remove this.
2498      */
2499     @VisibleForTesting
disableHandlerCheckForTesting(Instrumentation instrumentation)2500     public static void disableHandlerCheckForTesting(Instrumentation instrumentation) {
2501         Preconditions.checkNotNull(instrumentation, "Must only call this method in tests!");
2502         // Don't need synchronization here *if* the callers follow the contract and call this only
2503         // before scheduling work for KeyguardUpdateMonitor on other threads, because the scheduling
2504         // of that work forces a happens-before relationship.
2505         sDisableHandlerCheckForTesting = true;
2506     }
2507 
dump(FileDescriptor fd, PrintWriter pw, String[] args)2508     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2509         pw.println("KeyguardUpdateMonitor state:");
2510         pw.println("  SIM States:");
2511         for (SimData data : mSimDatas.values()) {
2512             pw.println("    " + data.toString());
2513         }
2514         pw.println("  Subs:");
2515         if (mSubscriptionInfo != null) {
2516             for (int i = 0; i < mSubscriptionInfo.size(); i++) {
2517                 pw.println("    " + mSubscriptionInfo.get(i));
2518             }
2519         }
2520         pw.println("  Service states:");
2521         for (int subId : mServiceStates.keySet()) {
2522             pw.println("    " + subId + "=" + mServiceStates.get(subId));
2523         }
2524         if (mFpm != null && mFpm.isHardwareDetected()) {
2525             final int userId = ActivityManager.getCurrentUser();
2526             final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
2527             pw.println("  Fingerprint state (user=" + userId + ")");
2528             pw.println("    allowed=" + isUnlockingWithBiometricAllowed());
2529             pw.println("    auth'd=" + mUserFingerprintAuthenticated.get(userId));
2530             pw.println("    authSinceBoot="
2531                     + getStrongAuthTracker().hasUserAuthenticatedSinceBoot());
2532             pw.println("    disabled(DPM)=" + isFingerprintDisabled(userId));
2533             pw.println("    possible=" + isUnlockWithFingerprintPossible(userId));
2534             pw.println("    listening: actual=" + mFingerprintRunningState
2535                     + " expected=" + (shouldListenForFingerprint() ? 1 : 0));
2536             pw.println("    strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
2537             pw.println("    trustManaged=" + getUserTrustIsManaged(userId));
2538         }
2539         if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
2540             final int userId = ActivityManager.getCurrentUser();
2541             final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
2542             pw.println("  Face authentication state (user=" + userId + ")");
2543             pw.println("    allowed=" + isUnlockingWithBiometricAllowed());
2544             pw.println("    auth'd=" + mUserFaceAuthenticated.get(userId));
2545             pw.println("    authSinceBoot="
2546                     + getStrongAuthTracker().hasUserAuthenticatedSinceBoot());
2547             pw.println("    disabled(DPM)=" + isFaceDisabled(userId));
2548             pw.println("    possible=" + isUnlockWithFacePossible(userId));
2549             pw.println("    strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
2550             pw.println("    trustManaged=" + getUserTrustIsManaged(userId));
2551             pw.println("    enabledByUser=" + mFaceSettingEnabledForUser);
2552         }
2553     }
2554 }
2555