summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2024-06-06 11:59:16 -0600
committerIván Ávalos <avalos@disroot.org>2024-06-07 13:09:04 -0600
commit825e55ca3a02c25acc48ae02b79c85cd5822d762 (patch)
treec6a530c8a2db5c13a8918328af1b467cc0489d6f /wallet/src/main/java/net/taler
parent39b01c585f96a9465bc7e9d6a93c5c2bd1d417cb (diff)
downloadtaler-android-dev/ivan-avalos/master.tar.gz
taler-android-dev/ivan-avalos/master.tar.bz2
taler-android-dev/ivan-avalos/master.zip
[wallet] Show warning when scanning unrelated QR from send/receive screensdev/ivan-avalos/master
bug 0008902
Diffstat (limited to 'wallet/src/main/java/net/taler')
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainActivity.kt26
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainViewModel.kt38
-rw-r--r--wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt2
4 files changed, 64 insertions, 4 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index d15340a..87b423d 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -41,6 +41,7 @@ import androidx.navigation.ui.setupWithNavController
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener
import com.google.zxing.client.android.Intents.Scan.MIXED_SCAN
import com.google.zxing.client.android.Intents.Scan.SCAN_TYPE
@@ -67,7 +68,11 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
private val barcodeLauncher = registerForActivityResult(ScanContract()) { result ->
if (result == null || result.contents == null) return@registerForActivityResult
- handleTalerUri(result.contents, "QR code")
+ if (model.checkScanQrContext(result.contents)) {
+ handleTalerUri(result.contents, "QR code")
+ } else {
+ confirmTalerUri(result.contents, "QR code")
+ }
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -175,6 +180,25 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
return super.onOptionsItemSelected(item)
}
+ private fun confirmTalerUri(uri: String, from: String) {
+ MaterialAlertDialogBuilder(this).apply {
+ setTitle(R.string.qr_scan_context_title)
+ setMessage(when (model.getScanQrContext()) {
+ ScanQrContext.Send -> R.string.qr_scan_context_send_message
+ ScanQrContext.Receive -> R.string.qr_scan_context_receive_message
+ else -> error("invalid value")
+ })
+
+ setNegativeButton(R.string.ok) { _, _ ->
+ handleTalerUri(uri, from)
+ }
+
+ setNeutralButton(R.string.cancel) { dialog, _ ->
+ dialog.dismiss()
+ }
+ }.show()
+ }
+
private fun handleTalerUri(uri: String, from: String) {
val args = bundleOf("uri" to uri, "from" to from)
nav.navigate(R.id.action_global_handle_uri, args)
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index c7318de..a7da38d 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -17,6 +17,7 @@
package net.taler.wallet
import android.app.Application
+import android.net.Uri
import android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.AndroidViewModel
@@ -68,6 +69,19 @@ private val observabilityNotifications = listOf(
"request-observability-event",
)
+private val sendUriActions = listOf(
+ "pay",
+ "tip",
+ "pay-pull",
+ "pay-template",
+)
+
+private val receiveUriActions = listOf(
+ "withdraw",
+ "refund",
+ "pay-push",
+)
+
class MainViewModel(
app: Application,
) : AndroidViewModel(app), VersionReceiver, NotificationReceiver {
@@ -116,6 +130,9 @@ class MainViewModel(
private val mScanCodeEvent = MutableLiveData<Event<Boolean>>()
val scanCodeEvent: LiveData<Event<Boolean>> = mScanCodeEvent
+ @set:Synchronized
+ private var scanQrContext = ScanQrContext.Unknown
+
override fun onVersionReceived(versionInfo: WalletCoreVersion) {
walletVersion = versionInfo.implementationSemver
walletVersionHash = versionInfo.implementationGitHash
@@ -209,10 +226,23 @@ class MainViewModel(
}
@UiThread
- fun scanCode() {
+ fun scanCode(context: ScanQrContext = ScanQrContext.Unknown) {
+ scanQrContext = context
mScanCodeEvent.value = true.toEvent()
}
+ fun getScanQrContext() = scanQrContext
+
+ fun checkScanQrContext(uri: String): Boolean {
+ val parsed = Uri.parse(uri)
+ val action = parsed.host
+ return when (scanQrContext) {
+ ScanQrContext.Send -> action in sendUriActions
+ ScanQrContext.Receive -> action in receiveUriActions
+ else -> true
+ }
+ }
+
fun setDevMode(enabled: Boolean, onError: (error: TalerErrorInfo) -> Unit) {
mDevMode.postValue(enabled)
viewModelScope.launch {
@@ -262,6 +292,12 @@ class MainViewModel(
}
+enum class ScanQrContext {
+ Send,
+ Receive,
+ Unknown,
+}
+
sealed class AmountResult {
class Success(val amount: Amount) : AmountResult()
object InsufficientBalance : AmountResult()
diff --git a/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt b/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
index b3fe7db..dd9ef61 100644
--- a/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
@@ -125,7 +125,7 @@ class ReceiveFundsFragment : Fragment() {
}
private fun onScanQr() {
- model.scanCode()
+ model.scanCode(ScanQrContext.Receive)
}
}
diff --git a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
index b893b93..791d586 100644
--- a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
@@ -103,7 +103,7 @@ class SendFundsFragment : Fragment() {
}
private fun onScanQr() {
- model.scanCode()
+ model.scanCode(ScanQrContext.Send)
}
}