xref: /aosp_15_r20/frameworks/base/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1 package com.android.systemui.bouncer.ui.binder
2 
3 import android.view.ViewGroup
4 import com.android.keyguard.KeyguardMessageAreaController
5 import com.android.keyguard.dagger.KeyguardBouncerComponent
6 import com.android.systemui.Flags.contAuthPlugin
7 import com.android.systemui.biometrics.plugins.AuthContextPlugins
8 import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor
9 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
10 import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags
11 import com.android.systemui.bouncer.ui.BouncerDialogFactory
12 import com.android.systemui.bouncer.ui.viewmodel.BouncerContainerViewModel
13 import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
14 import com.android.systemui.bouncer.ui.viewmodel.KeyguardBouncerViewModel
15 import com.android.systemui.dagger.SysUISingleton
16 import com.android.systemui.dagger.qualifiers.Application
17 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
18 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel
19 import com.android.systemui.log.BouncerLogger
20 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
21 import dagger.Lazy
22 import java.util.Optional
23 import javax.inject.Inject
24 import kotlinx.coroutines.CoroutineScope
25 import kotlinx.coroutines.ExperimentalCoroutinesApi
26 
27 /** Helper data class that allows to lazy load all the dependencies of the legacy bouncer. */
28 @OptIn(ExperimentalCoroutinesApi::class)
29 @SysUISingleton
30 data class LegacyBouncerDependencies
31 @Inject
32 constructor(
33     val viewModel: KeyguardBouncerViewModel,
34     val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel,
35     val componentFactory: KeyguardBouncerComponent.Factory,
36     val messageAreaControllerFactory: KeyguardMessageAreaController.Factory,
37     val bouncerMessageInteractor: BouncerMessageInteractor,
38     val bouncerLogger: BouncerLogger,
39     val selectedUserInteractor: SelectedUserInteractor,
40 )
41 
42 /** Helper data class that allows to lazy load all the dependencies of the compose based bouncer. */
43 @SysUISingleton
44 data class ComposeBouncerDependencies
45 @Inject
46 constructor(
47     @Application val applicationScope: CoroutineScope,
48     val keyguardInteractor: KeyguardInteractor,
49     val selectedUserInteractor: SelectedUserInteractor,
50     val legacyInteractor: PrimaryBouncerInteractor,
51     val viewModelFactory: BouncerSceneContentViewModel.Factory,
52     val dialogFactory: BouncerDialogFactory,
53     val bouncerContainerViewModelFactory: BouncerContainerViewModel.Factory,
54 )
55 
56 /**
57  * Toggles between the compose and non compose version of the bouncer, instantiating only the
58  * dependencies required for each.
59  */
60 @SysUISingleton
61 class BouncerViewBinder
62 @Inject
63 constructor(
64     private val legacyBouncerDependencies: Lazy<LegacyBouncerDependencies>,
65     private val composeBouncerDependencies: Lazy<ComposeBouncerDependencies>,
66     private val contextPlugins: Optional<AuthContextPlugins>,
67 ) {
bindnull68     fun bind(view: ViewGroup) {
69         if (ComposeBouncerFlags.isOnlyComposeBouncerEnabled()) {
70             val deps = composeBouncerDependencies.get()
71             ComposeBouncerViewBinder.bind(
72                 view,
73                 deps.applicationScope,
74                 deps.legacyInteractor,
75                 deps.keyguardInteractor,
76                 deps.selectedUserInteractor,
77                 deps.viewModelFactory,
78                 deps.dialogFactory,
79                 deps.bouncerContainerViewModelFactory,
80             )
81         } else {
82             val deps = legacyBouncerDependencies.get()
83             KeyguardBouncerViewBinder.bind(
84                 view,
85                 deps.viewModel,
86                 deps.primaryBouncerToGoneTransitionViewModel,
87                 deps.componentFactory,
88                 deps.messageAreaControllerFactory,
89                 deps.bouncerMessageInteractor,
90                 deps.bouncerLogger,
91                 deps.selectedUserInteractor,
92                 if (contAuthPlugin()) contextPlugins.orElse(null) else null,
93             )
94         }
95     }
96 }
97