Repeated calls to cancel should cancel any previously scheduled cancellation timeout jobs

Fixes: 291161749
Test: atest DeviceEntryFaceAuthRepositoryTest
Change-Id: I128b0cd68b29dfa9428df938f8dd03b336cd9c48
This commit is contained in:
Chandru S
2023-07-18 14:58:37 -07:00
parent 025de17ac4
commit 835653f67f
3 changed files with 34 additions and 0 deletions

View File

@@ -574,6 +574,7 @@ constructor(
if (authCancellationSignal == null) return
authCancellationSignal?.cancel()
cancelNotReceivedHandlerJob?.cancel()
cancelNotReceivedHandlerJob =
applicationScope.launch {
delay(DEFAULT_CANCEL_SIGNAL_TIMEOUT)
@@ -583,6 +584,7 @@ constructor(
cancellationInProgress,
faceAuthRequestedWhileCancellation
)
_authenticationStatus.value = ErrorFaceAuthenticationStatus.cancelNotReceivedError()
onFaceAuthRequestCompleted()
}
cancellationInProgress = true

View File

@@ -63,6 +63,14 @@ data class ErrorFaceAuthenticationStatus(
fun isHardwareError() =
msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE ||
msgId == FaceManager.FACE_ERROR_UNABLE_TO_PROCESS
companion object {
/**
* Error message that is created when cancel confirmation is not received from FaceManager
* after we request for a cancellation of face auth.
*/
fun cancelNotReceivedError() = ErrorFaceAuthenticationStatus(-1, "")
}
}
/** Face detection success message. */

View File

@@ -44,6 +44,7 @@ import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepositor
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.coroutines.FlowValue
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.dump.DumpManager
import com.android.systemui.dump.logcatLogBuffer
import com.android.systemui.flags.FakeFeatureFlags
@@ -450,6 +451,29 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() {
faceAuthenticateIsCalled()
}
@Test
fun multipleCancelCallsShouldNotCauseMultipleCancellationStatusBeingEmitted() =
testScope.runTest {
initCollectors()
allPreconditionsToRunFaceAuthAreTrue()
val emittedValues by collectValues(underTest.authenticationStatus)
underTest.authenticate(FACE_AUTH_TRIGGERED_SWIPE_UP_ON_BOUNCER)
underTest.cancel()
advanceTimeBy(100)
underTest.cancel()
advanceTimeBy(DeviceEntryFaceAuthRepositoryImpl.DEFAULT_CANCEL_SIGNAL_TIMEOUT)
runCurrent()
advanceTimeBy(DeviceEntryFaceAuthRepositoryImpl.DEFAULT_CANCEL_SIGNAL_TIMEOUT)
runCurrent()
assertThat(emittedValues.size).isEqualTo(1)
assertThat(emittedValues.first())
.isInstanceOf(ErrorFaceAuthenticationStatus::class.java)
assertThat((emittedValues.first() as ErrorFaceAuthenticationStatus).msgId).isEqualTo(-1)
}
@Test
fun faceHelpMessagesAreIgnoredBasedOnConfig() =
testScope.runTest {