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

Commit 94edc7b6 authored by Ned Burns's avatar Ned Burns
Browse files

Introduce GroupEntryBuilder

Companion of NotificationEntryBuilder, allows us to construct instances
of GroupEntry in tests. Also allows us to un-public the constructor of
GroupEntry and some of its setters.

Test: atest
Change-Id: I6696029f2c9d2de1210987927f39834fe6a3b968
parent e87ebbe2
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.collection;
import android.annotation.NonNull;
import android.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.statusbar.notification.collection.coordinator.PreparationCoordinator;

import java.util.ArrayList;
@@ -39,7 +38,7 @@ public class GroupEntry extends ListEntry {
            Collections.unmodifiableList(mChildren);
    private int mUntruncatedChildCount;

    public GroupEntry(String key, long creationTime) {
    GroupEntry(String key, long creationTime) {
        super(key, creationTime);
    }

@@ -58,8 +57,7 @@ public class GroupEntry extends ListEntry {
        return mUnmodifiableChildren;
    }

    @VisibleForTesting
    public void setSummary(@Nullable NotificationEntry summary) {
    void setSummary(@Nullable NotificationEntry summary) {
        mSummary = summary;
    }

+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ package com.android.systemui.statusbar.notification.collection
 */
inline fun modifyEntry(
    entry: NotificationEntry,
    modifier: NotificationEntryBuilder.() -> Unit
    crossinline modifier: NotificationEntryBuilder.() -> Unit
) {
    val builder = NotificationEntryBuilder(entry)
    modifier(builder)
+82 −0
Original line number Diff line number Diff line
@@ -16,27 +16,67 @@

package com.android.systemui.statusbar.notification.collection;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

/**
 * Helper class to provide methods for test classes that need {@link GroupEntry}'s for their tests.
 */
public class GroupEntryHelper {
    /**
     * Create a group entry for testing purposes.
     * @param groupKey group key for the group and all its entries
     * @param summary summary notification for group
     * @param children group's children notifications
 * Builder to construct instances of {@link GroupEntry} for tests.
 */
    public static final GroupEntry createGroup(
            String groupKey,
            NotificationEntry summary,
            List<NotificationEntry> children) {
        GroupEntry groupEntry = new GroupEntry(groupKey);
        groupEntry.setSummary(summary);
        for (NotificationEntry child : children) {
            groupEntry.addChild(child);
public class GroupEntryBuilder {
    private String mKey = "test_group_key";
    private long mCreationTime = 0;
    @Nullable private GroupEntry mParent = GroupEntry.ROOT_ENTRY;
    private NotificationEntry mSummary = null;
    private List<NotificationEntry> mChildren = new ArrayList<>();

    /** Builds a new instance of GroupEntry */
    public GroupEntry build() {
        GroupEntry ge = new GroupEntry(mKey, mCreationTime);
        ge.setParent(mParent);

        ge.setSummary(mSummary);
        mSummary.setParent(ge);

        for (NotificationEntry child : mChildren) {
            ge.addChild(child);
            child.setParent(ge);
        }
        return ge;
    }
        return groupEntry;

    public GroupEntryBuilder setKey(String key) {
        mKey = key;
        return this;
    }

    public GroupEntryBuilder setCreationTime(long creationTime) {
        mCreationTime = creationTime;
        return this;
    }

    public GroupEntryBuilder setParent(@Nullable GroupEntry entry) {
        mParent = entry;
        return this;
    }

    public GroupEntryBuilder setSummary(
            NotificationEntry summary) {
        mSummary = summary;
        return this;
    }

    public GroupEntryBuilder setChildren(List<NotificationEntry> children) {
        mChildren.clear();
        mChildren.addAll(children);
        return this;
    }

    /** Adds a child to the existing list of children */
    public GroupEntryBuilder addChild(NotificationEntry entry) {
        mChildren.add(entry);
        return this;
    }

}
+12 −19
Original line number Diff line number Diff line
@@ -191,9 +191,10 @@ public class HighPriorityProviderTest extends SysuiTestCase {
    @Test
    public void testIsHighPriority_summaryUpdated() {
        // GIVEN a GroupEntry with a lowPrioritySummary and no children
        final GroupEntry parentEntry = new GroupEntry("test_group_key");
        final NotificationEntry lowPrioritySummary = createNotifEntry(false);
        setSummary(parentEntry, lowPrioritySummary);
        final GroupEntry parentEntry = new GroupEntryBuilder()
                .setSummary(lowPrioritySummary)
                .build();
        assertFalse(mHighPriorityProvider.isHighPriority(parentEntry));

        // WHEN the summary changes to high priority
@@ -214,10 +215,11 @@ public class HighPriorityProviderTest extends SysuiTestCase {
        // GroupEntry = parentEntry, summary = lowPrioritySummary
        //      NotificationEntry = lowPriorityChild
        //      NotificationEntry = highPriorityChild
        final GroupEntry parentEntry = new GroupEntry("test_group_key");
        setSummary(parentEntry, createNotifEntry(false));
        addChild(parentEntry, createNotifEntry(false));
        addChild(parentEntry, createNotifEntry(true));
        final GroupEntry parentEntry = new GroupEntryBuilder()
                .setSummary(createNotifEntry(false))
                .addChild(createNotifEntry(false))
                .addChild(createNotifEntry(true))
                .build();

        // THEN the GroupEntry parentEntry is high priority since it has a high priority child
        assertTrue(mHighPriorityProvider.isHighPriority(parentEntry));
@@ -228,10 +230,11 @@ public class HighPriorityProviderTest extends SysuiTestCase {
        // GIVEN:
        // GroupEntry = parentEntry, summary = lowPrioritySummary
        //      NotificationEntry = lowPriorityChild
        final GroupEntry parentEntry = new GroupEntry("test_group_key");
        final NotificationEntry lowPriorityChild = createNotifEntry(false);
        setSummary(parentEntry, createNotifEntry(false));
        addChild(parentEntry, lowPriorityChild);
        final GroupEntry parentEntry = new GroupEntryBuilder()
                .setSummary(createNotifEntry(false))
                .addChild(lowPriorityChild)
                .build();

        // WHEN the child entry ranking changes to high priority
        lowPriorityChild.setRanking(
@@ -250,14 +253,4 @@ public class HighPriorityProviderTest extends SysuiTestCase {
                .setImportance(highPriority ? IMPORTANCE_HIGH : IMPORTANCE_MIN)
                .build();
    }

    private void setSummary(GroupEntry parent, NotificationEntry summary) {
        parent.setSummary(summary);
        summary.setParent(parent);
    }

    private void addChild(GroupEntry parent, NotificationEntry child) {
        parent.addChild(child);
        child.setParent(parent);
    }
}
+16 −12
Original line number Diff line number Diff line
@@ -21,9 +21,10 @@ import static android.app.Notification.VISIBILITY_SECRET;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_MIN;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static com.android.systemui.statusbar.notification.collection.EntryUtilKt.modifyEntry;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -41,6 +42,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.RankingBuilder;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
@@ -71,13 +73,12 @@ public class KeyguardCoordinatorTest extends SysuiTestCase {
    @Mock private NotifPipeline mNotifPipeline;

    private NotificationEntry mEntry;
    private KeyguardCoordinator mKeyguardCoordinator;
    private NotifFilter mKeyguardFilter;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mKeyguardCoordinator = new KeyguardCoordinator(
        KeyguardCoordinator keyguardCoordinator = new KeyguardCoordinator(
                mContext, mMainHandler, mKeyguardStateController, mLockscreenUserManager,
                mBroadcastDispatcher, mStatusBarStateController,
                mKeyguardUpdateMonitor, mHighPriorityProvider);
@@ -87,7 +88,7 @@ public class KeyguardCoordinatorTest extends SysuiTestCase {
                .build();

        ArgumentCaptor<NotifFilter> filterCaptor = ArgumentCaptor.forClass(NotifFilter.class);
        mKeyguardCoordinator.attach(mNotifPipeline);
        keyguardCoordinator.attach(mNotifPipeline);
        verify(mNotifPipeline, times(1)).addFinalizeFilter(filterCaptor.capture());
        mKeyguardFilter = filterCaptor.getValue();
    }
@@ -186,12 +187,18 @@ public class KeyguardCoordinatorTest extends SysuiTestCase {
    public void summaryExceedsThresholdToShow() {
        // GIVEN the notification doesn't exceed the threshold to show on the lockscreen
        // but it's part of a group (has a parent)
        final GroupEntry parent = new GroupEntry("test_group_key");
        final NotificationEntry entryWithParent = new NotificationEntryBuilder()
                .setParent(parent)
                .setUser(new UserHandle(NOTIF_USER_ID))
                .build();

        final GroupEntry parent = new GroupEntryBuilder()
                .setKey("test_group_key")
                .setSummary(new NotificationEntryBuilder()
                        .setImportance(IMPORTANCE_HIGH)
                        .build())
                .addChild(entryWithParent)
                .build();

        setupUnfilteredState(entryWithParent);
        entryWithParent.setRanking(new RankingBuilder()
                .setKey(entryWithParent.getKey())
@@ -200,18 +207,15 @@ public class KeyguardCoordinatorTest extends SysuiTestCase {

        // WHEN its parent does exceed threshold tot show on the lockscreen
        when(mHighPriorityProvider.isHighPriority(parent)).thenReturn(true);
        parent.setSummary(new NotificationEntryBuilder()
                .setImportance(IMPORTANCE_HIGH)
                .build());

        // THEN don't filter out the entry
        assertFalse(mKeyguardFilter.shouldFilterOut(entryWithParent, 0));

        // WHEN its parent doesn't exceed threshold to show on lockscreen
        when(mHighPriorityProvider.isHighPriority(parent)).thenReturn(false);
        parent.setSummary(new NotificationEntryBuilder()
        modifyEntry(parent.getSummary(), builder -> builder
                .setImportance(IMPORTANCE_MIN)
                .build());
                .done());

        // THEN filter out the entry
        assertTrue(mKeyguardFilter.shouldFilterOut(entryWithParent, 0));
Loading