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

Commit e52160f4 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix notif content when child updated to top level" into rvc-dev

parents d827ec8b 2b4bdbb0
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle

    private final Handler mHandler;

    /** Re-usable map of notifications to their sorted children.*/
    /** Re-usable map of top-level notifications to their sorted children if any.*/
    private final HashMap<NotificationEntry, List<NotificationEntry>> mTmpChildOrderMap =
            new HashMap<>();

@@ -211,6 +211,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
                }
                orderedChildren.add(ent);
            } else {
                // Top-level notif
                mTmpChildOrderMap.put(ent, null);
                toShow.add(ent.getRow());
            }
        }
@@ -288,7 +290,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle

        }

        mDynamicChildBindController.updateChildContentViews(mTmpChildOrderMap);
        mDynamicChildBindController.updateContentViews(mTmpChildOrderMap);
        mVisualStabilityManager.onReorderingFinished();
        // clear the map again for the next usage
        mTmpChildOrderMap.clear();
+19 −11
Original line number Diff line number Diff line
@@ -63,44 +63,52 @@ public class DynamicChildBindController {
    }

    /**
     * Update the child content views, unbinding content views on children that won't be visible
     * and binding content views on children that will be visible eventually.
     * Update the content views, unbinding content views on children that won't be visible
     * and binding content views on children that will be visible eventually and previously unbound
     * children that are no longer children.
     *
     * @param groupNotifs map of notification summaries to their children
     * @param groupNotifs map of top-level notifs to their children, if any
     */
    public void updateChildContentViews(
    public void updateContentViews(
            Map<NotificationEntry, List<NotificationEntry>> groupNotifs) {
        for (NotificationEntry entry : groupNotifs.keySet()) {
            List<NotificationEntry> children = groupNotifs.get(entry);
            if (children == null) {
                if (!hasContent(entry)) {
                    // Case where child is updated to be top level
                    bindContent(entry);
                }
                continue;
            }
            for (int j = 0; j < children.size(); j++) {
                NotificationEntry childEntry = children.get(j);
                if (j >= mChildBindCutoff) {
                    if (hasChildContent(childEntry)) {
                        freeChildContent(childEntry);
                    if (hasContent(childEntry)) {
                        freeContent(childEntry);
                    }
                } else {
                    if (!hasChildContent(childEntry)) {
                        bindChildContent(childEntry);
                    if (!hasContent(childEntry)) {
                        bindContent(childEntry);
                    }
                }
            }
        }
    }

    private boolean hasChildContent(NotificationEntry entry) {
    private boolean hasContent(NotificationEntry entry) {
        ExpandableNotificationRow row = entry.getRow();
        return row.getPrivateLayout().getContractedChild() != null
                || row.getPrivateLayout().getExpandedChild() != null;
    }

    private void freeChildContent(NotificationEntry entry) {
    private void freeContent(NotificationEntry entry) {
        RowContentBindParams params = mStage.getStageParams(entry);
        params.markContentViewsFreeable(FLAG_CONTENT_VIEW_CONTRACTED);
        params.markContentViewsFreeable(FLAG_CONTENT_VIEW_EXPANDED);
        mStage.requestRebind(entry, null);
    }

    private void bindChildContent(NotificationEntry entry) {
    private void bindContent(NotificationEntry entry) {
        RowContentBindParams params = mStage.getStageParams(entry);
        params.requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED);
        params.requireContentViews(FLAG_CONTENT_VIEW_EXPANDED);
+2 −2
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ public class DynamicChildBindControllerTest extends SysuiTestCase {
        when(mBindStage.getStageParams(lastChild)).thenReturn(bindParams);

        // WHEN the controller gets the list
        mDynamicChildBindController.updateChildContentViews(mGroupNotifs);
        mDynamicChildBindController.updateContentViews(mGroupNotifs);

        // THEN we free content views
        verify(bindParams).markContentViewsFreeable(FLAG_CONTENT_VIEW_CONTRACTED);
@@ -101,7 +101,7 @@ public class DynamicChildBindControllerTest extends SysuiTestCase {
        when(mBindStage.getStageParams(lastChild)).thenReturn(bindParams);

        // WHEN the controller gets the list
        mDynamicChildBindController.updateChildContentViews(mGroupNotifs);
        mDynamicChildBindController.updateContentViews(mGroupNotifs);

        // THEN we bind content views
        verify(bindParams).requireContentViews(FLAG_CONTENT_VIEW_CONTRACTED);