From cb46aa41592201df9094b2f8000165ca5978d0e9 Mon Sep 17 00:00:00 2001 From: Damontecres Date: Mon, 11 May 2026 10:22:27 -0400 Subject: [PATCH] Rearrange playback controller buttons (#1366) ## Description - Moves the audio track selection out of the menu as a button - Combines the settings & more buttons into one dialog All functionality works the same, this is just UI changes ### Related issues Related to #528 ### Testing Emulator, it's just UI changes ## Screenshots ### Before controller_before Large ### After controller_update Large ## AI or LLM usage None --- .../wholphin/ui/playback/PlaybackDialog.kt | 66 +++++-------------- .../wholphin/ui/playback/PlaybackPage.kt | 10 ++- .../ui/playback/overlay/PlaybackController.kt | 8 --- .../ui/playback/overlay/PlaybackControls.kt | 32 ++++----- 4 files changed, 38 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt index 8217a516..5b0bd5d8 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackDialog.kt @@ -43,7 +43,7 @@ import com.github.damontecres.wholphin.ui.tryRequestFocus import kotlin.time.Duration enum class PlaybackDialogType { - MORE, + DEBUG, CAPTIONS, SETTINGS, AUDIO, @@ -86,28 +86,8 @@ fun PlaybackDialog( onChangeSubtitleDelay: (Duration) -> Unit, ) { when (type) { - PlaybackDialogType.MORE -> { - val options = - buildList { - add( - BottomDialogItem( - data = 0, - headline = stringResource(if (settings.showDebugInfo) R.string.hide_debug_info else R.string.show_debug_info), - supporting = null, - ), - ) - } - BottomDialog( - choices = options, - onDismissRequest = { - onDismissRequest.invoke() -// focusRequester.tryRequestFocus() - }, - onSelectChoice = { index, choice -> - onPlaybackActionClick.invoke(PlaybackAction.ShowDebug) - }, - gravity = Gravity.START, - ) + PlaybackDialogType.DEBUG -> { + throw IllegalStateException("Should not open a dialog with " + PlaybackDialogType.DEBUG) } PlaybackDialogType.CAPTIONS -> { @@ -138,17 +118,8 @@ fun PlaybackDialog( } PlaybackDialogType.SETTINGS -> { - val currentAudio = - remember(settings) { settings.audioStreams.firstOrNull { it.index == settings.audioIndex } } val options = buildList { - add( - BottomDialogItem( - data = PlaybackDialogType.AUDIO, - headline = stringResource(R.string.audio), - supporting = currentAudio?.displayTitle, - ), - ) add( BottomDialogItem( data = PlaybackDialogType.PLAYBACK_SPEED, @@ -177,15 +148,26 @@ fun PlaybackDialog( ), ) } + add( + BottomDialogItem( + data = PlaybackDialogType.DEBUG, + headline = stringResource(if (settings.showDebugInfo) R.string.hide_debug_info else R.string.show_debug_info), + supporting = null, + ), + ) } BottomDialog( choices = options, currentChoice = null, onDismissRequest = onDismissRequest, onSelectChoice = { _, choice -> - onClickPlaybackDialogType(choice.data) + if (choice.data == PlaybackDialogType.DEBUG) { + onPlaybackActionClick.invoke(PlaybackAction.ShowDebug) + } else { + onClickPlaybackDialogType(choice.data) + } }, - gravity = Gravity.END, + gravity = Gravity.START, ) } @@ -196,10 +178,6 @@ fun PlaybackDialog( onDismissRequest = { onControllerInteraction.invoke() onDismissRequest.invoke() -// scope.launch { -// delay(250L) -// settingsFocusRequester.tryRequestFocus() -// } }, onSelectChoice = { _, choice -> onPlaybackActionClick.invoke(PlaybackAction.ToggleAudio(choice.index)) @@ -223,15 +201,11 @@ fun PlaybackDialog( onDismissRequest = { onControllerInteraction.invoke() onDismissRequest.invoke() -// scope.launch { -// delay(250L) -// settingsFocusRequester.tryRequestFocus() -// } }, onSelectChoice = { _, value -> onPlaybackActionClick.invoke(PlaybackAction.PlaybackSpeed(value.data)) }, - gravity = Gravity.END, + gravity = Gravity.START, ) } @@ -250,15 +224,11 @@ fun PlaybackDialog( onDismissRequest = { onControllerInteraction.invoke() onDismissRequest.invoke() -// scope.launch { -// delay(250L) -// settingsFocusRequester.tryRequestFocus() -// } }, onSelectChoice = { _, choice -> onPlaybackActionClick.invoke(PlaybackAction.Scale(choice.data)) }, - gravity = Gravity.END, + gravity = Gravity.START, ) } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt index d3c85825..e0e24f4c 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt @@ -660,7 +660,15 @@ fun PlaybackPageContent( playbackSpeedEnabled = playerBackend == PlayerBackend.MPV || currentPlayback?.audioDecoder != null, ), onDismissRequest = { - playbackDialog = null + playbackDialog = + when (type) { + // Go back to settings dialog + PlaybackDialogType.PLAYBACK_SPEED, + PlaybackDialogType.VIDEO_SCALE, + -> PlaybackDialogType.SETTINGS + + else -> null + } if (controllerViewState.controlsVisible) { controllerViewState.pulseControls() } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackController.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackController.kt index 04f3d80a..0de48d15 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackController.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackController.kt @@ -23,7 +23,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow @@ -225,10 +224,6 @@ fun Controller( ) } } - // TODO need to move these up a level? - val moreFocusRequester = remember { FocusRequester() } - val captionFocusRequester = remember { FocusRequester() } - val settingsFocusRequester = remember { FocusRequester() } PlaybackControls( modifier = Modifier.fillMaxWidth(), player = player, @@ -248,9 +243,6 @@ fun Controller( skipBackOnResume = skipBackOnResume, currentSegment = currentSegment, onClickPlaybackDialogType = onClickPlaybackDialogType, - moreFocusRequester = moreFocusRequester, - captionFocusRequester = captionFocusRequester, - settingsFocusRequester = settingsFocusRequester, ) } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackControls.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackControls.kt index ae037e38..f423b8ca 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackControls.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/overlay/PlaybackControls.kt @@ -129,9 +129,6 @@ fun PlaybackControls( controllerViewState: ControllerViewState, onPlaybackActionClick: (PlaybackAction) -> Unit, onClickPlaybackDialogType: (PlaybackDialogType) -> Unit, - moreFocusRequester: FocusRequester, - captionFocusRequester: FocusRequester, - settingsFocusRequester: FocusRequester, onSeekProgress: (Long) -> Unit, showPlay: Boolean, previousEnabled: Boolean, @@ -186,7 +183,6 @@ fun PlaybackControls( .fillMaxWidth(), ) { LeftPlaybackButtons( - moreFocusRequester = moreFocusRequester, onControllerInteraction = onControllerInteraction, onClickPlaybackDialogType = onClickPlaybackDialogType, modifier = Modifier.align(Alignment.CenterStart), @@ -220,8 +216,6 @@ fun PlaybackControls( ) } RightPlaybackButtons( - captionFocusRequester = captionFocusRequester, - settingsFocusRequester = settingsFocusRequester, onControllerInteraction = onControllerInteraction, onClickPlaybackDialogType = onClickPlaybackDialogType, modifier = Modifier, @@ -303,7 +297,6 @@ val buttonSpacing = 12.dp @Composable fun LeftPlaybackButtons( - moreFocusRequester: FocusRequester, onControllerInteraction: () -> Unit, onClickPlaybackDialogType: (PlaybackDialogType) -> Unit, modifier: Modifier = Modifier, @@ -312,24 +305,21 @@ fun LeftPlaybackButtons( modifier = modifier.focusGroup(), horizontalArrangement = Arrangement.spacedBy(buttonSpacing), ) { - // More options PlaybackButton( - iconRes = R.drawable.baseline_more_vert_96, + iconRes = R.drawable.vector_settings, onClick = { onControllerInteraction.invoke() - onClickPlaybackDialogType.invoke(PlaybackDialogType.MORE) + onClickPlaybackDialogType.invoke(PlaybackDialogType.SETTINGS) }, enabled = true, onControllerInteraction = onControllerInteraction, - modifier = Modifier.focusRequester(moreFocusRequester), + modifier = Modifier, ) } } @Composable fun RightPlaybackButtons( - captionFocusRequester: FocusRequester, - settingsFocusRequester: FocusRequester, onControllerInteraction: () -> Unit, onClickPlaybackDialogType: (PlaybackDialogType) -> Unit, modifier: Modifier = Modifier, @@ -347,18 +337,18 @@ fun RightPlaybackButtons( onClickPlaybackDialogType.invoke(PlaybackDialogType.CAPTIONS) }, onControllerInteraction = onControllerInteraction, - modifier = Modifier.focusRequester(captionFocusRequester), + modifier = Modifier, ) - // Playback speed, etc - PlaybackButton( - iconRes = R.drawable.vector_settings, + // Audio + PlaybackFaButton( + enabled = true, + iconRes = R.string.fa_volume_high, onClick = { onControllerInteraction.invoke() - onClickPlaybackDialogType.invoke(PlaybackDialogType.SETTINGS) + onClickPlaybackDialogType.invoke(PlaybackDialogType.AUDIO) }, - enabled = true, onControllerInteraction = onControllerInteraction, - modifier = Modifier.focusRequester(settingsFocusRequester), + modifier = Modifier, ) } } @@ -625,7 +615,7 @@ private fun ButtonPreview() { onControllerInteraction = {}, ) PlaybackFaButton( - iconRes = R.string.fa_shuffle, + iconRes = R.string.fa_volume_high, onClick = {}, onControllerInteraction = {}, textColor = Color.Green,