From a4ba8c152da10bf1de76580231f59b94f7d56907 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Apr 2020 14:46:49 +0200 Subject: [PATCH] Add IME action to the password field --- .../riotx/features/login/LoginFragment.kt | 30 +++++++++++++++++-- vector/src/main/res/layout/fragment_login.xml | 14 ++++----- vector/src/main/res/values/strings_riotX.xml | 3 +- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt index 57f914118b..8b89aeda2a 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt @@ -19,6 +19,7 @@ package im.vector.riotx.features.login import android.os.Build import android.os.Bundle import android.view.View +import android.view.inputmethod.EditorInfo import androidx.autofill.HintConstants import androidx.core.view.isVisible import butterknife.OnClick @@ -40,7 +41,8 @@ import kotlinx.android.synthetic.main.fragment_login.* import javax.inject.Inject /** - * In this screen, in signin mode: + * In this screen: + * In signin mode: * - the user is asked for login (or email) and password to sign in to a homeserver. * - He also can reset his password * In signup mode: @@ -49,6 +51,7 @@ import javax.inject.Inject class LoginFragment @Inject constructor() : AbstractLoginFragment() { private var passwordShown = false + private var isSignupMode = false override fun getLayoutResId() = R.layout.fragment_login @@ -57,6 +60,14 @@ class LoginFragment @Inject constructor() : AbstractLoginFragment() { setupSubmitButton() setupPasswordReveal() + + passwordField.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + submit() + return@setOnEditorActionListener true + } + return@setOnEditorActionListener false + } } private fun setupAutoFill(state: LoginViewState) { @@ -82,7 +93,20 @@ class LoginFragment @Inject constructor() : AbstractLoginFragment() { val login = loginField.text.toString() val password = passwordField.text.toString() - loginViewModel.handle(LoginAction.LoginOrRegister(login, password, getString(R.string.login_mobile_device_riotx))) + // This can be called by the IME action, so deal with empty cases + var error = 0 + if (login.isEmpty()) { + loginFieldTil.error = getString(if (isSignupMode) R.string.error_empty_field_choose_user_name else R.string.error_empty_field_enter_user_name) + error++ + } + if (password.isEmpty()) { + passwordFieldTil.error = getString(if (isSignupMode) R.string.error_empty_field_choose_password else R.string.error_empty_field_your_password) + error++ + } + + if (error == 0) { + loginViewModel.handle(LoginAction.LoginOrRegister(login, password, getString(R.string.login_mobile_device_riotx))) + } } private fun cleanupUi() { @@ -190,6 +214,8 @@ class LoginFragment @Inject constructor() : AbstractLoginFragment() { } override fun updateWithState(state: LoginViewState) { + isSignupMode = state.signMode == SignMode.SignUp + setupUi(state) setupAutoFill(state) setupButtons(state) diff --git a/vector/src/main/res/layout/fragment_login.xml b/vector/src/main/res/layout/fragment_login.xml index 3f2443440e..894a7598c8 100644 --- a/vector/src/main/res/layout/fragment_login.xml +++ b/vector/src/main/res/layout/fragment_login.xml @@ -82,6 +82,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" + android:imeOptions="actionDone" android:inputType="textPassword" android:maxLines="1" android:paddingEnd="48dp" @@ -104,19 +105,18 @@ - + android:layout_marginTop="22dp"> + android:text="@string/auth_forgot_password" + app:layout_constraintStart_toStartOf="parent" /> - + diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 3e23f61acf..932feba541 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -11,7 +11,8 @@ - + Please choose a username. + Please choose a password.