Merge branch 'refs/heads/nfc/reading_character' into database/initialise

This commit is contained in:
Nacho 2025-01-04 17:35:50 +01:00
commit fbbb8f6ad1
5 changed files with 130 additions and 11 deletions

View File

@ -10,16 +10,25 @@ import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.github.nacabaro.vbhelper.navigation.AppNavigation
import com.github.cfogrady.vbnfc.CryptographicTransformer
import com.github.cfogrady.vbnfc.TagCommunicator
import com.github.cfogrady.vbnfc.data.DeviceType
import com.github.nacabaro.vbhelper.navigation.AppNavigation
import com.github.cfogrady.vbnfc.data.NfcCharacter
import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme
import kotlinx.coroutines.flow.MutableStateFlow
class MainActivity : ComponentActivity() {
private lateinit var nfcAdapter: NfcAdapter
private lateinit var deviceToCryptographicTransformers: Map<UShort, CryptographicTransformer>
private var nfcCharacter = MutableStateFlow<NfcCharacter?>(null)
// EXTRACTED DIRECTLY FROM EXAMPLE APP
override fun onCreate(savedInstanceState: Bundle?) {
deviceToCryptographicTransformers = getMapOfCryptographicTransformers()
@ -37,11 +46,30 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
VBHelperTheme {
AppNavigation()
MainApplication()
}
}
}
@Composable
private fun MainApplication() {
var isDoneReadingCharacter by remember { mutableStateOf(false) }
AppNavigation(
isDoneReadingCharacter = isDoneReadingCharacter,
onClickRead = {
handleTag {
val character = it.receiveCharacter()
nfcCharacter.value = character
isDoneReadingCharacter = true
"Done reading character"
}
},
onClickScan = {
isDoneReadingCharacter = false
}
)
}
// EXTRACTED DIRECTLY FROM EXAMPLE APP
private fun getMapOfCryptographicTransformers(): Map<UShort, CryptographicTransformer> {
return mapOf(

View File

@ -14,7 +14,11 @@ import com.github.nacabaro.vbhelper.screens.ScanScreen
import com.github.nacabaro.vbhelper.screens.StorageScreen
@Composable
fun AppNavigation() {
fun AppNavigation(
onClickRead: () -> Unit,
onClickScan: () -> Unit,
isDoneReadingCharacter: Boolean
) {
val navController = rememberNavController()
Scaffold(
@ -38,7 +42,12 @@ fun AppNavigation() {
StorageScreen()
}
composable(BottomNavItem.Scan.route) {
ScanScreen()
onClickScan()
ScanScreen(
navController = navController,
onClickRead = onClickRead,
isDoneReadingCharacter = isDoneReadingCharacter
)
}
composable(BottomNavItem.Dex.route) {
DexScreen()

View File

@ -10,17 +10,52 @@ import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.github.nacabaro.vbhelper.components.TopBanner
import com.github.nacabaro.vbhelper.navigation.BottomNavItem
import com.github.nacabaro.vbhelper.screens.scanScreen.ReadingCharacterScreen
@Composable
fun ScanScreen() {
Scaffold (
topBar = { TopBanner(text = "Scan a Vital Bracelet") }
fun ScanScreen(
navController: NavController,
onClickRead: () -> Unit,
isDoneReadingCharacter: Boolean
) {
var readingScreen by remember { mutableStateOf(false) }
if (isDoneReadingCharacter) {
readingScreen = false
navController.navigate(BottomNavItem.Home.route)
}
if (readingScreen) {
ReadingCharacterScreen { readingScreen = false }
} else {
ChooseConnectOption(
onClickRead = {
readingScreen = true
onClickRead()
},
)
}
}
@Composable
private fun ChooseConnectOption(
onClickRead: () -> Unit,
) {
Scaffold(
topBar = { TopBanner(text = "Scan a Vital Bracelet") }
) { contentPadding ->
Column(
verticalArrangement = Arrangement.Center,
@ -31,7 +66,7 @@ fun ScanScreen() {
) {
ScanButton(
text = "Vital Bracelet to App",
onClick = {}
onClick = onClickRead
)
Spacer(modifier = Modifier.height(16.dp))
ScanButton(
@ -42,6 +77,7 @@ fun ScanScreen() {
}
}
@Composable
fun ScanButton(
text: String,
@ -64,5 +100,9 @@ fun ScanButton(
@Preview(showBackground = true)
@Composable
fun ScanScreenPreview() {
ScanScreen()
ScanScreen(
navController = rememberNavController(),
onClickRead = { },
isDoneReadingCharacter = false
)
}

View File

@ -0,0 +1,41 @@
package com.github.nacabaro.vbhelper.screens.scanScreen
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.github.nacabaro.vbhelper.components.TopBanner
@Composable
fun ReadingCharacterScreen(
onClickCancel: () -> Unit,
) {
Scaffold (
topBar = {
TopBanner("Reading Character")
}
) { innerPadding ->
Column (
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier
.padding(innerPadding)
.fillMaxSize()
) {
Text("Place your Vital Bracelet near the reader...")
Button(
onClick = onClickCancel,
modifier = Modifier.padding(16.dp)
) {
Text("Cancel")
}
}
}
}

View File

@ -69,8 +69,9 @@ class TagCommunicator(
checksumCalculator.checkChecksums(decryptedCharacterData)
val nfcCharacter = translator.parseNfcCharacter(decryptedCharacterData)
Log.i(TAG, "Known Character Stats: $nfcCharacter")
Log.i(TAG, "Signaling operation complete")
nfcData.transceive(translator.getOperationCommandBytes(header, OPERATION_TRANSFERRED_TO_APP))
// Not ready to lose any of my mons in this...
//Log.i(TAG, "Signaling operation complete")
//nfcData.transceive(translator.getOperationCommandBytes(header, OPERATION_TRANSFERRED_TO_APP))
return nfcCharacter
}