Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 131d4171 authored by lyn's avatar lyn
Browse files

Implement NotifBundler pluggable

BundleCoordinator hosts new pluggable NotifBundler
and sets it on ShadeListBuilder:

BundleCoordinator.attach
NotifPipeline.setNotifBundler
ShadeListBuilder.setBundler

ShadeListBuilder.setBundler creates top level list of BundleEntry

Bug: 396301289
Test: BundleCoordinatorTest
Flag: com.android.systemui.notification_bundle_ui
Change-Id: I3001c01f19679d567c53f65e26e43fca31cb3c29
parent 34458ea9
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import kotlin.test.assertEquals

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -87,6 +88,18 @@ class BundleCoordinatorTest : SysuiTestCase() {
        isFalse()
    }

    @Test
    fun testBundler_getBundleIdOrNull_returnBundleId() {
        val classifiedEntry = makeEntryOfChannelType(PROMOTIONS_ID)
        assertEquals(coordinator.bundler.getBundleIdOrNull(classifiedEntry), PROMOTIONS_ID)
    }

    @Test
    fun testBundler_getBundleIdOrNull_returnNull() {
        val unclassifiedEntry = makeEntryOfChannelType("not system channel")
        assertEquals(coordinator.bundler.getBundleIdOrNull(unclassifiedEntry), null)
    }

    private fun makeEntryOfChannelType(
        type: String,
        buildBlock: NotificationEntryBuilder.() -> Unit = {}
+5 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.OnBefo
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeSortListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeTransformGroupsListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifBundler
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter
@@ -168,6 +169,10 @@ class NotifPipeline @Inject constructor(
        mShadeListBuilder.setSectioners(sections)
    }

    fun setNotifBundler(bundler: NotifBundler) {
        mShadeListBuilder.setBundler(bundler)
    }

    /**
     * StabilityManager that is used to determine whether to suppress group and section changes.
     * This should only be set once.
+31 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.NotificationInteractionTracker;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.collection.coordinator.BundleCoordinator;
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection;
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeFinalizeFilterListener;
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener;
@@ -58,8 +59,10 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.SemiSt
import com.android.systemui.statusbar.notification.collection.listbuilder.SemiStableSort.StableOrder;
import com.android.systemui.statusbar.notification.collection.listbuilder.ShadeListBuilderHelper;
import com.android.systemui.statusbar.notification.collection.listbuilder.ShadeListBuilderLogger;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.DefaultNotifBundler;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.DefaultNotifStabilityManager;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifBundler;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter;
@@ -78,6 +81,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -122,7 +126,8 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
    private final List<NotifComparator> mNotifComparators = new ArrayList<>();
    private final List<NotifSection> mNotifSections = new ArrayList<>();
    private NotifStabilityManager mNotifStabilityManager;

    private NotifBundler mNotifBundler;
    private Map<String, BundleEntry> mIdToBundleEntry = new HashMap<>();
    private final NamedListenerSet<OnBeforeTransformGroupsListener>
            mOnBeforeTransformGroupsListeners = new NamedListenerSet<>();
    private final NamedListenerSet<OnBeforeSortListener>
@@ -273,6 +278,23 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
        }
    }

    void setBundler(NotifBundler bundler) {
        Assert.isMainThread();
        mPipelineState.requireState(STATE_IDLE);

        // TODO(b/396301289) throw exception when setting more than once?
        mNotifBundler = bundler;

        if (mIdToBundleEntry.isEmpty()) {
            if (mNotifBundler == null) {
                throw new IllegalStateException("NotifBundler not attached.");
            }
            for (String id: mNotifBundler.getBundleIds()) {
                mIdToBundleEntry.put(id, new BundleEntry(id));
            }
        }
    }

    void setNotifStabilityManager(@NonNull NotifStabilityManager notifStabilityManager) {
        Assert.isMainThread();
        mPipelineState.requireState(STATE_IDLE);
@@ -297,6 +319,14 @@ public class ShadeListBuilder implements Dumpable, PipelineDumpable {
        return mNotifStabilityManager;
    }

    @NonNull
    private NotifBundler getNotifBundler() {
        if (mNotifBundler == null) {
            return DefaultNotifBundler.INSTANCE;
        }
        return mNotifBundler;
    }

    void setComparators(List<NotifComparator> comparators) {
        Assert.isMainThread();
        mPipelineState.requireState(STATE_IDLE);
+19 −1
Original line number Diff line number Diff line
@@ -20,15 +20,19 @@ import android.app.NotificationChannel.NEWS_ID
import android.app.NotificationChannel.PROMOTIONS_ID
import android.app.NotificationChannel.RECS_ID
import android.app.NotificationChannel.SOCIAL_MEDIA_ID
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import android.app.NotificationChannel.SYSTEM_RESERVED_IDS
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifBundler
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import com.android.systemui.statusbar.notification.collection.render.NodeController
import com.android.systemui.statusbar.notification.dagger.NewsHeader
import com.android.systemui.statusbar.notification.dagger.PromoHeader
import com.android.systemui.statusbar.notification.dagger.RecsHeader
import com.android.systemui.statusbar.notification.dagger.SocialHeader
import com.android.systemui.statusbar.notification.shared.NotificationBundleUi
import com.android.systemui.statusbar.notification.stack.BUCKET_NEWS
import com.android.systemui.statusbar.notification.stack.BUCKET_PROMO
import com.android.systemui.statusbar.notification.stack.BUCKET_RECS
@@ -90,6 +94,20 @@ class BundleCoordinator @Inject constructor(
            }
        }

    val bundler =
        object : NotifBundler("NotifBundler") {

            // Use list instead of set to keep fixed order
            override val bundleIds: List<String> = SYSTEM_RESERVED_IDS

            override fun getBundleIdOrNull(entry: NotificationEntry?): String? {
                return entry?.representativeEntry?.channel?.id?.takeIf { it in this.bundleIds }
            }
        }

    override fun attach(pipeline: NotifPipeline) {
        if (NotificationBundleUi.isEnabled) {
            pipeline.setNotifBundler(bundler)
        }
    }
}
+5 −3
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.statusbar.notification.collection.coordinator.dagger
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
import com.android.systemui.statusbar.notification.promoted.AutomaticPromotionCoordinator
import com.android.systemui.statusbar.notification.shared.NotificationBundleUi
import com.android.systemui.statusbar.notification.shared.NotificationMinimalism
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
import com.android.systemui.statusbar.notification.shared.PriorityPeopleSection
@@ -113,11 +114,12 @@ constructor(
        mCoordinators.add(remoteInputCoordinator)
        mCoordinators.add(dismissibilityCoordinator)
        mCoordinators.add(automaticPromotionCoordinator)

        if (NotificationBundleUi.isEnabled) {
            mCoordinators.add(bundleCoordinator)
        }
        if (NotificationsLiveDataStoreRefactor.isEnabled) {
            mCoordinators.add(statsLoggerCoordinator)
        }

        // Manually add Ordered Sections
        if (NotificationMinimalism.isEnabled) {
            mOrderedSections.add(lockScreenMinimalismCoordinator.topOngoingSectioner) // Top Ongoing
@@ -135,7 +137,7 @@ constructor(
            mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
        }
        mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
        if (NotificationClassificationFlag.isEnabled) {
        if (NotificationClassificationFlag.isEnabled && !NotificationBundleUi.isEnabled) {
            mOrderedSections.add(bundleCoordinator.newsSectioner)
            mOrderedSections.add(bundleCoordinator.socialSectioner)
            mOrderedSections.add(bundleCoordinator.recsSectioner)
Loading