feat: add "horizontal limiter" option
* Option to show horizontal ruler and dim unfocused part of the screen (both height of the focused part and its vertical position can be customized) * Option to hide horizontal ruler * Option to change horizontal ruler's thickness * Option to change dimming (0-100%) Resolves: #197
This commit is contained in:
parent
ffa249ab78
commit
959a193e52
14 changed files with 387 additions and 0 deletions
|
|
@ -180,6 +180,26 @@ class SettingsManager @Inject constructor(
|
|||
val perceptionExpanderThickness = setting<Int, Int>(
|
||||
key = intPreferencesKey("perception_expander_thickness"), default = 4
|
||||
)
|
||||
val horizontalLimiter = setting<Boolean, Boolean>(
|
||||
key = booleanPreferencesKey("horizontal_limiter"), default = false
|
||||
)
|
||||
val horizontalLimiterHeight = setting<Int, Int>(
|
||||
key = intPreferencesKey("horizontal_limiter_height"), default = 6
|
||||
)
|
||||
val horizontalLimiterVerticalOffset = setting<Float, Double>(
|
||||
key = doublePreferencesKey("horizontal_limiter_vertical_offset"), default = 0.5f,
|
||||
serialize = { it.toDouble() }, deserialize = { it.toFloat() }
|
||||
)
|
||||
val horizontalLimiterRuler = setting<Boolean, Boolean>(
|
||||
key = booleanPreferencesKey("horizontal_limiter_ruler"), default = true
|
||||
)
|
||||
val horizontalLimiterRulerThickness = setting<Int, Int>(
|
||||
key = intPreferencesKey("horizontal_limiter_ruler_thickness"), default = 4
|
||||
)
|
||||
val horizontalLimiterDimming = setting<Float, Double>(
|
||||
key = doublePreferencesKey("horizontal_limiter_dimming"), default = 0.0f,
|
||||
serialize = { it.toDouble() }, deserialize = { it.toFloat() }
|
||||
)
|
||||
val screenOrientation = setting<ReaderScreenOrientation, String>(
|
||||
key = stringPreferencesKey("screen_orientation"), default = ReaderScreenOrientation.DEFAULT,
|
||||
serialize = { it.name }, deserialize = { ReaderScreenOrientation.valueOf(it) }
|
||||
|
|
|
|||
|
|
@ -166,6 +166,16 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
|
|||
) {
|
||||
(settings.perceptionExpanderThickness.lastValue * 0.25f).dp
|
||||
}
|
||||
val horizontalLimiterHeight = remember(
|
||||
settings.horizontalLimiterHeight.value
|
||||
) {
|
||||
(settings.horizontalLimiterHeight.lastValue * 20).dp
|
||||
}
|
||||
val horizontalLimiterRulerThickness = remember(
|
||||
settings.horizontalLimiterRulerThickness.value
|
||||
) {
|
||||
(settings.horizontalLimiterRulerThickness.lastValue * 0.25f).dp
|
||||
}
|
||||
val horizontalGestureSensitivity = remember(settings.horizontalGestureSensitivity.value) {
|
||||
(36f + settings.horizontalGestureSensitivity.lastValue * (4f - 36f)).dp
|
||||
}
|
||||
|
|
@ -395,6 +405,12 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
|
|||
perceptionExpander = settings.perceptionExpander.value,
|
||||
perceptionExpanderPadding = perceptionExpanderPadding,
|
||||
perceptionExpanderThickness = perceptionExpanderThickness,
|
||||
horizontalLimiter = settings.horizontalLimiter.value,
|
||||
horizontalLimiterHeight = horizontalLimiterHeight,
|
||||
horizontalLimiterVerticalOffset = settings.horizontalLimiterVerticalOffset.value,
|
||||
horizontalLimiterRuler = settings.horizontalLimiterRuler.value,
|
||||
horizontalLimiterRulerThickness = horizontalLimiterRulerThickness,
|
||||
horizontalLimiterDimming = settings.horizontalLimiterDimming.value,
|
||||
currentChapterProgress = state.value.currentChapterProgress,
|
||||
isLoading = state.value.isLoading,
|
||||
errorMessage = state.value.errorMessage,
|
||||
|
|
|
|||
|
|
@ -46,6 +46,12 @@ fun ReaderContent(
|
|||
perceptionExpander: Boolean,
|
||||
perceptionExpanderPadding: Dp,
|
||||
perceptionExpanderThickness: Dp,
|
||||
horizontalLimiter: Boolean,
|
||||
horizontalLimiterHeight: Dp,
|
||||
horizontalLimiterVerticalOffset: Float,
|
||||
horizontalLimiterRulerThickness: Dp,
|
||||
horizontalLimiterRuler: Boolean,
|
||||
horizontalLimiterDimming: Float,
|
||||
currentChapterProgress: Float,
|
||||
isLoading: Boolean,
|
||||
errorMessage: UIText?,
|
||||
|
|
@ -124,6 +130,12 @@ fun ReaderContent(
|
|||
perceptionExpander = perceptionExpander,
|
||||
perceptionExpanderPadding = perceptionExpanderPadding,
|
||||
perceptionExpanderThickness = perceptionExpanderThickness,
|
||||
horizontalLimiter = horizontalLimiter,
|
||||
horizontalLimiterHeight = horizontalLimiterHeight,
|
||||
horizontalLimiterVerticalOffset = horizontalLimiterVerticalOffset,
|
||||
horizontalLimiterRuler = horizontalLimiterRuler,
|
||||
horizontalLimiterRulerThickness = horizontalLimiterRulerThickness,
|
||||
horizontalLimiterDimming = horizontalLimiterDimming,
|
||||
currentChapterProgress = currentChapterProgress,
|
||||
isLoading = isLoading,
|
||||
checkpoints = checkpoints,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.reader
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.LocalWindowInfo
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import ua.acclorite.book_story.ui.theme.DefaultTransition
|
||||
|
||||
@Composable
|
||||
fun ReaderHorizontalLimiter(
|
||||
horizontalLimiter: Boolean,
|
||||
horizontalLimiterHeight: Dp,
|
||||
horizontalLimiterVerticalOffset: Float,
|
||||
horizontalLimiterRulerThickness: Dp,
|
||||
horizontalLimiterRuler: Boolean,
|
||||
horizontalLimiterDimming: Float,
|
||||
horizontalLimiterDimmingColor: Color,
|
||||
horizontalLimiterRulerColor: Color
|
||||
) {
|
||||
val density = LocalDensity.current
|
||||
val windowInfo = LocalWindowInfo.current
|
||||
val containerHeight = remember(density, windowInfo.containerSize, horizontalLimiterHeight) {
|
||||
with(density) {
|
||||
windowInfo.containerSize.height.toDp() - horizontalLimiterHeight
|
||||
}
|
||||
}
|
||||
val verticalLimiterTopOffsetDp = remember(
|
||||
containerHeight,
|
||||
horizontalLimiterVerticalOffset
|
||||
) {
|
||||
containerHeight * horizontalLimiterVerticalOffset
|
||||
}
|
||||
val verticalLimiterBottomOffsetDp = remember(
|
||||
containerHeight,
|
||||
horizontalLimiterVerticalOffset
|
||||
) {
|
||||
containerHeight * (1 - horizontalLimiterVerticalOffset)
|
||||
}
|
||||
|
||||
DefaultTransition(horizontalLimiter) {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize()
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(verticalLimiterTopOffsetDp)
|
||||
.background(horizontalLimiterDimmingColor.copy(alpha = horizontalLimiterDimming))
|
||||
)
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.height(
|
||||
horizontalLimiterHeight.coerceAtMost(
|
||||
with(density) { windowInfo.containerSize.height.toDp() }
|
||||
)
|
||||
),
|
||||
verticalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
if (horizontalLimiterRuler) {
|
||||
repeat(2) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
horizontalLimiterRulerThickness,
|
||||
horizontalLimiterRulerColor
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(verticalLimiterBottomOffsetDp)
|
||||
.background(horizontalLimiterDimmingColor.copy(alpha = horizontalLimiterDimming))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -51,6 +51,12 @@ fun ReaderScaffold(
|
|||
perceptionExpander: Boolean,
|
||||
perceptionExpanderPadding: Dp,
|
||||
perceptionExpanderThickness: Dp,
|
||||
horizontalLimiter: Boolean,
|
||||
horizontalLimiterHeight: Dp,
|
||||
horizontalLimiterVerticalOffset: Float,
|
||||
horizontalLimiterRulerThickness: Dp,
|
||||
horizontalLimiterRuler: Boolean,
|
||||
horizontalLimiterDimming: Float,
|
||||
currentChapterProgress: Float,
|
||||
isLoading: Boolean,
|
||||
checkpoints: List<Checkpoint>,
|
||||
|
|
@ -212,6 +218,17 @@ fun ReaderScaffold(
|
|||
perceptionExpanderColor = fontColor
|
||||
)
|
||||
|
||||
ReaderHorizontalLimiter(
|
||||
horizontalLimiter = horizontalLimiter,
|
||||
horizontalLimiterHeight = horizontalLimiterHeight,
|
||||
horizontalLimiterVerticalOffset = horizontalLimiterVerticalOffset,
|
||||
horizontalLimiterRulerThickness = horizontalLimiterRulerThickness,
|
||||
horizontalLimiterRuler = horizontalLimiterRuler,
|
||||
horizontalLimiterDimming = horizontalLimiterDimming,
|
||||
horizontalLimiterDimmingColor = backgroundColor,
|
||||
horizontalLimiterRulerColor = fontColor
|
||||
)
|
||||
|
||||
if (isLoading) {
|
||||
ReaderLoadingPlaceholder()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@ import ua.acclorite.book_story.R
|
|||
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategory
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HighlightedReadingOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HighlightedReadingThicknessOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterDimmingOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterHeightOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterRulerOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterRulerThicknessOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.HorizontalLimiterVerticalOffsetOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.PerceptionExpanderOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.PerceptionExpanderPaddingOption
|
||||
import ua.acclorite.book_story.ui.settings.reader.reading_speed.components.PerceptionExpanderThicknessOption
|
||||
|
|
@ -52,5 +58,29 @@ fun LazyListScope.ReadingSpeedSubcategory(
|
|||
item {
|
||||
PerceptionExpanderThicknessOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterHeightOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterVerticalOffsetOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterRulerOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterRulerThicknessOption()
|
||||
}
|
||||
|
||||
item {
|
||||
HorizontalLimiterDimmingOption()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SliderWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterDimmingOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
ExpandingTransition(visible = settings.horizontalLimiter.value) {
|
||||
SliderWithTitle(
|
||||
value = settings.horizontalLimiterDimming.value to "%",
|
||||
toValue = 100,
|
||||
title = stringResource(id = R.string.horizontal_limiter_dimming_option),
|
||||
onValueChange = {
|
||||
settings.horizontalLimiterDimming.update(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SliderWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterHeightOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
ExpandingTransition(visible = settings.horizontalLimiter.value) {
|
||||
SliderWithTitle(
|
||||
value = settings.horizontalLimiterHeight.value to "pt",
|
||||
fromValue = 1,
|
||||
toValue = 24,
|
||||
title = stringResource(id = R.string.horizontal_limiter_height_option),
|
||||
onValueChange = {
|
||||
settings.horizontalLimiterHeight.update(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SwitchWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
SwitchWithTitle(
|
||||
selected = settings.horizontalLimiter.value,
|
||||
title = stringResource(id = R.string.horizontal_limiter_option),
|
||||
description = stringResource(id = R.string.horizontal_limiter_option_desc),
|
||||
onClick = {
|
||||
settings.horizontalLimiter.update(!settings.horizontalLimiter.lastValue)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SwitchWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterRulerOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
ExpandingTransition(visible = settings.horizontalLimiter.value) {
|
||||
SwitchWithTitle(
|
||||
selected = settings.horizontalLimiterRuler.value,
|
||||
title = stringResource(id = R.string.horizontal_limiter_ruler_option),
|
||||
onClick = {
|
||||
settings.horizontalLimiterRuler.update(!settings.horizontalLimiterRuler.lastValue)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SliderWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterRulerThicknessOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
ExpandingTransition(visible = settings.horizontalLimiter.value && settings.horizontalLimiterRuler.value) {
|
||||
SliderWithTitle(
|
||||
value = settings.horizontalLimiterRulerThickness.value to "pt",
|
||||
fromValue = 1,
|
||||
toValue = 12,
|
||||
title = stringResource(id = R.string.horizontal_limiter_ruler_thickness_option),
|
||||
onValueChange = {
|
||||
settings.horizontalLimiterRulerThickness.update(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Book's Story — free and open-source Material You eBook reader.
|
||||
* Copyright (C) 2024-2025 Acclorite
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
|
||||
package ua.acclorite.book_story.ui.settings.reader.reading_speed.components
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import ua.acclorite.book_story.R
|
||||
import ua.acclorite.book_story.ui.common.components.settings.SliderWithTitle
|
||||
import ua.acclorite.book_story.ui.common.helpers.LocalSettings
|
||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||
|
||||
@Composable
|
||||
fun HorizontalLimiterVerticalOffsetOption() {
|
||||
val settings = LocalSettings.current
|
||||
|
||||
ExpandingTransition(visible = settings.horizontalLimiter.value) {
|
||||
SliderWithTitle(
|
||||
value = settings.horizontalLimiterVerticalOffset.value to "%",
|
||||
toValue = 100,
|
||||
title = stringResource(id = R.string.horizontal_limiter_vertical_offset_option),
|
||||
onValueChange = {
|
||||
settings.horizontalLimiterVerticalOffset.update(it)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -194,6 +194,15 @@
|
|||
<string name="perception_expander_option_desc">Збільшіть швидкість вашого читання фокусуючись на середині</string>
|
||||
<string name="perception_expander_padding_option">Бокові відступи лінії</string>
|
||||
<string name="perception_expander_thickness_option">Товщина лінії</string>
|
||||
<string name="horizontal_limiter_option">Горизонтальний обмежувач</string>
|
||||
<string name="horizontal_limiter_option_desc">
|
||||
Показати горизонтальну лінійку та затемнити несфокусовану частину екрана
|
||||
</string>
|
||||
<string name="horizontal_limiter_height_option">Висота</string>
|
||||
<string name="horizontal_limiter_vertical_offset_option">Вертикальне зміщення</string>
|
||||
<string name="horizontal_limiter_ruler_option">Горизонтальна лінійка</string>
|
||||
<string name="horizontal_limiter_ruler_thickness_option">Товщина лінійки</string>
|
||||
<string name="horizontal_limiter_dimming_option">Затемнення</string>
|
||||
<string name="screen_orientation_option">Орієнтація екрана</string>
|
||||
<string name="custom_screen_brightness_option">Користувацька яскравість</string>
|
||||
<string name="screen_brightness_option">Яскравість</string>
|
||||
|
|
|
|||
|
|
@ -218,6 +218,15 @@
|
|||
</string>
|
||||
<string name="perception_expander_padding_option">Line side margin</string>
|
||||
<string name="perception_expander_thickness_option">Line thickness</string>
|
||||
<string name="horizontal_limiter_option">Horizontal limiter</string>
|
||||
<string name="horizontal_limiter_option_desc">
|
||||
Show horizontal ruler and dim unfocused part of the screen
|
||||
</string>
|
||||
<string name="horizontal_limiter_height_option">Height</string>
|
||||
<string name="horizontal_limiter_vertical_offset_option">Vertical offset</string>
|
||||
<string name="horizontal_limiter_ruler_option">Horizontal ruler</string>
|
||||
<string name="horizontal_limiter_ruler_thickness_option">Ruler thickness</string>
|
||||
<string name="horizontal_limiter_dimming_option">Dimming</string>
|
||||
<string name="screen_orientation_option">Screen orientation</string>
|
||||
<string name="custom_screen_brightness_option">Custom brightness</string>
|
||||
<string name="screen_brightness_option">Brightness</string>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue