gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]