From 0f82ed460352c02b021f35bd7ac03f36fd2e0e91 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Fri, 27 Feb 2026 21:07:55 +0100 Subject: [PATCH] feat: add focus management for play button in Movie and Episode screens --- .../purefin/app/content/episode/EpisodeScreen.kt | 15 +++++++++++---- .../purefin/app/content/movie/MovieScreen.kt | 15 +++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app-tv/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt b/app-tv/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt index 9a91c86..d47689b 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt @@ -1,11 +1,11 @@ package hu.bbara.purefin.app.content.episode import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add @@ -23,7 +22,10 @@ import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -79,6 +81,11 @@ private fun EpisodeScreenInternal( ) { val scheme = MaterialTheme.colorScheme val hPad = Modifier.padding(horizontal = 16.dp) + val playFocusRequester = remember { FocusRequester() } + + LaunchedEffect(Unit) { + playFocusRequester.requestFocus() + } LazyColumn( modifier = modifier @@ -143,7 +150,7 @@ private fun EpisodeScreenInternal( text = if (episode.progress == null) "Play" else "Resume", progress = episode.progress?.div(100)?.toFloat() ?: 0f, onClick = onPlay, - modifier = Modifier.sizeIn(maxWidth = 200.dp) + modifier = Modifier.sizeIn(maxWidth = 200.dp).focusRequester(playFocusRequester) ) VerticalDivider( color = scheme.secondary, diff --git a/app-tv/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt b/app-tv/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt index 87d4a37..92d5b8a 100644 --- a/app-tv/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt +++ b/app-tv/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt @@ -1,11 +1,11 @@ package hu.bbara.purefin.app.content.movie import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add @@ -23,7 +22,10 @@ import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -72,6 +74,11 @@ private fun MovieScreenInternal( ) { val scheme = MaterialTheme.colorScheme val hPad = Modifier.padding(horizontal = 16.dp) + val playFocusRequester = remember { FocusRequester() } + + LaunchedEffect(Unit) { + playFocusRequester.requestFocus() + } LazyColumn( modifier = modifier @@ -129,7 +136,7 @@ private fun MovieScreenInternal( text = if (movie.progress == null) "Play" else "Resume", progress = movie.progress?.div(100)?.toFloat() ?: 0f, onClick = onPlay, - modifier = Modifier.sizeIn(maxWidth = 200.dp) + modifier = Modifier.sizeIn(maxWidth = 200.dp).focusRequester(playFocusRequester) ) VerticalDivider( color = scheme.secondary,