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

Commit c8ec09a5 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: 06f855f0

parents 86a9a12f 06f855f0
Loading
Loading
Loading
Loading
+30 −21
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.collection.render


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


/**
/**
@@ -40,6 +41,7 @@ class ShadeViewDiffer(
) {
) {
    private val rootNode = ShadeNode(rootController)
    private val rootNode = ShadeNode(rootController)
    private val nodes = mutableMapOf(rootController to rootNode)
    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
     * Adds and removes views from the root (and its children) until their structure matches the
@@ -64,26 +66,27 @@ class ShadeViewDiffer(
     *
     *
     * For debugging purposes.
     * For debugging purposes.
     */
     */
    fun getViewLabel(view: View): String =
    fun getViewLabel(view: View): String = views[view]?.label ?: view.toString()
            nodes.values.firstOrNull { node -> node.view === view }?.label ?: view.toString()


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

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

                maybeDetachChild(parentNode, parentSpec, childNode, childSpec)
                maybeDetachChild(parentNode, parentSpec, childNode, childSpec)

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


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


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


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


            logger.logDetachingChild(
            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])
        val parentSpec = checkNotNull(specMap[parentNode.controller])


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


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


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


    var parent: ShadeNode? = null
    var parent: ShadeNode? = null