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