From 7302505c7d643e1a9f47fd257935e45b9bb110aa Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Wed, 28 Apr 2021 16:04:46 -0400 Subject: [PATCH] Use synchronize instead of Assert.isMainThread DemoModeController tried to make sure adding callbacks always happened on the main thread. But it's breaking some tests if it somehow gets instantiated (lazily, by Dagger) on a background thread. It should be fine to just use a couple of locks and call it a day, but eventually it'd be better to fix that dagger problem... Test: atest SystemUITests Fixes: 170122983 Change-Id: Ieff52b268aec4194e932823353c739c1e0641acc --- .../systemui/demomode/DemoModeController.kt | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt b/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt index c76f55631ac91..ed11db52b95ca 100644 --- a/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt +++ b/packages/SystemUI/src/com/android/systemui/demomode/DemoModeController.kt @@ -85,8 +85,6 @@ class DemoModeController constructor( } override fun addCallback(listener: DemoMode) { - Assert.isMainThread() - // Register this listener for its commands val commands = listener.demoCommands() @@ -99,20 +97,23 @@ class DemoModeController constructor( receiverMap[command]!!.add(listener) } - receivers.add(listener) + synchronized(this) { + receivers.add(listener) + } + if (isInDemoMode) { listener.onDemoModeStarted() } } override fun removeCallback(listener: DemoMode) { - Assert.isMainThread() + synchronized(this) { + listener.demoCommands().forEach { command -> + receiverMap[command]!!.remove(listener) + } - listener.demoCommands().forEach { command -> - receiverMap[command]!!.remove(listener) + receivers.remove(listener) } - - receivers.remove(listener) } private fun setIsDemoModeAllowed(enabled: Boolean) { @@ -125,7 +126,13 @@ class DemoModeController constructor( private fun enterDemoMode() { isInDemoMode = true Assert.isMainThread() - receivers.forEach { r -> + + val copy: List + synchronized(this) { + copy = receivers.toList() + } + + copy.forEach { r -> r.onDemoModeStarted() } } @@ -133,7 +140,13 @@ class DemoModeController constructor( private fun exitDemoMode() { isInDemoMode = false Assert.isMainThread() - receivers.forEach { r -> + + val copy: List + synchronized(this) { + copy = receivers.toList() + } + + copy.forEach { r -> r.onDemoModeFinished() } } @@ -168,7 +181,11 @@ class DemoModeController constructor( pw.println(" isInDemoMode=$isInDemoMode") pw.println(" isDemoModeAllowed=$isAvailable") pw.print(" receivers=[") - receivers.forEach { recv -> + val copy: List + synchronized(this) { + copy = receivers.toList() + } + copy.forEach { recv -> pw.print(" ${recv.javaClass.simpleName}") } pw.println(" ]")