From ce7e750b9ffb7ac3eb4426126a22c8acefb63c50 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 23 Aug 2026 16:17:01 +0300 Subject: [PATCH] fix controls focus --- apps/vbox/client/androidApp/build.gradle.kts | 2 +- .../videoplayer/ui/DefaultControls.kt | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/vbox/client/androidApp/build.gradle.kts b/apps/vbox/client/androidApp/build.gradle.kts index b66ce2f..4c79ad3 100644 --- a/apps/vbox/client/androidApp/build.gradle.kts +++ b/apps/vbox/client/androidApp/build.gradle.kts @@ -7,7 +7,7 @@ plugins { alias(libs.plugins.convention.ktor.client) } -val appVersion = "1.26.7" +val appVersion = "1.26.8" android { buildFeatures { buildConfig = true } diff --git a/feature/video-player/src/commonMain/kotlin/ru/shadowsparky/videoplayer/ui/DefaultControls.kt b/feature/video-player/src/commonMain/kotlin/ru/shadowsparky/videoplayer/ui/DefaultControls.kt index 27561ec..52e823b 100644 --- a/feature/video-player/src/commonMain/kotlin/ru/shadowsparky/videoplayer/ui/DefaultControls.kt +++ b/feature/video-player/src/commonMain/kotlin/ru/shadowsparky/videoplayer/ui/DefaultControls.kt @@ -89,8 +89,10 @@ fun DefaultControls( .safeDrawingPadding() ) { SideDoubleTapSeekZones(controller) - Box(modifier = Modifier.align(Alignment.TopStart).padding(8.dp)) { - BackButton(Color.White) { onBack() } + if (!isUiLocked.value) { + Box(modifier = Modifier.align(Alignment.TopStart).padding(8.dp)) { + BackButton(Color.White) { onBack() } + } } Row(modifier = Modifier.align(Alignment.TopEnd).focusGroup().padding(8.dp)) { if (audioTracksState.isNotEmpty() && !isUiLocked.value) { @@ -252,11 +254,9 @@ private fun BoxScope.SideDoubleTapSeekZones(controller: PlayerController, enable @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable -private fun BoxScope.CenterControls( - state: PlayerState, - controller: PlayerController -) { +private fun BoxScope.CenterControls(state: PlayerState, controller: PlayerController) { val scope = rememberCoroutineScope() + val focusRequester = remember { FocusRequester() } var canRequestFocus by remember { mutableStateOf(false) } Box( modifier = Modifier.align(Alignment.Center) @@ -283,13 +283,13 @@ private fun BoxScope.CenterControls( ) } } - else -> { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(16.dp) ) { IconButton( + modifier = Modifier.focusRequester(focusRequester), onClick = { scope.launch { if (state.isPlaying) controller.pause() else controller.play() @@ -309,11 +309,17 @@ private fun BoxScope.CenterControls( ) } } - canRequestFocus = true + LaunchedEffect(canRequestFocus) { + if (canRequestFocus) { + withFrameNanos {} + focusRequester.requestFocus() + canRequestFocus = false + } + } } } } - LaunchedEffect(state.videoUrl) { canRequestFocus = false } + LaunchedEffect(state.videoUrl) { canRequestFocus = true } } private suspend fun PlayerController.seek(minus: Boolean) {