diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1ad6e2834..0b2ad12fd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -433,6 +433,13 @@
+
+
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 a1ee39e05..321199066 100644
--- a/app/src/main/java/io/legado/app/help/JsExtensions.kt
+++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt
@@ -2,6 +2,8 @@ package io.legado.app.help
import android.net.Uri
import android.webkit.WebSettings
+import android.app.AlertDialog
+import android.content.Intent
import androidx.annotation.Keep
import cn.hutool.core.codec.Base64
import cn.hutool.core.util.HexUtil
@@ -21,6 +23,7 @@ import io.legado.app.help.source.SourceVerificationHelp
import io.legado.app.model.Debug
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.QueryTTF
+import io.legado.app.ui.javascript.ConfirmationDialogActivity
import io.legado.app.utils.ArchiveUtils
import io.legado.app.utils.ChineseUtils
import io.legado.app.utils.EncoderUtils
@@ -45,9 +48,11 @@ import io.legado.app.utils.readText
import io.legado.app.utils.stackTraceStr
import io.legado.app.utils.toStringArray
import io.legado.app.utils.toastOnUi
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
import okio.use
import org.jsoup.Connection
import org.jsoup.Jsoup
@@ -958,4 +963,17 @@ interface JsExtensions : JsEncodeUtils {
return AppConst.androidId
}
+ fun openUrl(url: String) {
+ try {
+ val intent = Intent(appCtx, ConfirmationDialogActivity::class.java).apply {
+ data = Uri.parse(url)
+ putExtra("sourceTag", getSource()?.getTag() ?: "") // 添加来源标签参数
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ }
+ appCtx.startActivity(intent)
+ } catch (e: Exception) {
+ AppLog.put("启动跳转对话框失败", e)
+ 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
new file mode 100644
index 000000000..0f0d1b508
--- /dev/null
+++ b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt
@@ -0,0 +1,63 @@
+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
+import androidx.appcompat.app.AppCompatActivity
+import io.legado.app.R
+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 btnNegative = findViewById(R.id.btn_negative)
+ val btnPositive = findViewById(R.id.btn_positive)
+
+ val url = intent?.dataString
+ if (url.isNullOrBlank()) {
+ finish()
+ return
+ }
+
+ // 处理来源标签显示
+ 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)
+ }
+ )
+ } catch (e: ActivityNotFoundException) {
+ toastOnUi(R.string.can_not_open)
+ } catch (e: Exception) {
+ AppLog.put("打开链接失败", e)
+ toastOnUi(R.string.error_occurred)
+ }
+ finish()
+ }
+ }
+
+ override fun onBackPressed() {
+ super.onBackPressed()
+ finish()
+ }
+}
diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml
new file mode 100644
index 000000000..f1829047a
--- /dev/null
+++ b/app/src/main/res/layout/confirmation_dialog.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a67ff259a..00bf22601 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1185,4 +1185,6 @@
主题配置
Download the chapter after
Download all chapter
+ 打开失败
+ %s正在请求跳转外部链接/应用,是否跳转?
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4bc8faa05..885aa8352 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -127,4 +127,16 @@
- wrap_content
+
+
+
+
+
+