forked from shihaam/thijooree
add share to scan to pay
This commit is contained in:
@@ -81,6 +81,20 @@
|
|||||||
android:resource="@xml/bml_aid_list" />
|
android:resource="@xml/bml_aid_list" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<!-- Share-sheet alias: "Scan to Pay" receives shared images and decodes their QR code -->
|
||||||
|
<activity-alias
|
||||||
|
android:name=".ScanToPayActivity"
|
||||||
|
android:targetActivity=".MainActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/transfer_scan_qr"
|
||||||
|
android:icon="@drawable/ic_qr_scan">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity-alias>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.fileprovider"
|
android:authorities="${applicationId}.fileprovider"
|
||||||
|
|||||||
@@ -279,10 +279,12 @@ class LockActivity : AppCompatActivity() {
|
|||||||
val navDest = intent.getIntExtra("nav_destination", -1)
|
val navDest = intent.getIntExtra("nav_destination", -1)
|
||||||
val autoScan = intent.getBooleanExtra("auto_scan", false)
|
val autoScan = intent.getBooleanExtra("auto_scan", false)
|
||||||
val autoTapMode = intent.getBooleanExtra("auto_tap_mode", false)
|
val autoTapMode = intent.getBooleanExtra("auto_tap_mode", false)
|
||||||
|
val shareQrText = intent.getStringExtra("share_qr_text")
|
||||||
startActivity(Intent(this, HomeActivity::class.java).apply {
|
startActivity(Intent(this, HomeActivity::class.java).apply {
|
||||||
if (navDest != -1) putExtra("nav_destination", navDest)
|
if (navDest != -1) putExtra("nav_destination", navDest)
|
||||||
if (autoScan) putExtra("auto_scan", true)
|
if (autoScan) putExtra("auto_scan", true)
|
||||||
if (autoTapMode) putExtra("auto_tap_mode", true)
|
if (autoTapMode) putExtra("auto_tap_mode", true)
|
||||||
|
if (shareQrText != null) putExtra("share_qr_text", shareQrText)
|
||||||
})
|
})
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,28 @@ import sh.sar.basedbank.R
|
|||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private fun decodeQrFromSharedImage(uri: android.net.Uri): String? {
|
||||||
|
return try {
|
||||||
|
val bitmap = contentResolver.openInputStream(uri)?.use {
|
||||||
|
android.graphics.BitmapFactory.decodeStream(it)
|
||||||
|
} ?: return null
|
||||||
|
val opts = de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions(
|
||||||
|
tryHarder = true, tryRotate = true, tryInvert = true,
|
||||||
|
tryDownscale = true, maxNumberOfSymbols = 1,
|
||||||
|
textMode = de.markusfisch.android.zxingcpp.ZxingCpp.TextMode.PLAIN
|
||||||
|
)
|
||||||
|
val result = (de.markusfisch.android.zxingcpp.ZxingCpp.readBitmap(
|
||||||
|
bitmap, 0, 0, bitmap.width, bitmap.height, 0,
|
||||||
|
opts.apply { binarizer = de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer.LOCAL_AVERAGE }
|
||||||
|
) ?: de.markusfisch.android.zxingcpp.ZxingCpp.readBitmap(
|
||||||
|
bitmap, 0, 0, bitmap.width, bitmap.height, 0,
|
||||||
|
opts.apply { binarizer = de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer.GLOBAL_HISTOGRAM }
|
||||||
|
))?.firstOrNull()?.text
|
||||||
|
bitmap.recycle()
|
||||||
|
result
|
||||||
|
} catch (_: Exception) { null }
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -21,6 +43,17 @@ class MainActivity : AppCompatActivity() {
|
|||||||
val store = CredentialStore(this)
|
val store = CredentialStore(this)
|
||||||
val hasCredentials = store.hasMibCredentials() || store.hasBmlCredentials() || store.hasFahipayCredentials()
|
val hasCredentials = store.hasMibCredentials() || store.hasBmlCredentials() || store.hasFahipayCredentials()
|
||||||
|
|
||||||
|
// Image shared via "Scan to Pay" — decode QR here while we still hold the URI permission
|
||||||
|
val shareQrText: String? = if (intent?.action == Intent.ACTION_SEND &&
|
||||||
|
intent.type?.startsWith("image/") == true) {
|
||||||
|
val uri: android.net.Uri? =
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU)
|
||||||
|
intent.getParcelableExtra(Intent.EXTRA_STREAM, android.net.Uri::class.java)
|
||||||
|
else
|
||||||
|
@Suppress("DEPRECATION") intent.getParcelableExtra(Intent.EXTRA_STREAM)
|
||||||
|
if (uri != null) decodeQrFromSharedImage(uri) else null
|
||||||
|
} else null
|
||||||
|
|
||||||
val navDestination = when (intent?.action) {
|
val navDestination = when (intent?.action) {
|
||||||
"sh.sar.basedbank.OPEN_TRANSFER" -> R.id.nav_transfer
|
"sh.sar.basedbank.OPEN_TRANSFER" -> R.id.nav_transfer
|
||||||
"sh.sar.basedbank.OPEN_SCAN_QR" -> R.id.nav_transfer
|
"sh.sar.basedbank.OPEN_SCAN_QR" -> R.id.nav_transfer
|
||||||
@@ -46,6 +79,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
if (navDestination != -1) putExtra("nav_destination", navDestination)
|
if (navDestination != -1) putExtra("nav_destination", navDestination)
|
||||||
if (autoScan) putExtra("auto_scan", true)
|
if (autoScan) putExtra("auto_scan", true)
|
||||||
if (autoTapMode) putExtra("auto_tap_mode", true)
|
if (autoTapMode) putExtra("auto_tap_mode", true)
|
||||||
|
if (shareQrText != null) putExtra("share_qr_text", shareQrText)
|
||||||
})
|
})
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,16 +238,25 @@ class HomeActivity : AppCompatActivity() {
|
|||||||
val navDest = intent.getIntExtra("nav_destination", -1)
|
val navDest = intent.getIntExtra("nav_destination", -1)
|
||||||
val autoScan = intent.getBooleanExtra("auto_scan", false)
|
val autoScan = intent.getBooleanExtra("auto_scan", false)
|
||||||
val autoTapMode = intent.getBooleanExtra("auto_tap_mode", false)
|
val autoTapMode = intent.getBooleanExtra("auto_tap_mode", false)
|
||||||
if (navDest != -1) {
|
val shareQrText = intent.getStringExtra("share_qr_text")
|
||||||
val fragment = when {
|
when {
|
||||||
autoScan && navDest == R.id.nav_transfer -> TransferFragment.newInstanceWithAutoScan()
|
shareQrText != null -> {
|
||||||
autoTapMode && navDest == R.id.nav_pay_with_card -> CardsFragment.newInstanceWithAutoTapMode()
|
show(DashboardFragment())
|
||||||
else -> null
|
binding.navigationView.setCheckedItem(R.id.nav_dashboard)
|
||||||
|
routeSharedQrText(shareQrText)
|
||||||
|
}
|
||||||
|
navDest != -1 -> {
|
||||||
|
val fragment = when {
|
||||||
|
autoScan && navDest == R.id.nav_transfer -> TransferFragment.newInstanceWithAutoScan()
|
||||||
|
autoTapMode && navDest == R.id.nav_pay_with_card -> CardsFragment.newInstanceWithAutoTapMode()
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
navigateTo(navDest, fragment)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
show(DashboardFragment())
|
||||||
|
binding.navigationView.setCheckedItem(R.id.nav_dashboard)
|
||||||
}
|
}
|
||||||
navigateTo(navDest, fragment)
|
|
||||||
} else {
|
|
||||||
show(DashboardFragment())
|
|
||||||
binding.navigationView.setCheckedItem(R.id.nav_dashboard)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,6 +445,25 @@ fun applyNavLabelVisibility() {
|
|||||||
.commit()
|
.commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun routeSharedQrText(text: String) {
|
||||||
|
val bmlUrl = sh.sar.basedbank.util.PaymvQrParser.extractBmlGatewayUrl(text)
|
||||||
|
if (text.startsWith("https://ebanking.bankofmaldives.com.mv/qrpay/") || bmlUrl != null) {
|
||||||
|
navigateTo(R.id.nav_transfer, TransferFragment.newInstanceFromBmlQr(bmlUrl ?: text))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val qr = sh.sar.basedbank.util.PaymvQrParser.parse(text)
|
||||||
|
if (qr?.accountNumber != null) {
|
||||||
|
navigateTo(R.id.nav_transfer, TransferFragment.newInstanceFromQr(
|
||||||
|
accountNumber = qr.accountNumber,
|
||||||
|
displayName = qr.merchantName ?: qr.accountNumber,
|
||||||
|
amount = qr.amount,
|
||||||
|
remarks = qr.purpose
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, R.string.transfer_qr_invalid, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
// Returning from LockActivity — refresh sessions since they may have expired.
|
// Returning from LockActivity — refresh sessions since they may have expired.
|
||||||
|
|||||||
Reference in New Issue
Block a user