Procházet zdrojové kódy

优化夜晚模式下对话框文字+添加MIME 类型参数,调用对应应用 (#4655)

* style(dialog): 优化确认对话框样式

- 修改工具栏 ID为 tool_bar
- 为消息文本添加主文本颜色
- 设置工具栏标题文本颜色

* feat(app): 优化外部链接跳转逻辑并支持 MIME 类型- 重构 ConfirmationDialogActivity 中的跳转逻辑,支持处理 MIME 类型
- 在 JsExtensions 中的 openUrl 函数增加 mimeType 参数,允许传递 MIME 类型

---------

Co-authored-by: SunQAQ <sunqi87c6@gmail.com>
Sun-QAQ před 1 rokem
rodič
revize
ea267b2cff

+ 12 - 3
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("启动跳转确认失败")
         }
     }
+
 }

+ 21 - 12
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<TextView>(R.id.message)
-        val toolbar = findViewById<Toolbar>(R.id.toolbar)
+        val toolbar = findViewById<Toolbar>(R.id.tool_bar)
         val btnNegative = findViewById<AccentTextView>(R.id.btn_negative)
         val btnPositive = findViewById<AccentTextView>(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) {

+ 3 - 2
app/src/main/res/layout/confirmation_dialog.xml

@@ -14,7 +14,7 @@
         android:orientation="vertical">
 
         <androidx.appcompat.widget.Toolbar
-            android:id="@+id/toolbar"
+            android:id="@+id/tool_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:theme="?attr/actionBarStyle"
@@ -28,7 +28,8 @@
             android:layout_height="wrap_content"
             android:padding="16dp"
             android:textSize="16sp"
-            android:textAppearance="?attr/textAppearanceBodyMedium"/>
+            android:textAppearance="?attr/textAppearanceBodyMedium"
+            android:textColor="@color/primaryText" />
 
         <com.google.android.flexbox.FlexboxLayout
             android:layout_width="match_parent"

+ 1 - 0
app/src/main/res/values/styles.xml

@@ -80,6 +80,7 @@
 
     <style name="ToolbarTitle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
         <item name="android:textSize">20sp</item>
+        <item name="android:textColor">@color/primaryText</item>
     </style>
 
     //*******************Widget Style**********************************//