Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java +1 −1 Original line number Diff line number Diff line Loading @@ -842,7 +842,7 @@ public class ShadeListBuilder implements Dumpable { } private static final NotifSection sDefaultSection = new NotifSection("DefaultSection") { new NotifSection("UnknownSection") { @Override public boolean isInSection(ListEntry entry) { return true; Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java +27 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import static android.app.NotificationManager.IMPORTANCE_MIN; import android.app.Notification; import android.os.UserHandle; import android.service.notification.StatusBarNotification; Loading @@ -24,9 +26,11 @@ import android.util.ArraySet; import com.android.systemui.ForegroundServiceController; import com.android.systemui.appops.AppOpsController; 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.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender; import com.android.systemui.util.Assert; Loading @@ -43,6 +47,8 @@ import javax.inject.Singleton; * Tags notifications with appOps * Lifetime extends notifications associated with an ongoing ForegroundService. * Filters out notifications that represent foreground services that are no longer running * Puts foreground service notifications into the FGS section. See {@link NotifCoordinators} for * section ordering priority. * * Previously this logic lived in * frameworks/base/packages/SystemUI/src/com/android/systemui/ForegroundServiceController Loading Loading @@ -86,6 +92,10 @@ public class AppOpsCoordinator implements Coordinator { mAppOpsController.addCallback(ForegroundServiceController.APP_OPS, this::onAppOpsChanged); } public NotifSection getSection() { return mNotifSection; } /** * Filters out notifications that represent foreground services that are no longer running or * that already have an app notification with the appOps tagged to Loading Loading @@ -204,6 +214,23 @@ public class AppOpsCoordinator implements Coordinator { } }; /** * Puts foreground service notifications into its own section. */ private final NotifSection mNotifSection = new NotifSection("ForegroundService") { @Override public boolean isInSection(ListEntry entry) { NotificationEntry notificationEntry = entry.getRepresentativeEntry(); if (notificationEntry != null) { Notification notification = notificationEntry.getSbn().getNotification(); return notification.isForegroundService() && notification.isColorized() && entry.getRepresentativeEntry().getImportance() > IMPORTANCE_MIN; } return false; } }; private void onAppOpsChanged(int code, int uid, String packageName, boolean active) { mMainExecutor.execute(() -> handleAppOpsChanged(code, uid, packageName, active)); } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt +24 −2 Original line number Diff line number Diff line Loading @@ -16,17 +16,25 @@ package com.android.systemui.statusbar.notification.collection.coordinator 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.listbuilder.pluggable.NotifPromoter import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON import javax.inject.Inject import javax.inject.Singleton /** * A coordinator that elevates important conversation notifications * A Conversation/People Coordinator that: * - Elevates important conversation notifications * - Puts conversations into its own people section. @see [NotifCoordinators] for section ordering. */ @Singleton class ConversationCoordinator @Inject constructor() : Coordinator { class ConversationCoordinator @Inject constructor( private val peopleNotificationIdentifier: PeopleNotificationIdentifier ) : Coordinator { private val notificationPromoter = object : NotifPromoter(TAG) { override fun shouldPromoteToTopLevel(entry: NotificationEntry): Boolean { Loading @@ -34,10 +42,24 @@ class ConversationCoordinator @Inject constructor() : Coordinator { } } private val mNotifSection: NotifSection = object : NotifSection("People") { override fun isInSection(entry: ListEntry): Boolean { return isConversation(entry.representativeEntry!!) } } override fun attach(pipeline: NotifPipeline) { pipeline.addPromoter(notificationPromoter) } fun getSection(): NotifSection { return mNotifSection } private fun isConversation(entry: NotificationEntry): Boolean = peopleNotificationIdentifier.getPeopleNotificationType(entry.sbn, entry.ranking) != TYPE_NON_PERSON companion object { private const val TAG = "ConversationCoordinator" } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/Coordinator.java +0 −5 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable; /** Loading @@ -29,8 +28,4 @@ public interface Coordinator { * Coordinators should register their listeners and {@link Pluggable}s to the pipeline. */ void attach(NotifPipeline pipeline); default NotifSection getSection() { return null; } } packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java +1 −2 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ public class HeadsUpCoordinator implements Coordinator { pipeline.addNotificationLifetimeExtender(mLifetimeExtender); } @Override public NotifSection getSection() { return mNotifSection; } Loading Loading @@ -192,7 +191,7 @@ public class HeadsUpCoordinator implements Coordinator { } }; private final NotifSection mNotifSection = new NotifSection(TAG) { private final NotifSection mNotifSection = new NotifSection("HeadsUp") { @Override public boolean isInSection(ListEntry entry) { return isCurrentlyShowingHun(entry); Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java +1 −1 Original line number Diff line number Diff line Loading @@ -842,7 +842,7 @@ public class ShadeListBuilder implements Dumpable { } private static final NotifSection sDefaultSection = new NotifSection("DefaultSection") { new NotifSection("UnknownSection") { @Override public boolean isInSection(ListEntry entry) { return true; Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/AppOpsCoordinator.java +27 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import static android.app.NotificationManager.IMPORTANCE_MIN; import android.app.Notification; import android.os.UserHandle; import android.service.notification.StatusBarNotification; Loading @@ -24,9 +26,11 @@ import android.util.ArraySet; import com.android.systemui.ForegroundServiceController; import com.android.systemui.appops.AppOpsController; 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.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender; import com.android.systemui.util.Assert; Loading @@ -43,6 +47,8 @@ import javax.inject.Singleton; * Tags notifications with appOps * Lifetime extends notifications associated with an ongoing ForegroundService. * Filters out notifications that represent foreground services that are no longer running * Puts foreground service notifications into the FGS section. See {@link NotifCoordinators} for * section ordering priority. * * Previously this logic lived in * frameworks/base/packages/SystemUI/src/com/android/systemui/ForegroundServiceController Loading Loading @@ -86,6 +92,10 @@ public class AppOpsCoordinator implements Coordinator { mAppOpsController.addCallback(ForegroundServiceController.APP_OPS, this::onAppOpsChanged); } public NotifSection getSection() { return mNotifSection; } /** * Filters out notifications that represent foreground services that are no longer running or * that already have an app notification with the appOps tagged to Loading Loading @@ -204,6 +214,23 @@ public class AppOpsCoordinator implements Coordinator { } }; /** * Puts foreground service notifications into its own section. */ private final NotifSection mNotifSection = new NotifSection("ForegroundService") { @Override public boolean isInSection(ListEntry entry) { NotificationEntry notificationEntry = entry.getRepresentativeEntry(); if (notificationEntry != null) { Notification notification = notificationEntry.getSbn().getNotification(); return notification.isForegroundService() && notification.isColorized() && entry.getRepresentativeEntry().getImportance() > IMPORTANCE_MIN; } return false; } }; private void onAppOpsChanged(int code, int uid, String packageName, boolean active) { mMainExecutor.execute(() -> handleAppOpsChanged(code, uid, packageName, active)); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt +24 −2 Original line number Diff line number Diff line Loading @@ -16,17 +16,25 @@ package com.android.systemui.statusbar.notification.collection.coordinator 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.listbuilder.pluggable.NotifPromoter import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON import javax.inject.Inject import javax.inject.Singleton /** * A coordinator that elevates important conversation notifications * A Conversation/People Coordinator that: * - Elevates important conversation notifications * - Puts conversations into its own people section. @see [NotifCoordinators] for section ordering. */ @Singleton class ConversationCoordinator @Inject constructor() : Coordinator { class ConversationCoordinator @Inject constructor( private val peopleNotificationIdentifier: PeopleNotificationIdentifier ) : Coordinator { private val notificationPromoter = object : NotifPromoter(TAG) { override fun shouldPromoteToTopLevel(entry: NotificationEntry): Boolean { Loading @@ -34,10 +42,24 @@ class ConversationCoordinator @Inject constructor() : Coordinator { } } private val mNotifSection: NotifSection = object : NotifSection("People") { override fun isInSection(entry: ListEntry): Boolean { return isConversation(entry.representativeEntry!!) } } override fun attach(pipeline: NotifPipeline) { pipeline.addPromoter(notificationPromoter) } fun getSection(): NotifSection { return mNotifSection } private fun isConversation(entry: NotificationEntry): Boolean = peopleNotificationIdentifier.getPeopleNotificationType(entry.sbn, entry.ranking) != TYPE_NON_PERSON companion object { private const val TAG = "ConversationCoordinator" } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/Coordinator.java +0 −5 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSection; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable; /** Loading @@ -29,8 +28,4 @@ public interface Coordinator { * Coordinators should register their listeners and {@link Pluggable}s to the pipeline. */ void attach(NotifPipeline pipeline); default NotifSection getSection() { return null; } }
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java +1 −2 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ public class HeadsUpCoordinator implements Coordinator { pipeline.addNotificationLifetimeExtender(mLifetimeExtender); } @Override public NotifSection getSection() { return mNotifSection; } Loading Loading @@ -192,7 +191,7 @@ public class HeadsUpCoordinator implements Coordinator { } }; private final NotifSection mNotifSection = new NotifSection(TAG) { private final NotifSection mNotifSection = new NotifSection("HeadsUp") { @Override public boolean isInSection(ListEntry entry) { return isCurrentlyShowingHun(entry); Loading