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(