Add toggle play state functionality to seek bar onEnter pressed in TvUI

This commit is contained in:
2026-03-30 08:44:13 +02:00
parent 94f1eb2883
commit be350ff585

View File

@@ -68,17 +68,17 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -134,16 +134,14 @@ fun TvPlayerScreen(
if (uiState.isPlaying) showQueuePanel = false if (uiState.isPlaying) showQueuePanel = false
} }
val focusRequester = remember { FocusRequester() } val hiddenControlFocusRequester = remember { FocusRequester() }
val seekBarFocusRequester = remember { FocusRequester() } val controlsFocusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
LaunchedEffect(controlsVisible) { LaunchedEffect(controlsVisible) {
if (controlsVisible) { if (controlsVisible) {
seekBarFocusRequester.requestFocus() controlsFocusRequester.requestFocus()
} else { } else {
focusRequester.requestFocus() hiddenControlFocusRequester.requestFocus()
} }
} }
@@ -151,7 +149,7 @@ fun TvPlayerScreen(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.background(Color.Black) .background(Color.Black)
.focusRequester(focusRequester) .focusRequester(hiddenControlFocusRequester)
.onPreviewKeyEvent { event -> .onPreviewKeyEvent { event ->
if (!controlsVisible && event.type == KeyEventType.KeyDown) { if (!controlsVisible && event.type == KeyEventType.KeyDown) {
when (event.key) { when (event.key) {
@@ -200,7 +198,7 @@ fun TvPlayerScreen(
TvPlayerControlsOverlay( TvPlayerControlsOverlay(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
uiState = uiState, uiState = uiState,
seekBarFocusRequester = seekBarFocusRequester, focusRequester = controlsFocusRequester,
onBack = onBack, onBack = onBack,
onPlayPause = { viewModel.togglePlayPause() }, onPlayPause = { viewModel.togglePlayPause() },
onSeek = { viewModel.seekTo(it) }, onSeek = { viewModel.seekTo(it) },
@@ -266,7 +264,7 @@ private enum class TrackPanelType { AUDIO, SUBTITLES, QUALITY }
@Composable @Composable
private fun TvPlayerControlsOverlay( private fun TvPlayerControlsOverlay(
uiState: PlayerUiState, uiState: PlayerUiState,
seekBarFocusRequester: FocusRequester, focusRequester: FocusRequester,
onBack: () -> Unit, onBack: () -> Unit,
onPlayPause: () -> Unit, onPlayPause: () -> Unit,
onSeek: (Long) -> Unit, onSeek: (Long) -> Unit,
@@ -305,7 +303,7 @@ private fun TvPlayerControlsOverlay(
) )
TvPlayerBottomSection( TvPlayerBottomSection(
uiState = uiState, uiState = uiState,
seekBarFocusRequester = seekBarFocusRequester, focusRequester = focusRequester,
onPlayPause = onPlayPause, onPlayPause = onPlayPause,
onSeek = onSeek, onSeek = onSeek,
onSeekRelative = onSeekRelative, onSeekRelative = onSeekRelative,
@@ -373,7 +371,7 @@ private fun TvPlayerTopBar(
@Composable @Composable
private fun TvPlayerBottomSection( private fun TvPlayerBottomSection(
uiState: PlayerUiState, uiState: PlayerUiState,
seekBarFocusRequester: FocusRequester, focusRequester: FocusRequester,
onPlayPause: () -> Unit, onPlayPause: () -> Unit,
onSeek: (Long) -> Unit, onSeek: (Long) -> Unit,
onSeekRelative: (Long) -> Unit, onSeekRelative: (Long) -> Unit,
@@ -427,7 +425,8 @@ private fun TvPlayerBottomSection(
adMarkers = uiState.ads, adMarkers = uiState.ads,
onSeek = onSeek, onSeek = onSeek,
onSeekRelative = onSeekRelative, onSeekRelative = onSeekRelative,
focusRequester = seekBarFocusRequester togglePlayState = onPlayPause,
focusRequester = focusRequester
) )
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Box( Box(
@@ -506,6 +505,7 @@ private fun TvPlayerSeekBar(
adMarkers: List<TimedMarker>, adMarkers: List<TimedMarker>,
onSeek: (Long) -> Unit, onSeek: (Long) -> Unit,
onSeekRelative: (Long) -> Unit, onSeekRelative: (Long) -> Unit,
togglePlayState: () -> Unit,
focusRequester: FocusRequester = remember { FocusRequester() }, focusRequester: FocusRequester = remember { FocusRequester() },
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
@@ -536,6 +536,10 @@ private fun TvPlayerSeekBar(
onSeekRelative(10_000) onSeekRelative(10_000)
true true
} }
Key.Enter -> {
togglePlayState()
true
}
else -> false else -> false
} }
} else { } else {