From 671a6d06580d6056a252bbe935ef2ea2447db47a Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <janne@kuschku.de>
Date: Sat, 5 Mar 2022 19:59:40 +0100
Subject: [PATCH] feat: handle tab focus

---
 .../quasseldroid/ui/components/LoginView.kt   | 13 ++++++----
 .../util/extensions/ModifierExtensions.kt     | 24 +++++++++++++++++++
 2 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/ModifierExtensions.kt

diff --git a/app/src/main/kotlin/de/justjanne/quasseldroid/ui/components/LoginView.kt b/app/src/main/kotlin/de/justjanne/quasseldroid/ui/components/LoginView.kt
index fa3b1a636..d3e6aa05e 100644
--- a/app/src/main/kotlin/de/justjanne/quasseldroid/ui/components/LoginView.kt
+++ b/app/src/main/kotlin/de/justjanne/quasseldroid/ui/components/LoginView.kt
@@ -21,6 +21,7 @@ import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import de.justjanne.quasseldroid.service.ConnectionData
+import de.justjanne.quasseldroid.util.extensions.handleTabFocus
 import de.justjanne.quasseldroid.util.saver.TextFieldValueSaver
 import java.net.InetSocketAddress
 
@@ -55,7 +56,8 @@ fun LoginView(
       singleLine = true,
       modifier = Modifier
         .padding(16.dp)
-        .fillMaxWidth(),
+        .fillMaxWidth()
+        .handleTabFocus(focusManager),
       label = { Text("Hostname") },
       keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Next),
       keyboardActions = KeyboardActions(onNext = {
@@ -68,7 +70,8 @@ fun LoginView(
       singleLine = true,
       modifier = Modifier
         .padding(16.dp)
-        .fillMaxWidth(),
+        .fillMaxWidth()
+        .handleTabFocus(focusManager),
       label = { Text("Port") },
       keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Next),
       keyboardActions = KeyboardActions(onNext = {
@@ -81,7 +84,8 @@ fun LoginView(
       singleLine = true,
       modifier = Modifier
         .padding(16.dp)
-        .fillMaxWidth(),
+        .fillMaxWidth()
+        .handleTabFocus(focusManager),
       label = { Text("Username") },
       keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Next),
       keyboardActions = KeyboardActions(onNext = {
@@ -94,7 +98,8 @@ fun LoginView(
       singleLine = true,
       modifier = Modifier
         .padding(16.dp)
-        .fillMaxWidth(),
+        .fillMaxWidth()
+        .handleTabFocus(focusManager),
       label = { Text("Password") },
       keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Next),
       keyboardActions = KeyboardActions(onNext = {
diff --git a/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/ModifierExtensions.kt b/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/ModifierExtensions.kt
new file mode 100644
index 000000000..e201bd96e
--- /dev/null
+++ b/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/ModifierExtensions.kt
@@ -0,0 +1,24 @@
+package de.justjanne.quasseldroid.util.extensions
+
+import android.view.KeyEvent
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusDirection
+import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.onPreviewKeyEvent
+
+fun Modifier.handleTabFocus(focusManager: FocusManager): Modifier =
+  onPreviewKeyEvent {
+    if (it.key == Key.Tab) {
+      if (it.nativeKeyEvent.action == KeyEvent.ACTION_UP) {
+        focusManager.moveFocus(
+          if (it.nativeKeyEvent.isShiftPressed) FocusDirection.Up
+          else FocusDirection.Down
+        )
+      }
+      true
+    } else {
+      false
+    }
+  }
-- 
GitLab