From ce7ebf95c88a8e67e7fd533f107274b0a4b77d31 Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Thu, 28 May 2026 16:21:21 +0500 Subject: [PATCH] Revert "Merge PR #5: fix/accounts-list-balance-consistency" This reverts commit ffe3295942512d5680ef0f188c875cead477bf58, reversing changes made to a32841a3194ac69f6e5054e0f5b1aa5f54099d33. --- app/build.gradle.kts | 4 - .../sh/sar/basedbank/api/mib/MibLoginFlow.kt | 12 +-- .../sar/basedbank/ui/home/AccountsAdapter.kt | 8 -- .../basedbank/ui/home/DashboardFragment.kt | 70 +------------ .../sar/basedbank/util/AccountListDisplay.kt | 1 - .../util/bmlapi/BmlDashboardParser.kt | 14 ++- .../basedbank/util/mibapi/MibAccountParser.kt | 16 ++- .../basedbank/util/mibapi/MibHistoryParser.kt | 21 ++-- .../main/res/layout/fragment_dashboard.xml | 97 ------------------- app/src/main/res/layout/item_account.xml | 9 -- app/src/main/res/values/strings.xml | 3 - 11 files changed, 26 insertions(+), 229 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1666dff..015c8f4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -27,10 +27,6 @@ android { } buildTypes { - debug { - applicationIdSuffix = ".debug" - versionNameSuffix = "-debug" - } release { signingConfig = signingConfigs.getByName("release") isMinifyEnabled = false diff --git a/app/src/main/java/sh/sar/basedbank/api/mib/MibLoginFlow.kt b/app/src/main/java/sh/sar/basedbank/api/mib/MibLoginFlow.kt index 4979253..5a14071 100644 --- a/app/src/main/java/sh/sar/basedbank/api/mib/MibLoginFlow.kt +++ b/app/src/main/java/sh/sar/basedbank/api/mib/MibLoginFlow.kt @@ -9,7 +9,6 @@ import org.json.JSONObject import java.security.MessageDigest import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean -import kotlin.math.abs import kotlin.random.Random class SessionExpiredException : Exception("MIB session expired") @@ -169,7 +168,7 @@ class MibLoginFlow(private val credentialStore: CredentialStore) { accountTypeName = a.optString("accountTypeName"), availableBalance = a.optString("availableBalance"), currentBalance = a.optString("currentBalance"), - blockedAmount = absBlockedAmount(a.optString("blockedAmount")), + blockedAmount = a.optString("blockedAmount"), mvrBalance = a.optString("mvrBalance"), statusDesc = a.optString("statusDesc"), profileImageHash = profile.customerImage, @@ -189,13 +188,6 @@ class MibLoginFlow(private val credentialStore: CredentialStore) { // ─── Helpers ───────────────────────────────────────────────────────────── - /** MIB returns blockedAmount as a signed decimal where negative = funds held. - * Normalize to a positive magnitude so downstream code can treat it uniformly. */ - private fun absBlockedAmount(raw: String): String { - val v = raw.toDoubleOrNull() ?: return raw - return "%.2f".format(abs(v)) - } - private fun initialKeyExchange( appId: String, encKey: String, sfunc: String, key2: String? = null ): Pair { @@ -333,7 +325,7 @@ class MibLoginFlow(private val credentialStore: CredentialStore) { accountTypeName = a.optString("accountTypeName"), availableBalance = a.optString("availableBalance"), currentBalance = a.optString("currentBalance"), - blockedAmount = absBlockedAmount(a.optString("blockedAmount")), + blockedAmount = a.optString("blockedAmount"), mvrBalance = a.optString("mvrBalance"), statusDesc = a.optString("statusDesc"), profileImageHash = profile.customerImage, diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt index c9df329..3919621 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt @@ -125,14 +125,6 @@ class AccountsAdapter( binding.tvAccountNumber.text = display.number binding.tvAccountType.text = display.typeLabel binding.tvBalance.text = if (hideAmounts) maskAmount(display.balance) else display.balance - val blocked = display.blockedBalance - if (blocked != null) { - val shown = if (hideAmounts) maskAmount(blocked) else blocked - binding.tvBlocked.text = binding.root.context.getString(R.string.account_blocked_label, shown) - binding.tvBlocked.visibility = View.VISIBLE - } else { - binding.tvBlocked.visibility = View.GONE - } binding.btnTransfer.setOnClickListener { onTransferClick?.invoke(account) } binding.root.setOnClickListener { onAccountClick(account) } binding.root.setOnLongClickListener { diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/DashboardFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/DashboardFragment.kt index c33bf9f..e3cc631 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/DashboardFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/DashboardFragment.kt @@ -57,24 +57,14 @@ class DashboardFragment : Fragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - viewModel.accounts.observe(viewLifecycleOwner) { - updateBalances(it) - updateAttentionRow() - } - viewModel.financing.observe(viewLifecycleOwner) { - updatePendingFinances() - updateAttentionRow() - } - viewModel.bmlLoanDetails.observe(viewLifecycleOwner) { - updatePendingFinances() - updateAttentionRow() - } + viewModel.accounts.observe(viewLifecycleOwner) { updateBalances(it) } + viewModel.financing.observe(viewLifecycleOwner) { updatePendingFinances() } + viewModel.bmlLoanDetails.observe(viewLifecycleOwner) { updatePendingFinances() } viewModel.bmlLimits.observe(viewLifecycleOwner) { updateForeignLimits(it) } viewModel.hideAmounts.observe(viewLifecycleOwner) { updateBalances(viewModel.accounts.value ?: emptyList()) updatePendingFinances() updateForeignLimits(viewModel.bmlLimits.value ?: emptyList()) - updateAttentionRow() } binding.swipeRefresh.setOnRefreshListener { @@ -86,10 +76,6 @@ class DashboardFragment : Fragment() { (activity as? HomeActivity)?.navigateTo(R.id.nav_finances) } - binding.cardOverdue.setOnClickListener { - (activity as? HomeActivity)?.navigateTo(R.id.nav_finances) - } - val cardAdapter = DashboardCardAdapter() binding.rvCards.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) binding.rvCards.adapter = cardAdapter @@ -258,56 +244,6 @@ class DashboardFragment : Fragment() { } } - private fun updateAttentionRow() { - val hide = viewModel.hideAmounts.value ?: false - val accounts = viewModel.accounts.value ?: emptyList() - - // Blocked: sum across CASA-style accounts (exclude cards and loans) per currency. - val blockedByCurrency = accounts - .filter { it.profileType != "BML_CREDIT" && it.profileType != "BML_PREPAID" && it.profileType != "BML_DEBIT" && it.profileType != "BML_LOAN" } - .mapNotNull { acc -> - val v = acc.blockedAmount.replace(",", "").toDoubleOrNull() ?: 0.0 - if (v > 0.0) acc.currencyName.uppercase() to v else null - } - .groupBy({ it.first }, { it.second }) - .mapValues { (_, vs) -> vs.sum() } - - val blockedTotal = blockedByCurrency.values.sum() - if (blockedTotal > 0.0) { - // Primary line: prefer MVR if present, otherwise the first currency. - val primaryCcy = if ("MVR" in blockedByCurrency) "MVR" else blockedByCurrency.keys.first() - val primaryAmt = blockedByCurrency.getValue(primaryCcy) - binding.tvBlockedTotal.text = if (hide) "$primaryCcy ••••••" else "$primaryCcy %,.2f".format(primaryAmt) - - val secondary = blockedByCurrency.filterKeys { it != primaryCcy } - if (secondary.isNotEmpty()) { - binding.tvBlockedSecondary.text = secondary.entries.joinToString(" · ") { (ccy, amt) -> - if (hide) "$ccy ••••••" else "$ccy %,.2f".format(amt) - } - binding.tvBlockedSecondary.visibility = View.VISIBLE - } else { - binding.tvBlockedSecondary.visibility = View.GONE - } - binding.cardBlocked.visibility = View.VISIBLE - } else { - binding.cardBlocked.visibility = View.GONE - } - - // Overdue: MIB finance deals + BML loan details (assumed MVR — matches existing Pending Finances). - val mibOverdue = (viewModel.financing.value ?: emptyList()).sumOf { it.overdueAmount } - val bmlOverdue = (viewModel.bmlLoanDetails.value ?: emptyMap()).values.sumOf { it.overdueAmount } - val overdueTotal = mibOverdue + bmlOverdue - if (overdueTotal > 0.0) { - binding.tvOverdueTotal.text = if (hide) "MVR ••••••" else "MVR %,.2f".format(overdueTotal) - binding.cardOverdue.visibility = View.VISIBLE - } else { - binding.cardOverdue.visibility = View.GONE - } - - binding.rowAttention.visibility = - if (blockedTotal > 0.0 || overdueTotal > 0.0) View.VISIBLE else View.GONE - } - private fun updatePendingFinances() { val hide = viewModel.hideAmounts.value ?: false val mibTotal = (viewModel.financing.value ?: emptyList()).sumOf { it.outstandingAmount } diff --git a/app/src/main/java/sh/sar/basedbank/util/AccountListDisplay.kt b/app/src/main/java/sh/sar/basedbank/util/AccountListDisplay.kt index 060a814..647d04b 100644 --- a/app/src/main/java/sh/sar/basedbank/util/AccountListDisplay.kt +++ b/app/src/main/java/sh/sar/basedbank/util/AccountListDisplay.kt @@ -5,7 +5,6 @@ data class AccountListDisplay( val number: String, val typeLabel: String, val balance: String, - val blockedBalance: String? = null, // null when zero or not applicable val isCard: Boolean = false, val cardBrandIcon: Int = 0, // drawable res, only meaningful if isCard val statusLabel: String? = null // null = active; shown as status pill if set diff --git a/app/src/main/java/sh/sar/basedbank/util/bmlapi/BmlDashboardParser.kt b/app/src/main/java/sh/sar/basedbank/util/bmlapi/BmlDashboardParser.kt index 47c2f31..a6e747b 100644 --- a/app/src/main/java/sh/sar/basedbank/util/bmlapi/BmlDashboardParser.kt +++ b/app/src/main/java/sh/sar/basedbank/util/bmlapi/BmlDashboardParser.kt @@ -26,13 +26,11 @@ object BmlDashboardParser { statusLabel = if (isActive) null else account.statusDesc ) } else { - val blocked = account.blockedAmount.toDoubleOrNull() ?: 0.0 AccountListDisplay( - name = account.accountBriefName, - number = account.accountNumber, - typeLabel = productLabel(account.accountTypeName), - balance = listBalance(account), - blockedBalance = if (blocked > 0.0) "${account.currencyName} ${account.blockedAmount}" else null + name = account.accountBriefName, + number = account.accountNumber, + typeLabel = productLabel(account.accountTypeName), + balance = listBalance(account) ) } } @@ -54,9 +52,9 @@ object BmlDashboardParser { } } - /** Balance shown in the accounts list — available balance, consistent with transfer/contact picker. */ + /** Balance shown in the accounts list — ledger (working) balance for BML CASA. */ fun listBalance(account: BankAccount): String = - "${account.currencyName} ${account.availableBalance}" + "${account.currencyName} ${account.currentBalance}" fun cardBrandIcon(productName: String): Int = when { productName.contains("AMEX", ignoreCase = true) || diff --git a/app/src/main/java/sh/sar/basedbank/util/mibapi/MibAccountParser.kt b/app/src/main/java/sh/sar/basedbank/util/mibapi/MibAccountParser.kt index d3d7a48..717bcf5 100644 --- a/app/src/main/java/sh/sar/basedbank/util/mibapi/MibAccountParser.kt +++ b/app/src/main/java/sh/sar/basedbank/util/mibapi/MibAccountParser.kt @@ -5,16 +5,12 @@ import sh.sar.basedbank.util.AccountListDisplay object MibAccountParser { - fun displayData(account: BankAccount): AccountListDisplay { - val blocked = account.blockedAmount.toDoubleOrNull() ?: 0.0 - return AccountListDisplay( - name = account.accountBriefName, - number = account.accountNumber, - typeLabel = productLabel(account.accountTypeName), - balance = "${account.currencyName} ${account.availableBalance}", - blockedBalance = if (blocked > 0.0) "${account.currencyName} ${account.blockedAmount}" else null - ) - } + fun displayData(account: BankAccount) = AccountListDisplay( + name = account.accountBriefName, + number = account.accountNumber, + typeLabel = productLabel(account.accountTypeName), + balance = "${account.currencyName} ${account.availableBalance}" + ) /** * Returns a display-ready product label for a MIB (Faisanet) account type name. diff --git a/app/src/main/java/sh/sar/basedbank/util/mibapi/MibHistoryParser.kt b/app/src/main/java/sh/sar/basedbank/util/mibapi/MibHistoryParser.kt index b1b60d0..b7197c5 100644 --- a/app/src/main/java/sh/sar/basedbank/util/mibapi/MibHistoryParser.kt +++ b/app/src/main/java/sh/sar/basedbank/util/mibapi/MibHistoryParser.kt @@ -5,16 +5,13 @@ import sh.sar.basedbank.util.AccountHistoryDisplay object MibHistoryParser { - fun displayData(account: BankAccount): AccountHistoryDisplay { - val blocked = account.blockedAmount.toDoubleOrNull() ?: 0.0 - return AccountHistoryDisplay( - name = account.accountBriefName, - number = account.accountNumber, - bankPill = null, // MIB has no bank pill - typeLabel = MibAccountParser.productLabel(account.accountTypeName), - availableBalance = "${account.currencyName} ${account.availableBalance}", - workingBalance = "${account.currencyName} ${account.currentBalance}", - blockedBalance = if (blocked > 0.0) "${account.currencyName} ${account.blockedAmount}" else null - ) - } + fun displayData(account: BankAccount) = AccountHistoryDisplay( + name = account.accountBriefName, + number = account.accountNumber, + bankPill = null, // MIB has no bank pill + typeLabel = MibAccountParser.productLabel(account.accountTypeName), + availableBalance = "${account.currencyName} ${account.availableBalance}", + workingBalance = "${account.currencyName} ${account.currentBalance}", + blockedBalance = null + ) } diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index f825edf..d25b79b 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -176,103 +176,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Accounts Cards Available Balance - %1$s blocked - Blocked Funds - Overdue Financing Quick Transfer