From 1ac9dd57a0c22680dd99c74626000dd4a4803bc9 Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Fri, 29 Apr 2022 13:21:05 +0000 Subject: [PATCH] Revert^2 "Fix stale View tracking in ShadeViewDiffer" This reverts commit e8bd13a5930c28b6a9898a1ddf2223a08ee6fce2. Fixes: 216150338 Test: atest PlatformScenarioTests:android.platform.test.scenario.sysui.notification.NotificationShadeChrome#testClearAllWithManyNotifications -- --abi arm64-v8a Change-Id: I153ce09e68641bc8f5b86881aa5092bd2f34a85b --- .../collection/render/ShadeViewDiffer.kt | 49 ++++++++----------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDiffer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDiffer.kt index 386e2d31380c5..f460644ce71ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDiffer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDiffer.kt @@ -18,7 +18,6 @@ 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 /** @@ -41,7 +40,6 @@ class ShadeViewDiffer( ) { private val rootNode = ShadeNode(rootController) private val nodes = mutableMapOf(rootController to rootNode) - private val views = mutableMapOf() /** * Adds and removes views from the root (and its children) until their structure matches the @@ -66,26 +64,25 @@ class ShadeViewDiffer( * * For debugging purposes. */ - fun getViewLabel(view: View): String = views[view]?.label ?: view.toString() + fun getViewLabel(view: View): String = + nodes.values.firstOrNull { node -> node.view === view }?.label ?: view.toString() - private fun detachChildren( - parentNode: ShadeNode, - specMap: Map - ) { - 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) { - detachChildren(childNode, specMap) + private fun detachChildren(parentNode: ShadeNode, specMap: Map) { + val views = nodes.values.associateBy { it.view } + fun detachRecursively(parentNode: ShadeNode, specMap: Map) { + 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) + } } } } + detachRecursively(parentNode, specMap) } private fun maybeDetachChild( @@ -94,14 +91,13 @@ class ShadeViewDiffer( childNode: ShadeNode, childSpec: NodeSpec? ) { - val newParentNode = transform(childSpec?.parent) { getNode(it) } + val newParentNode = childSpec?.parent?.let { getNode(it) } if (newParentNode != parentNode) { val childCompletelyRemoved = newParentNode == null if (childCompletelyRemoved) { nodes.remove(childNode.controller) - views.remove(childNode.controller.view) } logger.logDetachingChild( @@ -115,10 +111,7 @@ class ShadeViewDiffer( } } - private fun attachChildren( - parentNode: ShadeNode, - specMap: Map - ) { + private fun attachChildren(parentNode: ShadeNode, specMap: Map) { val parentSpec = checkNotNull(specMap[parentNode.controller]) for ((index, childSpec) in parentSpec.children.withIndex()) { @@ -160,7 +153,6 @@ class ShadeViewDiffer( if (node == null) { node = ShadeNode(spec.controller) nodes[node.controller] = node - views[node.view] = node } return node } @@ -194,10 +186,9 @@ class ShadeViewDiffer( private class DuplicateNodeException(message: String) : RuntimeException(message) -private class ShadeNode( - val controller: NodeController -) { - val view = controller.view +private class ShadeNode(val controller: NodeController) { + val view: View + get() = controller.view var parent: ShadeNode? = null