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

feat:阅读设置里增加按钮切换新旧目录显示

todoXu 3 месяцев назад
Родитель
Сommit
c013cb43b7

+ 1 - 0
app/src/main/java/io/legado/app/constant/PreferKey.kt

@@ -383,6 +383,7 @@ object PreferKey {
     const val bookshelfShowLatestChapter = "bookshelfShowLatestChapter"
     const val bookshelfShowLatestChapter = "bookshelfShowLatestChapter"
     const val bookshelfIntroMaxLines = "bookshelfIntroMaxLines"
     const val bookshelfIntroMaxLines = "bookshelfIntroMaxLines"
     const val sliderVibrator = "sliderVibrator"
     const val sliderVibrator = "sliderVibrator"
+    const val useNewTocSheet = "useNewTocSheet"
     const val selectVibrator = "selectVibrator"
     const val selectVibrator = "selectVibrator"
     const val audioCacheCleanTime = "audioCacheCleanTime"
     const val audioCacheCleanTime = "audioCacheCleanTime"
     const val audioPreDownloadNum = "audioPreDownloadNum"
     const val audioPreDownloadNum = "audioPreDownloadNum"

+ 6 - 0
app/src/main/java/io/legado/app/data/repository/ReadSettingsRepository.kt

@@ -122,6 +122,9 @@ class ReadSettingsRepository(
     suspend fun setSliderVibrator(value: Boolean) =
     suspend fun setSliderVibrator(value: Boolean) =
         settingsRepository.putBoolean(PreferKey.sliderVibrator, value)
         settingsRepository.putBoolean(PreferKey.sliderVibrator, value)
 
 
+    suspend fun setUseNewTocSheet(value: Boolean) =
+        settingsRepository.putBoolean(PreferKey.useNewTocSheet, value)
+
     suspend fun setSelectVibrator(value: Boolean) =
     suspend fun setSelectVibrator(value: Boolean) =
         settingsRepository.putBoolean(PreferKey.selectVibrator, value)
         settingsRepository.putBoolean(PreferKey.selectVibrator, value)
 
 
@@ -358,6 +361,7 @@ class ReadSettingsRepository(
             keyPageOnLongPress = compatDsValue(Keys.KeyPageOnLongPress, false),
             keyPageOnLongPress = compatDsValue(Keys.KeyPageOnLongPress, false),
             pageTouchSlop = compatDsValue(Keys.PageTouchSlop, 0),
             pageTouchSlop = compatDsValue(Keys.PageTouchSlop, 0),
             sliderVibrator = compatDsValue(Keys.SliderVibrator, false),
             sliderVibrator = compatDsValue(Keys.SliderVibrator, false),
+            useNewTocSheet = compatDsValue(Keys.UseNewTocSheet, true),
             selectVibrator = compatDsValue(Keys.SelectVibrator, false),
             selectVibrator = compatDsValue(Keys.SelectVibrator, false),
             autoChangeSource = compatDsValue(Keys.AutoChangeSource, true),
             autoChangeSource = compatDsValue(Keys.AutoChangeSource, true),
             autoSuggestDayNight = compatDsValue(Keys.AutoSuggestDayNight, false),
             autoSuggestDayNight = compatDsValue(Keys.AutoSuggestDayNight, false),
@@ -470,6 +474,7 @@ class ReadSettingsRepository(
         val KeyPageOnLongPress = booleanPreferencesKey(PreferKey.keyPageOnLongPress)
         val KeyPageOnLongPress = booleanPreferencesKey(PreferKey.keyPageOnLongPress)
         val PageTouchSlop = intPreferencesKey(PreferKey.pageTouchSlop)
         val PageTouchSlop = intPreferencesKey(PreferKey.pageTouchSlop)
         val SliderVibrator = booleanPreferencesKey(PreferKey.sliderVibrator)
         val SliderVibrator = booleanPreferencesKey(PreferKey.sliderVibrator)
+        val UseNewTocSheet = booleanPreferencesKey(PreferKey.useNewTocSheet)
         val SelectVibrator = booleanPreferencesKey(PreferKey.selectVibrator)
         val SelectVibrator = booleanPreferencesKey(PreferKey.selectVibrator)
         val AutoChangeSource = booleanPreferencesKey(PreferKey.autoChangeSource)
         val AutoChangeSource = booleanPreferencesKey(PreferKey.autoChangeSource)
         val AutoSuggestDayNight = booleanPreferencesKey(PreferKey.autoSuggestDayNight)
         val AutoSuggestDayNight = booleanPreferencesKey(PreferKey.autoSuggestDayNight)
@@ -584,6 +589,7 @@ internal fun ReadSettings.toGatewayPrefMap(): Map<String, Any?> = mapOf(
     PreferKey.keyPageOnLongPress to keyPageOnLongPress,
     PreferKey.keyPageOnLongPress to keyPageOnLongPress,
     PreferKey.pageTouchSlop to pageTouchSlop,
     PreferKey.pageTouchSlop to pageTouchSlop,
     PreferKey.sliderVibrator to sliderVibrator,
     PreferKey.sliderVibrator to sliderVibrator,
+    PreferKey.useNewTocSheet to useNewTocSheet,
     PreferKey.selectVibrator to selectVibrator,
     PreferKey.selectVibrator to selectVibrator,
     PreferKey.autoChangeSource to autoChangeSource,
     PreferKey.autoChangeSource to autoChangeSource,
     PreferKey.autoSuggestDayNight to autoSuggestDayNight,
     PreferKey.autoSuggestDayNight to autoSuggestDayNight,

+ 1 - 0
app/src/main/java/io/legado/app/domain/model/settings/ReadSettings.kt

@@ -31,6 +31,7 @@ data class ReadSettings(
     val keyPageOnLongPress: Boolean = false,
     val keyPageOnLongPress: Boolean = false,
     val pageTouchSlop: Int = 0,
     val pageTouchSlop: Int = 0,
     val sliderVibrator: Boolean = false,
     val sliderVibrator: Boolean = false,
+    val useNewTocSheet: Boolean = true,
     val selectVibrator: Boolean = false,
     val selectVibrator: Boolean = false,
     val autoChangeSource: Boolean = true,
     val autoChangeSource: Boolean = true,
     val autoSuggestDayNight: Boolean = false,
     val autoSuggestDayNight: Boolean = false,

+ 2 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt

@@ -889,6 +889,8 @@ sealed interface ReadBookEffect {
     // Source actions
     // Source actions
     data class ShowLogin(val sourceUrl: String) : ReadBookEffect
     data class ShowLogin(val sourceUrl: String) : ReadBookEffect
     data class OpenSourceEdit(val sourceUrl: String) : ReadBookEffect
     data class OpenSourceEdit(val sourceUrl: String) : ReadBookEffect
+    data class OpenBookInfo(val name: String, val author: String, val bookUrl: String) : ReadBookEffect
+    data class OpenChapterList(val bookUrl: String) : ReadBookEffect
     data class OpenWebView(
     data class OpenWebView(
         val title: String,
         val title: String,
         val url: String,
         val url: String,

+ 2 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt

@@ -1054,6 +1054,8 @@ class ReadBookController(
 
 
             // Launcher-dependent effects — handled by route layer, ignored here
             // Launcher-dependent effects — handled by route layer, ignored here
             is ReadBookEffect.OpenSourceEdit,
             is ReadBookEffect.OpenSourceEdit,
+            is ReadBookEffect.OpenChapterList,
+            is ReadBookEffect.OpenBookInfo,
             is ReadBookEffect.OpenSearchActivity,
             is ReadBookEffect.OpenSearchActivity,
             is ReadBookEffect.ShowLogin,
             is ReadBookEffect.ShowLogin,
             is ReadBookEffect.OpenWebView,
             is ReadBookEffect.OpenWebView,

+ 16 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookRouteScreen.kt

@@ -58,6 +58,7 @@ import io.legado.app.ui.book.read.sheet.ReaderBookSheetRoute
 import io.legado.app.ui.book.read.sheet.TextSelectMenuConfigSheet
 import io.legado.app.ui.book.read.sheet.TextSelectMenuConfigSheet
 import io.legado.app.ui.book.searchContent.SearchContentResult
 import io.legado.app.ui.book.searchContent.SearchContentResult
 import io.legado.app.ui.book.source.edit.BookSourceEditActivity
 import io.legado.app.ui.book.source.edit.BookSourceEditActivity
+import io.legado.app.ui.book.toc.TocActivityResult
 import io.legado.app.ui.browser.WebViewActivity
 import io.legado.app.ui.browser.WebViewActivity
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.replace.ReplaceEditRoute
 import io.legado.app.ui.replace.ReplaceEditRoute
@@ -181,6 +182,11 @@ fun ReadBookRouteScreen(
             viewModel.onIntent(ReadBookIntent.SourceEditResult)
             viewModel.onIntent(ReadBookIntent.SourceEditResult)
         }
         }
     }
     }
+    val tocLauncher = rememberLauncherForActivityResult(TocActivityResult()) { result ->
+        result?.let { (index, chapterPos, _) ->
+            viewModel.onIntent(ReadBookIntent.OpenChapterResult(index, chapterPos))
+        }
+    }
 
 
     val replaceLauncher = rememberLauncherForActivityResult(
     val replaceLauncher = rememberLauncherForActivityResult(
         ActivityResultContracts.StartActivityForResult()
         ActivityResultContracts.StartActivityForResult()
@@ -319,6 +325,16 @@ fun ReadBookRouteScreen(
                             is ReadBookEffect.OpenSourceEdit -> {
                             is ReadBookEffect.OpenSourceEdit -> {
                                 sourceEditLauncher.launch { putExtra("sourceUrl", effect.sourceUrl) }
                                 sourceEditLauncher.launch { putExtra("sourceUrl", effect.sourceUrl) }
                             }
                             }
+                            is ReadBookEffect.OpenChapterList -> {
+                                tocLauncher.launch(effect.bookUrl)
+                            }
+                            is ReadBookEffect.OpenBookInfo -> {
+                                bookInfoLauncher.launch {
+                                    putExtra("name", effect.name)
+                                    putExtra("author", effect.author)
+                                    putExtra("bookUrl", effect.bookUrl)
+                                }
+                            }
                             is ReadBookEffect.ShowLogin -> {
                             is ReadBookEffect.ShowLogin -> {
                                 context.startActivity(
                                 context.startActivity(
                                     Intent(context, SourceLoginActivity::class.java).apply {
                                     Intent(context, SourceLoginActivity::class.java).apply {

+ 25 - 10
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -667,25 +667,40 @@ class ReadBookViewModel(
             is ReadBookIntent.OpenBookInfo -> {
             is ReadBookIntent.OpenBookInfo -> {
                 if (ReadBook.book != null) {
                 if (ReadBook.book != null) {
                     closeReadMenu()
                     closeReadMenu()
-                    _uiState.update {
-                        it.copy(
-                            activeSheet = ReadBookSheet.BookNavigation(
-                                io.legado.app.ui.book.read.sheet.ReaderBookSheetTab.Information
+                    if (readSettingsRepository.currentSettings.useNewTocSheet) {
+                        _uiState.update {
+                            it.copy(
+                                activeSheet = ReadBookSheet.BookNavigation(
+                                    io.legado.app.ui.book.read.sheet.ReaderBookSheetTab.Information
+                                )
                             )
                             )
-                        )
+                        }
+                    } else{
+                        ReadBook.book?.let { book ->
+                            _effects.tryEmit(ReadBookEffect.OpenBookInfo(book.name, book.author, book.bookUrl))
+                        }
                     }
                     }
+
                 }
                 }
             }
             }
             is ReadBookIntent.OpenChapterList -> {
             is ReadBookIntent.OpenChapterList -> {
                 if (ReadBook.book != null) {
                 if (ReadBook.book != null) {
                     closeReadMenu()
                     closeReadMenu()
-                    _uiState.update { state ->
-                        state.copy(
-                            activeSheet = ReadBookSheet.BookNavigation(
-                                io.legado.app.ui.book.read.sheet.ReaderBookSheetTab.Toc
+                    if (readSettingsRepository.currentSettings.useNewTocSheet)
+                    {
+                        _uiState.update { state ->
+                            state.copy(
+                                activeSheet = ReadBookSheet.BookNavigation(
+                                    io.legado.app.ui.book.read.sheet.ReaderBookSheetTab.Toc
+                                )
                             )
                             )
-                        )
+                        }
+                    }else{
+                        ReadBook.book?.bookUrl?.let { bookUrl ->
+                            _effects.tryEmit(ReadBookEffect.OpenChapterList(bookUrl))
+                        }
                     }
                     }
+
                 }
                 }
             }
             }
             is ReadBookIntent.OpenChapterUrl -> openChapterUrl()
             is ReadBookIntent.OpenChapterUrl -> openChapterUrl()

+ 1 - 0
app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfig.kt

@@ -76,6 +76,7 @@ object ReadConfig {
     val volumeKeyPageOnPlay get() = read.volumeKeyPageOnPlay
     val volumeKeyPageOnPlay get() = read.volumeKeyPageOnPlay
     val keyPageOnLongPress get() = read.keyPageOnLongPress
     val keyPageOnLongPress get() = read.keyPageOnLongPress
     val sliderVibrator get() = read.sliderVibrator
     val sliderVibrator get() = read.sliderVibrator
+    val useNewTocSheet get() = read.useNewTocSheet
     val selectVibrator get() = read.selectVibrator
     val selectVibrator get() = read.selectVibrator
 
 
     val speechRatePlay get() = if (aloud.ttsFollowSys) 5 else aloud.ttsSpeechRate
     val speechRatePlay get() = if (aloud.ttsFollowSys) 5 else aloud.ttsSpeechRate

+ 2 - 0
app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigContract.kt

@@ -32,6 +32,7 @@ data class ReadConfigUiState(
     val keyPageOnLongPress: Boolean = false,
     val keyPageOnLongPress: Boolean = false,
     val pageTouchSlop: Int = 0,
     val pageTouchSlop: Int = 0,
     val sliderVibrator: Boolean = false,
     val sliderVibrator: Boolean = false,
+    val useNewTocSheet: Boolean = true,
     val selectVibrator: Boolean = false,
     val selectVibrator: Boolean = false,
     val autoChangeSource: Boolean = true,
     val autoChangeSource: Boolean = true,
     val autoSuggestDayNight: Boolean = false,
     val autoSuggestDayNight: Boolean = false,
@@ -92,6 +93,7 @@ sealed interface ReadConfigIntent {
     data class KeyPageOnLongPressChanged(val value: Boolean) : ReadConfigIntent
     data class KeyPageOnLongPressChanged(val value: Boolean) : ReadConfigIntent
     data class PageTouchSlopChanged(val value: Int) : ReadConfigIntent
     data class PageTouchSlopChanged(val value: Int) : ReadConfigIntent
     data class SliderVibratorChanged(val value: Boolean) : ReadConfigIntent
     data class SliderVibratorChanged(val value: Boolean) : ReadConfigIntent
+    data class UseNewTocSheetChanged(val value: Boolean) : ReadConfigIntent
     data class SelectVibratorChanged(val value: Boolean) : ReadConfigIntent
     data class SelectVibratorChanged(val value: Boolean) : ReadConfigIntent
     data class AutoChangeSourceChanged(val value: Boolean) : ReadConfigIntent
     data class AutoChangeSourceChanged(val value: Boolean) : ReadConfigIntent
     data class SelectTextChanged(val value: Boolean) : ReadConfigIntent
     data class SelectTextChanged(val value: Boolean) : ReadConfigIntent

+ 8 - 0
app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigScreen.kt

@@ -297,6 +297,14 @@ fun ReadConfigScreen(
                     }
                     }
                 )
                 )
 
 
+                SwitchSettingItem(
+                    title = stringResource(R.string.use_new_toc_sheet),
+                    checked = settings.useNewTocSheet,
+                    onCheckedChange = {
+                        onIntent(ReadConfigIntent.UseNewTocSheetChanged(it))
+                    }
+                )
+
                 SwitchSettingItem(
                 SwitchSettingItem(
                     title = stringResource(R.string.enable_select_vibrator),
                     title = stringResource(R.string.enable_select_vibrator),
                     checked = settings.selectVibrator,
                     checked = settings.selectVibrator,

+ 2 - 0
app/src/main/java/io/legado/app/ui/config/readConfig/ReadConfigViewModel.kt

@@ -129,6 +129,7 @@ private fun ReadConfigIntent.toSettingsTransform(): (ReadSettings) -> ReadSettin
     is ReadConfigIntent.KeyPageOnLongPressChanged -> { settings -> settings.copy(keyPageOnLongPress = value) }
     is ReadConfigIntent.KeyPageOnLongPressChanged -> { settings -> settings.copy(keyPageOnLongPress = value) }
     is ReadConfigIntent.PageTouchSlopChanged -> { settings -> settings.copy(pageTouchSlop = value) }
     is ReadConfigIntent.PageTouchSlopChanged -> { settings -> settings.copy(pageTouchSlop = value) }
     is ReadConfigIntent.SliderVibratorChanged -> { settings -> settings.copy(sliderVibrator = value) }
     is ReadConfigIntent.SliderVibratorChanged -> { settings -> settings.copy(sliderVibrator = value) }
+    is ReadConfigIntent.UseNewTocSheetChanged -> { settings -> settings.copy(useNewTocSheet = value) }
     is ReadConfigIntent.SelectVibratorChanged -> { settings -> settings.copy(selectVibrator = value) }
     is ReadConfigIntent.SelectVibratorChanged -> { settings -> settings.copy(selectVibrator = value) }
     is ReadConfigIntent.AutoChangeSourceChanged -> { settings -> settings.copy(autoChangeSource = value) }
     is ReadConfigIntent.AutoChangeSourceChanged -> { settings -> settings.copy(autoChangeSource = value) }
     is ReadConfigIntent.AutoSuggestDayNightChanged -> { settings -> settings.copy(autoSuggestDayNight = value) }
     is ReadConfigIntent.AutoSuggestDayNightChanged -> { settings -> settings.copy(autoSuggestDayNight = value) }
@@ -196,6 +197,7 @@ private fun ReadSettings.toUiState(
         keyPageOnLongPress = keyPageOnLongPress,
         keyPageOnLongPress = keyPageOnLongPress,
         pageTouchSlop = pageTouchSlop,
         pageTouchSlop = pageTouchSlop,
         sliderVibrator = sliderVibrator,
         sliderVibrator = sliderVibrator,
+        useNewTocSheet = useNewTocSheet,
         selectVibrator = selectVibrator,
         selectVibrator = selectVibrator,
         autoChangeSource = autoChangeSource,
         autoChangeSource = autoChangeSource,
         autoSuggestDayNight = autoSuggestDayNight,
         autoSuggestDayNight = autoSuggestDayNight,

+ 1 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -1740,6 +1740,7 @@
     <string name="cover_show_stroke">显示字体描边</string>
     <string name="cover_show_stroke">显示字体描边</string>
     <string name="default_color">使用默认字体颜色</string>
     <string name="default_color">使用默认字体颜色</string>
     <string name="enable_slider_vibrator">滑动进度条时震动</string>
     <string name="enable_slider_vibrator">滑动进度条时震动</string>
+    <string name="use_new_toc_sheet">使用新版目录</string>
     <string name="edit_remark">编辑备注</string>
     <string name="edit_remark">编辑备注</string>
     <string name="book_remark">书籍备注</string>
     <string name="book_remark">书籍备注</string>
     <string name="save_to_local">保存至本地</string>
     <string name="save_to_local">保存至本地</string>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1802,6 +1802,7 @@
     <string name="cover_show_stroke">Show Font Stroke</string>
     <string name="cover_show_stroke">Show Font Stroke</string>
     <string name="default_color">Use Default Font Color</string>
     <string name="default_color">Use Default Font Color</string>
     <string name="enable_slider_vibrator">Vibrate While Sliding Progress Bar</string>
     <string name="enable_slider_vibrator">Vibrate While Sliding Progress Bar</string>
+    <string name="use_new_toc_sheet">Use New TOC Sheet</string>
     <string name="edit_remark">Edit remark</string>
     <string name="edit_remark">Edit remark</string>
     <string name="book_remark">Book Alias</string>
     <string name="book_remark">Book Alias</string>
     <string name="save_to_local">Save to local</string>
     <string name="save_to_local">Save to local</string>