Skip to content

Commit

Permalink
Store nfc tag data
Browse files Browse the repository at this point in the history
  • Loading branch information
andras-adam committed Oct 13, 2022
1 parent c1394b2 commit 1e47d51
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.nfc.tech.MifareClassic
import android.util.Log
import java.io.IOException

class MifareClassicHelper(tag: MifareClassic) {
class MifareClassicInfo(tag: MifareClassic) {
val timeout: Int
val maxTransceiveLength: Int
val size: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.nfc.tech.MifareUltralight
import android.util.Log
import java.io.IOException

class MifareUltralightHelper(tag: MifareUltralight) {
class MifareUltralightInfo(tag: MifareUltralight) {
val type: Int
val timeout: Int
val maxTransceiveLength: Int
Expand Down
21 changes: 10 additions & 11 deletions app/src/main/java/com/virtualtag/app/data/ScanningViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,22 @@ import android.nfc.NfcAdapter
import android.nfc.Tag
import android.nfc.tech.MifareClassic
import android.nfc.tech.MifareUltralight
import android.nfc.tech.NfcA
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.io.IOException

// Byte array to HEX helper
fun ByteArray.toHex(): String = joinToString(separator = "") { "%02x".format(it) }

class ScanningViewModel : ViewModel() {
// Currently scanned tag
// Currently scanned tag, mifare classic and ultralight information
private val _scannedTag by lazy { MutableLiveData<Tag>() }
val scannedTag = _scannedTag as LiveData<Tag>
private val _mifareClassicInfo by lazy { MutableLiveData<MifareClassicInfo>() }
val mifareClassicInfo = _mifareClassicInfo as LiveData<MifareClassicInfo>
private val _mifareUltralightInfo by lazy { MutableLiveData<MifareUltralightInfo>() }
val mifareUltralightInfo = _mifareUltralightInfo as LiveData<MifareUltralightInfo>

// Is scanning allowed state variable
private var isScanning = false
Expand Down Expand Up @@ -71,18 +73,15 @@ class ScanningViewModel : ViewModel() {
if (intent?.action == NfcAdapter.ACTION_TECH_DISCOVERED) {
val tag: Tag? = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
Log.i("NFC", "scanned ${tag?.id?.toHex()}")
_scannedTag.value = tag
//
if (tag?.techList?.contains(MifareClassic::class.java.name) == true) {
val mfc = MifareClassic.get(scannedTag.value)
val data = MifareClassicHelper(mfc)
Log.d("MFC", data.data)
val mfc = MifareClassic.get(tag)
_mifareClassicInfo.value = MifareClassicInfo(mfc)
}
if (tag?.techList?.contains(MifareUltralight::class.java.name) == true) {
val mfu = MifareUltralight.get(scannedTag.value)
val data = MifareUltralightHelper(mfu)
Log.d("MFU", data.data)
val mfu = MifareUltralight.get(tag)
_mifareUltralightInfo.value = MifareUltralightInfo(mfu)
}
_scannedTag.value = tag
}
}
}
24 changes: 22 additions & 2 deletions app/src/main/java/com/virtualtag/app/db/Card.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,29 @@ data class Card(
*/
@PrimaryKey
val id: String,
// TODO - figure out what kind of card data to save (Tag cannot be saved in Room)
// val data: Tag,
val name: String,
val color: String,
val techList: String,

// NfcA properties
val nfcaAtqa: String? = null,
val nfcaSak: Int? = null,
val nfcaTimeout: Int? = null,
val nfcaMaxTransceiveLength: Int? = null,

// MifareClassic properties
val mifareClassicTimeout: Int? = null,
val mifareClassicMaxTransceiveLength: Int? = null,
val mifareClassicSize: Int? = null,
val mifareClassicType: Int? = null,
val mifareClassicSectorCount: Int? = null,
val mifareClassicBlockCount: Int? = null,
val mifareClassicData: String? = null,

// MifareUltralight properties
val mifareUltralightType: Int? = null,
val mifareUltralightTimeout: Int? = null,
val mifareUltralightMaxTransceiveLength: Int? = null,
val mifareUltralightData: String? = null,

)
4 changes: 2 additions & 2 deletions app/src/main/java/com/virtualtag/app/db/CardDatabase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.room.RoomDatabase

@Database(
entities = [Card::class],
version = 1
version = 2
)
abstract class CardDB : RoomDatabase() {
abstract fun cardDao(): CardDao
Expand All @@ -23,7 +23,7 @@ abstract class CardDB : RoomDatabase() {
Room.databaseBuilder(
context.applicationContext,
CardDB::class.java, "cards.db"
).build()
).fallbackToDestructiveMigration().build()
}
return sInstance!!
}
Expand Down
40 changes: 33 additions & 7 deletions app/src/main/java/com/virtualtag/app/ui/screens/AddScreen.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.virtualtag.app.ui.screens

import android.nfc.tech.MifareClassic
import android.nfc.tech.MifareUltralight
import android.nfc.tech.NfcA
import android.util.Log
import android.widget.Toast
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
Expand Down Expand Up @@ -35,19 +39,41 @@ fun AddScreen(
) {
val context = LocalContext.current
val scannedTag = scanningViewModel.scannedTag.observeAsState()
val tagId = scannedTag.value?.id?.toHex() ?: "0"
val mifareClassicInfo = scanningViewModel.mifareClassicInfo.observeAsState()
val mifareUltralightInfo = scanningViewModel.mifareUltralightInfo.observeAsState()

var name by remember { mutableStateOf(TextFieldValue("")) }
var color by remember { mutableStateOf("#fff8f8f8") }

fun addCardToDb() {
model.addCard(
Card(
id = tagId,
name = name.text,
color = color
)

// Construct card
val card = Card(
id = scannedTag.value?.id?.toHex() ?: "0",
name = name.text,
color = color,
techList = scannedTag.value?.techList?.joinToString(",") ?: "",
// nfcaAtqa = nfca?.atqa?.toHex(),
// nfcaSak = nfca?.sak?.toInt(),
// nfcaTimeout = nfca?.timeout,
// nfcaMaxTransceiveLength = nfca?.maxTransceiveLength,
mifareClassicTimeout = mifareClassicInfo.value?.timeout,
mifareClassicMaxTransceiveLength = mifareClassicInfo.value?.maxTransceiveLength,
mifareClassicSize = mifareClassicInfo.value?.size,
mifareClassicType = mifareClassicInfo.value?.type,
mifareClassicSectorCount = mifareClassicInfo.value?.sectorCount,
mifareClassicBlockCount = mifareClassicInfo.value?.blockCount,
mifareClassicData = mifareClassicInfo.value?.data,
mifareUltralightType = mifareUltralightInfo.value?.type,
mifareUltralightTimeout = mifareUltralightInfo.value?.timeout,
mifareUltralightMaxTransceiveLength = mifareUltralightInfo.value?.maxTransceiveLength,
mifareUltralightData = mifareUltralightInfo.value?.data,
)

Log.d("ADDING CARD", card.toString())

//
model.addCard(card)
Toast.makeText(context, context.getString(R.string.card_added_success), Toast.LENGTH_SHORT)
.show()
goHome()
Expand Down

0 comments on commit 1e47d51

Please sign in to comment.