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

Commit 80c14a30 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[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<NotificationListVM>, 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
parent 6f4622fd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
}
+71 −0
Original line number Diff line number Diff line
/*
 *   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<Boolean>
        get() = emptyFlow()

    private val _canRunFaceAuth = MutableStateFlow(false)
    override val canRunFaceAuth: StateFlow<Boolean> = _canRunFaceAuth

    override val authenticationStatus: Flow<AuthenticationStatus>
        get() = emptyFlow()

    override val detectionStatus: Flow<DetectionStatus>
        get() = emptyFlow()

    private val _isLockedOut = MutableStateFlow(false)
    override val isLockedOut: StateFlow<Boolean> = _isLockedOut

    private val _isAuthRunning = MutableStateFlow(false)
    override val isAuthRunning: StateFlow<Boolean> = _isAuthRunning

    override val isBypassEnabled: Flow<Boolean>
        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() {}
}