diff options
| author | 2021-10-26 15:50:45 -0400 | |
|---|---|---|
| committer | 2021-10-30 21:49:06 -0400 | |
| commit | caeb5d278db81c82eff4d0bf669776d54a4f698e (patch) | |
| tree | 24c3c6a356a87919d0ea2cfd6136510bb66b0eff | |
| parent | 9a4112bfbb08d08baf73f4e99a834eeb06f7a86b (diff) | |
Enforce Coordinator encapsulation w/ Dagger
This allows for marking Coordinators with @CoordinatorScope.
Attempting to inject a Coordinator marked with this scope elsewhere in
SysUI will result in a build error.
This does *not* prevent marking Coordinators with @SysUISingleton,
which would allow for injection elsewhere.
Fixes: 204127880
Bug: 204468557
Test: mp droid
Merged-In: Ie79d632eb150790e6a9580b2c955af861bb2d182
Change-Id: Ie79d632eb150790e6a9580b2c955af861bb2d182
21 files changed, 229 insertions, 156 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java index 301b185c7373..3a39c39cfb20 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java @@ -23,11 +23,11 @@ import android.service.notification.StatusBarNotification; import com.android.systemui.ForegroundServiceController; import com.android.systemui.appops.AppOpsController; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt; @@ -48,7 +48,7 @@ import javax.inject.Inject; * frameworks/base/packages/SystemUI/src/com/android/systemui/ForegroundServiceNotificationListener * frameworks/base/packages/SystemUI/src/com/android/systemui/ForegroundServiceLifetimeExtender */ -@SysUISingleton +@CoordinatorScope public class AppOpsCoordinator implements Coordinator { private static final String TAG = "AppOpsCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java index 29a030f910a4..15f0d885c2fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java @@ -16,10 +16,10 @@ package com.android.systemui.statusbar.notification.collection.coordinator; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifDismissInterceptor; @@ -53,7 +53,7 @@ import javax.inject.Inject; * respond to app-cancellations (ie: remove the bubble if the app cancels the notification). * */ -@SysUISingleton +@CoordinatorScope public class BubbleCoordinator implements Coordinator { private static final String TAG = "BubbleCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt index c38583679b4f..e59f4a62f9b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt @@ -16,10 +16,10 @@ package com.android.systemui.statusbar.notification.collection.coordinator -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner import com.android.systemui.statusbar.notification.collection.render.NodeController @@ -34,7 +34,7 @@ import javax.inject.Inject * - Elevates important conversation notifications * - Puts conversations into its own people section. @see [NotifCoordinators] for section ordering. */ -@SysUISingleton +@CoordinatorScope class ConversationCoordinator @Inject constructor( private val peopleNotificationIdentifier: PeopleNotificationIdentifier, @PeopleHeader peopleHeaderController: NodeController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DeviceProvisionedCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DeviceProvisionedCoordinator.java index 47928b42ed5e..e8652493da6b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DeviceProvisionedCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DeviceProvisionedCoordinator.java @@ -23,9 +23,9 @@ import android.content.pm.PackageManager; import android.os.RemoteException; import android.service.notification.StatusBarNotification; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -36,7 +36,7 @@ import javax.inject.Inject; * Special notifications with extra permissions and tags won't be filtered out even when the * device is unprovisioned. */ -@SysUISingleton +@CoordinatorScope public class DeviceProvisionedCoordinator implements Coordinator { private static final String TAG = "DeviceProvisionedCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinator.kt index 8948969120ac..dbecf1cc28d7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinator.kt @@ -17,17 +17,17 @@ package com.android.systemui.statusbar.notification.collection.coordinator import android.util.ArraySet import com.android.systemui.Dumpable -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender.OnEndLifetimeExtensionCallback -import com.android.systemui.statusbar.notification.row.NotificationGuts -import com.android.systemui.statusbar.notification.row.NotificationGutsManager import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewListener import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager +import com.android.systemui.statusbar.notification.row.NotificationGuts +import com.android.systemui.statusbar.notification.row.NotificationGutsManager import java.io.FileDescriptor import java.io.PrintWriter import javax.inject.Inject @@ -38,7 +38,7 @@ private const val TAG = "GutsCoordinator" * Coordinates the guts displayed by the [NotificationGutsManager] with the pipeline. * Specifically, this just adds the lifetime extension necessary to keep guts from disappearing. */ -@SysUISingleton +@CoordinatorScope class GutsCoordinator @Inject constructor( private val notifGutsViewManager: NotifGutsViewManager, private val logger: GutsCoordinatorLogger, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java index 8c8a8a977d1c..f8b4274188f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java @@ -22,11 +22,11 @@ import static com.android.systemui.statusbar.notification.interruption.HeadsUpCo import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; @@ -57,7 +57,7 @@ import javax.inject.Inject; * * Note: The inflation callback in {@link PreparationCoordinator} handles showing HUNs. */ -@SysUISingleton +@CoordinatorScope public class HeadsUpCoordinator implements Coordinator { private static final String TAG = "HeadsUpCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideLocallyDismissedNotifsCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideLocallyDismissedNotifsCoordinator.java index 0059e7baa3c2..6684237c4ebf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideLocallyDismissedNotifsCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideLocallyDismissedNotifsCoordinator.java @@ -20,13 +20,21 @@ import static com.android.systemui.statusbar.notification.collection.Notificatio import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; +import javax.inject.Inject; + /** * Filters out notifications that have been dismissed locally (by the user) but that system server * hasn't yet confirmed the removal of. */ +@CoordinatorScope public class HideLocallyDismissedNotifsCoordinator implements Coordinator { + + @Inject + HideLocallyDismissedNotifsCoordinator() { } + @Override public void attach(NotifPipeline pipeline) { pipeline.addPreGroupFilter(mFilter); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java index e595dd4a2f71..7b5cf8511900 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java @@ -23,6 +23,7 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import javax.inject.Inject; @@ -37,6 +38,7 @@ import javax.inject.Inject; * TODO: The NotificationLockscreenUserManager currently maintains the list of active user profiles. * We should spin that off into a standalone section at some point. */ +@CoordinatorScope public class HideNotifsForOtherUsersCoordinator implements Coordinator { private final NotificationLockscreenUserManager mLockscreenUserManager; private final SharedCoordinatorLogger mLogger; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java index 23d5369833c5..fe1cd7b98cf9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java @@ -34,13 +34,13 @@ import androidx.annotation.MainThread; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.notification.collection.GroupEntry; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -50,7 +50,7 @@ import javax.inject.Inject; /** * Filters low priority and privacy-sensitive notifications from the lockscreen. */ -@SysUISingleton +@CoordinatorScope public class KeyguardCoordinator implements Coordinator { private static final String TAG = "KeyguardCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java index 026a3ffb73cd..8769969834c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/MediaCoordinator.java @@ -21,6 +21,7 @@ import static com.android.systemui.media.MediaDataManagerKt.isMediaNotification; import com.android.systemui.media.MediaFeatureFlag; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import javax.inject.Inject; @@ -28,6 +29,7 @@ import javax.inject.Inject; /** * Coordinates hiding (filtering) of media notifications. */ +@CoordinatorScope public class MediaCoordinator implements Coordinator { private static final String TAG = "MediaCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java deleted file mode 100644 index 239161696379..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.notification.collection.coordinator; - -import com.android.systemui.Dumpable; -import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.statusbar.notification.collection.NotifPipeline; -import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; -import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable; -import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; -import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -/** - * Handles the attachment of {@link Coordinator}s to the {@link NotifPipeline} so that the - * Coordinators can register their respective callbacks. - */ -@SysUISingleton -public class NotifCoordinators implements Dumpable { - private static final String TAG = "NotifCoordinators"; - private final List<Coordinator> mCoordinators = new ArrayList<>(); - private final List<NotifSectioner> mOrderedSections = new ArrayList<>(); - - /** - * Creates all the coordinators. - */ - @Inject - public NotifCoordinators( - DumpManager dumpManager, - FeatureFlags featureFlags, - HideNotifsForOtherUsersCoordinator hideNotifsForOtherUsersCoordinator, - KeyguardCoordinator keyguardCoordinator, - RankingCoordinator rankingCoordinator, - AppOpsCoordinator appOpsCoordinator, - DeviceProvisionedCoordinator deviceProvisionedCoordinator, - BubbleCoordinator bubbleCoordinator, - HeadsUpCoordinator headsUpCoordinator, - GutsCoordinator gutsCoordinator, - ConversationCoordinator conversationCoordinator, - PreparationCoordinator preparationCoordinator, - MediaCoordinator mediaCoordinator, - ShadeEventCoordinator shadeEventCoordinator, - SmartspaceDedupingCoordinator smartspaceDedupingCoordinator, - ViewConfigCoordinator viewConfigCoordinator, - VisualStabilityCoordinator visualStabilityCoordinator, - SensitiveContentCoordinator sensitiveContentCoordinator) { - dumpManager.registerDumpable(TAG, this); - - mCoordinators.add(new HideLocallyDismissedNotifsCoordinator()); - mCoordinators.add(hideNotifsForOtherUsersCoordinator); - mCoordinators.add(keyguardCoordinator); - mCoordinators.add(rankingCoordinator); - mCoordinators.add(appOpsCoordinator); - mCoordinators.add(deviceProvisionedCoordinator); - mCoordinators.add(bubbleCoordinator); - mCoordinators.add(conversationCoordinator); - mCoordinators.add(mediaCoordinator); - mCoordinators.add(shadeEventCoordinator); - mCoordinators.add(viewConfigCoordinator); - mCoordinators.add(visualStabilityCoordinator); - mCoordinators.add(sensitiveContentCoordinator); - - if (featureFlags.isSmartspaceDedupingEnabled()) { - mCoordinators.add(smartspaceDedupingCoordinator); - } - - if (featureFlags.isNewNotifPipelineRenderingEnabled()) { - mCoordinators.add(headsUpCoordinator); - mCoordinators.add(gutsCoordinator); - mCoordinators.add(preparationCoordinator); - } - - // Manually add Ordered Sections - // HeadsUp > FGS > People > Alerting > Silent > Unknown/Default - if (featureFlags.isNewNotifPipelineRenderingEnabled()) { - mOrderedSections.add(headsUpCoordinator.getSectioner()); // HeadsUp - } - mOrderedSections.add(appOpsCoordinator.getSectioner()); // ForegroundService - mOrderedSections.add(conversationCoordinator.getSectioner()); // People - mOrderedSections.add(rankingCoordinator.getAlertingSectioner()); // Alerting - mOrderedSections.add(rankingCoordinator.getSilentSectioner()); // Silent - } - - /** - * Sends the pipeline to each coordinator when the pipeline is ready to accept - * {@link Pluggable}s, {@link NotifCollectionListener}s and {@link NotifLifetimeExtender}s. - */ - public void attach(NotifPipeline pipeline) { - for (Coordinator c : mCoordinators) { - c.attach(pipeline); - } - - pipeline.setSections(mOrderedSections); - } - - @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println(); - pw.println(TAG + ":"); - for (Coordinator c : mCoordinators) { - pw.println("\t" + c.getClass()); - } - - for (NotifSectioner s : mOrderedSections) { - pw.println("\t" + s.getName()); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt new file mode 100644 index 000000000000..66290bb3aba6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.notification.collection.coordinator + +import com.android.systemui.Dumpable +import com.android.systemui.dump.DumpManager +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.statusbar.notification.collection.NotifPipeline +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner +import java.io.FileDescriptor +import java.io.PrintWriter +import java.util.ArrayList +import javax.inject.Inject + +/** + * Handles the attachment of [Coordinator]s to the [NotifPipeline] so that the + * Coordinators can register their respective callbacks. + */ +interface NotifCoordinators : Coordinator, Dumpable + +@CoordinatorScope +class NotifCoordinatorsImpl @Inject constructor( + dumpManager: DumpManager, + featureFlags: FeatureFlags, + hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator, + hideNotifsForOtherUsersCoordinator: HideNotifsForOtherUsersCoordinator, + keyguardCoordinator: KeyguardCoordinator, + rankingCoordinator: RankingCoordinator, + appOpsCoordinator: AppOpsCoordinator, + deviceProvisionedCoordinator: DeviceProvisionedCoordinator, + bubbleCoordinator: BubbleCoordinator, + headsUpCoordinator: HeadsUpCoordinator, + gutsCoordinator: GutsCoordinator, + conversationCoordinator: ConversationCoordinator, + preparationCoordinator: PreparationCoordinator, + mediaCoordinator: MediaCoordinator, + shadeEventCoordinator: ShadeEventCoordinator, + smartspaceDedupingCoordinator: SmartspaceDedupingCoordinator, + viewConfigCoordinator: ViewConfigCoordinator, + visualStabilityCoordinator: VisualStabilityCoordinator, + sensitiveContentCoordinator: SensitiveContentCoordinator +) : NotifCoordinators { + + private val mCoordinators: MutableList<Coordinator> = ArrayList() + private val mOrderedSections: MutableList<NotifSectioner> = ArrayList() + + /** + * Creates all the coordinators. + */ + init { + dumpManager.registerDumpable(TAG, this) + mCoordinators.add(hideLocallyDismissedNotifsCoordinator) + mCoordinators.add(hideNotifsForOtherUsersCoordinator) + mCoordinators.add(keyguardCoordinator) + mCoordinators.add(rankingCoordinator) + mCoordinators.add(appOpsCoordinator) + mCoordinators.add(deviceProvisionedCoordinator) + mCoordinators.add(bubbleCoordinator) + mCoordinators.add(conversationCoordinator) + mCoordinators.add(mediaCoordinator) + mCoordinators.add(shadeEventCoordinator) + mCoordinators.add(viewConfigCoordinator) + mCoordinators.add(visualStabilityCoordinator) + mCoordinators.add(sensitiveContentCoordinator) + if (featureFlags.isSmartspaceDedupingEnabled) { + mCoordinators.add(smartspaceDedupingCoordinator) + } + if (featureFlags.isNewNotifPipelineRenderingEnabled) { + mCoordinators.add(headsUpCoordinator) + mCoordinators.add(gutsCoordinator) + mCoordinators.add(preparationCoordinator) + } + + // Manually add Ordered Sections + // HeadsUp > FGS > People > Alerting > Silent > Unknown/Default + if (featureFlags.isNewNotifPipelineRenderingEnabled) { + mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp + } + mOrderedSections.add(appOpsCoordinator.sectioner) // ForegroundService + mOrderedSections.add(conversationCoordinator.sectioner) // People + mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting + mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent + } + + /** + * Sends the pipeline to each coordinator when the pipeline is ready to accept + * [Pluggable]s, [NotifCollectionListener]s and [NotifLifetimeExtender]s. + */ + override fun attach(pipeline: NotifPipeline) { + for (c in mCoordinators) { + c.attach(pipeline) + } + pipeline.setSections(mOrderedSections) + } + + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) { + pw.println() + pw.println("$TAG:") + for (c in mCoordinators) { + pw.println("\t${c.javaClass}") + } + for (s in mOrderedSections) { + pw.println("\t${s.name}") + } + } + + companion object { + private const val TAG = "NotifCoordinators" + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index 31826c7219de..afdfb3bdeef6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -57,6 +57,7 @@ import javax.inject.Inject; * If a notification was uninflated, this coordinator will filter the notification out from the * {@link ShadeListBuilder} until it is inflated. */ +// TODO(b/204468557): Move to @CoordinatorScope @SysUISingleton public class PreparationCoordinator implements Coordinator { private static final String TAG = "PreparationCoordinator"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java index 1a6a63a9ccb6..2ab2dd0b1273 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java @@ -19,11 +19,11 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import android.annotation.NonNull; import android.annotation.Nullable; -import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; @@ -44,7 +44,7 @@ import javax.inject.Inject; * - whether the notification's app is suspended or hiding its notifications * - whether DND settings are hiding notifications from ambient display or the notification list */ -@SysUISingleton +@CoordinatorScope public class RankingCoordinator implements Coordinator { public static final boolean SHOW_ALL_SECTIONS = false; private final StatusBarStateController mStatusBarStateController; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt index 2da5d205af95..4ae8e4c81dce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt @@ -17,13 +17,13 @@ package com.android.systemui.statusbar.notification.collection.coordinator import android.os.UserHandle -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.notification.DynamicPrivacyController import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator import dagger.Module @@ -32,7 +32,7 @@ import dagger.Provides @Module object SensitiveContentCoordinatorModule { @Provides - @SysUISingleton + @CoordinatorScope fun provideCoordinator( dynamicPrivacyController: DynamicPrivacyController, lockscreenUserManager: NotificationLockscreenUserManager diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinator.kt index f9648a0b94a3..2d5c331e2071 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinator.kt @@ -29,6 +29,7 @@ import javax.inject.Inject * A coordinator which provides callbacks to a view surfaces for various events relevant to the * shade, such as when the user removes a notification, or when the shade is emptied. */ +// TODO(b/204468557): Move to @CoordinatorScope @SysUISingleton class ShadeEventCoordinator @Inject internal constructor( private val mLogger: ShadeEventCoordinatorLogger diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt index 442d9d2bb205..519d75ff07d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.collection.coordinator import android.app.smartspace.SmartspaceTarget import android.os.Parcelable -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.NotificationLockscreenUserManager @@ -28,6 +27,7 @@ import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController import com.android.systemui.statusbar.notification.NotificationEntryManager import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener import com.android.systemui.util.concurrency.DelayableExecutor @@ -45,7 +45,7 @@ import javax.inject.Inject */ // This class is a singleton so that the same instance can be accessed by both the old and new // pipelines -@SysUISingleton +@CoordinatorScope class SmartspaceDedupingCoordinator @Inject constructor( private val statusBarStateController: SysuiStatusBarStateController, private val smartspaceController: LockscreenSmartspaceController, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt index df1132b20a4b..5b86de2a9d87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt @@ -19,11 +19,11 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.internal.widget.MessagingGroup import com.android.internal.widget.MessagingMessage import com.android.keyguard.KeyguardUpdateMonitor -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl import com.android.systemui.statusbar.notification.collection.NotifPipeline +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.row.NotificationGutsManager import com.android.systemui.statusbar.policy.ConfigurationController import javax.inject.Inject @@ -33,7 +33,7 @@ import javax.inject.Inject * for the current uiMode and screen properties; additionally deferring those changes when a user * change is in progress until that process has completed. */ -@SysUISingleton +@CoordinatorScope class ViewConfigCoordinator @Inject internal constructor( configurationController: ConfigurationController, lockscreenUserManager: NotificationLockscreenUserManagerImpl, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java index 5d6c0437ce9b..5ba4c2ff36ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java @@ -50,6 +50,7 @@ import javax.inject.Inject; * This is now integrated in the data-layer via * {@link com.android.systemui.statusbar.notification.collection.ShadeListBuilder}. */ +// TODO(b/204468557): Move to @CoordinatorScope @SysUISingleton public class VisualStabilityCoordinator implements Coordinator { private final DelayableExecutor mDelayableExecutor; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt new file mode 100644 index 000000000000..7575a90ad92e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection.coordinator.dagger + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.notification.collection.coordinator.NotifCoordinators +import com.android.systemui.statusbar.notification.collection.coordinator.NotifCoordinatorsImpl +import com.android.systemui.statusbar.notification.collection.coordinator.SensitiveContentCoordinatorModule +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.Subcomponent +import javax.inject.Qualifier +import javax.inject.Scope + +@Module(subcomponents = [CoordinatorsSubcomponent::class]) +object CoordinatorsModule { + @SysUISingleton + @Provides + fun notifCoordinators(factory: CoordinatorsSubcomponent.Factory): NotifCoordinators = + factory.create().notifCoordinators +} + +@CoordinatorScope +@Subcomponent(modules = [InternalCoordinatorsModule::class]) +interface CoordinatorsSubcomponent { + @get:Internal val notifCoordinators: NotifCoordinators + + @Subcomponent.Factory + interface Factory { + fun create(): CoordinatorsSubcomponent + } +} + +@Module(includes = [SensitiveContentCoordinatorModule::class]) +private abstract class InternalCoordinatorsModule { + @Binds + @Internal + abstract fun bindNotifCoordinators(impl: NotifCoordinatorsImpl): NotifCoordinators +} + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +private annotation class Internal + +@Scope +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class CoordinatorScope
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index c4afc524b5c1..1eb007e345ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -45,9 +45,9 @@ import com.android.systemui.statusbar.notification.NotificationEntryManagerLogge import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl; import com.android.systemui.statusbar.notification.collection.NotifPipeline; -import com.android.systemui.statusbar.notification.collection.coordinator.SensitiveContentCoordinatorModule; import com.android.systemui.statusbar.notification.collection.coordinator.ShadeEventCoordinator; import com.android.systemui.statusbar.notification.collection.coordinator.VisualStabilityCoordinator; +import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorsModule; import com.android.systemui.statusbar.notification.collection.inflation.NotifInflater; import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder; import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl; @@ -96,7 +96,7 @@ import dagger.Provides; */ @Module(includes = { NotificationSectionHeadersModule.class, - SensitiveContentCoordinatorModule.class + CoordinatorsModule.class }) public interface NotificationsModule { @Binds |