mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-08-15 20:11:57 +00:00
Merge pull request #1257 from siriusvoid/feat/hide-parental-guide-overlay
feat: add "Content Warnings" toggle from tv version
This commit is contained in:
commit
e0c5e31c79
7 changed files with 65 additions and 0 deletions
|
|
@ -20,6 +20,7 @@ import kotlinx.serialization.json.put
|
|||
actual object PlayerSettingsStorage {
|
||||
private const val preferencesName = "nuvio_player_settings"
|
||||
private const val showLoadingOverlayKey = "show_loading_overlay"
|
||||
private const val showParentalGuideKey = "show_parental_guide"
|
||||
private const val resizeModeKey = "resize_mode"
|
||||
private const val holdToSpeedEnabledKey = "hold_to_speed_enabled"
|
||||
private const val holdToSpeedValueKey = "hold_to_speed_value"
|
||||
|
|
@ -88,6 +89,7 @@ actual object PlayerSettingsStorage {
|
|||
private const val iosGammaKey = "ios_gamma"
|
||||
private val syncKeys = listOf(
|
||||
showLoadingOverlayKey,
|
||||
showParentalGuideKey,
|
||||
resizeModeKey,
|
||||
holdToSpeedEnabledKey,
|
||||
holdToSpeedValueKey,
|
||||
|
|
@ -177,6 +179,23 @@ actual object PlayerSettingsStorage {
|
|||
?.apply()
|
||||
}
|
||||
|
||||
actual fun loadShowParentalGuide(): Boolean? =
|
||||
preferences?.let { sharedPreferences ->
|
||||
val key = ProfileScopedKey.of(showParentalGuideKey)
|
||||
if (sharedPreferences.contains(key)) {
|
||||
sharedPreferences.getBoolean(key, true)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
actual fun saveShowParentalGuide(enabled: Boolean) {
|
||||
preferences
|
||||
?.edit()
|
||||
?.putBoolean(ProfileScopedKey.of(showParentalGuideKey), enabled)
|
||||
?.apply()
|
||||
}
|
||||
|
||||
actual fun loadResizeMode(): String? =
|
||||
preferences?.getString(ProfileScopedKey.of(resizeModeKey), null)
|
||||
|
||||
|
|
@ -1055,6 +1074,7 @@ actual object PlayerSettingsStorage {
|
|||
|
||||
actual fun exportToSyncPayload(): JsonObject = buildJsonObject {
|
||||
loadShowLoadingOverlay()?.let { put(showLoadingOverlayKey, encodeSyncBoolean(it)) }
|
||||
loadShowParentalGuide()?.let { put(showParentalGuideKey, encodeSyncBoolean(it)) }
|
||||
loadResizeMode()?.let { put(resizeModeKey, encodeSyncString(it)) }
|
||||
loadHoldToSpeedEnabled()?.let { put(holdToSpeedEnabledKey, encodeSyncBoolean(it)) }
|
||||
loadHoldToSpeedValue()?.let { put(holdToSpeedValueKey, encodeSyncFloat(it)) }
|
||||
|
|
@ -1129,6 +1149,7 @@ actual object PlayerSettingsStorage {
|
|||
}?.apply()
|
||||
|
||||
payload.decodeSyncBoolean(showLoadingOverlayKey)?.let(::saveShowLoadingOverlay)
|
||||
payload.decodeSyncBoolean(showParentalGuideKey)?.let(::saveShowParentalGuide)
|
||||
payload.decodeSyncString(resizeModeKey)?.let(::saveResizeMode)
|
||||
payload.decodeSyncBoolean(holdToSpeedEnabledKey)?.let(::saveHoldToSpeedEnabled)
|
||||
payload.decodeSyncFloat(holdToSpeedValueKey)?.let(::saveHoldToSpeedValue)
|
||||
|
|
|
|||
|
|
@ -966,6 +966,8 @@
|
|||
<string name="settings_playback_selected_count">%1$d selected</string>
|
||||
<string name="settings_playback_show_loading_overlay">Loading Overlay</string>
|
||||
<string name="settings_playback_show_loading_overlay_description">Show loading screen until first video frame appears.</string>
|
||||
<string name="settings_playback_parental_guide">Content Warnings</string>
|
||||
<string name="settings_playback_parental_guide_description">Show parental guidance overlay when playback starts.</string>
|
||||
<string name="settings_playback_subtitle_background_color">Background Color</string>
|
||||
<string name="settings_playback_subtitle_bold">Bold</string>
|
||||
<string name="settings_playback_subtitle_bold_description">Use a heavier subtitle font weight.</string>
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@ internal fun PlayerScreenRuntime.emitStopScrobbleForCurrentProgress() {
|
|||
}
|
||||
|
||||
internal fun PlayerScreenRuntime.tryShowParentalGuide() {
|
||||
if (!playerSettingsUiState.showParentalGuide) return
|
||||
if (!parentalGuideHasShown && parentalWarnings.isNotEmpty() && !playbackStartedForParentalGuide) {
|
||||
playbackStartedForParentalGuide = true
|
||||
controlsVisible = true
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ fun snapToAllowedTimeout(value: Int): Int {
|
|||
|
||||
data class PlayerSettingsUiState(
|
||||
val showLoadingOverlay: Boolean = true,
|
||||
val showParentalGuide: Boolean = true,
|
||||
val resizeMode: PlayerResizeMode = PlayerResizeMode.Fit,
|
||||
val holdToSpeedEnabled: Boolean = true,
|
||||
val holdToSpeedValue: Float = 2f,
|
||||
|
|
@ -98,6 +99,7 @@ object PlayerSettingsRepository {
|
|||
|
||||
private var hasLoaded = false
|
||||
private var showLoadingOverlay = true
|
||||
private var showParentalGuide = true
|
||||
private var resizeMode = PlayerResizeMode.Fit
|
||||
private var holdToSpeedEnabled = true
|
||||
private var holdToSpeedValue = 2f
|
||||
|
|
@ -168,6 +170,7 @@ object PlayerSettingsRepository {
|
|||
fun clearLocalState() {
|
||||
hasLoaded = false
|
||||
showLoadingOverlay = true
|
||||
showParentalGuide = true
|
||||
resizeMode = PlayerResizeMode.Fit
|
||||
holdToSpeedEnabled = true
|
||||
holdToSpeedValue = 2f
|
||||
|
|
@ -231,6 +234,7 @@ object PlayerSettingsRepository {
|
|||
private fun loadFromDisk() {
|
||||
hasLoaded = true
|
||||
showLoadingOverlay = PlayerSettingsStorage.loadShowLoadingOverlay() ?: true
|
||||
showParentalGuide = PlayerSettingsStorage.loadShowParentalGuide() ?: true
|
||||
resizeMode = PlayerSettingsStorage.loadResizeMode()
|
||||
?.let { runCatching { PlayerResizeMode.valueOf(it) }.getOrNull() }
|
||||
?: PlayerResizeMode.Fit
|
||||
|
|
@ -370,6 +374,14 @@ object PlayerSettingsRepository {
|
|||
PlayerSettingsStorage.saveShowLoadingOverlay(enabled)
|
||||
}
|
||||
|
||||
fun setShowParentalGuide(enabled: Boolean) {
|
||||
ensureLoaded()
|
||||
if (showParentalGuide == enabled) return
|
||||
showParentalGuide = enabled
|
||||
publish()
|
||||
PlayerSettingsStorage.saveShowParentalGuide(enabled)
|
||||
}
|
||||
|
||||
fun setResizeMode(mode: PlayerResizeMode) {
|
||||
ensureLoaded()
|
||||
if (resizeMode == mode) return
|
||||
|
|
@ -899,6 +911,7 @@ object PlayerSettingsRepository {
|
|||
private fun publish() {
|
||||
_uiState.value = PlayerSettingsUiState(
|
||||
showLoadingOverlay = showLoadingOverlay,
|
||||
showParentalGuide = showParentalGuide,
|
||||
resizeMode = resizeMode,
|
||||
holdToSpeedEnabled = holdToSpeedEnabled,
|
||||
holdToSpeedValue = holdToSpeedValue,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import kotlinx.serialization.json.JsonObject
|
|||
internal expect object PlayerSettingsStorage {
|
||||
fun loadShowLoadingOverlay(): Boolean?
|
||||
fun saveShowLoadingOverlay(enabled: Boolean)
|
||||
fun loadShowParentalGuide(): Boolean?
|
||||
fun saveShowParentalGuide(enabled: Boolean)
|
||||
fun loadResizeMode(): String?
|
||||
fun saveResizeMode(mode: String)
|
||||
fun loadHoldToSpeedEnabled(): Boolean?
|
||||
|
|
|
|||
|
|
@ -334,6 +334,14 @@ private fun PlaybackSettingsSection(
|
|||
onCheckedChange = PlayerSettingsRepository::setShowLoadingOverlay,
|
||||
)
|
||||
SettingsGroupDivider(isTablet = isTablet)
|
||||
SettingsSwitchRow(
|
||||
title = stringResource(Res.string.settings_playback_parental_guide),
|
||||
description = stringResource(Res.string.settings_playback_parental_guide_description),
|
||||
checked = autoPlayPlayerSettings.showParentalGuide,
|
||||
isTablet = isTablet,
|
||||
onCheckedChange = PlayerSettingsRepository::setShowParentalGuide,
|
||||
)
|
||||
SettingsGroupDivider(isTablet = isTablet)
|
||||
// Player preference picker: Internal / External
|
||||
SettingsNavigationRow(
|
||||
title = stringResource(Res.string.settings_playback_player_preference),
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import platform.Foundation.NSUserDefaults
|
|||
|
||||
actual object PlayerSettingsStorage {
|
||||
private const val showLoadingOverlayKey = "show_loading_overlay"
|
||||
private const val showParentalGuideKey = "show_parental_guide"
|
||||
private const val resizeModeKey = "resize_mode"
|
||||
private const val holdToSpeedEnabledKey = "hold_to_speed_enabled"
|
||||
private const val holdToSpeedValueKey = "hold_to_speed_value"
|
||||
|
|
@ -86,6 +87,7 @@ actual object PlayerSettingsStorage {
|
|||
private const val iosGammaKey = "ios_gamma"
|
||||
private val syncKeys = listOf(
|
||||
showLoadingOverlayKey,
|
||||
showParentalGuideKey,
|
||||
resizeModeKey,
|
||||
holdToSpeedEnabledKey,
|
||||
holdToSpeedValueKey,
|
||||
|
|
@ -186,6 +188,20 @@ actual object PlayerSettingsStorage {
|
|||
NSUserDefaults.standardUserDefaults.setBool(enabled, forKey = ProfileScopedKey.of(showLoadingOverlayKey))
|
||||
}
|
||||
|
||||
actual fun loadShowParentalGuide(): Boolean? {
|
||||
val defaults = NSUserDefaults.standardUserDefaults
|
||||
val key = ProfileScopedKey.of(showParentalGuideKey)
|
||||
return if (defaults.objectForKey(key) != null) {
|
||||
defaults.boolForKey(key)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
actual fun saveShowParentalGuide(enabled: Boolean) {
|
||||
NSUserDefaults.standardUserDefaults.setBool(enabled, forKey = ProfileScopedKey.of(showParentalGuideKey))
|
||||
}
|
||||
|
||||
actual fun loadResizeMode(): String? {
|
||||
val defaults = NSUserDefaults.standardUserDefaults
|
||||
val key = ProfileScopedKey.of(resizeModeKey)
|
||||
|
|
@ -879,6 +895,7 @@ actual object PlayerSettingsStorage {
|
|||
|
||||
actual fun exportToSyncPayload(): JsonObject = buildJsonObject {
|
||||
loadShowLoadingOverlay()?.let { put(showLoadingOverlayKey, encodeSyncBoolean(it)) }
|
||||
loadShowParentalGuide()?.let { put(showParentalGuideKey, encodeSyncBoolean(it)) }
|
||||
loadResizeMode()?.let { put(resizeModeKey, encodeSyncString(it)) }
|
||||
loadHoldToSpeedEnabled()?.let { put(holdToSpeedEnabledKey, encodeSyncBoolean(it)) }
|
||||
loadHoldToSpeedValue()?.let { put(holdToSpeedValueKey, encodeSyncFloat(it)) }
|
||||
|
|
@ -952,6 +969,7 @@ actual object PlayerSettingsStorage {
|
|||
}
|
||||
|
||||
payload.decodeSyncBoolean(showLoadingOverlayKey)?.let(::saveShowLoadingOverlay)
|
||||
payload.decodeSyncBoolean(showParentalGuideKey)?.let(::saveShowParentalGuide)
|
||||
payload.decodeSyncString(resizeModeKey)?.let(::saveResizeMode)
|
||||
payload.decodeSyncBoolean(holdToSpeedEnabledKey)?.let(::saveHoldToSpeedEnabled)
|
||||
payload.decodeSyncFloat(holdToSpeedValueKey)?.let(::saveHoldToSpeedValue)
|
||||
|
|
|
|||
Loading…
Reference in a new issue