forked from shihaam/thijooree
add support for default trsnager accounts
This commit is contained in:
@@ -37,7 +37,12 @@ class AccountHistoryAdapter(
|
|||||||
var onImageNeeded: ((counterpartyName: String) -> Unit)? = null
|
var onImageNeeded: ((counterpartyName: String) -> Unit)? = null
|
||||||
var onIconUrlNeeded: ((url: String) -> Unit)? = null
|
var onIconUrlNeeded: ((url: String) -> Unit)? = null
|
||||||
var onTransferClick: ((BankAccount) -> Unit)? = null
|
var onTransferClick: ((BankAccount) -> Unit)? = null
|
||||||
|
var onDefaultToggle: ((Boolean) -> Unit)? = null
|
||||||
private var hideAmounts: Boolean = false
|
private var hideAmounts: Boolean = false
|
||||||
|
var showDefaultToggle: Boolean = false
|
||||||
|
set(value) { if (field == value) return; field = value; notifyItemChanged(0) }
|
||||||
|
var isDefaultAccount: Boolean = false
|
||||||
|
set(value) { if (field == value) return; field = value; notifyItemChanged(0) }
|
||||||
|
|
||||||
fun setHideAmounts(hide: Boolean) {
|
fun setHideAmounts(hide: Boolean) {
|
||||||
if (hideAmounts == hide) return
|
if (hideAmounts == hide) return
|
||||||
@@ -174,6 +179,20 @@ class AccountHistoryAdapter(
|
|||||||
b.llHeaderBlocked.visibility = View.GONE
|
b.llHeaderBlocked.visibility = View.GONE
|
||||||
}
|
}
|
||||||
b.btnHeaderTransfer.setOnClickListener { onTransferClick?.invoke(account) }
|
b.btnHeaderTransfer.setOnClickListener { onTransferClick?.invoke(account) }
|
||||||
|
|
||||||
|
if (showDefaultToggle) {
|
||||||
|
b.dividerDefaultAccount.visibility = View.VISIBLE
|
||||||
|
b.llDefaultAccountRow.visibility = View.VISIBLE
|
||||||
|
b.switchDefaultAccount.setOnCheckedChangeListener(null)
|
||||||
|
b.switchDefaultAccount.isChecked = isDefaultAccount
|
||||||
|
b.switchDefaultAccount.setOnCheckedChangeListener { _, checked ->
|
||||||
|
isDefaultAccount = checked
|
||||||
|
onDefaultToggle?.invoke(checked)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b.dividerDefaultAccount.visibility = View.GONE
|
||||||
|
b.llDefaultAccountRow.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ import sh.sar.basedbank.api.models.BankTransaction
|
|||||||
import sh.sar.basedbank.api.mib.TransactionCache
|
import sh.sar.basedbank.api.mib.TransactionCache
|
||||||
import sh.sar.basedbank.databinding.FragmentAccountHistoryBinding
|
import sh.sar.basedbank.databinding.FragmentAccountHistoryBinding
|
||||||
import sh.sar.basedbank.util.AccountHistoryParser
|
import sh.sar.basedbank.util.AccountHistoryParser
|
||||||
|
import sh.sar.basedbank.util.AccountListParser
|
||||||
import sh.sar.basedbank.util.ContactImageCache
|
import sh.sar.basedbank.util.ContactImageCache
|
||||||
|
import sh.sar.basedbank.util.CredentialStore
|
||||||
import sh.sar.basedbank.util.HistoryFetcher
|
import sh.sar.basedbank.util.HistoryFetcher
|
||||||
import sh.sar.basedbank.util.MerchantIconCache
|
import sh.sar.basedbank.util.MerchantIconCache
|
||||||
|
|
||||||
@@ -80,6 +82,23 @@ class AccountHistoryFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
adapter.setHideAmounts(viewModel.hideAmounts.value ?: false)
|
adapter.setHideAmounts(viewModel.hideAmounts.value ?: false)
|
||||||
viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) }
|
viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) }
|
||||||
|
|
||||||
|
// Show default account toggle only for non-card accounts
|
||||||
|
val isCard = AccountListParser.from(account)?.isCard ?: false
|
||||||
|
if (!isCard) {
|
||||||
|
val store = CredentialStore(requireContext())
|
||||||
|
adapter.showDefaultToggle = true
|
||||||
|
adapter.isDefaultAccount = store.getDefaultAccountNumber() == account.accountNumber
|
||||||
|
adapter.onDefaultToggle = { isChecked ->
|
||||||
|
if (isChecked) {
|
||||||
|
store.setDefaultAccountNumber(account.accountNumber)
|
||||||
|
} else {
|
||||||
|
if (store.getDefaultAccountNumber() == account.accountNumber) {
|
||||||
|
store.setDefaultAccountNumber(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
|
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
|
||||||
binding.recyclerView.adapter = adapter
|
binding.recyclerView.adapter = adapter
|
||||||
|
|
||||||
@@ -131,7 +150,12 @@ class AccountHistoryFragment : Fragment() {
|
|||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
if (::account.isInitialized) requireActivity().title = account.accountBriefName
|
if (::account.isInitialized) {
|
||||||
|
requireActivity().title = account.accountBriefName
|
||||||
|
if (adapter.showDefaultToggle) {
|
||||||
|
adapter.isDefaultAccount = CredentialStore(requireContext()).getDefaultAccountNumber() == account.accountNumber
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun filterAndDisplay() {
|
private fun filterAndDisplay() {
|
||||||
|
|||||||
@@ -124,6 +124,20 @@ class PayMvQrFragment : Fragment() {
|
|||||||
selectedAccount = picked
|
selectedAccount = picked
|
||||||
scheduleGenerate()
|
scheduleGenerate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto-select default account if none is selected yet
|
||||||
|
if (selectedAccount == null) {
|
||||||
|
val defaultNum = CredentialStore(requireContext()).getDefaultAccountNumber()
|
||||||
|
if (defaultNum != null) {
|
||||||
|
val defaultAcc = eligible.firstOrNull { it.accountNumber == defaultNum }
|
||||||
|
if (defaultAcc != null) {
|
||||||
|
selectedAccount = defaultAcc
|
||||||
|
val prefix = if (defaultAcc.bank == "BML" && defaultAcc.profileName.isNotBlank()) "${defaultAcc.profileName} · " else ""
|
||||||
|
binding.actvAccount.setText("$prefix${defaultAcc.accountBriefName}", false)
|
||||||
|
scheduleGenerate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -573,8 +573,21 @@ class TransferFragment : Fragment() {
|
|||||||
|
|
||||||
private fun lookupAccount() {
|
private fun lookupAccount() {
|
||||||
if (selectedAccount == null) {
|
if (selectedAccount == null) {
|
||||||
Toast.makeText(requireContext(), R.string.transfer_select_source_first, Toast.LENGTH_SHORT).show()
|
val defaultNum = CredentialStore(requireContext()).getDefaultAccountNumber()
|
||||||
return
|
if (defaultNum != null) {
|
||||||
|
val allAccounts = viewModel.accounts.value ?: emptyList()
|
||||||
|
val defaultAcc = allAccounts.firstOrNull { it.accountNumber == defaultNum }
|
||||||
|
if (defaultAcc != null) {
|
||||||
|
selectedAccount = defaultAcc
|
||||||
|
updateAmountPrefix(defaultAcc)
|
||||||
|
showFromCard(defaultAcc)
|
||||||
|
updateTransferButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selectedAccount == null) {
|
||||||
|
Toast.makeText(requireContext(), R.string.transfer_no_from_account, Toast.LENGTH_SHORT).show()
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val accountNumber = AccountInputParser.normalize(binding.etTo.text?.toString()?.trim() ?: "")
|
val accountNumber = AccountInputParser.normalize(binding.etTo.text?.toString()?.trim() ?: "")
|
||||||
if (accountNumber.isBlank()) {
|
if (accountNumber.isBlank()) {
|
||||||
|
|||||||
@@ -627,6 +627,18 @@ class CredentialStore(context: Context) {
|
|||||||
editor.apply()
|
editor.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Default transfer/QR account ───────────────────────────────────────────
|
||||||
|
|
||||||
|
/** Account number the user has pinned as their default source for transfers and PayMV QR, or null. */
|
||||||
|
fun getDefaultAccountNumber(): String? = prefs.getString("default_account_number", null)
|
||||||
|
|
||||||
|
fun setDefaultAccountNumber(accountNumber: String?) {
|
||||||
|
val editor = prefs.edit()
|
||||||
|
if (accountNumber == null) editor.remove("default_account_number")
|
||||||
|
else editor.putString("default_account_number", accountNumber)
|
||||||
|
editor.apply()
|
||||||
|
}
|
||||||
|
|
||||||
// ── Dashboard card visibility ─────────────────────────────────────────────
|
// ── Dashboard card visibility ─────────────────────────────────────────────
|
||||||
|
|
||||||
fun getHiddenDashboardCardNumbers(): Set<String> =
|
fun getHiddenDashboardCardNumbers(): Set<String> =
|
||||||
|
|||||||
@@ -182,6 +182,55 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Default account divider + row (shown only for non-card accounts) -->
|
||||||
|
<View
|
||||||
|
android:id="@+id/dividerDefaultAccount"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:background="?attr/colorOutlineVariant"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/llDefaultAccountRow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Default account"
|
||||||
|
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Auto-selected for transfers and PayMV QR"
|
||||||
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||||
|
android:textColor="?attr/colorOnSurfaceVariant"
|
||||||
|
android:layout_marginTop="2dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.materialswitch.MaterialSwitch
|
||||||
|
android:id="@+id/switchDefaultAccount"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|||||||
@@ -246,6 +246,7 @@
|
|||||||
<string name="camera_permission_profile_message">Camera access is needed to take a photo. Please grant the permission in Settings.</string>
|
<string name="camera_permission_profile_message">Camera access is needed to take a photo. Please grant the permission in Settings.</string>
|
||||||
<string name="go_to_settings">Go to Settings</string>
|
<string name="go_to_settings">Go to Settings</string>
|
||||||
<string name="transfer_select_source_first">Select a source account first</string>
|
<string name="transfer_select_source_first">Select a source account first</string>
|
||||||
|
<string name="transfer_no_from_account">Please set a default account or select From account first</string>
|
||||||
<string name="transfer_enter_account_first">Enter an account number first</string>
|
<string name="transfer_enter_account_first">Enter an account number first</string>
|
||||||
<string name="transfer_account_not_found">Account not found</string>
|
<string name="transfer_account_not_found">Account not found</string>
|
||||||
<string name="transfer_session_unavailable">Session unavailable — please re-login</string>
|
<string name="transfer_session_unavailable">Session unavailable — please re-login</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user