From b107358266dc623cddd5097320aadaf97883a00f Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Wed, 20 May 2026 00:29:06 +0500 Subject: [PATCH] toggle to enable or disable privacy mode and also privacy mode toggle --- .../ui/home/AccountHistoryAdapter.kt | 39 ++++++++++++---- .../ui/home/AccountHistoryFragment.kt | 2 + .../sar/basedbank/ui/home/AccountsAdapter.kt | 16 ++++++- .../sar/basedbank/ui/home/AccountsFragment.kt | 1 + .../basedbank/ui/home/DashboardFragment.kt | 46 +++++++++++++------ .../sar/basedbank/ui/home/FinancingAdapter.kt | 23 +++++++--- .../basedbank/ui/home/FinancingFragment.kt | 1 + .../sh/sar/basedbank/ui/home/HomeActivity.kt | 14 ++++++ .../sh/sar/basedbank/ui/home/HomeViewModel.kt | 2 + .../ui/home/SettingsSecurityFragment.kt | 11 +++++ .../basedbank/ui/home/TransactionAdapter.kt | 24 +++++++--- .../ui/home/TransferHistoryFragment.kt | 2 + app/src/main/res/drawable/ic_visibility.xml | 11 +++++ .../main/res/drawable/ic_visibility_off.xml | 11 +++++ .../res/layout/fragment_settings_security.xml | 38 +++++++++++++++ app/src/main/res/menu/toolbar_menu.xml | 6 +++ app/src/main/res/values/strings.xml | 4 ++ 17 files changed, 214 insertions(+), 37 deletions(-) create mode 100644 app/src/main/res/drawable/ic_visibility.xml create mode 100644 app/src/main/res/drawable/ic_visibility_off.xml diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryAdapter.kt b/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryAdapter.kt index f2eb420..5a03be4 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryAdapter.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryAdapter.kt @@ -37,6 +37,17 @@ class AccountHistoryAdapter( var onImageNeeded: ((counterpartyName: String) -> Unit)? = null var onIconUrlNeeded: ((url: String) -> Unit)? = null var onTransferClick: ((MibAccount) -> Unit)? = null + private var hideAmounts: Boolean = false + + fun setHideAmounts(hide: Boolean) { + if (hideAmounts == hide) return + hideAmounts = hide + notifyItemChanged(0) // refresh header card + // refresh all transaction rows + for (i in displayItems.indices) { + if (displayItems[i] is Item.Trx) notifyItemChanged(i + 1) + } + } fun updateImage(counterpartyName: String, bitmap: Bitmap) { imageCache[counterpartyName] = bitmap @@ -154,10 +165,10 @@ class AccountHistoryAdapter( b.tvHeaderAccountNumber.text = d.number b.tvHeaderPillBank.text = d.bankPill b.tvHeaderPillType.text = d.typeLabel - b.tvHeaderAvailable.text = d.availableBalance - b.tvHeaderBalance.text = d.workingBalance + b.tvHeaderAvailable.text = if (hideAmounts) maskAmount(d.availableBalance) else d.availableBalance + b.tvHeaderBalance.text = if (hideAmounts) maskAmount(d.workingBalance) else d.workingBalance if (d.blockedBalance != null) { - b.tvHeaderBlocked.text = d.blockedBalance + b.tvHeaderBlocked.text = if (hideAmounts) maskAmount(d.blockedBalance) else d.blockedBalance b.llHeaderBlocked.visibility = View.VISIBLE } else { b.llHeaderBlocked.visibility = View.GONE @@ -211,12 +222,17 @@ class AccountHistoryAdapter( b.tvDate.text = formatTime(trx.date) - val sign = if (isCredit) "+" else "-" - val absAmt = "%.2f".format(kotlin.math.abs(trx.amount)) - b.tvAmount.text = "$sign ${trx.currency} $absAmt" - b.tvAmount.setTextColor( - if (isCredit) Color.parseColor("#4CAF50") else Color.parseColor("#FF7043") - ) + if (hideAmounts) { + b.tvAmount.text = "${trx.currency} ••••••" + b.tvAmount.setTextColor(Color.parseColor("#888888")) + } else { + val sign = if (isCredit) "+" else "-" + val absAmt = "%.2f".format(kotlin.math.abs(trx.amount)) + b.tvAmount.text = "$sign ${trx.currency} $absAmt" + b.tvAmount.setTextColor( + if (isCredit) Color.parseColor("#4CAF50") else Color.parseColor("#FF7043") + ) + } b.root.setOnClickListener { showDetail(trx) } } @@ -282,6 +298,11 @@ class AccountHistoryAdapter( return FULL_DATE_FMT.format(date) } + fun maskAmount(formatted: String): String { + val currency = formatted.substringBefore(' ', formatted) + return "$currency ••••••" + } + fun sourceColor(source: String) = when (source) { "MIB" -> "#FE860E" "BML", "BML_CARD" -> "#0066A1" diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryFragment.kt index c4a640a..c0e6388 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/AccountHistoryFragment.kt @@ -77,6 +77,8 @@ class AccountHistoryFragment : Fragment() { adapter.onTransferClick = { acc -> (activity as? HomeActivity)?.navigateTo(R.id.nav_transfer, TransferFragment.newInstanceFrom(acc)) } + adapter.setHideAmounts(viewModel.hideAmounts.value ?: false) + viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) } binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.adapter = adapter diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt index 5ef2d41..0af7fec 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsAdapter.kt @@ -21,6 +21,7 @@ class AccountsAdapter( ) : RecyclerView.Adapter() { var onTransferClick: ((MibAccount) -> Unit)? = null + private var hideAmounts: Boolean = false private sealed class Item { data class SectionTitle(val label: String) : Item() @@ -36,6 +37,12 @@ class AccountsAdapter( notifyDataSetChanged() } + fun setHideAmounts(hide: Boolean) { + if (hideAmounts == hide) return + hideAmounts = hide + notifyDataSetChanged() + } + private fun buildItems(accounts: List): List = buildList { val displayed = accounts.mapNotNull { acc -> AccountListParser.from(acc)?.let { acc to it } } val nonCards = displayed.filter { !it.second.isCard } @@ -109,7 +116,7 @@ class AccountsAdapter( binding.tvAccountName.text = display.name binding.tvAccountNumber.text = display.number binding.tvAccountType.text = display.typeLabel - binding.tvBalance.text = display.balance + binding.tvBalance.text = if (hideAmounts) maskAmount(display.balance) else display.balance binding.btnTransfer.setOnClickListener { onTransferClick?.invoke(account) } binding.root.setOnClickListener { onAccountClick(account) } binding.root.setOnLongClickListener { @@ -127,7 +134,7 @@ class AccountsAdapter( binding.tvCardNumber.text = display.number binding.tvCardProduct.text = display.typeLabel binding.layoutCardBalance.visibility = View.VISIBLE - binding.tvCardBalance.text = display.balance + binding.tvCardBalance.text = if (hideAmounts) maskAmount(display.balance) else display.balance if (display.statusLabel != null) { binding.tvCardStatus.text = display.statusLabel binding.tvCardStatus.visibility = View.VISIBLE @@ -146,6 +153,11 @@ class AccountsAdapter( private const val TYPE_ACCOUNT = 1 private const val TYPE_CARD = 2 + fun maskAmount(formatted: String): String { + val currency = formatted.substringBefore(' ', formatted) + return "$currency ••••••" + } + private fun copyToClipboard(context: Context, accountNumber: String) { val cm = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager cm.setPrimaryClip(ClipData.newPlainText("Account Number", accountNumber)) diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsFragment.kt index 5d26f9b..00fdf42 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/AccountsFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/AccountsFragment.kt @@ -44,6 +44,7 @@ class AccountsFragment : Fragment() { } viewModel.accounts.observe(viewLifecycleOwner) { adapter.updateAccounts(it) } + viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) } } override fun onResume() { 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 939a391..05e2bce 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 @@ -32,6 +32,11 @@ class DashboardFragment : Fragment() { viewModel.accounts.observe(viewLifecycleOwner) { updateBalances(it) } viewModel.financing.observe(viewLifecycleOwner) { updatePendingFinances(it) } viewModel.bmlLimits.observe(viewLifecycleOwner) { updateForeignLimits(it) } + viewModel.hideAmounts.observe(viewLifecycleOwner) { + updateBalances(viewModel.accounts.value ?: emptyList()) + updatePendingFinances(viewModel.financing.value ?: emptyList()) + updateForeignLimits(viewModel.bmlLimits.value ?: emptyList()) + } val bottomPaddingBase = (16 * resources.displayMetrics.density).toInt() ViewCompat.setOnApplyWindowInsetsListener(binding.buttonBar) { v, insets -> @@ -64,6 +69,12 @@ class DashboardFragment : Fragment() { } private fun updateBalances(accounts: List) { + val hide = viewModel.hideAmounts.value ?: false + if (hide) { + binding.tvMvrBalance.text = "MVR ••••••" + binding.tvUsdBalance.text = "USD ••••••" + return + } val mvrTotal = accounts .filter { it.currencyName.equals("MVR", ignoreCase = true) } .sumOf { it.availableBalance.replace(",", "").toDoubleOrNull() ?: 0.0 } @@ -76,31 +87,40 @@ class DashboardFragment : Fragment() { } private fun updateForeignLimits(entries: List) { + val hide = viewModel.hideAmounts.value ?: false binding.containerForeignLimits.removeAllViews() for (entry in entries) { for (limit in entry.limits) { val card = ItemForeignLimitBinding.inflate(layoutInflater, binding.containerForeignLimits, false) card.tvLimitUserName.text = entry.userName.ifBlank { "BML" } card.tvLimitType.text = limit.type - card.tvLimitGeneral.text = "USD %,.0f / %,.0f".format(limit.generalRemaining, limit.generalCap) - card.tvLimitMedical.text = "USD %,.0f".format(limit.medicalRemaining) - card.tvLimitAtm.text = if (!limit.isAtmEnabled) - "USD %,.0f / %,.0f · Disabled".format(limit.atmRemaining, limit.atmLimit) - else - "USD %,.0f / %,.0f".format(limit.atmRemaining, limit.atmLimit) - card.tvLimitEcom.text = "USD %,.0f / %,.0f".format(limit.ecomRemaining, limit.ecomLimit) - card.tvLimitPos.text = if (!limit.isPosEnabled) - "USD %,.0f / %,.0f · Disabled".format(limit.posRemaining, limit.posLimit) - else - "USD %,.0f / %,.0f".format(limit.posRemaining, limit.posLimit) + if (hide) { + card.tvLimitGeneral.text = "USD ••••••" + card.tvLimitMedical.text = "USD ••••••" + card.tvLimitAtm.text = if (!limit.isAtmEnabled) "USD •••••• · Disabled" else "USD ••••••" + card.tvLimitEcom.text = "USD ••••••" + card.tvLimitPos.text = if (!limit.isPosEnabled) "USD •••••• · Disabled" else "USD ••••••" + } else { + card.tvLimitGeneral.text = "USD %,.0f / %,.0f".format(limit.generalRemaining, limit.generalCap) + card.tvLimitMedical.text = "USD %,.0f".format(limit.medicalRemaining) + card.tvLimitAtm.text = if (!limit.isAtmEnabled) + "USD %,.0f / %,.0f · Disabled".format(limit.atmRemaining, limit.atmLimit) + else + "USD %,.0f / %,.0f".format(limit.atmRemaining, limit.atmLimit) + card.tvLimitEcom.text = "USD %,.0f / %,.0f".format(limit.ecomRemaining, limit.ecomLimit) + card.tvLimitPos.text = if (!limit.isPosEnabled) + "USD %,.0f / %,.0f · Disabled".format(limit.posRemaining, limit.posLimit) + else + "USD %,.0f / %,.0f".format(limit.posRemaining, limit.posLimit) + } binding.containerForeignLimits.addView(card.root) } } } private fun updatePendingFinances(deals: List) { - val total = deals.sumOf { it.outstandingAmount } - binding.tvPendingFinances.text = "MVR %,.2f".format(total) + val hide = viewModel.hideAmounts.value ?: false + binding.tvPendingFinances.text = if (hide) "MVR ••••••" else "MVR %,.2f".format(deals.sumOf { it.outstandingAmount }) } override fun onDestroyView() { diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/FinancingAdapter.kt b/app/src/main/java/sh/sar/basedbank/ui/home/FinancingAdapter.kt index 907dbc7..629c15e 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/FinancingAdapter.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/FinancingAdapter.kt @@ -16,6 +16,14 @@ import java.util.Locale class FinancingAdapter(private var deals: List) : RecyclerView.Adapter() { + private var hideAmounts: Boolean = false + + fun setHideAmounts(hide: Boolean) { + if (hideAmounts == hide) return + hideAmounts = hide + notifyDataSetChanged() + } + private val expandedPositions = mutableSetOf() private val amountFmt = NumberFormat.getNumberInstance(Locale.US).apply { minimumFractionDigits = 2 @@ -52,19 +60,20 @@ class FinancingAdapter(private var deals: List) : fun bind(deal: MibFinanceDeal, expanded: Boolean) { val ctx = binding.root.context val currency = deal.currency + val hide = hideAmounts binding.tvProductName.text = deal.productDesc binding.tvDealNo.text = ctx.getString(R.string.financing_deal_no_fmt, deal.dealNo) binding.tvStatus.text = deal.statusDesc - binding.tvTotal.text = "$currency ${amountFmt.format(deal.dealAmount)}" - binding.tvPaid.text = "$currency ${amountFmt.format(deal.paidAmount)}" - binding.tvUnpaid.text = "$currency ${amountFmt.format(deal.outstandingAmount)}" + binding.tvTotal.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.dealAmount)}" + binding.tvPaid.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.paidAmount)}" + binding.tvUnpaid.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.outstandingAmount)}" // Progress bar val progress = if (deal.dealAmount > 0) ((deal.paidAmount / deal.dealAmount) * 100).toInt().coerceIn(0, 100) else 0 - binding.progressBar.progress = progress + binding.progressBar.progress = if (hide) 0 else progress // Completion estimate binding.tvCompletion.text = completionText(deal, ctx) @@ -76,14 +85,14 @@ class FinancingAdapter(private var deals: List) : if (expanded) { binding.tvDealDate.text = formatDate(deal.dealDate) - binding.tvInstallment.text = "$currency ${amountFmt.format(deal.installmentAmount)}" + binding.tvInstallment.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.installmentAmount)}" binding.tvNumInstallments.text = deal.noOfInstallments.toString() binding.tvLastPaidDate.text = formatDate(deal.lastPaidDate) - binding.tvLastPayAmount.text = "$currency ${amountFmt.format(deal.lastPayAmount)}" + binding.tvLastPayAmount.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.lastPayAmount)}" if (deal.overdueAmount > 0) { binding.rowOverdue.visibility = View.VISIBLE - binding.tvOverdue.text = "$currency ${amountFmt.format(deal.overdueAmount)}" + binding.tvOverdue.text = if (hide) "$currency ••••••" else "$currency ${amountFmt.format(deal.overdueAmount)}" } else { binding.rowOverdue.visibility = View.GONE } diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/FinancingFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/FinancingFragment.kt index 57e784b..5e8a8e0 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/FinancingFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/FinancingFragment.kt @@ -44,6 +44,7 @@ class FinancingFragment : Fragment() { binding.emptyView.visibility = if (deals.isEmpty()) View.VISIBLE else View.GONE binding.loadingView.visibility = View.GONE } + viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) } } override fun onResume() { 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 ec3fd91..65d7eca 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 @@ -181,6 +181,9 @@ class HomeActivity : AppCompatActivity() { autoRefresh(store) } + // hideAmounts is always false on launch; eye feature just needs to be enabled + viewModel.hideAmounts.value = false + // Show dashboard on first create if (savedInstanceState == null) { show(DashboardFragment()) @@ -402,6 +405,11 @@ fun applyNavLabelVisibility() { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.toolbar_menu, menu) + val eyeEnabled = getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("hide_sensitive_info", false) + val eyeItem = menu.findItem(R.id.action_hide_amounts) + eyeItem?.isVisible = eyeEnabled + val hidden = viewModel.hideAmounts.value ?: false + eyeItem?.setIcon(if (hidden) R.drawable.ic_visibility_off else R.drawable.ic_visibility) return true } @@ -410,6 +418,12 @@ fun applyNavLabelVisibility() { lock() return true } + if (item.itemId == R.id.action_hide_amounts) { + val newHidden = !(viewModel.hideAmounts.value ?: false) + viewModel.hideAmounts.value = newHidden + invalidateOptionsMenu() + return true + } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/HomeViewModel.kt b/app/src/main/java/sh/sar/basedbank/ui/home/HomeViewModel.kt index 4400b7e..21aba8e 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/HomeViewModel.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/HomeViewModel.kt @@ -16,4 +16,6 @@ class HomeViewModel : ViewModel() { data class BmlLimitsData(val userName: String, val limits: List) val bmlLimits = MutableLiveData>(emptyList()) + + val hideAmounts = MutableLiveData(false) } diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt index 9f08b77..fa25aa4 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/SettingsSecurityFragment.kt @@ -79,6 +79,17 @@ class SettingsSecurityFragment : Fragment() { (activity as? HomeActivity)?.resetAutolockTimer() } + // Hide sensitive information (enables/disables the eye icon in toolbar) + val viewModel = (requireActivity() as HomeActivity).let { + androidx.lifecycle.ViewModelProvider(it)[HomeViewModel::class.java] + } + binding.switchHideAmounts.isChecked = prefs.getBoolean("hide_sensitive_info", false) + binding.switchHideAmounts.setOnCheckedChangeListener { _, isChecked -> + prefs.edit().putBoolean("hide_sensitive_info", isChecked).apply() + if (!isChecked) viewModel.hideAmounts.value = false + requireActivity().invalidateOptionsMenu() + } + // Block screenshots val blockScreenshots = prefs.getBoolean("block_screenshots", true) binding.switchBlockScreenshots.isChecked = blockScreenshots diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/TransactionAdapter.kt b/app/src/main/java/sh/sar/basedbank/ui/home/TransactionAdapter.kt index 39563c4..325cc93 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/TransactionAdapter.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/TransactionAdapter.kt @@ -27,6 +27,13 @@ class TransactionAdapter : RecyclerView.Adapter() { private val iconUrlCache = mutableMapOf() var onImageNeeded: ((counterpartyName: String) -> Unit)? = null var onIconUrlNeeded: ((url: String) -> Unit)? = null + private var hideAmounts: Boolean = false + + fun setHideAmounts(hide: Boolean) { + if (hideAmounts == hide) return + hideAmounts = hide + notifyDataSetChanged() + } fun updateImage(counterpartyName: String, bitmap: Bitmap) { imageCache[counterpartyName] = bitmap @@ -140,12 +147,17 @@ class TransactionAdapter : RecyclerView.Adapter() { b.tvDate.text = AccountHistoryAdapter.formatTime(trx.date) - val sign = if (isCredit) "+" else "-" - val absAmt = "%.2f".format(kotlin.math.abs(trx.amount)) - b.tvAmount.text = "$sign ${trx.currency} $absAmt" - b.tvAmount.setTextColor( - if (isCredit) Color.parseColor("#4CAF50") else Color.parseColor("#FF7043") - ) + if (hideAmounts) { + b.tvAmount.text = "${trx.currency} ••••••" + b.tvAmount.setTextColor(Color.parseColor("#888888")) + } else { + val sign = if (isCredit) "+" else "-" + val absAmt = "%.2f".format(kotlin.math.abs(trx.amount)) + b.tvAmount.text = "$sign ${trx.currency} $absAmt" + b.tvAmount.setTextColor( + if (isCredit) Color.parseColor("#4CAF50") else Color.parseColor("#FF7043") + ) + } b.root.setOnClickListener { showDetail(trx) } } diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/TransferHistoryFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/TransferHistoryFragment.kt index e9974a8..48feb4f 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/TransferHistoryFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/TransferHistoryFragment.kt @@ -86,6 +86,8 @@ class TransferHistoryFragment : Fragment() { adapter = TransactionAdapter() adapter.onImageNeeded = { name -> loadContactImage(name) } adapter.onIconUrlNeeded = { url -> loadMerchantIcon(url) } + adapter.setHideAmounts(viewModel.hideAmounts.value ?: false) + viewModel.hideAmounts.observe(viewLifecycleOwner) { adapter.setHideAmounts(it) } binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.adapter = adapter diff --git a/app/src/main/res/drawable/ic_visibility.xml b/app/src/main/res/drawable/ic_visibility.xml new file mode 100644 index 0000000..fb3e405 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml new file mode 100644 index 0000000..2f1dc35 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/layout/fragment_settings_security.xml b/app/src/main/res/layout/fragment_settings_security.xml index 39cc247..f341a32 100644 --- a/app/src/main/res/layout/fragment_settings_security.xml +++ b/app/src/main/res/layout/fragment_settings_security.xml @@ -162,6 +162,44 @@ android:layout_marginTop="24dp" android:layout_marginBottom="8dp" /> + + + + + + + + + + + + + + + + Lock app + Hide sensitive information + Show sensitive information Locking soon Locking in %d seconds Stay unlocked @@ -137,6 +139,8 @@ English ދިވެހި Privacy + Hide sensitive information + Masks account balances and financial figures across the app Block Screenshots Prevents the app from appearing in the recents screen and blocks screen capture Cache