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