Răsfoiți Sursa

feat: 优化听书样式

HapeLee 3 luni în urmă
părinte
comite
e9a1009cde

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

@@ -57,7 +57,6 @@ sealed interface ReadBookMenuRoute {
     data object Main : ReadBookMenuRoute
     data object ReadStyle : ReadBookMenuRoute
     data object TextTitle : ReadBookMenuRoute
-    data object ReadAloud : ReadBookMenuRoute
     data object AutoRead : ReadBookMenuRoute
     data object PaddingConfig : ReadBookMenuRoute
     data object HeaderFooterConfig : ReadBookMenuRoute
@@ -974,6 +973,7 @@ sealed interface ReadBookSheet {
     data object MoreConfig : ReadBookSheet
     data object BgTextConfig : ReadBookSheet
     data object ReadAloudConfig : ReadBookSheet
+    data object ReadAloudControls : ReadBookSheet
     data object ReadAloudPlayer : ReadBookSheet
     data object SpeakEngineConfig : ReadBookSheet
     data class HttpTtsEdit(val engineId: Long? = null) : ReadBookSheet

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

@@ -319,7 +319,7 @@ class ReadBookController(
         val state = viewModel.uiState.value
         when {
             BaseReadAloudService.isRun -> viewModel.onIntent(
-                ReadBookIntent.OpenReadMenuRoute(ReadBookMenuRoute.ReadAloud)
+                ReadBookIntent.ReadAloudAction
             )
 
             isAutoPage -> {

+ 4 - 35
app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt

@@ -160,7 +160,6 @@ import io.legado.app.ui.animation.DampedDragAnimation
 import io.legado.app.ui.book.read.sheet.AutoReadContent
 import io.legado.app.ui.book.read.sheet.HeaderFooterPage
 import io.legado.app.ui.book.read.sheet.PaddingConfigContent
-import io.legado.app.ui.book.read.sheet.ReadAloudContent
 import io.legado.app.ui.book.read.sheet.ReadMenuButtonInfo
 import io.legado.app.ui.book.read.sheet.ReadStyleContent
 import io.legado.app.ui.book.read.sheet.ReadStyleTextTitleContent
@@ -788,36 +787,6 @@ private fun ReadBookMenuSurface(
                         }
                     }
 
-                    ReadBookMenuRoute.ReadAloud -> {
-                        ReadBookMenuRoutePage(
-                            title = stringResource(R.string.aloud_config),
-                            maxHeight = maxHeight,
-                            scrollContent = true,
-                            bottomPadding = if (extendSurfaceToNavigationBar) navBarHeight else 0.dp,
-                            onBack = { onIntent(ReadBookIntent.ReadMenuBack) },
-                        ) {
-                            ReadAloudContent(
-                                state = state,
-                                onIntent = onIntent,
-                                onDismissRequest = { onIntent(ReadBookIntent.HideMenu) },
-                                onOpenChapterList = {
-                                    onIntent(ReadBookIntent.HideMenu)
-                                    onIntent(ReadBookIntent.OpenChapterList)
-                                },
-                                onGoToBackground = {
-                                    onIntent(ReadBookIntent.CloseReadBook(keepReadAloud = true))
-                                },
-                                onOpenMainMenu = {
-                                    onIntent(ReadBookIntent.ReadMenuBack)
-                                },
-                                onShowReadAloudConfig = {
-                                    onIntent(ReadBookIntent.ShowReadAloudConfig)
-                                },
-                                modifier = Modifier.padding(horizontal = 16.dp),
-                            )
-                        }
-                    }
-
                 ReadBookMenuRoute.AutoRead -> {
                     ReadBookMenuRoutePage(
                         title = stringResource(R.string.auto_page_speed),
@@ -3085,11 +3054,11 @@ private fun loadToolButtons(
         infoMap.getValue("read_aloud").toButton(
             isActive = state.isReadAloudRunning,
             onLongClick = {
-                onIntent(ReadBookIntent.OpenReadMenuRoute(ReadBookMenuRoute.ReadAloud))
+                onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.ReadAloudControls))
             },
         ) {
             if (state.isReadAloudRunning) {
-                onIntent(ReadBookIntent.OpenReadMenuRoute(ReadBookMenuRoute.ReadAloud))
+                onIntent(ReadBookIntent.ReadAloudAction)
             } else {
                 onIntent(ReadBookIntent.ToggleReadAloud)
                 onIntent(ReadBookIntent.HideMenu)
@@ -3351,7 +3320,7 @@ private fun loadFloatingIcons(
         "catalog" to { onIntent(ReadBookIntent.OpenChapterList) },
         "read_aloud" to {
             if (state.isReadAloudRunning) {
-                onIntent(ReadBookIntent.OpenReadMenuRoute(ReadBookMenuRoute.ReadAloud))
+                onIntent(ReadBookIntent.ReadAloudAction)
             } else {
                 onIntent(ReadBookIntent.ToggleReadAloud)
                 onIntent(ReadBookIntent.HideMenu)
@@ -3400,7 +3369,7 @@ private fun loadFloatingIcons(
                 onClick = actionMap[id] ?: {},
                 onLongClick = when (id) {
                     "read_aloud" -> {
-                        { onIntent(ReadBookIntent.OpenReadMenuRoute(ReadBookMenuRoute.ReadAloud)) }
+                        { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.ReadAloudControls)) }
                     }
 
                     "replace" -> {

+ 30 - 16
app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt

@@ -35,19 +35,18 @@ import io.legado.app.ui.book.read.sheet.MoreConfigSheet
 import io.legado.app.ui.book.read.sheet.PageAnimConfigSheet
 import io.legado.app.ui.book.read.sheet.PageKeyConfigSheet
 import io.legado.app.ui.book.read.sheet.PhotoSheet
-import io.legado.app.ui.book.read.sheet.ReadAloudConfigSheet
 import io.legado.app.ui.book.read.sheet.ReadAloudNumberConfigSheet
+import io.legado.app.ui.book.read.sheet.ReadAloudPage
+import io.legado.app.ui.book.read.sheet.ReadAloudScreen
 import io.legado.app.ui.book.read.sheet.ShadowSetSheet
 import io.legado.app.ui.book.read.sheet.SimulatedReadingSheet
 import io.legado.app.ui.book.read.sheet.SpeakEngineConfigSheet
 import io.legado.app.ui.book.read.sheet.ToolButtonConfigSheet
 import io.legado.app.ui.book.read.sheet.UnderlineConfigSheet
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerEffect
-import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerSheet
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerViewModel
 import io.legado.app.ui.dict.DictSheet
 import io.legado.app.ui.theme.LegadoTheme
-import io.legado.app.ui.theme.ProvideThemeOverride
 import io.legado.app.ui.theme.rememberImageSeedColor
 import io.legado.app.ui.theme.rememberThemeOverride
 import io.legado.app.ui.widget.components.FontFolderState
@@ -308,12 +307,6 @@ fun ReadBookScreen(
         },
         onOpenTextSelectMenuConfig = onOpenTextSelectMenuConfig,
     )
-    ReadAloudConfigSheet(
-        show = state.activeSheet is ReadBookSheet.ReadAloudConfig,
-        state = state,
-        onIntent = onIntent,
-        onDismissRequest = dismissSheet,
-    )
     SpeakEngineConfigSheet(
         show = state.activeSheet is ReadBookSheet.SpeakEngineConfig,
         state = state,
@@ -444,16 +437,37 @@ fun ReadBookScreen(
         }
         rememberThemeOverride(seedColor)
     }
-    ProvideThemeOverride(playerTheme.takeIf { state.activeSheet is ReadBookSheet.ReadAloudPlayer }) {
-        ReadAloudPlayerSheet(
-            show = state.activeSheet is ReadBookSheet.ReadAloudPlayer,
-            onDismissRequest = dismissSheet,
-            state = aloudPlayerState,
-            onIntent = aloudPlayerViewModel::onIntent,
-        )
+    val readAloudPage = when (state.activeSheet) {
+        ReadBookSheet.ReadAloudControls -> ReadAloudPage.Controls
+        ReadBookSheet.ReadAloudConfig -> ReadAloudPage.Config
+        ReadBookSheet.ReadAloudPlayer -> ReadAloudPage.Player
+        else -> null
     }
+    ReadAloudScreen(
+        page = readAloudPage,
+        state = state,
+        playerState = aloudPlayerState,
+        playerTheme = playerTheme,
+        onIntent = onIntent,
+        onPlayerIntent = aloudPlayerViewModel::onIntent,
+        onDismissRequest = dismissSheet,
+        onOpenChapterList = {
+            onIntent(ReadBookIntent.DismissSheet)
+            onIntent(ReadBookIntent.OpenChapterList)
+        },
+        onGoToBackground = {
+            onIntent(ReadBookIntent.CloseReadBook(keepReadAloud = true))
+        },
+        onOpenMainMenu = {
+            onIntent(ReadBookIntent.DismissSheet)
+            onIntent(ReadBookIntent.ShowMenu)
+        },
+    )
     LaunchedEffect(state.activeSheet) {
         if (state.activeSheet is ReadBookSheet.ReadAloudPlayer) {
+            aloudPlayerViewModel.onIntent(
+                io.legado.app.ui.book.readaloud.player.ReadAloudPlayerIntent.Refresh
+            )
             aloudPlayerViewModel.effects.collectLatest { effect ->
                 when (effect) {
                     ReadAloudPlayerEffect.OpenToc -> onIntent(ReadBookIntent.OpenChapterList)

+ 30 - 22
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -396,7 +396,7 @@ class ReadBookViewModel(
 
             is ReadBookIntent.ToggleReadAloud -> {
                 if (!BaseReadAloudService.isRun) {
-                    openReadMenuRoute(ReadBookMenuRoute.ReadAloud)
+                    openDefaultReadAloudInterface()
                 }
                 _effects.tryEmit(ReadBookEffect.ToggleReadAloud)
             }
@@ -532,7 +532,19 @@ class ReadBookViewModel(
             }
 
             is ReadBookIntent.ShowSheet -> {
-                if (intent.sheet is ReadBookSheet.HighlightRuleConfig) {
+                if (intent.sheet is ReadBookSheet.ReadAloudControls) {
+                    _uiState.update {
+                        it.copy(
+                            menuState = ReadBookMenuState(),
+                            activeSheet = intent.sheet,
+                            readAloudTtsTimer = if (BaseReadAloudService.isRun) {
+                                BaseReadAloudService.timeMinute.coerceAtLeast(0)
+                            } else {
+                                it.readAloudTtsTimer
+                            },
+                        )
+                    }
+                } else if (intent.sheet is ReadBookSheet.HighlightRuleConfig) {
                     loadHighlightRules()
                     _uiState.update { it.copy(activeSheet = intent.sheet) }
                 } else if (intent.sheet is ReadBookSheet.ContentProcesses) {
@@ -926,17 +938,7 @@ class ReadBookViewModel(
             }
 
             is ReadBookIntent.TtsProgress -> updateReadAloudProgress(intent.chapterStart)
-            is ReadBookIntent.ReadAloudAction -> {
-                if (_uiState.value.defaultReadAloudInterface ==
-                    ReadAloudSettingsRepository.DEFAULT_INTERFACE_PLAYER
-                ) {
-                    _uiState.update {
-                        it.copy(menuState = ReadBookMenuState(), activeSheet = ReadBookSheet.ReadAloudPlayer)
-                    }
-                } else {
-                    openReadMenuRoute(ReadBookMenuRoute.ReadAloud)
-                }
-            }
+            is ReadBookIntent.ReadAloudAction -> openDefaultReadAloudInterface()
             is ReadBookIntent.ConfirmAddCurrentBookToBookshelf -> addCurrentBookToBookshelfAndFinish()
             is ReadBookIntent.ExitWithoutAddingCurrentBookToBookshelf -> removeCurrentNotShelfBookAndFinish()
 
@@ -1376,8 +1378,7 @@ class ReadBookViewModel(
                 }
             }
             ReadBookIntent.OpenClassicReadAloudControls -> {
-                _uiState.update { it.copy(activeSheet = null) }
-                openReadMenuRoute(ReadBookMenuRoute.ReadAloud)
+                _uiState.update { it.copy(activeSheet = ReadBookSheet.ReadAloudControls) }
             }
 
             is ReadBookIntent.SelectFont -> selectFont(intent.path)
@@ -4847,17 +4848,24 @@ class ReadBookViewModel(
                         route,
                     ),
                 ),
-                readAloudTtsTimer = if (
-                    route == ReadBookMenuRoute.ReadAloud && BaseReadAloudService.isRun
-                ) {
-                    BaseReadAloudService.timeMinute.coerceAtLeast(0)
-                } else {
-                    it.readAloudTtsTimer
-                },
             )
         }
     }
 
+    private fun openDefaultReadAloudInterface() {
+        val sheet = if (
+            _uiState.value.defaultReadAloudInterface ==
+            ReadAloudSettingsRepository.DEFAULT_INTERFACE_PLAYER
+        ) {
+            ReadBookSheet.ReadAloudPlayer
+        } else {
+            ReadBookSheet.ReadAloudControls
+        }
+        _uiState.update {
+            it.copy(menuState = ReadBookMenuState(), activeSheet = sheet)
+        }
+    }
+
     @Suppress("LongMethod")
     private fun handleConfigUpdate(update: ConfigUpdate) {
         update.toReadStyleMutation()?.let(readBookStyleConfigRepository::updateCurrentStyle)

+ 194 - 206
app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigSheet.kt → app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudConfigContent.kt

@@ -21,7 +21,6 @@ import androidx.compose.material.icons.filled.Edit
 import androidx.compose.material.icons.filled.MoreVert
 import androidx.compose.material.icons.filled.Save
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -55,214 +54,203 @@ import io.legado.app.utils.GSON
 import kotlinx.coroutines.launch
 
 @Composable
-fun ReadAloudConfigSheet(
-    show: Boolean,
+fun ReadAloudConfigContent(
     state: ReadBookUiState,
     onIntent: (ReadBookIntent) -> Unit,
-    onDismissRequest: () -> Unit,
+    modifier: Modifier = Modifier,
 ) {
     val pagerState = rememberPagerState(pageCount = { 2 })
     val scope = rememberCoroutineScope()
-    LaunchedEffect(show) {
-        if (show) pagerState.scrollToPage(0)
-    }
-    AppModalBottomSheet(
-        show = show,
-        onDismissRequest = onDismissRequest,
-        title = stringResource(R.string.aloud_config),
+    Column(
+        modifier = modifier.fillMaxWidth(),
     ) {
-        Column(
+        CardTabRow(
+            tabTitles = listOf(
+                stringResource(R.string.read_aloud_settings_general_tab),
+                stringResource(R.string.read_aloud_settings_voice_tab),
+            ),
+            selectedTabIndex = pagerState.currentPage,
+            onTabSelected = { page ->
+                scope.launch { pagerState.animateScrollToPage(page) }
+            }
+        )
+        HorizontalPager(
+            state = pagerState,
+            verticalAlignment = Alignment.Top,
             modifier = Modifier
-                .fillMaxWidth(),
-        ) {
-            CardTabRow(
-                tabTitles = listOf(
-                    stringResource(R.string.read_aloud_settings_general_tab),
-                    stringResource(R.string.read_aloud_settings_voice_tab),
-                ),
-                selectedTabIndex = pagerState.currentPage,
-                onTabSelected = { page ->
-                    scope.launch { pagerState.animateScrollToPage(page) }
-                }
-            )
-            HorizontalPager(
-                state = pagerState,
-                verticalAlignment = Alignment.Top,
+                .fillMaxWidth()
+                .weight(1f, fill = false),
+        ) { page ->
+            Column(
                 modifier = Modifier
                     .fillMaxWidth()
-                    .weight(1f, fill = false),
-            ) { page ->
-                Column(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .verticalScroll(rememberScrollState())
-                        .padding(top = 8.dp, bottom = 16.dp),
-                ) {
-            if (page == 0) {
-            TinyDropdownSettingItem(
-                title = stringResource(R.string.default_read_aloud_interface),
-                selectedValue = state.defaultReadAloudInterface,
-                displayEntries = arrayOf(
-                    stringResource(R.string.read_aloud_interface_classic),
-                    stringResource(R.string.read_aloud_interface_player),
-                ),
-                entryValues = arrayOf("classic", "player"),
-                description = stringResource(R.string.default_read_aloud_interface_summary),
-                onValueChange = { onIntent(ReadBookIntent.SetDefaultReadAloudInterface(it)) },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.show_read_aloud_capsule),
-                description = stringResource(R.string.show_read_aloud_capsule_summary),
-                checked = state.showReadAloudCapsule,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetShowReadAloudCapsule(it))
-                },
-            )
-                if (state.showReadAloudCapsule) {
+                    .verticalScroll(rememberScrollState())
+                    .padding(top = 8.dp, bottom = 16.dp),
+            ) {
+                if (page == 0) {
+                    TinyDropdownSettingItem(
+                        title = stringResource(R.string.default_read_aloud_interface),
+                        selectedValue = state.defaultReadAloudInterface,
+                        displayEntries = arrayOf(
+                            stringResource(R.string.read_aloud_interface_classic),
+                            stringResource(R.string.read_aloud_interface_player),
+                        ),
+                        entryValues = arrayOf("classic", "player"),
+                        description = stringResource(R.string.default_read_aloud_interface_summary),
+                        onValueChange = { onIntent(ReadBookIntent.SetDefaultReadAloudInterface(it)) },
+                    )
                     TinySwitchSettingItem(
-                        title = stringResource(R.string.capsule_auto_collapse),
-                        description = stringResource(R.string.capsule_auto_collapse_summary),
-                        checked = state.capsuleAutoCollapse,
+                        title = stringResource(R.string.show_read_aloud_capsule),
+                        description = stringResource(R.string.show_read_aloud_capsule_summary),
+                        checked = state.showReadAloudCapsule,
                         onCheckedChange = {
-                            onIntent(ReadBookIntent.SetCapsuleAutoCollapse(it))
+                            onIntent(ReadBookIntent.SetShowReadAloudCapsule(it))
                         },
                     )
-                }
-            TinySwitchSettingItem(
-                title = stringResource(R.string.ignore_audio_focus_title),
-                description = stringResource(R.string.ignore_audio_focus_summary),
-                checked = state.readAloudIgnoreAudioFocus,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudIgnoreAudioFocus(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.pause_read_aloud_while_phone_calls_title),
-                description = stringResource(R.string.pause_read_aloud_while_phone_calls_summary),
-                checked = state.readAloudPauseOnPhoneCall,
-                enabled = state.readAloudIgnoreAudioFocus,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudPauseOnPhoneCall(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.read_aloud_wake_lock),
-                description = stringResource(R.string.read_aloud_wake_lock_summary),
-                checked = state.readAloudWakeLock,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudWakeLock(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.pref_media_button_per_next),
-                description = stringResource(R.string.pref_media_button_per_next_summary),
-                checked = state.readAloudMediaButtonPerNext,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudMediaButtonPerNext(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.read_aloud_by_page),
-                description = stringResource(R.string.read_aloud_by_page_summary),
-                checked = state.readAloudByPage,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudByPage(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.system_media_control_compatibility_change),
-                description = stringResource(R.string.system_media_control_compatibility_change_summary),
-                checked = state.readAloudSystemMediaCompat,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudSystemMediaCompat(it))
-                },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.stream_read_aloud_audio),
-                description = stringResource(R.string.stream_read_aloud_audio_summary),
-                checked = state.readAloudStreamAudio,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetReadAloudStreamAudio(it))
-                },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.reset_read_aloud_capsule_position),
-                description = stringResource(R.string.reset_read_aloud_capsule_position_summary),
-                onClick = { onIntent(ReadBookIntent.ResetReadAloudCapsulePosition) },
-            )
-            } else {
-            TinyClickableSettingItem(
-                title = stringResource(R.string.read_aloud_default_engine),
-                description = stringResource(
-                    R.string.read_aloud_default_engine_summary,
-                    state.speakEngineName.ifEmpty { stringResource(R.string.system_tts) },
-                ),
-                onClick = { onIntent(ReadBookIntent.SelectSpeakEngine) },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.read_aloud_engines_and_voices),
-                description = stringResource(R.string.read_aloud_engines_and_voices_summary),
-                onClick = { onIntent(ReadBookIntent.OpenTtsEnginesAndVoices) },
-            )
-                TinyClickableSettingItem(
-                    title = stringResource(R.string.tts_cache_manage),
-                    description = stringResource(R.string.tts_cache_manage_summary),
-                    onClick = { onIntent(ReadBookIntent.OpenTtsCache) },
-                )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.read_aloud_character_casting),
-                description = stringResource(R.string.book_voice_casting_entry_summary),
-                onClick = { onIntent(ReadBookIntent.OpenBookVoiceCasting) },
-            )
-            TinyDropdownSettingItem(
-                title = stringResource(R.string.speech_analysis_mode),
-                selectedValue = state.speechAnalysisMode,
-                displayEntries = arrayOf(
-                    stringResource(R.string.speech_analysis_rule),
-                    stringResource(R.string.speech_analysis_rule_ai),
-                    stringResource(R.string.speech_analysis_ai),
-                ),
-                entryValues = arrayOf("rule", "rule_with_ai", "ai_understanding"),
-                description = when (state.speechAnalysisMode) {
-                    "rule_with_ai" -> stringResource(R.string.speech_analysis_rule_ai_summary)
-                    "ai_understanding" -> stringResource(R.string.speech_analysis_ai_summary)
-                    else -> stringResource(R.string.speech_analysis_rule_summary)
-                },
-                onValueChange = { onIntent(ReadBookIntent.SetSpeechAnalysisMode(it)) },
-            )
-            TinySwitchSettingItem(
-                title = stringResource(R.string.use_multi_speaker),
-                description = stringResource(R.string.use_multi_speaker_summary),
-                checked = state.useMultiSpeaker,
-                onCheckedChange = {
-                    onIntent(ReadBookIntent.SetUseMultiSpeaker(it))
-                },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.sys_tts_config),
-                onClick = { onIntent(ReadBookIntent.OpenSystemTtsSettings) },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.read_aloud_preload),
-                onClick = { onIntent(ReadBookIntent.OpenPreDownloadNumPicker) },
-            )
-                TinyClickableSettingItem(
-                    title = stringResource(R.string.tts_pre_synthesis_concurrency),
-                    onClick = { onIntent(ReadBookIntent.OpenPreSynthesisConcurrencyPicker) },
-                )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.tts_paragraph_interval),
-                onClick = { onIntent(ReadBookIntent.OpenParagraphIntervalPicker) },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.audio_cache_clean_time),
-                onClick = { onIntent(ReadBookIntent.OpenCacheCleanTimePicker) },
-            )
-            TinyClickableSettingItem(
-                title = stringResource(R.string.clear_cache),
-                onClick = { onIntent(ReadBookIntent.ClearTtsCache) },
-            )
-            }
+                    if (state.showReadAloudCapsule) {
+                        TinySwitchSettingItem(
+                            title = stringResource(R.string.capsule_auto_collapse),
+                            description = stringResource(R.string.capsule_auto_collapse_summary),
+                            checked = state.capsuleAutoCollapse,
+                            onCheckedChange = {
+                                onIntent(ReadBookIntent.SetCapsuleAutoCollapse(it))
+                            },
+                        )
+                    }
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.ignore_audio_focus_title),
+                        description = stringResource(R.string.ignore_audio_focus_summary),
+                        checked = state.readAloudIgnoreAudioFocus,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudIgnoreAudioFocus(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.pause_read_aloud_while_phone_calls_title),
+                        description = stringResource(R.string.pause_read_aloud_while_phone_calls_summary),
+                        checked = state.readAloudPauseOnPhoneCall,
+                        enabled = state.readAloudIgnoreAudioFocus,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudPauseOnPhoneCall(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.read_aloud_wake_lock),
+                        description = stringResource(R.string.read_aloud_wake_lock_summary),
+                        checked = state.readAloudWakeLock,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudWakeLock(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.pref_media_button_per_next),
+                        description = stringResource(R.string.pref_media_button_per_next_summary),
+                        checked = state.readAloudMediaButtonPerNext,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudMediaButtonPerNext(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.read_aloud_by_page),
+                        description = stringResource(R.string.read_aloud_by_page_summary),
+                        checked = state.readAloudByPage,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudByPage(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.system_media_control_compatibility_change),
+                        description = stringResource(R.string.system_media_control_compatibility_change_summary),
+                        checked = state.readAloudSystemMediaCompat,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudSystemMediaCompat(it))
+                        },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.stream_read_aloud_audio),
+                        description = stringResource(R.string.stream_read_aloud_audio_summary),
+                        checked = state.readAloudStreamAudio,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetReadAloudStreamAudio(it))
+                        },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.reset_read_aloud_capsule_position),
+                        description = stringResource(R.string.reset_read_aloud_capsule_position_summary),
+                        onClick = { onIntent(ReadBookIntent.ResetReadAloudCapsulePosition) },
+                    )
+                } else {
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.read_aloud_default_engine),
+                        description = stringResource(
+                            R.string.read_aloud_default_engine_summary,
+                            state.speakEngineName.ifEmpty { stringResource(R.string.system_tts) },
+                        ),
+                        onClick = { onIntent(ReadBookIntent.SelectSpeakEngine) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.read_aloud_engines_and_voices),
+                        description = stringResource(R.string.read_aloud_engines_and_voices_summary),
+                        onClick = { onIntent(ReadBookIntent.OpenTtsEnginesAndVoices) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.tts_cache_manage),
+                        description = stringResource(R.string.tts_cache_manage_summary),
+                        onClick = { onIntent(ReadBookIntent.OpenTtsCache) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.read_aloud_character_casting),
+                        description = stringResource(R.string.book_voice_casting_entry_summary),
+                        onClick = { onIntent(ReadBookIntent.OpenBookVoiceCasting) },
+                    )
+                    TinyDropdownSettingItem(
+                        title = stringResource(R.string.speech_analysis_mode),
+                        selectedValue = state.speechAnalysisMode,
+                        displayEntries = arrayOf(
+                            stringResource(R.string.speech_analysis_rule),
+                            stringResource(R.string.speech_analysis_rule_ai),
+                            stringResource(R.string.speech_analysis_ai),
+                        ),
+                        entryValues = arrayOf("rule", "rule_with_ai", "ai_understanding"),
+                        description = when (state.speechAnalysisMode) {
+                            "rule_with_ai" -> stringResource(R.string.speech_analysis_rule_ai_summary)
+                            "ai_understanding" -> stringResource(R.string.speech_analysis_ai_summary)
+                            else -> stringResource(R.string.speech_analysis_rule_summary)
+                        },
+                        onValueChange = { onIntent(ReadBookIntent.SetSpeechAnalysisMode(it)) },
+                    )
+                    TinySwitchSettingItem(
+                        title = stringResource(R.string.use_multi_speaker),
+                        description = stringResource(R.string.use_multi_speaker_summary),
+                        checked = state.useMultiSpeaker,
+                        onCheckedChange = {
+                            onIntent(ReadBookIntent.SetUseMultiSpeaker(it))
+                        },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.sys_tts_config),
+                        onClick = { onIntent(ReadBookIntent.OpenSystemTtsSettings) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.read_aloud_preload),
+                        onClick = { onIntent(ReadBookIntent.OpenPreDownloadNumPicker) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.tts_pre_synthesis_concurrency),
+                        onClick = { onIntent(ReadBookIntent.OpenPreSynthesisConcurrencyPicker) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.tts_paragraph_interval),
+                        onClick = { onIntent(ReadBookIntent.OpenParagraphIntervalPicker) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.audio_cache_clean_time),
+                        onClick = { onIntent(ReadBookIntent.OpenCacheCleanTimePicker) },
+                    )
+                    TinyClickableSettingItem(
+                        title = stringResource(R.string.clear_cache),
+                        onClick = { onIntent(ReadBookIntent.ClearTtsCache) },
+                    )
                 }
             }
         }
@@ -342,8 +330,8 @@ fun SpeakEngineConfigSheet(
         startAction = {
             SmallTonalButton(
                 onClick = { onIntent(ReadBookIntent.EditHttpTts()) },
-                        icon = Icons.Default.Add,
-                        contentDescription = stringResource(R.string.add)
+                icon = Icons.Default.Add,
+                contentDescription = stringResource(R.string.add)
             )
         },
         endAction = {
@@ -351,8 +339,8 @@ fun SpeakEngineConfigSheet(
             Box {
                 SmallTonalButton(
                     onClick = { expanded = true },
-                        icon = Icons.Default.MoreVert,
-                        contentDescription = stringResource(R.string.more_menu)
+                    icon = Icons.Default.MoreVert,
+                    contentDescription = stringResource(R.string.more_menu)
                 )
                 RoundDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
                     RoundDropdownMenuItem(
@@ -412,13 +400,13 @@ fun SpeakEngineConfigSheet(
                             Row(horizontalArrangement = Arrangement.spacedBy(2.dp)) {
                                 SmallTonalButton(
                                     onClick = { onIntent(ReadBookIntent.EditHttpTts(httpTtsId)) },
-                        icon = Icons.Default.Edit,
-                        contentDescription = stringResource(R.string.edit),
+                                    icon = Icons.Default.Edit,
+                                    contentDescription = stringResource(R.string.edit),
                                 )
                                 SmallTonalButton(
                                     onClick = { onIntent(ReadBookIntent.DeleteHttpTts(httpTtsId)) },
-                        icon = Icons.Default.Delete,
-                        contentDescription = stringResource(R.string.delete),
+                                    icon = Icons.Default.Delete,
+                                    contentDescription = stringResource(R.string.delete),
                                 )
                             }
                         }
@@ -459,8 +447,8 @@ fun HttpTtsEditSheet(
             Box {
                 SmallTonalButton(
                     onClick = { expanded = true },
-                        icon = Icons.Default.MoreVert,
-                        contentDescription = stringResource(R.string.more_menu)
+                    icon = Icons.Default.MoreVert,
+                    contentDescription = stringResource(R.string.more_menu)
                 )
                 RoundDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
                     RoundDropdownMenuItem(

+ 150 - 1
app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudSheet.kt → app/src/main/java/io/legado/app/ui/book/read/sheet/ReadAloudScreen.kt

@@ -1,27 +1,45 @@
 package io.legado.app.ui.book.read.sheet
 
+import androidx.activity.compose.BackHandler
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.SizeTransform
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.slideInHorizontally
+import androidx.compose.animation.slideOutHorizontally
+import androidx.compose.animation.togetherWith
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.ArrowBack
 import androidx.compose.material.icons.automirrored.filled.List
 import androidx.compose.material.icons.filled.Alarm
+import androidx.compose.material.icons.filled.Headphones
 import androidx.compose.material.icons.filled.Menu
 import androidx.compose.material.icons.filled.Pause
 import androidx.compose.material.icons.filled.PlayArrow
 import androidx.compose.material.icons.filled.Settings
-import androidx.compose.material.icons.filled.Headphones
 import androidx.compose.material.icons.filled.SkipNext
 import androidx.compose.material.icons.filled.SkipPrevious
 import androidx.compose.material.icons.filled.Stop
 import androidx.compose.material.icons.filled.VisibilityOff
+import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.ModalBottomSheet
+import androidx.compose.material3.SheetValue.Expanded
+import androidx.compose.material3.SheetValue.Hidden
 import androidx.compose.material3.Text
+import androidx.compose.material3.rememberBottomSheetState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -29,18 +47,149 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.domain.model.PlaybackTimer
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.book.read.ReadBookUiState
+import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerIntent
+import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerScreenContent
+import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerUiState
+import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.theme.ProvideThemeOverride
+import io.legado.app.ui.theme.ThemeOverrideState
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 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.settingItem.TinySliderSettingItem
 import io.legado.app.ui.widget.components.settingItem.TinySwitchSettingItem
 
+enum class ReadAloudPage {
+    Controls,
+    Config,
+    Player,
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun ReadAloudScreen(
+    page: ReadAloudPage?,
+    state: ReadBookUiState,
+    playerState: ReadAloudPlayerUiState,
+    playerTheme: ThemeOverrideState?,
+    onIntent: (ReadBookIntent) -> Unit,
+    onPlayerIntent: (ReadAloudPlayerIntent) -> Unit,
+    onDismissRequest: () -> Unit,
+    onOpenChapterList: () -> Unit,
+    onGoToBackground: () -> Unit,
+    onOpenMainMenu: () -> Unit,
+) {
+    val sheetState = rememberBottomSheetState(
+        initialValue = Hidden,
+        enabledValues = setOf(Hidden, Expanded),
+    )
+    val isPlayer = page == ReadAloudPage.Player
+    BackHandler(enabled = page == ReadAloudPage.Config) {
+        onIntent(ReadBookIntent.ShowSheet(io.legado.app.ui.book.read.ReadBookSheet.ReadAloudControls))
+    }
+    if (page != null) {
+        ModalBottomSheet(
+            onDismissRequest = onDismissRequest,
+            sheetState = sheetState,
+            modifier = if (isPlayer) Modifier.fillMaxSize() else Modifier,
+            shape = if (isPlayer) RectangleShape else MaterialTheme.shapes.extraLarge,
+            sheetMaxWidth = if (isPlayer) Dp.Unspecified else 640.dp,
+            containerColor = if (isPlayer) {
+                Color.Transparent
+            } else {
+                LegadoTheme.colorScheme.surfaceContainer
+            },
+            contentColor = LegadoTheme.colorScheme.onSurface,
+            contentWindowInsets = {
+                if (isPlayer) WindowInsets(0, 0, 0, 0) else WindowInsets(0)
+            },
+            dragHandle = if (isPlayer) null else {
+                { androidx.compose.material3.BottomSheetDefaults.DragHandle() }
+            },
+        ) {
+            AnimatedContent(
+                targetState = page,
+                transitionSpec = {
+                    val forward = targetState.ordinal > initialState.ordinal
+                    val enter = slideInHorizontally(
+                        animationSpec = tween(durationMillis = 300),
+                        initialOffsetX = { width -> if (forward) width else -width },
+                    ) + fadeIn(animationSpec = tween(durationMillis = 220))
+                    val exit = slideOutHorizontally(
+                        animationSpec = tween(durationMillis = 300),
+                        targetOffsetX = { width -> if (forward) -width else width },
+                    ) + fadeOut(animationSpec = tween(durationMillis = 180))
+                    (enter togetherWith exit).using(SizeTransform(clip = false))
+                },
+                label = "ReadAloudPage",
+            ) { targetPage ->
+                when (targetPage) {
+                    ReadAloudPage.Controls -> ReadAloudContent(
+                        state = state,
+                        onIntent = onIntent,
+                        onDismissRequest = onDismissRequest,
+                        onOpenChapterList = onOpenChapterList,
+                        onGoToBackground = onGoToBackground,
+                        onOpenMainMenu = onOpenMainMenu,
+                        onShowReadAloudConfig = {
+                            onIntent(ReadBookIntent.ShowReadAloudConfig)
+                        },
+                        modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
+                    )
+
+                    ReadAloudPage.Config -> Column {
+                        Row(
+                            modifier = Modifier
+                                .fillMaxWidth()
+                                .padding(horizontal = 16.dp),
+                            verticalAlignment = Alignment.CenterVertically,
+                        ) {
+                            MediumTonalButton(
+                                onClick = {
+                                    onIntent(
+                                        ReadBookIntent.ShowSheet(
+                                            io.legado.app.ui.book.read.ReadBookSheet.ReadAloudControls
+                                        )
+                                    )
+                                },
+                                icon = Icons.AutoMirrored.Filled.ArrowBack,
+                                contentDescription = stringResource(R.string.back),
+                            )
+                            Spacer(Modifier.width(12.dp))
+                            Text(
+                                text = stringResource(R.string.aloud_config),
+                                style = MaterialTheme.typography.titleLarge,
+                            )
+                        }
+                        ReadAloudConfigContent(
+                            state = state,
+                            onIntent = onIntent,
+                            modifier = Modifier.padding(horizontal = 16.dp),
+                        )
+                    }
+
+                    ReadAloudPage.Player -> ProvideThemeOverride(playerTheme) {
+                        ReadAloudPlayerScreenContent(
+                            state = playerState,
+                            onIntent = onPlayerIntent,
+                            onBack = onDismissRequest,
+                        )
+                    }
+                }
+            }
+        }
+    }
+}
+
 @Composable
 fun ReadAloudContent(
     state: ReadBookUiState,

+ 4 - 5
app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordScreen.kt

@@ -3,9 +3,8 @@ package io.legado.app.ui.book.readRecord
 import androidx.activity.compose.BackHandler
 import androidx.compose.animation.AnimatedContent
 import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.foundation.basicMarquee
 import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
+import androidx.compose.foundation.basicMarquee
 import androidx.compose.foundation.combinedClickable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -40,7 +39,6 @@ import androidx.compose.material3.SnackbarHostState
 import androidx.compose.material3.Surface
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -68,6 +66,7 @@ import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.text.withStyle
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.zIndex
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import cn.hutool.core.date.DateUtil
 import io.legado.app.R
 import io.legado.app.data.entities.readRecord.ReadRecord
@@ -86,7 +85,6 @@ import io.legado.app.ui.widget.components.button.AppIconButton
 import io.legado.app.ui.widget.components.card.GlassCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.checkBox.CheckboxItem
-import io.legado.app.ui.widget.components.heatmap.heatmapCalendarTitle
 import io.legado.app.ui.widget.components.heatmap.HeatmapCalendarEndAction
 import io.legado.app.ui.widget.components.heatmap.HeatmapCalendarStartAction
 import io.legado.app.ui.widget.components.heatmap.HeatmapConfig
@@ -95,6 +93,7 @@ import io.legado.app.ui.widget.components.heatmap.HeatmapMode
 import io.legado.app.ui.widget.components.heatmap.HeatmapWeekColumn
 import io.legado.app.ui.widget.components.heatmap.NoEarlierDataIndicator
 import io.legado.app.ui.widget.components.heatmap.WeekdayLabelsColumn
+import io.legado.app.ui.widget.components.heatmap.heatmapCalendarTitle
 import io.legado.app.ui.widget.components.heatmap.rememberDateRange
 import io.legado.app.ui.widget.components.heatmap.rememberDaysInRange
 import io.legado.app.ui.widget.components.heatmap.rememberWeeks
@@ -114,7 +113,6 @@ import io.legado.app.utils.StringUtils.formatFriendlyDate
 import io.legado.app.utils.formatReadDuration
 import kotlinx.coroutines.launch
 import org.koin.androidx.compose.koinViewModel
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import java.time.LocalDate
 import java.time.format.DateTimeFormatter
 import java.util.Date
@@ -1298,6 +1296,7 @@ fun DateHeader(
     dailyTotalTime: Long? = null
 ) {
     CollapsibleHeader(
+        modifier = Modifier.adaptiveHorizontalPadding(),
         showIcon = false,
         isCollapsed = false,
         onToggle = { },

+ 0 - 42
app/src/main/java/io/legado/app/ui/book/readaloud/player/ReadAloudPlayerScreen.kt

@@ -49,12 +49,7 @@ import androidx.compose.material.icons.filled.Speed
 import androidx.compose.material.icons.filled.Timer
 import androidx.compose.material.icons.filled.Tune
 import androidx.compose.material.icons.filled.WbTwilight
-import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.ModalBottomSheet
-import androidx.compose.material3.SheetValue.Expanded
-import androidx.compose.material3.SheetValue.Hidden
 import androidx.compose.material3.Slider
-import androidx.compose.material3.rememberBottomSheetState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
@@ -87,7 +82,6 @@ import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
-import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.dp
 import dev.chrisbanes.haze.HazeProgressive
@@ -122,42 +116,6 @@ import kotlin.math.abs
 import kotlin.math.roundToInt
 import androidx.compose.ui.graphics.BlendMode as ComposeBlendMode
 
-@Composable
-@OptIn(ExperimentalMaterial3Api::class)
-fun ReadAloudPlayerSheet(
-    show: Boolean,
-    onDismissRequest: () -> Unit,
-    state: ReadAloudPlayerUiState,
-    onIntent: (ReadAloudPlayerIntent) -> Unit,
-) {
-    val sheetState = rememberBottomSheetState(
-        initialValue = Hidden,
-        enabledValues = setOf(Hidden, Expanded)
-    )
-    LaunchedEffect(show) {
-        if (show) onIntent(ReadAloudPlayerIntent.Refresh)
-    }
-    if (show) {
-        ModalBottomSheet(
-            onDismissRequest = onDismissRequest,
-            sheetState = sheetState,
-            modifier = Modifier.fillMaxSize(),
-            shape = RectangleShape,
-            sheetMaxWidth = Dp.Unspecified,
-            containerColor = Color.Transparent,
-            contentColor = LegadoTheme.colorScheme.onSurface,
-            contentWindowInsets = { WindowInsets(0, 0, 0, 0) },
-            dragHandle = null,
-        ) {
-            ReadAloudPlayerScreenContent(
-                state = state,
-                onIntent = onIntent,
-                onBack = onDismissRequest,
-            )
-        }
-    }
-}
-
 @OptIn(ExperimentalHazeMaterialsApi::class)
 @Composable
 fun ReadAloudPlayerScreenContent(