Merge "Remove FpsUnlockTracker and refactor to fit go/sysui-arch in vendor part" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index f3de463e..fa79ea0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -256,8 +256,6 @@
@Mock
private ViewRootImpl mViewRootImpl;
@Mock
- private FpsUnlockTracker mFpsUnlockTracker;
- @Mock
private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
@Mock
private Lazy<DeviceEntryUdfpsTouchOverlayViewModel> mDeviceEntryUdfpsTouchOverlayViewModel;
@@ -368,7 +366,6 @@
mock(DeviceEntryFaceAuthInteractor.class),
mUdfpsKeyguardAccessibilityDelegate,
mSelectedUserInteractor,
- mFpsUnlockTracker,
mKeyguardTransitionInteractor,
mDeviceEntryUdfpsTouchOverlayViewModel,
mDefaultUdfpsTouchOverlayViewModel,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt b/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt
deleted file mode 100644
index cf699a2..0000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/FpsUnlockTracker.kt
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.biometrics
-
-import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START
-import android.hardware.biometrics.BiometricSourceType
-import android.hardware.biometrics.BiometricSourceType.FINGERPRINT
-import android.util.Log
-import com.android.app.tracing.TraceStateLogger
-import com.android.internal.util.LatencyTracker
-import com.android.internal.util.LatencyTracker.ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME
-import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.keyguard.KeyguardUpdateMonitorCallback
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.keyguard.KeyguardUnlockAnimationController
-import com.android.systemui.keyguard.KeyguardUnlockAnimationController.KeyguardUnlockAnimationListener
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import javax.inject.Inject
-
-private const val TAG = "FpsUnlockTracker"
-private const val TRACE_COUNTER_NAME = "FpsUnlockStage"
-private const val TRACE_TAG_AOD = "AOD"
-private const val TRACE_TAG_KEYGUARD = "KEYGUARD"
-private const val DEBUG = true
-
-/** This is a class for monitoring unlock latency of fps and logging stages in perfetto. */
-@SysUISingleton
-class FpsUnlockTracker
-@Inject
-constructor(
- private val statusBarStateController: StatusBarStateController,
- private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
- private val keyguardUnlockAnimationController: KeyguardUnlockAnimationController,
- private val latencyTracker: LatencyTracker,
-) {
- private val fpsTraceStateLogger = TraceStateLogger(TRACE_COUNTER_NAME)
- private var fpsAuthenticated: Boolean = false
-
- private val keyguardUpdateMonitorCallback =
- object : KeyguardUpdateMonitorCallback() {
- override fun onBiometricAcquired(
- biometricSourceType: BiometricSourceType?,
- acquireInfo: Int
- ) {
- if (keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed) {
- onHalAuthenticationStage(acquireInfo)
- }
- }
-
- override fun onBiometricAuthenticated(
- userId: Int,
- biometricSourceType: BiometricSourceType?,
- isStrongBiometric: Boolean
- ) {
- if (biometricSourceType == FINGERPRINT) {
- fpsAuthenticated = true
- onExitKeyguard()
- }
- }
-
- override fun onBiometricError(
- msgId: Int,
- errString: String?,
- biometricSourceType: BiometricSourceType?
- ) {
- if (biometricSourceType == FINGERPRINT) {
- latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
- }
- }
-
- override fun onBiometricRunningStateChanged(
- running: Boolean,
- biometricSourceType: BiometricSourceType?
- ) {
- if (biometricSourceType != FINGERPRINT || !running) {
- return
- }
- onWaitForAuthenticationStage()
- }
- }
-
- private val keyguardUnlockAnimationListener =
- object : KeyguardUnlockAnimationListener {
- override fun onUnlockAnimationFinished() = onUnlockedStage()
- }
-
- /** Start tracking the fps unlock. */
- fun startTracking() {
- keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
- keyguardUnlockAnimationController.addKeyguardUnlockAnimationListener(
- keyguardUnlockAnimationListener
- )
- }
-
- /** Stop tracking the fps unlock. */
- fun stopTracking() {
- keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
- keyguardUnlockAnimationController.removeKeyguardUnlockAnimationListener(
- keyguardUnlockAnimationListener
- )
- }
-
- /**
- * The stage when the devices is locked and is possible to be unlocked via fps. However, in some
- * situations, it might be unlocked only via bouncer.
- */
- fun onWaitForAuthenticationStage() {
- val stage =
- if (keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
- FpsUnlockStage.WAIT_FOR_AUTHENTICATION.name
- else FpsUnlockStage.WAIT_FOR_AUTHENTICATION.name + "(Not allowed)"
- fpsTraceStateLogger.log(stage)
- if (DEBUG) {
- Log.d(TAG, "onWaitForAuthenticationStage: stage=$stage")
- }
- }
-
- /**
- * The stage dedicated to UDFPS, SFPS should not enter this stage. The only place where invokes
- * this function is UdfpsController#onFingerDown.
- */
- fun onUiReadyStage() {
- if (!keyguardUpdateMonitor.isUdfpsSupported || !keyguardUpdateMonitor.isUdfpsEnrolled) {
- return
- }
- fpsTraceStateLogger.log(FpsUnlockStage.UI_READY.name)
- startLatencyTracker()
- if (DEBUG) {
- Log.d(TAG, "onUiReadyStage: dozing=${statusBarStateController.isDozing}")
- }
- }
-
- /** The stage when the HAL is authenticating the fingerprint. */
- fun onHalAuthenticationStage(acquire: Int) {
- fpsTraceStateLogger.log("${FpsUnlockStage.HAL_AUTHENTICATION.name}($acquire)")
- // Start latency tracker here only for SFPS, UDFPS should start at onUiReadyStage.
- if (
- keyguardUpdateMonitor.isSfpsSupported &&
- keyguardUpdateMonitor.isSfpsEnrolled &&
- acquire == FINGERPRINT_ACQUIRED_START
- ) {
- startLatencyTracker()
- }
- if (DEBUG) {
- Log.d(
- TAG,
- "onHalAuthenticationStage: acquire=$acquire" +
- ", sfpsSupported=${keyguardUpdateMonitor.isSfpsSupported}" +
- ", sfpsEnrolled=${keyguardUpdateMonitor.isSfpsEnrolled}"
- )
- }
- }
-
- /** The stage when the authentication is succeeded and is going to exit keyguard. */
- fun onExitKeyguard() {
- fpsTraceStateLogger.log(FpsUnlockStage.EXIT_KEYGUARD.name)
- if (DEBUG) {
- Log.d(TAG, "onExitKeyguard: fpsAuthenticated=$fpsAuthenticated")
- }
- }
-
- /**
- * The stage when the unlock animation is finished which means the user can start interacting
- * with the device.
- */
- fun onUnlockedStage() {
- fpsTraceStateLogger.log(FpsUnlockStage.UNLOCKED.name)
- if (fpsAuthenticated) {
- // The device is unlocked successfully via fps, end the instrument.
- latencyTracker.onActionEnd(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
- } else {
- // The device is unlocked but not via fps, maybe bouncer? Cancel the instrument.
- latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
- }
- if (DEBUG) {
- Log.d(TAG, "onUnlockedStage: fpsAuthenticated=$fpsAuthenticated")
- }
- fpsAuthenticated = false
- }
-
- private fun startLatencyTracker() {
- latencyTracker.onActionCancel(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME)
- val tag = if (statusBarStateController.isDozing) TRACE_TAG_AOD else TRACE_TAG_KEYGUARD
- latencyTracker.onActionStart(ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, tag)
- }
-}
-
-private enum class FpsUnlockStage {
- WAIT_FOR_AUTHENTICATION,
- UI_READY,
- HAL_AUTHENTICATION,
- EXIT_KEYGUARD,
- UNLOCKED
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 85b5faf..ad142a8 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -184,7 +184,6 @@
@NonNull private final InputManager mInputManager;
@NonNull private final UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
@NonNull private final SelectedUserInteractor mSelectedUserInteractor;
- @NonNull private final FpsUnlockTracker mFpsUnlockTracker;
private final boolean mIgnoreRefreshRate;
private final KeyguardTransitionInteractor mKeyguardTransitionInteractor;
@@ -712,7 +711,6 @@
@NonNull DeviceEntryFaceAuthInteractor deviceEntryFaceAuthInteractor,
@NonNull UdfpsKeyguardAccessibilityDelegate udfpsKeyguardAccessibilityDelegate,
@NonNull SelectedUserInteractor selectedUserInteractor,
- @NonNull FpsUnlockTracker fpsUnlockTracker,
@NonNull KeyguardTransitionInteractor keyguardTransitionInteractor,
Lazy<DeviceEntryUdfpsTouchOverlayViewModel> deviceEntryUdfpsTouchOverlayViewModel,
Lazy<DefaultUdfpsTouchOverlayViewModel> defaultUdfpsTouchOverlayViewModel,
@@ -765,8 +763,6 @@
mInputManager = inputManager;
mUdfpsKeyguardAccessibilityDelegate = udfpsKeyguardAccessibilityDelegate;
mSelectedUserInteractor = selectedUserInteractor;
- mFpsUnlockTracker = fpsUnlockTracker;
- mFpsUnlockTracker.startTracking();
mKeyguardTransitionInteractor = keyguardTransitionInteractor;
mTouchProcessor = singlePointerTouchProcessor;
@@ -1067,9 +1063,6 @@
if (isOptical()) {
mLatencyTracker.onActionStart(ACTION_UDFPS_ILLUMINATE);
}
- if (getBiometricSessionType() == SESSION_KEYGUARD) {
- mFpsUnlockTracker.onUiReadyStage();
- }
// Refresh screen timeout and boost process priority if possible.
mPowerManager.userActivity(mSystemClock.uptimeMillis(),
PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
index 14d8caf..e2a8a69 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
@@ -39,12 +39,14 @@
import com.android.systemui.biometrics.udfps.BoundingBoxOverlapDetector
import com.android.systemui.biometrics.udfps.EllipseOverlapDetector
import com.android.systemui.biometrics.udfps.OverlapDetector
+import com.android.systemui.biometrics.ui.binder.DeviceEntryUnlockTrackerViewBinder
import com.android.systemui.biometrics.ui.binder.SideFpsOverlayViewBinder
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.ui.binder.AlternateBouncerViewBinder
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.util.concurrency.ThreadFactory
import dagger.Binds
+import dagger.BindsOptionalOf
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
@@ -101,6 +103,9 @@
@SysUISingleton
fun displayStateRepository(impl: DisplayStateRepositoryImpl): DisplayStateRepository
+ @BindsOptionalOf
+ fun deviceEntryUnlockTrackerViewBinder(): DeviceEntryUnlockTrackerViewBinder
+
companion object {
/** Background [Executor] for HAL related operations. */
@Provides
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/DeviceEntryUnlockTrackerViewBinder.kt
similarity index 60%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt
copy to packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/DeviceEntryUnlockTrackerViewBinder.kt
index 6085a1f..78eaab2 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/DeviceEntryUnlockTrackerViewBinder.kt
@@ -14,9 +14,15 @@
* limitations under the License.
*/
-package com.android.systemui.biometrics
+package com.android.systemui.biometrics.ui.binder
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.util.mockito.mock
+import com.android.systemui.keyguard.ui.view.KeyguardRootView
-val Kosmos.fpsUnlockTracker by Kosmos.Fixture { mock<FpsUnlockTracker>() }
+/** ViewBinder for device entry unlock tracker implemented in vendor */
+interface DeviceEntryUnlockTrackerViewBinder {
+ /**
+ * Allows vendor binds vendor's view model to the specified view.
+ * @param view the view to be bound
+ */
+ fun bind(view: KeyguardRootView) {}
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
index ff7ac35..9cc4650 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt
@@ -33,7 +33,6 @@
import com.android.app.animation.Interpolators
import com.android.keyguard.KeyguardPINView
import com.android.systemui.CoreStartable
-import com.android.systemui.biometrics.FpsUnlockTracker
import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.biometrics.domain.interactor.SideFpsSensorInteractor
@@ -65,7 +64,6 @@
private val biometricStatusInteractor: Lazy<BiometricStatusInteractor>,
private val displayStateInteractor: Lazy<DisplayStateInteractor>,
private val deviceEntrySideFpsOverlayInteractor: Lazy<DeviceEntrySideFpsOverlayInteractor>,
- private val fpsUnlockTracker: Lazy<FpsUnlockTracker>,
private val layoutInflater: Lazy<LayoutInflater>,
private val sideFpsProgressBarViewModel: Lazy<SideFpsProgressBarViewModel>,
private val sfpsSensorInteractor: Lazy<SideFpsSensorInteractor>,
@@ -114,7 +112,6 @@
}
}
}
- .invokeOnCompletion { fpsUnlockTracker.get().stopTracking() }
}
private var overlayView: View? = null
@@ -138,7 +135,7 @@
displayStateInteractor.get(),
sfpsSensorInteractor.get(),
)
- bind(overlayView!!, overlayViewModel, fpsUnlockTracker.get(), windowManager.get())
+ bind(overlayView!!, overlayViewModel, windowManager.get())
overlayView!!.visibility = View.INVISIBLE
Log.d(TAG, "show(): adding overlayView $overlayView")
windowManager.get().addView(overlayView, overlayViewModel.defaultOverlayViewParams)
@@ -163,12 +160,9 @@
fun bind(
overlayView: View,
viewModel: SideFpsOverlayViewModel,
- fpsUnlockTracker: FpsUnlockTracker,
windowManager: WindowManager
) {
overlayView.repeatWhenAttached {
- fpsUnlockTracker.startTracking()
-
val lottie = it.requireViewById<LottieAnimationView>(R.id.sidefps_animation)
lottie.addLottieOnCompositionLoadedListener { composition: LottieComposition ->
if (overlayView.visibility != View.VISIBLE) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
index 306f4ff..608e25a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
@@ -39,6 +39,7 @@
import com.android.keyguard.LockIconView
import com.android.keyguard.dagger.KeyguardStatusViewComponent
import com.android.systemui.CoreStartable
+import com.android.systemui.biometrics.ui.binder.DeviceEntryUnlockTrackerViewBinder
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
@@ -70,6 +71,7 @@
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
import dagger.Lazy
+import java.util.Optional
import javax.inject.Inject
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -105,6 +107,7 @@
private val lockscreenSceneBlueprintsLazy: Lazy<Set<LockscreenSceneBlueprint>>,
private val clockInteractor: KeyguardClockInteractor,
private val keyguardViewMediator: KeyguardViewMediator,
+ private val deviceEntryUnlockTrackerViewBinder: Optional<DeviceEntryUnlockTrackerViewBinder>,
) : CoreStartable {
private var rootViewHandle: DisposableHandle? = null
@@ -157,6 +160,9 @@
)
}
}
+ if (deviceEntryUnlockTrackerViewBinder.isPresent) {
+ deviceEntryUnlockTrackerViewBinder.get().bind(keyguardRootView)
+ }
}
fun bindIndicationArea() {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/keyguard/KeyguardUnlockAnimationControllerKosmos.kt
similarity index 76%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt
rename to packages/SystemUI/tests/utils/src/com/android/keyguard/KeyguardUnlockAnimationControllerKosmos.kt
index 6085a1f..1fa6813 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/FpsUnlockTrackerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/keyguard/KeyguardUnlockAnimationControllerKosmos.kt
@@ -14,9 +14,11 @@
* limitations under the License.
*/
-package com.android.systemui.biometrics
+package com.android.keyguard
+import com.android.systemui.keyguard.KeyguardUnlockAnimationController
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.util.mockito.mock
-val Kosmos.fpsUnlockTracker by Kosmos.Fixture { mock<FpsUnlockTracker>() }
+val Kosmos.keyguardUnlockAnimationController by
+ Kosmos.Fixture { mock<KeyguardUnlockAnimationController>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt
index 8281984..79d58a1 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderKosmos.kt
@@ -22,7 +22,6 @@
import com.android.systemui.biometrics.domain.interactor.biometricStatusInteractor
import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
import com.android.systemui.biometrics.domain.interactor.sideFpsSensorInteractor
-import com.android.systemui.biometrics.fpsUnlockTracker
import com.android.systemui.keyguard.domain.interactor.deviceEntrySideFpsOverlayInteractor
import com.android.systemui.keyguard.ui.viewmodel.sideFpsProgressBarViewModel
import com.android.systemui.kosmos.Kosmos
@@ -38,7 +37,6 @@
{ biometricStatusInteractor },
{ displayStateInteractor },
{ deviceEntrySideFpsOverlayInteractor },
- { fpsUnlockTracker },
{ layoutInflater },
{ sideFpsProgressBarViewModel },
{ sideFpsSensorInteractor },