Merge "Revert "Fix stale View tracking in ShadeViewDiffer"" into tm-dev am: 06f855f07c am: 7c7f975b55

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

Change-Id: I4029b057d46f21d4d7aeb1154a7059815dcbd562
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Super Liu
2022-04-29 18:30:10 +00:00
committed by Automerger Merge Worker

View File

@@ -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,25 +66,26 @@ 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] ) {
for (i in parentNode.getChildCount() - 1 downTo 0) { val parentSpec = specMap[parentNode.controller]
val childView = parentNode.getChildAt(i)
views[childView]?.let { childNode -> for (i in parentNode.getChildCount() - 1 downTo 0) {
val childSpec = specMap[childNode.controller] val childView = parentNode.getChildAt(i)
maybeDetachChild(parentNode, parentSpec, childNode, childSpec) views[childView]?.let { childNode ->
if (childNode.controller.getChildCount() > 0) { val childSpec = specMap[childNode.controller]
detachRecursively(childNode, specMap)
} maybeDetachChild(parentNode, parentSpec, childNode, childSpec)
if (childNode.controller.getChildCount() > 0) {
detachChildren(childNode, specMap)
} }
} }
} }
detachRecursively(parentNode, specMap)
} }
private fun maybeDetachChild( private fun maybeDetachChild(
@@ -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