diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt index aec87642a..6023d56c6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewTreeObserver import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.core.Context +import java.lang.ref.WeakReference typealias DecorView = View @@ -20,19 +21,20 @@ class DecorViewObserver(val context: Context) : TreeObserver() { val throttleTimeMs = 500 - // should this be a weak reference? - private var nodeRef: View? = null + private var nodeRef: WeakReference? = null private var listener: ViewTreeObserver.OnPreDrawListener? = null override val type = "DecorView" override fun subscribe(node: Any) { - node as View - nodeRef = node + nodeRef = WeakReference(node) Log.i(LogTag, "Subscribing to decor view changes") + // TODO: there's a problem with this. Some future changes may have been + // ignored and not sent. Need to keep track of the last one, always and react + // accordingly. listener = object : ViewTreeObserver.OnPreDrawListener { var lastSend = 0L @@ -53,7 +55,7 @@ class DecorViewObserver(val context: Context) : TreeObserver() { Log.i(LogTag, "Unsubscribing from decor view changes") listener.let { - nodeRef?.viewTreeObserver?.removeOnPreDrawListener(it) + nodeRef?.get()?.viewTreeObserver?.removeOnPreDrawListener(it) listener = null nodeRef = null } @@ -66,7 +68,7 @@ object DecorViewTreeObserverBuilder : TreeObserverBuilder { } override fun build(context: Context): TreeObserver { - Log.i(LogTag, "Building decor view observer") + Log.i(LogTag, "Building DecorView observer") return DecorViewObserver(context) } }