From e6dcc7229f6103d63c8169e3609cd476c5765257 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Thu, 4 Jun 2026 00:59:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=BA=90=E5=8F=98=E9=87=8F=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=AE=BE=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/rss/article/RssSortRouteScreen.kt | 26 ++++--- .../app/ui/rss/article/RssSortScreen.kt | 68 +++++++++++++++++++ .../app/ui/rss/article/RssSortViewModel.kt | 4 ++ 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortRouteScreen.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortRouteScreen.kt index 32f2e5362..5034ca3db 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortRouteScreen.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortRouteScreen.kt @@ -1,9 +1,6 @@ -@file:Suppress("DEPRECATION") - package io.legado.app.ui.rss.article import android.app.Activity -import androidx.activity.compose.LocalActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -14,15 +11,12 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext -import androidx.appcompat.app.AppCompatActivity import io.legado.app.R import io.legado.app.data.entities.RssReadRecord import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.rss.read.RedirectPolicy import io.legado.app.ui.rss.source.edit.RssSourceEditActivity -import io.legado.app.ui.widget.dialog.VariableDialog import io.legado.app.utils.StartActivityContract -import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers @@ -40,7 +34,6 @@ fun RssSortRouteScreen( viewModel: RssSortViewModel = koinViewModel() ) { val context = LocalContext.current - val activity = LocalActivity.current as? AppCompatActivity val scope = rememberCoroutineScope() var sortList by remember(sourceUrl) { mutableStateOf>>(emptyList()) } @@ -52,6 +45,7 @@ fun RssSortRouteScreen( var showReadRecordSheet by remember { mutableStateOf(false) } var readRecords by remember { mutableStateOf>(emptyList()) } + var sourceVariableSheet by remember { mutableStateOf(null) } suspend fun reloadSourceState() { withContext(Dispatchers.IO) { @@ -83,6 +77,7 @@ fun RssSortRouteScreen( redirectPolicy = redirectPolicy, showReadRecordSheet = showReadRecordSheet, readRecords = readRecords, + sourceVariableSheet = sourceVariableSheet, onBackClick = onBackClick, onLogin = { context.startActivity { @@ -105,16 +100,19 @@ fun RssSortRouteScreen( } val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取") val variable = withContext(Dispatchers.IO) { source.getVariable() } - activity?.showDialogFragment( - VariableDialog( - setSourceVariableText, - source.getKey(), - variable, - comment - ) + sourceVariableSheet = RssSourceVariableSheetState( + title = setSourceVariableText, + variable = variable, + comment = comment ) } }, + onDismissSourceVariable = { sourceVariableSheet = null }, + onSaveSourceVariable = { variable -> + viewModel.setSourceVariable(variable) + sourceVariableSheet = null + context.toastOnUi(R.string.save_success) + }, onEditSource = { viewModel.rssSource?.sourceUrl?.let { srcUrl -> editSourceResult.launch { putExtra("sourceUrl", srcUrl) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt index c228f15b7..9629dc236 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -14,12 +15,15 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.FormatListBulleted import androidx.compose.material.icons.automirrored.filled.Login import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.CleaningServices import androidx.compose.material.icons.filled.Dataset +import androidx.compose.material.icons.filled.Done import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.History import androidx.compose.material.icons.filled.Refresh @@ -33,6 +37,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.runtime.Stable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -47,7 +52,9 @@ import io.legado.app.ui.rss.read.title import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.adaptiveHorizontalPaddingTab import io.legado.app.ui.widget.components.AppScaffold +import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.EmptyMessage +import io.legado.app.ui.widget.components.button.series.MediumPlainButton import io.legado.app.ui.widget.components.button.series.SmallPlainButton import io.legado.app.ui.widget.components.button.series.SmallToggleButton import io.legado.app.ui.widget.components.button.series.ToggleStyle @@ -65,6 +72,13 @@ import io.legado.app.ui.widget.components.topbar.TopBarActionButton import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton import kotlinx.coroutines.launch +@Stable +data class RssSourceVariableSheetState( + val title: String, + val variable: String, + val comment: String +) + @OptIn(ExperimentalMaterial3Api::class) @Composable fun RssSortScreen( @@ -75,10 +89,13 @@ fun RssSortScreen( redirectPolicy: RedirectPolicy, showReadRecordSheet: Boolean, readRecords: List, + sourceVariableSheet: RssSourceVariableSheetState?, onBackClick: () -> Unit, onLogin: () -> Unit, onRefreshSort: () -> Unit, onSetSourceVariable: () -> Unit, + onDismissSourceVariable: () -> Unit, + onSaveSourceVariable: (String) -> Unit, onEditSource: () -> Unit, onSwitchLayout: () -> Unit, onReadRecord: () -> Unit, @@ -305,6 +322,12 @@ fun RssSortScreen( onClear = onClearReadRecord, onOpen = onOpenReadRecord ) + + RssSourceVariableSheet( + state = sourceVariableSheet, + onDismissRequest = onDismissSourceVariable, + onSave = onSaveSourceVariable + ) } @Composable @@ -367,3 +390,48 @@ private fun RssReadRecordSheet( } } } + +@Composable +private fun RssSourceVariableSheet( + state: RssSourceVariableSheetState?, + onDismissRequest: () -> Unit, + onSave: (String) -> Unit +) { + var variable by remember(state) { mutableStateOf(state?.variable.orEmpty()) } + + AppModalBottomSheet( + data = state, + onDismissRequest = onDismissRequest, + title = state?.title, + endAction = { + MediumPlainButton( + onClick = { onSave(variable) }, + icon = Icons.Default.Done, + contentDescription = stringResource(R.string.ok) + ) + } + ) { sheetState -> + Column( + modifier = Modifier + .fillMaxWidth() + .verticalScroll(rememberScrollState()) + .navigationBarsPadding() + .padding(bottom = 32.dp) + ) { + AppText( + text = sheetState.comment, + style = LegadoTheme.typography.bodyMedium, + color = LegadoTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) + AppTextField( + value = variable, + onValueChange = { variable = it }, + modifier = Modifier.fillMaxWidth(), + minLines = 8 + ) + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt index c8cc464d6..70372fafd 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt @@ -75,6 +75,10 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { rssSource?.removeSortCache() } + fun setSourceVariable(variable: String?) { + rssSource?.setVariable(variable) + } + fun getRecords(): List { return appDb.rssReadRecordDao.getRecords() }