diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/Constants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/Constants.kt index 437d3de4..56c73f53 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/Constants.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/Constants.kt @@ -440,7 +440,7 @@ private fun provideAboutBadges() = listOf( private fun provideFonts() = listOf( FontWithName( "default", - UIText.StringResource(R.string.default_font), + UIText.StringResource(R.string.default_string), FontFamily.Default ), FontWithName( 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 1d9ba3a3..4ec4486c 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 @@ -39,6 +39,7 @@ object DataStoreConstants { val PERCEPTION_EXPANDER_THICKNESS = intPreferencesKey("perception_expander_thickness") val CHECK_FOR_TEXT_UPDATE = booleanPreferencesKey("check_for_text_update") val CHECK_FOR_TEXT_UPDATE_TOAST = booleanPreferencesKey("check_for_text_update_toast") + val SCREEN_ORIENTATION = stringPreferencesKey("screen_orientation") // 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 343d306d..0f48b2af 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 @@ -42,4 +42,5 @@ sealed class MainEvent { data class OnChangePerceptionExpanderThickness(val thickness: Int) : MainEvent() data class OnChangeCheckForTextUpdate(val bool: Boolean) : MainEvent() data class OnChangeCheckForTextUpdateToast(val bool: Boolean) : MainEvent() + data class OnChangeScreenOrientation(val orientation: String) : 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 5e7b001a..8d2a6f22 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 @@ -16,7 +16,9 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data. import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseLayout import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseSortOrder import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toFilesStructure +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderScreenOrientation import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderTextAlignment +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toReaderScreenOrientation import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toTextAlignment import ua.acclorite.book_story.presentation.ui.DarkTheme import ua.acclorite.book_story.presentation.ui.PureDark @@ -79,6 +81,9 @@ data class MainState( val perceptionExpanderThickness: Int = provideDefaultValue { 4 }, val checkForTextUpdate: Boolean = provideDefaultValue { true }, val checkForTextUpdateToast: Boolean = provideDefaultValue { true }, + val screenOrientation: ReaderScreenOrientation = provideDefaultValue { + ReaderScreenOrientation.DEFAULT + }, // Browse Settings val browseFilesStructure: BrowseFilesStructure = provideDefaultValue { @@ -264,6 +269,10 @@ data class MainState( checkForTextUpdateToast = provideValue( CHECK_FOR_TEXT_UPDATE_TOAST ) { checkForTextUpdateToast }, + + screenOrientation = provideValue( + SCREEN_ORIENTATION, convert = { toReaderScreenOrientation() } + ) { screenOrientation }, ) } } 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 a3930e94..2cc8b23e 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 @@ -23,6 +23,7 @@ import ua.acclorite.book_story.presentation.screens.settings.data.SettingsViewMo import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseLayout import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toBrowseSortOrder import ua.acclorite.book_story.presentation.screens.settings.nested.browse.data.toFilesStructure +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toReaderScreenOrientation import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.toTextAlignment import ua.acclorite.book_story.presentation.ui.toDarkTheme import ua.acclorite.book_story.presentation.ui.toPureDark @@ -530,6 +531,20 @@ class MainViewModel @Inject constructor( } } } + + is MainEvent.OnChangeScreenOrientation -> { + viewModelScope.launch(Dispatchers.IO) { + setDatastore.execute( + DataStoreConstants.SCREEN_ORIENTATION, + event.orientation + ) + updateStateWithSavedHandle { + it.copy( + screenOrientation = event.orientation.toReaderScreenOrientation() + ) + } + } + } } } 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 89423194..f3cf614a 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 @@ -1,6 +1,7 @@ package ua.acclorite.book_story.presentation.screens.reader import android.annotation.SuppressLint +import android.content.pm.ActivityInfo import android.os.Build import android.view.WindowManager import androidx.activity.ComponentActivity @@ -174,6 +175,12 @@ fun ReaderScreenRoot(screen: Screen.Reader) { } viewModel.onUpdateCurrentChapter() } + DisposableEffect(mainState.value.screenOrientation) { + context.requestedOrientation = mainState.value.screenOrientation.code + onDispose { + context.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + } + } ReaderScreen(lazyListState = lazyListState) 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 71ac80a3..12768ed8 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 @@ -29,6 +29,7 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.compo 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.ReadingSpeedSubcategory +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.SystemSubcategory 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 @@ -94,6 +95,11 @@ fun ReaderSettingsBottomSheet() { topPadding = 22.dp, bottomPadding = 0.dp ) + SystemSubcategory( + titleColor = { MaterialTheme.colorScheme.onSurface }, + topPadding = 22.dp, + bottomPadding = 0.dp + ) ReadingSpeedSubcategory( titleColor = { MaterialTheme.colorScheme.onSurface }, topPadding = 22.dp, 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 abfdc3c2..d66eafc0 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 @@ -13,6 +13,7 @@ import ua.acclorite.book_story.presentation.screens.settings.nested.reader.compo 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.ReadingSpeedSubcategory +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories.SystemSubcategory 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 @@ -44,6 +45,11 @@ fun LazyListScope.ReaderSettingsCategory( topPadding = 22.dp, bottomPadding = 0.dp ) + SystemSubcategory( + titleColor = titleColor, + topPadding = 22.dp, + bottomPadding = 0.dp + ) ReadingSpeedSubcategory( titleColor = titleColor, topPadding = 22.dp, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt new file mode 100644 index 00000000..7d2a6aa3 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenOrientationSetting.kt @@ -0,0 +1,47 @@ +package ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import ua.acclorite.book_story.R +import ua.acclorite.book_story.domain.model.ButtonItem +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.ChipsWithTitle +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.data.ReaderScreenOrientation + +/** + * Screen Orientation setting. + * Changes Reader's screen orientation. + */ +@Composable +fun ScreenOrientationSetting() { + val state = LocalMainViewModel.current.state + val onMainEvent = LocalMainViewModel.current.onEvent + + ChipsWithTitle( + title = stringResource(id = R.string.screen_orientation_option), + chips = ReaderScreenOrientation.entries.map { + ButtonItem( + id = it.toString(), + title = when (it.code) { + ReaderScreenOrientation.FREE.code -> stringResource(id = R.string.screen_orientation_free) + ReaderScreenOrientation.PORTRAIT.code -> stringResource(id = R.string.screen_orientation_portrait) + ReaderScreenOrientation.LANDSCAPE.code -> stringResource(id = R.string.screen_orientation_landscape) + ReaderScreenOrientation.LOCKED_PORTRAIT.code -> stringResource(id = R.string.screen_orientation_locked_portrait) + ReaderScreenOrientation.LOCKED_LANDSCAPE.code -> stringResource(id = R.string.screen_orientation_locked_landscape) + else -> stringResource(id = R.string.default_string) + }, + textStyle = MaterialTheme.typography.labelLarge, + selected = it == state.value.screenOrientation + ) + }, + onClick = { + onMainEvent( + MainEvent.OnChangeScreenOrientation( + it.id + ) + ) + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/SystemSubcategory.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/SystemSubcategory.kt new file mode 100644 index 00000000..e01c8fc6 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/subcategories/SystemSubcategory.kt @@ -0,0 +1,39 @@ +@file:Suppress("FunctionName") + +package ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.subcategories + +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Dp +import ua.acclorite.book_story.R +import ua.acclorite.book_story.presentation.screens.settings.components.SettingsSubcategory +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings.ScreenOrientationSetting + +/** + * System subcategory. + * Contains all settings that are related to system (e.g. screen orientation). + */ +fun LazyListScope.SystemSubcategory( + titleColor: @Composable () -> Color = { MaterialTheme.colorScheme.primary }, + title: @Composable () -> String = { stringResource(id = R.string.system_reader_settings) }, + showTitle: Boolean = true, + showDivider: Boolean = true, + topPadding: Dp, + bottomPadding: Dp +) { + SettingsSubcategory( + titleColor = titleColor, + title = title, + showTitle = showTitle, + showDivider = showDivider, + topPadding = topPadding, + bottomPadding = bottomPadding + ) { + item { + ScreenOrientationSetting() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/data/ReaderScreenOrientation.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/data/ReaderScreenOrientation.kt new file mode 100644 index 00000000..fc26f4b0 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/data/ReaderScreenOrientation.kt @@ -0,0 +1,16 @@ +package ua.acclorite.book_story.presentation.screens.settings.nested.reader.data + +import android.content.pm.ActivityInfo + +enum class ReaderScreenOrientation(val code: Int) { + DEFAULT(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED), + FREE(ActivityInfo.SCREEN_ORIENTATION_USER), + PORTRAIT(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT), + LANDSCAPE(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE), + LOCKED_PORTRAIT(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), + LOCKED_LANDSCAPE(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE), +} + +fun String.toReaderScreenOrientation(): ReaderScreenOrientation { + return ReaderScreenOrientation.valueOf(this) +} \ 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 1de88346..28b91cf0 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,5 +1,7 @@ + + За замовчуванням Нові оновлення @@ -210,6 +212,7 @@ Відступи Інше Швидкість читання + Система Налаштування теми Кольори Головні @@ -263,6 +266,7 @@ Перевіряти на оновлення тексту Автоматично перевіряти чи є оновлення тексту Показувати повідомлення \"текст актуальний\" + Орієнтація екрана Структура файлів @@ -323,6 +327,13 @@ Центр Кінець + + Вільно + Портрет + Альбом + Заблокований портрет + Заблокований альбом + Меркурій Нептун @@ -565,9 +576,6 @@ Бажаєте дізнатися, як користуватися застосунком, прочитавши екран Допомоги? - - За замовчуванням - Сьогодні Вчора diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 829544d0..b9cd9aa5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ 1.2.0 Book\'s Story + Default New updates @@ -212,6 +213,7 @@ Padding Misc Reading speed + System Theme preferences Colors General @@ -265,6 +267,7 @@ Check for text update Automatically check whether there is text update Show \"text is up-to-date\" toast + Screen orientation Files structure @@ -325,6 +328,13 @@ Center End + + Free + Portrait + Landscape + Locked portrait + Locked landscape + Mercury Neptune @@ -566,9 +576,6 @@ Would you like to learn how to use the app by reading Help screen? - - Default - Today Yesterday