From fceab511b31cefff32bd5467dbca16ad57f71d5a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 18 Dec 2025 08:31:56 +0000 Subject: [PATCH] Android: run canvas WebView loads on main --- .../clawdis/node/node/CanvasController.kt | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt b/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt index dc6cd5483..7ca7fccf2 100644 --- a/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt +++ b/apps/android/app/src/main/java/com/steipete/clawdis/node/node/CanvasController.kt @@ -3,6 +3,7 @@ package com.steipete.clawdis.node.node import android.graphics.Bitmap import android.os.Build import android.graphics.Canvas +import android.os.Looper import android.webkit.WebView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine @@ -33,16 +34,28 @@ class CanvasController { reload() } - private fun reload() { + private inline fun withWebViewOnMain(crossinline block: (WebView) -> Unit) { val wv = webView ?: return - when (mode) { - Mode.WEB -> { - // Match iOS behavior: if URL is missing/invalid, keep the current page (canvas scaffold). - val trimmed = url.trim() - if (trimmed.isBlank()) return - wv.loadUrl(trimmed) + if (Looper.myLooper() == Looper.getMainLooper()) { + block(wv) + } else { + wv.post { block(wv) } + } + } + + private fun reload() { + val currentMode = mode + val currentUrl = url + withWebViewOnMain { wv -> + when (currentMode) { + Mode.WEB -> { + // Match iOS behavior: if URL is missing/invalid, keep the current page (canvas scaffold). + val trimmed = currentUrl.trim() + if (trimmed.isBlank()) return@withWebViewOnMain + wv.loadUrl(trimmed) + } + Mode.CANVAS -> wv.loadDataWithBaseURL(null, canvasHtml, "text/html", "utf-8", null) } - Mode.CANVAS -> wv.loadDataWithBaseURL(null, canvasHtml, "text/html", "utf-8", null) } }