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

Commit 9a9b8554 authored by Steve Elliott's avatar Steve Elliott
Browse files

Fix bundle group summary timestamp

And unify a bunch of group-traversal logic to use [forEachGroupEntry].

Test: manual
Fixes: 422432488
Flag: com.android.systemui.notification_bundle_ui
Change-Id: I179248b1d6135626991b4fce4ee42f5bcc161ef8
parent 0be36ef4
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -86,3 +86,24 @@ sealed class PipelineEntry(
        fun onSensitivityChanged(entry: NotificationEntry)
    }
}

/** Performs an action on all group entries, even if they are in a bundle */
inline fun List<PipelineEntry>.forEachGroupEntry(action: (GroupEntry) -> Unit) {
    forEach { entry ->
        when (entry) {
            is GroupEntry -> {
                action(entry)
            }
            is BundleEntry -> {
                for (bundleChild in entry.children) {
                    if (bundleChild is GroupEntry) {
                        action(bundleChild)
                    }
                }
            }
            else -> {
                // Do nothing for leaf nodes
            }
        }
    }
}
+6 −14
Original line number Diff line number Diff line
@@ -17,11 +17,11 @@
package com.android.systemui.statusbar.notification.collection.coordinator

import android.util.ArrayMap
import com.android.systemui.statusbar.notification.collection.BundleEntry
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
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.forEachGroupEntry
import com.android.systemui.statusbar.notification.collection.render.NotifGroupController
import javax.inject.Inject

@@ -38,15 +38,7 @@ class GroupCountCoordinator @Inject constructor() : Coordinator {
    private fun onBeforeFinalizeFilter(entries: List<PipelineEntry>) {
        // save untruncated child counts to our internal map
        untruncatedChildCounts.clear()
        entries.asSequence()
            .flatMap { entry ->
                when (entry) {
                    is GroupEntry -> listOf(entry)
                    is BundleEntry -> entry.children.filterIsInstance<GroupEntry>()
                    else -> emptyList()
                }
            }
            .forEach { groupEntry ->
        entries.forEachGroupEntry { groupEntry ->
            untruncatedChildCounts[groupEntry] = groupEntry.children.size
        }
    }
+5 −4
Original line number Diff line number Diff line
@@ -18,9 +18,10 @@ package com.android.systemui.statusbar.notification.collection.coordinator
import android.util.ArrayMap
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
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.forEachGroupEntry
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.notification.collection.render.NotifGroupController
import com.android.systemui.util.concurrency.DelayableExecutor
@@ -35,7 +36,7 @@ class GroupWhenCoordinator
@Inject
constructor(
    @Main private val delayableExecutor: DelayableExecutor,
    private val systemClock: SystemClock
    private val systemClock: SystemClock,
) : Coordinator {

    private val invalidator = object : Invalidator("GroupWhenCoordinator") {}
@@ -58,7 +59,7 @@ constructor(

        val now = systemClock.currentTimeMillis()
        var closestFutureTime = Long.MAX_VALUE
        entries.asSequence().filterIsInstance<GroupEntry>().forEach { groupEntry ->
        entries.forEachGroupEntry { groupEntry ->
            val whenMillis = calculateGroupNotificationTime(groupEntry, now)
            notificationGroupTimes[groupEntry] = whenMillis
            if (whenMillis > now) {
@@ -83,7 +84,7 @@ constructor(

    private fun calculateGroupNotificationTime(
        groupEntry: GroupEntry,
        currentTimeMillis: Long
        currentTimeMillis: Long,
    ): Long {
        var pastTime = Long.MIN_VALUE
        var futureTime = Long.MAX_VALUE
+3 −2
Original line number Diff line number Diff line
@@ -17,10 +17,11 @@ package com.android.systemui.statusbar.notification.collection.coordinator

import android.util.ArrayMap
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.PipelineEntry
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.forEachGroupEntry
import com.android.systemui.statusbar.notification.collection.render.NotifRowController
import javax.inject.Inject
import kotlin.math.max
@@ -41,7 +42,7 @@ class RowAlertTimeCoordinator @Inject constructor() : Coordinator {

    private fun onBeforeFinalizeFilterListener(entries: List<PipelineEntry>) {
        latestAlertTimeBySummary.clear()
        entries.asSequence().filterIsInstance<GroupEntry>().forEach { groupEntry ->
        entries.forEachGroupEntry { groupEntry ->
            val summary = checkNotNull(groupEntry.summary)
            latestAlertTimeBySummary[summary] = groupEntry.calculateLatestAlertTime()
        }
+2 −26
Original line number Diff line number Diff line
@@ -20,11 +20,12 @@ import com.android.app.tracing.traceSection
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.BundleEntry
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.collection.PipelineEntry
import com.android.systemui.statusbar.notification.collection.ShadeListBuilder
import com.android.systemui.statusbar.notification.collection.forEachGroupEntry
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderEntryListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderGroupListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderListListener
@@ -154,29 +155,4 @@ class RenderStageManager @Inject constructor() : PipelineDumpable {
            }
        }
    }

    /**
     * Performs an action on all group entries, even if they are in a bundle
     */
    private inline fun List<PipelineEntry>.forEachGroupEntry(
        action: (GroupEntry) -> Unit
    ) {
        forEach { entry ->
            when (entry) {
                is GroupEntry -> {
                    action(entry)
                }
                is BundleEntry -> {
                    for (bundleChild in entry.children) {
                        if (bundleChild is GroupEntry) {
                            action(bundleChild)
                        }
                    }
                }
                else -> {
                    // Do nothing for leaf nodes
                }
            }
        }
    }
}