From cde5628b0d09e085447d3991b9f07639fcd019a4 Mon Sep 17 00:00:00 2001 From: Sun-QAQ <75133710+Sun-QAQ@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:51:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9C=E6=99=9A=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=96=87=E5=AD=97?= =?UTF-8?q?+=E6=B7=BB=E5=8A=A0MIME=20=E7=B1=BB=E5=9E=8B=E5=8F=82=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E7=94=A8=E5=AF=B9=E5=BA=94=E5=BA=94=E7=94=A8?= =?UTF-8?q?=20(#4655)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * style(dialog): 优化确认对话框样式 - 修改工具栏 ID为 tool_bar - 为消息文本添加主文本颜色 - 设置工具栏标题文本颜色 * feat(app): 优化外部链接跳转逻辑并支持 MIME 类型- 重构 ConfirmationDialogActivity 中的跳转逻辑,支持处理 MIME 类型 - 在 JsExtensions 中的 openUrl 函数增加 mimeType 参数,允许传递 MIME 类型 --------- Co-authored-by: SunQAQ --- .../java/io/legado/app/help/JsExtensions.kt | 15 +++++++-- .../javascript/ConfirmationDialogActivity.kt | 33 ++++++++++++------- .../main/res/layout/confirmation_dialog.xml | 5 +-- app/src/main/res/values/styles.xml | 1 + 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 321199066..3927e2b86 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -963,11 +963,19 @@ interface JsExtensions : JsEncodeUtils { return AppConst.androidId } - fun openUrl(url: String) { + // 新增 mimeType 参数,默认为 null(保持兼容性) + fun openUrl(url: String, mimeType: String? = null) { try { val intent = Intent(appCtx, ConfirmationDialogActivity::class.java).apply { - data = Uri.parse(url) - putExtra("sourceTag", getSource()?.getTag() ?: "") // 添加来源标签参数 + // 同时设置 Data 和 Type(避免单独设置 data/type 导致冲突) + if (mimeType != null) { + setDataAndType(Uri.parse(url), mimeType) + } else { + data = Uri.parse(url) + } + putExtra("sourceTag", getSource()?.getTag() ?: "") + // 可选:添加 MIME 类型到 Extra 供后续逻辑使用 + putExtra("mimeType", mimeType) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } appCtx.startActivity(intent) @@ -976,4 +984,5 @@ interface JsExtensions : JsEncodeUtils { appCtx.toastOnUi("启动跳转确认失败") } } + } diff --git a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt index 0f0d1b508..e212ba2f6 100644 --- a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt +++ b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.javascript import android.content.ActivityNotFoundException import android.content.Intent -import android.net.Uri import android.os.Bundle import android.widget.TextView import androidx.appcompat.widget.Toolbar @@ -12,22 +11,21 @@ import io.legado.app.constant.AppLog import io.legado.app.ui.widget.text.AccentTextView import io.legado.app.utils.toastOnUi - class ConfirmationDialogActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // 必须先设置布局再获取控件 setContentView(R.layout.confirmation_dialog) - // 正确顺序:先设置布局再获取视图 val messageView = findViewById(R.id.message) - val toolbar = findViewById(R.id.toolbar) + val toolbar = findViewById(R.id.tool_bar) val btnNegative = findViewById(R.id.btn_negative) val btnPositive = findViewById(R.id.btn_positive) - val url = intent?.dataString - if (url.isNullOrBlank()) { + // 获取原始 Intent 的数据和 MIME 类型 + val uri = intent?.data + val mimeType = intent?.getStringExtra("mimeType") + if (uri == null) { finish() return } @@ -36,16 +34,27 @@ class ConfirmationDialogActivity : AppCompatActivity() { val sourceTag = intent.getStringExtra("sourceTag").takeIf { !it.isNullOrBlank() } ?: "当前来源" messageView.text = "$sourceTag 正在请求跳转外部链接/应用,是否跳转?" - // 设置其他组件 toolbar.setNavigationOnClickListener { finish() } btnNegative.setOnClickListener { finish() } btnPositive.setOnClickListener { try { - startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + // 创建目标 Intent 并设置类型 + val targetIntent = Intent(Intent.ACTION_VIEW).apply { + // 同时设置 Data 和 Type + if (!mimeType.isNullOrBlank()) { + setDataAndType(uri, mimeType) + } else { + data = uri } - ) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + // 验证是否有应用可以处理 + if (targetIntent.resolveActivity(packageManager) != null) { + startActivity(targetIntent) + } else { + toastOnUi(R.string.can_not_open) + } } catch (e: ActivityNotFoundException) { toastOnUi(R.string.can_not_open) } catch (e: Exception) { diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml index f1829047a..26c768c6d 100644 --- a/app/src/main/res/layout/confirmation_dialog.xml +++ b/app/src/main/res/layout/confirmation_dialog.xml @@ -14,7 +14,7 @@ android:orientation="vertical"> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:textColor="@color/primaryText" /> 20sp + @color/primaryText //*******************Widget Style**********************************//