From 11a8056ce24965a6dcb079b87e85bef901e323bf Mon Sep 17 00:00:00 2001 From: be-nj Date: Wed, 26 Aug 2026 00:32:22 +0200 Subject: [PATCH] fix(player): opening key-up no longer clicks the freshly focused pause button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The key-down that opens the overlay is consumed by the activity, but its key-up arrived after the play button grabbed focus and clicked it — instant pause right after the overlay appeared. The overlay now swallows select-releases whose press it never saw. Co-Authored-By: Claude Fable 5 --- app/build.gradle.kts | 4 ++-- .../java/dev/castarr/tv/ui/PlayerScreen.kt | 24 +++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f969f36..06c8159 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "dev.castarr.tv" minSdk = 26 targetSdk = 35 - versionCode = 11 - versionName = "0.6.0" + versionCode = 12 + versionName = "0.6.1" } // Release signing from environment (see ~/.keys/castarr-release.env on the diff --git a/app/src/main/java/dev/castarr/tv/ui/PlayerScreen.kt b/app/src/main/java/dev/castarr/tv/ui/PlayerScreen.kt index 3d5b129..377be07 100644 --- a/app/src/main/java/dev/castarr/tv/ui/PlayerScreen.kt +++ b/app/src/main/java/dev/castarr/tv/ui/PlayerScreen.kt @@ -17,7 +17,10 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -26,8 +29,12 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Path +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.onKeyEvent import androidx.compose.ui.input.key.onPreviewKeyEvent +import androidx.compose.ui.input.key.type import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight @@ -97,14 +104,27 @@ private fun formatClock(millis: Long): String = private fun Overlay(state: AppState) { val playFocus = remember { FocusRequester() } LaunchedEffect(Unit) { playFocus.requestFocus() } + // The key-UP of the very press that opened this overlay arrives after + // the play button grabbed focus and would click it (instant pause). + // Swallow select-releases whose press the overlay never saw. + var sawSelectDown by remember { mutableStateOf(false) } Box( Modifier .fillMaxSize() // Any key while the overlay is open keeps it open a while longer. - .onPreviewKeyEvent { + .onPreviewKeyEvent { event -> state.pingOverlay() - false + val select = event.key == Key.DirectionCenter || + event.key == Key.Enter || event.key == Key.NumPadEnter + when { + select && event.type == KeyEventType.KeyDown -> { + sawSelectDown = true + false + } + select && event.type == KeyEventType.KeyUp && !sawSelectDown -> true + else -> false + } }, ) { Box(