mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-05-16 23:12:12 +00:00
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:
commit
abe43d2d8d
11 changed files with 114 additions and 87 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue