From 80c14a30f26d7c6966ad6ffed21983fffa913019 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Fri, 16 Jun 2023 14:39:20 +0000 Subject: [PATCH] [CS] Add NoopDeviceEntryFaceAuthRepository. This is a precursor to ag/23672734, which makes NotificationStackScrollLayoutController (NSSLC) a singleton. NSSLC has DeviceEntryFaceAuthRepository as a transitive dependency (NSSLC injects Optional, which injects NotificationShelfVM, which injects NotificationShelfInteractor, which injects DeviceEntryFaceAuthRepository). Previously, NotificationStackScrollLayoutController and its dependencies were part of CentralSurfacesComponent, which was only created by CentralSurfacesImpl which already had DeviceEntryFaceAuthRepository. Making NSSLC a singleton requires moving those dependencies into NotificationsModule, which is included in more than just CentralSurfacesImpl -- specifically, the ARC project. ARC currently doesn't provide any implementation of DeviceEntryFaceAuthRepository. By adding this no-op implementation, ARC can provide that dependency (ARC already includes the KeyguardFaceAuthNotSupportedModule). Bug: 277762009 Test: compiles Change-Id: I68f9db9ed27c99109cab55a66fa3d9d3b7bb27c2 --- .../KeyguardFaceAuthNotSupportedModule.kt | 7 ++ .../NoopDeviceEntryFaceAuthRepository.kt | 71 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 packages/SystemUI/src/com/android/systemui/keyguard/data/repository/NoopDeviceEntryFaceAuthRepository.kt diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardFaceAuthNotSupportedModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardFaceAuthNotSupportedModule.kt index a44df7e11fa11..d8eb81caa76c5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardFaceAuthNotSupportedModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardFaceAuthNotSupportedModule.kt @@ -16,6 +16,8 @@ package com.android.systemui.keyguard.dagger +import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository +import com.android.systemui.keyguard.data.repository.NoopDeviceEntryFaceAuthRepository import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor import com.android.systemui.keyguard.domain.interactor.NoopKeyguardFaceAuthInteractor import dagger.Binds @@ -32,4 +34,9 @@ import dagger.Module interface KeyguardFaceAuthNotSupportedModule { @Binds fun keyguardFaceAuthInteractor(impl: NoopKeyguardFaceAuthInteractor): KeyguardFaceAuthInteractor + + @Binds + fun deviceEntryFaceAuthRepository( + impl: NoopDeviceEntryFaceAuthRepository + ): DeviceEntryFaceAuthRepository } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/NoopDeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/NoopDeviceEntryFaceAuthRepository.kt new file mode 100644 index 0000000000000..abe59b76816fa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/NoopDeviceEntryFaceAuthRepository.kt @@ -0,0 +1,71 @@ +/* + * 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.keyguard.data.repository + +import com.android.keyguard.FaceAuthUiEvent +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.shared.model.AuthenticationStatus +import com.android.systemui.keyguard.shared.model.DetectionStatus +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.emptyFlow + +/** + * Implementation of the repository that noops all face auth operations. + * + * This is required for SystemUI variants that do not support face authentication but still inject + * other SysUI components that depend on [DeviceEntryFaceAuthRepository]. + */ +@SysUISingleton +class NoopDeviceEntryFaceAuthRepository @Inject constructor() : DeviceEntryFaceAuthRepository { + override val isAuthenticated: Flow + get() = emptyFlow() + + private val _canRunFaceAuth = MutableStateFlow(false) + override val canRunFaceAuth: StateFlow = _canRunFaceAuth + + override val authenticationStatus: Flow + get() = emptyFlow() + + override val detectionStatus: Flow + get() = emptyFlow() + + private val _isLockedOut = MutableStateFlow(false) + override val isLockedOut: StateFlow = _isLockedOut + + private val _isAuthRunning = MutableStateFlow(false) + override val isAuthRunning: StateFlow = _isAuthRunning + + override val isBypassEnabled: Flow + get() = emptyFlow() + + /** + * Trigger face authentication. + * + * [uiEvent] provided should be logged whenever face authentication runs. Invocation should be + * ignored if face authentication is already running. Results should be propagated through + * [authenticationStatus] + * + * Run only face detection when [fallbackToDetection] is true and [canRunFaceAuth] is false. + */ + override suspend fun authenticate(uiEvent: FaceAuthUiEvent, fallbackToDetection: Boolean) {} + + /** Stop currently running face authentication or detection. */ + override fun cancel() {} +}