1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* 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.domain.interactor
import android.content.Context
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
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.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.res.R
import javax.inject.Inject
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
/**
* Encapsulates business logic for device entry events that impact the side fingerprint sensor
* overlay.
*/
@SysUISingleton
class DeviceEntrySideFpsOverlayInteractor
@Inject
constructor(
@Application private val context: Context,
deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
private val primaryBouncerInteractor: PrimaryBouncerInteractor,
alternateBouncerInteractor: AlternateBouncerInteractor,
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
) {
init {
alternateBouncerInteractor.setAlternateBouncerUIAvailable(true, TAG)
}
private val showIndicatorForPrimaryBouncer: Flow<Boolean> =
merge(
primaryBouncerInteractor.isShowing,
primaryBouncerInteractor.startingToHide,
primaryBouncerInteractor.startingDisappearAnimation.filterNotNull(),
deviceEntryFingerprintAuthRepository.shouldUpdateIndicatorVisibility.filter { it }
)
.map { shouldShowIndicatorForPrimaryBouncer() }
private val showIndicatorForAlternateBouncer: Flow<Boolean> =
alternateBouncerInteractor.isVisible
/**
* Indicates whether the primary or alternate bouncers request showing the side fingerprint
* sensor indicator.
*/
val showIndicatorForDeviceEntry: Flow<Boolean> =
combine(showIndicatorForPrimaryBouncer, showIndicatorForAlternateBouncer) {
showForPrimaryBouncer,
showForAlternateBouncer ->
showForPrimaryBouncer || showForAlternateBouncer
}
private fun shouldShowIndicatorForPrimaryBouncer(): Boolean {
val sfpsEnabled: Boolean =
context.resources.getBoolean(R.bool.config_show_sidefps_hint_on_bouncer)
val sfpsDetectionRunning = keyguardUpdateMonitor.isFingerprintDetectionRunning
val isUnlockingWithFpAllowed = keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed
return primaryBouncerInteractor.isBouncerShowing() &&
sfpsEnabled &&
sfpsDetectionRunning &&
isUnlockingWithFpAllowed &&
!primaryBouncerInteractor.isAnimatingAway()
}
companion object {
private const val TAG = "DeviceEntrySideFpsOverlayInteractor"
}
}
|