Switch to pulsing state whenever fingerprint acquisition starts
Bug: 310869297
Test: everything builds and device wakes up for sfps progress bar
Flag: NA
Change-Id: Ieac1a0a5604ffa786a518b43abead34eef015450
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
similarity index 97%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
index 53cb8a7..7a78b36 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
@@ -25,15 +25,14 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.graphics.Point;
import android.os.PowerManager;
-import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -68,7 +67,7 @@
import java.util.HashSet;
@SmallTest
-@RunWith(AndroidTestingRunner.class)
+@RunWith(AndroidJUnit4.class)
@RunWithLooper(setAsMainLooper = true)
public class DozeServiceHostTest extends SysuiTestCase {
@@ -181,6 +180,7 @@
DozeLog.PULSE_REASON_DOCKING,
DozeLog.REASON_SENSOR_WAKE_UP_PRESENCE,
DozeLog.REASON_SENSOR_QUICK_PICKUP,
+ DozeLog.PULSE_REASON_FINGERPRINT_ACTIVATED,
DozeLog.REASON_SENSOR_TAP));
HashSet<Integer> reasonsThatDontPulse = new HashSet<>(
Arrays.asList(DozeLog.REASON_SENSOR_PICKUP,
@@ -232,7 +232,7 @@
public void onSlpiTap_doesnt_pass_negative_values() {
mDozeServiceHost.onSlpiTap(-1, 200);
mDozeServiceHost.onSlpiTap(100, -2);
- verifyZeroInteractions(mDozeInteractor);
+ verify(mDozeInteractor, never()).setLastTapToWakePosition(any());
}
@Test
public void dozeTimeTickSentToDozeInteractor() {
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index e01a2aa..5c362b2 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -963,10 +963,16 @@
<bool name="config_edgeToEdgeBottomSheetDialog">true</bool>
<!--
+ Time in milliseconds the user has to touch the side FPS sensor to successfully authenticate when
+ the screen is turned off with AOD not enabled.
+ TODO(b/302332976) Get this value from the HAL if they can provide an API for it.
+ -->
+ <integer name="config_restToUnlockDurationScreenOff">500</integer>
+ <!--
Time in milliseconds the user has to touch the side FPS sensor to successfully authenticate
TODO(b/302332976) Get this value from the HAL if they can provide an API for it.
-->
- <integer name="config_restToUnlockDuration">300</integer>
+ <integer name="config_restToUnlockDurationDefault">300</integer>
<!--
Width in pixels of the Side FPS sensor.
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
index f4231ac..c320350 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractor.kt
@@ -26,6 +26,8 @@
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.isDefaultOrientation
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.log.SideFpsLogger
import com.android.systemui.res.R
import java.util.Optional
@@ -47,6 +49,7 @@
windowManager: WindowManager,
displayStateInteractor: DisplayStateInteractor,
fingerprintInteractiveToAuthProvider: Optional<FingerprintInteractiveToAuthProvider>,
+ keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val logger: SideFpsLogger,
) {
@@ -62,8 +65,21 @@
val isAvailable: Flow<Boolean> =
fingerprintPropertyRepository.sensorType.map { it == FingerprintSensorType.POWER_BUTTON }
- val authenticationDuration: Long =
- context.resources?.getInteger(R.integer.config_restToUnlockDuration)?.toLong() ?: 0L
+ val authenticationDuration: Flow<Long> =
+ keyguardTransitionInteractor
+ .isFinishedInStateWhere { it == KeyguardState.OFF || it == KeyguardState.DOZING }
+ .map {
+ if (it)
+ context.resources
+ ?.getInteger(R.integer.config_restToUnlockDurationScreenOff)
+ ?.toLong()
+ else
+ context.resources
+ ?.getInteger(R.integer.config_restToUnlockDurationDefault)
+ ?.toLong()
+ }
+ .map { it ?: 0L }
+ .onEach { logger.authDurationChanged(it) }
val isProlongedTouchRequiredForAuthentication: Flow<Boolean> =
if (fingerprintInteractiveToAuthProvider.isEmpty) {
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
index efa1c0a..684627b 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
@@ -19,6 +19,7 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.shared.model.FailFingerprintAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.FingerprintAuthenticationStatus
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterIsInstance
@@ -31,4 +32,11 @@
) {
val fingerprintFailure: Flow<FailFingerprintAuthenticationStatus> =
repository.authenticationStatus.filterIsInstance<FailFingerprintAuthenticationStatus>()
+
+ /** Whether fingerprint authentication is currently running or not */
+ val isRunning: Flow<Boolean> = repository.isRunning
+
+ /** Provide the current status of fingerprint authentication. */
+ val authenticationStatus: Flow<FingerprintAuthenticationStatus> =
+ repository.authenticationStatus
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
index 4c4aa5c..8776ec5 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -118,6 +118,11 @@
* Called when the dozing state may have been updated.
*/
default void onDozingChanged(boolean isDozing) {}
+
+ /**
+ * Called when fingerprint acquisition has started and screen state might need updating.
+ */
+ default void onSideFingerprintAcquisitionStarted() {}
}
interface PulseCallback {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 5b90ef2..424bd0a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -514,6 +514,7 @@
case REASON_SENSOR_TAP: return "tap";
case REASON_SENSOR_UDFPS_LONG_PRESS: return "udfps";
case REASON_SENSOR_QUICK_PICKUP: return "quickPickup";
+ case PULSE_REASON_FINGERPRINT_ACTIVATED: return "fingerprint-triggered";
default: throw new IllegalArgumentException("invalid reason: " + pulseReason);
}
}
@@ -542,7 +543,9 @@
PULSE_REASON_SENSOR_SIGMOTION, REASON_SENSOR_PICKUP, REASON_SENSOR_DOUBLE_TAP,
PULSE_REASON_SENSOR_LONG_PRESS, PULSE_REASON_DOCKING, REASON_SENSOR_WAKE_UP_PRESENCE,
PULSE_REASON_SENSOR_WAKE_REACH, REASON_SENSOR_TAP,
- REASON_SENSOR_UDFPS_LONG_PRESS, REASON_SENSOR_QUICK_PICKUP})
+ REASON_SENSOR_UDFPS_LONG_PRESS, REASON_SENSOR_QUICK_PICKUP,
+ PULSE_REASON_FINGERPRINT_ACTIVATED
+ })
public @interface Reason {}
public static final int PULSE_REASON_NONE = -1;
public static final int PULSE_REASON_INTENT = 0;
@@ -557,6 +560,7 @@
public static final int REASON_SENSOR_TAP = 9;
public static final int REASON_SENSOR_UDFPS_LONG_PRESS = 10;
public static final int REASON_SENSOR_QUICK_PICKUP = 11;
+ public static final int PULSE_REASON_FINGERPRINT_ACTIVATED = 12;
- public static final int TOTAL_REASONS = 12;
+ public static final int TOTAL_REASONS = 13;
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 795c3d4..9311187 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -265,6 +265,10 @@
mDozeLog.traceNotificationPulse();
}
+ private void onSideFingerprintAcquisitionStarted() {
+ requestPulse(DozeLog.PULSE_REASON_FINGERPRINT_ACTIVATED, false, null);
+ }
+
private static void runIfNotNull(Runnable runnable) {
if (runnable != null) {
runnable.run();
@@ -690,5 +694,10 @@
public void onNotificationAlerted(Runnable onPulseSuppressedListener) {
onNotification(onPulseSuppressedListener);
}
+
+ @Override
+ public void onSideFingerprintAcquisitionStarted() {
+ DozeTriggers.this.onSideFingerprintAcquisitionStarted();
+ }
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
index 1dbf1f1..693e3b7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
@@ -28,13 +28,16 @@
import com.android.systemui.biometrics.shared.model.isDefaultOrientation
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.FailFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.res.R
+import com.android.systemui.statusbar.phone.DozeServiceHost
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
@@ -43,6 +46,7 @@
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onCompletion
@@ -54,9 +58,13 @@
@Inject
constructor(
private val context: Context,
- private val fpAuthRepository: DeviceEntryFingerprintAuthRepository,
+ private val fpAuthRepository: DeviceEntryFingerprintAuthInteractor,
private val sfpsSensorInteractor: SideFpsSensorInteractor,
+ // todo (b/317432075) Injecting DozeServiceHost directly instead of using it through
+ // DozeInteractor as DozeServiceHost already depends on DozeInteractor.
+ private val dozeServiceHost: DozeServiceHost,
displayStateInteractor: DisplayStateInteractor,
+ @Main private val mainDispatcher: CoroutineDispatcher,
@Application private val applicationScope: CoroutineScope,
) {
private val _progress = MutableStateFlow(0.0f)
@@ -168,18 +176,21 @@
return@collectLatest
}
animatorJob =
- fpAuthRepository.authenticationStatus
- .onEach { authStatus ->
+ combine(
+ sfpsSensorInteractor.authenticationDuration,
+ fpAuthRepository.authenticationStatus,
+ ::Pair
+ )
+ .onEach { (authDuration, authStatus) ->
when (authStatus) {
is AcquiredFingerprintAuthenticationStatus -> {
if (authStatus.fingerprintCaptureStarted) {
_visible.value = true
+ dozeServiceHost.fireSideFpsAcquisitionStarted()
_animator?.cancel()
_animator =
ValueAnimator.ofFloat(0.0f, 1.0f)
- .setDuration(
- sfpsSensorInteractor.authenticationDuration
- )
+ .setDuration(authDuration)
.apply {
addUpdateListener {
_progress.value = it.animatedValue as Float
@@ -209,6 +220,7 @@
else -> Unit
}
}
+ .flowOn(mainDispatcher)
.onCompletion { _animator?.cancel() }
.launchIn(applicationScope)
}
diff --git a/packages/SystemUI/src/com/android/systemui/log/SideFpsLogger.kt b/packages/SystemUI/src/com/android/systemui/log/SideFpsLogger.kt
index 919072a..171656a 100644
--- a/packages/SystemUI/src/com/android/systemui/log/SideFpsLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/log/SideFpsLogger.kt
@@ -108,4 +108,13 @@
}
)
}
+
+ fun authDurationChanged(duration: Long) {
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ { long1 = duration },
+ { "SideFpsSensor auth duration changed: $long1" }
+ )
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
index 600d4af..45005cb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
@@ -55,11 +55,12 @@
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.util.Assert;
+import dagger.Lazy;
+
import java.util.ArrayList;
import javax.inject.Inject;
-import dagger.Lazy;
import kotlinx.coroutines.ExperimentalCoroutinesApi;
/**
@@ -175,6 +176,16 @@
}
}
+ /**
+ * Notify the registered callback about SPFS fingerprint acquisition started event.
+ */
+ public void fireSideFpsAcquisitionStarted() {
+ Assert.isMainThread();
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).onSideFingerprintAcquisitionStarted();
+ }
+ }
+
void fireNotificationPulse(NotificationEntry entry) {
Runnable pulseSuppressedListener = () -> {
if (NotificationIconContainerRefactor.isEnabled()) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractorTest.kt
index 640807b..8adee8d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/SideFpsSensorInteractorTest.kt
@@ -36,15 +36,24 @@
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
+import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
+import com.android.systemui.keyguard.shared.model.KeyguardState.OFF
+import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
import com.android.systemui.log.SideFpsLogger
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.res.R
+import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -62,9 +71,10 @@
@SmallTest
@RunWith(JUnit4::class)
class SideFpsSensorInteractorTest : SysuiTestCase() {
+ private val kosmos = testKosmos()
@JvmField @Rule var mockitoRule = MockitoJUnit.rule()
- private val testScope = TestScope(StandardTestDispatcher())
+ private val testScope = kosmos.testScope
private val fingerprintRepository = FakeFingerprintPropertyRepository()
@@ -101,6 +111,7 @@
windowManager,
displayStateInteractor,
Optional.of(fingerprintInteractiveToAuthProvider),
+ kosmos.keyguardTransitionInteractor,
SideFpsLogger(logcatLogBuffer("SfpsLogger"))
)
}
@@ -129,11 +140,62 @@
assertThat(isAvailable).isFalse()
}
+ private suspend fun sendTransition(from: KeyguardState, to: KeyguardState) {
+ kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ TransitionStep(
+ from = from,
+ to = to,
+ transitionState = TransitionState.STARTED,
+ ),
+ TransitionStep(
+ from = from,
+ to = to,
+ transitionState = TransitionState.FINISHED,
+ value = 1.0f
+ )
+ ),
+ testScope
+ )
+ }
+
@Test
- fun authenticationDurationIsAvailableWhenSFPSSensorIsAvailable() =
+ fun authenticationDurationIsLongerIfScreenIsOff() =
testScope.runTest {
- assertThat(underTest.authenticationDuration)
- .isEqualTo(context.resources.getInteger(R.integer.config_restToUnlockDuration))
+ val authenticationDuration by collectLastValue(underTest.authenticationDuration)
+ val longDuration =
+ context.resources.getInteger(R.integer.config_restToUnlockDurationScreenOff)
+ sendTransition(LOCKSCREEN, OFF)
+
+ runCurrent()
+ assertThat(authenticationDuration).isEqualTo(longDuration)
+ }
+
+ @Test
+ fun authenticationDurationIsLongerIfScreenIsDozing() =
+ testScope.runTest {
+ val authenticationDuration by collectLastValue(underTest.authenticationDuration)
+ val longDuration =
+ context.resources.getInteger(R.integer.config_restToUnlockDurationScreenOff)
+ sendTransition(LOCKSCREEN, DOZING)
+ runCurrent()
+ assertThat(authenticationDuration).isEqualTo(longDuration)
+ }
+
+ @Test
+ fun authenticationDurationIsShorterIfScreenIsNotDozingOrOff() =
+ testScope.runTest {
+ val authenticationDuration by collectLastValue(underTest.authenticationDuration)
+ val shortDuration =
+ context.resources.getInteger(R.integer.config_restToUnlockDurationDefault)
+ val allOtherKeyguardStates = KeyguardState.entries.filter { it != OFF && it != DOZING }
+
+ allOtherKeyguardStates.forEach { destinationState ->
+ sendTransition(OFF, destinationState)
+
+ runCurrent()
+ assertThat(authenticationDuration).isEqualTo(shortDuration)
+ }
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
index cb26178..755fa02 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
@@ -75,6 +75,7 @@
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import java.util.Optional
@@ -82,6 +83,7 @@
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -235,15 +237,18 @@
windowManager,
displayStateInteractor,
Optional.of(fingerprintInteractiveToAuthProvider),
+ mock(),
SideFpsLogger(logcatLogBuffer("SfpsLogger"))
)
sideFpsProgressBarViewModel =
SideFpsProgressBarViewModel(
mContext,
- deviceEntryFingerprintAuthRepository,
+ mock(),
sfpsSensorInteractor,
+ mock(),
displayStateInteractor,
+ UnconfinedTestDispatcher(),
testScope.backgroundScope,
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
index 823b952..bdca948 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
@@ -72,6 +72,7 @@
import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
@@ -238,15 +239,18 @@
windowManager,
displayStateInteractor,
Optional.of(fingerprintInteractiveToAuthProvider),
+ mock(),
SideFpsLogger(logcatLogBuffer("SfpsLogger"))
)
sideFpsProgressBarViewModel =
SideFpsProgressBarViewModel(
mContext,
- deviceEntryFingerprintAuthRepository,
+ mock(),
sfpsSensorInteractor,
+ mock(),
displayStateInteractor,
+ StandardTestDispatcher(),
testScope.backgroundScope,
)