From 94d74db4dc0eb032a6a589865f54815f3d57cb2a Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Thu, 14 May 2026 02:42:11 +0500 Subject: [PATCH] optimize USD contacts --- .../ui/home/ContactPickerSheetFragment.kt | 18 +++++-- .../sh/sar/basedbank/ui/home/HomeActivity.kt | 4 ++ .../sar/basedbank/ui/home/TransferFragment.kt | 54 ++++++++++++++++++- 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/ContactPickerSheetFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/ContactPickerSheetFragment.kt index 74e09d4..f3bd19d 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/ContactPickerSheetFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/ContactPickerSheetFragment.kt @@ -48,10 +48,16 @@ class ContactPickerSheetFragment : BottomSheetDialogFragment() { adapter = ContactPickerAdapter( onItemClick = { accountNumber, label -> - setFragmentResult(REQUEST_KEY, bundleOf( - KEY_ACCOUNT_NUMBER to accountNumber, - KEY_LABEL to label - )) + val contacts = viewModel.contacts.value ?: emptyList() + val contact = contacts.firstOrNull { it.benefAccount == accountNumber } + val bundle = bundleOf(KEY_ACCOUNT_NUMBER to accountNumber, KEY_LABEL to label) + if (contact != null && !contact.transferCyDesc.equals("MVR", ignoreCase = true)) { + bundle.putBoolean(KEY_SKIP_LOOKUP, true) + bundle.putString(KEY_SUBTITLE, "${contact.benefBankName} · ${contact.benefAccount}") + bundle.putString(KEY_COLOR, contact.bankColor) + contact.customerImgHash?.let { bundle.putString(KEY_IMAGE_HASH, it) } + } + setFragmentResult(REQUEST_KEY, bundle) dismiss() }, onSameAsFrom = {}, @@ -254,6 +260,10 @@ class ContactPickerSheetFragment : BottomSheetDialogFragment() { const val REQUEST_KEY = "contact_picker" const val KEY_ACCOUNT_NUMBER = "accountNumber" const val KEY_LABEL = "label" + const val KEY_SKIP_LOOKUP = "skipLookup" + const val KEY_SUBTITLE = "subtitle" + const val KEY_COLOR = "color" + const val KEY_IMAGE_HASH = "imageHash" private const val ARG_FROM_ACCOUNT = "fromAccount" private const val RECENTS_TAG = "__recents__" private const val MY_ACCOUNTS_TAG = "__my_accounts__" diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt b/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt index 74999b2..86f273f 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt @@ -83,6 +83,8 @@ class HomeActivity : AppCompatActivity() { if (cachedContacts.isNotEmpty()) viewModel.contacts.value = cachedContacts val cachedCats = ContactsCache.loadCategories(this) if (cachedCats.isNotEmpty()) viewModel.contactCategories.value = cachedCats + val cachedLimits = ForeignLimitsCache.load(this) + if (cachedLimits.isNotEmpty()) viewModel.bmlLimits.value = cachedLimits refreshFinancing(app.mibSession, app.mibProfiles) refreshContacts(app.mibSession, app.mibProfiles) @@ -102,6 +104,8 @@ class HomeActivity : AppCompatActivity() { if (cachedContacts.isNotEmpty()) viewModel.contacts.value = cachedContacts val cachedCats = ContactsCache.loadCategories(this) if (cachedCats.isNotEmpty()) viewModel.contactCategories.value = cachedCats + val cachedLimits = ForeignLimitsCache.load(this) + if (cachedLimits.isNotEmpty()) viewModel.bmlLimits.value = cachedLimits val store = CredentialStore(this) autoRefresh(store.loadMibCredentials(), store.loadBmlCredentials(), store) 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 8cc8f91..0cc37c6 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 @@ -70,7 +70,14 @@ class TransferFragment : Fragment() { childFragmentManager.setFragmentResultListener(ContactPickerSheetFragment.REQUEST_KEY, viewLifecycleOwner) { _, bundle -> val accountNumber = bundle.getString(ContactPickerSheetFragment.KEY_ACCOUNT_NUMBER) ?: return@setFragmentResultListener val label = bundle.getString(ContactPickerSheetFragment.KEY_LABEL) ?: "" - prefillToFromContact(accountNumber, label) + if (bundle.getBoolean(ContactPickerSheetFragment.KEY_SKIP_LOOKUP, false)) { + val subtitle = bundle.getString(ContactPickerSheetFragment.KEY_SUBTITLE) ?: accountNumber + val colorHex = bundle.getString(ContactPickerSheetFragment.KEY_COLOR) ?: "#607D8B" + val imageHash = bundle.getString(ContactPickerSheetFragment.KEY_IMAGE_HASH) + prefillToDirectly(accountNumber, label, subtitle, colorHex, imageHash) + } else { + prefillToFromContact(accountNumber, label) + } } binding.btnPickContact.setOnClickListener { @@ -132,6 +139,21 @@ class TransferFragment : Fragment() { Toast.makeText(requireContext(), R.string.transfer_enter_account_first, Toast.LENGTH_SHORT).show() return } + + // If a known contact with non-MVR currency matches, skip the IPS lookup + val contacts = viewModel.contacts.value ?: emptyList() + val matchedContact = contacts.firstOrNull { it.benefAccount == accountNumber } + if (matchedContact != null && !matchedContact.transferCyDesc.equals("MVR", ignoreCase = true)) { + prefillToDirectly( + accountNumber = matchedContact.benefAccount, + displayName = matchedContact.benefNickName, + subtitle = "${matchedContact.benefBankName} · ${matchedContact.benefAccount}", + colorHex = matchedContact.bankColor, + imageHash = matchedContact.customerImgHash + ) + return + } + val sess = session if (sess == null) { Toast.makeText(requireContext(), R.string.transfer_session_unavailable, Toast.LENGTH_SHORT).show() @@ -186,6 +208,36 @@ class TransferFragment : Fragment() { } } + private fun prefillToDirectly( + accountNumber: String, + displayName: String, + subtitle: String, + colorHex: String, + imageHash: String? + ) { + binding.tvToAccountName.text = displayName + binding.tvToBankBic.text = subtitle + binding.ivToPhoto.setImageBitmap(makeInitialsBitmap(displayName, colorHex)) + binding.tilTo.visibility = View.GONE + binding.btnPickContact.visibility = View.GONE + binding.btnScanQr.visibility = View.GONE + binding.cardToInfo.visibility = View.VISIBLE + + val contacts = viewModel.contacts.value ?: emptyList() + val contact = contacts.firstOrNull { it.benefAccount == accountNumber } + if (contact != null) { + RecentsCache.save(requireContext(), RecentPick( + accountNumber = contact.benefAccount, + displayName = contact.benefNickName, + subtitle = subtitle, + colorHex = colorHex, + imageHash = imageHash, + isProfileImage = false + )) + if (imageHash != null) loadToPhoto(imageHash, isProfile = false) + } + } + private fun prefillToFromContact(accountNumber: String, label: String) { binding.cardToInfo.visibility = View.GONE binding.tilTo.visibility = View.VISIBLE