From e9bcb7d804aa438e12597bf8e5f0c7bd0ff9b6ea Mon Sep 17 00:00:00 2001 From: LukeMackin Date: Wed, 22 Jul 2026 00:43:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20MainActivity=E7=B2=BE=E7=AE=80+frame.htm?= =?UTF-8?q?l=E9=AA=A8=E6=9E=B6=E9=A1=B5[V5]=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除cacheFile逻辑,始终加载frame.html - loadDataWithBaseURL避免WebView缓存 - frame.html添加[V5]标记区分版本 - Bridge保留(manifest/fetchText/sha256) --- .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../android/app/src/main/assets/frame.html | Bin 0 -> 4840 bytes .../android/app/src/main/assets/skeleton.html | Bin 0 -> 4756 bytes .../main/java/dev/yuzu/gca/MainActivity.kt | 69 +++++------------- 4 files changed, 17 insertions(+), 52 deletions(-) create mode 100644 packages/client-android/android/app/src/main/assets/frame.html create mode 100644 packages/client-android/android/app/src/main/assets/skeleton.html diff --git a/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index ab144f97970aecacd790573704195082d8dee15b..954802b6dc107fa84f2dc3f34bdf4ee8a336aee7 100644 GIT binary patch literal 17 UcmZQ>(-v{$|HmrA00wL)0UYN7{{R30 literal 17 UcmZQ>(-v{$|HmrA00yki032TecmMzZ diff --git a/packages/client-android/android/app/src/main/assets/frame.html b/packages/client-android/android/app/src/main/assets/frame.html new file mode 100644 index 0000000000000000000000000000000000000000..e0668e0e2ab931644ecbe893c677ca39ffcb70e6 GIT binary patch literal 4840 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 MXKBqh;UA}e0P#32MgRZ+ literal 0 HcmV?d00001 diff --git a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt index af7dc16..45e1563 100644 --- a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt +++ b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt @@ -3,7 +3,6 @@ package dev.yuzu.gca import android.os.Bundle import android.util.Log import android.webkit.WebView -import android.webkit.WebViewClient import androidx.appcompat.app.AppCompatActivity import java.io.File import java.net.HttpURLConnection @@ -11,29 +10,18 @@ import java.net.URL class MainActivity : AppCompatActivity() { - private val cacheFile: File by lazy { File(filesDir, "gca_hot.html") } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val wv = WebView(this).apply { - if (0 != (applicationInfo.flags and android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE)) { - WebView.setWebContentsDebuggingEnabled(true) - } settings.javaScriptEnabled = true settings.domStorageEnabled = true settings.allowFileAccess = true addJavascriptInterface(Bridge(this@MainActivity), "Android") - webViewClient = object : WebViewClient() {} - if (cacheFile.exists()) { - val html = cacheFile.readText() - loadDataWithBaseURL("file:///android_asset/", html, "text/html", "UTF-8", null) - Log.i(TAG, "Loaded cached HTML (${cacheFile.length()}B)") - } else { - loadUrl("file:///android_asset/index.html") - Log.i(TAG, "Loaded embedded index.html") - } + val html = assets.open("frame.html").bufferedReader().readText() + loadDataWithBaseURL("about:blank", html, "text/html", "UTF-8", null) + Log.i(TAG, "Loaded frame.html (${html.length}B)") } setContentView(wv) } @@ -41,66 +29,43 @@ class MainActivity : AppCompatActivity() { inner class Bridge(private val ctx: MainActivity) { @android.webkit.JavascriptInterface fun saveCache(html: String) { - if (html.length > 500_000) { - Log.w(TAG, "Cache rejected: too large (${html.length}B)") - return - } - ctx.cacheFile.writeText(html) - Log.i(TAG, "Hot-update HTML saved (${html.length}B)") + if (html.length > 500_000) { Log.w(TAG, "Cache too large"); return } + File(ctx.filesDir, "gca_hot.html").writeText(html) + Log.i(TAG, "Saved ${html.length}B") } @android.webkit.JavascriptInterface fun clearCache() { - ctx.cacheFile.delete() - Log.i(TAG, "Cache cleared") + File(ctx.filesDir, "gca_hot.html").delete() } @android.webkit.JavascriptInterface fun sha256(input: String): String { val md = java.security.MessageDigest.getInstance("SHA-256") - val digest = md.digest(input.toByteArray(Charsets.UTF_8)) - return digest.joinToString("") { "%02x".format(it) } + return md.digest(input.toByteArray(Charsets.UTF_8)).joinToString("") { "%02x".format(it) } } - /** Fetch manifest JSON from Gitea and return channel's section */ @android.webkit.JavascriptInterface fun fetchManifest(channel: String): String { - val manifestUrl = "https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/manifest.json" - Log.i(TAG, "Bridge fetching $manifestUrl → $channel") + val url = "https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/manifest.json" return try { - val conn = URL(manifestUrl).openConnection() as HttpURLConnection - conn.connectTimeout = 10_000; conn.readTimeout = 10_000 - conn.instanceFollowRedirects = true - if (conn.responseCode != 200) throw Exception("HTTP ${conn.responseCode}") + val conn = URL(url).openConnection() as HttpURLConnection + conn.connectTimeout = 10000; conn.readTimeout = 10000 val raw = conn.inputStream.bufferedReader().readText() - val json = org.json.JSONObject(raw) - json.getJSONObject(channel).toString() - } catch (e: Exception) { - Log.e(TAG, "Bridge fetchManifest($channel) failed: ${e.message}") - """{"error":"${e.message}"}""" - } + org.json.JSONObject(raw).getJSONObject(channel).toString() + } catch (e: Exception) { """{"error":"${e.message}"}""" } } - /** Fetch text file from Gitea — proxy for version.txt etc */ @android.webkit.JavascriptInterface fun fetchText(path: String): String { val safe = path.replace("..", "").replace("\\", "/") val url = "https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/$safe" - Log.i(TAG, "Bridge fetching $url") return try { - val conn = URL(url).openConnection() as HttpURLConnection - conn.connectTimeout = 10_000 - conn.readTimeout = 10_000 - conn.instanceFollowRedirects = true - val code = conn.responseCode - if (code != 200) throw Exception("HTTP $code") - conn.inputStream.bufferedReader().readText() - } catch (e: Exception) { - Log.e(TAG, "Bridge fetchText($path) failed: ${e.message}") - "ERROR: ${e.message}" - } + URL(url).openConnection().apply { connectTimeout = 10000; readTimeout = 10000 } + .getInputStream().bufferedReader().readText() + } catch (e: Exception) { "ERROR: ${e.message}" } } } - companion object { private const val TAG = "GCA-H5" } + companion object { private const val TAG = "GCA" } }