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

Commit 88ce2eb2 authored by Super Liu's avatar Super Liu Committed by Automerger Merge Worker
Browse files

Merge "Revert "Fix stale View tracking in ShadeViewDiffer"" into tm-dev am:...

Merge "Revert "Fix stale View tracking in ShadeViewDiffer"" into tm-dev am: 06f855f0 am: 7c7f975b am: da328835

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18055312



Change-Id: Id5694efa03d2b7e8953dca50300fe54bbb27c8dc
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents c3d8226d da328835
Loading
Loading
Loading
Loading
+30 −21
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.collection.render

import android.annotation.MainThread
import android.view.View
import com.android.systemui.util.kotlin.transform
import com.android.systemui.util.traceSection

/**
@@ -40,6 +41,7 @@ class ShadeViewDiffer(
) {
    private val rootNode = ShadeNode(rootController)
    private val nodes = mutableMapOf(rootController to rootNode)
    private val views = mutableMapOf<View, ShadeNode>()

    /**
     * Adds and removes views from the root (and its children) until their structure matches the
@@ -64,26 +66,27 @@ class ShadeViewDiffer(
     *
     * For debugging purposes.
     */
    fun getViewLabel(view: View): String =
            nodes.values.firstOrNull { node -> node.view === view }?.label ?: view.toString()
    fun getViewLabel(view: View): String = views[view]?.label ?: view.toString()

    private fun detachChildren(parentNode: ShadeNode, specMap: Map<NodeController, NodeSpec>) {
        val views = nodes.values.asSequence().map { node -> node.view to node }.toMap()
        fun detachRecursively(parentNode: ShadeNode, specMap: Map<NodeController, NodeSpec>) {
    private fun detachChildren(
        parentNode: ShadeNode,
        specMap: Map<NodeController, NodeSpec>
    ) {
        val parentSpec = specMap[parentNode.controller]

        for (i in parentNode.getChildCount() - 1 downTo 0) {
            val childView = parentNode.getChildAt(i)
            views[childView]?.let { childNode ->
                val childSpec = specMap[childNode.controller]

                maybeDetachChild(parentNode, parentSpec, childNode, childSpec)

                if (childNode.controller.getChildCount() > 0) {
                        detachRecursively(childNode, specMap)
                    detachChildren(childNode, specMap)
                }
            }
        }
    }
        detachRecursively(parentNode, specMap)
    }

    private fun maybeDetachChild(
        parentNode: ShadeNode,
@@ -91,13 +94,14 @@ class ShadeViewDiffer(
        childNode: ShadeNode,
        childSpec: NodeSpec?
    ) {
        val newParentNode = childSpec?.parent?.let { getNode(it) }
        val newParentNode = transform(childSpec?.parent) { getNode(it) }

        if (newParentNode != parentNode) {
            val childCompletelyRemoved = newParentNode == null

            if (childCompletelyRemoved) {
                nodes.remove(childNode.controller)
                views.remove(childNode.controller.view)
            }

            logger.logDetachingChild(
@@ -111,7 +115,10 @@ class ShadeViewDiffer(
        }
    }

    private fun attachChildren(parentNode: ShadeNode, specMap: Map<NodeController, NodeSpec>) {
    private fun attachChildren(
        parentNode: ShadeNode,
        specMap: Map<NodeController, NodeSpec>
    ) {
        val parentSpec = checkNotNull(specMap[parentNode.controller])

        for ((index, childSpec) in parentSpec.children.withIndex()) {
@@ -153,6 +160,7 @@ class ShadeViewDiffer(
        if (node == null) {
            node = ShadeNode(spec.controller)
            nodes[node.controller] = node
            views[node.view] = node
        }
        return node
    }
@@ -186,9 +194,10 @@ class ShadeViewDiffer(

private class DuplicateNodeException(message: String) : RuntimeException(message)

private class ShadeNode(val controller: NodeController) {
    val view: View
        get() = controller.view
private class ShadeNode(
    val controller: NodeController
) {
    val view = controller.view

    var parent: ShadeNode? = null