Skip to content

Commit

Permalink
feat(player): Allow negative brightness values (dimming)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmir1 committed Jan 31, 2025
1 parent 2b1dbc1 commit fa1b154
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -666,10 +666,9 @@ class PlayerViewModel @JvmOverloads constructor(
fun changeBrightnessTo(
brightness: Float,
) {
currentBrightness.update { _ -> brightness.coerceIn(-0.75f, 1f) }
activity.window.attributes = activity.window.attributes.apply {
screenBrightness = brightness.coerceIn(0f, 1f).also {
currentBrightness.update { _ -> it }
}
screenBrightness = brightness.coerceIn(0f, 1f)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import eu.kanade.tachiyomi.ui.player.PlayerUpdates
import eu.kanade.tachiyomi.ui.player.PlayerViewModel
import eu.kanade.tachiyomi.ui.player.Sheets
import eu.kanade.tachiyomi.ui.player.VideoAspect
import eu.kanade.tachiyomi.ui.player.controls.components.BrightnessOverlay
import eu.kanade.tachiyomi.ui.player.controls.components.BrightnessSlider
import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton
import eu.kanade.tachiyomi.ui.player.controls.components.SeekbarWithTimers
Expand Down Expand Up @@ -113,6 +114,7 @@ fun PlayerControls(
val seekText by viewModel.seekText.collectAsState()
val currentChapter by viewModel.currentChapter.collectAsState()
val chapters by viewModel.chapters.collectAsState()
val currentBrightness by viewModel.currentBrightness.collectAsState()

val playerTimeToDisappear by playerPreferences.playerTimeToDisappear().collectAsState()
var isSeeking by remember { mutableStateOf(false) }
Expand Down Expand Up @@ -224,7 +226,7 @@ fun PlayerControls(
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
},
) { BrightnessSlider(brightness, 0f..1f) }
) { BrightnessSlider(brightness, 0f..1f, 0f..0.75f) }

AnimatedVisibility(
isVolumeSliderShown,
Expand Down Expand Up @@ -618,6 +620,10 @@ fun PlayerControls(
},
onDismissRequest = { viewModel.showDialog(Dialogs.None) },
)

BrightnessOverlay(
brightness = currentBrightness,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package eu.kanade.tachiyomi.ui.player.controls.components

import androidx.annotation.FloatRange
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.fillMaxSize
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.graphics.graphicsLayer
import kotlin.math.abs

@Composable
fun BrightnessOverlay(
@FloatRange(from = -0.75, to = 1.0) brightness: Float,
modifier: Modifier = Modifier,
) {
if (brightness < 0) {
val brightnessAlpha = remember(brightness) {
abs(brightness)
}

Canvas(
modifier = modifier
.fillMaxSize()
.graphicsLayer {
alpha = brightnessAlpha
},
) {
drawRect(Color.Black)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.material.icons.automirrored.filled.VolumeUp
import androidx.compose.material.icons.filled.BrightnessHigh
import androidx.compose.material.icons.filled.BrightnessLow
import androidx.compose.material.icons.filled.BrightnessMedium
import androidx.compose.material.icons.filled.ModeNight
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
Expand Down Expand Up @@ -138,7 +139,8 @@ fun VerticalSlider(
@Composable
fun BrightnessSlider(
brightness: Float,
range: ClosedFloatingPointRange<Float>,
positiveRange: ClosedFloatingPointRange<Float>,
negativeRange: ClosedFloatingPointRange<Float>,
modifier: Modifier = Modifier,
) {
Column(
Expand All @@ -151,11 +153,14 @@ fun BrightnessSlider(
style = MaterialTheme.typography.bodySmall,
)
VerticalSlider(
brightness,
range,
value = brightness.coerceIn(0f, 1f),
range = positiveRange,
overflowRange = negativeRange,
overflowValue = (-brightness).coerceIn(0f..0.75f),
)
Icon(
when (percentage(brightness, range)) {
when (percentage(brightness, positiveRange)) {
in -1f..0f -> Icons.Default.ModeNight
in 0f..0.3f -> Icons.Default.BrightnessLow
in 0.3f..0.6f -> Icons.Default.BrightnessMedium
in 0.6f..1f -> Icons.Default.BrightnessHigh
Expand Down

0 comments on commit fa1b154

Please sign in to comment.