Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e80dd14 authored by Grace Cheng's avatar Grace Cheng Committed by Android (Google) Code Review
Browse files

Merge "Gate SideFpsOverlayViewBinder and DeviceEntrySideFpsOverlayInteractor...

Merge "Gate SideFpsOverlayViewBinder and DeviceEntrySideFpsOverlayInteractor on device having SFPS" into main
parents a91caebe fafbef1a
Loading
Loading
Loading
Loading
+50 −42
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import com.android.systemui.keyguard.ui.viewmodel.SideFpsProgressBarViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.sample
import dagger.Lazy
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.combine
@@ -59,29 +60,34 @@ class SideFpsOverlayViewBinder
constructor(
    @Application private val applicationScope: CoroutineScope,
    @Application private val applicationContext: Context,
    private val biometricStatusInteractor: BiometricStatusInteractor,
    private val displayStateInteractor: DisplayStateInteractor,
    private val deviceEntrySideFpsOverlayInteractor: DeviceEntrySideFpsOverlayInteractor,
    private val fpsUnlockTracker: FpsUnlockTracker,
    private val layoutInflater: LayoutInflater,
    private val sideFpsProgressBarViewModel: SideFpsProgressBarViewModel,
    private val sfpsSensorInteractor: SideFpsSensorInteractor,
    private val windowManager: WindowManager
    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>,
    private val windowManager: Lazy<WindowManager>
) : CoreStartable {

    override fun start() {
        if (!SideFpsControllerRefactor.isEnabled) {
            return
        }

        applicationScope
            .launch {
                sfpsSensorInteractor.get().isAvailable.collect { isSfpsAvailable ->
                    if (isSfpsAvailable) {
                        combine(
                        biometricStatusInteractor.sfpsAuthenticationReason,
                        deviceEntrySideFpsOverlayInteractor.showIndicatorForDeviceEntry,
                        sideFpsProgressBarViewModel.isVisible,
                                biometricStatusInteractor.get().sfpsAuthenticationReason,
                                deviceEntrySideFpsOverlayInteractor
                                    .get()
                                    .showIndicatorForDeviceEntry,
                                sideFpsProgressBarViewModel.get().isVisible,
                                ::Triple
                            )
                    .sample(displayStateInteractor.isInRearDisplayMode, ::Pair)
                            .sample(displayStateInteractor.get().isInRearDisplayMode, ::Pair)
                            .collect { (combinedFlows, isInRearDisplayMode: Boolean) ->
                                val (
                                    systemServerAuthReason,
@@ -101,7 +107,9 @@ constructor(
                                }
                            }
                    }
            .invokeOnCompletion { fpsUnlockTracker.stopTracking() }
                }
            }
            .invokeOnCompletion { fpsUnlockTracker.get().stopTracking() }
    }

    private var overlayView: View? = null
@@ -113,29 +121,29 @@ constructor(
            if (it.isAttachedToWindow) {
                lottie = it.requireViewById<LottieAnimationView>(R.id.sidefps_animation)
                lottie?.pauseAnimation()
                windowManager.removeView(it)
                windowManager.get().removeView(it)
            }
        }

        overlayView = layoutInflater.inflate(R.layout.sidefps_view, null, false)
        overlayView = layoutInflater.get().inflate(R.layout.sidefps_view, null, false)
        val overlayViewModel =
            SideFpsOverlayViewModel(
                applicationContext,
                biometricStatusInteractor,
                deviceEntrySideFpsOverlayInteractor,
                displayStateInteractor,
                sfpsSensorInteractor,
                sideFpsProgressBarViewModel
                biometricStatusInteractor.get(),
                deviceEntrySideFpsOverlayInteractor.get(),
                displayStateInteractor.get(),
                sfpsSensorInteractor.get(),
                sideFpsProgressBarViewModel.get()
            )
        bind(overlayView!!, overlayViewModel, fpsUnlockTracker, windowManager)
        bind(overlayView!!, overlayViewModel, fpsUnlockTracker.get(), windowManager.get())
        overlayView!!.visibility = View.INVISIBLE
        windowManager.addView(overlayView, overlayViewModel.defaultOverlayViewParams)
        windowManager.get().addView(overlayView, overlayViewModel.defaultOverlayViewParams)
    }

    /** Hide the side fingerprint sensor indicator */
    private fun hide() {
        if (overlayView != null) {
            windowManager.removeView(overlayView)
            windowManager.get().removeView(overlayView)
            overlayView = null
        }
    }
+11 −1
Original line number Diff line number Diff line
@@ -23,15 +23,18 @@ import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
import com.android.systemui.keyguard.data.repository.BiometricType
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.res.R
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.launch

/**
 * Encapsulates business logic for device entry events that impact the side fingerprint sensor
@@ -41,6 +44,7 @@ import kotlinx.coroutines.flow.merge
class DeviceEntrySideFpsOverlayInteractor
@Inject
constructor(
    @Application private val applicationScope: CoroutineScope,
    @Application private val context: Context,
    deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
    private val primaryBouncerInteractor: PrimaryBouncerInteractor,
@@ -50,9 +54,15 @@ constructor(

    init {
        if (!DeviceEntryUdfpsRefactor.isEnabled) {
            applicationScope.launch {
                deviceEntryFingerprintAuthRepository.availableFpSensorType.collect { sensorType ->
                    if (sensorType == BiometricType.SIDE_FINGERPRINT) {
                        alternateBouncerInteractor.setAlternateBouncerUIAvailable(true, TAG)
                    }
                }
            }
        }
    }

    private val showIndicatorForPrimaryBouncer: Flow<Boolean> =
        merge(
+9 −8
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ class SideFpsOverlayViewBinderTest : SysuiTestCase() {

        deviceEntrySideFpsOverlayInteractor =
            DeviceEntrySideFpsOverlayInteractor(
                testScope.backgroundScope,
                mContext,
                deviceEntryFingerprintAuthRepository,
                primaryBouncerInteractor,
@@ -260,14 +261,14 @@ class SideFpsOverlayViewBinderTest : SysuiTestCase() {
            SideFpsOverlayViewBinder(
                testScope.backgroundScope,
                mContext,
                biometricStatusInteractor,
                displayStateInteractor,
                deviceEntrySideFpsOverlayInteractor,
                fpsUnlockTracker,
                layoutInflater,
                sideFpsProgressBarViewModel,
                sfpsSensorInteractor,
                windowManager
                { biometricStatusInteractor },
                { displayStateInteractor },
                { deviceEntrySideFpsOverlayInteractor },
                { fpsUnlockTracker },
                { layoutInflater },
                { sideFpsProgressBarViewModel },
                { sfpsSensorInteractor },
                { windowManager }
            )

        context.addMockSystemService(DisplayManager::class.java, displayManager)
+1 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ class SideFpsOverlayViewModelTest : SysuiTestCase() {

        deviceEntrySideFpsOverlayInteractor =
            DeviceEntrySideFpsOverlayInteractor(
                testScope.backgroundScope,
                mContext,
                deviceEntryFingerprintAuthRepository,
                primaryBouncerInteractor,
+1 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ class DeviceEntrySideFpsOverlayInteractorTest : SysuiTestCase() {
            )
        underTest =
            DeviceEntrySideFpsOverlayInteractor(
                testScope.backgroundScope,
                mContext,
                FakeDeviceEntryFingerprintAuthRepository(),
                primaryBouncerInteractor,