diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt index 41d7c99c..14513581 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/DataStoreConstants.kt @@ -30,6 +30,7 @@ object DataStoreConstants { val TEXT_ALIGNMENT = stringPreferencesKey("text_alignment") val LETTER_SPACING = intPreferencesKey("letter_spacing") val CUTOUT_PADDING = booleanPreferencesKey("cutout_padding") + val FULLSCREEN = booleanPreferencesKey("fullscreen") // Browse settings val BROWSE_FILES_STRUCTURE = stringPreferencesKey("browse_files_structure") diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt index f305cc5d..5068b0ba 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainEvent.kt @@ -33,4 +33,5 @@ sealed class MainEvent { data class OnChangeLetterSpacing(val spacing: Int) : MainEvent() data class OnChangeAbsoluteDark(val bool: Boolean) : MainEvent() data class OnChangeCutoutPadding(val bool: Boolean) : MainEvent() + data class OnChangeFullscreen(val bool: Boolean) : MainEvent() } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainState.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainState.kt index 8508f095..a9065ed0 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainState.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainState.kt @@ -70,6 +70,7 @@ data class MainState( val textAlignment: ReaderTextAlignment = provideDefaultValue { ReaderTextAlignment.START }, val letterSpacing: Int = provideDefaultValue { 0 }, val cutoutPadding: Boolean = provideDefaultValue { false }, + val fullscreen: Boolean = provideDefaultValue { true }, // Browse Settings val browseFilesStructure: BrowseFilesStructure = provideDefaultValue { @@ -219,6 +220,10 @@ data class MainState( cutoutPadding = provideValue( CUTOUT_PADDING ) { cutoutPadding }, + + fullscreen = provideValue( + FULLSCREEN + ) { fullscreen }, ) } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt index 6b31aceb..5b840b39 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/data/MainViewModel.kt @@ -401,6 +401,20 @@ class MainViewModel @Inject constructor( } } } + + is MainEvent.OnChangeFullscreen -> { + viewModelScope.launch(Dispatchers.IO) { + setDatastore.execute( + DataStoreConstants.FULLSCREEN, + event.bool + ) + updateStateWithSavedHandle { + it.copy( + fullscreen = event.bool + ) + } + } + } } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt index cef6205f..87aebc62 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt @@ -12,15 +12,19 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.displayCutout 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.systemBarsIgnoringVisibility import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material3.LinearProgressIndicator @@ -42,6 +46,8 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontStyle @@ -78,6 +84,8 @@ import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent @Composable fun ReaderScreenRoot(screen: Screen.Reader) { val state = LocalReaderViewModel.current.state + val mainState = LocalMainViewModel.current.state + val onEvent = LocalReaderViewModel.current.onEvent val onLibraryEvent = LocalLibraryViewModel.current.onEvent val onHistoryEvent = LocalHistoryViewModel.current.onEvent val viewModel = LocalReaderViewModel.current.viewModel @@ -101,7 +109,8 @@ fun ReaderScreenRoot(screen: Screen.Reader) { viewModel.init( screen = screen, onNavigate = onNavigate, - context = context, + fullscreenMode = mainState.value.fullscreen, + activity = context, refreshList = { onLibraryEvent(LibraryEvent.OnUpdateBook(it)) onHistoryEvent(HistoryEvent.OnLoadList) @@ -114,9 +123,23 @@ fun ReaderScreenRoot(screen: Screen.Reader) { } LaunchedEffect(canScroll) { if (!canScroll && !state.value.showMenu && !state.value.loading) { - viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context)) + onEvent( + ReaderEvent.OnShowHideMenu( + fullscreenMode = mainState.value.fullscreen, + activity = context + ) + ) } } + LaunchedEffect(mainState.value.fullscreen) { + onEvent( + ReaderEvent.OnShowHideMenu( + show = state.value.showMenu, + fullscreenMode = mainState.value.fullscreen, + activity = context + ) + ) + } LaunchedEffect(lazyListState) { viewModel.onUpdateProgress { onLibraryEvent(LibraryEvent.OnUpdateBook(it)) @@ -138,6 +161,7 @@ fun ReaderScreenRoot(screen: Screen.Reader) { } } +@OptIn(ExperimentalLayoutApi::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable private fun ReaderScreen(lazyListState: LazyListState) { @@ -160,7 +184,12 @@ private fun ReaderScreen(lazyListState: LazyListState) { val velocity = consumed.y if ((velocity > 70 || velocity < -70) && state.value.showMenu && !state.value.lockMenu) { - onEvent(ReaderEvent.OnShowHideMenu(context = context)) + onEvent( + ReaderEvent.OnShowHideMenu( + fullscreenMode = mainState.value.fullscreen, + activity = context + ) + ) } return super.onPostScroll(consumed, available, source) @@ -203,6 +232,64 @@ private fun ReaderScreen(lazyListState: LazyListState) { } } + val density = LocalDensity.current + val layoutDirection = LocalLayoutDirection.current + val cutoutInsets = WindowInsets.displayCutout + val systemBarsInsets = WindowInsets.systemBarsIgnoringVisibility + + val cutoutInsetsPadding = remember(mainState.value.cutoutPadding) { + derivedStateOf { + cutoutInsets.asPaddingValues(density = density).run { + if (mainState.value.cutoutPadding) PaddingValues( + top = calculateTopPadding(), + start = calculateStartPadding(layoutDirection), + end = calculateEndPadding(layoutDirection), + bottom = calculateBottomPadding() + ) else PaddingValues(0.dp) + } + } + } + val systemBarsInsetsPadding = remember(mainState.value.fullscreen) { + derivedStateOf { + systemBarsInsets.asPaddingValues(density = density).run { + if (!mainState.value.fullscreen) PaddingValues( + top = calculateTopPadding(), + start = calculateStartPadding(layoutDirection), + end = calculateEndPadding(layoutDirection), + bottom = calculateBottomPadding() + ) else PaddingValues(0.dp) + } + } + } + + val contentPadding = remember( + cutoutInsetsPadding.value, + systemBarsInsetsPadding.value + ) { + PaddingValues( + top = systemBarsInsetsPadding.value.calculateTopPadding().run { + if (equals(0.dp)) return@run cutoutInsetsPadding.value + .calculateTopPadding() + this + }, + start = systemBarsInsetsPadding.value.calculateStartPadding(layoutDirection).run { + if (equals(0.dp)) return@run cutoutInsetsPadding.value + .calculateStartPadding(layoutDirection) + this + }, + end = systemBarsInsetsPadding.value.calculateEndPadding(layoutDirection).run { + if (equals(0.dp)) return@run cutoutInsetsPadding.value + .calculateEndPadding(layoutDirection) + this + }, + bottom = systemBarsInsetsPadding.value.calculateBottomPadding().run { + if (equals(0.dp)) return@run cutoutInsetsPadding.value + .calculateBottomPadding() + this + } + ) + } + if (state.value.showSettingsBottomSheet) { ReaderSettingsBottomSheet() } @@ -302,7 +389,10 @@ private fun ReaderScreen(lazyListState: LazyListState) { indication = null, onClick = { onEvent( - ReaderEvent.OnShowHideMenu(context = context) + ReaderEvent.OnShowHideMenu( + fullscreenMode = mainState.value.fullscreen, + activity = context + ) ) } ) @@ -325,11 +415,7 @@ private fun ReaderScreen(lazyListState: LazyListState) { .showToast(context = context, longToast = false) } ) - .then( - if (mainState.value.cutoutPadding) Modifier.padding( - WindowInsets.displayCutout.asPaddingValues() - ) else Modifier - ), + .padding(contentPadding), verticalArrangement = Arrangement.spacedBy(paragraphHeight), contentPadding = PaddingValues( top = (WindowInsets.displayCutout.asPaddingValues() @@ -355,6 +441,7 @@ private fun ReaderScreen(lazyListState: LazyListState) { letterSpacing = letterSpacing, sidePadding = sidePadding, paragraphIndentation = mainState.value.paragraphIndentation, + fullscreenMode = mainState.value.fullscreen, doubleClickTranslationEnabled = mainState.value.doubleClickTranslation, toolbarHidden = toolbarHidden ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt index ad4895fd..97be3021 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderTextParagraph.kt @@ -42,6 +42,7 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data. * @param letterSpacing Letter spacing. * @param sidePadding Line's side padding. * @param paragraphIndentation Whether Paragraph Indentation is enabled for this line. + * @param fullscreenMode Whether Reader is in fullscreen mode. * @param doubleClickTranslationEnabled Whether Double Click Translation is enabled. * @param toolbarHidden Whether selection toolBar is hidden. */ @@ -59,6 +60,7 @@ fun LazyItemScope.ReaderTextParagraph( letterSpacing: TextUnit, sidePadding: Dp, paragraphIndentation: Boolean, + fullscreenMode: Boolean, doubleClickTranslationEnabled: Boolean, toolbarHidden: Boolean ) { @@ -109,7 +111,10 @@ fun LazyItemScope.ReaderTextParagraph( }, onClick = { onEvent( - ReaderEvent.OnShowHideMenu(context = context as ComponentActivity) + ReaderEvent.OnShowHideMenu( + fullscreenMode = fullscreenMode, + activity = context as ComponentActivity + ) ) } ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt index 13f1a294..4077ad29 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/settings_bottom_sheet/ReaderSettingsBottomSheet.kt @@ -20,11 +20,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel import ua.acclorite.book_story.presentation.core.components.LocalReaderViewModel import ua.acclorite.book_story.presentation.core.components.custom_bottom_sheet.CustomBottomSheet import ua.acclorite.book_story.presentation.screens.reader.data.ReaderEvent import ua.acclorite.book_story.presentation.screens.settings.nested.appearance.components.subcategories.ColorsSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.FontSubcategory +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.MiscSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.PaddingSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.TextSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.TranslatorSubcategory @@ -36,6 +38,7 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.compo @Composable fun ReaderSettingsBottomSheet() { val state = LocalReaderViewModel.current.state + val mainState = LocalMainViewModel.current.state val onEvent = LocalReaderViewModel.current.onEvent val context = LocalContext.current @@ -61,6 +64,7 @@ fun ReaderSettingsBottomSheet() { onEvent( ReaderEvent.OnShowHideMenu( pagerState.currentPage != 2, + fullscreenMode = mainState.value.fullscreen, context as ComponentActivity ) ) @@ -87,6 +91,11 @@ fun ReaderSettingsBottomSheet() { topPadding = 22.dp, bottomPadding = 0.dp ) + MiscSubcategory( + titleColor = { MaterialTheme.colorScheme.onSurface }, + topPadding = 22.dp, + bottomPadding = 8.dp + it + ) } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt index 05816ec2..9929be10 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderEvent.kt @@ -17,7 +17,8 @@ sealed class ReaderEvent { data class OnShowHideMenu( val show: Boolean? = null, - val context: ComponentActivity + val fullscreenMode: Boolean, + val activity: ComponentActivity ) : ReaderEvent() data class OnGoBack( diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt index 1983e0b1..ebba1a94 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/data/ReaderViewModel.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.coroutines.yield import ua.acclorite.book_story.R import ua.acclorite.book_story.domain.model.Book @@ -153,21 +154,11 @@ class ReaderViewModel @Inject constructor( yield() - WindowCompat.getInsetsController( - event.context.window, - event.context.window.decorView - ).apply { - yield() - - systemBarsBehavior = WindowInsetsControllerCompat - .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - if (shouldShow) { - show(WindowInsetsCompat.Type.systemBars()) - } else { - hide(WindowInsetsCompat.Type.systemBars()) - } - } - + showSystemBars( + show = shouldShow, + fullscreenMode = event.fullscreenMode, + activity = event.activity + ) _state.update { it.copy( showMenu = shouldShow @@ -405,7 +396,8 @@ class ReaderViewModel @Inject constructor( fun init( screen: Screen.Reader, onNavigate: OnNavigate, - context: ComponentActivity, + fullscreenMode: Boolean, + activity: ComponentActivity, refreshList: (Book) -> Unit, onError: (UIText) -> Unit ) { @@ -425,10 +417,17 @@ class ReaderViewModel @Inject constructor( clear() launch { - launch(Dispatchers.Main) { - context.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - }.join() - onEvent(ReaderEvent.OnShowHideMenu(false, context)) + withContext(Dispatchers.Main) { + activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + + onEvent( + ReaderEvent.OnShowHideMenu( + show = false, + fullscreenMode = fullscreenMode, + activity = activity + ) + ) onEvent( ReaderEvent.OnLoadText( refreshList = { refreshList(it) }, @@ -495,6 +494,23 @@ class ReaderViewModel @Inject constructor( } } + private fun showSystemBars( + show: Boolean, + fullscreenMode: Boolean, + activity: ComponentActivity + ): Boolean { + WindowCompat.getInsetsController( + activity.window, + activity.window.decorView + ).apply { + systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + if (show || !fullscreenMode) show(WindowInsetsCompat.Type.systemBars()) + else hide(WindowInsetsCompat.Type.systemBars()) + } + + return show || !fullscreenMode + } + private suspend fun clear() { eventJob.cancel() eventJob.join() diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/ReaderSettingsCategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/ReaderSettingsCategory.kt index 8bfdf079..11e4bf58 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/ReaderSettingsCategory.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/ReaderSettingsCategory.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import ua.acclorite.book_story.presentation.core.components.CategoryTitle import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.FontSubcategory +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.MiscSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.PaddingSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.TextSubcategory import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.TranslatorSubcategory @@ -43,6 +44,11 @@ fun LazyListScope.ReaderSettingsCategory( bottomPadding = 0.dp ) TranslatorSubcategory( + titleColor = titleColor, + topPadding = 22.dp, + bottomPadding = 0.dp + ) + MiscSubcategory( titleColor = titleColor, topPadding = 22.dp, bottomPadding = bottomPadding diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt new file mode 100644 index 00000000..3017381f --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/FullscreenSetting.kt @@ -0,0 +1,31 @@ +package ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import ua.acclorite.book_story.R +import ua.acclorite.book_story.presentation.core.components.LocalMainViewModel +import ua.acclorite.book_story.presentation.data.MainEvent +import ua.acclorite.book_story.presentation.screens.settings.components.SwitchWithTitle + +/** + * Fullscreen setting. + * If true, hides system bars in Reader. + */ +@Composable +fun FullscreenSetting() { + val state = LocalMainViewModel.current.state + val onMainEvent = LocalMainViewModel.current.onEvent + + SwitchWithTitle( + selected = state.value.fullscreen, + title = stringResource(id = R.string.fullscreen_option), + description = stringResource(id = R.string.fullscreen_option_desc), + onClick = { + onMainEvent( + MainEvent.OnChangeFullscreen( + !state.value.fullscreen + ) + ) + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/MiscSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/MiscSubcategory.kt new file mode 100644 index 00000000..4d0f4562 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/MiscSubcategory.kt @@ -0,0 +1,59 @@ +@file:Suppress("FunctionName") + +package ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories + +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.coerceAtLeast +import androidx.compose.ui.unit.dp +import ua.acclorite.book_story.R +import ua.acclorite.book_story.presentation.core.components.CategoryTitle +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings.FullscreenSetting + +/** + * Misc subcategory. + * Contains all settings that cannot be categorized. + */ +fun LazyListScope.MiscSubcategory( + titleColor: @Composable () -> Color = { MaterialTheme.colorScheme.primary }, + title: @Composable () -> String = { stringResource(id = R.string.misc_reader_settings) }, + showTitle: Boolean = true, + topPadding: Dp, + bottomPadding: Dp +) { + item { + if (showTitle) { + CategoryTitle( + title = title.invoke(), + color = titleColor.invoke(), + modifier = Modifier + .padding( + top = topPadding, + bottom = 8.dp + ) + ) + } else { + Spacer( + modifier = Modifier.height((topPadding - 8.dp).coerceAtLeast(0.dp)) + ) + } + } + + item { + FullscreenSetting() + } + + item { + Spacer( + modifier = Modifier.height(bottomPadding) + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a56c38a0..3a21d81b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -200,6 +200,7 @@ Текст Перекладач Відступи + Інше Налаштування теми Кольори Головні @@ -238,7 +239,9 @@ Розташування текста Відстань між літерами Відступ від виїмки - Застосуйте відступ до ділянки виїмки + Застосувати відступ до ділянки виїмки + Повний екран + Сховати системні панелі та прибрати відступи Структура файлів diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e12a97a..7655ee61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -217,6 +217,7 @@ Text Translator Padding + Misc Theme preferences Colors General @@ -256,6 +257,8 @@ Letter spacing Cutout padding Apply padding to cutout area + Fullscreen + Hide system bars and remove padding Files structure