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

Commit 2da8993e 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: c8ec09a5

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



Change-Id: I5cfc6a48f6edcc9df18c32fca4d5640dfefc66f9
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 9b01e7d5 c8ec09a5
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