Merge pull request #968 from DeadGazeS/changes-to-next-episode-threshold-and-auto-select-timeout

Changes to next episode threshold & auto-select timeout settings
This commit is contained in:
Muhammed Nayif Rahman 2026-05-07 18:37:51 +05:30 committed by GitHub
commit abe43d2d8d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 114 additions and 87 deletions

View file

@ -649,7 +649,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Dolby Vision Profil 7 zu HEVC-Fallback für nicht unterstützte Geräte.</string>
<string name="settings_playback_minutes_before_end">Minuten vor Ende</string>
<string name="settings_playback_minutes_before_end_description">Karte für nächste Episode so viele Minuten vor dem Ende anzeigen.</string>
<string name="settings_playback_minutes_value">%1$d Min.</string>
<string name="settings_playback_minutes_value">%1$s Min.</string>
<string name="settings_playback_no_items_available">Keine Einträge verfügbar</string>
<string name="settings_playback_not_set">Nicht festgelegt</string>
<string name="settings_playback_option_default">Standard</string>
@ -724,9 +724,9 @@
<string name="settings_playback_threshold_mode_percentage">Prozent</string>
<string name="settings_playback_threshold_percentage">Schwellenwert in Prozent</string>
<string name="settings_playback_threshold_percentage_description">Karte für nächste Episode anzeigen, wenn die Wiedergabe diesen Prozentsatz erreicht.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Sofort</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Unbegrenzt</string>
<string name="settings_playback_tunneled_playback">Tunneled-Wiedergabe</string>
<string name="settings_playback_tunneled_playback_description">Tunneled-Wiedergabe für niedrigere Latenz bei Audio-/Video-Synchronisation aktivieren.</string>

View file

@ -494,7 +494,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Εναλλαγή Dolby Vision Profile 7 σε HEVC για μη υποστηριζόμενες συσκευές.</string>
<string name="settings_playback_minutes_before_end">Λεπτά πριν το τέλος</string>
<string name="settings_playback_minutes_before_end_description">Εμφάνιση κάρτας επόμενου επεισοδίου τόσα λεπτά πριν το τέλος.</string>
<string name="settings_playback_minutes_value">%1$d λεπτά</string>
<string name="settings_playback_minutes_value">%1$s λεπτά</string>
<string name="settings_playback_no_items_available">Δεν υπάρχουν διαθέσιμα στοιχεία</string>
<string name="settings_playback_not_set">Δεν έχει οριστεί</string>
<string name="settings_playback_option_default">Προεπιλογή</string>
@ -569,9 +569,9 @@
<string name="settings_playback_threshold_mode_percentage">Ποσοστό</string>
<string name="settings_playback_threshold_percentage">Ποσοστό κατωφλίου</string>
<string name="settings_playback_threshold_percentage_description">Εμφάνιση κάρτας επόμενου επεισοδίου όταν η αναπαραγωγή φτάσει σε αυτό το ποσοστό.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Άμεσα</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Απεριόριστο</string>
<string name="settings_playback_tunneled_playback">Tunneled αναπαραγωγή</string>
<string name="settings_playback_tunneled_playback_description">Ενεργοποίηση tunneled αναπαραγωγής για χαμηλότερη καθυστέρηση συγχρονισμού ήχου/βίντεο.</string>

View file

@ -612,7 +612,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Usar Dolby Vision Perfil 7 a HEVC como alternativa para dispositivos no compatibles.</string>
<string name="settings_playback_minutes_before_end">Minutos antes del final</string>
<string name="settings_playback_minutes_before_end_description">Mostrar la tarjeta del siguiente episodio esta cantidad de minutos antes del final.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">No hay elementos disponibles</string>
<string name="settings_playback_not_set">No establecido</string>
<string name="settings_playback_option_default">Predeterminado</string>
@ -687,9 +687,9 @@
<string name="settings_playback_threshold_mode_percentage">Porcentaje</string>
<string name="settings_playback_threshold_percentage">Porcentaje de umbral</string>
<string name="settings_playback_threshold_percentage_description">Mostrar la tarjeta del siguiente episodio cuando la reproducción alcance este porcentaje.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Instantáneo</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Ilimitado</string>
<string name="settings_playback_tunneled_playback">Reproducción tunneled</string>
<string name="settings_playback_tunneled_playback_description">Activa la reproducción tunneled para una menor latencia en la sincronización de audio/video.</string>

View file

@ -645,7 +645,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Utiliser Dolby Vision Profil 7 vers HEVC comme alternative pour les appareils non compatibles.</string>
<string name="settings_playback_minutes_before_end">Minutes avant la fin</string>
<string name="settings_playback_minutes_before_end_description">Afficher la carte de l'épisode suivant ce nombre de minutes avant la fin.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">Aucun élément disponible</string>
<string name="settings_playback_not_set">Non défini</string>
<string name="settings_playback_option_default">Par défaut</string>
@ -720,9 +720,9 @@
<string name="settings_playback_threshold_mode_percentage">Pourcentage</string>
<string name="settings_playback_threshold_percentage">Pourcentage de seuil</string>
<string name="settings_playback_threshold_percentage_description">Afficher la carte de l'épisode suivant lorsque la lecture atteint ce pourcentage.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Instantané</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Illimité</string>
<string name="settings_playback_tunneled_playback">Lecture tunnelisée</string>
<string name="settings_playback_tunneled_playback_description">Active la lecture tunnelisée pour une latence réduite dans la synchronisation audio/vidéo.</string>

View file

@ -494,7 +494,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Fallback da Dolby Vision Profile 7 a HEVC per i dispositivi non supportati.</string>
<string name="settings_playback_minutes_before_end">Minuti prima della fine</string>
<string name="settings_playback_minutes_before_end_description">Mostra la scheda dell'episodio successivo questo numero di minuti prima della fine.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">Nessun elemento disponibile</string>
<string name="settings_playback_not_set">Non impostato</string>
<string name="settings_playback_option_default">Predefinito</string>
@ -569,9 +569,9 @@
<string name="settings_playback_threshold_mode_percentage">Percentuale</string>
<string name="settings_playback_threshold_percentage">Percentuale di soglia</string>
<string name="settings_playback_threshold_percentage_description">Mostra la scheda dell'episodio successivo quando la riproduzione raggiunge questa percentuale.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Istantaneo</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Illimitato</string>
<string name="settings_playback_tunneled_playback">Riproduzione Tunneled</string>
<string name="settings_playback_tunneled_playback_description">Abilita la riproduzione tunneled per una minore latenza nella sincronizzazione audio/video.</string>

View file

@ -612,7 +612,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Fallback Dolby Vision Profile 7 na HEVC dla nieobsługiwanych urządzeń.</string>
<string name="settings_playback_minutes_before_end">Minuty przed końcem</string>
<string name="settings_playback_minutes_before_end_description">Pokaż kartę następnego odcinka tyle minut przed końcem.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">Brak dostępnych elementów</string>
<string name="settings_playback_not_set">Nie ustawiono</string>
<string name="settings_playback_option_default">Domyślny</string>
@ -687,9 +687,9 @@
<string name="settings_playback_threshold_mode_percentage">Procent</string>
<string name="settings_playback_threshold_percentage">Próg procentowy</string>
<string name="settings_playback_threshold_percentage_description">Pokaż kartę następnego odcinka, gdy odtwarzanie osiągnie ten procent.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Natychmiast</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Bez limitu</string>
<string name="settings_playback_tunneled_playback">Odtwarzanie tunelowane</string>
<string name="settings_playback_tunneled_playback_description">Włącz odtwarzanie tunelowane dla niższego opóźnienia synchronizacji audio/wideo.</string>

View file

@ -624,7 +624,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Fallback de Dolby Vision Profile 7 para HEVC para dispositivos não suportados.</string>
<string name="settings_playback_minutes_before_end">Minutos Antes do Fim</string>
<string name="settings_playback_minutes_before_end_description">Mostra o cartão do próximo episódio estes minutos antes do fim.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">Nenhum item disponível</string>
<string name="settings_playback_not_set">Não definido</string>
<string name="settings_playback_option_default">Padrão</string>
@ -699,9 +699,9 @@
<string name="settings_playback_threshold_mode_percentage">Percentagem</string>
<string name="settings_playback_threshold_percentage">Percentagem Limite</string>
<string name="settings_playback_threshold_percentage_description">Mostra o cartão do próximo episódio quando a reprodução atingir esta percentagem.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Instantâneo</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Ilimitado</string>
<string name="settings_playback_tunneled_playback">Reprodução em Túnel</string>
<string name="settings_playback_tunneled_playback_description">Ativa a reprodução em túnel para menor latência na sincronização de áudio/vídeo.</string>

View file

@ -494,7 +494,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Desteklenmeyen cihazlar için Dolby Vision Profile 7\'den HEVC\'ye geri dönüş.</string>
<string name="settings_playback_minutes_before_end">Bitmeden kaç dakika önce</string>
<string name="settings_playback_minutes_before_end_description">Sonraki bölüm kartını bitişten kaç dakika önce göstereceğini seç.</string>
<string name="settings_playback_minutes_value">%1$d dk</string>
<string name="settings_playback_minutes_value">%1$s dk</string>
<string name="settings_playback_no_items_available">Kullanılabilir öğe yok</string>
<string name="settings_playback_not_set">Ayarlanmadı</string>
<string name="settings_playback_option_default">Varsayılan</string>
@ -569,9 +569,9 @@
<string name="settings_playback_threshold_mode_percentage">Yüzde</string>
<string name="settings_playback_threshold_percentage">Eşik yüzdesi</string>
<string name="settings_playback_threshold_percentage_description">Oynatma bu yüzdeye ulaşınca sonraki bölüm kartını göster.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Hemen</string>
<string name="settings_playback_timeout_seconds">%1$dsn</string>
<string name="settings_playback_timeout_seconds">%1$ssn</string>
<string name="settings_playback_timeout_unlimited">Sınırsız</string>
<string name="settings_playback_tunneled_playback">Tunneled oynatma</string>
<string name="settings_playback_tunneled_playback_description">Daha düşük gecikmeli ses/video senkronu için tunneled oynatmayı aç.</string>

View file

@ -663,7 +663,7 @@
<string name="settings_playback_map_dv7_to_hevc_description">Map Dolby Vision Profile 7 to standard HEVC for devices without DV hardware support</string>
<string name="settings_playback_minutes_before_end">Threshold Minutes</string>
<string name="settings_playback_minutes_before_end_description">Fallback when no outro timestamp exists.</string>
<string name="settings_playback_minutes_value">%1$d min</string>
<string name="settings_playback_minutes_value">%1$s min</string>
<string name="settings_playback_no_items_available">No items available</string>
<string name="settings_playback_not_set">Not set</string>
<string name="settings_playback_option_default">Default (media file)</string>
@ -738,9 +738,9 @@
<string name="settings_playback_threshold_mode_percentage">Percentage</string>
<string name="settings_playback_threshold_percentage">Threshold Percentage</string>
<string name="settings_playback_threshold_percentage_description">Fallback when no outro timestamp exists.</string>
<string name="settings_playback_threshold_percentage_value">%1$d%</string>
<string name="settings_playback_threshold_percentage_value">%1$s%</string>
<string name="settings_playback_timeout_instant">Instant</string>
<string name="settings_playback_timeout_seconds">%1$ds</string>
<string name="settings_playback_timeout_seconds">%1$ss</string>
<string name="settings_playback_timeout_unlimited">Unlimited</string>
<string name="settings_playback_tunneled_playback">Tunneled Playback</string>
<string name="settings_playback_tunneled_playback_description">Hardware-level audio/video sync. May improve playback on some Android TV devices</string>

View file

@ -39,11 +39,11 @@ object PlayerNextEpisodeRules {
if (durationMs <= 0L) return false
when (thresholdMode) {
NextEpisodeThresholdMode.PERCENTAGE -> {
val clampedPercent = thresholdPercent.coerceIn(97f, 99.5f)
val clampedPercent = thresholdPercent.coerceIn(97f, 100f)
(positionMs.toDouble() / durationMs.toDouble()) >= (clampedPercent / 100.0)
}
NextEpisodeThresholdMode.MINUTES_BEFORE_END -> {
val clampedMinutes = thresholdMinutesBeforeEnd.coerceIn(1f, 3.5f)
val clampedMinutes = thresholdMinutesBeforeEnd.coerceIn(0f, 3.5f)
val remainingMs = durationMs - positionMs
remainingMs <= (clampedMinutes * 60_000f).toLong()
}

View file

@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyRow
@ -46,6 +47,7 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nuvio.app.features.addons.AddonRepository
@ -64,6 +66,7 @@ import kotlinx.coroutines.launch
import nuvio.composeapp.generated.resources.*
import org.jetbrains.compose.resources.StringResource
import org.jetbrains.compose.resources.stringResource
import kotlin.math.roundToInt
internal fun LazyListScope.playbackSettingsContent(
isTablet: Boolean,
@ -103,6 +106,47 @@ internal fun LazyListScope.playbackSettingsContent(
}
}
private fun formatStep(value: Float): String {
return if (value % 1f == 0f) {
value.toInt().toString()
} else {
value.toString()
}
}
fun snapToStep(value: Float, step: Float): Float {
return (value / step).roundToInt() * step
}
fun calculateSteps(
min: Float,
max: Float,
stepSize: Float
): Int {
val totalSteps = ((max - min) / stepSize).roundToInt()
return (totalSteps - 1).coerceAtLeast(0)
}
@Composable
fun ValueBox(
text: String,
modifier: Modifier = Modifier
) {
Box(
modifier = modifier,
contentAlignment = Alignment.CenterEnd
) {
Text(
text = text,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.primary,
fontWeight = FontWeight.SemiBold,
)
}
}
@Composable
private fun PlaybackSettingsSection(
isTablet: Boolean,
@ -285,10 +329,9 @@ private fun PlaybackSettingsSection(
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Column(modifier = Modifier.weight(1f)) {
Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) {
Text(
text = stringResource(Res.string.settings_playback_stream_timeout),
style = MaterialTheme.typography.bodyLarge,
@ -296,26 +339,22 @@ private fun PlaybackSettingsSection(
)
Text(
text = stringResource(Res.string.settings_playback_stream_timeout_description),
style = MaterialTheme.typography.bodySmall,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
Text(
text = timeoutLabel,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.primary,
fontWeight = FontWeight.SemiBold,
)
ValueBox(text = timeoutLabel, modifier = Modifier.wrapContentWidth())
}
var sliderValue by remember(timeoutSec) { mutableFloatStateOf(timeoutSec.toFloat()) }
var lastHapticStep by remember(timeoutSec) { mutableStateOf(timeoutSec) }
var lastHapticStep by remember(timeoutSec) { mutableStateOf(timeoutSec.toFloat()) }
Slider(
value = sliderValue,
onValueChange = {
sliderValue = it
val steppedValue = it.toInt()
if (steppedValue != lastHapticStep) {
lastHapticStep = steppedValue
val snapped = snapToStep(it, 1f)
sliderValue = snapped
if (snapped != lastHapticStep) {
lastHapticStep = snapped
hapticFeedback.performHapticFeedback(HapticFeedbackType.TextHandleMove)
}
},
@ -323,7 +362,7 @@ private fun PlaybackSettingsSection(
PlayerSettingsRepository.setStreamAutoPlayTimeoutSeconds(sliderValue.toInt())
},
valueRange = 0f..11f,
steps = 10,
steps = calculateSteps(0f, 11f, 1f),
colors = SliderDefaults.colors(
thumbColor = MaterialTheme.colorScheme.primary,
activeTrackColor = MaterialTheme.colorScheme.primary,
@ -556,10 +595,9 @@ private fun PlaybackSettingsSection(
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Column(modifier = Modifier.weight(1f)) {
Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) {
Text(
text = stringResource(Res.string.settings_playback_threshold_percentage),
style = MaterialTheme.typography.bodyLarge,
@ -567,37 +605,32 @@ private fun PlaybackSettingsSection(
)
Text(
text = stringResource(Res.string.settings_playback_threshold_percentage_description),
style = MaterialTheme.typography.bodySmall,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
Text(
text = stringResource(
Res.string.settings_playback_threshold_percentage_value,
thresholdPercent.toInt(),
),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.primary,
fontWeight = FontWeight.SemiBold,
)
ValueBox(text = stringResource(
Res.string.settings_playback_threshold_percentage_value,
formatStep(thresholdPercent)), modifier = Modifier.wrapContentWidth())
}
var sliderVal by remember(thresholdPercent) { mutableFloatStateOf(thresholdPercent) }
var lastHapticPercent by remember(thresholdPercent) { mutableStateOf(thresholdPercent.toInt()) }
var sliderValue by remember(thresholdPercent) { mutableFloatStateOf(thresholdPercent) }
var lastHapticPercent by remember(thresholdPercent) { mutableStateOf(thresholdPercent) }
Slider(
value = sliderVal,
value = sliderValue,
onValueChange = {
sliderVal = it
val stepped = it.toInt()
if (stepped != lastHapticPercent) {
lastHapticPercent = stepped
val snapped = snapToStep(it, 0.5f)
sliderValue = snapped
if (snapped != lastHapticPercent) {
lastHapticPercent = snapped
hapticFeedback.performHapticFeedback(HapticFeedbackType.TextHandleMove)
}
},
onValueChangeFinished = {
PlayerSettingsRepository.setNextEpisodeThresholdPercent(sliderVal)
PlayerSettingsRepository.setNextEpisodeThresholdPercent(sliderValue)
},
valueRange = 50f..100f,
steps = 49,
valueRange = 97f..100f,
steps = calculateSteps(97f, 100f, 0.5f),
colors = SliderDefaults.colors(
thumbColor = MaterialTheme.colorScheme.primary,
activeTrackColor = MaterialTheme.colorScheme.primary,
@ -615,10 +648,9 @@ private fun PlaybackSettingsSection(
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Column(modifier = Modifier.weight(1f)) {
Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) {
Text(
text = stringResource(Res.string.settings_playback_minutes_before_end),
style = MaterialTheme.typography.bodyLarge,
@ -626,37 +658,32 @@ private fun PlaybackSettingsSection(
)
Text(
text = stringResource(Res.string.settings_playback_minutes_before_end_description),
style = MaterialTheme.typography.bodySmall,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
Text(
text = stringResource(
ValueBox(text = stringResource(
Res.string.settings_playback_minutes_value,
thresholdMinutes.toInt(),
),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.primary,
fontWeight = FontWeight.SemiBold,
)
formatStep(thresholdMinutes)), modifier = Modifier.wrapContentWidth())
}
var sliderVal by remember(thresholdMinutes) { mutableFloatStateOf(thresholdMinutes) }
var lastHapticMin by remember(thresholdMinutes) { mutableStateOf(thresholdMinutes.toInt()) }
var sliderValue by remember(thresholdMinutes) { mutableFloatStateOf(thresholdMinutes) }
var lastHapticMin by remember(thresholdMinutes) { mutableStateOf(thresholdMinutes) }
Slider(
value = sliderVal,
value = sliderValue,
onValueChange = {
sliderVal = it
val stepped = it.toInt()
if (stepped != lastHapticMin) {
lastHapticMin = stepped
val snapped = snapToStep(it, 0.5f)
sliderValue = snapped
if (snapped != lastHapticMin) {
lastHapticMin = snapped
hapticFeedback.performHapticFeedback(HapticFeedbackType.TextHandleMove)
}
},
onValueChangeFinished = {
PlayerSettingsRepository.setNextEpisodeThresholdMinutesBeforeEnd(sliderVal)
PlayerSettingsRepository.setNextEpisodeThresholdMinutesBeforeEnd(sliderValue)
},
valueRange = 1f..15f,
steps = 13,
valueRange = 0f..3.5f,
steps = calculateSteps(0f, 3.5f, 0.5f),
colors = SliderDefaults.colors(
thumbColor = MaterialTheme.colorScheme.primary,
activeTrackColor = MaterialTheme.colorScheme.primary,