From 4b6c5e5d8b029b88926bd6291d0b0ec9b79f0cc0 Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Fri, 15 May 2026 19:25:26 +0500 Subject: [PATCH] optimize account search in tranfer page --- .../sar/basedbank/ui/home/TransferFragment.kt | 16 +++++++++--- .../sar/basedbank/util/AccountInputParser.kt | 25 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/sh/sar/basedbank/util/AccountInputParser.kt diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/TransferFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/TransferFragment.kt index df0d414..1568267 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/TransferFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/TransferFragment.kt @@ -41,6 +41,7 @@ import sh.sar.basedbank.databinding.FragmentTransferBinding import sh.sar.basedbank.databinding.ItemAccountDropdownBinding import sh.sar.basedbank.databinding.ItemPickerSectionHeaderBinding import sh.sar.basedbank.util.CredentialStore +import sh.sar.basedbank.util.AccountInputParser import sh.sar.basedbank.util.PaymvQrParser import sh.sar.basedbank.util.RecentPick import sh.sar.basedbank.util.RecentsCache @@ -190,6 +191,10 @@ class TransferFragment : Fragment() { } private fun lookupAccount() { + if (selectedAccount == null) { + Toast.makeText(requireContext(), R.string.transfer_select_source_first, Toast.LENGTH_SHORT).show() + return + } val accountNumber = binding.etTo.text?.toString()?.trim() ?: "" if (accountNumber.isBlank()) { Toast.makeText(requireContext(), R.string.transfer_enter_account_first, Toast.LENGTH_SHORT).show() @@ -225,7 +230,12 @@ class TransferFragment : Fragment() { var errorMsg: String? = null val info = withContext(Dispatchers.IO) { if (isBmlSource && bmlSess != null) { - val bmlResult = try { BmlLoginFlow().validateAccount(bmlSess, accountNumber) } catch (_: Exception) { null } + val inputType = AccountInputParser.detect(accountNumber) + val bmlFlow = BmlLoginFlow() + val bmlResult = try { + if (inputType == AccountInputParser.InputType.MIB_ACCOUNT) bmlFlow.verifyMibAccount(bmlSess, accountNumber) + else bmlFlow.validateAccount(bmlSess, accountNumber) + } catch (_: Exception) { null } if (bmlResult != null) { val bankId = when (bmlResult.trnType) { "IAT" -> "MALBMVMV" @@ -360,7 +370,7 @@ class TransferFragment : Fragment() { val isSrcBml = src.profileType.startsWith("BML") val isSrcCard = src.profileType == "BML_PREPAID" - val isDestMib = resolvedAccountNumber.matches(Regex("^9\\d{16}$")) + val isDestMib = AccountInputParser.detect(resolvedAccountNumber) == AccountInputParser.InputType.MIB_ACCOUNT val currency = src.currencyName.ifBlank { "MVR" } val allAccounts = viewModel.accounts.value ?: emptyList() val allContacts = viewModel.contacts.value ?: emptyList() @@ -430,7 +440,7 @@ class TransferFragment : Fragment() { ?: return Triple(false, "OTP unavailable", null) val currencyCode = if (src.currencyName == "USD") "840" else "462" val currency = if (src.currencyName == "USD") "USD" else "MVR" - val isDestMib = destAccount.matches(Regex("^9\\d{16}$")) + val isDestMib = AccountInputParser.detect(destAccount) == AccountInputParser.InputType.MIB_ACCOUNT val bankNo = if (isDestMib) 2 else 3 val toBank = when { isDestMib -> "MIB" diff --git a/app/src/main/java/sh/sar/basedbank/util/AccountInputParser.kt b/app/src/main/java/sh/sar/basedbank/util/AccountInputParser.kt new file mode 100644 index 0000000..ba3201f --- /dev/null +++ b/app/src/main/java/sh/sar/basedbank/util/AccountInputParser.kt @@ -0,0 +1,25 @@ +package sh.sar.basedbank.util + +object AccountInputParser { + + enum class InputType { + MIB_ACCOUNT, // 17 digits starting with 9 + BML_ACCOUNT, // 13 digits starting with 7 + PHONE, // 7 digits starting with 7 or 9 + NATIONAL_ID, // A followed by 6 digits + EMAIL, + UNKNOWN + } + + fun detect(input: String): InputType { + val s = input.trim() + return when { + s.matches(Regex("^9\\d{16}$")) -> InputType.MIB_ACCOUNT + s.matches(Regex("^7\\d{12}$")) -> InputType.BML_ACCOUNT + s.matches(Regex("^[79]\\d{6}$")) -> InputType.PHONE + s.matches(Regex("^[Aa]\\d{6}$")) -> InputType.NATIONAL_ID + s.contains("@") -> InputType.EMAIL + else -> InputType.UNKNOWN + } + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 01cdce6..460fecf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -148,6 +148,7 @@ Scan QR Pick image Invalid or unsupported QR code + Select a source account first Enter an account number first Account not found Session unavailable — please re-login