diff --git a/app/src/main/assets/cards/mib/cards-platinum-bg-w-logo-1.jpg b/app/src/main/assets/cards/mib/visa_black_platinum.jpg similarity index 100% rename from app/src/main/assets/cards/mib/cards-platinum-bg-w-logo-1.jpg rename to app/src/main/assets/cards/mib/visa_black_platinum.jpg diff --git a/app/src/main/assets/cards/mib/cards-blue-bg-w-logo-1.jpg b/app/src/main/assets/cards/mib/visa_blue_everyday.jpg similarity index 100% rename from app/src/main/assets/cards/mib/cards-blue-bg-w-logo-1.jpg rename to app/src/main/assets/cards/mib/visa_blue_everyday.jpg diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/CardSettingsFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/CardSettingsFragment.kt index 64969bf..51d2fe3 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/CardSettingsFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/CardSettingsFragment.kt @@ -101,7 +101,9 @@ class CardSettingsFragment : Fragment() { tvCardOwner.text = card.cardHolderName tvCardNumber.text = PayWithCardFragment.formatMasked(card.maskedCardNumber) tvCardType.text = card.cardTypeDesc - PayWithCardFragment.loadCardImage(ivCardImage, PayWithCardFragment.cardImageAsset(card)) + val assetPath = PayWithCardFragment.cardImageAsset(card) + if (assetPath != null) PayWithCardFragment.loadCardImage(ivCardImage, assetPath) + else ivCardImage.setImageDrawable(null) val wip = View.OnClickListener { Toast.makeText(context, R.string.work_in_progress, Toast.LENGTH_SHORT).show() } 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 24d0c92..78fe42a 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 @@ -64,6 +64,7 @@ import sh.sar.basedbank.api.mib.MibFinanceDeal import sh.sar.basedbank.util.AccountCache import sh.sar.basedbank.util.ContactsCache import sh.sar.basedbank.util.CredentialStore +import sh.sar.basedbank.util.CardsCache import sh.sar.basedbank.util.FinancingCache import sh.sar.basedbank.util.ForeignLimitsCache @@ -1011,6 +1012,7 @@ fun applyNavLabelVisibility() { existing.removeAll { it.loginTag == "mib_$loginId" } existing += cards viewModel.mibCards.postValue(existing) + CardsCache.save(this@HomeActivity, existing) } } catch (_: Exception) { } } 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 5d845ce..d4a14a7 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 @@ -18,6 +18,7 @@ import androidx.recyclerview.widget.RecyclerView import sh.sar.basedbank.R import sh.sar.basedbank.api.mib.MibCard import sh.sar.basedbank.databinding.FragmentPayWithCardBinding +import sh.sar.basedbank.util.CardsCache class PayWithCardFragment : Fragment() { @@ -57,10 +58,13 @@ class PayWithCardFragment : Fragment() { binding.recyclerView.visibility = if (cards.isEmpty()) View.GONE else View.VISIBLE } - if (viewModel.mibCards.value == null) { + val cached = CardsCache.load(requireContext()) + if (cached.isNotEmpty()) { + viewModel.mibCards.value = cached + } else { binding.loadingView.visibility = View.VISIBLE - (activity as? HomeActivity)?.triggerRefreshCards() } + (activity as? HomeActivity)?.triggerRefreshCards() } override fun onResume() { @@ -101,7 +105,9 @@ class PayWithCardFragment : Fragment() { tvCardOwner.text = card.cardHolderName tvCardNumber.text = formatMasked(card.maskedCardNumber) tvCardType.text = card.cardTypeDesc - loadCardImage(ivCardImage, cardImageAsset(card)) + val assetPath = cardImageAsset(card) + if (assetPath != null) loadCardImage(ivCardImage, assetPath) + else ivCardImage.setImageDrawable(null) btnPayQr.setOnClickListener { Toast.makeText(context, R.string.work_in_progress, Toast.LENGTH_SHORT).show() } @@ -113,13 +119,11 @@ class PayWithCardFragment : Fragment() { } companion object { - fun cardImageAsset(card: MibCard): String { - val desc = card.cardTypeDesc.lowercase() - return when { - "corporate" in desc || "business" in desc -> "cards/mib/visa_business.jpg" - "platinum" in desc -> "cards/mib/cards-platinum-bg-w-logo-1.jpg" - else -> "cards/mib/cards-blue-bg-w-logo-1.jpg" - } + fun cardImageAsset(card: MibCard): String? = when (card.cardType) { + "53" -> "cards/mib/visa_black_platinum.jpg" + "57" -> "cards/mib/visa_blue_everyday.jpg" + "70" -> "cards/mib/visa_business.jpg" + else -> null } fun loadCardImage(imageView: ImageView, assetPath: String) { @@ -129,7 +133,7 @@ class PayWithCardFragment : Fragment() { } imageView.setImageBitmap(bitmap) } catch (_: Exception) { - imageView.setImageResource(android.R.color.darker_gray) + imageView.setImageDrawable(null) } } diff --git a/app/src/main/java/sh/sar/basedbank/util/CardsCache.kt b/app/src/main/java/sh/sar/basedbank/util/CardsCache.kt new file mode 100644 index 0000000..76b9d38 --- /dev/null +++ b/app/src/main/java/sh/sar/basedbank/util/CardsCache.kt @@ -0,0 +1,57 @@ +package sh.sar.basedbank.util + +import android.content.Context +import org.json.JSONArray +import org.json.JSONObject +import sh.sar.basedbank.api.mib.MibCard + +object CardsCache { + + private const val PREFS = "cards_cache" + private const val KEY_MIB_CARDS = "mib_cards" + + fun save(context: Context, cards: List) { + val arr = JSONArray() + for (c in cards) { + arr.put(JSONObject().apply { + put("cardId", c.cardId) + put("maskedCardNumber", c.maskedCardNumber) + put("cardStatus", c.cardStatus) + put("cardType", c.cardType) + put("cardTypeDesc", c.cardTypeDesc) + put("customerId", c.customerId) + put("phoneNumber", c.phoneNumber) + put("cardHolderName", c.cardHolderName) + put("loginTag", c.loginTag) + }) + } + context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + .edit().putString(KEY_MIB_CARDS, CacheEncryption.encrypt(arr.toString())).apply() + } + + fun load(context: Context): List { + val raw = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + .getString(KEY_MIB_CARDS, null) ?: return emptyList() + return try { + val arr = JSONArray(CacheEncryption.decrypt(raw)) + (0 until arr.length()).map { i -> + val o = arr.getJSONObject(i) + MibCard( + cardId = o.optString("cardId"), + maskedCardNumber = o.optString("maskedCardNumber"), + cardStatus = o.optString("cardStatus"), + cardType = o.optString("cardType"), + cardTypeDesc = o.optString("cardTypeDesc"), + customerId = o.optString("customerId"), + phoneNumber = o.optString("phoneNumber"), + cardHolderName = o.optString("cardHolderName"), + loginTag = o.optString("loginTag") + ) + } + } catch (_: Exception) { emptyList() } + } + + fun clear(context: Context) { + context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit().clear().apply() + } +}