phone: rewind/forward buttons in remote screen (DPAD left/right)

This commit is contained in:
2026-09-27 04:01:22 +03:00
parent 8a0b7832c0
commit 027e2efb9c
@@ -15,6 +15,8 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.FastForward
import androidx.compose.material.icons.filled.FastRewind
import androidx.compose.material.icons.filled.Keyboard import androidx.compose.material.icons.filled.Keyboard
import androidx.compose.material.icons.filled.Pause import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.PlayArrow
@@ -45,6 +47,8 @@ import pw.binom.rayneovm.shared.VmDisplay
// android.view.KeyEvent-коды. Здесь обычные числа, чтобы не тянуть android-зависимости в UI-тесты. // android.view.KeyEvent-коды. Здесь обычные числа, чтобы не тянуть android-зависимости в UI-тесты.
private const val KEYCODE_BACK = 4 private const val KEYCODE_BACK = 4
private const val KEYCODE_DPAD_LEFT = 21
private const val KEYCODE_DPAD_RIGHT = 22
private const val KEYCODE_MEDIA_PLAY = 126 private const val KEYCODE_MEDIA_PLAY = 126
private const val KEYCODE_MEDIA_PAUSE = 127 private const val KEYCODE_MEDIA_PAUSE = 127
@@ -56,7 +60,7 @@ private const val CLICK_GRACE_MS = 100L
* - тачпад-мышь: движение одного пальца → курсор (отыгрывается на очках в обоих глазах), * - тачпад-мышь: движение одного пальца → курсор (отыгрывается на очках в обоих глазах),
* тап по тачпаду → клик в текущей позиции курсора; * тап по тачпаду → клик в текущей позиции курсора;
* - два пальца по тачпаду → скролл (вверх/вниз/вправо/влево) под курсором; * - два пальца по тачпаду → скролл (вверх/вниз/вправо/влево) под курсором;
* - кнопки «Назад», «Плей», «Пауза»; * - кнопки «Перемотка», «Плей», «Вперёд», «Назад», «Пауза»;
* - «Клавиатура» — заглушка (сделаем позже). * - «Клавиатура» — заглушка (сделаем позже).
*/ */
@Composable @Composable
@@ -170,12 +174,24 @@ fun RemoteScreen(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(12.dp), horizontalArrangement = Arrangement.spacedBy(12.dp),
) { ) {
RemoteButton(Icons.AutoMirrored.Filled.ArrowBack, "Назад", Modifier.weight(1f)) { RemoteButton(Icons.Default.FastRewind, "Перемотка", Modifier.weight(1f)) {
scope.launch { controller.sendKey(KEYCODE_BACK) } scope.launch { controller.sendKey(KEYCODE_DPAD_LEFT) }
} }
RemoteButton(Icons.Default.PlayArrow, "Плей", Modifier.weight(1f)) { RemoteButton(Icons.Default.PlayArrow, "Плей", Modifier.weight(1f)) {
scope.launch { controller.sendKey(KEYCODE_MEDIA_PLAY) } scope.launch { controller.sendKey(KEYCODE_MEDIA_PLAY) }
} }
RemoteButton(Icons.Default.FastForward, "Вперёд", Modifier.weight(1f)) {
scope.launch { controller.sendKey(KEYCODE_DPAD_RIGHT) }
}
}
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(12.dp),
) {
RemoteButton(Icons.AutoMirrored.Filled.ArrowBack, "Назад", Modifier.weight(1f)) {
scope.launch { controller.sendKey(KEYCODE_BACK) }
}
RemoteButton(Icons.Default.Pause, "Пауза", Modifier.weight(1f)) { RemoteButton(Icons.Default.Pause, "Пауза", Modifier.weight(1f)) {
scope.launch { controller.sendKey(KEYCODE_MEDIA_PAUSE) } scope.launch { controller.sendKey(KEYCODE_MEDIA_PAUSE) }
} }
@@ -197,7 +213,7 @@ private fun RemoteButton(
onClick = onClick, onClick = onClick,
enabled = enabled, enabled = enabled,
modifier = modifier, modifier = modifier,
contentPadding = PaddingValues(vertical = 12.dp), contentPadding = PaddingValues(horizontal = 4.dp, vertical = 12.dp),
) { ) {
Column(horizontalAlignment = Alignment.CenterHorizontally) { Column(horizontalAlignment = Alignment.CenterHorizontally) {
Icon(icon, contentDescription = label) Icon(icon, contentDescription = label)