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

Commit fafbef1a authored by Grace Cheng's avatar Grace Cheng
Browse files

Gate SideFpsOverlayViewBinder and DeviceEntrySideFpsOverlayInteractor on device having SFPS

Add SFPS check to SideFpsOverlayViewBinder start() method and
DeviceEntrySideFpsOverlayInteractor init() method

Flag: NONE
Fixes: 316606073
Test: atest SideFpsOverlayViewBinderTest
Test: atest DeviceEntrySideFpsOverlayInteractorTest
Change-Id: Id46fb9e849608c2e6ab7cffb52dcb6b35dd84298
parent 342c33d3
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,