• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.CurrentTimeMillisLong
20 import com.android.systemui.dump.DumpsysTableLogger
21 import com.android.systemui.dump.Row
22 import com.android.systemui.plugins.util.RingBuffer
23 
24 /** Verbose debug information associated. */
25 data class KeyguardFaceListenModel(
26     @CurrentTimeMillisLong override var timeMillis: Long = 0L,
27     override var userId: Int = 0,
28     override var listening: Boolean = false,
29     // keep sorted
30     var alternateBouncerShowing: Boolean = false,
31     var authInterruptActive: Boolean = false,
32     var biometricSettingEnabledForUser: Boolean = false,
33     var bouncerFullyShown: Boolean = false,
34     var faceAndFpNotAuthenticated: Boolean = false,
35     var faceAuthAllowed: Boolean = false,
36     var faceDisabled: Boolean = false,
37     var faceLockedOut: Boolean = false,
38     var goingToSleep: Boolean = false,
39     var keyguardAwake: Boolean = false,
40     var keyguardGoingAway: Boolean = false,
41     var listeningForFaceAssistant: Boolean = false,
42     var occludingAppRequestingFaceAuth: Boolean = false,
43     var postureAllowsListening: Boolean = false,
44     var primaryUser: Boolean = false,
45     var secureCameraLaunched: Boolean = false,
46     var supportsDetect: Boolean = false,
47     var switchingUser: Boolean = false,
48     var udfpsFingerDown: Boolean = false,
49     var userNotTrustedOrDetectionIsNeeded: Boolean = false,
50 ) : KeyguardListenModel() {
51 
52     /** List of [String] to be used as a [Row] with [DumpsysTableLogger]. */
<lambda>null53     val asStringList: List<String> by lazy {
54         listOf(
55             DATE_FORMAT.format(timeMillis),
56             timeMillis.toString(),
57             userId.toString(),
58             listening.toString(),
59             // keep sorted
60             authInterruptActive.toString(),
61             biometricSettingEnabledForUser.toString(),
62             bouncerFullyShown.toString(),
63             faceAndFpNotAuthenticated.toString(),
64             faceAuthAllowed.toString(),
65             faceDisabled.toString(),
66             faceLockedOut.toString(),
67             goingToSleep.toString(),
68             keyguardAwake.toString(),
69             keyguardGoingAway.toString(),
70             listeningForFaceAssistant.toString(),
71             occludingAppRequestingFaceAuth.toString(),
72             primaryUser.toString(),
73             postureAllowsListening.toString(),
74             secureCameraLaunched.toString(),
75             supportsDetect.toString(),
76             switchingUser.toString(),
77             alternateBouncerShowing.toString(),
78             udfpsFingerDown.toString(),
79             userNotTrustedOrDetectionIsNeeded.toString(),
80         )
81     }
82 
83     /**
84      * [RingBuffer] to store [KeyguardFaceListenModel]. After the buffer is full, it will recycle
85      * old events.
86      *
87      * Do not use [append] to add new elements. Instead use [insert], as it will recycle if
88      * necessary.
89      */
90     class Buffer {
<lambda>null91         private val buffer = RingBuffer(CAPACITY) { KeyguardFaceListenModel() }
92 
insertnull93         fun insert(model: KeyguardFaceListenModel) {
94             buffer.advance().apply {
95                 timeMillis = model.timeMillis
96                 userId = model.userId
97                 listening = model.listening
98                 // keep sorted
99                 alternateBouncerShowing = model.alternateBouncerShowing
100                 biometricSettingEnabledForUser = model.biometricSettingEnabledForUser
101                 bouncerFullyShown = model.bouncerFullyShown
102                 faceAndFpNotAuthenticated = model.faceAndFpNotAuthenticated
103                 faceAuthAllowed = model.faceAuthAllowed
104                 faceDisabled = model.faceDisabled
105                 faceLockedOut = model.faceLockedOut
106                 goingToSleep = model.goingToSleep
107                 keyguardAwake = model.keyguardAwake
108                 goingToSleep = model.goingToSleep
109                 keyguardGoingAway = model.keyguardGoingAway
110                 listeningForFaceAssistant = model.listeningForFaceAssistant
111                 occludingAppRequestingFaceAuth = model.occludingAppRequestingFaceAuth
112                 primaryUser = model.primaryUser
113                 postureAllowsListening = model.postureAllowsListening
114                 secureCameraLaunched = model.secureCameraLaunched
115                 supportsDetect = model.supportsDetect
116                 switchingUser = model.switchingUser
117                 switchingUser = model.switchingUser
118                 udfpsFingerDown = model.udfpsFingerDown
119                 userNotTrustedOrDetectionIsNeeded = model.userNotTrustedOrDetectionIsNeeded
120             }
121         }
122         /**
123          * Returns the content of the buffer (sorted from latest to newest).
124          *
125          * @see KeyguardFingerprintListenModel.asStringList
126          */
toListnull127         fun toList(): List<Row> {
128             return buffer.asSequence().map { it.asStringList }.toList()
129         }
130     }
131 
132     companion object {
133         const val CAPACITY = 40 // number of logs to retain
134 
135         /** Headers for dumping a table using [DumpsysTableLogger]. */
136         @JvmField
137         val TABLE_HEADERS =
138             listOf(
139                 "timestamp",
140                 "time_millis",
141                 "userId",
142                 "listening",
143                 // keep sorted
144                 "authInterruptActive",
145                 "biometricSettingEnabledForUser",
146                 "bouncerFullyShown",
147                 "faceAndFpNotAuthenticated",
148                 "faceAuthAllowed",
149                 "faceDisabled",
150                 "faceLockedOut",
151                 "goingToSleep",
152                 "keyguardAwake",
153                 "keyguardGoingAway",
154                 "listeningForFaceAssistant",
155                 "occludingAppRequestingFaceAuth",
156                 "primaryUser",
157                 "postureAllowsListening",
158                 "secureCameraLaunched",
159                 "supportsDetect",
160                 "switchingUser",
161                 "udfpsBouncerShowing",
162                 "udfpsFingerDown",
163                 "userNotTrustedOrDetectionIsNeeded",
164             )
165     }
166 }
167