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

Commit da328835 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

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



Change-Id: I4029b057d46f21d4d7aeb1154a7059815dcbd562
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 8b6fc0eb 7c7f975b
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