commit 1b3a3558731b796f8421dac2f8769be3aa67d73b
parent fb39e545e1f688f216671aafc69b8c4a4d5381f0
Author: Bohdan Potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date: Wed, 21 Jan 2026 12:03:00 +0100
changing mfa dialog
Diffstat:
5 files changed, 78 insertions(+), 11 deletions(-)
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/config/ConfigFragment.kt
@@ -24,7 +24,6 @@ import android.content.pm.PackageManager
import android.media.Image
import android.os.Bundle
import android.util.Log
-import android.text.InputType
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
@@ -32,11 +31,9 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.Button
-import android.widget.EditText
import android.widget.RadioButton
import android.widget.TextView
import android.widget.Toast
-import androidx.appcompat.app.AlertDialog
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.OptIn
import androidx.camera.core.CameraSelector
@@ -50,6 +47,9 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import com.google.android.material.button.MaterialButtonToggleGroup
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.textfield.TextInputEditText
+import com.google.android.material.textfield.TextInputLayout
import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.Dispatchers
@@ -413,7 +413,7 @@ class ConfigFragment : Fragment() {
val labels = challenges.map { c ->
"${c.tan_channel}: ${c.tan_info}"
}.toTypedArray()
- AlertDialog.Builder(requireContext())
+ MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.mfa_choose_title)
.setItems(labels) { _, which ->
cont.resume(challenges[which])
@@ -426,20 +426,26 @@ class ConfigFragment : Fragment() {
private suspend fun promptForTan(challenge: Challenge): String? =
withContext(Dispatchers.Main) {
suspendCancellableCoroutine { cont ->
- val input = EditText(requireContext()).apply {
- inputType = InputType.TYPE_CLASS_NUMBER
- }
val message = getString(
R.string.mfa_challenge_message,
challenge.tan_channel,
challenge.tan_info
)
- AlertDialog.Builder(requireContext())
+ val dialogView = layoutInflater.inflate(
+ R.layout.dialog_mfa_challenge,
+ null,
+ false
+ )
+ val messageView = dialogView.findViewById<TextView>(R.id.mfaMessageView)
+ val inputLayout = dialogView.findViewById<TextInputLayout>(R.id.mfaCodeInputLayout)
+ val input = dialogView.findViewById<TextInputEditText>(R.id.mfaCodeInput)
+ messageView.text = message
+ inputLayout.isErrorEnabled = false
+ MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.mfa_challenge_title)
- .setMessage(message)
- .setView(input)
+ .setView(dialogView)
.setPositiveButton(android.R.string.ok) { _, _ ->
- cont.resume(input.text.toString().trim())
+ cont.resume(input?.text?.toString()?.trim().orEmpty())
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
cont.resume(null)
diff --git a/merchant-terminal/src/main/res/layout/dialog_mfa_challenge.xml b/merchant-terminal/src/main/res/layout/dialog_mfa_challenge.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ This file is part of GNU Taler
+ ~ (C) 2026 Taler Systems S.A.
+ ~
+ ~ GNU Taler is free software; you can redistribute it and/or modify it under the
+ ~ terms of the GNU General Public License as published by the Free Software
+ ~ Foundation; either version 3, or (at your option) any later version.
+ ~
+ ~ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ ~ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ ~ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ ~
+ ~ You should have received a copy of the GNU General Public License along with
+ ~ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingStart="24dp"
+ android:paddingTop="16dp"
+ android:paddingEnd="24dp"
+ android:paddingBottom="8dp">
+
+ <TextView
+ android:id="@+id/mfaMessageView"
+ style="@style/TextAppearance.Material3.BodyMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:textColor="?attr/colorOnSurfaceVariant" />
+
+ <com.google.android.material.textfield.TextInputLayout
+ android:id="@+id/mfaCodeInputLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/mfa_challenge_code_hint"
+ app:boxBackgroundMode="outline"
+ app:boxBackgroundColor="@android:color/transparent">
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:id="@+id/mfaCodeInput"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:imeOptions="actionDone"
+ android:inputType="number" />
+ </com.google.android.material.textfield.TextInputLayout>
+
+</LinearLayout>
diff --git a/merchant-terminal/src/main/res/values-sw600dp/bools.xml b/merchant-terminal/src/main/res/values-sw600dp/bools.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <bool name="is_tablet">true</bool>
+</resources>
diff --git a/merchant-terminal/src/main/res/values/bools.xml b/merchant-terminal/src/main/res/values/bools.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <bool name="is_tablet">false</bool>
+</resources>
diff --git a/merchant-terminal/src/main/res/values/strings.xml b/merchant-terminal/src/main/res/values/strings.xml
@@ -106,6 +106,7 @@
<string name="token_validity_deadline">Token validity deadline:</string>
<string name="mfa_challenge_title">Two-factor authentication</string>
<string name="mfa_challenge_message">A confirmation code was sent via %1$s (%2$s). Enter the code to continue.</string>
+ <string name="mfa_challenge_code_hint">Verification code</string>
<string name="mfa_choose_title">Choose verification method</string>
<string name="mfa_challenge_invalid">Incorrect code. Please try again.</string>
<string name="mfa_challenge_retry">Too many attempts. A new code has been sent.</string>