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

Commit 274e0545 authored by Andreas Miko's avatar Andreas Miko
Browse files

Fix expansion and heights for bundled notifications (and groups)

With this change expanding and collapsing groups and notifications
within bundles is possible and looks correct. The initial collapsed
state of bundled groups is a bit off and will be fixed in subsequent CL.

Bug: b/389839492
Test: added tests and manual verificion with notifications and groups
in the debug bundle. Tested all variations of expand and collapse.
Flag: com.android.systemui.notification_bundle_ui

Change-Id: I3ae911ce176fabae0135bd19674a455cc62fc94b
parent 0529b176
Loading
Loading
Loading
Loading
+50 −11
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ class GroupExpansionManagerTest : SysuiTestCase() {

    private val factory: EntryAdapterFactoryImpl = kosmos.entryAdapterFactory
    private lateinit var summary1: NotificationEntry
    private lateinit var summaryOfSummary1: NotificationEntry
    private lateinit var summary2: NotificationEntry
    private lateinit var entries: List<ListEntry>

@@ -80,13 +81,22 @@ class GroupExpansionManagerTest : SysuiTestCase() {

    @Before
    fun setUp() {
        summary1 = kosmos.buildNotificationEntry() {
        summary1 =
            kosmos.buildNotificationEntry() {
                modifyNotification(kosmos.applicationContext)
                .setGroup("groupId")
                    .setGroup("groupId1")
                    .setGroupSummary(true)
            }
        summary1.row = kosmos.createRowWithEntry(summary1)
        summary2 = kosmos.buildNotificationEntry() {
        summaryOfSummary1 =
            kosmos.buildNotificationEntry() {
                modifyNotification(kosmos.applicationContext)
                    .setGroup("groupId1.1")
                    .setGroupSummary(true)
            }
        summaryOfSummary1.row = kosmos.createRowWithEntry(summaryOfSummary1)
        summary2 =
            kosmos.buildNotificationEntry() {
                modifyNotification(kosmos.applicationContext)
                    .setGroup("groupId2")
                    .setGroupSummary(true)
@@ -101,6 +111,7 @@ class GroupExpansionManagerTest : SysuiTestCase() {
                            notificationEntry("foo", 2, summary1.row),
                            notificationEntry("foo", 3, summary1.row),
                            notificationEntry("foo", 4, summary1.row),
                            summaryOfSummary1,
                        )
                    )
                    .build(),
@@ -118,6 +129,8 @@ class GroupExpansionManagerTest : SysuiTestCase() {
            )

        whenever(groupMembershipManager.getGroupSummary(summary1)).thenReturn(summary1)
        whenever(groupMembershipManager.getGroupSummary(summaryOfSummary1))
            .thenReturn(summaryOfSummary1)
        whenever(groupMembershipManager.getGroupSummary(summary2)).thenReturn(summary2)

        underTest = GroupExpansionManagerImpl(dumpManager, groupMembershipManager)
@@ -243,11 +256,19 @@ class GroupExpansionManagerTest : SysuiTestCase() {

    @Test
    @EnableFlags(NotificationBundleUi.FLAG_NAME)
    fun isGroupExpanded() {
    fun isGroupExpanded_groupIsExpanded() {
        val entryAdapter = summary1.row.entryAdapter
        underTest.setGroupExpanded(entryAdapter, true)

        assertThat(underTest.isGroupExpanded(entryAdapter)).isTrue()
    }

    @Test
    @EnableFlags(NotificationBundleUi.FLAG_NAME)
    fun isGroupExpanded_parentIsExpanded() {
        val entryAdapter = summary1.row.entryAdapter
        underTest.setGroupExpanded(entryAdapter, true)

        assertThat(
                underTest.isGroupExpanded(
                    (entries[0] as? GroupEntry)?.getChildren()?.get(0)?.row?.entryAdapter
@@ -255,4 +276,22 @@ class GroupExpansionManagerTest : SysuiTestCase() {
            )
            .isTrue()
    }

    @Test
    @EnableFlags(NotificationBundleUi.FLAG_NAME)
    fun isGroupExpanded_parentIsExpanded_selfIsExpanded() {
        underTest.setGroupExpanded(summary1.row.entryAdapter, true)
        underTest.setGroupExpanded(summaryOfSummary1.row.entryAdapter, true)

        assertThat(underTest.isGroupExpanded(summaryOfSummary1.row.entryAdapter)).isTrue()
    }

    @Test
    @EnableFlags(NotificationBundleUi.FLAG_NAME)
    fun isGroupExpanded_parentIsExpanded_returnsFalseWhenItselfIsAGroup() {
        val entryAdapter = summary1.row.entryAdapter
        underTest.setGroupExpanded(entryAdapter, true)

        assertThat(underTest.isGroupExpanded(summaryOfSummary1.row.entryAdapter)).isFalse()
    }
}
+25 −2
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@

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

import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL;

import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;

import android.app.Notification;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.NotificationHeaderView;
import android.view.View;
@@ -119,6 +118,30 @@ public class NotificationChildrenContainerTest extends SysuiTestCase {
                NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
    }

    @Test
    public void testGetMaxAllowedVisibleChildren_bundle_likeCollapsed() {
        mChildrenContainer.initBundleHeader(mock(BundleHeaderViewModel.class));
        Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(true),
                NotificationChildrenContainer.NUMBER_OF_CHILDREN_BUNDLE_COLLAPSED);
    }


    @Test
    public void testGetMaxAllowedVisibleChildren_bundle_expandedChildren() {
        mChildrenContainer.initBundleHeader(mock(BundleHeaderViewModel.class));
        mChildrenContainer.setChildrenExpanded(true);
        Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
                NotificationChildrenContainer.NUMBER_OF_CHILDREN_BUNDLE_EXPANDED);
    }

    @Test
    public void testGetMaxAllowedVisibleChildren_bundle_userLocked() {
        mChildrenContainer.initBundleHeader(mock(BundleHeaderViewModel.class));
        mGroup.setUserLocked(true);
        Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
                NotificationChildrenContainer.NUMBER_OF_CHILDREN_BUNDLE_EXPANDED);
    }

    @Test
    public void testShowingAsLowPriority_lowPriority() {
        mChildrenContainer.setIsMinimized(true);
+4 −0
Original line number Diff line number Diff line
@@ -253,6 +253,10 @@ class BundleEntryAdapter(
    override fun isBundled(): Boolean {
        return false
    }

    override fun isBundle(): Boolean {
        return true
    }
}

private const val TAG = "BundleEntryAdapter"
+4 −1
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ data class BundleSpec(val key: String, @StringRes val titleTextResId: Int) {
                titleTextResId = R.string.recs_notification_channel_label,
            )
        val DEBUG =
            BundleSpec(key = "notify", titleTextResId = R.string.notification_channel_developer)
            BundleSpec(
                key = "debug_bundle",
                titleTextResId = R.string.notification_channel_developer,
            )
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -230,8 +230,13 @@ public interface EntryAdapter {
            @NonNull NotifBindPipeline.BindCallback callback);

    /**
     * Returns whether this entry is *within* a bundle. The bundle header will always return false.
     * Returns whether this entry *is within* a bundle. The bundle header will always return false.
     */
    boolean isBundled();

    /**
     * Returns whether this entry *is* a bundle.
     */
    boolean isBundle();
}
Loading