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 14513581..93abb385 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 @@ -31,6 +31,7 @@ object DataStoreConstants { val LETTER_SPACING = intPreferencesKey("letter_spacing") val CUTOUT_PADDING = booleanPreferencesKey("cutout_padding") val FULLSCREEN = booleanPreferencesKey("fullscreen") + val KEEP_SCREEN_ON = booleanPreferencesKey("keep_screen_on") // 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 5068b0ba..122975de 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 @@ -34,4 +34,5 @@ sealed class MainEvent { data class OnChangeAbsoluteDark(val bool: Boolean) : MainEvent() data class OnChangeCutoutPadding(val bool: Boolean) : MainEvent() data class OnChangeFullscreen(val bool: Boolean) : MainEvent() + data class OnChangeKeepScreenOn(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 a9065ed0..4540752d 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 @@ -71,6 +71,7 @@ data class MainState( val letterSpacing: Int = provideDefaultValue { 0 }, val cutoutPadding: Boolean = provideDefaultValue { false }, val fullscreen: Boolean = provideDefaultValue { true }, + val keepScreenOn: Boolean = provideDefaultValue { true }, // Browse Settings val browseFilesStructure: BrowseFilesStructure = provideDefaultValue { @@ -224,6 +225,10 @@ data class MainState( fullscreen = provideValue( FULLSCREEN ) { fullscreen }, + + keepScreenOn = provideValue( + KEEP_SCREEN_ON + ) { keepScreenOn }, ) } } 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 5b840b39..62027036 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 @@ -415,6 +415,20 @@ class MainViewModel @Inject constructor( } } } + + is MainEvent.OnChangeKeepScreenOn -> { + viewModelScope.launch(Dispatchers.IO) { + setDatastore.execute( + DataStoreConstants.KEEP_SCREEN_ON, + event.bool + ) + updateStateWithSavedHandle { + it.copy( + keepScreenOn = 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 87aebc62..089b30f6 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 @@ -58,6 +58,8 @@ import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import ua.acclorite.book_story.R import ua.acclorite.book_story.presentation.core.components.CustomAnimatedVisibility import ua.acclorite.book_story.presentation.core.components.CustomSelectionContainer @@ -140,6 +142,14 @@ fun ReaderScreenRoot(screen: Screen.Reader) { ) ) } + LaunchedEffect(mainState.value.keepScreenOn) { + withContext(Dispatchers.Main) { + when (mainState.value.keepScreenOn) { + true -> context.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + false -> context.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + } + } LaunchedEffect(lazyListState) { viewModel.onUpdateProgress { onLibraryEvent(LibraryEvent.OnUpdateBook(it)) 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 ebba1a94..4e8d85d9 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 @@ -4,7 +4,6 @@ import android.app.SearchManager import android.content.Intent import android.net.Uri import android.util.Log -import android.view.WindowManager import androidx.activity.ComponentActivity import androidx.compose.runtime.snapshotFlow import androidx.core.view.WindowCompat @@ -23,7 +22,6 @@ 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 @@ -417,10 +415,6 @@ class ReaderViewModel @Inject constructor( clear() launch { - withContext(Dispatchers.Main) { - activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } - onEvent( ReaderEvent.OnShowHideMenu( show = false, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt new file mode 100644 index 00000000..5af81e36 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.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 + +/** + * Keep Screen On setting. + * If true, keeps screen awake in Reader. + */ +@Composable +fun KeepScreenOnSetting() { + val state = LocalMainViewModel.current.state + val onMainEvent = LocalMainViewModel.current.onEvent + + SwitchWithTitle( + selected = state.value.keepScreenOn, + title = stringResource(id = R.string.keep_screen_on_option), + description = stringResource(id = R.string.keep_screen_on_option_desc), + onClick = { + onMainEvent( + MainEvent.OnChangeKeepScreenOn( + !state.value.keepScreenOn + ) + ) + } + ) +} \ 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 index 4d0f4562..bf560633 100644 --- 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 @@ -17,6 +17,7 @@ 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 +import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings.KeepScreenOnSetting /** * Misc subcategory. @@ -51,6 +52,10 @@ fun LazyListScope.MiscSubcategory( FullscreenSetting() } + item { + KeepScreenOnSetting() + } + item { Spacer( modifier = Modifier.height(bottomPadding) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3a21d81b..1a78bde9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -213,7 +213,7 @@ Темна тема Суцільна темрява (ОЛЕД) Абсолютна темрява - Змініть колір фона на повністю чорний + Змінити колір фона на повністю чорний Контрастність теми Тема застосунка Перевіряти на оновлення @@ -242,6 +242,8 @@ Застосувати відступ до ділянки виїмки Повний екран Сховати системні панелі та прибрати відступи + Тримати екран увімкненим + Тримати екран увімкненим нескінченно Структура файлів diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7655ee61..797f1ab5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -259,6 +259,8 @@ Apply padding to cutout area Fullscreen Hide system bars and remove padding + Keep screen on + Keep screen awake infinitely Files structure