diff options
| author | 2023-11-27 14:22:11 +0000 | |
|---|---|---|
| committer | 2023-11-27 14:22:11 +0000 | |
| commit | 06a1dce1870f2ee893449b9686b3e6044724aac7 (patch) | |
| tree | c9d39bc19f0edd62a24c576b2621cfd6205ca672 | |
| parent | d5be72c245ff3dea297a2ce1069bf1e644b01e8d (diff) | |
| parent | eb4437865e81d494eb70c522c6aef2ac98429fe2 (diff) | |
Merge "Move face auth related computations to the background" into main
7 files changed, 75 insertions, 43 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt index 8ef26621362f..36412e31e7c0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt @@ -253,7 +253,7 @@ constructor( Pair(isAuthenticated.isFalse(), "faceNotAuthenticated"), ) .andAllFlows("canFaceAuthRun", faceAuthLog) - .flowOn(mainDispatcher) + .flowOn(backgroundDispatcher) .stateIn(applicationScope, SharingStarted.Eagerly, false) // Face detection can run only when lockscreen bypass is enabled @@ -280,7 +280,7 @@ constructor( ) ) .andAllFlows("canFaceDetectRun", faceDetectLog) - .flowOn(mainDispatcher) + .flowOn(backgroundDispatcher) .stateIn(applicationScope, SharingStarted.Eagerly, false) observeFaceAuthGatingChecks() observeFaceDetectGatingChecks() diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt index 9bec30052476..96386f3dc596 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt @@ -26,6 +26,7 @@ import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLoggin import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus import com.android.systemui.keyguard.shared.model.FailFingerprintAuthenticationStatus @@ -33,11 +34,13 @@ import com.android.systemui.keyguard.shared.model.FingerprintAuthenticationStatu import com.android.systemui.keyguard.shared.model.HelpFingerprintAuthenticationStatus import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn /** Encapsulates state about device entry fingerprint auth mechanism. */ @@ -74,6 +77,7 @@ constructor( val authController: AuthController, val keyguardUpdateMonitor: KeyguardUpdateMonitor, @Application scope: CoroutineScope, + @Main private val mainDispatcher: CoroutineDispatcher, ) : DeviceEntryFingerprintAuthRepository { override val availableFpSensorType: Flow<BiometricType?> @@ -137,30 +141,34 @@ constructor( .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) override val isRunning: Flow<Boolean> - get() = conflatedCallbackFlow { - val callback = - object : KeyguardUpdateMonitorCallback() { - override fun onBiometricRunningStateChanged( - running: Boolean, - biometricSourceType: BiometricSourceType? - ) { - if (biometricSourceType == BiometricSourceType.FINGERPRINT) { - trySendWithFailureLogging( - running, - TAG, - "Fingerprint running state changed" - ) + get() = + conflatedCallbackFlow { + val callback = + object : KeyguardUpdateMonitorCallback() { + override fun onBiometricRunningStateChanged( + running: Boolean, + biometricSourceType: BiometricSourceType? + ) { + if (biometricSourceType == BiometricSourceType.FINGERPRINT) { + trySendWithFailureLogging( + running, + TAG, + "Fingerprint running state changed" + ) + } + } } - } + keyguardUpdateMonitor.registerCallback(callback) + trySendWithFailureLogging( + keyguardUpdateMonitor.isFingerprintDetectionRunning, + TAG, + "Initial fingerprint running state" + ) + awaitClose { keyguardUpdateMonitor.removeCallback(callback) } } - keyguardUpdateMonitor.registerCallback(callback) - trySendWithFailureLogging( - keyguardUpdateMonitor.isFingerprintDetectionRunning, - TAG, - "Initial fingerprint running state" - ) - awaitClose { keyguardUpdateMonitor.removeCallback(callback) } - } + .flowOn( + mainDispatcher + ) // keyguardUpdateMonitor requires registration on main thread. override val authenticationStatus: Flow<FingerprintAuthenticationStatus> get() = conflatedCallbackFlow { @@ -171,7 +179,6 @@ constructor( biometricSourceType: BiometricSourceType, isStrongBiometric: Boolean, ) { - sendUpdateIfFingerprint( biometricSourceType, SuccessFingerprintAuthenticationStatus( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DevicePostureRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DevicePostureRepository.kt index adb1e01d0d00..7c430920cb46 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DevicePostureRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DevicePostureRepository.kt @@ -19,11 +19,14 @@ package com.android.systemui.keyguard.data.repository import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.shared.model.DevicePosture import com.android.systemui.statusbar.policy.DevicePostureController import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn /** Provide current device posture state. */ interface DevicePostureRepository { @@ -34,23 +37,28 @@ interface DevicePostureRepository { @SysUISingleton class DevicePostureRepositoryImpl @Inject -constructor(private val postureController: DevicePostureController) : DevicePostureRepository { +constructor( + private val postureController: DevicePostureController, + @Main private val mainDispatcher: CoroutineDispatcher +) : DevicePostureRepository { override val currentDevicePosture: Flow<DevicePosture> - get() = conflatedCallbackFlow { - val sendPostureUpdate = { posture: Int -> - val currentDevicePosture = DevicePosture.toPosture(posture) - trySendWithFailureLogging( - currentDevicePosture, - TAG, - "Error sending posture update to $currentDevicePosture" - ) - } - val callback = DevicePostureController.Callback { sendPostureUpdate(it) } - postureController.addCallback(callback) - sendPostureUpdate(postureController.devicePosture) + get() = + conflatedCallbackFlow { + val sendPostureUpdate = { posture: Int -> + val currentDevicePosture = DevicePosture.toPosture(posture) + trySendWithFailureLogging( + currentDevicePosture, + TAG, + "Error sending posture update to $currentDevicePosture" + ) + } + val callback = DevicePostureController.Callback { sendPostureUpdate(it) } + postureController.addCallback(callback) + sendPostureUpdate(postureController.devicePosture) - awaitClose { postureController.removeCallback(callback) } - } + awaitClose { postureController.removeCallback(callback) } + } + .flowOn(mainDispatcher) // DevicePostureController requirement companion object { const val TAG = "PostureRepositoryImpl" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 674f1698d2a3..a3d316b611a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -22,6 +22,7 @@ import android.content.pm.PackageManager import android.hardware.biometrics.BiometricSourceType import android.provider.Settings import androidx.annotation.VisibleForTesting +import com.android.app.tracing.ListenersTracing.forEachTraced import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application @@ -186,7 +187,9 @@ open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassContr } } - private fun notifyListeners() = listeners.forEach { it.onBypassStateChanged(bypassEnabled) } + private fun notifyListeners() = listeners.forEachTraced("KeyguardBypassController") { + it.onBypassStateChanged(bypassEnabled) + } /** * Notify that the biometric unlock has happened. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java index a32a5ab13748..8f1ac812da71 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java @@ -22,11 +22,14 @@ import android.util.SparseIntArray; import androidx.annotation.NonNull; +import com.android.app.tracing.ListenersTracing; import com.android.internal.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.util.Assert; +import kotlin.Unit; + import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; @@ -75,7 +78,11 @@ public class DevicePostureControllerImpl implements DevicePostureController { mCurrentDevicePosture = mDeviceStateToPostureMap.get(state, DEVICE_POSTURE_UNKNOWN); - mListeners.forEach(l -> l.onPostureChanged(mCurrentDevicePosture)); + ListenersTracing.INSTANCE.forEachTraced(mListeners, "DevicePostureControllerImpl", + l -> { + l.onPostureChanged(mCurrentDevicePosture); + return Unit.INSTANCE; + }); }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt index a58bc52bf8e5..2b7221ec192c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt @@ -34,6 +34,7 @@ import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before @@ -69,6 +70,7 @@ class DeviceEntryFingerprintAuthRepositoryTest : SysuiTestCase() { authController, keyguardUpdateMonitor, testScope.backgroundScope, + UnconfinedTestDispatcher(), ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt index 9be5558f5cc2..ae6c5b7b36b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt @@ -26,6 +26,7 @@ import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -49,7 +50,11 @@ class DevicePostureRepositoryTest : SysuiTestCase() { fun setup() { MockitoAnnotations.initMocks(this) testScope = TestScope() - underTest = DevicePostureRepositoryImpl(postureController = devicePostureController) + underTest = + DevicePostureRepositoryImpl( + postureController = devicePostureController, + UnconfinedTestDispatcher() + ) } @Test |