From 804712d22d13389a7087cc40697d350536ed9f8c Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Fri, 22 May 2026 04:28:51 +0500 Subject: [PATCH] cards on dashboard now --- .../basedbank/ui/home/DashboardFragment.kt | 72 ++++++++++++ .../basedbank/ui/home/PayWithCardFragment.kt | 11 +- .../main/res/layout/fragment_dashboard.xml | 46 +++----- .../main/res/layout/item_card_dashboard.xml | 109 ++++++++++++++++++ 4 files changed, 208 insertions(+), 30 deletions(-) create mode 100644 app/src/main/res/layout/item_card_dashboard.xml 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 3edea2d..1988b57 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 @@ -5,15 +5,23 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSnapHelper +import androidx.recyclerview.widget.RecyclerView import sh.sar.basedbank.R import sh.sar.basedbank.api.bml.BmlForeignLimit import sh.sar.basedbank.api.models.BankAccount +import sh.sar.basedbank.api.mib.MibCard import sh.sar.basedbank.api.mib.MibFinanceDeal +import sh.sar.basedbank.util.CardsCache import kotlin.math.abs import sh.sar.basedbank.databinding.FragmentDashboardBinding import sh.sar.basedbank.databinding.ItemForeignLimitBinding @@ -45,6 +53,23 @@ class DashboardFragment : Fragment() { binding.swipeRefresh.isRefreshing = false } + val cardAdapter = DashboardCardAdapter() + binding.rvCards.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + binding.rvCards.adapter = cardAdapter + LinearSnapHelper().attachToRecyclerView(binding.rvCards) + + val cached = CardsCache.load(requireContext()) + if (cached.isNotEmpty()) { + cardAdapter.update(cached) + binding.sectionCards.visibility = View.VISIBLE + } + + viewModel.mibCards.observe(viewLifecycleOwner) { cards -> + if (cards.isNullOrEmpty()) return@observe + cardAdapter.update(cards) + binding.sectionCards.visibility = View.VISIBLE + } + val bottomPaddingBase = (16 * resources.displayMetrics.density).toInt() ViewCompat.setOnApplyWindowInsetsListener(binding.buttonBar) { v, insets -> val isBottomNav = requireContext().getSharedPreferences("prefs", android.content.Context.MODE_PRIVATE).getBoolean("bottom_nav", false) @@ -209,4 +234,51 @@ class DashboardFragment : Fragment() { super.onDestroyView() _binding = null } + + private inner class DashboardCardAdapter : RecyclerView.Adapter() { + private var cards: List = emptyList() + + fun update(newCards: List) { + cards = newCards + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_card_dashboard, parent, false) + return VH(view) + } + + override fun onBindViewHolder(holder: VH, position: Int) = holder.bind(cards[position]) + override fun getItemCount() = cards.size + + inner class VH(view: View) : RecyclerView.ViewHolder(view) { + private val ivCardImage: ImageView = view.findViewById(R.id.ivCardImage) + private val tvCardOwner: TextView = view.findViewById(R.id.tvCardOwner) + private val tvCardNumber: TextView = view.findViewById(R.id.tvCardNumber) + private val btnPayQr: View = view.findViewById(R.id.btnPayQr) + private val btnPayNfc: View = view.findViewById(R.id.btnPayNfc) + + fun bind(card: MibCard) { + tvCardOwner.text = card.cardHolderName + tvCardNumber.text = PayWithCardFragment.formatMasked(card.maskedCardNumber) + val assetPath = PayWithCardFragment.cardImageAsset(card) + if (assetPath != null) PayWithCardFragment.loadCardImage(ivCardImage, assetPath) + else ivCardImage.setImageDrawable(null) + btnPayQr.setOnClickListener { + Toast.makeText(requireContext(), R.string.work_in_progress, Toast.LENGTH_SHORT).show() + } + val nfcAdapter = android.nfc.NfcAdapter.getDefaultAdapter(requireContext()) + val nfcSupported = nfcAdapter != null + btnPayNfc.isEnabled = nfcSupported + if (nfcSupported) { + btnPayNfc.setOnClickListener { + Toast.makeText(requireContext(), R.string.work_in_progress, Toast.LENGTH_SHORT).show() + } + } else { + btnPayNfc.setOnClickListener(null) + } + } + } + } } 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 d4a14a7..4fd229c 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 @@ -111,8 +111,15 @@ class PayWithCardFragment : Fragment() { btnPayQr.setOnClickListener { Toast.makeText(context, R.string.work_in_progress, Toast.LENGTH_SHORT).show() } - btnPayNfc.setOnClickListener { - Toast.makeText(context, R.string.work_in_progress, Toast.LENGTH_SHORT).show() + val nfcAdapter = android.nfc.NfcAdapter.getDefaultAdapter(context) + val nfcSupported = nfcAdapter != null + btnPayNfc.isEnabled = nfcSupported + if (nfcSupported) { + btnPayNfc.setOnClickListener { + Toast.makeText(context, R.string.work_in_progress, Toast.LENGTH_SHORT).show() + } + } else { + btnPayNfc.setOnClickListener(null) } } } diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index b2c3167..7b0b184 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -216,41 +216,31 @@ android:layout_height="wrap_content" android:orientation="vertical" /> - - + + android:visibility="gone"> - + + + android:clipToPadding="false" + android:paddingEnd="4dp"/> - - - - - - - + diff --git a/app/src/main/res/layout/item_card_dashboard.xml b/app/src/main/res/layout/item_card_dashboard.xml new file mode 100644 index 0000000..c194e27 --- /dev/null +++ b/app/src/main/res/layout/item_card_dashboard.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +