diff --git a/app/src/main/java/io/legado/app/di/appModule.kt b/app/src/main/java/io/legado/app/di/appModule.kt index e54a59861..b9b2116de 100644 --- a/app/src/main/java/io/legado/app/di/appModule.kt +++ b/app/src/main/java/io/legado/app/di/appModule.kt @@ -273,7 +273,8 @@ val appModule = module { readBookStyleConfigRepository = get(), readAloudSettingsRepository = get(), localPreferencesRepository = get(), - highlightRuleRepository = get() + highlightRuleRepository = get(), + uploadRepository = get() ) } viewModelOf(::ChangeCoverViewModel) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt index 24c97594f..2caac4397 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt @@ -1048,7 +1048,7 @@ class ReadBookController( } private fun upScreenTimeOut() { - val keepLightPrefer = viewModel.readPreferences.value.keepLight.toIntOrNull() ?: 0 + val keepLightPrefer = ReadConfig.keepLight.toLongOrNull() ?: 0L screenTimeOut = keepLightPrefer * 1000L screenOffTimerStartInternal() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt index 28bd3b769..21ff0a744 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt @@ -2300,7 +2300,7 @@ private fun ReadMenuLiquidSlider( val animationScope = rememberCoroutineScope() var didDrag by remember { mutableStateOf(false) } val isLtr = LocalLayoutDirection.current == LayoutDirection.Ltr - val dampedDragAnimation = remember(animationScope) { + val dampedDragAnimation = remember(animationScope, trackWidth, rangeStart, rangeEnd, isLtr) { DampedDragAnimation( animationScope = animationScope, initialValue = value(), @@ -3057,8 +3057,12 @@ private fun BrightnessBar( glassThumbEnabled: Boolean = false, ) { val activity = LocalActivity.current - var sliderValue by remember { mutableFloatStateOf(brightness.toFloat()) } - var sliderDragging by remember { mutableStateOf(false) } + var sliderValue by remember(vertical, buttonGlassEnabled) { + mutableFloatStateOf(brightness.toFloat()) + } + var sliderDragging by remember(vertical, buttonGlassEnabled) { + mutableStateOf(false) + } LaunchedEffect(brightness, brightnessAuto) { if (brightnessAuto) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 935dc9a78..606e88bd5 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -33,6 +33,7 @@ import io.legado.app.data.repository.ReadAloudSettingsRepository import io.legado.app.data.repository.ReadBookStyleConfigRepository import io.legado.app.data.repository.ReadPreferences import io.legado.app.data.repository.ReadSettingsRepository +import io.legado.app.data.repository.UploadRepository import io.legado.app.domain.model.ReadingProgress import io.legado.app.domain.usecase.GetReadingProgressUseCase import io.legado.app.domain.usecase.UploadReadingProgressUseCase @@ -137,6 +138,7 @@ class ReadBookViewModel( private val readAloudSettingsRepository: ReadAloudSettingsRepository, private val localPreferencesRepository: LocalPreferencesRepository, private val highlightRuleRepository: HighlightRuleRepository, + private val uploadRepository: UploadRepository, ) : BaseViewModel(application), ReadBook.CallBack { // --- MVI State --- @@ -847,11 +849,12 @@ class ReadBookViewModel( is ReadBookIntent.ExportAllHttpTtsAsUrl -> { execute { val json = exportHttpTtsJson() - val dataUrl = "data:application/json;base64," + Base64.encodeToString( - json.toByteArray(Charsets.UTF_8), - Base64.NO_WRAP + val url = uploadRepository.upload( + fileName = "httpTTS.json", + file = json, + contentType = "application/json" ) - "legado://import/httpTTS?src=" + URLEncoder.encode(dataUrl, "UTF-8") + "legado://import/httpTTS?src=" + URLEncoder.encode(url, "UTF-8") }.onSuccess { url -> context.sendToClip(url) _effects.tryEmit(ReadBookEffect.ShowToast(context.getString(R.string.copy_url))) @@ -2024,15 +2027,6 @@ class ReadBookViewModel( ReadBook.resetData(book) } _uiState.update { it.copy(isInitFinish = true) } - // 旋转后 ChapterProvider 的 doublePage/visibleWidth 已在 onSizeChanged 中更新, - // 但 ReloadContent 因 isInitFinish=false 被跳过。此处确保内容用新布局重新加载。 - if (isSameBook) { - _effects.tryEmit( - ReadBookEffect.UpdateReadViewConfig( - setOf(ConfigUpdateAction.UpdateLayout, ConfigUpdateAction.ReloadContent) - ) - ) - } if (!book.isLocal && book.tocUrl.isEmpty() && !loadBookInfo(book)) { return } diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt index b1f18a9b5..8e0d27f71 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/ContentEditSheet.kt @@ -79,7 +79,7 @@ fun ContentEditSheet( pendingLocateOffset = null return@LaunchedEffect } - val offset = locateOffset.coerceIn(0, layoutTextLength) + val offset = locateOffset.coerceIn(0, layoutTextLength - 1) val cursorTop = layoutResult.getCursorRect(offset).top.toInt() editorScrollState.scrollTo((cursorTop - 120).coerceIn(0, editorScrollState.maxValue)) pendingLocateOffset = null diff --git a/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt b/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt index 8292c959a..0b7d69b8a 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt @@ -5,10 +5,18 @@ import android.content.Intent import androidx.navigation3.runtime.NavKey import io.legado.app.ui.rss.article.MainRouteRssSort import io.legado.app.ui.rss.read.MainRouteRssRead +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch object MainNavigator { private var backNavigationInProgress = false + private val navigationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + private var backNavigationResetJob: Job? = null fun navigateToRoute(backStack: MutableList, route: NavKey) { val currentRoute = backStack.lastOrNull() @@ -186,8 +194,8 @@ object MainNavigator { if (backNavigationInProgress) { return } - backNavigationInProgress = true if (backStack.size > 1) { + backNavigationInProgress = true backStack.removeLastOrNull() } else { activity.finish() @@ -195,7 +203,11 @@ object MainNavigator { } fun onBackStackChanged() { - backNavigationInProgress = false + backNavigationResetJob?.cancel() + backNavigationResetJob = navigationScope.launch { + delay(500) + backNavigationInProgress = false + } } fun resolveStartRoute(intent: Intent?): NavKey {