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