Loading packages/SystemUI/res/values/config.xml +8 −0 Original line number Diff line number Diff line Loading @@ -657,6 +657,14 @@ <integer-array name="config_face_help_msgs_defer_until_timeout"> </integer-array> <!-- Which face help messages to ignore when determining the % of frames that meet config_face_help_msgs_defer_until_timeout_threshold --> <integer-array name="config_face_help_msgs_ignore"> <item>20</item> <!-- FACE_ACQUIRED_START --> <item>23</item> <!-- FACE_ACQUIRED_UNKNOWN --> <item>24</item> <!-- FACE_ACQUIRED_FIRST_FRAME_RECEIVED --> </integer-array> <!-- Percentage of face auth frames received required to show a deferred message at FACE_ERROR_TIMEOUT. See config_face_help_msgs_defer_until_timeout for messages that are deferred.--> Loading packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +6 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,12 @@ open class BiometricMessageDeferralLogger( ) } fun logFrameIgnored( acquiredInfo: Int, ) { logBuffer.log(tag, DEBUG, { int1 = acquiredInfo }, { "frameIgnored acquiredInfo=$int1" }) } fun logFrameProcessed( acquiredInfo: Int, totalFrames: Int, Loading packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt +13 −3 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import java.io.PrintWriter import java.util.* import java.util.Objects import javax.inject.Inject /** Loading @@ -42,6 +42,7 @@ constructor( ) : BiometricMessageDeferral( resources.getIntArray(R.array.config_face_help_msgs_defer_until_timeout).toHashSet(), resources.getIntArray(R.array.config_face_help_msgs_ignore).toHashSet(), resources.getFloat(R.dimen.config_face_help_msgs_defer_until_timeout_threshold), logBuffer, dumpManager Loading @@ -50,10 +51,11 @@ constructor( /** * @property messagesToDefer messages that shouldn't show immediately when received, but may be * shown later if the message is the most frequent acquiredInfo processed and meets [threshold] * percentage of all passed acquired frames. * percentage of all acquired frames, excluding [acquiredInfoToIgnore]. */ open class BiometricMessageDeferral( private val messagesToDefer: Set<Int>, private val acquiredInfoToIgnore: Set<Int>, private val threshold: Float, private val logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager Loading Loading @@ -98,12 +100,20 @@ open class BiometricMessageDeferral( return messagesToDefer.contains(acquiredMsgId) } /** Adds the acquiredInfo frame to the counts. We account for all frames. */ /** * Adds the acquiredInfo frame to the counts. We account for frames not included in * acquiredInfoToIgnore. */ fun processFrame(acquiredInfo: Int) { if (messagesToDefer.isEmpty()) { return } if (acquiredInfoToIgnore.contains(acquiredInfo)) { logBuffer.logFrameIgnored(acquiredInfo) return } totalFrames++ val newAcquiredInfoCount = acquiredInfoToFrequency.getOrDefault(acquiredInfo, 0) + 1 Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt +38 −2 Original line number Diff line number Diff line Loading @@ -184,7 +184,43 @@ class FaceHelpMessageDeferralTest : SysuiTestCase() { assertFalse(biometricMessageDeferral.shouldDefer(4)) } private fun createMsgDeferral(messagesToDefer: Set<Int>): BiometricMessageDeferral { return BiometricMessageDeferral(messagesToDefer, threshold, logger, dumpManager) @Test fun testDeferredMessage_meetThresholdWithIgnoredFrames() { val biometricMessageDeferral = createMsgDeferral( messagesToDefer = setOf(1), acquiredInfoToIgnore = setOf(4), ) // WHEN more nonDeferredMessages are shown than the deferred message; HOWEVER the // nonDeferredMessages are in acquiredInfoToIgnore val totalMessages = 10 val nonDeferredMessagesCount = (totalMessages * threshold).toInt() + 1 for (i in 0 until nonDeferredMessagesCount) { biometricMessageDeferral.processFrame(4) biometricMessageDeferral.updateMessage(4, "non-deferred-msg") } for (i in nonDeferredMessagesCount until totalMessages) { biometricMessageDeferral.processFrame(1) biometricMessageDeferral.updateMessage(1, "msgId-1") } // THEN the deferred message met the threshold excluding the acquiredInfoToIgnore, // so the message id deferred assertTrue(biometricMessageDeferral.shouldDefer(1)) assertEquals("msgId-1", biometricMessageDeferral.getDeferredMessage()) } private fun createMsgDeferral( messagesToDefer: Set<Int>, acquiredInfoToIgnore: Set<Int> = emptySet(), ): BiometricMessageDeferral { return BiometricMessageDeferral( messagesToDefer, acquiredInfoToIgnore, threshold, logger, dumpManager, ) } } Loading
packages/SystemUI/res/values/config.xml +8 −0 Original line number Diff line number Diff line Loading @@ -657,6 +657,14 @@ <integer-array name="config_face_help_msgs_defer_until_timeout"> </integer-array> <!-- Which face help messages to ignore when determining the % of frames that meet config_face_help_msgs_defer_until_timeout_threshold --> <integer-array name="config_face_help_msgs_ignore"> <item>20</item> <!-- FACE_ACQUIRED_START --> <item>23</item> <!-- FACE_ACQUIRED_UNKNOWN --> <item>24</item> <!-- FACE_ACQUIRED_FIRST_FRAME_RECEIVED --> </integer-array> <!-- Percentage of face auth frames received required to show a deferred message at FACE_ERROR_TIMEOUT. See config_face_help_msgs_defer_until_timeout for messages that are deferred.--> Loading
packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +6 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,12 @@ open class BiometricMessageDeferralLogger( ) } fun logFrameIgnored( acquiredInfo: Int, ) { logBuffer.log(tag, DEBUG, { int1 = acquiredInfo }, { "frameIgnored acquiredInfo=$int1" }) } fun logFrameProcessed( acquiredInfo: Int, totalFrames: Int, Loading
packages/SystemUI/src/com/android/systemui/biometrics/FaceHelpMessageDeferral.kt +13 −3 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import java.io.PrintWriter import java.util.* import java.util.Objects import javax.inject.Inject /** Loading @@ -42,6 +42,7 @@ constructor( ) : BiometricMessageDeferral( resources.getIntArray(R.array.config_face_help_msgs_defer_until_timeout).toHashSet(), resources.getIntArray(R.array.config_face_help_msgs_ignore).toHashSet(), resources.getFloat(R.dimen.config_face_help_msgs_defer_until_timeout_threshold), logBuffer, dumpManager Loading @@ -50,10 +51,11 @@ constructor( /** * @property messagesToDefer messages that shouldn't show immediately when received, but may be * shown later if the message is the most frequent acquiredInfo processed and meets [threshold] * percentage of all passed acquired frames. * percentage of all acquired frames, excluding [acquiredInfoToIgnore]. */ open class BiometricMessageDeferral( private val messagesToDefer: Set<Int>, private val acquiredInfoToIgnore: Set<Int>, private val threshold: Float, private val logBuffer: BiometricMessageDeferralLogger, dumpManager: DumpManager Loading Loading @@ -98,12 +100,20 @@ open class BiometricMessageDeferral( return messagesToDefer.contains(acquiredMsgId) } /** Adds the acquiredInfo frame to the counts. We account for all frames. */ /** * Adds the acquiredInfo frame to the counts. We account for frames not included in * acquiredInfoToIgnore. */ fun processFrame(acquiredInfo: Int) { if (messagesToDefer.isEmpty()) { return } if (acquiredInfoToIgnore.contains(acquiredInfo)) { logBuffer.logFrameIgnored(acquiredInfo) return } totalFrames++ val newAcquiredInfoCount = acquiredInfoToFrequency.getOrDefault(acquiredInfo, 0) + 1 Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt +38 −2 Original line number Diff line number Diff line Loading @@ -184,7 +184,43 @@ class FaceHelpMessageDeferralTest : SysuiTestCase() { assertFalse(biometricMessageDeferral.shouldDefer(4)) } private fun createMsgDeferral(messagesToDefer: Set<Int>): BiometricMessageDeferral { return BiometricMessageDeferral(messagesToDefer, threshold, logger, dumpManager) @Test fun testDeferredMessage_meetThresholdWithIgnoredFrames() { val biometricMessageDeferral = createMsgDeferral( messagesToDefer = setOf(1), acquiredInfoToIgnore = setOf(4), ) // WHEN more nonDeferredMessages are shown than the deferred message; HOWEVER the // nonDeferredMessages are in acquiredInfoToIgnore val totalMessages = 10 val nonDeferredMessagesCount = (totalMessages * threshold).toInt() + 1 for (i in 0 until nonDeferredMessagesCount) { biometricMessageDeferral.processFrame(4) biometricMessageDeferral.updateMessage(4, "non-deferred-msg") } for (i in nonDeferredMessagesCount until totalMessages) { biometricMessageDeferral.processFrame(1) biometricMessageDeferral.updateMessage(1, "msgId-1") } // THEN the deferred message met the threshold excluding the acquiredInfoToIgnore, // so the message id deferred assertTrue(biometricMessageDeferral.shouldDefer(1)) assertEquals("msgId-1", biometricMessageDeferral.getDeferredMessage()) } private fun createMsgDeferral( messagesToDefer: Set<Int>, acquiredInfoToIgnore: Set<Int> = emptySet(), ): BiometricMessageDeferral { return BiometricMessageDeferral( messagesToDefer, acquiredInfoToIgnore, threshold, logger, dumpManager, ) } }