fix: resolve relative manifest paths, base64 demo icon
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package top.yeij.hearth.webapp
|
package top.yeij.hearth.webapp
|
||||||
|
|
||||||
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import top.yeij.hearth.cache.CacheManager
|
import top.yeij.hearth.cache.CacheManager
|
||||||
@@ -69,14 +70,16 @@ class WebAppRepository(
|
|||||||
// 内置示例 webapp(打包在 assets 内,无需服务器)
|
// 内置示例 webapp(打包在 assets 内,无需服务器)
|
||||||
// Builtin demo webapp (bundled in assets, no server required)
|
// Builtin demo webapp (bundled in assets, no server required)
|
||||||
private fun builtinWebApps(): List<WebApp> {
|
private fun builtinWebApps(): List<WebApp> {
|
||||||
|
val svg = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>" +
|
||||||
|
"<rect width='24' height='24' rx='6' fill='#ff6900'/>" +
|
||||||
|
"<text x='12' y='17' font-size='13' text-anchor='middle' fill='white'>H</text></svg>"
|
||||||
|
val icon = "data:image/svg+xml;base64," +
|
||||||
|
Base64.encodeToString(svg.toByteArray(Charsets.UTF_8), Base64.NO_WRAP)
|
||||||
return listOf(
|
return listOf(
|
||||||
WebApp(
|
WebApp(
|
||||||
id = "demo",
|
id = "demo",
|
||||||
name = "示例应用",
|
name = "示例应用",
|
||||||
icon = "data:image/svg+xml;utf8," +
|
icon = icon,
|
||||||
"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'>" +
|
|
||||||
"<rect width='24' height='24' rx='6' fill='%23ff6900'/>" +
|
|
||||||
"<text x='12' y='17' font-size='13' text-anchor='middle' fill='white'>H</text></svg>",
|
|
||||||
url = "file:///android_asset/webapps/demo/index.html",
|
url = "file:///android_asset/webapps/demo/index.html",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -103,7 +106,13 @@ class WebAppRepository(
|
|||||||
val offlineMap = map["offline"] as? Map<*, *>
|
val offlineMap = map["offline"] as? Map<*, *>
|
||||||
val offline = offlineMap?.get("package") as? String
|
val offline = offlineMap?.get("package") as? String
|
||||||
val offlineVersion = offlineMap?.get("version") 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 TAG = "HearthWebApp"
|
||||||
private const val KEY = "webapp-manifest"
|
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('/')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user