From bfbb649b33191692cfdc6a02b54260c7f425fbab Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Thu, 28 May 2026 22:02:09 +0500 Subject: [PATCH] manage card mode added --- .../sh/sar/basedbank/ui/home/HomeActivity.kt | 4 +- .../basedbank/ui/home/PayWithCardFragment.kt | 51 +++++++++++ app/src/main/res/drawable/ic_manage_card.xml | 25 ++++++ app/src/main/res/layout/fragment_cards.xml | 86 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 5 files changed, 148 insertions(+), 19 deletions(-) create mode 100644 app/src/main/res/drawable/ic_manage_card.xml 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 c76c14b..b80a6f7 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 @@ -255,6 +255,9 @@ class HomeActivity : AppCompatActivity() { binding.drawerLayout.closeDrawers() return } + // Let CardsFragment handle back if in manage mode + val currentFrag = supportFragmentManager.findFragmentById(R.id.contentFrame) + if (currentFrag is CardsFragment && currentFrag.onBackPressed()) return // Pop fragment back stack if there's anything on it (e.g. showWithBackStack) if (supportFragmentManager.backStackEntryCount > 0) { supportFragmentManager.popBackStack() @@ -263,7 +266,6 @@ class HomeActivity : AppCompatActivity() { // In bottom nav mode, pressing back navigates up the hierarchy val isBottomNav = getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("bottom_nav", false) if (isBottomNav && binding.bottomNavigation.selectedItemId != R.id.nav_dashboard) { - val currentFrag = supportFragmentManager.findFragmentById(R.id.contentFrame) // Sub-page reached via More (e.g. Settings, Activities) — go back to More if (binding.bottomNavigation.selectedItemId == R.id.nav_more && currentFrag !is MoreFragment) { show(MoreFragment()) diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/PayWithCardFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/PayWithCardFragment.kt index ae1b2be..78af00e 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/PayWithCardFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/PayWithCardFragment.kt @@ -39,6 +39,7 @@ class CardsFragment : Fragment() { private var currentCardPosition: Int = 0 private var cardWidth: Int = 0 private var pendingQrAccountNumber: String? = null + private var isManageMode: Boolean = false private val qrLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult @@ -128,6 +129,10 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets -> } (activity as? HomeActivity)?.triggerRefreshCards() + binding.btnManageCard.setOnClickListener { + setManageMode(!isManageMode) + } + binding.btnScanToPay.setOnClickListener { val item = cards.getOrNull(currentCardPosition) ?: return@setOnClickListener if (item is CardItem.Mib) { @@ -154,6 +159,43 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets -> binding.btnBlock.setOnClickListener(wip) } + private fun setManageMode(enabled: Boolean) { + isManageMode = enabled + val gone = View.GONE + val visible = View.VISIBLE + binding.btnManageCard.visibility = if (enabled) gone else visible + binding.topSpacer.visibility = if (enabled) gone else visible + binding.rvCards.visibility = if (enabled) gone else visible + binding.pageIndicator.visibility = if (enabled) gone else visible + binding.llPayButtons.visibility = if (enabled) gone else visible + binding.llManageButtons.visibility = if (enabled) visible else gone + binding.manageCardView.root.visibility = if (enabled) visible else gone + if (!enabled) buildDots(cards.size, currentCardPosition) + if (enabled) { + val item = cards.getOrNull(currentCardPosition) ?: return + val cv = binding.manageCardView + when (item) { + is CardItem.Mib -> { + cv.tvCardOwner.text = item.card.cardHolderName + cv.tvCardNumber.text = formatMasked(item.card.maskedCardNumber) + val assetPath = cardImageAsset(item.card) + if (assetPath != null) loadCardImage(cv.ivCardImage, assetPath) + else cv.ivCardImage.setImageDrawable(null) + bindCardStatus(cv.tvCardStatus, mibCardStatusLabel(item.card.cardStatus)) + cv.root.alpha = 1f + } + is CardItem.Bml -> { + cv.tvCardOwner.text = item.account.accountBriefName + cv.tvCardNumber.text = formatMasked(item.account.accountNumber) + loadCardImage(cv.ivCardImage, BmlCardParser.cardImageAsset(item.account)) + val isActive = item.account.statusDesc.equals("Active", ignoreCase = true) + bindCardStatus(cv.tvCardStatus, item.account.statusDesc.takeUnless { isActive }) + cv.root.alpha = if (isActive) 1f else 0.45f + } + } + } + } + private fun applyCardScales() { val rv = binding.rvCards val rvCenter = rv.paddingStart + (rv.width - rv.paddingStart - rv.paddingEnd) / 2f @@ -173,6 +215,7 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets -> } private fun buildDots(count: Int, selected: Int) { + if (isManageMode) return binding.pageIndicator.removeAllViews() if (count <= 1) { binding.pageIndicator.visibility = View.GONE @@ -207,6 +250,14 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets -> } } + fun onBackPressed(): Boolean { + if (isManageMode) { + setManageMode(false) + return true + } + return false + } + override fun onResume() { super.onResume() requireActivity().title = getString(R.string.nav_pay_with_card) diff --git a/app/src/main/res/drawable/ic_manage_card.xml b/app/src/main/res/drawable/ic_manage_card.xml new file mode 100644 index 0000000..97c53d5 --- /dev/null +++ b/app/src/main/res/drawable/ic_manage_card.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_cards.xml b/app/src/main/res/layout/fragment_cards.xml index 2d50baa..d04ef0f 100644 --- a/app/src/main/res/layout/fragment_cards.xml +++ b/app/src/main/res/layout/fragment_cards.xml @@ -14,12 +14,47 @@ android:orientation="vertical" android:visibility="gone"> - + + + + + + + + + + + - + + android:paddingBottom="12dp"> - + + android:paddingTop="8dp" + android:paddingBottom="12dp" + android:visibility="gone"> + app:iconSize="22dp" + app:iconGravity="top" + app:iconPadding="6dp" /> + app:iconSize="22dp" + app:iconGravity="top" + app:iconPadding="6dp" /> + app:iconSize="22dp" + app:iconGravity="top" + app:iconPadding="6dp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b7f8007..5219baa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -330,6 +330,7 @@ Scan to Pay Tap to Pay Skill issue on MIB side, Not supported + Manage Card Change PIN Freeze Block