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