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 c96df39..7d3edca 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 @@ -153,17 +153,19 @@ class ContactPickerSheetFragment : BottomSheetDialogFragment() { val account = accounts.firstOrNull { it.accountNumber == accountNumber } val bundle = bundleOf(KEY_ACCOUNT_NUMBER to accountNumber, KEY_LABEL to label) when { - account?.profileType == "BML_PREPAID" -> { - bundle.putBoolean(KEY_SKIP_LOOKUP, true) + account != null -> { bundle.putString(KEY_SUBTITLE, "${account.accountNumber} · ${account.currencyName} ${account.availableBalance}") bundle.putString(KEY_COLOR, "#FE860E") } - contact != null && !contact.transferCyDesc.equals("MVR", ignoreCase = true) -> { - bundle.putBoolean(KEY_SKIP_LOOKUP, true) + contact != null -> { bundle.putString(KEY_SUBTITLE, "${contact.benefBankName} · ${contact.benefAccount}") bundle.putString(KEY_COLOR, contact.bankColor) contact.customerImgHash?.let { bundle.putString(KEY_IMAGE_HASH, it) } } + else -> { + bundle.putString(KEY_SUBTITLE, accountNumber) + bundle.putString(KEY_COLOR, "#607D8B") + } } setFragmentResult(REQUEST_KEY, bundle) dismiss() @@ -306,7 +308,6 @@ 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" 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 502fe43..c337916 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 @@ -113,15 +113,11 @@ 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) ?: "" - 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) - } + val label = bundle.getString(ContactPickerSheetFragment.KEY_LABEL) ?: "" + 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) } binding.btnPickContact.setOnClickListener { @@ -148,21 +144,64 @@ class TransferFragment : Fragment() { } private fun setupFromDropdown() { + binding.btnClearFromInfo.setOnClickListener { + selectedAccount = null + binding.tilAmount.prefixText = null + binding.cardFromInfo.visibility = View.GONE + binding.tilFrom.visibility = View.VISIBLE + binding.actvFrom.setText("", false) + } + viewModel.accounts.observe(viewLifecycleOwner) { accounts -> val adapter = AccountDropdownAdapter(requireContext(), accounts) binding.actvFrom.setAdapter(adapter) - // No default selection — user must explicitly pick a source account - binding.actvFrom.setOnItemClickListener { _, _, position, _ -> val picked = adapter.getAccount(position) ?: return@setOnItemClickListener selectedAccount = picked - binding.actvFrom.setText(picked.toDisplayString(), false) updateAmountPrefix(picked) + showFromCard(picked) } } } + private fun showFromCard(account: MibAccount) { + val isBml = account.profileType.startsWith("BML") + val colorHex = if (isBml) "#0066A1" else "#FE860E" + val bankLabel = if (isBml) "BML" else "MIB" + val typeLabel = when { + account.profileType == "BML_PREPAID" -> "Prepaid Card" + account.accountTypeName.isNotBlank() -> account.accountTypeName + else -> account.profileType + } + + binding.tvFromAccountName.text = account.accountBriefName + binding.tvFromAccountNumber.text = account.accountNumber + binding.tvFromAccountDetails.text = "$bankLabel · $typeLabel · ${account.currencyName} ${account.availableBalance}" + binding.ivFromPhoto.setImageBitmap(makeInitialsBitmap(account.accountBriefName, colorHex)) + binding.tilFrom.visibility = View.GONE + binding.cardFromInfo.visibility = View.VISIBLE + + if (!isBml && account.profileImageHash != null) { + loadFromPhoto(account.profileImageHash) + } + } + + private fun loadFromPhoto(hash: String) { + val sess = session ?: return + val app = requireActivity().application as BasedBankApp + viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { + try { + val base64 = app.mibLoginFlow.fetchProfileImage(sess, hash) ?: return@launch + val bytes = Base64.decode(base64, Base64.DEFAULT) + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return@launch + withContext(Dispatchers.Main) { + if (_binding != null) binding.ivFromPhoto.setImageBitmap(bitmap) + } + } catch (_: Exception) { } + } + } + private fun updateAmountPrefix(account: MibAccount) { binding.tilAmount.prefixText = if (account.currencyName == "USD") "USD " else "MVR " } @@ -606,6 +645,8 @@ class TransferFragment : Fragment() { private fun clearForm() { selectedAccount = null binding.actvFrom.setText("", false) + binding.cardFromInfo.visibility = View.GONE + binding.tilFrom.visibility = View.VISIBLE binding.tilAmount.prefixText = null binding.etAmount.setText("") binding.etRemarks.setText("") diff --git a/app/src/main/res/layout/fragment_transfer.xml b/app/src/main/res/layout/fragment_transfer.xml index e0f83b3..476c85f 100644 --- a/app/src/main/res/layout/fragment_transfer.xml +++ b/app/src/main/res/layout/fragment_transfer.xml @@ -45,6 +45,79 @@ + + + + + + + + + + + + + + + + + + + + + + +