Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
e3c6b3a695
|
@@ -11,8 +11,8 @@ android {
|
|||||||
applicationId = "sh.sar.basedbank"
|
applicationId = "sh.sar.basedbank"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 15
|
versionCode = 16
|
||||||
versionName = "1.0.16"
|
versionName = "1.0.17"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import sh.sar.basedbank.api.mib.MibCard
|
|||||||
import sh.sar.basedbank.api.mib.MibFinanceDeal
|
import sh.sar.basedbank.api.mib.MibFinanceDeal
|
||||||
import sh.sar.basedbank.util.bmlapi.BmlCardParser
|
import sh.sar.basedbank.util.bmlapi.BmlCardParser
|
||||||
import sh.sar.basedbank.util.CredentialStore
|
import sh.sar.basedbank.util.CredentialStore
|
||||||
|
import sh.sar.basedbank.util.NfcPaymentUtil
|
||||||
import sh.sar.basedbank.util.PaymvQrParser
|
import sh.sar.basedbank.util.PaymvQrParser
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import sh.sar.basedbank.databinding.FragmentDashboardBinding
|
import sh.sar.basedbank.databinding.FragmentDashboardBinding
|
||||||
@@ -426,11 +427,13 @@ class DashboardFragment : Fragment() {
|
|||||||
if (isMib) {
|
if (isMib) {
|
||||||
Toast.makeText(requireContext(), R.string.mib_qr_nfc_not_supported, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), R.string.mib_qr_nfc_not_supported, Toast.LENGTH_SHORT).show()
|
||||||
} else {
|
} else {
|
||||||
val accountNumber = (item as CardItem.Bml).account.accountNumber
|
NfcPaymentUtil.checkAndProceed(requireContext()) {
|
||||||
(requireActivity() as HomeActivity).navigateTo(
|
val accountNumber = (item as CardItem.Bml).account.accountNumber
|
||||||
R.id.nav_pay_with_card,
|
(requireActivity() as HomeActivity).navigateTo(
|
||||||
CardsFragment.newInstanceWithAutoTapMode(accountNumber)
|
R.id.nav_pay_with_card,
|
||||||
)
|
CardsFragment.newInstanceWithAutoTapMode(accountNumber)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import sh.sar.basedbank.util.CardsCache
|
|||||||
import sh.sar.basedbank.util.CredentialStore
|
import sh.sar.basedbank.util.CredentialStore
|
||||||
import sh.sar.basedbank.util.Totp
|
import sh.sar.basedbank.util.Totp
|
||||||
import sh.sar.basedbank.util.bmlapi.BmlCardParser
|
import sh.sar.basedbank.util.bmlapi.BmlCardParser
|
||||||
|
import sh.sar.basedbank.util.NfcPaymentUtil
|
||||||
import sh.sar.basedbank.util.PaymvQrParser
|
import sh.sar.basedbank.util.PaymvQrParser
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
@@ -232,11 +233,13 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets ->
|
|||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
val bmlItem = item as CardItem.Bml
|
val bmlItem = item as CardItem.Bml
|
||||||
val prefs = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
NfcPaymentUtil.checkAndProceed(requireContext()) {
|
||||||
if (prefs.getBoolean("biometrics_transfer_confirm", false)) {
|
val prefs = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||||
showBiometricPromptForTap(bmlItem)
|
if (prefs.getBoolean("biometrics_transfer_confirm", false)) {
|
||||||
} else {
|
showBiometricPromptForTap(bmlItem)
|
||||||
setTapMode(true, bmlItem)
|
} else {
|
||||||
|
setTapMode(true, bmlItem)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -742,11 +745,13 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets ->
|
|||||||
currentCardPosition = pos
|
currentCardPosition = pos
|
||||||
binding.rvCards.scrollToPosition(pos)
|
binding.rvCards.scrollToPosition(pos)
|
||||||
}
|
}
|
||||||
val prefs = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
NfcPaymentUtil.checkAndProceed(requireContext()) {
|
||||||
if (prefs.getBoolean("biometrics_transfer_confirm", false)) {
|
val prefs = requireContext().getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||||
showBiometricPromptForTap(targetCard)
|
if (prefs.getBoolean("biometrics_transfer_confirm", false)) {
|
||||||
} else {
|
showBiometricPromptForTap(targetCard)
|
||||||
setTapMode(true, targetCard)
|
} else {
|
||||||
|
setTapMode(true, targetCard)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package sh.sar.basedbank.util
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.nfc.NfcAdapter
|
||||||
|
import android.nfc.cardemulation.CardEmulation
|
||||||
|
import android.provider.Settings
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import sh.sar.basedbank.R
|
||||||
|
import sh.sar.basedbank.nfc.BmlHostCardEmulatorService
|
||||||
|
|
||||||
|
object NfcPaymentUtil {
|
||||||
|
fun checkAndProceed(context: Context, onReady: () -> Unit) {
|
||||||
|
val nfcAdapter = NfcAdapter.getDefaultAdapter(context) ?: run {
|
||||||
|
MaterialAlertDialogBuilder(context)
|
||||||
|
.setTitle(R.string.nfc_unsupported_title)
|
||||||
|
.setMessage(R.string.nfc_unsupported_message)
|
||||||
|
.setPositiveButton(android.R.string.ok, null)
|
||||||
|
.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nfcAdapter.isEnabled) {
|
||||||
|
MaterialAlertDialogBuilder(context)
|
||||||
|
.setTitle(R.string.nfc_disabled_title)
|
||||||
|
.setMessage(R.string.nfc_disabled_message)
|
||||||
|
.setPositiveButton(R.string.nfc_open_settings) { _, _ ->
|
||||||
|
context.startActivity(Intent(Settings.ACTION_NFC_SETTINGS))
|
||||||
|
}
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val cardEmulation = CardEmulation.getInstance(nfcAdapter)
|
||||||
|
val componentName = ComponentName(context, BmlHostCardEmulatorService::class.java)
|
||||||
|
if (!cardEmulation.isDefaultServiceForCategory(componentName, CardEmulation.CATEGORY_PAYMENT)) {
|
||||||
|
MaterialAlertDialogBuilder(context)
|
||||||
|
.setTitle(R.string.nfc_not_default_title)
|
||||||
|
.setMessage(context.getString(R.string.nfc_not_default_message,
|
||||||
|
context.applicationInfo.loadLabel(context.packageManager)))
|
||||||
|
.setPositiveButton(R.string.nfc_payment_open_settings) { _, _ ->
|
||||||
|
context.startActivity(Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS))
|
||||||
|
}
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
onReady()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -334,6 +334,14 @@
|
|||||||
<string name="card_pay_qr">Scan to Pay</string>
|
<string name="card_pay_qr">Scan to Pay</string>
|
||||||
<string name="card_pay_nfc">Tap to Pay</string>
|
<string name="card_pay_nfc">Tap to Pay</string>
|
||||||
<string name="mib_qr_nfc_not_supported">Skill issue on MIB side, Not supported</string>
|
<string name="mib_qr_nfc_not_supported">Skill issue on MIB side, Not supported</string>
|
||||||
|
<string name="nfc_unsupported_title">Not Supported</string>
|
||||||
|
<string name="nfc_unsupported_message">Tap to Pay is not supported on this device.</string>
|
||||||
|
<string name="nfc_disabled_title">NFC is Off</string>
|
||||||
|
<string name="nfc_disabled_message">Turn on NFC to use Tap to Pay.</string>
|
||||||
|
<string name="nfc_open_settings">NFC Settings</string>
|
||||||
|
<string name="nfc_not_default_title">Set Default Payment App</string>
|
||||||
|
<string name="nfc_not_default_message">Set %1$s as the default contactless payment app to use Tap to Pay.</string>
|
||||||
|
<string name="nfc_payment_open_settings">Payment Settings</string>
|
||||||
<string name="card_manage">Manage Card</string>
|
<string name="card_manage">Manage Card</string>
|
||||||
<string name="card_set_as_default">Set as Default Card</string>
|
<string name="card_set_as_default">Set as Default Card</string>
|
||||||
<string name="card_hide_from_dashboard">Hide from Dashboard</string>
|
<string name="card_hide_from_dashboard">Hide from Dashboard</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user