Skip to content

Commit 17e574f

Browse files
committed
feat: Add autofill for login
1 parent dda9384 commit 17e574f

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.datepollsystems.waiterrobot.mediator.ui.common
2+
3+
import androidx.compose.ui.ExperimentalComposeUiApi
4+
import androidx.compose.ui.Modifier
5+
import androidx.compose.ui.autofill.AutofillNode
6+
import androidx.compose.ui.autofill.AutofillType
7+
import androidx.compose.ui.composed
8+
import androidx.compose.ui.focus.onFocusChanged
9+
import androidx.compose.ui.layout.boundsInWindow
10+
import androidx.compose.ui.layout.onGloballyPositioned
11+
import androidx.compose.ui.platform.LocalAutofill
12+
import androidx.compose.ui.platform.LocalAutofillTree
13+
14+
@OptIn(ExperimentalComposeUiApi::class)
15+
fun Modifier.autofill(
16+
vararg autofillTypes: AutofillType,
17+
onFill: ((String) -> Unit),
18+
) = composed {
19+
val autofill = LocalAutofill.current
20+
val autofillNode = AutofillNode(onFill = onFill, autofillTypes = autofillTypes.toList())
21+
LocalAutofillTree.current += autofillNode
22+
23+
this.onGloballyPositioned {
24+
autofillNode.boundingBox = it.boundsInWindow()
25+
}.onFocusChanged { focusState ->
26+
autofill?.run {
27+
if (focusState.isFocused) {
28+
requestAutofillForNode(autofillNode)
29+
} else {
30+
cancelAutofillForNode(autofillNode)
31+
}
32+
}
33+
}
34+
}

src/main/kotlin/org/datepollsystems/waiterrobot/mediator/ui/login/LoginScreen.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@ import androidx.compose.material.icons.filled.Visibility
1111
import androidx.compose.material.icons.filled.VisibilityOff
1212
import androidx.compose.runtime.*
1313
import androidx.compose.ui.Alignment
14+
import androidx.compose.ui.ExperimentalComposeUiApi
1415
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.autofill.AutofillType
1517
import androidx.compose.ui.graphics.Color
1618
import androidx.compose.ui.text.input.KeyboardType
1719
import androidx.compose.ui.text.input.PasswordVisualTransformation
1820
import androidx.compose.ui.text.input.VisualTransformation
1921
import androidx.compose.ui.text.style.TextAlign
2022
import androidx.compose.ui.unit.dp
2123
import org.datepollsystems.waiterrobot.mediator.ui.common.LoadableScreen
24+
import org.datepollsystems.waiterrobot.mediator.ui.common.autofill
2225
import org.datepollsystems.waiterrobot.mediator.ui.common.onEnterKeyDown
2326

27+
@OptIn(ExperimentalComposeUiApi::class)
2428
@Composable
2529
fun LoginScreen(vm: LoginViewModel) {
2630
val state = vm.state.collectAsState().value
@@ -64,7 +68,9 @@ fun LoginScreen(vm: LoginViewModel) {
6468
}
6569

6670
OutlinedTextField(
67-
modifier = Modifier.fillMaxWidth(),
71+
modifier = Modifier
72+
.fillMaxWidth()
73+
.autofill(AutofillType.Username, AutofillType.EmailAddress) { mail = it },
6874
value = mail,
6975
isError = state.loginErrorMessage != null,
7076
singleLine = true,
@@ -76,7 +82,8 @@ fun LoginScreen(vm: LoginViewModel) {
7682
OutlinedTextField(
7783
modifier = Modifier
7884
.fillMaxWidth()
79-
.onEnterKeyDown { vm.doLogin(mail, password) },
85+
.onEnterKeyDown { vm.doLogin(mail, password) }
86+
.autofill(AutofillType.Password) { password = it },
8087
value = password,
8188
singleLine = true,
8289
isError = state.loginErrorMessage != null,
@@ -97,7 +104,7 @@ fun LoginScreen(vm: LoginViewModel) {
97104
IconButton(onClick = { passwordVisible = !passwordVisible }) {
98105
Icon(imageVector = image, description)
99106
}
100-
}
107+
},
101108
)
102109

103110
OutlinedButton(

0 commit comments

Comments
 (0)