diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt
index 85f16dc1..2826441e 100644
--- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/CommonConstants.kt
@@ -1,3 +1,5 @@
+@file:Suppress("SameReturnValue")
+
package ua.acclorite.book_story.presentation.core.constants
import androidx.compose.ui.graphics.Color
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 4ec4486c..51ae30ae 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
@@ -1,6 +1,7 @@
package ua.acclorite.book_story.presentation.core.constants
import androidx.datastore.preferences.core.booleanPreferencesKey
+import androidx.datastore.preferences.core.doublePreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.stringSetPreferencesKey
@@ -40,6 +41,8 @@ object DataStoreConstants {
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")
+ val CUSTOM_SCREEN_BRIGHTNESS = booleanPreferencesKey("custom_screen_brightness")
+ val SCREEN_BRIGHTNESS = doublePreferencesKey("screen_brightness")
// Browse settings
val BROWSE_FILES_STRUCTURE = stringPreferencesKey("browse_files_structure")
diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/LinkConstants.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/LinkConstants.kt
index 475dca69..317c5dd0 100644
--- a/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/LinkConstants.kt
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/constants/LinkConstants.kt
@@ -1,3 +1,5 @@
+@file:Suppress("SameReturnValue")
+
package ua.acclorite.book_story.presentation.core.constants
fun Constants.provideDownloadLatestReleasePage() =
diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/LifecycleExtensions.kt b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/LifecycleExtensions.kt
index 974fbe83..1e26a511 100644
--- a/app/src/main/java/ua/acclorite/book_story/presentation/core/util/LifecycleExtensions.kt
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/core/util/LifecycleExtensions.kt
@@ -1,6 +1,7 @@
package ua.acclorite.book_story.presentation.core.util
import android.content.Intent
+import android.view.WindowManager
import androidx.activity.ComponentActivity
fun Intent.launchActivity(
@@ -21,4 +22,11 @@ fun Intent.launchActivity(
error()
return
}
+}
+
+fun ComponentActivity.setBrightness(brightness: Float?) {
+ window.attributes.apply {
+ screenBrightness = brightness ?: WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
+ window.attributes = this
+ }
}
\ No newline at end of file
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 ef032e08..9eeeda76 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
@@ -49,4 +49,6 @@ sealed class MainEvent {
data class OnChangeCheckForTextUpdate(val value: Boolean) : MainEvent()
data class OnChangeCheckForTextUpdateToast(val value: Boolean) : MainEvent()
data class OnChangeScreenOrientation(val value: String) : MainEvent()
+ data class OnChangeCustomScreenBrightness(val value: Boolean) : MainEvent()
+ data class OnChangeScreenBrightness(val value: Float) : 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 a44c2dfe..51114112 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
@@ -82,6 +82,8 @@ data class MainState(
val screenOrientation: ReaderScreenOrientation = provideDefaultValue {
ReaderScreenOrientation.DEFAULT
},
+ val customScreenBrightness: Boolean = provideDefaultValue { false },
+ val screenBrightness: Float = provideDefaultValue { 0.5f },
// Browse Settings
val browseFilesStructure: BrowseFilesStructure = provideDefaultValue {
@@ -271,6 +273,14 @@ data class MainState(
screenOrientation = provideValue(
SCREEN_ORIENTATION, convert = { toReaderScreenOrientation() }
) { screenOrientation },
+
+ customScreenBrightness = provideValue(
+ CUSTOM_SCREEN_BRIGHTNESS
+ ) { customScreenBrightness },
+
+ screenBrightness = provideValue(
+ SCREEN_BRIGHTNESS, convert = { this.toFloat() }
+ ) { screenBrightness },
)
}
}
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 b07a5434..6a6c16ed 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
@@ -373,6 +373,22 @@ class MainViewModel @Inject constructor(
it.copy(screenOrientation = toReaderScreenOrientation())
}
)
+
+ is MainEvent.OnChangeCustomScreenBrightness -> handleDatastoreUpdate(
+ key = DataStoreConstants.CUSTOM_SCREEN_BRIGHTNESS,
+ value = event.value,
+ updateState = {
+ it.copy(customScreenBrightness = this)
+ }
+ )
+
+ is MainEvent.OnChangeScreenBrightness -> handleDatastoreUpdate(
+ key = DataStoreConstants.SCREEN_BRIGHTNESS,
+ value = event.value.toDouble(),
+ updateState = {
+ it.copy(screenBrightness = this.toFloat())
+ }
+ )
}
}
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 526bbd4a..fb657169 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
@@ -55,8 +55,6 @@ 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.domain.model.Chapter
import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility
@@ -67,6 +65,7 @@ import ua.acclorite.book_story.presentation.core.constants.provideFonts
import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator
import ua.acclorite.book_story.presentation.core.navigation.Screen
import ua.acclorite.book_story.presentation.core.util.noRippleClickable
+import ua.acclorite.book_story.presentation.core.util.setBrightness
import ua.acclorite.book_story.presentation.core.util.showToast
import ua.acclorite.book_story.presentation.data.MainViewModel
import ua.acclorite.book_story.presentation.screens.history.data.HistoryEvent
@@ -161,14 +160,6 @@ 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) {
onEvent(
ReaderEvent.OnUpdateProgress(
@@ -185,6 +176,28 @@ fun ReaderScreenRoot(screen: Screen.Reader) {
context.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
}
+ DisposableEffect(
+ mainState.value.screenBrightness,
+ mainState.value.customScreenBrightness
+ ) {
+ when (mainState.value.customScreenBrightness) {
+ true -> context.setBrightness(brightness = mainState.value.screenBrightness)
+ false -> context.setBrightness(brightness = null)
+ }
+
+ onDispose {
+ context.setBrightness(brightness = null)
+ }
+ }
+ DisposableEffect(mainState.value.keepScreenOn) {
+ when (mainState.value.keepScreenOn) {
+ true -> context.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+ false -> context.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+ }
+ onDispose {
+ context.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+ }
+ }
ReaderScreen(lazyListState = lazyListState)
@@ -195,7 +208,6 @@ fun ReaderScreenRoot(screen: Screen.Reader) {
context.window,
context.window.decorView
).show(WindowInsetsCompat.Type.systemBars())
- context.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
}
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 e5386acc..22284dc0 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
@@ -38,6 +38,7 @@ import ua.acclorite.book_story.domain.util.UIViewModel
import ua.acclorite.book_story.presentation.core.navigation.Screen
import ua.acclorite.book_story.presentation.core.util.coerceAndPreventNaN
import ua.acclorite.book_story.presentation.core.util.launchActivity
+import ua.acclorite.book_story.presentation.core.util.setBrightness
import javax.inject.Inject
import kotlin.math.roundToInt
@@ -216,6 +217,7 @@ class ReaderViewModel @Inject constructor(
event.context.window,
event.context.window.decorView
).show(WindowInsetsCompat.Type.systemBars())
+ event.context.setBrightness(brightness = null)
event.navigate()
}
diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CustomScreenBrightnessSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CustomScreenBrightnessSetting.kt
new file mode 100644
index 00000000..baac5342
--- /dev/null
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/CustomScreenBrightnessSetting.kt
@@ -0,0 +1,30 @@
+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.settings.SwitchWithTitle
+import ua.acclorite.book_story.presentation.data.MainEvent
+import ua.acclorite.book_story.presentation.data.MainViewModel
+
+/**
+ * Custom Screen Brightness setting.
+ * If true, applies custom brightness in Reader.
+ */
+@Composable
+fun CustomScreenBrightnessSetting() {
+ val state = MainViewModel.getState()
+ val onMainEvent = MainViewModel.getEvent()
+
+ SwitchWithTitle(
+ selected = state.value.customScreenBrightness,
+ title = stringResource(id = R.string.custom_screen_brightness_option),
+ onClick = {
+ onMainEvent(
+ MainEvent.OnChangeCustomScreenBrightness(
+ !state.value.customScreenBrightness
+ )
+ )
+ }
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenBrightnessSetting.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenBrightnessSetting.kt
new file mode 100644
index 00000000..02352cee
--- /dev/null
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/settings/nested/reader/components/settings/ScreenBrightnessSetting.kt
@@ -0,0 +1,29 @@
+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.settings.SliderWithTitle
+import ua.acclorite.book_story.presentation.data.MainEvent
+import ua.acclorite.book_story.presentation.data.MainViewModel
+
+/**
+ * Screen Brightness setting.
+ * Changes screen brightness in Reader.
+ */
+@Composable
+fun ScreenBrightnessSetting() {
+ val state = MainViewModel.getState()
+ val onMainEvent = MainViewModel.getEvent()
+
+ SliderWithTitle(
+ value = state.value.screenBrightness to "",
+ toValue = 100,
+ title = stringResource(id = R.string.screen_brightness_option),
+ onValueChange = {
+ onMainEvent(
+ MainEvent.OnChangeScreenBrightness(it)
+ )
+ }
+ )
+}
\ 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
index e01c8fc6..47928c76 100644
--- 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
@@ -10,6 +10,8 @@ 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.CustomScreenBrightnessSetting
+import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings.ScreenBrightnessSetting
import ua.acclorite.book_story.presentation.screens.settings.nested.reader.components.settings.ScreenOrientationSetting
/**
@@ -32,6 +34,14 @@ fun LazyListScope.SystemSubcategory(
topPadding = topPadding,
bottomPadding = bottomPadding
) {
+ item {
+ CustomScreenBrightnessSetting()
+ }
+
+ item {
+ ScreenBrightnessSetting()
+ }
+
item {
ScreenOrientationSetting()
}
diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/ui/ThemeLogger.kt b/app/src/main/java/ua/acclorite/book_story/presentation/ui/ThemeLogger.kt
index 523cc643..5a52296b 100644
--- a/app/src/main/java/ua/acclorite/book_story/presentation/ui/ThemeLogger.kt
+++ b/app/src/main/java/ua/acclorite/book_story/presentation/ui/ThemeLogger.kt
@@ -1,3 +1,5 @@
+@file:Suppress("unused")
+
package ua.acclorite.book_story.presentation.ui
import android.util.Log
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index e7e7bc80..20dd21ca 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -262,6 +262,8 @@
Автоматично перевіряти чи є оновлення тексту
Показувати повідомлення \"текст актуальний\"
Орієнтація екрана
+ Користувацька яскравість
+ Яскравість
Структура файлів
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index eaa5bd3f..55a0501c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -263,6 +263,8 @@
Automatically check whether there is text update
Show \"text is up-to-date\" toast
Screen orientation
+ Custom brightness
+ Brightness
Files structure