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