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