From e33e64df148f4c57251e7423c95f2453d9788c59 Mon Sep 17 00:00:00 2001 From: "844143714@qq,com" <844143714@qq,com> Date: Tue, 12 May 2026 15:25:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/print_demo.html | 41 +++++++++++++++++++ .../com/stand/standapp/AndroidInterface.kt | 41 ++++++++++++++++--- .../java/com/stand/standapp/LoginActivity.kt | 8 ++-- .../java/com/stand/standapp/MainActivity.kt | 17 ++++---- 4 files changed, 89 insertions(+), 18 deletions(-) diff --git a/app/src/main/assets/print_demo.html b/app/src/main/assets/print_demo.html index d29e545..3080ef6 100644 --- a/app/src/main/assets/print_demo.html +++ b/app/src/main/assets/print_demo.html @@ -112,6 +112,22 @@ +
+
App 弹窗交互
+
+ + +
+
+ 提示标题: + + 提示内容: + + JSON 数据: + +
+
+
@@ -399,6 +415,31 @@ } } + function triggerRestartDialog() { + if (window.android && window.android.showRestartDialog) { + var msg = document.getElementById('dialog-msg').value; + var title = document.getElementById('dialog-title').value; + window.android.showRestartDialog(msg, title); + } else { + alert("showRestartDialog 接口不可用"); + } + } + + function triggerJsonDialog() { + if (window.android && window.android.showJsonDialog) { + var json = document.getElementById('dialog-json').value; + try { + JSON.parse(json); + } catch(e) { + alert("JSON 格式错误: " + e.message); + return; + } + window.android.showJsonDialog(json); + } else { + alert("showJsonDialog 接口不可用"); + } + } + // 调用系统打印 function callSystemPrint() { if (window.android && window.android.printPage) { diff --git a/app/src/main/java/com/stand/standapp/AndroidInterface.kt b/app/src/main/java/com/stand/standapp/AndroidInterface.kt index 1215bb9..c15eb3e 100644 --- a/app/src/main/java/com/stand/standapp/AndroidInterface.kt +++ b/app/src/main/java/com/stand/standapp/AndroidInterface.kt @@ -81,6 +81,8 @@ class AndroidInterface(private val activity: MainActivity) { "getMessages" -> getMessages() "clearMessages" -> { clearMessages(); "" } "onPageFinished" -> { onPageFinished(); "" } + "showRestartDialog" -> { showRestartDialog(args.optString(0, ""), args.optString(1, "提示")); "" } + "showJsonDialog" -> { showJsonDialog(args.optString(0, "")); "" } else -> { Timber.tag("Bridge").w("Unknown method: $method") "" @@ -422,17 +424,44 @@ class AndroidInterface(private val activity: MainActivity) { activity.cancelTimeoutTimer() activity.findViewById(R.id.loading_layout)?.visibility = android.view.View.GONE - // 正式界面模式下,页面加载完成后传递 token 给前端 + // 正式界面模式下,页面加载完成后传递登录数据给前端 val isOfficial = activity.isOfficialMode() - val token = activity.getEssToken() - Timber.tag("AndroidInterface").d("onPageFinished: isOfficial=$isOfficial, token=$token") - if (isOfficial && token.isNotEmpty()) { - com.stand.standapp.MainActivity.executeJs("if(window.setAppToken){window.setAppToken('$token');}") - Timber.tag("AndroidInterface").d("Called setAppToken with token") + val data = activity.getLoginData() + Timber.tag("AndroidInterface").d("onPageFinished: isOfficial=$isOfficial, data=$data") + if (isOfficial && data.isNotEmpty()) { + val escaped = data.replace("'", "\\'").replace("\n", "\\n") + com.stand.standapp.MainActivity.executeJs("if(window.appLogin){window.appLogin('$escaped');}") + Timber.tag("AndroidInterface").d("Called appLogin") } } catch (e: Exception) { Timber.tag("UI").e(e, "隐藏加载布局失败") } } } + + fun showRestartDialog(message: String, title: String) { + Handler(Looper.getMainLooper()).post { + com.stand.standapp.MainActivity.showPttUpdateDialog(message, title) + } + } + + fun showJsonDialog(jsonStr: String) { + Handler(Looper.getMainLooper()).post { + try { + val formatted = try { + val obj = org.json.JSONObject(jsonStr) + obj.toString(2) + } catch (_: Exception) { + jsonStr + } + androidx.appcompat.app.AlertDialog.Builder(activity) + .setTitle("JSON 数据") + .setMessage(formatted) + .setPositiveButton("确认", null) + .show() + } catch (e: Exception) { + Timber.tag("UI").e(e, "showJsonDialog error") + } + } + } } diff --git a/app/src/main/java/com/stand/standapp/LoginActivity.kt b/app/src/main/java/com/stand/standapp/LoginActivity.kt index 3e10ed1..317ebe9 100644 --- a/app/src/main/java/com/stand/standapp/LoginActivity.kt +++ b/app/src/main/java/com/stand/standapp/LoginActivity.kt @@ -151,9 +151,9 @@ class LoginActivity : AppCompatActivity() { AppConfig.setSavedPassword(this@LoginActivity, "") } - // 提取 token + // 提取登录数据 val data = json.optJSONObject("data") - val essToken = data?.optString("access_token", "") ?: "" + val loginData = data?.toString() ?: "{}" Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show() @@ -187,10 +187,10 @@ class LoginActivity : AppCompatActivity() { // 3. 初始化打印机 (异步) PrinterManager.init(this@LoginActivity) - // 4. 启动 MainActivity,传递登录模式和 token + // 4. 启动 MainActivity,传递登录模式和数据 val intent = Intent(this@LoginActivity, MainActivity::class.java) intent.putExtra("official_mode", officialMode) - intent.putExtra("ess_token", essToken) + intent.putExtra("login_data", loginData) startActivity(intent) finish() } else { diff --git a/app/src/main/java/com/stand/standapp/MainActivity.kt b/app/src/main/java/com/stand/standapp/MainActivity.kt index 29f5124..59be8ed 100644 --- a/app/src/main/java/com/stand/standapp/MainActivity.kt +++ b/app/src/main/java/com/stand/standapp/MainActivity.kt @@ -125,7 +125,7 @@ class MainActivity : AppCompatActivity() { private lateinit var geckoView: GeckoView private var officialMode = false - private var essToken = "" + private var loginData = "" private val mHandler = android.os.Handler(android.os.Looper.getMainLooper()) private val TIMEOUT_MS = 10000L @@ -139,9 +139,9 @@ class MainActivity : AppCompatActivity() { instance = this showPendingDialogIfNeeded() - // 读取登录模式和 token + // 读取登录模式和数据 officialMode = intent.getBooleanExtra("official_mode", false) - essToken = intent.getStringExtra("ess_token") ?: "" + loginData = intent.getStringExtra("login_data") ?: "" try { setContentView(R.layout.activity_main) @@ -248,12 +248,13 @@ class MainActivity : AppCompatActivity() { override fun onPageStop(session: GeckoSession, success: Boolean) { Timber.tag("MainActivity").d("Page stopped, success: $success") - // 正式界面模式下,页面加载完成后传递 token 给前端 -// if (success && officialMode && essToken.isNotEmpty()) { + // 正式界面模式下,页面加载完成后传递登录数据给前端 +// if (success && officialMode && loginData.isNotEmpty()) { // // 延迟 500ms 确保 JS 上下文就绪 // mHandler.postDelayed({ -// executeJs("if(window.setAppToken){window.setAppToken('$essToken');}") -// Timber.tag("MainActivity").d("Called setAppToken via onPageStop") +// val escaped = loginData.replace("'", "\\'").replace("\n", "\\n") +// executeJs("if(window.appLogin){window.appLogin('$escaped');}") +// Timber.tag("MainActivity").d("Called appLogin with loginData") // }, 500) // } } @@ -461,7 +462,7 @@ class MainActivity : AppCompatActivity() { fun isOfficialMode(): Boolean = officialMode - fun getEssToken(): String = essToken + fun getLoginData(): String = loginData private fun showErrorPage() { findViewById(R.id.loading_layout)?.visibility = android.view.View.GONE