From 5e628d9b28bb48f3b047ed80d1688e9c41df6114 Mon Sep 17 00:00:00 2001
From: Acclorite <140836141+Acclorite@users.noreply.github.com>
Date: Sun, 8 Sep 2024 00:42:13 +0300
Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20"Keep=20Screen=20On"=20option?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Added "Keep screen on" option in Reader
* If true, keeps screen awake in Reader infinitely, does not apply to other screens
---
.../core/constants/DataStoreConstants.kt | 1 +
.../book_story/presentation/data/MainEvent.kt | 1 +
.../book_story/presentation/data/MainState.kt | 5 +++
.../presentation/data/MainViewModel.kt | 14 +++++++++
.../screens/reader/ReaderScreen.kt | 10 ++++++
.../screens/reader/data/ReaderViewModel.kt | 6 ----
.../settings/KeepScreenOnSetting.kt | 31 +++++++++++++++++++
.../subcategories/MiscSubcategory.kt | 5 +++
app/src/main/res/values-uk/strings.xml | 4 ++-
app/src/main/res/values/strings.xml | 2 ++
10 files changed, 72 insertions(+), 7 deletions(-)
create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/KeepScreenOnSetting.kt
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