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

Commit 851afea4 authored by Beverly's avatar Beverly Committed by Android Build Coastguard Worker
Browse files

Wait to set propertiesInitialized to true

Until all fp props have sent some information.

Flag: NONE bug fix
Fixes: 336916379
Test: manually reboot device and observe lock
icon location on a UDFPS device
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5b52d73200a5a8d656d8b4f9af7c2ce75d2304eb)
Merged-In: I18c15685bb0b9ac9c2c1e222d730d9bb27114de1
Change-Id: I18c15685bb0b9ac9c2c1e222d730d9bb27114de1
parent 54f4f876
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -41,7 +41,10 @@ import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.withContext

@@ -52,7 +55,7 @@ import kotlinx.coroutines.withContext
 */
interface FingerprintPropertyRepository {
    /** Whether the fingerprint properties have been initialized yet. */
    val propertiesInitialized: StateFlow<Boolean>
    val propertiesInitialized: Flow<Boolean>

    /** The id of fingerprint sensor. */
    val sensorId: Flow<Int>
@@ -110,15 +113,6 @@ constructor(
                initialValue = UNINITIALIZED_PROPS,
            )

    override val propertiesInitialized: StateFlow<Boolean> =
        props
            .map { it != UNINITIALIZED_PROPS }
            .stateIn(
                applicationScope,
                started = SharingStarted.WhileSubscribed(),
                initialValue = props.value != UNINITIALIZED_PROPS,
            )

    override val sensorId: Flow<Int> = props.map { it.sensorId }

    override val strength: Flow<SensorStrength> = props.map { it.sensorStrength.toSensorStrength() }
@@ -139,6 +133,22 @@ constructor(
            }
        }

    override val propertiesInitialized: Flow<Boolean> =
        combine(
                props
                    .map { it != UNINITIALIZED_PROPS }
                    .onStart { emit(props.value != UNINITIALIZED_PROPS) },
                sensorId.map {}.onStart { if (props.value != UNINITIALIZED_PROPS) emit(Unit) },
                sensorLocations
                    .map {}
                    .onStart { if (props.value != UNINITIALIZED_PROPS) emit(Unit) },
                sensorType.map {}.onStart { if (props.value != UNINITIALIZED_PROPS) emit(Unit) },
                strength.map {}.onStart { if (props.value != UNINITIALIZED_PROPS) emit(Unit) },
            ) { initialized, _, _, _, _ ->
                initialized
            }
            .distinctUntilChanged()

    companion object {
        private const val TAG = "FingerprintPropertyRepositoryImpl"
        private val UNINITIALIZED_PROPS =
+2 −2
Original line number Diff line number Diff line
@@ -46,13 +46,13 @@ constructor(
    displayStateInteractor: DisplayStateInteractor,
    udfpsOverlayInteractor: UdfpsOverlayInteractor,
) {
    val propertiesInitialized: StateFlow<Boolean> = repository.propertiesInitialized
    val propertiesInitialized: Flow<Boolean> = repository.propertiesInitialized
    val isUdfps: StateFlow<Boolean> =
        repository.sensorType
            .map { it.isUdfps() }
            .stateIn(
                scope = applicationScope,
                started = SharingStarted.WhileSubscribed(),
                started = SharingStarted.Eagerly,
                initialValue = repository.sensorType.value.isUdfps(),
            )

+14 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.deviceentry.domain.interactor

import com.android.systemui.biometrics.domain.interactor.FingerprintPropertyInteractor
import com.android.systemui.biometrics.shared.model.SensorLocation
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
@@ -58,4 +59,17 @@ constructor(
                flowOf(false)
            }
        }

    /**
     * Location of the under-display fingerprint sensor on the display. Null if the device does not
     * support UDFPS.
     */
    val udfpsLocation: Flow<SensorLocation?> =
        isUdfpsSupported.flatMapLatest {
            if (it) {
                fingerprintPropertyInteractor.sensorLocation
            } else {
                flowOf(null)
            }
        }
}
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ constructor(
    private val refreshEvents: Flow<Unit> =
        merge(
            configurationInteractor.onAnyConfigurationChange,
            fingerprintPropertyInteractor.propertiesInitialized.filter { it }.map { Unit },
            fingerprintPropertyInteractor.propertiesInitialized.filter { it }.map {},
        )

    init {
+23 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context
import android.graphics.Point
import android.graphics.Rect
import android.util.DisplayMetrics
import android.util.Log
import android.view.View
import android.view.WindowManager
import androidx.annotation.VisibleForTesting
@@ -116,6 +117,10 @@ constructor(
    override fun applyConstraints(constraintSet: ConstraintSet) {
        val isUdfpsSupported =
            if (DeviceEntryUdfpsRefactor.isEnabled) {
                Log.d(
                    "DefaultDeviceEntrySection",
                    "isUdfpsSupported=${deviceEntryIconViewModel.get().isUdfpsSupported.value}"
                )
                deviceEntryIconViewModel.get().isUdfpsSupported.value
            } else {
                authController.isUdfpsSupported
@@ -138,9 +143,25 @@ constructor(
        val iconRadiusPx = (defaultDensity * 36).toInt()

        if (isUdfpsSupported) {
            if (DeviceEntryUdfpsRefactor.isEnabled) {
                deviceEntryIconViewModel.get().udfpsLocation.value?.let { udfpsLocation ->
                    Log.d(
                        "DeviceEntrySection",
                        "udfpsLocation=$udfpsLocation" +
                            " unusedAuthController=${authController.udfpsLocation}"
                    )
                    centerIcon(
                        Point(udfpsLocation.centerX.toInt(), udfpsLocation.centerY.toInt()),
                        udfpsLocation.radius,
                        constraintSet
                    )
                }
            } else {
                authController.udfpsLocation?.let { udfpsLocation ->
                    Log.d("DeviceEntrySection", "udfpsLocation=$udfpsLocation")
                    centerIcon(udfpsLocation, authController.udfpsRadius, constraintSet)
                }
            }
        } else {
            centerIcon(
                Point(
Loading