This commit is contained in:
844143714@qq,com 2026-05-11 21:49:12 +08:00
parent 00f4c106a4
commit 4ae7a9d676
4 changed files with 71 additions and 13 deletions

View File

@ -421,6 +421,15 @@ class AndroidInterface(private val activity: MainActivity) {
try {
activity.cancelTimeoutTimer()
activity.findViewById<android.view.View>(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")
}
} catch (e: Exception) {
Timber.tag("UI").e(e, "隐藏加载布局失败")
}

View File

@ -32,6 +32,7 @@ class LoginActivity : AppCompatActivity() {
val etPassword = findViewById<EditText>(R.id.et_password)
val cbRemember = findViewById<CheckBox>(R.id.cb_remember)
val btnLogin = findViewById<Button>(R.id.btn_login)
val btnLoginOfficial = findViewById<Button>(R.id.btn_login_official)
val btnExit = findViewById<Button>(R.id.btn_exit)
val ivSettings = findViewById<ImageView>(R.id.iv_settings)
val tvCopyright = findViewById<TextView>(R.id.tv_copyright)
@ -60,7 +61,20 @@ class LoginActivity : AppCompatActivity() {
}
// 执行真实接口登录
performLogin(username, password, cbRemember.isChecked)
performLogin(username, password, cbRemember.isChecked, false)
}
// 3.1 正式界面登录按钮点击事件
btnLoginOfficial.setOnClickListener {
val username = etUsername.text.toString().trim()
val password = etPassword.text.toString().trim()
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(this, "请输入账号和密码", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
performLogin(username, password, cbRemember.isChecked, true)
}
// 4. 退出按钮
@ -91,7 +105,7 @@ class LoginActivity : AppCompatActivity() {
}
}
private fun performLogin(username: String, password: String, remember: Boolean) {
private fun performLogin(username: String, password: String, remember: Boolean, officialMode: Boolean) {
val serverUrl = AppConfig.getServerUrl(this)
val loginUrl = "$serverUrl/api/auth/login"
@ -137,14 +151,11 @@ class LoginActivity : AppCompatActivity() {
AppConfig.setSavedPassword(this@LoginActivity, "")
}
Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show()
// 提取 token
val data = json.optJSONObject("data")
val essToken = data?.optString("access_token", "") ?: ""
// // 0. 先将账号信息写入 cfg.dat避免 native 读取时报 zpoc_init_cfg 13
// try {
// com.stand.standapp.MyApplication.writeCfgDat("220.154.131.231", username, "123456")
// } catch (e: Exception) {
// Timber.tag("PTT").e(e, "writeCfgDat error")
// }
Toast.makeText(this@LoginActivity, "登录成功", Toast.LENGTH_SHORT).show()
// 1. PTT 引擎强制重置后登录 (销毁旧 session确保干净状态)
try {
@ -176,7 +187,11 @@ class LoginActivity : AppCompatActivity() {
// 3. 初始化打印机 (异步)
PrinterManager.init(this@LoginActivity)
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
// 4. 启动 MainActivity传递登录模式和 token
val intent = Intent(this@LoginActivity, MainActivity::class.java)
intent.putExtra("official_mode", officialMode)
intent.putExtra("ess_token", essToken)
startActivity(intent)
finish()
} else {
val msg = json.optString("msg", "登录失败")

View File

@ -124,6 +124,9 @@ class MainActivity : AppCompatActivity() {
private var canGoBack = false
private lateinit var geckoView: GeckoView
private var officialMode = false
private var essToken = ""
private val mHandler = android.os.Handler(android.os.Looper.getMainLooper())
private val TIMEOUT_MS = 10000L
@ -135,6 +138,11 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
instance = this
showPendingDialogIfNeeded()
// 读取登录模式和 token
officialMode = intent.getBooleanExtra("official_mode", false)
essToken = intent.getStringExtra("ess_token") ?: ""
try {
setContentView(R.layout.activity_main)
@ -167,8 +175,12 @@ class MainActivity : AppCompatActivity() {
Timber.tag("MainActivity").d("WebExtension installed: ${extension?.metaData?.name}")
runOnUiThread {
val serverUrl = AppConfig.getServerUrl(this)
val finalUrl = "$serverUrl/example/print_demo.html?t=${System.currentTimeMillis()}"
Timber.tag("MainActivity").d("Loading URL: $finalUrl")
val finalUrl = if (officialMode) {
"$serverUrl/sysdispatch/home?t=${System.currentTimeMillis()}"
} else {
"$serverUrl/example/print_demo.html?t=${System.currentTimeMillis()}"
}
Timber.tag("MainActivity").d("Loading URL: $finalUrl (officialMode=$officialMode)")
session.loadUri(finalUrl)
}
}
@ -236,6 +248,14 @@ class MainActivity : AppCompatActivity() {
override fun onPageStop(session: GeckoSession, success: Boolean) {
Timber.tag("MainActivity").d("Page stopped, success: $success")
// 正式界面模式下,页面加载完成后传递 token 给前端
// if (success && officialMode && essToken.isNotEmpty()) {
// // 延迟 500ms 确保 JS 上下文就绪
// mHandler.postDelayed({
// executeJs("if(window.setAppToken){window.setAppToken('$essToken');}")
// Timber.tag("MainActivity").d("Called setAppToken via onPageStop")
// }, 500)
// }
}
}
@ -439,6 +459,10 @@ class MainActivity : AppCompatActivity() {
mHandler.removeCallbacks(timeoutRunnable)
}
fun isOfficialMode(): Boolean = officialMode
fun getEssToken(): String = essToken
private fun showErrorPage() {
findViewById<android.view.View>(R.id.loading_layout)?.visibility = android.view.View.GONE
findViewById<android.view.View>(R.id.error_layout)?.visibility = android.view.View.VISIBLE

View File

@ -123,12 +123,22 @@
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginBottom="15dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_button_login"
android:text="登录"
android:textColor="#FFFFFF"
android:textSize="18sp" />
<Button
android:id="@+id/btn_login_official"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginBottom="15dp"
android:background="@drawable/shape_button_login"
android:text="正式界面登录"
android:textColor="#FFFFFF"
android:textSize="18sp" />
<Button
android:id="@+id/btn_exit"
android:layout_width="match_parent"