1 /* 2 * Copyright (C) 2022 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 android.annotation.StringDef 20 import android.os.PowerManager 21 import com.android.internal.logging.UiEvent 22 import com.android.internal.logging.UiEventLogger 23 import com.android.keyguard.FaceAuthApiRequestReason.Companion.ACCESSIBILITY_ACTION 24 import com.android.keyguard.FaceAuthApiRequestReason.Companion.NOTIFICATION_PANEL_CLICKED 25 import com.android.keyguard.FaceAuthApiRequestReason.Companion.PICK_UP_GESTURE_TRIGGERED 26 import com.android.keyguard.FaceAuthApiRequestReason.Companion.QS_EXPANDED 27 import com.android.keyguard.FaceAuthApiRequestReason.Companion.SWIPE_UP_ON_BOUNCER 28 import com.android.keyguard.FaceAuthApiRequestReason.Companion.UDFPS_POINTER_DOWN 29 import com.android.keyguard.InternalFaceAuthReasons.ALL_AUTHENTICATORS_REGISTERED 30 import com.android.keyguard.InternalFaceAuthReasons.ALTERNATE_BIOMETRIC_BOUNCER_SHOWN 31 import com.android.keyguard.InternalFaceAuthReasons.ASSISTANT_VISIBILITY_CHANGED 32 import com.android.keyguard.InternalFaceAuthReasons.AUTH_REQUEST_DURING_CANCELLATION 33 import com.android.keyguard.InternalFaceAuthReasons.BIOMETRIC_ENABLED 34 import com.android.keyguard.InternalFaceAuthReasons.CAMERA_LAUNCHED 35 import com.android.keyguard.InternalFaceAuthReasons.DEVICE_WOKEN_UP_ON_REACH_GESTURE 36 import com.android.keyguard.InternalFaceAuthReasons.DISPLAY_OFF 37 import com.android.keyguard.InternalFaceAuthReasons.DREAM_STARTED 38 import com.android.keyguard.InternalFaceAuthReasons.DREAM_STOPPED 39 import com.android.keyguard.InternalFaceAuthReasons.ENROLLMENTS_CHANGED 40 import com.android.keyguard.InternalFaceAuthReasons.FACE_AUTHENTICATED 41 import com.android.keyguard.InternalFaceAuthReasons.FACE_AUTH_STOPPED_ON_USER_INPUT 42 import com.android.keyguard.InternalFaceAuthReasons.FACE_CANCEL_NOT_RECEIVED 43 import com.android.keyguard.InternalFaceAuthReasons.FACE_LOCKOUT_RESET 44 import com.android.keyguard.InternalFaceAuthReasons.FINISHED_GOING_TO_SLEEP 45 import com.android.keyguard.InternalFaceAuthReasons.FP_AUTHENTICATED 46 import com.android.keyguard.InternalFaceAuthReasons.FP_LOCKED_OUT 47 import com.android.keyguard.InternalFaceAuthReasons.GOING_TO_SLEEP 48 import com.android.keyguard.InternalFaceAuthReasons.KEYGUARD_GOING_AWAY 49 import com.android.keyguard.InternalFaceAuthReasons.KEYGUARD_INIT 50 import com.android.keyguard.InternalFaceAuthReasons.KEYGUARD_OCCLUSION_CHANGED 51 import com.android.keyguard.InternalFaceAuthReasons.KEYGUARD_RESET 52 import com.android.keyguard.InternalFaceAuthReasons.KEYGUARD_VISIBILITY_CHANGED 53 import com.android.keyguard.InternalFaceAuthReasons.NON_STRONG_BIOMETRIC_ALLOWED_CHANGED 54 import com.android.keyguard.InternalFaceAuthReasons.OCCLUDING_APP_REQUESTED 55 import com.android.keyguard.InternalFaceAuthReasons.POSTURE_CHANGED 56 import com.android.keyguard.InternalFaceAuthReasons.PRIMARY_BOUNCER_SHOWN 57 import com.android.keyguard.InternalFaceAuthReasons.PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN 58 import com.android.keyguard.InternalFaceAuthReasons.RETRY_AFTER_HW_UNAVAILABLE 59 import com.android.keyguard.InternalFaceAuthReasons.STARTED_WAKING_UP 60 import com.android.keyguard.InternalFaceAuthReasons.STRONG_AUTH_ALLOWED_CHANGED 61 import com.android.keyguard.InternalFaceAuthReasons.TRUST_DISABLED 62 import com.android.keyguard.InternalFaceAuthReasons.TRUST_ENABLED 63 import com.android.keyguard.InternalFaceAuthReasons.USER_SWITCHING 64 65 /** 66 * List of reasons why face auth is requested by clients through 67 * [KeyguardUpdateMonitor.requestFaceAuth]. 68 */ 69 @Retention(AnnotationRetention.SOURCE) 70 @StringDef( 71 SWIPE_UP_ON_BOUNCER, 72 UDFPS_POINTER_DOWN, 73 NOTIFICATION_PANEL_CLICKED, 74 QS_EXPANDED, 75 PICK_UP_GESTURE_TRIGGERED, 76 ACCESSIBILITY_ACTION, 77 ) 78 annotation class FaceAuthApiRequestReason { 79 companion object { 80 const val SWIPE_UP_ON_BOUNCER = "Face auth due to swipe up on bouncer" 81 const val UDFPS_POINTER_DOWN = "Face auth triggered due to finger down on UDFPS" 82 const val NOTIFICATION_PANEL_CLICKED = "Face auth due to notification panel click." 83 const val QS_EXPANDED = "Face auth due to QS expansion." 84 const val PICK_UP_GESTURE_TRIGGERED = 85 "Face auth due to pickup gesture triggered when the device is awake and not from AOD." 86 const val ACCESSIBILITY_ACTION = "Face auth due to an accessibility action." 87 } 88 } 89 90 /** List of events why face auth could be triggered by [KeyguardUpdateMonitor]. */ 91 private object InternalFaceAuthReasons { 92 const val OCCLUDING_APP_REQUESTED = "Face auth due to request from occluding app." 93 const val RETRY_AFTER_HW_UNAVAILABLE = "Face auth due to retry after hardware unavailable." 94 const val FACE_LOCKOUT_RESET = "Face auth due to face lockout reset." 95 const val DEVICE_WOKEN_UP_ON_REACH_GESTURE = 96 "Face auth requested when user reaches for the device on AoD." 97 const val ALTERNATE_BIOMETRIC_BOUNCER_SHOWN = "Face auth due to alternate bouncer shown." 98 const val PRIMARY_BOUNCER_SHOWN = "Face auth started/stopped due to primary bouncer shown." 99 const val PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN = 100 "Face auth started/stopped due to bouncer being shown or will be shown." 101 const val TRUST_DISABLED = "Face auth started due to trust disabled." 102 const val TRUST_ENABLED = "Face auth stopped due to trust enabled." 103 const val KEYGUARD_OCCLUSION_CHANGED = 104 "Face auth started/stopped due to keyguard occlusion change." 105 const val ASSISTANT_VISIBILITY_CHANGED = 106 "Face auth started/stopped due to assistant visibility change." 107 const val STARTED_WAKING_UP = "Face auth started/stopped due to device starting to wake up." 108 const val DREAM_STOPPED = "Face auth due to dream stopped." 109 const val ALL_AUTHENTICATORS_REGISTERED = "Face auth due to all authenticators registered." 110 const val ENROLLMENTS_CHANGED = "Face auth due to enrolments changed." 111 const val KEYGUARD_VISIBILITY_CHANGED = 112 "Face auth stopped or started due to keyguard visibility changed." 113 const val FACE_CANCEL_NOT_RECEIVED = "Face auth stopped due to face cancel signal not received." 114 const val AUTH_REQUEST_DURING_CANCELLATION = 115 "Another request to start face auth received while cancelling face auth" 116 const val DREAM_STARTED = "Face auth stopped because dreaming started" 117 const val FP_LOCKED_OUT = "Face auth stopped because fp locked out" 118 const val FACE_AUTH_STOPPED_ON_USER_INPUT = 119 "Face auth stopped because user started typing password/pin" 120 const val KEYGUARD_GOING_AWAY = "Face auth stopped because keyguard going away" 121 const val CAMERA_LAUNCHED = "Face auth started/stopped because camera launched" 122 const val FP_AUTHENTICATED = "Face auth started/stopped because fingerprint launched" 123 const val GOING_TO_SLEEP = "Face auth started/stopped because going to sleep" 124 const val FINISHED_GOING_TO_SLEEP = "Face auth stopped because finished going to sleep" 125 const val KEYGUARD_INIT = "Face auth started/stopped because Keyguard is initialized" 126 const val KEYGUARD_RESET = "Face auth started/stopped because Keyguard is reset" 127 const val USER_SWITCHING = "Face auth started/stopped because user is switching" 128 const val FACE_AUTHENTICATED = "Face auth started/stopped because face is authenticated" 129 const val BIOMETRIC_ENABLED = 130 "Face auth started/stopped because biometric is enabled on keyguard" 131 const val STRONG_AUTH_ALLOWED_CHANGED = "Face auth stopped because strong auth allowed changed" 132 const val NON_STRONG_BIOMETRIC_ALLOWED_CHANGED = 133 "Face auth stopped because non strong biometric allowed changed" 134 const val POSTURE_CHANGED = "Face auth started/stopped due to device posture changed." 135 const val DISPLAY_OFF = "Face auth stopped due to display state OFF." 136 } 137 138 /** 139 * UiEvents that are logged to identify why face auth is being triggered. 140 * 141 * @param extraInfo is logged as the position. See [UiEventLogger#logWithInstanceIdAndPosition] 142 */ 143 enum class FaceAuthUiEvent 144 constructor(private val id: Int, val reason: String, var extraInfo: Int = 0) : 145 UiEventLogger.UiEventEnum { 146 @UiEvent(doc = OCCLUDING_APP_REQUESTED) 147 FACE_AUTH_TRIGGERED_OCCLUDING_APP_REQUESTED(1146, OCCLUDING_APP_REQUESTED), 148 @UiEvent(doc = UDFPS_POINTER_DOWN) 149 FACE_AUTH_TRIGGERED_UDFPS_POINTER_DOWN(1147, UDFPS_POINTER_DOWN), 150 @UiEvent(doc = SWIPE_UP_ON_BOUNCER) 151 FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER(1148, SWIPE_UP_ON_BOUNCER), 152 @UiEvent(doc = DEVICE_WOKEN_UP_ON_REACH_GESTURE) 153 FACE_AUTH_TRIGGERED_ON_REACH_GESTURE_ON_AOD(1149, DEVICE_WOKEN_UP_ON_REACH_GESTURE), 154 @UiEvent(doc = FACE_LOCKOUT_RESET) 155 FACE_AUTH_TRIGGERED_FACE_LOCKOUT_RESET(1150, FACE_LOCKOUT_RESET), 156 @UiEvent(doc = QS_EXPANDED) FACE_AUTH_TRIGGERED_QS_EXPANDED(1151, QS_EXPANDED), 157 @UiEvent(doc = NOTIFICATION_PANEL_CLICKED) 158 FACE_AUTH_TRIGGERED_NOTIFICATION_PANEL_CLICKED(1152, NOTIFICATION_PANEL_CLICKED), 159 @UiEvent(doc = PICK_UP_GESTURE_TRIGGERED) 160 FACE_AUTH_TRIGGERED_PICK_UP_GESTURE_TRIGGERED(1153, PICK_UP_GESTURE_TRIGGERED), 161 @UiEvent(doc = ALTERNATE_BIOMETRIC_BOUNCER_SHOWN) 162 FACE_AUTH_TRIGGERED_ALTERNATE_BIOMETRIC_BOUNCER_SHOWN(1154, ALTERNATE_BIOMETRIC_BOUNCER_SHOWN), 163 @UiEvent(doc = PRIMARY_BOUNCER_SHOWN) 164 FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN(1155, PRIMARY_BOUNCER_SHOWN), 165 @UiEvent(doc = PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN) 166 FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN( 167 1197, 168 PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN 169 ), 170 @UiEvent(doc = RETRY_AFTER_HW_UNAVAILABLE) 171 FACE_AUTH_TRIGGERED_RETRY_AFTER_HW_UNAVAILABLE(1156, RETRY_AFTER_HW_UNAVAILABLE), 172 @UiEvent(doc = TRUST_DISABLED) FACE_AUTH_TRIGGERED_TRUST_DISABLED(1158, TRUST_DISABLED), 173 @UiEvent(doc = TRUST_ENABLED) FACE_AUTH_STOPPED_TRUST_ENABLED(1173, TRUST_ENABLED), 174 @UiEvent(doc = KEYGUARD_OCCLUSION_CHANGED) 175 FACE_AUTH_UPDATED_KEYGUARD_OCCLUSION_CHANGED(1159, KEYGUARD_OCCLUSION_CHANGED), 176 @UiEvent(doc = ASSISTANT_VISIBILITY_CHANGED) 177 FACE_AUTH_UPDATED_ASSISTANT_VISIBILITY_CHANGED(1160, ASSISTANT_VISIBILITY_CHANGED), 178 @UiEvent(doc = STARTED_WAKING_UP) 179 FACE_AUTH_UPDATED_STARTED_WAKING_UP(1161, STARTED_WAKING_UP) { 180 override fun extraInfoToString(): String { 181 return PowerManager.wakeReasonToString(extraInfo) 182 } 183 }, 184 @UiEvent(doc = POSTURE_CHANGED) FACE_AUTH_UPDATED_POSTURE_CHANGED(1265, POSTURE_CHANGED), 185 @Deprecated( 186 "Not a face auth trigger.", 187 ReplaceWith( 188 "FACE_AUTH_UPDATED_STARTED_WAKING_UP, " + 189 "extraInfo=PowerManager.WAKE_REASON_DREAM_FINISHED" 190 ) 191 ) 192 @UiEvent(doc = DREAM_STOPPED) 193 FACE_AUTH_TRIGGERED_DREAM_STOPPED(1162, DREAM_STOPPED), 194 @UiEvent(doc = ALL_AUTHENTICATORS_REGISTERED) 195 FACE_AUTH_TRIGGERED_ALL_AUTHENTICATORS_REGISTERED(1163, ALL_AUTHENTICATORS_REGISTERED), 196 @UiEvent(doc = ENROLLMENTS_CHANGED) 197 FACE_AUTH_TRIGGERED_ENROLLMENTS_CHANGED(1164, ENROLLMENTS_CHANGED), 198 @UiEvent(doc = KEYGUARD_VISIBILITY_CHANGED) 199 FACE_AUTH_UPDATED_KEYGUARD_VISIBILITY_CHANGED(1165, KEYGUARD_VISIBILITY_CHANGED), 200 @UiEvent(doc = FACE_CANCEL_NOT_RECEIVED) 201 FACE_AUTH_STOPPED_FACE_CANCEL_NOT_RECEIVED(1174, FACE_CANCEL_NOT_RECEIVED), 202 @UiEvent(doc = AUTH_REQUEST_DURING_CANCELLATION) 203 FACE_AUTH_TRIGGERED_DURING_CANCELLATION(1175, AUTH_REQUEST_DURING_CANCELLATION), 204 @UiEvent(doc = DREAM_STARTED) FACE_AUTH_STOPPED_DREAM_STARTED(1176, DREAM_STARTED), 205 @UiEvent(doc = FP_LOCKED_OUT) FACE_AUTH_STOPPED_FP_LOCKED_OUT(1177, FP_LOCKED_OUT), 206 @UiEvent(doc = FACE_AUTH_STOPPED_ON_USER_INPUT) 207 FACE_AUTH_STOPPED_USER_INPUT_ON_BOUNCER(1178, FACE_AUTH_STOPPED_ON_USER_INPUT), 208 @UiEvent(doc = KEYGUARD_GOING_AWAY) 209 FACE_AUTH_STOPPED_KEYGUARD_GOING_AWAY(1179, KEYGUARD_GOING_AWAY), 210 @UiEvent(doc = CAMERA_LAUNCHED) FACE_AUTH_UPDATED_CAMERA_LAUNCHED(1180, CAMERA_LAUNCHED), 211 @UiEvent(doc = FP_AUTHENTICATED) FACE_AUTH_UPDATED_FP_AUTHENTICATED(1181, FP_AUTHENTICATED), 212 @UiEvent(doc = GOING_TO_SLEEP) FACE_AUTH_UPDATED_GOING_TO_SLEEP(1182, GOING_TO_SLEEP), 213 @UiEvent(doc = FINISHED_GOING_TO_SLEEP) 214 FACE_AUTH_STOPPED_FINISHED_GOING_TO_SLEEP(1183, FINISHED_GOING_TO_SLEEP), 215 @UiEvent(doc = KEYGUARD_INIT) FACE_AUTH_UPDATED_ON_KEYGUARD_INIT(1189, KEYGUARD_INIT), 216 @UiEvent(doc = KEYGUARD_RESET) FACE_AUTH_UPDATED_KEYGUARD_RESET(1185, KEYGUARD_RESET), 217 @UiEvent(doc = USER_SWITCHING) FACE_AUTH_UPDATED_USER_SWITCHING(1186, USER_SWITCHING), 218 @UiEvent(doc = FACE_AUTHENTICATED) 219 FACE_AUTH_UPDATED_ON_FACE_AUTHENTICATED(1187, FACE_AUTHENTICATED), 220 @UiEvent(doc = BIOMETRIC_ENABLED) 221 FACE_AUTH_UPDATED_BIOMETRIC_ENABLED_ON_KEYGUARD(1188, BIOMETRIC_ENABLED), 222 @UiEvent(doc = STRONG_AUTH_ALLOWED_CHANGED) 223 FACE_AUTH_UPDATED_STRONG_AUTH_CHANGED(1255, STRONG_AUTH_ALLOWED_CHANGED), 224 @UiEvent(doc = NON_STRONG_BIOMETRIC_ALLOWED_CHANGED) 225 FACE_AUTH_NON_STRONG_BIOMETRIC_ALLOWED_CHANGED(1256, NON_STRONG_BIOMETRIC_ALLOWED_CHANGED), 226 @UiEvent(doc = ACCESSIBILITY_ACTION) FACE_AUTH_ACCESSIBILITY_ACTION(1454, ACCESSIBILITY_ACTION), 227 @UiEvent(doc = DISPLAY_OFF) FACE_AUTH_DISPLAY_OFF(1461, DISPLAY_OFF); 228 229 override fun getId(): Int = this.id 230 231 /** Convert [extraInfo] to a human-readable string. By default, this is empty. */ 232 open fun extraInfoToString(): String = "" 233 } 234 235 private val apiRequestReasonToUiEvent = 236 mapOf( 237 SWIPE_UP_ON_BOUNCER to FaceAuthUiEvent.FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER, 238 UDFPS_POINTER_DOWN to FaceAuthUiEvent.FACE_AUTH_TRIGGERED_UDFPS_POINTER_DOWN, 239 NOTIFICATION_PANEL_CLICKED to 240 FaceAuthUiEvent.FACE_AUTH_TRIGGERED_NOTIFICATION_PANEL_CLICKED, 241 QS_EXPANDED to FaceAuthUiEvent.FACE_AUTH_TRIGGERED_QS_EXPANDED, 242 PICK_UP_GESTURE_TRIGGERED to FaceAuthUiEvent.FACE_AUTH_TRIGGERED_PICK_UP_GESTURE_TRIGGERED, 243 PICK_UP_GESTURE_TRIGGERED to FaceAuthUiEvent.FACE_AUTH_TRIGGERED_PICK_UP_GESTURE_TRIGGERED, 244 ACCESSIBILITY_ACTION to FaceAuthUiEvent.FACE_AUTH_ACCESSIBILITY_ACTION, 245 ) 246 247 /** Converts the [reason] to the corresponding [FaceAuthUiEvent]. */ 248 fun apiRequestReasonToUiEvent(@FaceAuthApiRequestReason reason: String): FaceAuthUiEvent = 249 apiRequestReasonToUiEvent[reason]!! 250