From 5498c8ed0b4a2d87e6f942328cc72cf5fe8133a3 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 17 Aug 2026 19:44:53 +0800 Subject: [PATCH] fix: resolve relative manifest paths, base64 demo icon --- .../yeij/hearth/webapp/WebAppRepository.kt | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/top/yeij/hearth/webapp/WebAppRepository.kt b/app/src/main/java/top/yeij/hearth/webapp/WebAppRepository.kt index 42afb3d..dc012e3 100644 --- a/app/src/main/java/top/yeij/hearth/webapp/WebAppRepository.kt +++ b/app/src/main/java/top/yeij/hearth/webapp/WebAppRepository.kt @@ -1,5 +1,6 @@ package top.yeij.hearth.webapp +import android.util.Base64 import android.util.Log import com.google.gson.Gson import top.yeij.hearth.cache.CacheManager @@ -69,14 +70,16 @@ class WebAppRepository( // 内置示例 webapp(打包在 assets 内,无需服务器) // Builtin demo webapp (bundled in assets, no server required) private fun builtinWebApps(): List { + val svg = "" + + "" + + "H" + val icon = "data:image/svg+xml;base64," + + Base64.encodeToString(svg.toByteArray(Charsets.UTF_8), Base64.NO_WRAP) return listOf( WebApp( id = "demo", name = "示例应用", - icon = "data:image/svg+xml;utf8," + - "" + - "" + - "H", + icon = icon, url = "file:///android_asset/webapps/demo/index.html", ) ) @@ -103,7 +106,13 @@ class WebAppRepository( val offlineMap = map["offline"] as? Map<*, *> val offline = offlineMap?.get("package") as? String val offlineVersion = offlineMap?.get("version") as? String - WebApp(id, name, icon, url, offline, offlineVersion) + WebApp( + id, name, + resolvePath(icon), + resolvePath(url), + offline?.let { resolvePath(it) }, + offlineVersion, + ) } } @@ -111,4 +120,16 @@ class WebAppRepository( private const val TAG = "HearthWebApp" private const val KEY = "webapp-manifest" } + + // 相对路径拼服务器根;绝对 URL / data URI / file URI 直接返回 + // Resolve a relative path against the server root; return absolute URL / data + // URI / file URI as-is + private fun resolvePath(path: String): String { + if (path.startsWith("http://") || path.startsWith("https://") || + path.startsWith("data:") || path.startsWith("file:") + ) { + return path + } + return serverUrl.trimEnd('/') + "/" + path.trimStart('/') + } }