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

Commit 7580f33b authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Update bundle header in response to config changes

- Manually dispatch config changes to the bundle views
- Update dimensions in the correct order
- Simplify some height calculations for bundles
- Do less work - no manual recomposing and no leaking onattach lambas

Test: manual
- Dismiss a bundle
- Change the OS font size
- Post a new notification to the bundle so it reappears
and the text size will be correct
Test: manual - change between light and dark theme and view the bundle
Test: manual - change the display density and view the bundle header
Flag: com.android.systemui.notification_bundle_ui
Fixes: 429011494

Change-Id: I5f54797a3d0208202cb86f598a8f5238126cf4f7
parent f0169562
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.SmartReplyController
import com.android.systemui.statusbar.notification.BundleInteractionLogger
import com.android.systemui.statusbar.notification.ColorUpdateLogger
import com.android.systemui.statusbar.notification.NotificationActivityStarter
import com.android.systemui.statusbar.notification.collection.EntryAdapter
import com.android.systemui.statusbar.notification.collection.EntryAdapterFactory
import com.android.systemui.statusbar.notification.collection.NotificationEntry
@@ -116,6 +117,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() {
    private val entryAdapterFactory: EntryAdapterFactory = mock()
    private val bundleInteractionLogger: BundleInteractionLogger = mock()
    private lateinit var controller: ExpandableNotificationRowController
    private val notificationActivityStarter: NotificationActivityStarter = mock()

    @Before
    fun setUp() {
@@ -167,6 +169,7 @@ class ExpandableNotificationRowControllerTest : SysuiTestCase() {
            entryAdapterFactory,
            kosmos.windowRootViewBlurInteractor,
            bundleInteractionLogger,
            notificationActivityStarter,
        )
    }

+1 −1
Original line number Diff line number Diff line
@@ -671,7 +671,7 @@ class NotificationGutsManagerTest(flags: FlagsParameterization) : SysuiTestCase(
        row: ExpandableNotificationRow
    ): NotificationMenuRowPlugin.MenuItem {
        val menuRow: NotificationMenuRowPlugin =
            NotificationMenuRow(mContext, peopleNotificationIdentifier)
            NotificationMenuRow(mContext, peopleNotificationIdentifier, notificationActivityStarter)
        menuRow.createMenu(row)

        val menuItem = menuRow.getLongpressMenuItem(mContext)
+39 −35
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.Flags;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.notification.collection.EntryAdapter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
@@ -67,6 +68,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
    private ExpandableNotificationRow mRow;
    private View mView;
    private PeopleNotificationIdentifier mPeopleNotificationIdentifier;
    private NotificationActivityStarter mNotificationActivityStarter;

    @Before
    public void setup() {
@@ -74,6 +76,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
        mRow = mock(ExpandableNotificationRow.class);
        mView = mock(View.class);
        mPeopleNotificationIdentifier = mock(PeopleNotificationIdentifier.class);
        mNotificationActivityStarter = mock(NotificationActivityStarter.class);
        NotificationEntry entry = new NotificationEntryBuilder()
                .setChannel(new NotificationChannel("hi", "hi", 2))
                .build();
@@ -88,8 +91,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testAttachDetach() {
        NotificationMenuRowPlugin row =
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier);
        NotificationMenuRowPlugin row = new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter);
        row.createMenu(mRow);
        ViewUtils.attachView(row.getMenuView());
        TestableLooper.get(this).processAllMessages();
@@ -99,8 +102,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testRecreateMenu() {
        NotificationMenuRowPlugin row =
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier);
        NotificationMenuRowPlugin row = new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter);
        row.createMenu(mRow);
        assertTrue(row.getMenuView() != null);
        row.createMenu(mRow);
@@ -109,8 +112,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testResetUncreatedMenu() {
        NotificationMenuRowPlugin row =
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier);
        NotificationMenuRowPlugin row = new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter);
        row.resetMenu();
    }

@@ -119,7 +122,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
        when(mRow.getShowSnooze()).thenReturn(true);
        Settings.Global.putInt(mContext.getContentResolver(), SHOW_NEW_NOTIF_DISMISS, 1);

        NotificationMenuRow row = new NotificationMenuRow(mContext, mPeopleNotificationIdentifier);
        NotificationMenuRowPlugin row = new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter);
        row.createMenu(mRow);

        ViewGroup container = (ViewGroup) row.getMenuView();
@@ -129,8 +133,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testIsSnappedAndOnSameSide() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));

        when(row.isMenuVisible()).thenReturn(true);
        when(row.isMenuSnapped()).thenReturn(true);
@@ -162,8 +166,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testGetMenuSnapTarget() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        when(row.isMenuOnLeft()).thenReturn(true);
        doReturn(30).when(row).getSpaceForMenu();

@@ -177,8 +181,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testIsSwipedEnoughToShowMenu() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        when(row.isMenuVisible()).thenReturn(true);
        when(row.isMenuOnLeft()).thenReturn(true);
        doReturn(40f).when(row).getMinimumSwipeDistance();
@@ -204,8 +208,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testIsWithinSnapMenuThreshold() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        doReturn(30f).when(row).getSnapBackThreshold();
        doReturn(50f).when(row).getDismissThreshold();
        doReturn(70).when(row).getSpaceForMenu();
@@ -239,8 +243,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testShouldSnapBack() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        doReturn(40f).when(row).getSnapBackThreshold();
        when(row.isMenuVisible()).thenReturn(false);
        when(row.isMenuOnLeft()).thenReturn(true);
@@ -261,8 +265,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testCanBeDismissed() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        ExpandableNotificationRow parent = mock(ExpandableNotificationRow.class);

        when(row.getParent()).thenReturn(parent);
@@ -277,8 +281,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testIsTowardsMenu() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        when(row.isMenuVisible()).thenReturn(true);
        when(row.isMenuOnLeft()).thenReturn(true);

@@ -298,8 +302,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void onSnapBack() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        NotificationMenuRowPlugin.OnMenuEventListener listener = mock(NotificationMenuRowPlugin
                .OnMenuEventListener.class);
        row.setMenuClickListener(listener);
@@ -320,8 +324,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testOnSnap() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        when(row.isMenuOnLeft()).thenReturn(true);
        NotificationMenuRowPlugin.OnMenuEventListener listener = mock(NotificationMenuRowPlugin
                .OnMenuEventListener.class);
@@ -341,8 +345,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testOnDismiss() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        doNothing().when(row).cancelDrag();
        row.onSnapOpen();

@@ -358,8 +362,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testOnDown() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        doNothing().when(row).beginDrag();

        row.onTouchStart();
@@ -369,8 +373,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testOnUp() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        row.onTouchStart();

        assertTrue("before onTouchEnd, isUserTouching is true", row.isUserTouching());
@@ -382,8 +386,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {

    @Test
    public void testIsMenuVisible() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        row.setMenuAlpha(0);

        assertFalse("when alpha is 0, menu is not visible", row.isMenuVisible());
@@ -395,8 +399,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
    @DisableFlags(Flags.FLAG_MAGNETIC_NOTIFICATION_SWIPES)
    @Test
    public void testOnTouchMove() {
        NotificationMenuRow row = Mockito.spy(
                new NotificationMenuRow(mContext, mPeopleNotificationIdentifier));
        NotificationMenuRow row = Mockito.spy(new NotificationMenuRow(
                mContext, mPeopleNotificationIdentifier, mNotificationActivityStarter));
        row.createMenu(mRow);
        doReturn(50f).when(row).getDismissThreshold();
        doReturn(true).when(row).canBeDismissed();
+8 −0
Original line number Diff line number Diff line
@@ -78,6 +78,14 @@ class BundleEntry(spec: BundleSpec) : PipelineEntry(spec.key) {
        return false
    }

    fun onDensityOrFontScaleChanged() {
        row?.onDensityOrFontScaleChanged()
    }

    fun onUiModeChanged() {
        row?.onUiModeChanged()
    }

    /**
     * Returns whether this bundle be cleared when the user wants to "clear all" notifications.
     *
+4 −0
Original line number Diff line number Diff line
@@ -92,6 +92,10 @@ constructor(
        return mNotifCollection.allNotifs
    }

    override fun getAllBundles(): Collection<BundleEntry> {
        return mShadeListBuilder.bundleEntries
    }

    override fun addCollectionListener(listener: NotifCollectionListener) {
        mNotifCollection.addCollectionListener(listener)
    }
Loading