• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.statusbar.notification.collection.NotifPipeline
19 import com.android.systemui.statusbar.notification.collection.NotificationClassificationFlag
20 import com.android.systemui.statusbar.notification.collection.PipelineDumpable
21 import com.android.systemui.statusbar.notification.collection.PipelineDumper
22 import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
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 com.android.systemui.statusbar.notification.promoted.AutomaticPromotionCoordinator
27 import com.android.systemui.statusbar.notification.shared.NotificationBundleUi
28 import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
29 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
30 import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
31 import javax.inject.Inject
32 
33 /**
34  * Handles the attachment of [Coordinator]s to the [NotifPipeline] so that the Coordinators can
35  * register their respective callbacks.
36  */
37 interface NotifCoordinators : Coordinator, PipelineDumpable
38 
39 @CoordinatorScope
40 class NotifCoordinatorsImpl
41 @Inject
42 constructor(
43     sectionStyleProvider: SectionStyleProvider,
44     dataStoreCoordinator: DataStoreCoordinator,
45     hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator,
46     hideNotifsForOtherUsersCoordinator: HideNotifsForOtherUsersCoordinator,
47     keyguardCoordinator: KeyguardCoordinator,
48     unseenKeyguardCoordinator: OriginalUnseenKeyguardCoordinator,
49     lockScreenMinimalismCoordinator: LockScreenMinimalismCoordinator,
50     rankingCoordinator: RankingCoordinator,
51     colorizedFgsCoordinator: ColorizedFgsCoordinator,
52     deviceProvisionedCoordinator: DeviceProvisionedCoordinator,
53     bubbleCoordinator: BubbleCoordinator,
54     headsUpCoordinator: HeadsUpCoordinator,
55     gutsCoordinator: GutsCoordinator,
56     conversationCoordinator: ConversationCoordinator,
57     debugModeCoordinator: DebugModeCoordinator,
58     groupCountCoordinator: GroupCountCoordinator,
59     groupWhenCoordinator: GroupWhenCoordinator,
60     mediaCoordinator: MediaCoordinator,
61     preparationCoordinator: PreparationCoordinator,
62     remoteInputCoordinator: RemoteInputCoordinator,
63     rowAlertTimeCoordinator: RowAlertTimeCoordinator,
64     rowAppearanceCoordinator: RowAppearanceCoordinator,
65     stackCoordinator: StackCoordinator,
66     shadeEventCoordinator: ShadeEventCoordinator,
67     smartspaceDedupingCoordinator: SmartspaceDedupingCoordinator,
68     viewConfigCoordinator: ViewConfigCoordinator,
69     visualStabilityCoordinator: VisualStabilityCoordinator,
70     sensitiveContentCoordinator: SensitiveContentCoordinator,
71     dismissibilityCoordinator: DismissibilityCoordinator,
72     statsLoggerCoordinator: NotificationStatsLoggerCoordinator,
73     bundleCoordinator: BundleCoordinator,
74     automaticPromotionCoordinator: AutomaticPromotionCoordinator,
75 ) : NotifCoordinators {
76 
77     private val mCoreCoordinators: MutableList<CoreCoordinator> = ArrayList()
78     private val mCoordinators: MutableList<Coordinator> = ArrayList()
79     private val mOrderedSections: MutableList<NotifSectioner> = ArrayList()
80 
81     /** Creates all the coordinators. */
82     init {
83         // Attach core coordinators.
84         mCoreCoordinators.add(dataStoreCoordinator)
85 
86         // Attach normal coordinators.
87         mCoordinators.add(hideLocallyDismissedNotifsCoordinator)
88         mCoordinators.add(hideNotifsForOtherUsersCoordinator)
89         mCoordinators.add(keyguardCoordinator)
90         if (NotificationMinimalism.isEnabled) {
91             mCoordinators.add(lockScreenMinimalismCoordinator)
92         }
93         mCoordinators.add(unseenKeyguardCoordinator)
94         mCoordinators.add(rankingCoordinator)
95         mCoordinators.add(colorizedFgsCoordinator)
96         mCoordinators.add(deviceProvisionedCoordinator)
97         mCoordinators.add(bubbleCoordinator)
98         mCoordinators.add(debugModeCoordinator)
99         mCoordinators.add(conversationCoordinator)
100         mCoordinators.add(groupCountCoordinator)
101         mCoordinators.add(groupWhenCoordinator)
102         mCoordinators.add(mediaCoordinator)
103         mCoordinators.add(rowAlertTimeCoordinator)
104         mCoordinators.add(rowAppearanceCoordinator)
105         mCoordinators.add(stackCoordinator)
106         mCoordinators.add(shadeEventCoordinator)
107         mCoordinators.add(viewConfigCoordinator)
108         mCoordinators.add(visualStabilityCoordinator)
109         mCoordinators.add(sensitiveContentCoordinator)
110         mCoordinators.add(smartspaceDedupingCoordinator)
111         mCoordinators.add(headsUpCoordinator)
112         mCoordinators.add(gutsCoordinator)
113         mCoordinators.add(preparationCoordinator)
114         mCoordinators.add(remoteInputCoordinator)
115         mCoordinators.add(dismissibilityCoordinator)
116         mCoordinators.add(automaticPromotionCoordinator)
117         if (NotificationBundleUi.isEnabled) {
118             mCoordinators.add(bundleCoordinator)
119         }
120         if (NotificationsLiveDataStoreRefactor.isEnabled) {
121             mCoordinators.add(statsLoggerCoordinator)
122         }
123         // Manually add Ordered Sections
124         if (NotificationMinimalism.isEnabled) {
125             mOrderedSections.add(lockScreenMinimalismCoordinator.topOngoingSectioner) // Top Ongoing
126         }
127         mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp
128         if (NotificationMinimalism.isEnabled) {
129             mOrderedSections.add(lockScreenMinimalismCoordinator.topUnseenSectioner) // Top Unseen
130         }
131         mOrderedSections.add(colorizedFgsCoordinator.sectioner) // ForegroundService
132         if (PriorityPeopleSection.isEnabled) {
133             mOrderedSections.add(conversationCoordinator.priorityPeopleSectioner) // Priority People
134         }
135         mOrderedSections.add(conversationCoordinator.peopleAlertingSectioner) // People Alerting
136         if (!SortBySectionTimeFlag.isEnabled) {
137             mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
138         }
139         mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
140         if (NotificationClassificationFlag.isEnabled && !NotificationBundleUi.isEnabled) {
141             mOrderedSections.add(bundleCoordinator.newsSectioner)
142             mOrderedSections.add(bundleCoordinator.socialSectioner)
143             mOrderedSections.add(bundleCoordinator.recsSectioner)
144             mOrderedSections.add(bundleCoordinator.promoSectioner)
145         }
146         mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent
147         mOrderedSections.add(rankingCoordinator.minimizedSectioner) // Minimized
148 
149         sectionStyleProvider.setMinimizedSections(setOf(rankingCoordinator.minimizedSectioner))
150         if (SortBySectionTimeFlag.isEnabled) {
151             sectionStyleProvider.setSilentSections(
152                 listOf(rankingCoordinator.silentSectioner, rankingCoordinator.minimizedSectioner)
153             )
154         } else {
155             sectionStyleProvider.setSilentSections(
156                 listOf(
157                     conversationCoordinator.peopleSilentSectioner,
158                     rankingCoordinator.silentSectioner,
159                     rankingCoordinator.minimizedSectioner,
160                 )
161             )
162         }
163     }
164 
165     /**
166      * Sends the pipeline to each coordinator when the pipeline is ready to accept [Pluggable]s,
167      * [NotifCollectionListener]s and [NotifLifetimeExtender]s.
168      */
attachnull169     override fun attach(pipeline: NotifPipeline) {
170         for (c in mCoreCoordinators) {
171             c.attach(pipeline)
172         }
173         for (c in mCoordinators) {
174             c.attach(pipeline)
175         }
176         pipeline.setSections(mOrderedSections)
177     }
178 
179     /*
180      * As part of the NotifPipeline dumpable, dumps the list of coordinators; sections are omitted
181      * as they are dumped in the RenderStageManager instead.
182      */
dumpPipelinenull183     override fun dumpPipeline(d: PipelineDumper) =
184         with(d) {
185             dump("core coordinators", mCoreCoordinators)
186             dump("normal coordinators", mCoordinators)
187         }
188 
189     companion object {
190         private const val TAG = "NotifCoordinators"
191     }
192 }
193