M app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt => app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +30 -2
@@ 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(
M app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt => app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt +11 -2
@@ 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()
M app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt +45 -5
@@ 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
+ )
}=
\ No newline at end of file
A app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt +41 -0
@@ 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")
+ }
+ }
+ }
+}<
\ No newline at end of file
M vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt => vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt +3 -2
@@ 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
}