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