add support for fahipay contacts

This commit is contained in:
2026-05-16 22:26:16 +05:00
parent fd531066cd
commit 93405aade2
7 changed files with 177 additions and 19 deletions
@@ -137,6 +137,8 @@ class ContactPickerSheetFragment : BottomSheetDialogFragment() {
viewModel.contacts.observe(viewLifecycleOwner) { pagerAdapter.rebuildAll() }
viewModel.accounts.observe(viewLifecycleOwner) { pagerAdapter.rebuildAll() }
(activity as? HomeActivity)?.loadAllContacts()
}
private fun attachMediator(pages: List<TabDef>) {
@@ -100,9 +100,14 @@ class ContactsAdapter(
RecyclerView.ViewHolder(binding.root) {
fun bind(contact: MibBeneficiary, photo: Bitmap?) {
val isFahipay = contact.benefType == "FAHIPAY"
binding.tvContactName.text = contact.benefNickName
binding.tvContactAccount.text = contact.benefAccount
binding.tvRealName.text = "${contact.benefName} · ${contact.transferCyDesc} · ${contact.benefBankName}"
binding.tvRealName.text = if (isFahipay) "" else "${contact.benefName} · ${contact.transferCyDesc} · ${contact.benefBankName}"
binding.tvRealName.visibility = if (isFahipay) android.view.View.GONE else android.view.View.VISIBLE
binding.btnTransferContact.visibility = if (isFahipay) android.view.View.GONE else android.view.View.VISIBLE
binding.btnEditContact.visibility = if (isFahipay) android.view.View.GONE else android.view.View.VISIBLE
binding.btnDeleteContact.visibility = if (isFahipay) android.view.View.GONE else android.view.View.VISIBLE
if (photo != null) {
binding.ivContactPhoto.setImageBitmap(photo)
@@ -115,6 +115,8 @@ class ContactsFragment : Fragment() {
AddContactSheetFragment().show(childFragmentManager, "add_contact")
}
(activity as? HomeActivity)?.loadAllContacts()
viewModel.contactCategories.observe(viewLifecycleOwner) { cats ->
rebuildPager(cats)
}
@@ -117,19 +117,11 @@ class HomeActivity : AppCompatActivity() {
val cachedFinancing = FinancingCache.load(this)
if (cachedFinancing.isNotEmpty()) viewModel.financing.value = cachedFinancing
val cachedContacts = mergeContacts(ContactsCache.loadContacts(this), ContactsCache.loadBml(this))
if (cachedContacts.isNotEmpty()) viewModel.contacts.value = cachedContacts
val cachedCats = ContactsCache.loadCategories(this)
if (cachedCats.isNotEmpty()) viewModel.contactCategories.value = cachedCats
val cachedLimits = ForeignLimitsCache.load(this)
if (cachedLimits.isNotEmpty()) viewModel.bmlLimits.value = cachedLimits
refreshFinancing(app.mibSession, app.mibProfiles)
refreshContacts(app.mibSession, app.mibProfiles)
if (app.bmlSession != null) {
refreshBmlContacts(app)
refreshBmlLimits(app.bmlSession!!)
}
if (app.bmlSession != null) refreshBmlLimits(app.bmlSession!!)
} else {
// Came from lock screen — show caches immediately, refresh everything in background
val cachedMib = AccountCache.load(this)
@@ -139,10 +131,6 @@ class HomeActivity : AppCompatActivity() {
if (merged.isNotEmpty()) viewModel.accounts.value = merged
val cachedFinancing = FinancingCache.load(this)
if (cachedFinancing.isNotEmpty()) viewModel.financing.value = cachedFinancing
val cachedContacts = mergeContacts(ContactsCache.loadContacts(this), ContactsCache.loadBml(this))
if (cachedContacts.isNotEmpty()) viewModel.contacts.value = cachedContacts
val cachedCats = ContactsCache.loadCategories(this)
if (cachedCats.isNotEmpty()) viewModel.contactCategories.value = cachedCats
val cachedLimits = ForeignLimitsCache.load(this)
if (cachedLimits.isNotEmpty()) viewModel.bmlLimits.value = cachedLimits
@@ -432,12 +420,8 @@ class HomeActivity : AppCompatActivity() {
binding.refreshIndicator.visibility = View.GONE
val app = application as BasedBankApp
if (bmlSession != null) {
refreshBmlContacts(app)
refreshBmlLimits(bmlSession)
}
if (bmlSession != null) refreshBmlLimits(bmlSession)
refreshFinancing(app.mibSession, app.mibProfiles)
refreshContacts(app.mibSession, app.mibProfiles)
}
}
@@ -473,6 +457,48 @@ class HomeActivity : AppCompatActivity() {
}
}
fun loadAllContacts() {
val app = application as BasedBankApp
// Populate ViewModel from cache immediately if empty
if (viewModel.contacts.value.isNullOrEmpty()) {
val cached = mergeContacts(
mergeContacts(ContactsCache.loadContacts(this), ContactsCache.loadBml(this)),
ContactsCache.loadFahipay(this)
)
if (cached.isNotEmpty()) viewModel.contacts.value = cached
}
if (viewModel.contactCategories.value.isNullOrEmpty()) {
val cats = ContactsCache.loadCategories(this) + ContactsCache.loadFahipayCategories(this)
if (cats.isNotEmpty()) viewModel.contactCategories.value = cats
}
// Refresh all banks in background
refreshContacts(app.mibSession, app.mibProfiles)
refreshBmlContacts(app)
if (app.fahipaySession != null) refreshFahipayContacts(app.fahipaySession!!)
}
private fun refreshFahipayContacts(session: FahipaySession) {
lifecycleScope.launch {
try {
val groups = withContext(Dispatchers.IO) {
val flow = FahipayLoginFlow()
flow.setSessionCookie(session.sessionCookie)
flow.fetchContacts(session)
}
if (groups.isEmpty()) return@launch
val contacts = groups.flatMap { it.contacts }
val categories = groups.map { MibBeneficiaryCategory(it.categoryId, it.label, it.contacts.size) }
ContactsCache.saveFahipay(this@HomeActivity, contacts, categories)
val existing = viewModel.contacts.value ?: emptyList()
val nonFahipay = existing.filter { it.benefType != "FAHIPAY" }
viewModel.contacts.postValue(mergeContacts(nonFahipay, contacts))
val existingCats = viewModel.contactCategories.value ?: emptyList()
val nonFahipayCats = existingCats.filter { !it.id.startsWith("FAHIPAY_") }
viewModel.contactCategories.postValue(nonFahipayCats + categories)
} catch (_: Exception) {}
}
}
private fun mergeContacts(
mib: List<MibBeneficiary>,
bml: List<MibBeneficiary>