Handle d-pad skipping for RTL

This commit is contained in:
Damontecres 2026-05-16 13:19:40 -04:00
parent b08497440f
commit 513a217c1c
No known key found for this signature in database
3 changed files with 45 additions and 26 deletions

View file

@ -45,7 +45,9 @@ import androidx.compose.ui.input.key.KeyEventType
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.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.media3.common.util.UnstableApi
@ -106,9 +108,11 @@ fun NowPlayingPage(
).value.appPreferences
val musicPrefs = preferences.musicPreferences
val isLtr = LocalLayoutDirection.current == LayoutDirection.Ltr
val keyHandler =
remember(preferences) {
remember(isLtr, preferences) {
PlaybackKeyHandler(
isLtr = isLtr,
player = player,
controlsEnabled = true,
skipWithLeftRight = false,

View file

@ -15,6 +15,7 @@ import kotlin.time.Duration
* Handles [KeyEvent]s during playback on [PlaybackPage]
*/
class PlaybackKeyHandler(
private val isLtr: Boolean,
private val player: Player,
private val controlsEnabled: Boolean,
private val skipWithLeftRight: Boolean,
@ -47,11 +48,21 @@ class PlaybackKeyHandler(
if (isDirectionalDpad(it) || isEnterKey(it) || isControllerMedia(it)) {
if (!controllerViewState.controlsVisible) {
if (skipWithLeftRight && isSkipBack(it)) {
if (isLtr) {
updateSkipIndicator(-seekBack.inWholeMilliseconds)
player.seekBack(seekBack)
} else {
updateSkipIndicator(seekForward.inWholeMilliseconds)
player.seekForward(seekForward)
}
} else if (skipWithLeftRight && isSkipForward(it)) {
if (isLtr) {
player.seekForward(seekForward)
updateSkipIndicator(seekForward.inWholeMilliseconds)
} else {
player.seekBack(seekBack)
updateSkipIndicator(seekBack.inWholeMilliseconds)
}
} else if (oneClickPause && isEnterKey(it)) {
val wasPlaying = player.isPlaying
Util.handlePlayPauseButtonAction(player)
@ -127,7 +138,7 @@ class PlaybackKeyHandler(
return false
}
val isBack = isSkipBack(event)
val isBack = if (isLtr) isSkipBack(event) else isSkipForward(event)
return when (event.type) {
KeyEventType.KeyDown -> {
val repeatCount = event.nativeKeyEvent.repeatCount

View file

@ -1,7 +1,6 @@
package com.github.damontecres.wholphin.ui.playback
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.activity.compose.BackHandler
@ -48,8 +47,10 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog
@ -240,8 +241,11 @@ fun PlaybackPageContent(
skipIndicatorDuration += delta
skipPosition = player.currentPosition
}
val isLtr = LocalLayoutDirection.current == LayoutDirection.Ltr
val keyHandler =
remember(isLtr, preferences) {
PlaybackKeyHandler(
isLtr = isLtr,
player = player,
controlsEnabled = nextUp == null,
skipWithLeftRight = true,
@ -259,7 +263,7 @@ fun PlaybackPageContent(
},
onPlaybackDialogTypeClick = { playbackDialog = it },
)
}
val onPlaybackActionClick: (PlaybackAction) -> Unit = {
when (it) {
is PlaybackAction.PlaybackSpeed -> {