mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Fix email verification input (#6367)
Some checks are pending
Android CI / Run tests and generate APK (push) Waiting to run
Some checks are pending
Android CI / Run tests and generate APK (push) Waiting to run
* Set imeOptions to actionDone and enforce singleLine for xlarge * Set imeOptions to actionDone and enforce singleLine for landscape * Set imeOptions to actionDone and enforce singleLine * Update askUserForTwoFactorAuth for IME_ACTION_DONE to trigger performLogin * Fix email verification: Set imeOptions to actionDone and replace singleLine with maxLines=1 * Fix email verification: Set imeOptions to actionDone and replace singleLine with maxLines=1 * Fix email verification: Set imeOptions to actionDone and replace singleLine with maxLines=1 * feat: Set imeOptions to actionNext for login_password to improve focus transition * feat: Enhance keyboard visibility for email verification code input
This commit is contained in:
parent
88565b70c5
commit
29ade1e5b7
4 changed files with 84 additions and 18 deletions
|
|
@ -92,7 +92,19 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
||||||
aboutPrivacyPolicy.setOnClickListener { onPrivacyPolicyClicked() }
|
aboutPrivacyPolicy.setOnClickListener { onPrivacyPolicyClicked() }
|
||||||
signUpButton.setOnClickListener { signUp() }
|
signUpButton.setOnClickListener { signUp() }
|
||||||
loginButton.setOnClickListener { performLogin() }
|
loginButton.setOnClickListener { performLogin() }
|
||||||
loginPassword.setOnEditorActionListener(::onEditorAction)
|
loginPassword.setOnEditorActionListener { textView, actionId, keyEvent ->
|
||||||
|
if (binding!!.loginButton.isEnabled && isTriggerAction(actionId, keyEvent)) {
|
||||||
|
if (actionId == EditorInfo.IME_ACTION_NEXT && lastLoginResult != null) {
|
||||||
|
askUserForTwoFactorAuthWithKeyboard()
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
performLogin()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
loginPassword.onFocusChangeListener =
|
loginPassword.onFocusChangeListener =
|
||||||
View.OnFocusChangeListener(::onPasswordFocusChanged)
|
View.OnFocusChangeListener(::onPasswordFocusChanged)
|
||||||
|
|
@ -113,6 +125,39 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
fun askUserForTwoFactorAuthWithKeyboard() {
|
||||||
|
if (binding == null) {
|
||||||
|
Timber.w("Binding is null, reinitializing in askUserForTwoFactorAuthWithKeyboard")
|
||||||
|
binding = ActivityLoginBinding.inflate(layoutInflater)
|
||||||
|
setContentView(binding!!.root)
|
||||||
|
}
|
||||||
|
progressDialog!!.dismiss()
|
||||||
|
if (binding != null) {
|
||||||
|
with(binding!!) {
|
||||||
|
twoFactorContainer.visibility = View.VISIBLE
|
||||||
|
twoFactorContainer.hint = getString(if (lastLoginResult is LoginResult.EmailAuthResult) R.string.email_auth_code else R.string._2fa_code)
|
||||||
|
loginTwoFactor.visibility = View.VISIBLE
|
||||||
|
loginTwoFactor.requestFocus()
|
||||||
|
|
||||||
|
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
|
imm.showSoftInput(loginTwoFactor, InputMethodManager.SHOW_IMPLICIT)
|
||||||
|
|
||||||
|
loginTwoFactor.setOnEditorActionListener { _, actionId, event ->
|
||||||
|
if (actionId == EditorInfo.IME_ACTION_DONE ||
|
||||||
|
(event != null && event.keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN)) {
|
||||||
|
performLogin()
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Timber.e("Binding is null in askUserForTwoFactorAuthWithKeyboard after reinitialization attempt")
|
||||||
|
}
|
||||||
|
showMessageAndCancelDialog(getString(if (lastLoginResult is LoginResult.EmailAuthResult) R.string.login_failed_email_auth_needed else R.string.login_failed_2fa_needed))
|
||||||
|
}
|
||||||
override fun onPostCreate(savedInstanceState: Bundle?) {
|
override fun onPostCreate(savedInstanceState: Bundle?) {
|
||||||
super.onPostCreate(savedInstanceState)
|
super.onPostCreate(savedInstanceState)
|
||||||
delegate.onPostCreate(savedInstanceState)
|
delegate.onPostCreate(savedInstanceState)
|
||||||
|
|
@ -236,7 +281,7 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
||||||
} else false
|
} else false
|
||||||
|
|
||||||
private fun isTriggerAction(actionId: Int, keyEvent: KeyEvent?) =
|
private fun isTriggerAction(actionId: Int, keyEvent: KeyEvent?) =
|
||||||
actionId == EditorInfo.IME_ACTION_DONE || keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER
|
actionId == EditorInfo.IME_ACTION_NEXT || actionId == EditorInfo.IME_ACTION_DONE || keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER
|
||||||
|
|
||||||
private fun skipLogin() {
|
private fun skipLogin() {
|
||||||
AlertDialog.Builder(this)
|
AlertDialog.Builder(this)
|
||||||
|
|
@ -286,14 +331,14 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
||||||
Timber.d("Requesting 2FA prompt")
|
Timber.d("Requesting 2FA prompt")
|
||||||
progressDialog!!.dismiss()
|
progressDialog!!.dismiss()
|
||||||
lastLoginResult = loginResult
|
lastLoginResult = loginResult
|
||||||
askUserForTwoFactorAuth()
|
askUserForTwoFactorAuthWithKeyboard()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun emailAuthPrompt(loginResult: LoginResult, caught: Throwable, token: String?) {
|
override fun emailAuthPrompt(loginResult: LoginResult, caught: Throwable, token: String?) = runOnUiThread {
|
||||||
Timber.d("Requesting email auth prompt")
|
Timber.d("Requesting email auth prompt")
|
||||||
progressDialog!!.dismiss()
|
progressDialog!!.dismiss()
|
||||||
lastLoginResult = loginResult
|
lastLoginResult = loginResult
|
||||||
askUserForTwoFactorAuth()
|
askUserForTwoFactorAuthWithKeyboard()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun passwordResetPrompt(token: String?) = runOnUiThread {
|
override fun passwordResetPrompt(token: String?) = runOnUiThread {
|
||||||
|
|
@ -348,12 +393,31 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
fun askUserForTwoFactorAuth() {
|
fun askUserForTwoFactorAuth() {
|
||||||
|
if (binding == null) {
|
||||||
|
Timber.w("Binding is null, reinitializing in askUserForTwoFactorAuth")
|
||||||
|
binding = ActivityLoginBinding.inflate(layoutInflater)
|
||||||
|
setContentView(binding!!.root)
|
||||||
|
}
|
||||||
progressDialog!!.dismiss()
|
progressDialog!!.dismiss()
|
||||||
|
if (binding != null) {
|
||||||
with(binding!!) {
|
with(binding!!) {
|
||||||
twoFactorContainer.visibility = View.VISIBLE
|
twoFactorContainer.visibility = View.VISIBLE
|
||||||
twoFactorContainer.hint = getString(if (lastLoginResult is LoginResult.EmailAuthResult) R.string.email_auth_code else R.string._2fa_code)
|
twoFactorContainer.hint = getString(if (lastLoginResult is LoginResult.EmailAuthResult) R.string.email_auth_code else R.string._2fa_code)
|
||||||
loginTwoFactor.visibility = View.VISIBLE
|
loginTwoFactor.visibility = View.VISIBLE
|
||||||
loginTwoFactor.requestFocus()
|
loginTwoFactor.requestFocus()
|
||||||
|
|
||||||
|
loginTwoFactor.setOnEditorActionListener { _, actionId, event ->
|
||||||
|
if (actionId == EditorInfo.IME_ACTION_DONE ||
|
||||||
|
(event != null && event.keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN)) {
|
||||||
|
performLogin()
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Timber.e("Binding is null in askUserForTwoFactorAuth after reinitialization attempt")
|
||||||
}
|
}
|
||||||
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
|
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
|
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/password"
|
android:hint="@string/password"
|
||||||
android:imeOptions="flagNoExtractUi"
|
android:imeOptions="actionNext"
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
@ -148,9 +148,9 @@
|
||||||
android:id="@+id/login_two_factor"
|
android:id="@+id/login_two_factor"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/_2fa_code"
|
android:imeOptions="actionDone"
|
||||||
android:imeOptions="flagNoExtractUi"
|
|
||||||
android:inputType="number"
|
android:inputType="number"
|
||||||
|
android:maxLines="1"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/password"
|
android:hint="@string/password"
|
||||||
android:imeOptions="flagNoExtractUi"
|
android:imeOptions="actionNext"
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
@ -151,9 +151,9 @@
|
||||||
android:id="@+id/login_two_factor"
|
android:id="@+id/login_two_factor"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/_2fa_code"
|
android:imeOptions="actionDone"
|
||||||
android:imeOptions="flagNoExtractUi"
|
|
||||||
android:inputType="number"
|
android:inputType="number"
|
||||||
|
android:maxLines="1"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/password"
|
android:hint="@string/password"
|
||||||
android:imeOptions="flagNoExtractUi"
|
android:imeOptions="actionNext"
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
@ -155,7 +155,9 @@
|
||||||
android:id="@+id/login_two_factor"
|
android:id="@+id/login_two_factor"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:imeOptions="flagNoExtractUi"
|
android:imeOptions="actionDone"
|
||||||
|
android:inputType="number"
|
||||||
|
android:maxLines="1"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue