Skip to content

Commit 4211e2e

Browse files
committed
fix: remember player brightness
1 parent 9f391a3 commit 4211e2e

9 files changed

Lines changed: 50 additions & 5 deletions

File tree

‎app/src/main/java/dev/typetype/android/data/preferences/DataStorePreferencesRepository.kt‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class DataStorePreferencesRepository @Inject constructor(
2828
playerDoubleTapSeekEnabled = prefs[KEY_PLAYER_DOUBLE_TAP_SEEK] ?: true,
2929
playerSwipeSeekEnabled = prefs[KEY_PLAYER_SWIPE_SEEK] ?: true,
3030
playerSwipeBrightnessVolumeEnabled = prefs[KEY_PLAYER_SWIPE_BRIGHT_VOL] ?: true,
31+
playerPlaybackBrightnessPercent = prefs[KEY_PLAYER_PLAYBACK_BRIGHTNESS]
32+
?.coerceIn(0, 100),
3133
playerLongPressSpeedEnabled = prefs[KEY_PLAYER_LONG_PRESS_SPEED] ?: true,
3234
playerAutoplayEnabled = prefs[KEY_PLAYER_AUTOPLAY] ?: true,
3335
playerAutoplayCountdownSeconds = (
@@ -57,6 +59,10 @@ class DataStorePreferencesRepository @Inject constructor(
5759
dataStore.edit { it[KEY_PLAYER_SWIPE_BRIGHT_VOL] = enabled }
5860
}
5961

62+
override suspend fun setPlayerPlaybackBrightnessPercent(percent: Int) {
63+
dataStore.edit { it[KEY_PLAYER_PLAYBACK_BRIGHTNESS] = percent.coerceIn(0, 100) }
64+
}
65+
6066
override suspend fun setPlayerLongPressSpeedEnabled(enabled: Boolean) {
6167
dataStore.edit { it[KEY_PLAYER_LONG_PRESS_SPEED] = enabled }
6268
}
@@ -99,6 +105,7 @@ class DataStorePreferencesRepository @Inject constructor(
99105
val KEY_PLAYER_DOUBLE_TAP_SEEK = booleanPreferencesKey("player_double_tap_seek")
100106
val KEY_PLAYER_SWIPE_SEEK = booleanPreferencesKey("player_swipe_seek")
101107
val KEY_PLAYER_SWIPE_BRIGHT_VOL = booleanPreferencesKey("player_swipe_bright_vol")
108+
val KEY_PLAYER_PLAYBACK_BRIGHTNESS = intPreferencesKey("player_playback_brightness")
102109
val KEY_PLAYER_LONG_PRESS_SPEED = booleanPreferencesKey("player_long_press_speed")
103110
val KEY_PLAYER_AUTOPLAY = booleanPreferencesKey("player_autoplay")
104111
val KEY_PLAYER_AUTOPLAY_COUNTDOWN = intPreferencesKey("player_autoplay_countdown_seconds")

‎app/src/main/java/dev/typetype/android/domain/preferences/AppPreferences.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ data class AppPreferences(
55
val playerDoubleTapSeekEnabled: Boolean = true,
66
val playerSwipeSeekEnabled: Boolean = true,
77
val playerSwipeBrightnessVolumeEnabled: Boolean = true,
8+
val playerPlaybackBrightnessPercent: Int? = null,
89
val playerLongPressSpeedEnabled: Boolean = true,
910
val playerAutoplayEnabled: Boolean = true,
1011
val playerAutoplayCountdownSeconds: Int = 10,

‎app/src/main/java/dev/typetype/android/domain/preferences/PreferencesRepository.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ interface PreferencesRepository {
88
suspend fun setPlayerDoubleTapSeekEnabled(enabled: Boolean)
99
suspend fun setPlayerSwipeSeekEnabled(enabled: Boolean)
1010
suspend fun setPlayerSwipeBrightnessVolumeEnabled(enabled: Boolean)
11+
suspend fun setPlayerPlaybackBrightnessPercent(percent: Int)
1112
suspend fun setPlayerLongPressSpeedEnabled(enabled: Boolean)
1213
suspend fun setPlayerAutoplayEnabled(enabled: Boolean)
1314
suspend fun setPlayerAutoplayCountdownSeconds(seconds: Int)

‎app/src/main/java/dev/typetype/android/feature/player/LoadedPlayer.kt‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import androidx.compose.runtime.getValue
1616
import androidx.compose.runtime.mutableStateOf
1717
import androidx.compose.runtime.remember
1818
import androidx.compose.runtime.setValue
19-
import androidx.compose.runtime.saveable.rememberSaveable
2019
import androidx.compose.ui.Alignment
2120
import androidx.compose.ui.Modifier
2221
import androidx.compose.ui.graphics.Color
@@ -49,6 +48,7 @@ fun LoadedPlayer(
4948
isFavorited: Boolean,
5049
isInWatchLater: Boolean,
5150
gestureConfig: PlayerGestureConfig,
51+
playbackBrightnessPercent: Int?,
5252
autoplayCountdownSeconds: Int,
5353
audioOnlyPlaybackDefault: Boolean?,
5454
userSettings: UserSettings,
@@ -81,9 +81,6 @@ fun LoadedPlayer(
8181
}
8282
var commentsVisible by remember { mutableStateOf(false) }
8383
var downloadPickerVisible by remember { mutableStateOf(false) }
84-
var playbackBrightnessPercent by rememberSaveable(stream.id) {
85-
mutableStateOf<Int?>(null)
86-
}
8784
val selections = rememberPlayerPlaybackSelectionState(
8885
stream = stream,
8986
defaultQuality = userSettings.defaultQuality,
@@ -218,7 +215,9 @@ fun LoadedPlayer(
218215
chapters = playbackChapters,
219216
gestureConfig = gestureConfig,
220217
playbackBrightnessPercent = playbackBrightnessPercent,
221-
onPlaybackBrightnessChange = { playbackBrightnessPercent = it },
218+
onPlaybackBrightnessChange = {
219+
onAction(PlayerAction.OnSetPlaybackBrightness(it))
220+
},
222221
loadSubtitleCues = loadSubtitleCues,
223222
captionStyles = userSettings.captionStyles,
224223
danmakuState = danmakuState,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dev.typetype.android.feature.player
2+
3+
import dev.typetype.android.domain.preferences.PreferencesRepository
4+
import kotlinx.coroutines.CoroutineScope
5+
import kotlinx.coroutines.Job
6+
import kotlinx.coroutines.delay
7+
import kotlinx.coroutines.launch
8+
9+
internal class PlaybackBrightnessPreferenceController(
10+
private val preferencesRepository: PreferencesRepository,
11+
private val scope: CoroutineScope,
12+
) {
13+
private var saveJob: Job? = null
14+
15+
fun update(percent: Int, onChanged: (Int) -> Unit) {
16+
val value = percent.coerceIn(0, 100)
17+
onChanged(value)
18+
saveJob?.cancel()
19+
saveJob = scope.launch {
20+
delay(SAVE_DEBOUNCE_MS)
21+
preferencesRepository.setPlayerPlaybackBrightnessPercent(value)
22+
}
23+
}
24+
}
25+
26+
private const val SAVE_DEBOUNCE_MS = 180L

‎app/src/main/java/dev/typetype/android/feature/player/PlayerAction.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ sealed interface PlayerAction {
99
data object OnAdvanceQueue : PlayerAction
1010
data object OnCancelQueueAutoplay : PlayerAction
1111
data object OnToggleQueueAutoplayPause : PlayerAction
12+
data class OnSetPlaybackBrightness(val percent: Int) : PlayerAction
1213
data class OnDownload(val selection: DownloadSelection) : PlayerAction
1314
data object OnOpenPlaylistPicker : PlayerAction
1415
data object OnDismissPlaylistPicker : PlayerAction

‎app/src/main/java/dev/typetype/android/feature/player/PlayerScreen.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ fun PlayerScreen(
162162
isFavorited = state.isFavorited,
163163
isInWatchLater = state.isInWatchLater,
164164
gestureConfig = state.gestureConfig,
165+
playbackBrightnessPercent = state.playbackBrightnessPercent,
165166
autoplayCountdownSeconds = state.autoplayCountdownSeconds,
166167
audioOnlyPlaybackDefault = state.audioOnlyPlaybackDefault,
167168
userSettings = state.userSettings,

‎app/src/main/java/dev/typetype/android/feature/player/PlayerState.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ data class PlayerState(
1818
val isFavorited: Boolean = false,
1919
val isInWatchLater: Boolean = false,
2020
val gestureConfig: PlayerGestureConfig = PlayerGestureConfig(),
21+
val playbackBrightnessPercent: Int? = null,
2122
val autoplayCountdownSeconds: Int = 10,
2223
val audioOnlyPlaybackDefault: Boolean? = null,
2324
val userSettings: UserSettings = UserSettings(),

‎app/src/main/java/dev/typetype/android/feature/player/PlayerViewModel.kt‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class PlayerViewModel @Inject constructor(
6868
private var loadStreamJob: Job? = null
6969
private var favoriteJob: Job? = null
7070
private var watchLaterJob: Job? = null
71+
private val brightnessPreferences = PlaybackBrightnessPreferenceController(
72+
preferencesRepository,
73+
viewModelScope,
74+
)
7175

7276
init {
7377
viewModelScope.launch {
@@ -144,6 +148,7 @@ class PlayerViewModel @Inject constructor(
144148
swipeBrightnessVolumeEnabled = prefs.playerSwipeBrightnessVolumeEnabled,
145149
longPressSpeedEnabled = prefs.playerLongPressSpeedEnabled,
146150
),
151+
playbackBrightnessPercent = prefs.playerPlaybackBrightnessPercent,
147152
autoplayCountdownSeconds = prefs.playerAutoplayCountdownSeconds,
148153
audioOnlyPlaybackDefault = prefs.playerAudioOnlyPlayback,
149154
)
@@ -172,6 +177,9 @@ class PlayerViewModel @Inject constructor(
172177
PlayerAction.OnCancelQueueAutoplay -> playbackQueueCoordinator.cancelAutoplay()
173178
PlayerAction.OnToggleQueueAutoplayPause ->
174179
playbackQueueCoordinator.toggleAutoplayPause()
180+
is PlayerAction.OnSetPlaybackBrightness -> brightnessPreferences.update(action.percent) {
181+
_state.update { state -> state.copy(playbackBrightnessPercent = it) }
182+
}
175183
is PlayerAction.OnDownload -> downloadCurrentVideo(action.selection)
176184
PlayerAction.OnOpenPlaylistPicker ->
177185
_state.update { it.copy(playlistPickerVisible = true) }

0 commit comments

Comments
 (0)