1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.scene 18 19 import com.android.systemui.CoreStartable 20 import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlagsModule 21 import com.android.systemui.notifications.ui.composable.NotificationsShadeSessionModule 22 import com.android.systemui.scene.domain.SceneDomainModule 23 import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor 24 import com.android.systemui.scene.domain.resolver.HomeSceneFamilyResolverModule 25 import com.android.systemui.scene.domain.resolver.NotifShadeSceneFamilyResolverModule 26 import com.android.systemui.scene.domain.resolver.QuickSettingsSceneFamilyResolverModule 27 import com.android.systemui.scene.domain.startable.SceneContainerStartable 28 import com.android.systemui.scene.domain.startable.ScrimStartable 29 import com.android.systemui.scene.shared.model.SceneContainerConfig 30 import com.android.systemui.scene.shared.model.Scenes 31 import com.android.systemui.shade.shared.flag.DualShade 32 import dagger.Binds 33 import dagger.Module 34 import dagger.Provides 35 import dagger.multibindings.ClassKey 36 import dagger.multibindings.IntoMap 37 38 /** Scene framework Dagger module suitable for AOSP. */ 39 @Module( 40 includes = 41 [ 42 BouncerSceneModule::class, 43 CommunalSceneModule::class, 44 ComposeBouncerFlagsModule::class, 45 EmptySceneModule::class, 46 GoneSceneModule::class, 47 LockscreenSceneModule::class, 48 QuickSettingsSceneModule::class, 49 ShadeSceneModule::class, 50 QuickSettingsShadeSceneModule::class, 51 NotificationsShadeSceneModule::class, 52 NotificationsShadeSessionModule::class, 53 SceneDomainModule::class, 54 55 // List SceneResolver modules for supported SceneFamilies 56 HomeSceneFamilyResolverModule::class, 57 NotifShadeSceneFamilyResolverModule::class, 58 QuickSettingsSceneFamilyResolverModule::class, 59 ], 60 ) 61 interface SceneContainerFrameworkModule { 62 63 @Binds 64 @IntoMap 65 @ClassKey(SceneContainerStartable::class) containerStartablenull66 fun containerStartable(impl: SceneContainerStartable): CoreStartable 67 68 @Binds 69 @IntoMap 70 @ClassKey(ScrimStartable::class) 71 fun scrimStartable(impl: ScrimStartable): CoreStartable 72 73 @Binds 74 @IntoMap 75 @ClassKey(WindowRootViewVisibilityInteractor::class) 76 fun bindWindowRootViewVisibilityInteractor( 77 impl: WindowRootViewVisibilityInteractor 78 ): CoreStartable 79 80 companion object { 81 82 @Provides 83 fun containerConfig(): SceneContainerConfig { 84 return SceneContainerConfig( 85 // Note that this list is in z-order. The first one is the bottom-most and the last 86 // one is top-most. 87 sceneKeys = 88 listOfNotNull( 89 Scenes.Gone, 90 Scenes.Communal, 91 Scenes.Lockscreen, 92 Scenes.Bouncer, 93 Scenes.QuickSettings.takeUnless { DualShade.isEnabled }, 94 Scenes.QuickSettingsShade.takeIf { DualShade.isEnabled }, 95 Scenes.NotificationsShade.takeIf { DualShade.isEnabled }, 96 Scenes.Shade.takeUnless { DualShade.isEnabled }, 97 ), 98 initialSceneKey = Scenes.Lockscreen, 99 navigationDistances = 100 mapOf( 101 Scenes.Gone to 0, 102 Scenes.Lockscreen to 0, 103 Scenes.Communal to 1, 104 Scenes.NotificationsShade to 2.takeIf { DualShade.isEnabled }, 105 Scenes.Shade to 2.takeUnless { DualShade.isEnabled }, 106 Scenes.QuickSettingsShade to 3.takeIf { DualShade.isEnabled }, 107 Scenes.QuickSettings to 3.takeUnless { DualShade.isEnabled }, 108 Scenes.Bouncer to 4, 109 ) 110 .filterValues { it != null } 111 .mapValues { checkNotNull(it.value) } 112 ) 113 } 114 } 115 } 116