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.logging
18 
19 import android.hardware.biometrics.BiometricSourceType
20 import com.android.systemui.dagger.SysUISingleton
21 import com.android.systemui.log.LogBuffer
22 import com.android.systemui.log.core.LogLevel
23 import com.android.systemui.log.core.LogLevel.DEBUG
24 import com.android.systemui.log.core.LogLevel.INFO
25 import com.android.systemui.log.dagger.BiometricLog
26 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER
27 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_NONE
28 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_ONLY_WAKE
29 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_SHOW_BOUNCER
30 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_COLLAPSING
31 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK
32 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_FROM_DREAM
33 import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
34 import com.google.errorprone.annotations.CompileTimeConstant
35 import javax.inject.Inject
36 
37 private const val TAG = "BiometricUnlockLogger"
38 
39 /** Helper class for logging for [com.android.systemui.statusbar.phone.BiometricUnlockController] */
40 @SysUISingleton
41 class BiometricUnlockLogger @Inject constructor(@BiometricLog private val logBuffer: LogBuffer) {
inull42     fun i(@CompileTimeConstant msg: String) = log(msg, INFO)
43     fun d(@CompileTimeConstant msg: String) = log(msg, DEBUG)
44     fun log(@CompileTimeConstant msg: String, level: LogLevel) = logBuffer.log(TAG, level, msg)
45 
46     fun logStartWakeAndUnlock(mode: Int) {
47         logBuffer.log(
48             TAG,
49             DEBUG,
50             { int1 = mode },
51             { "startWakeAndUnlock(${wakeAndUnlockModeToString(int1)})" }
52         )
53     }
54 
logUdfpsAttemptThresholdMetnull55     fun logUdfpsAttemptThresholdMet(consecutiveFailedAttempts: Int) {
56         logBuffer.log(
57             TAG,
58             DEBUG,
59             { int1 = consecutiveFailedAttempts },
60             { "udfpsAttemptThresholdMet consecutiveFailedAttempts=$int1" }
61         )
62     }
63 
logCalculateModeForFingerprintUnlockingAllowednull64     fun logCalculateModeForFingerprintUnlockingAllowed(
65         deviceInteractive: Boolean,
66         keyguardShowing: Boolean,
67         deviceDreaming: Boolean
68     ) {
69         logBuffer.log(
70             TAG,
71             DEBUG,
72             {
73                 bool1 = deviceInteractive
74                 bool2 = keyguardShowing
75                 bool3 = deviceDreaming
76             },
77             {
78                 "calculateModeForFingerprint unlockingAllowed=true" +
79                     " deviceInteractive=$bool1 isKeyguardShowing=$bool2" +
80                     " deviceDreaming=$bool3"
81             }
82         )
83     }
84 
logCalculateModeForFingerprintUnlockingNotAllowednull85     fun logCalculateModeForFingerprintUnlockingNotAllowed(
86         strongBiometric: Boolean,
87         strongAuthFlags: Int,
88         nonStrongBiometricAllowed: Boolean,
89         deviceInteractive: Boolean,
90         keyguardShowing: Boolean
91     ) {
92         logBuffer.log(
93             TAG,
94             DEBUG,
95             {
96                 int1 = strongAuthFlags
97                 bool1 = strongBiometric
98                 bool2 = nonStrongBiometricAllowed
99                 bool3 = deviceInteractive
100                 bool4 = keyguardShowing
101             },
102             {
103                 "calculateModeForFingerprint unlockingAllowed=false" +
104                     " strongBiometric=$bool1 strongAuthFlags=$int1" +
105                     " nonStrongBiometricAllowed=$bool2" +
106                     " deviceInteractive=$bool3 isKeyguardShowing=$bool4"
107             }
108         )
109     }
110 
logCalculateModeForPassiveAuthUnlockingAllowednull111     fun logCalculateModeForPassiveAuthUnlockingAllowed(
112         deviceInteractive: Boolean,
113         keyguardShowing: Boolean,
114         deviceDreaming: Boolean,
115         bypass: Boolean
116     ) {
117         logBuffer.log(
118             TAG,
119             DEBUG,
120             {
121                 bool1 = deviceInteractive
122                 bool2 = keyguardShowing
123                 bool3 = deviceDreaming
124                 bool4 = bypass
125             },
126             {
127                 "calculateModeForPassiveAuth unlockingAllowed=true" +
128                     " deviceInteractive=$bool1 isKeyguardShowing=$bool2" +
129                     " deviceDreaming=$bool3 bypass=$bool4"
130             }
131         )
132     }
133 
logCalculateModeForPassiveAuthUnlockingNotAllowednull134     fun logCalculateModeForPassiveAuthUnlockingNotAllowed(
135         strongBiometric: Boolean,
136         strongAuthFlags: Int,
137         nonStrongBiometricAllowed: Boolean,
138         deviceInteractive: Boolean,
139         keyguardShowing: Boolean,
140         bypass: Boolean
141     ) {
142         logBuffer.log(
143             TAG,
144             DEBUG,
145             {
146                 int1 = if (strongBiometric) 1 else 0
147                 int2 = strongAuthFlags
148                 bool1 = nonStrongBiometricAllowed
149                 bool2 = deviceInteractive
150                 bool3 = keyguardShowing
151                 bool4 = bypass
152             },
153             {
154                 "calculateModeForPassiveAuth unlockingAllowed=false" +
155                     " strongBiometric=${int1 == 1}" +
156                     " strongAuthFlags=$int2 nonStrongBiometricAllowed=$bool1" +
157                     " deviceInteractive=$bool2 isKeyguardShowing=$bool3 bypass=$bool4"
158             }
159         )
160     }
161 
deferringAuthenticationDueToSleepnull162     fun deferringAuthenticationDueToSleep(
163         userId: Int,
164         biometricSourceType: BiometricSourceType,
165         alreadyPendingAuth: Boolean
166     ) {
167         logBuffer.log(
168             TAG,
169             DEBUG,
170             {
171                 int1 = userId
172                 str1 = biometricSourceType.name
173                 bool2 = alreadyPendingAuth
174             },
175             {
176                 "onBiometricAuthenticated, deferring auth: userId: $int1, " +
177                     "biometricSourceType: $str1, " +
178                     "goingToSleep: true, " +
179                     "mPendingAuthentication != null: $bool2"
180             }
181         )
182     }
183 
finishedGoingToSleepWithPendingAuthnull184     fun finishedGoingToSleepWithPendingAuth() {
185         logBuffer.log(
186             TAG,
187             LogLevel.DEBUG,
188             "onFinishedGoingToSleep with pendingAuthenticated != null"
189         )
190     }
191 }
192 
wakeAndUnlockModeToStringnull193 private fun wakeAndUnlockModeToString(mode: Int): String {
194     return when (mode) {
195         MODE_NONE -> "MODE_NONE"
196         MODE_WAKE_AND_UNLOCK -> "MODE_WAKE_AND_UNLOCK"
197         MODE_WAKE_AND_UNLOCK_PULSING -> "MODE_WAKE_AND_UNLOCK_PULSING"
198         MODE_SHOW_BOUNCER -> "MODE_SHOW_BOUNCER"
199         MODE_ONLY_WAKE -> "MODE_ONLY_WAKE"
200         MODE_UNLOCK_COLLAPSING -> "MODE_UNLOCK_COLLAPSING"
201         MODE_WAKE_AND_UNLOCK_FROM_DREAM -> "MODE_WAKE_AND_UNLOCK_FROM_DREAM"
202         MODE_DISMISS_BOUNCER -> "MODE_DISMISS_BOUNCER"
203         else -> "UNKNOWN{$mode}"
204     }
205 }
206