diff options
author | Iván Ávalos <avalos@disroot.org> | 2024-06-06 11:59:16 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2024-06-07 13:09:04 -0600 |
commit | 825e55ca3a02c25acc48ae02b79c85cd5822d762 (patch) | |
tree | c6a530c8a2db5c13a8918328af1b467cc0489d6f /wallet/src/main/java/net/taler | |
parent | 39b01c585f96a9465bc7e9d6a93c5c2bd1d417cb (diff) | |
download | taler-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')
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) } } |