Просмотр исходного кода

feat: 内置浏览器相关问题

HapeLee 3 месяцев назад
Родитель
Сommit
42d406e9a6

+ 6 - 2
app/src/main/java/io/legado/app/ui/browser/WebViewRouteScreen.kt

@@ -36,7 +36,7 @@ import io.legado.app.help.http.CookieStore
 import io.legado.app.help.source.SourceVerificationHelp
 import io.legado.app.help.source.SourceVerificationHelp
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
 import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
-import io.legado.app.ui.widget.components.topbar.GlassTopAppBar
+import io.legado.app.ui.widget.components.topbar.GlassSmallTopAppBar
 import io.legado.app.ui.widget.components.topbar.TopBarActionButton
 import io.legado.app.ui.widget.components.topbar.TopBarActionButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
 import io.legado.app.utils.openUrl
 import io.legado.app.utils.openUrl
@@ -84,8 +84,10 @@ fun WebViewRouteScreen(
     }
     }
 
 
     AppScaffold(
     AppScaffold(
+        // WebView 内容不能作为 haze 模糊采样源,否则会被反复重采样导致闪烁(与 RSS 页一致)
+        disableHazeSource = true,
         topBar = {
         topBar = {
-            GlassTopAppBar(
+            GlassSmallTopAppBar(
                 title = viewModel.sourceName.ifBlank {
                 title = viewModel.sourceName.ifBlank {
                     intent.getStringExtra("title") ?: context.getString(R.string.loading)
                     intent.getStringExtra("title") ?: context.getString(R.string.loading)
                 },
                 },
@@ -118,6 +120,8 @@ fun WebViewRouteScreen(
                     modifier = Modifier.fillMaxSize(),
                     modifier = Modifier.fillMaxSize(),
                     factory = { viewContext ->
                     factory = { viewContext ->
                         WebView(viewContext).apply {
                         WebView(viewContext).apply {
+                            // 透明背景,避免页面加载/跳转时白屏闪烁(与 RSS 的 VisibleWebView 一致)
+                            setBackgroundColor(0)
                             settings.apply {
                             settings.apply {
                                 mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
                                 mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
                                 domStorageEnabled = true
                                 domStorageEnabled = true

+ 3 - 0
app/src/main/java/io/legado/app/ui/main/MainIntent.kt

@@ -82,6 +82,9 @@ object MainIntent {
         refetchAfterSuccess: Boolean = true,
         refetchAfterSuccess: Boolean = true,
         html: String? = null,
         html: String? = null,
     ): Intent = createLauncherIntent(context).apply {
     ): Intent = createLauncherIntent(context).apply {
+        // NEW_TASK: 支持从 Application context(如 SourceVerificationHelp)启动;
+        // SINGLE_TOP: MainActivity 已在栈顶时复用现有实例走 onNewIntent,直接把路由压进 nav3 back stack。
+        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP)
         putExtra(EXTRA_START_ROUTE, MainRouteConst.ROUTE_WEB_VIEW)
         putExtra(EXTRA_START_ROUTE, MainRouteConst.ROUTE_WEB_VIEW)
         putExtra(EXTRA_WEB_VIEW_TITLE, title)
         putExtra(EXTRA_WEB_VIEW_TITLE, title)
         putExtra(EXTRA_WEB_VIEW_URL, url)
         putExtra(EXTRA_WEB_VIEW_URL, url)

+ 2 - 43
app/src/main/java/io/legado/app/ui/rss/read/RssReadRouteScreen.kt

@@ -13,7 +13,6 @@ import androidx.appcompat.app.AppCompatActivity
 import androidx.compose.foundation.background
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -54,9 +53,6 @@ import io.legado.app.help.http.CookieManager
 import io.legado.app.ui.login.SourceLoginType
 import io.legado.app.ui.login.SourceLoginType
 import io.legado.app.ui.main.MainActivity
 import io.legado.app.ui.main.MainActivity
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
-import io.legado.app.ui.theme.LocalHazeState
-import io.legado.app.ui.theme.ThemeResolver
-import io.legado.app.ui.theme.responsiveHazeEffect
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
 import io.legado.app.ui.widget.components.button.ConfirmDismissButtonsRow
@@ -67,8 +63,7 @@ import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
 import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
-import io.legado.app.ui.widget.components.topbar.GlassTopAppBar
-import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
+import io.legado.app.ui.widget.components.topbar.GlassSmallTopAppBar
 import io.legado.app.ui.widget.components.topbar.TopBarActionButton
 import io.legado.app.ui.widget.components.topbar.TopBarActionButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
 import io.legado.app.utils.NetworkUtils
 import io.legado.app.utils.NetworkUtils
@@ -81,7 +76,6 @@ import io.legado.app.utils.toggleSystemBar
 import org.apache.commons.text.StringEscapeUtils
 import org.apache.commons.text.StringEscapeUtils
 import org.jsoup.Jsoup
 import org.jsoup.Jsoup
 import org.koin.androidx.compose.koinViewModel
 import org.koin.androidx.compose.koinViewModel
-import top.yukonga.miuix.kmp.basic.SmallTopAppBar as MiuixSmallTopAppBar
 
 
 @SuppressLint("SetJavaScriptEnabled")
 @SuppressLint("SetJavaScriptEnabled")
 @OptIn(ExperimentalMaterial3Api::class)
 @OptIn(ExperimentalMaterial3Api::class)
@@ -210,7 +204,7 @@ fun RssReadRouteScreen(
         AppScaffold(
         AppScaffold(
             disableHazeSource = true,
             disableHazeSource = true,
             topBar = {
             topBar = {
-                RssReadTopAppBar(
+                GlassSmallTopAppBar(
                     title = pageTitle.ifBlank { defaultTopBarTitle },
                     title = pageTitle.ifBlank { defaultTopBarTitle },
                     navigationIcon = {
                     navigationIcon = {
                         TopBarNavigationButton(onClick = onBackClick)
                         TopBarNavigationButton(onClick = onBackClick)
@@ -425,41 +419,6 @@ fun RssReadRouteScreen(
     )
     )
 }
 }
 
 
-@Composable
-private fun RssReadTopAppBar(
-    title: String,
-    navigationIcon: @Composable () -> Unit,
-    actions: @Composable RowScope.() -> Unit,
-) {
-    if (!ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) {
-        GlassTopAppBar(
-            title = title,
-            navigationIcon = navigationIcon,
-            actions = actions
-        )
-        return
-    }
-
-    val hazeState = LocalHazeState.current
-    val containerColor = GlassTopAppBarDefaults.getMiuixAppBarColor()
-    val modifier = if (hazeState != null) {
-        Modifier
-            .background(containerColor)
-            .responsiveHazeEffect(hazeState)
-    } else {
-        Modifier.background(containerColor)
-    }
-
-    Column(modifier = modifier) {
-        MiuixSmallTopAppBar(
-            title = title,
-            navigationIcon = navigationIcon,
-            actions = actions,
-            color = Color.Transparent
-        )
-    }
-}
-
 @Composable
 @Composable
 private fun FavoriteEditSheet(
 private fun FavoriteEditSheet(
     show: Boolean,
     show: Boolean,

+ 55 - 0
app/src/main/java/io/legado/app/ui/widget/components/topbar/GlassSmallTopAppBar.kt

@@ -0,0 +1,55 @@
+package io.legado.app.ui.widget.components.topbar
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.theme.LocalHazeState
+import io.legado.app.ui.theme.ThemeResolver
+import io.legado.app.ui.theme.responsiveHazeEffect
+import top.yukonga.miuix.kmp.basic.SmallTopAppBar as MiuixSmallTopAppBar
+
+/**
+ * 小型玻璃顶栏。
+ * M3 引擎走 [GlassTopAppBar],Miuix 引擎走 MiuixSmallTopAppBar(与 RSS 阅读页一致)。
+ * 网页类页面统一用它,保证两引擎下顶栏一致。
+ */
+@Composable
+fun GlassSmallTopAppBar(
+    title: String,
+    modifier: Modifier = Modifier,
+    navigationIcon: @Composable () -> Unit = {},
+    actions: @Composable RowScope.() -> Unit = {},
+) {
+    if (!ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)) {
+        GlassTopAppBar(
+            title = title,
+            modifier = modifier,
+            navigationIcon = navigationIcon,
+            actions = actions,
+        )
+        return
+    }
+
+    val hazeState = LocalHazeState.current
+    val containerColor = GlassTopAppBarDefaults.getMiuixAppBarColor()
+    val finalModifier = if (hazeState != null) {
+        modifier
+            .background(containerColor)
+            .responsiveHazeEffect(hazeState)
+    } else {
+        modifier.background(containerColor)
+    }
+
+    Column(modifier = finalModifier) {
+        MiuixSmallTopAppBar(
+            title = title,
+            navigationIcon = navigationIcon,
+            actions = actions,
+            color = Color.Transparent
+        )
+    }
+}