[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant-terminal-android] 13/19: Make NFC and QR code re-useable
From: |
gnunet |
Subject: |
[taler-merchant-terminal-android] 13/19: Make NFC and QR code re-useable in another app |
Date: |
Fri, 21 Feb 2020 19:00:06 +0100 |
This is an automated email from the git hooks/post-receive script.
torsten-grote pushed a commit to branch master
in repository merchant-terminal-android.
commit 0ea377bdfa3205d4c611e0dcc472125fe2de07cb
Author: Torsten Grote <address@hidden>
AuthorDate: Mon Feb 10 11:11:31 2020 -0300
Make NFC and QR code re-useable in another app
---
.../java/net/taler/merchantpos/MainActivity.kt | 9 ++---
.../main/java/net/taler/merchantpos/NfcManager.kt | 39 ++++++++++++++++------
.../java/net/taler/merchantpos/QrCodeManager.kt | 26 +++++++++++++++
app/src/main/java/net/taler/merchantpos/Utils.kt | 2 +-
.../merchantpos/payment/ProcessPaymentFragment.kt | 22 +-----------
5 files changed, 60 insertions(+), 38 deletions(-)
diff --git a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
index 6bbcea1..4206b51 100644
--- a/app/src/main/java/net/taler/merchantpos/MainActivity.kt
+++ b/app/src/main/java/net/taler/merchantpos/MainActivity.kt
@@ -4,7 +4,6 @@ import android.content.Intent
import android.content.Intent.ACTION_MAIN
import android.content.Intent.CATEGORY_HOME
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
-import android.nfc.NfcAdapter
import android.os.Bundle
import android.view.MenuItem
import androidx.activity.viewModels
@@ -25,7 +24,6 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener {
private val model: MainViewModel by viewModels()
private val nfcManager = NfcManager()
- private var nfcAdapter: NfcAdapter? = null
private lateinit var nav: NavController
private lateinit var drawerLayout: DrawerLayout
@@ -34,10 +32,9 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- nfcAdapter = NfcAdapter.getDefaultAdapter(this)
model.paymentManager.payment.observe(this, Observer { payment ->
payment?.talerPayUri?.let {
- nfcManager.setContractUri(it)
+ nfcManager.setTagString(it)
}
})
@@ -73,12 +70,12 @@ class MainActivity : AppCompatActivity(),
OnNavigationItemSelectedListener {
public override fun onResume() {
super.onResume()
// TODO should we only read tags when a payment is to be made?
- nfcAdapter?.enableReaderMode(this, nfcManager, nfcManager.flags, null)
+ NfcManager.start(this, nfcManager)
}
public override fun onPause() {
super.onPause()
- nfcAdapter?.disableReaderMode(this)
+ NfcManager.stop(this)
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
diff --git a/app/src/main/java/net/taler/merchantpos/NfcManager.kt
b/app/src/main/java/net/taler/merchantpos/NfcManager.kt
index 083586f..d6b40b7 100644
--- a/app/src/main/java/net/taler/merchantpos/NfcManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/NfcManager.kt
@@ -1,5 +1,7 @@
package net.taler.merchantpos
+import android.app.Activity
+import android.content.Context
import android.nfc.NfcAdapter
import android.nfc.NfcAdapter.FLAG_READER_NFC_A
import android.nfc.NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
@@ -16,16 +18,34 @@ class NfcManager : NfcAdapter.ReaderCallback {
companion object {
const val TAG = "taler-merchant"
+
+ /**
+ * Enables NFC reader mode. Don't forget to call [stop] afterwards.
+ */
+ fun start(activity: Activity, nfcManager: NfcManager) {
+ getNfcAdapter(activity)?.enableReaderMode(activity, nfcManager,
nfcManager.flags, null)
+ }
+
+ /**
+ * Disables NFC reader mode. Call after [start].
+ */
+ fun stop(activity: Activity) {
+ getNfcAdapter(activity)?.disableReaderMode(activity)
+ }
+
+ private fun getNfcAdapter(context: Context): NfcAdapter? {
+ return NfcAdapter.getDefaultAdapter(context)
+ }
}
- val TALER_AID = "A0000002471001"
- val flags = FLAG_READER_NFC_A or FLAG_READER_SKIP_NDEF_CHECK
+ private val TALER_AID = "A0000002471001"
+ private val flags = FLAG_READER_NFC_A or FLAG_READER_SKIP_NDEF_CHECK
- private var contractUri: String? = null
+ private var tagString: String? = null
private var currentTag: IsoDep? = null
- fun setContractUri(contractUri: String) {
- this.contractUri = contractUri
+ fun setTagString(tagString: String) {
+ this.tagString = tagString
}
override fun onTagDiscovered(tag: Tag?) {
@@ -39,10 +59,9 @@ class NfcManager : NfcAdapter.ReaderCallback {
isoDep.transceive(apduSelectFile())
- val contractUri: String? = contractUri
-
- if (contractUri != null) {
- isoDep.transceive(apduPutTalerData(1, contractUri.toByteArray()))
+ val tagString: String? = tagString
+ if (tagString != null) {
+ isoDep.transceive(apduPutTalerData(1, tagString.toByteArray()))
}
// FIXME: use better pattern for sleeps in between requests
@@ -186,4 +205,4 @@ class NfcManager : NfcAdapter.ReaderCallback {
return stream.toByteArray()
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/taler/merchantpos/QrCodeManager.kt
b/app/src/main/java/net/taler/merchantpos/QrCodeManager.kt
new file mode 100644
index 0000000..6ec9893
--- /dev/null
+++ b/app/src/main/java/net/taler/merchantpos/QrCodeManager.kt
@@ -0,0 +1,26 @@
+package net.taler.merchantpos
+
+import android.graphics.Bitmap
+import android.graphics.Bitmap.Config.RGB_565
+import android.graphics.Color.BLACK
+import android.graphics.Color.WHITE
+import com.google.zxing.BarcodeFormat.QR_CODE
+import com.google.zxing.qrcode.QRCodeWriter
+
+object QrCodeManager {
+
+ fun makeQrCode(text: String, size: Int = 256): Bitmap {
+ val qrCodeWriter = QRCodeWriter()
+ val bitMatrix = qrCodeWriter.encode(text, QR_CODE, size, size)
+ val height = bitMatrix.height
+ val width = bitMatrix.width
+ val bmp = Bitmap.createBitmap(width, height, RGB_565)
+ for (x in 0 until width) {
+ for (y in 0 until height) {
+ bmp.setPixel(x, y, if (bitMatrix.get(x, y)) BLACK else WHITE)
+ }
+ }
+ return bmp
+ }
+
+}
diff --git a/app/src/main/java/net/taler/merchantpos/Utils.kt
b/app/src/main/java/net/taler/merchantpos/Utils.kt
index b43bc25..5ebb0b4 100644
--- a/app/src/main/java/net/taler/merchantpos/Utils.kt
+++ b/app/src/main/java/net/taler/merchantpos/Utils.kt
@@ -18,7 +18,7 @@ object Utils {
}
- private val HEX_CHARS_ARRAY = "0123456789ABCDEF".toCharArray()
+ private val HEX_CHARS_ARRAY = HEX_CHARS.toCharArray()
fun toHex(byteArray: ByteArray): String {
val result = StringBuffer()
diff --git
a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
index ec83b2c..138bff3 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -1,9 +1,5 @@
package net.taler.merchantpos.payment
-import android.graphics.Bitmap
-import android.graphics.Bitmap.Config.RGB_565
-import android.graphics.Color.BLACK
-import android.graphics.Color.WHITE
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -14,11 +10,9 @@ import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
-import com.google.zxing.BarcodeFormat.QR_CODE
-import com.google.zxing.common.BitMatrix
-import com.google.zxing.qrcode.QRCodeWriter
import kotlinx.android.synthetic.main.fragment_process_payment.*
import net.taler.merchantpos.MainViewModel
+import net.taler.merchantpos.QrCodeManager.makeQrCode
import net.taler.merchantpos.R
import net.taler.merchantpos.order.getTotalAsString
@@ -67,18 +61,4 @@ class ProcessPaymentFragment : Fragment() {
Snackbar.make(view!!, "Payment Canceled", LENGTH_SHORT).show()
}
- private fun makeQrCode(text: String): Bitmap {
- val qrCodeWriter = QRCodeWriter()
- val bitMatrix: BitMatrix = qrCodeWriter.encode(text, QR_CODE, 256, 256)
- val height = bitMatrix.height
- val width = bitMatrix.width
- val bmp = Bitmap.createBitmap(width, height, RGB_565)
- for (x in 0 until width) {
- for (y in 0 until height) {
- bmp.setPixel(x, y, if (bitMatrix.get(x, y)) BLACK else WHITE)
- }
- }
- return bmp
- }
-
}
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [taler-merchant-terminal-android] 05/19: Allow user to undo restarting the order, (continued)
- [taler-merchant-terminal-android] 05/19: Allow user to undo restarting the order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 07/19: Add ordered products to order's contract terms, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 08/19: Use actual taler icon for the app, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 09/19: Factor out NFC code from MainActivity, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 06/19: Create payments directly from the order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 04/19: Fetch merchant config from central configuration JSON, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 02/19: Add screen to process an order, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 18/19: Don't talk about NFC if it is not supported, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 14/19: Use product categories for order summary, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 11/19: Allow user to decide if they want to save password, add FORGET option, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 13/19: Make NFC and QR code re-useable in another app,
gnunet <=
- [taler-merchant-terminal-android] 15/19: Introduce different product classes for re-use in other taler apps, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 17/19: Make order sorting deterministic, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 12/19: Fix invalid product configuration, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 19/19: Check for duplicate product IDs, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 10/19: Require valid configuration before showing UI, gnunet, 2020/02/21
- [taler-merchant-terminal-android] 16/19: Allow editing order with -1 and +1 buttons, gnunet, 2020/02/21