[优化] 修复 WebDav 书籍的一些问题

This commit is contained in:
HapeLee
2026-04-20 00:09:47 +08:00
parent 0d1a374e6e
commit 8eaf7e4927
6 changed files with 33 additions and 24 deletions
@@ -8,7 +8,7 @@ import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.AppWebDav import io.legado.app.help.AppWebDav
import io.legado.app.help.book.getRemoteUrl import io.legado.app.help.book.getRemoteUrl
import io.legado.app.help.book.isLocal import io.legado.app.help.book.isLocal
import io.legado.app.help.config.AppConfig import io.legado.app.ui.config.importBookConfig.ImportBookConfig
import io.legado.app.lib.webdav.Authorization import io.legado.app.lib.webdav.Authorization
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.analyzeRule.CustomUrl import io.legado.app.model.analyzeRule.CustomUrl
@@ -32,7 +32,7 @@ class RemoteBookRepository(
} }
} }
val currentServerId = AppConfig.remoteServerId val currentServerId = ImportBookConfig.remoteServerId
if (currentServerId != AppConst.DEFAULT_WEBDAV_ID) { if (currentServerId != AppConst.DEFAULT_WEBDAV_ID) {
appDb.serverDao.get(currentServerId)?.getWebDavConfig()?.let { appDb.serverDao.get(currentServerId)?.getWebDavConfig()?.let {
return RemoteBookWebDav(it.url, Authorization(it), currentServerId) return RemoteBookWebDav(it.url, Authorization(it), currentServerId)
@@ -9,12 +9,10 @@ import io.legado.app.ui.book.manga.config.MangaScrollMode
import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory
import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.getPrefBoolean
import io.legado.app.utils.getPrefInt import io.legado.app.utils.getPrefInt
import io.legado.app.utils.getPrefLong
import io.legado.app.utils.getPrefString import io.legado.app.utils.getPrefString
import io.legado.app.utils.isNightMode import io.legado.app.utils.isNightMode
import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.putPrefBoolean
import io.legado.app.utils.putPrefInt import io.legado.app.utils.putPrefInt
import io.legado.app.utils.putPrefLong
import io.legado.app.utils.putPrefString import io.legado.app.utils.putPrefString
import io.legado.app.utils.removePref import io.legado.app.utils.removePref
import io.legado.app.utils.sysConfiguration import io.legado.app.utils.sysConfiguration
@@ -343,12 +341,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefInt(PreferKey.threadCount, value) appCtx.putPrefInt(PreferKey.threadCount, value)
} }
var remoteServerId: Long
get() = appCtx.getPrefLong(PreferKey.remoteServerId)
set(value) {
appCtx.putPrefLong(PreferKey.remoteServerId, value)
}
// 添加本地选择的目录 // 添加本地选择的目录
var importBookPath: String? var importBookPath: String?
get() = appCtx.getPrefString("importBookPath") get() = appCtx.getPrefString("importBookPath")
@@ -20,6 +20,7 @@ import io.legado.app.model.analyzeRule.CustomUrl
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.remote.RemoteBook import io.legado.app.model.remote.RemoteBook
import io.legado.app.model.remote.RemoteBookWebDav import io.legado.app.model.remote.RemoteBookWebDav
import io.legado.app.ui.config.importBookConfig.ImportBookConfig
import io.legado.app.ui.widget.components.list.InteractionState import io.legado.app.ui.widget.components.list.InteractionState
import io.legado.app.ui.widget.components.list.ListUiState import io.legado.app.ui.widget.components.list.ListUiState
import io.legado.app.ui.widget.components.list.SelectableItem import io.legado.app.ui.widget.components.list.SelectableItem
@@ -68,7 +69,7 @@ data class RemoteBookUiState(
val sortKey: RemoteBookSort = RemoteBookSort.Default, val sortKey: RemoteBookSort = RemoteBookSort.Default,
val sortAscending: Boolean = false, val sortAscending: Boolean = false,
val servers: List<Server> = emptyList(), val servers: List<Server> = emptyList(),
val selectedServerId: Long = AppConfig.remoteServerId val selectedServerId: Long = ImportBookConfig.remoteServerId
) : ListUiState<RemoteBookItemUi> { ) : ListUiState<RemoteBookItemUi> {
override val isSearch: Boolean get() = interaction.isSearchMode override val isSearch: Boolean get() = interaction.isSearchMode
override val isLoading: Boolean get() = interaction.isLoading override val isLoading: Boolean get() = interaction.isLoading
@@ -122,7 +123,7 @@ class RemoteBookViewModel(
val selectedIds: Set<String> = emptySet(), val selectedIds: Set<String> = emptySet(),
val remoteBookWebDav: RemoteBookWebDav? = null, val remoteBookWebDav: RemoteBookWebDav? = null,
val isDefaultWebdav: Boolean = false, val isDefaultWebdav: Boolean = false,
val selectedServerId: Long = AppConfig.remoteServerId val selectedServerId: Long = ImportBookConfig.remoteServerId
) )
private val _state = MutableStateFlow(InternalState()) private val _state = MutableStateFlow(InternalState())
@@ -212,13 +213,13 @@ class RemoteBookViewModel(
fun initData(onSuccess: () -> Unit) { fun initData(onSuccess: () -> Unit) {
viewModelScope.launch { viewModelScope.launch {
try { try {
val webDav = repository.createWebDav(AppConfig.remoteServerId) val webDav = repository.createWebDav(ImportBookConfig.remoteServerId)
if (webDav != null) { if (webDav != null) {
_state.update { _state.update {
it.copy( it.copy(
remoteBookWebDav = webDav, remoteBookWebDav = webDav,
isDefaultWebdav = false, isDefaultWebdav = false,
selectedServerId = AppConfig.remoteServerId selectedServerId = ImportBookConfig.remoteServerId
) )
} }
onSuccess() onSuccess()
@@ -498,7 +499,7 @@ class RemoteBookViewModel(
execute { execute {
appDb.serverDao.insert(server) appDb.serverDao.insert(server)
}.onSuccess { }.onSuccess {
if (AppConfig.remoteServerId == server.id) { if (ImportBookConfig.remoteServerId == server.id) {
initData { loadRemoteBookList() } initData { loadRemoteBookList() }
} }
} }
@@ -511,7 +512,7 @@ class RemoteBookViewModel(
} }
fun selectServer(serverId: Long) { fun selectServer(serverId: Long) {
AppConfig.remoteServerId = serverId ImportBookConfig.remoteServerId = serverId
_state.update { it.copy(selectedServerId = serverId, dirList = emptyList()) } _state.update { it.copy(selectedServerId = serverId, dirList = emptyList()) }
initData { loadRemoteBookList() } initData { loadRemoteBookList() }
} }
@@ -20,10 +20,10 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.Server import io.legado.app.data.entities.Server
import io.legado.app.databinding.DialogRecyclerViewBinding import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemServerSelectBinding import io.legado.app.databinding.ItemServerSelectBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
//import io.legado.app.lib.theme.backgroundColor //import io.legado.app.lib.theme.backgroundColor
//import io.legado.app.lib.theme.primaryColor //import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.config.importBookConfig.ImportBookConfig
import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.applyTint import io.legado.app.utils.applyTint
import io.legado.app.utils.setLayout import io.legado.app.utils.setLayout
@@ -70,7 +70,7 @@ class ServersDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
binding.tvFooterLeft.text = getString(R.string.text_default) binding.tvFooterLeft.text = getString(R.string.text_default)
binding.tvFooterLeft.visible() binding.tvFooterLeft.visible()
binding.tvFooterLeft.setOnClickListener { binding.tvFooterLeft.setOnClickListener {
AppConfig.remoteServerId = DEFAULT_WEBDAV_ID ImportBookConfig.remoteServerId = DEFAULT_WEBDAV_ID
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
binding.tvCancel.visible() binding.tvCancel.visible()
@@ -79,7 +79,7 @@ class ServersDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
} }
binding.tvOk.visible() binding.tvOk.visible()
binding.tvOk.setOnClickListener { binding.tvOk.setOnClickListener {
AppConfig.remoteServerId = adapter.selectServerId ImportBookConfig.remoteServerId = adapter.selectServerId
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
} }
@@ -109,7 +109,7 @@ class ServersDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
inner class ServersAdapter(context: Context) : inner class ServersAdapter(context: Context) :
RecyclerAdapter<Server, ItemServerSelectBinding>(context) { RecyclerAdapter<Server, ItemServerSelectBinding>(context) {
var selectServerId: Long = AppConfig.remoteServerId var selectServerId: Long = ImportBookConfig.remoteServerId
override fun getViewBinding(parent: ViewGroup): ItemServerSelectBinding { override fun getViewBinding(parent: ViewGroup): ItemServerSelectBinding {
return ItemServerSelectBinding.inflate(inflater, parent, false) return ItemServerSelectBinding.inflate(inflater, parent, false)
@@ -24,4 +24,9 @@ object ImportBookConfig {
PreferKey.localBookImportSort, PreferKey.localBookImportSort,
0 0
) )
var remoteServerId by prefDelegate(
PreferKey.remoteServerId,
0L
)
} }
@@ -34,6 +34,7 @@ fun AppTheme(
val composeEngine = ThemeConfig.composeEngine val composeEngine = ThemeConfig.composeEngine
val useMiuixMonet = ThemeConfig.useMiuixMonet val useMiuixMonet = ThemeConfig.useMiuixMonet
val customPrimary = ThemeConfig.cPrimary val customPrimary = ThemeConfig.cPrimary
val customNightPrimary = ThemeConfig.cNPrimary
val colorSchemeMode = ThemeResolver.resolveColorSchemeMode(themeModeValue) val colorSchemeMode = ThemeResolver.resolveColorSchemeMode(themeModeValue)
val miuixColorSchemeMode = remember(themeModeValue, useMiuixMonet) { val miuixColorSchemeMode = remember(themeModeValue, useMiuixMonet) {
ThemeResolver.resolveMiuixColorSchemeMode(themeModeValue, useMiuixMonet) ThemeResolver.resolveMiuixColorSchemeMode(themeModeValue, useMiuixMonet)
@@ -47,21 +48,31 @@ fun AppTheme(
appThemeMode, appThemeMode,
darkTheme, darkTheme,
isPureBlack, isPureBlack,
customPrimary,
customNightPrimary,
paletteStyleValue, paletteStyleValue,
materialVersion materialVersion
) { ) {
val customSeedColor = if (darkTheme) customNightPrimary else customPrimary
ThemeEngine.getColorScheme( ThemeEngine.getColorScheme(
context = context, context = context,
mode = appThemeMode, mode = appThemeMode,
darkTheme = darkTheme, darkTheme = darkTheme,
isAmoled = isPureBlack, isAmoled = isPureBlack,
paletteStyle = paletteStyleValue, paletteStyle = paletteStyleValue,
materialVersion = materialVersion materialVersion = materialVersion,
customSeedColor = customSeedColor
) )
} }
val customSeedColor = remember(customPrimary, colorScheme.primary) { val customSeedColor = remember(
if (customPrimary != 0) Color(customPrimary) else colorScheme.primary darkTheme,
customPrimary,
customNightPrimary,
colorScheme.primary
) {
val seed = if (darkTheme) customNightPrimary else customPrimary
if (seed != 0) Color(seed) else colorScheme.primary
} }
val themeSeedColor = remember(appThemeMode, customSeedColor, colorScheme.primary) { val themeSeedColor = remember(appThemeMode, customSeedColor, colorScheme.primary) {
if (appThemeMode == AppThemeMode.Custom) customSeedColor else colorScheme.primary if (appThemeMode == AppThemeMode.Custom) customSeedColor else colorScheme.primary