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 + + + + + +