• 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.NotifPipelineFlags
19 import com.android.systemui.statusbar.notification.collection.NotifPipeline
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.coordinator.dagger.CoordinatorScope
23 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
24 import javax.inject.Inject
25 
26 /**
27  * Handles the attachment of [Coordinator]s to the [NotifPipeline] so that the
28  * Coordinators can register their respective callbacks.
29  */
30 interface NotifCoordinators : Coordinator, PipelineDumpable
31 
32 @CoordinatorScope
33 class NotifCoordinatorsImpl @Inject constructor(
34     notifPipelineFlags: NotifPipelineFlags,
35     dataStoreCoordinator: DataStoreCoordinator,
36     hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator,
37     hideNotifsForOtherUsersCoordinator: HideNotifsForOtherUsersCoordinator,
38     keyguardCoordinator: KeyguardCoordinator,
39     rankingCoordinator: RankingCoordinator,
40     appOpsCoordinator: AppOpsCoordinator,
41     deviceProvisionedCoordinator: DeviceProvisionedCoordinator,
42     bubbleCoordinator: BubbleCoordinator,
43     headsUpCoordinator: HeadsUpCoordinator,
44     gutsCoordinator: GutsCoordinator,
45     conversationCoordinator: ConversationCoordinator,
46     debugModeCoordinator: DebugModeCoordinator,
47     groupCountCoordinator: GroupCountCoordinator,
48     mediaCoordinator: MediaCoordinator,
49     preparationCoordinator: PreparationCoordinator,
50     remoteInputCoordinator: RemoteInputCoordinator,
51     rowAppearanceCoordinator: RowAppearanceCoordinator,
52     stackCoordinator: StackCoordinator,
53     shadeEventCoordinator: ShadeEventCoordinator,
54     smartspaceDedupingCoordinator: SmartspaceDedupingCoordinator,
55     viewConfigCoordinator: ViewConfigCoordinator,
56     visualStabilityCoordinator: VisualStabilityCoordinator,
57     sensitiveContentCoordinator: SensitiveContentCoordinator,
58 ) : NotifCoordinators {
59 
60     private val mCoordinators: MutableList<Coordinator> = ArrayList()
61     private val mOrderedSections: MutableList<NotifSectioner> = ArrayList()
62 
63     /**
64      * Creates all the coordinators.
65      */
66     init {
67         // TODO(b/208866714): formalize the system by which some coordinators may be required by the
68         //  pipeline, such as this DataStoreCoordinator which cannot be removed, as it's a critical
69         //  glue between the pipeline and parts of SystemUI which depend on pipeline output via the
70         //  NotifLiveDataStore.
71         mCoordinators.add(dataStoreCoordinator)
72 
73         // Attach normal coordinators.
74         mCoordinators.add(hideLocallyDismissedNotifsCoordinator)
75         mCoordinators.add(hideNotifsForOtherUsersCoordinator)
76         mCoordinators.add(keyguardCoordinator)
77         mCoordinators.add(rankingCoordinator)
78         mCoordinators.add(appOpsCoordinator)
79         mCoordinators.add(deviceProvisionedCoordinator)
80         mCoordinators.add(bubbleCoordinator)
81         mCoordinators.add(debugModeCoordinator)
82         mCoordinators.add(conversationCoordinator)
83         mCoordinators.add(groupCountCoordinator)
84         mCoordinators.add(mediaCoordinator)
85         mCoordinators.add(rowAppearanceCoordinator)
86         mCoordinators.add(stackCoordinator)
87         mCoordinators.add(shadeEventCoordinator)
88         mCoordinators.add(viewConfigCoordinator)
89         mCoordinators.add(visualStabilityCoordinator)
90         mCoordinators.add(sensitiveContentCoordinator)
91         mCoordinators.add(smartspaceDedupingCoordinator)
92         mCoordinators.add(headsUpCoordinator)
93         mCoordinators.add(gutsCoordinator)
94         mCoordinators.add(preparationCoordinator)
95         mCoordinators.add(remoteInputCoordinator)
96 
97         // Manually add Ordered Sections
98         // HeadsUp > FGS > People > Alerting > Silent > Minimized > Unknown/Default
99         mOrderedSections.add(headsUpCoordinator.sectioner)
100         mOrderedSections.add(appOpsCoordinator.sectioner) // ForegroundService
101         mOrderedSections.add(conversationCoordinator.sectioner) // People
102         mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
103         mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent
104         mOrderedSections.add(rankingCoordinator.minimizedSectioner) // Minimized
105     }
106 
107     /**
108      * Sends the pipeline to each coordinator when the pipeline is ready to accept
109      * [Pluggable]s, [NotifCollectionListener]s and [NotifLifetimeExtender]s.
110      */
attachnull111     override fun attach(pipeline: NotifPipeline) {
112         for (c in mCoordinators) {
113             c.attach(pipeline)
114         }
115         pipeline.setSections(mOrderedSections)
116     }
117 
118     /*
119      * As part of the NotifPipeline dumpable, dumps the list of coordinators; sections are omitted
120      * as they are dumped in the RenderStageManager instead.
121      */
<lambda>null122     override fun dumpPipeline(d: PipelineDumper) = with(d) {
123         dump("coordinators", mCoordinators)
124     }
125 
126     companion object {
127         private const val TAG = "NotifCoordinators"
128     }
129 }
130