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