88 lines
4.1 KiB
Kotlin
88 lines
4.1 KiB
Kotlin
package sh.sar.basedbank
|
|
|
|
import android.content.Intent
|
|
import android.os.Bundle
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import sh.sar.basedbank.ui.home.HomeActivity
|
|
import sh.sar.basedbank.ui.login.LoginActivity
|
|
import sh.sar.basedbank.ui.onboarding.OnboardingActivity
|
|
import sh.sar.basedbank.util.CredentialStore
|
|
import sh.sar.basedbank.BasedBankApp
|
|
import sh.sar.basedbank.R
|
|
|
|
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?) {
|
|
super.onCreate(savedInstanceState)
|
|
|
|
val prefs = getSharedPreferences("prefs", MODE_PRIVATE)
|
|
val onboardingDone = prefs.getBoolean("onboarding_done", false)
|
|
val securitySet = prefs.getString("security_method", null) != null
|
|
val store = CredentialStore(this)
|
|
val hasCredentials = store.hasMibCredentials() || store.hasBmlCredentials() ||
|
|
store.hasFahipayCredentials() || store.hasMfaisaCredentials()
|
|
|
|
// 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) {
|
|
"sh.sar.basedbank.OPEN_TRANSFER" -> R.id.nav_transfer
|
|
"sh.sar.basedbank.OPEN_SCAN_QR" -> R.id.nav_transfer
|
|
"sh.sar.basedbank.OPEN_PAY_WITH_CARD" -> R.id.nav_pay_with_card
|
|
"sh.sar.basedbank.TAP_TO_PAY" -> R.id.nav_pay_with_card
|
|
else -> -1
|
|
}
|
|
val autoScan = intent?.action == "sh.sar.basedbank.OPEN_SCAN_QR"
|
|
val autoTapMode = intent?.action == "sh.sar.basedbank.TAP_TO_PAY"
|
|
|
|
val target = when {
|
|
!onboardingDone -> OnboardingActivity::class.java
|
|
!hasCredentials -> LoginActivity::class.java
|
|
securitySet -> LockActivity::class.java // proceed() → HomeActivity
|
|
else -> HomeActivity::class.java
|
|
}
|
|
// No lock screen configured — mark as unlocked so HomeActivity's guard passes
|
|
if (target == HomeActivity::class.java) {
|
|
(application as BasedBankApp).isUnlocked = true
|
|
}
|
|
|
|
startActivity(Intent(this, target).apply {
|
|
if (navDestination != -1) putExtra("nav_destination", navDestination)
|
|
if (autoScan) putExtra("auto_scan", true)
|
|
if (autoTapMode) putExtra("auto_tap_mode", true)
|
|
if (shareQrText != null) putExtra("share_qr_text", shareQrText)
|
|
})
|
|
finish()
|
|
}
|
|
}
|