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
This commit is contained in:
Evan Laird
2021-04-28 16:04:46 -04:00
parent 08d64fbc05
commit 7302505c7d

View File

@@ -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<DemoModeCommandReceiver>
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<DemoModeCommandReceiver>
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<DemoModeCommandReceiver>
synchronized(this) {
copy = receivers.toList()
}
copy.forEach { recv ->
pw.print(" ${recv.javaClass.simpleName}")
}
pw.println(" ]")