1 /*
2  * Copyright (C) 2019 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 package com.android.systemui.statusbar.notification.collection.coordinator
17 
18 import com.android.systemui.flags.FeatureFlags
19 import com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED
20 import com.android.systemui.statusbar.notification.collection.NotifPipeline
21 import com.android.systemui.statusbar.notification.collection.PipelineDumpable
22 import com.android.systemui.statusbar.notification.collection.PipelineDumper
23 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
24 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
25 import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
26 import javax.inject.Inject
27 
28 /**
29  * Handles the attachment of [Coordinator]s to the [NotifPipeline] so that the
30  * Coordinators can register their respective callbacks.
31  */
32 interface NotifCoordinators : Coordinator, PipelineDumpable
33 
34 @CoordinatorScope
35 class NotifCoordinatorsImpl @Inject constructor(
36         sectionStyleProvider: SectionStyleProvider,
37         featureFlags: FeatureFlags,
38         dataStoreCoordinator: DataStoreCoordinator,
39         hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator,
40         hideNotifsForOtherUsersCoordinator: HideNotifsForOtherUsersCoordinator,
41         keyguardCoordinator: KeyguardCoordinator,
42         rankingCoordinator: RankingCoordinator,
43         colorizedFgsCoordinator: ColorizedFgsCoordinator,
44         deviceProvisionedCoordinator: DeviceProvisionedCoordinator,
45         bubbleCoordinator: BubbleCoordinator,
46         headsUpCoordinator: HeadsUpCoordinator,
47         gutsCoordinator: GutsCoordinator,
48         conversationCoordinator: ConversationCoordinator,
49         debugModeCoordinator: DebugModeCoordinator,
50         groupCountCoordinator: GroupCountCoordinator,
51         groupWhenCoordinator: GroupWhenCoordinator,
52         mediaCoordinator: MediaCoordinator,
53         preparationCoordinator: PreparationCoordinator,
54         remoteInputCoordinator: RemoteInputCoordinator,
55         rowAppearanceCoordinator: RowAppearanceCoordinator,
56         stackCoordinator: StackCoordinator,
57         shadeEventCoordinator: ShadeEventCoordinator,
58         smartspaceDedupingCoordinator: SmartspaceDedupingCoordinator,
59         viewConfigCoordinator: ViewConfigCoordinator,
60         visualStabilityCoordinator: VisualStabilityCoordinator,
61         sensitiveContentCoordinator: SensitiveContentCoordinator,
62         dismissibilityCoordinator: DismissibilityCoordinator,
63         dreamCoordinator: DreamCoordinator,
64 ) : NotifCoordinators {
65 
66     private val mCoreCoordinators: MutableList<CoreCoordinator> = ArrayList()
67     private val mCoordinators: MutableList<Coordinator> = ArrayList()
68     private val mOrderedSections: MutableList<NotifSectioner> = ArrayList()
69 
70     /**
71      * Creates all the coordinators.
72      */
73     init {
74         // Attach core coordinators.
75         mCoreCoordinators.add(dataStoreCoordinator)
76 
77         // Attach normal coordinators.
78         mCoordinators.add(hideLocallyDismissedNotifsCoordinator)
79         mCoordinators.add(hideNotifsForOtherUsersCoordinator)
80         mCoordinators.add(keyguardCoordinator)
81         mCoordinators.add(rankingCoordinator)
82         mCoordinators.add(colorizedFgsCoordinator)
83         mCoordinators.add(deviceProvisionedCoordinator)
84         mCoordinators.add(bubbleCoordinator)
85         mCoordinators.add(debugModeCoordinator)
86         mCoordinators.add(conversationCoordinator)
87         mCoordinators.add(groupCountCoordinator)
88         mCoordinators.add(groupWhenCoordinator)
89         mCoordinators.add(mediaCoordinator)
90         mCoordinators.add(rowAppearanceCoordinator)
91         mCoordinators.add(stackCoordinator)
92         mCoordinators.add(shadeEventCoordinator)
93         mCoordinators.add(viewConfigCoordinator)
94         mCoordinators.add(visualStabilityCoordinator)
95         mCoordinators.add(sensitiveContentCoordinator)
96         mCoordinators.add(smartspaceDedupingCoordinator)
97         mCoordinators.add(headsUpCoordinator)
98         mCoordinators.add(gutsCoordinator)
99         mCoordinators.add(preparationCoordinator)
100         mCoordinators.add(remoteInputCoordinator)
101         mCoordinators.add(dismissibilityCoordinator)
102 
103         if (featureFlags.isEnabled(LOCKSCREEN_WALLPAPER_DREAM_ENABLED)) {
104             mCoordinators.add(dreamCoordinator)
105         }
106 
107         // Manually add Ordered Sections
108         mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp
109         mOrderedSections.add(colorizedFgsCoordinator.sectioner) // ForegroundService
110         mOrderedSections.add(conversationCoordinator.peopleAlertingSectioner) // People Alerting
111         mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
112         mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
113         mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent
114         mOrderedSections.add(rankingCoordinator.minimizedSectioner) // Minimized
115 
116         sectionStyleProvider.setMinimizedSections(setOf(rankingCoordinator.minimizedSectioner))
117         sectionStyleProvider.setSilentSections(listOf(
118                 conversationCoordinator.peopleSilentSectioner,
119                 rankingCoordinator.silentSectioner,
120                 rankingCoordinator.minimizedSectioner,
121         ))
122     }
123 
124     /**
125      * Sends the pipeline to each coordinator when the pipeline is ready to accept
126      * [Pluggable]s, [NotifCollectionListener]s and [NotifLifetimeExtender]s.
127      */
128     override fun attach(pipeline: NotifPipeline) {
129         for (c in mCoreCoordinators) {
130             c.attach(pipeline)
131         }
132         for (c in mCoordinators) {
133             c.attach(pipeline)
134         }
135         pipeline.setSections(mOrderedSections)
136     }
137 
138     /*
139      * As part of the NotifPipeline dumpable, dumps the list of coordinators; sections are omitted
140      * as they are dumped in the RenderStageManager instead.
141      */
142     override fun dumpPipeline(d: PipelineDumper) = with(d) {
143         dump("core coordinators", mCoreCoordinators)
144         dump("normal coordinators", mCoordinators)
145     }
146 
147     companion object {
148         private const val TAG = "NotifCoordinators"
149     }
150 }
151