optimize USD contacts

This commit is contained in:
2026-05-14 02:42:11 +05:00
parent 25bbbe926f
commit 94d74db4dc
3 changed files with 71 additions and 5 deletions

View File

@@ -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__"

View File

@@ -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)

View File

@@ -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