From f996f90cf4feac614503c0809d1a6d711be2c1aa Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Wed, 25 Jan 2023 04:47:11 -0800 Subject: [PATCH] Fix Interactions with TreeObserver Manager moved to main thread Reviewed By: lblasa Differential Revision: D42608384 fbshipit-source-id: 20c074eeac1372405f44edc8eb8ab41cb7dd2be9 --- .../plugins/uidebugger/UIDebuggerFlipperPlugin.kt | 12 +++--------- .../uidebugger/observers/TreeObserverManager.kt | 5 +++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index d5a4c3909..b5a5a1d66 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -18,9 +18,6 @@ import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.InitEvent import com.facebook.flipper.plugins.uidebugger.model.MetadataUpdateEvent import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.serialization.json.Json const val LogTag = "ui-debugger" @@ -31,7 +28,6 @@ class UIDebuggerFlipperPlugin( observerFactory: TreeObserverFactory? ) : FlipperPlugin { - val mainScope = CoroutineScope(Dispatchers.Main) private val context: Context = Context( ApplicationRef(application), @@ -65,7 +61,7 @@ class UIDebuggerFlipperPlugin( MetadataUpdateEvent.serializer(), MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) - mainScope.launch { context.treeObserverManager.start() } + context.treeObserverManager.start() } @Throws(Exception::class) @@ -75,10 +71,8 @@ class UIDebuggerFlipperPlugin( MetadataRegister.reset() - mainScope.launch { - context.treeObserverManager.stop() - context.bitmapPool.recycleAll() - } + context.treeObserverManager.stop() + context.bitmapPool.recycleAll() } override fun runInBackground(): Boolean { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index bf8048755..2e3649ab4 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.observers import android.annotation.SuppressLint import android.graphics.Bitmap +import android.os.Looper import android.util.Base64 import android.util.Base64OutputStream import android.util.Log @@ -51,6 +52,7 @@ class TreeObserverManager(val context: Context) { private var job: Job? = null private val workerScope = CoroutineScope(Dispatchers.IO) + private val mainScope = CoroutineScope(Dispatchers.Main) private val txId = AtomicInteger() fun enqueueUpdate(update: SubtreeUpdate) { @@ -68,6 +70,9 @@ class TreeObserverManager(val context: Context) { @SuppressLint("NewApi") fun start() { + if (Looper.myLooper() != Looper.getMainLooper()) { + mainScope.launch { start() } + } batchedUpdates = Channel(Channel.UNLIMITED) rootObserver.subscribe(context.applicationRef)