aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2022-08-17 16:13:59 -0300
committerTorsten Grote <t@grobox.de>2022-08-17 16:13:59 -0300
commit48b609b653180b1145b2103097837e514e58364d (patch)
tree22ac124e983b21863446324318c4c8665723dc76
parentd1163e31e904ac59d0739169257a8e3fdc7986a7 (diff)
downloadtaler-android-48b609b653180b1145b2103097837e514e58364d.tar.gz
taler-android-48b609b653180b1145b2103097837e514e58364d.tar.bz2
taler-android-48b609b653180b1145b2103097837e514e58364d.zip
[wallet] Scan QR codes in mixed mode
so we can scan inverted codes as well
-rw-r--r--cashier/src/main/java/net/taler/cashier/Response.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainActivity.kt68
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainFragment.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainViewModel.kt8
-rw-r--r--wallet/src/main/java/net/taler/wallet/Utils.kt10
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt3
-rw-r--r--wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt7
7 files changed, 57 insertions, 43 deletions
diff --git a/cashier/src/main/java/net/taler/cashier/Response.kt b/cashier/src/main/java/net/taler/cashier/Response.kt
index 89b7b33..e9db447 100644
--- a/cashier/src/main/java/net/taler/cashier/Response.kt
+++ b/cashier/src/main/java/net/taler/cashier/Response.kt
@@ -19,7 +19,6 @@ package net.taler.cashier
import android.content.Context
import android.util.Log
import io.ktor.client.call.body
-import io.ktor.client.call.receive
import io.ktor.client.plugins.ResponseException
import io.ktor.http.HttpStatusCode
import kotlinx.serialization.Serializable
@@ -47,7 +46,6 @@ class Response<out T> private constructor(
private suspend fun getExceptionString(e: ResponseException): String {
val response = e.response
return try {
- Log.e("TEST", "TRY RECEIVE $response")
val error: Error = response.body()
"Error ${error.code}: ${error.hint}"
} catch (ex: Exception) {
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index 1ba05ac..ea604c4 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -46,10 +46,14 @@ import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCal
import com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener
import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
import com.google.android.material.snackbar.Snackbar
-import com.google.zxing.integration.android.IntentIntegrator
-import com.google.zxing.integration.android.IntentIntegrator.parseActivityResult
+import com.google.zxing.client.android.Intents.Scan.MIXED_SCAN
+import com.google.zxing.client.android.Intents.Scan.SCAN_TYPE
+import com.journeyapps.barcodescanner.ScanContract
+import com.journeyapps.barcodescanner.ScanOptions
+import com.journeyapps.barcodescanner.ScanOptions.QR_CODE
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
+import net.taler.common.EventObserver
import net.taler.common.isOnline
import net.taler.common.showError
import net.taler.wallet.BuildConfig.VERSION_CODE
@@ -65,6 +69,7 @@ import java.net.URL
import java.util.Locale.ROOT
import javax.net.ssl.HttpsURLConnection
+
class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
OnPreferenceStartFragmentCallback {
@@ -73,6 +78,11 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
private lateinit var ui: ActivityMainBinding
private lateinit var nav: NavController
+ private val barcodeLauncher = registerForActivityResult(ScanContract()) { result ->
+ if (result == null || result.contents == null) return@registerForActivityResult
+ handleTalerUri(result.contents, "QR code")
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ui = ActivityMainBinding.inflate(layoutInflater)
@@ -118,6 +128,17 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
registerReceiver(nfcConnectedReceiver, IntentFilter(MERCHANT_NFC_CONNECTED))
registerReceiver(nfcDisconnectedReceiver, IntentFilter(MERCHANT_NFC_DISCONNECTED))
registerReceiver(tunnelResponseReceiver, IntentFilter(HTTP_TUNNEL_RESPONSE))
+
+ model.scanCodeEvent.observe(this, EventObserver {
+ val scanOptions = ScanOptions().apply {
+ setPrompt("")
+ setBeepEnabled(true)
+ setOrientationLocked(false)
+ setDesiredBarcodeFormats(QR_CODE)
+ addExtra(SCAN_TYPE, MIXED_SCAN)
+ }
+ if (it) barcodeLauncher.launch(scanOptions)
+ })
}
override fun onBackPressed() {
@@ -135,15 +156,6 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
return true
}
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- if (requestCode == IntentIntegrator.REQUEST_CODE) {
- parseActivityResult(requestCode, resultCode, data)?.contents?.let { contents ->
- handleTalerUri(contents, "QR code")
- }
- }
- }
-
override fun onDestroy() {
unregisterReceiver(triggerPaymentReceiver)
unregisterReceiver(nfcConnectedReceiver)
@@ -152,13 +164,18 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
super.onDestroy()
}
- private fun getTalerAction(uri: Uri, maxRedirects: Int, actionFound: MutableLiveData<String>): MutableLiveData<String> {
+ private fun getTalerAction(
+ uri: Uri,
+ maxRedirects: Int,
+ actionFound: MutableLiveData<String>,
+ ): MutableLiveData<String> {
val scheme = uri.scheme ?: return actionFound
if (scheme == "http" || scheme == "https") {
model.viewModelScope.launch(Dispatchers.IO) {
- val conn: HttpsURLConnection = URL(uri.toString()).openConnection() as HttpsURLConnection
- Log.v(TAG, "prepare query: ${uri}")
+ val conn: HttpsURLConnection =
+ URL(uri.toString()).openConnection() as HttpsURLConnection
+ Log.v(TAG, "prepare query: $uri")
conn.setRequestProperty("Accept", "text/html")
conn.connectTimeout = 5000
conn.requestMethod = "HEAD"
@@ -175,12 +192,13 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
}
if (status == HttpURLConnection.HTTP_MOVED_TEMP
|| status == HttpURLConnection.HTTP_MOVED_PERM
- || status == HttpURLConnection.HTTP_SEE_OTHER) {
+ || status == HttpURLConnection.HTTP_SEE_OTHER
+ ) {
val location = conn.headerFields["Location"]
if (location != null && location[0] != null) {
Log.v(TAG, "location redirect: ${location[0]}")
val locUri = Uri.parse(location[0])
- getTalerAction(locUri, maxRedirects -1, actionFound)
+ getTalerAction(locUri, maxRedirects - 1, actionFound)
}
}
}
@@ -200,10 +218,10 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
connectToWifi(this, uri.fragment!!)
}
- getTalerAction(uri, 3, MutableLiveData<String>()).observe(this) { url ->
- Log.v(TAG, "found action $url")
+ getTalerAction(uri, 3, MutableLiveData<String>()).observe(this) { u ->
+ Log.v(TAG, "found action $u")
- val normalizedURL = url.lowercase(ROOT)
+ val normalizedURL = u.lowercase(ROOT)
val action = normalizedURL.substring(
if (normalizedURL.startsWith("taler://")) {
"taler://".length
@@ -218,25 +236,25 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
action.startsWith("pay/") -> {
Log.v(TAG, "navigating!")
nav.navigate(R.id.action_global_promptPayment)
- model.paymentManager.preparePay(url)
+ model.paymentManager.preparePay(u)
}
action.startsWith("tip/") -> {
Log.v(TAG, "navigating!")
nav.navigate(R.id.action_global_promptTip)
- model.tipManager.prepareTip(url)
+ model.tipManager.prepareTip(u)
}
action.startsWith("withdraw/") -> {
Log.v(TAG, "navigating!")
// there's more than one entry point, so use global action
nav.navigate(R.id.action_global_promptWithdraw)
- model.withdrawManager.getWithdrawalDetails(url)
+ model.withdrawManager.getWithdrawalDetails(u)
}
action.startsWith("refund/") -> {
model.showProgressBar.value = true
- model.refundManager.refund(url).observe(this, Observer(::onRefundResponse))
+ model.refundManager.refund(u).observe(this, Observer(::onRefundResponse))
}
else -> {
- showError(R.string.error_unsupported_uri, "From: $from\nURI: $url")
+ showError(R.string.error_unsupported_uri, "From: $from\nURI: $u")
}
}
}
@@ -292,7 +310,7 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
override fun onPreferenceStartFragment(
caller: PreferenceFragmentCompat,
- pref: Preference
+ pref: Preference,
): Boolean {
when (pref.key) {
"pref_backup" -> nav.navigate(R.id.action_nav_settings_to_nav_settings_backup)
diff --git a/wallet/src/main/java/net/taler/wallet/MainFragment.kt b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
index 6c84925..2521e29 100644
--- a/wallet/src/main/java/net/taler/wallet/MainFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
@@ -62,7 +62,7 @@ class MainFragment : Fragment() {
})
ui.mainFab.setOnClickListener {
- scanQrCode(requireActivity())
+ model.scanCode()
}
ui.mainFab.setOnLongClickListener {
findNavController().navigate(R.id.action_nav_main_to_nav_uri_input)
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index 5041037..92113aa 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -97,6 +97,9 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) {
private val mTransactionsEvent = MutableLiveData<Event<String>>()
val transactionsEvent: LiveData<Event<String>> = mTransactionsEvent
+ private val mScanCodeEvent = MutableLiveData<Event<Boolean>>()
+ val scanCodeEvent: LiveData<Event<Boolean>> = mScanCodeEvent
+
private val mLastBackup = MutableLiveData(
// fake backup time until we actually do backup
System.currentTimeMillis() -
@@ -151,4 +154,9 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) {
api.sendRequest("tunnelResponse", respJson)
}
+ @UiThread
+ fun scanCode() {
+ mScanCodeEvent.value = true.toEvent()
+ }
+
}
diff --git a/wallet/src/main/java/net/taler/wallet/Utils.kt b/wallet/src/main/java/net/taler/wallet/Utils.kt
index 388bf61..1b5af64 100644
--- a/wallet/src/main/java/net/taler/wallet/Utils.kt
+++ b/wallet/src/main/java/net/taler/wallet/Utils.kt
@@ -16,7 +16,6 @@
package net.taler.wallet
-import android.app.Activity
import android.content.Context
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
@@ -30,15 +29,6 @@ import android.widget.Toast
import android.widget.Toast.LENGTH_LONG
import androidx.annotation.RequiresApi
import androidx.core.content.getSystemService
-import com.google.zxing.integration.android.IntentIntegrator
-
-fun scanQrCode(activity: Activity) {
- IntentIntegrator(activity).apply {
- setPrompt("")
- setBeepEnabled(true)
- setOrientationLocked(false)
- }.initiateScan(listOf(IntentIntegrator.QR_CODE))
-}
fun connectToWifi(context: Context, ssid: String) {
if (SDK_INT >= 29) {
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
index fddaaec..da8508a 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
@@ -41,7 +41,6 @@ import net.taler.common.fadeOut
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.databinding.FragmentTransactionsBinding
-import net.taler.wallet.scanQrCode
interface OnTransactionClickListener {
fun onTransactionClicked(transaction: Transaction)
@@ -118,7 +117,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode.
onTransactionsResult(result)
}
ui.mainFab.setOnClickListener {
- scanQrCode(requireActivity())
+ model.scanCode()
}
ui.mainFab.setOnLongClickListener {
findNavController().navigate(R.id.action_nav_transactions_to_nav_uri_input)
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
index 660fec2..500b6e7 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/ManualWithdrawFragment.kt
@@ -29,7 +29,6 @@ import net.taler.common.hideKeyboard
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.databinding.FragmentManualWithdrawBinding
-import net.taler.wallet.scanQrCode
import java.util.Locale
class ManualWithdrawFragment : Fragment() {
@@ -50,7 +49,9 @@ class ManualWithdrawFragment : Fragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- ui.qrCodeButton.setOnClickListener { scanQrCode(requireActivity()) }
+ ui.qrCodeButton.setOnClickListener {
+ model.scanCode()
+ }
ui.currencyView.text = exchangeItem.currency
val paymentOptions = exchangeItem.paytoUris.mapNotNull { paytoUri ->
Uri.parse(paytoUri).authority?.uppercase(Locale.getDefault())
@@ -66,7 +67,7 @@ class ManualWithdrawFragment : Fragment() {
return
}
ui.amountLayout.error = null
- var value = 0.0
+ val value: Double
try {
value = ui.amountView.text.toString().replace(',', '.').toDouble()
} catch (e: NumberFormatException) {