From d40758dc02d956097dfaf2ff88f625e6086e1bb1 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 16:09:27 +0100 Subject: [PATCH 1/6] Added ability to scan mons --- .../github/nacabaro/vbhelper/MainActivity.kt | 29 ++++++++++- .../vbhelper/navigation/AppNavigation.kt | 11 +++- .../nacabaro/vbhelper/screens/ScanScreen.kt | 50 +++++++++++++++++-- .../screens/scanScreen/ReadingCharacter.kt | 41 +++++++++++++++ .../github/cfogrady/vbnfc/TagCommunicator.kt | 5 +- 5 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt index e097b1a..7f947a0 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -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 + private var nfcCharacter = MutableStateFlow(null) + // EXTRACTED DIRECTLY FROM EXAMPLE APP override fun onCreate(savedInstanceState: Bundle?) { deviceToCryptographicTransformers = getMapOfCryptographicTransformers() @@ -37,11 +46,27 @@ 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" + } + } + ) + } + // EXTRACTED DIRECTLY FROM EXAMPLE APP private fun getMapOfCryptographicTransformers(): Map { return mapOf( diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt index cd2f9cc..b0b273d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt @@ -14,7 +14,10 @@ import com.github.nacabaro.vbhelper.screens.ScanScreen import com.github.nacabaro.vbhelper.screens.StorageScreen @Composable -fun AppNavigation() { +fun AppNavigation( + onClickRead: () -> Unit, + isDoneReadingCharacter: Boolean +) { val navController = rememberNavController() Scaffold( @@ -38,7 +41,11 @@ fun AppNavigation() { StorageScreen() } composable(BottomNavItem.Scan.route) { - ScanScreen() + ScanScreen( + navController = navController, + onClickRead = onClickRead, + isDoneReadingCharacter = isDoneReadingCharacter + ) } composable(BottomNavItem.Dex.route) { DexScreen() diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt index 0f1d69b..98f5bba 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/ScanScreen.kt @@ -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 diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt new file mode 100644 index 0000000..9c7a2dc --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ReadingCharacter.kt @@ -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 diff --git a/vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt b/vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt index 1e9860c..51c6ae9 100644 --- a/vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt +++ b/vb-nfc-reader/src/main/java/com/github/cfogrady/vbnfc/TagCommunicator.kt @@ -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 } From e9eedb742942542c2ba0e06032821dbae13a4ba6 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 16:10:23 +0100 Subject: [PATCH 2/6] Started working in database initialization NOT WORKING YET --- .../nacabaro/vbhelper/database/AppDatabase.kt | 30 +++++++++++++++++++ .../nacabaro/vbhelper/di/AppContainer.kt | 7 +++++ .../vbhelper/di/DefaultAppContainer.kt | 14 +++++++++ 3 files changed, 51 insertions(+) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt new file mode 100644 index 0000000..1b6e866 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -0,0 +1,30 @@ +package com.github.nacabaro.vbhelper.database + +import androidx.room.Database +import com.github.nacabaro.vbhelper.domain.Dim +import com.github.nacabaro.vbhelper.domain.DimProgress +import com.github.nacabaro.vbhelper.domain.Evolutions +import com.github.nacabaro.vbhelper.domain.Mon +import com.github.nacabaro.vbhelper.domain.User +import com.github.nacabaro.vbhelper.domain.UserHealthData +import com.github.nacabaro.vbhelper.domain.UserMonsters +import com.github.nacabaro.vbhelper.domain.UserMonstersSpecialMissions +import com.github.nacabaro.vbhelper.domain.UserStepsData + +@Database( + version = 1, + entities = [ + Dim::class, + DimProgress::class, + Evolutions::class, + Mon::class, + User::class, + UserHealthData::class, + UserMonsters::class, + UserMonstersSpecialMissions::class, + UserStepsData::class + ] +) +abstract class AppDatabase { + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt new file mode 100644 index 0000000..4e3f963 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt @@ -0,0 +1,7 @@ +package com.github.nacabaro.vbhelper.di + +import com.github.nacabaro.vbhelper.database.AppDatabase.AppDatabase + +interface AppContainer { + val db: AppDatabase +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt new file mode 100644 index 0000000..85e9b27 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt @@ -0,0 +1,14 @@ +import android.content.Context +import androidx.room.Room +import com.github.nacabaro.vbhelper.database.AppDatabase.AppDatabase +import com.github.nacabaro.vbhelper.di.AppContainer + +class DefaultAppContainer(private val context: Context) : AppContainer { + override val db: AppDatabase by lazy { + Room.databaseBuilder( + context = context, + AppDatabase::class.java, + "internalDb" + ) + } +} \ No newline at end of file From 2f4bc9dba6b910ac633eb5afc79b645ed9b6d3d0 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 16:42:50 +0100 Subject: [PATCH 3/6] Added temporary domain objects --- .../github/nacabaro/vbhelper/daos/DiMDao.kt | 16 ++++++ .../nacabaro/vbhelper/daos/DiMProgressDao.kt | 11 +++++ .../UserMonstersTransformationHistoryDao.kt | 11 +++++ .../vbhelper/dtos/MonsterDataCombined.kt | 4 ++ .../TemporaryBECharacterData.kt | 42 ++++++++++++++++ .../TemporaryCharacterData.kt | 49 +++++++++++++++++++ .../TemporaryTransformationHistory.kt | 13 +++++ 7 files changed, 146 insertions(+) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMDao.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMProgressDao.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersTransformationHistoryDao.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/dtos/MonsterDataCombined.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMDao.kt new file mode 100644 index 0000000..a2e7d84 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMDao.kt @@ -0,0 +1,16 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.github.nacabaro.vbhelper.domain.Dim +import kotlinx.coroutines.flow.Flow + +@Dao +interface DiMDao { + @Insert + suspend fun insertNewDim(dim: Dim) + + @Query("SELECT * FROM Dim") + fun getAllDims(): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMProgressDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMProgressDao.kt new file mode 100644 index 0000000..7f6c913 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DiMProgressDao.kt @@ -0,0 +1,11 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Upsert +import com.github.nacabaro.vbhelper.domain.DimProgress + +@Dao +interface DiMProgressDao { + @Upsert + suspend fun updateDimProgress(vararg dimProgress: DimProgress) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersTransformationHistoryDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersTransformationHistoryDao.kt new file mode 100644 index 0000000..fff417d --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersTransformationHistoryDao.kt @@ -0,0 +1,11 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Insert +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryTransformationHistory + +@Dao +interface UserMonstersTransformationHistoryDao { + @Insert + fun insertTransformations(vararg transformations: TemporaryTransformationHistory) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/MonsterDataCombined.kt b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/MonsterDataCombined.kt new file mode 100644 index 0000000..cebf6f4 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/MonsterDataCombined.kt @@ -0,0 +1,4 @@ +package com.github.nacabaro.vbhelper.dtos + +class MonsterDataCombined { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt new file mode 100644 index 0000000..cff7c7e --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt @@ -0,0 +1,42 @@ +package com.github.nacabaro.vbhelper.temporary_domain + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey +import com.github.cfogrady.vbnfc.be.FirmwareVersion +import com.github.cfogrady.vbnfc.data.NfcCharacter + +@Entity( + foreignKeys = [ + ForeignKey( + entity = TemporaryCharacterData::class, + parentColumns = ["id"], + childColumns = ["userId"], + onDelete = ForeignKey.CASCADE + ) + ] +) +data class TemporaryBECharacterData ( + @PrimaryKey(autoGenerate = true) val id: Int, + val trainingHp: UShort, + val trainingAp: UShort, + val trainingBp: UShort, + val remainingTrainingTimeInMinutes: UShort, + val itemEffectMentalStateValue: Byte, + val itemEffectMentalStateMinutesRemaining: Byte, + val itemEffectActivityLevelValue: Byte, + val itemEffectActivityLevelMinutesRemaining: Byte, + val itemEffectVitalPointsChangeValue: Byte, + val itemEffectVitalPointsChangeMinutesRemaining: Byte, + val abilityRarity: NfcCharacter.AbilityRarity, + val abilityType: UShort, + val abilityBranch: UShort, + val abilityReset: Byte, + val rank: Byte, + val itemType: Byte, + val itemMultiplier: Byte, + val itemRemainingTime: Byte, + val otp0: String, + val otp1: String, + var characterCreationFirmwareVersion: FirmwareVersion, +) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt new file mode 100644 index 0000000..640328d --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt @@ -0,0 +1,49 @@ +package com.github.nacabaro.vbhelper.temporary_domain + +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.github.cfogrady.vbnfc.data.NfcCharacter + +/* +dimId=16, +charIndex=8, +stage=4, +attribute=Free, +ageInDays=0, +nextAdventureMissionStage=9, +mood=99, +vitalPoints=9999, +transformationCountdown=1101, +injuryStatus=None, +trophies=0, +currentPhaseBattlesWon=19, +currentPhaseBattlesLost=4, +totalBattlesWon=36, +totalBattlesLost=10, +activityLevel=0, +heartRateCurrent=71, +*/ + + +@Entity +data class TemporaryCharacterData ( + @PrimaryKey(autoGenerate = true) val id: Int, + val dimId: UShort, + var charIndex: UShort, + var stage: Byte, + var attribute: NfcCharacter.Attribute, + var ageInDays: Byte, + var nextAdventureMissionStage: Byte, // next adventure mission stage on the character's dim + var mood: Byte, + var vitalPoints: UShort, + var transformationCountdown: UShort, + var injuryStatus: NfcCharacter.InjuryStatus, + var trophies: UShort, + var currentPhaseBattlesWon: UShort, + var currentPhaseBattlesLost: UShort, + var totalBattlesWon: UShort, + var totalBattlesLost: UShort, + var activityLevel: Byte, + var heartRateCurrent: UByte, + var transformationHistory: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt new file mode 100644 index 0000000..4b23364 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt @@ -0,0 +1,13 @@ +package com.github.nacabaro.vbhelper.temporary_domain + +import androidx.room.Entity + +@Entity +// Bit lazy, will correct later... +data class TemporaryTransformationHistory ( + val monId: Int, + val toCharIndex: Byte, + val yearsSince1988: Byte, + val month: Byte, + val day: Byte +) From 2f0555484e4c7da53d529042684dcfb505aa6bd0 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 16:47:25 +0100 Subject: [PATCH 4/6] Forgot to reset the state of the scan... Thus making scan innaccessible --- app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt | 3 +++ .../com/github/nacabaro/vbhelper/navigation/AppNavigation.kt | 2 ++ 2 files changed, 5 insertions(+) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt index 7f947a0..d4c61a6 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -63,6 +63,9 @@ class MainActivity : ComponentActivity() { isDoneReadingCharacter = true "Done reading character" } + }, + onClickScan = { + isDoneReadingCharacter = false } ) } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt index b0b273d..828bfcc 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt @@ -16,6 +16,7 @@ import com.github.nacabaro.vbhelper.screens.StorageScreen @Composable fun AppNavigation( onClickRead: () -> Unit, + onClickScan: () -> Unit, isDoneReadingCharacter: Boolean ) { val navController = rememberNavController() @@ -41,6 +42,7 @@ fun AppNavigation( StorageScreen() } composable(BottomNavItem.Scan.route) { + onClickScan() ScanScreen( navController = navController, onClickRead = onClickRead, From 859786c7f3374b1787510664f7e83e1bba002a51 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 16:51:11 +0100 Subject: [PATCH 5/6] Updating database with temporary daos in order to have an MVP Will be changing this to the pre-established model once I sort out DiM/BEM import --- .../nacabaro/vbhelper/daos/UserMonstersDao.kt | 15 +++++++++++++++ .../nacabaro/vbhelper/database/AppDatabase.kt | 18 ++++++++---------- .../nacabaro/vbhelper/di/AppContainer.kt | 2 +- .../vbhelper/di/DefaultAppContainer.kt | 6 +++--- 4 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersDao.kt diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersDao.kt new file mode 100644 index 0000000..c98edfe --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserMonstersDao.kt @@ -0,0 +1,15 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.github.nacabaro.vbhelper.domain.UserMonsters + +@Dao +interface UserMonstersDao { + @Insert + fun insertUserMonsters(userMonsters: UserMonsters) + + @Query("SELECT * FROM UserMonsters WHERE userId = :userId") + fun getUserMonsters(userId: Int): List +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt index 1b6e866..5dc00c9 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -1,6 +1,7 @@ package com.github.nacabaro.vbhelper.database import androidx.room.Database +import androidx.room.RoomDatabase import com.github.nacabaro.vbhelper.domain.Dim import com.github.nacabaro.vbhelper.domain.DimProgress import com.github.nacabaro.vbhelper.domain.Evolutions @@ -10,21 +11,18 @@ import com.github.nacabaro.vbhelper.domain.UserHealthData import com.github.nacabaro.vbhelper.domain.UserMonsters import com.github.nacabaro.vbhelper.domain.UserMonstersSpecialMissions import com.github.nacabaro.vbhelper.domain.UserStepsData +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryBECharacterData +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryCharacterData +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryTransformationHistory @Database( version = 1, entities = [ - Dim::class, - DimProgress::class, - Evolutions::class, - Mon::class, - User::class, - UserHealthData::class, - UserMonsters::class, - UserMonstersSpecialMissions::class, - UserStepsData::class + TemporaryCharacterData::class, + TemporaryBECharacterData::class, + TemporaryTransformationHistory::class ] ) -abstract class AppDatabase { +abstract class AppDatabase : RoomDatabase() { } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt index 4e3f963..239b946 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/AppContainer.kt @@ -1,6 +1,6 @@ package com.github.nacabaro.vbhelper.di -import com.github.nacabaro.vbhelper.database.AppDatabase.AppDatabase +import com.github.nacabaro.vbhelper.database.AppDatabase interface AppContainer { val db: AppDatabase diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt index 85e9b27..f83cfa8 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt @@ -1,14 +1,14 @@ import android.content.Context import androidx.room.Room -import com.github.nacabaro.vbhelper.database.AppDatabase.AppDatabase +import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.di.AppContainer class DefaultAppContainer(private val context: Context) : AppContainer { override val db: AppDatabase by lazy { Room.databaseBuilder( context = context, - AppDatabase::class.java, + klass = AppDatabase::class.java, "internalDb" - ) + ).build() } } \ No newline at end of file From 08e3b844a48b8326f01f6695110ea6cb70dda101 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 4 Jan 2025 18:49:16 +0100 Subject: [PATCH 6/6] =?UTF-8?q?A=20few=20things=20here=20-=20Adding=20new?= =?UTF-8?q?=20mons=20is=20working=20-=20database=20is=20also=20working=20(?= =?UTF-8?q?a=C3=B1lthough=20we=20are=20using=20a=20temporary=20domain=20mo?= =?UTF-8?q?del)=20-=20Insertion=20should=20be=20working=20too=20-=20I=20us?= =?UTF-8?q?ed=20an=20appcontainer=20for=20the=20dependency=20injection,=20?= =?UTF-8?q?maybe=20this=20is=20not=20the=20best=20approach,=20but=20I=20do?= =?UTF-8?q?n't=20really=20know=20any=20other=20approaches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Known bug: - When inserting a new mon, you need to reload the app in order for the storage view to refresh correctly, I don't know what happens and why, probably because I did not create a proper ViewModel to accompany the storage part... currently this is very barebones, but it works! --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 1 + .../github/nacabaro/vbhelper/MainActivity.kt | 103 +++++++++++++++++- .../nacabaro/vbhelper/database/AppDatabase.kt | 11 +- .../github/nacabaro/vbhelper/di/VBHelper.kt | 13 +++ .../vbhelper/screens/StorageScreen.kt | 47 +++++++- .../vbhelper/source/StorageRepository.kt | 12 ++ .../temporary_daos/TemporaryMonsterDao.kt | 27 +++++ .../TemporaryBECharacterData.kt | 40 +++---- .../TemporaryCharacterData.kt | 54 +++------ .../TemporaryTransformationHistory.kt | 22 +++- .../nacabaro/vbhelper/vm/StorageViewModel.kt | 2 + 12 files changed, 254 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/di/VBHelper.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/vm/StorageViewModel.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9c3bdf7..814ed65 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -46,6 +46,7 @@ dependencies { ksp(libs.androidx.room.compiler) annotationProcessor(libs.androidx.room.compiler) implementation(libs.androidx.core.ktx) + implementation("androidx.room:room-ktx:2.6.1") implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2492ae6..d3a5163 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ { return mapOf( Pair(DeviceType.VitalBraceletBEDeviceType, - CryptographicTransformer(readableHmacKey1 = resources.getString(com.github.cfogrady.vbnfc.R.string.password1), - readableHmacKey2 = resources.getString(com.github.cfogrady.vbnfc.R.string.password2), - aesKey = resources.getString(com.github.cfogrady.vbnfc.R.string.decryptionKey), - substitutionCipher = resources.getIntArray(com.github.cfogrady.vbnfc.R.array.substitutionArray))), + CryptographicTransformer(readableHmacKey1 = resources.getString(R.string.password1), + readableHmacKey2 = resources.getString(R.string.password2), + aesKey = resources.getString(R.string.decryptionKey), + substitutionCipher = resources.getIntArray(R.array.substitutionArray))), // Pair(DeviceType.VitalSeriesDeviceType, // CryptographicTransformer(hmacKey1 = resources.getString(R.string.password1), // hmacKey2 = resources.getString(R.string.password2), @@ -138,4 +147,88 @@ class MainActivity : ComponentActivity() { nfcAdapter.disableReaderMode(this) } } + + // + /* + TODO: + - Make it able to detect the different model of watches + - Support for regular VB + + The good news is that the theory behind inserting to the database should be working + now, it's a matter of implementing the functionality to parse dim/bem cards and use my + domain model. + */ + private fun addCharacterScannedIntoDatabase() { + val beCharacter = nfcCharacter as MutableStateFlow + val temporaryCharacterData = TemporaryCharacterData( + dimId = nfcCharacter.value!!.dimId.toInt(), + charIndex = nfcCharacter.value!!.charIndex.toInt(), + stage = nfcCharacter.value!!.stage.toInt(), + attribute = nfcCharacter.value!!.attribute, + ageInDays = nfcCharacter.value!!.ageInDays.toInt(), + nextAdventureMissionStage = nfcCharacter.value!!.nextAdventureMissionStage.toInt(), + mood = nfcCharacter.value!!.mood.toInt(), + vitalPoints = nfcCharacter.value!!.vitalPoints.toInt(), + transformationCountdown = nfcCharacter.value!!.transformationCountdown.toInt(), + injuryStatus = nfcCharacter.value!!.injuryStatus, + trophies = nfcCharacter.value!!.trophies.toInt(), + currentPhaseBattlesWon = nfcCharacter.value!!.currentPhaseBattlesWon.toInt(), + currentPhaseBattlesLost = nfcCharacter.value!!.currentPhaseBattlesLost.toInt(), + totalBattlesWon = nfcCharacter.value!!.totalBattlesWon.toInt(), + totalBattlesLost = nfcCharacter.value!!.totalBattlesLost.toInt(), + activityLevel = nfcCharacter.value!!.activityLevel.toInt(), + heartRateCurrent = nfcCharacter.value!!.heartRateCurrent.toInt() + ) + + val application = applicationContext as VBHelper + val storageRepository = application.container.db + val characterId = storageRepository + .temporaryMonsterDao() + .insertCharacterData(temporaryCharacterData) + + val temporaryBECharacterData = TemporaryBECharacterData( + id = characterId, + trainingHp = beCharacter.value!!.trainingHp.toInt(), + trainingAp = beCharacter.value!!.trainingAp.toInt(), + trainingBp = beCharacter.value!!.trainingBp.toInt(), + remainingTrainingTimeInMinutes = beCharacter.value!!.remainingTrainingTimeInMinutes.toInt(), + itemEffectActivityLevelValue = beCharacter.value!!.itemEffectActivityLevelValue.toInt(), + itemEffectMentalStateValue = beCharacter.value!!.itemEffectMentalStateValue.toInt(), + itemEffectMentalStateMinutesRemaining = beCharacter.value!!.itemEffectMentalStateMinutesRemaining.toInt(), + itemEffectActivityLevelMinutesRemaining = beCharacter.value!!.itemEffectActivityLevelMinutesRemaining.toInt(), + itemEffectVitalPointsChangeValue = beCharacter.value!!.itemEffectVitalPointsChangeValue.toInt(), + itemEffectVitalPointsChangeMinutesRemaining = beCharacter.value!!.itemEffectVitalPointsChangeMinutesRemaining.toInt(), + abilityRarity = beCharacter.value!!.abilityRarity, + abilityType = beCharacter.value!!.abilityType.toInt(), + abilityBranch = beCharacter.value!!.abilityBranch.toInt(), + abilityReset = beCharacter.value!!.abilityReset.toInt(), + rank = beCharacter.value!!.abilityReset.toInt(), + itemType = beCharacter.value!!.itemType.toInt(), + itemMultiplier = beCharacter.value!!.itemMultiplier.toInt(), + itemRemainingTime = beCharacter.value!!.itemRemainingTime.toInt(), + otp0 = "", //beCharacter.value!!.otp0.toString(), + otp1 = "", //beCharacter.value!!.otp1.toString(), + minorVersion = beCharacter.value!!.characterCreationFirmwareVersion.minorVersion.toInt(), + majorVersion = beCharacter.value!!.characterCreationFirmwareVersion.majorVersion.toInt(), + ) + + storageRepository + .temporaryMonsterDao() + .insertBECharacterData(temporaryBECharacterData) + + val transformationHistoryWatch = beCharacter.value!!.transformationHistory + val domainTransformationHistory = transformationHistoryWatch.map { item -> + TemporaryTransformationHistory( + monId = characterId, + toCharIndex = item.toCharIndex.toInt(), + yearsSince1988 = item.yearsSince1988.toInt(), + month = item.month.toInt(), + day = item.day.toInt() + ) + } + + storageRepository + .temporaryMonsterDao() + .insertTransformationHistory(*domainTransformationHistory.toTypedArray()) + } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt index 5dc00c9..c143009 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -2,15 +2,7 @@ package com.github.nacabaro.vbhelper.database import androidx.room.Database import androidx.room.RoomDatabase -import com.github.nacabaro.vbhelper.domain.Dim -import com.github.nacabaro.vbhelper.domain.DimProgress -import com.github.nacabaro.vbhelper.domain.Evolutions -import com.github.nacabaro.vbhelper.domain.Mon -import com.github.nacabaro.vbhelper.domain.User -import com.github.nacabaro.vbhelper.domain.UserHealthData -import com.github.nacabaro.vbhelper.domain.UserMonsters -import com.github.nacabaro.vbhelper.domain.UserMonstersSpecialMissions -import com.github.nacabaro.vbhelper.domain.UserStepsData +import com.github.nacabaro.vbhelper.temporary_daos.TemporaryMonsterDao import com.github.nacabaro.vbhelper.temporary_domain.TemporaryBECharacterData import com.github.nacabaro.vbhelper.temporary_domain.TemporaryCharacterData import com.github.nacabaro.vbhelper.temporary_domain.TemporaryTransformationHistory @@ -24,5 +16,6 @@ import com.github.nacabaro.vbhelper.temporary_domain.TemporaryTransformationHist ] ) abstract class AppDatabase : RoomDatabase() { + abstract fun temporaryMonsterDao(): TemporaryMonsterDao } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/VBHelper.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/VBHelper.kt new file mode 100644 index 0000000..0c66c99 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/VBHelper.kt @@ -0,0 +1,13 @@ +package com.github.nacabaro.vbhelper.di + +import DefaultAppContainer +import android.app.Application + +class VBHelper : Application() { + lateinit var container: DefaultAppContainer + + override fun onCreate() { + super.onCreate() + container = DefaultAppContainer(applicationContext) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt index d0bc9b2..30e100b 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt @@ -1,5 +1,6 @@ package com.github.nacabaro.vbhelper.screens +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.scrollable @@ -9,35 +10,75 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Card import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.github.nacabaro.vbhelper.R import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.source.StorageRepository +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryCharacterData +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch + @Composable fun StorageScreen() { + val coroutineScope = rememberCoroutineScope() + val application = LocalContext.current.applicationContext as VBHelper + val storageRepository = StorageRepository(application.container.db) + val monList = remember { mutableStateListOf() } + + + LaunchedEffect(storageRepository) { + coroutineScope.launch { + monList.clear() + monList.addAll(storageRepository.getAllCharacters()) + Log.d("StorageScreen", "Updated data: $monList") + } + } + + Log.d("StorageScreen", "monList: $monList") + Scaffold ( topBar = { TopBanner(text = "My Digimon") } ) { contentPadding -> + if (monList.isEmpty()) { + Text( + text = "Nothing to see here", + modifier = Modifier + .padding(8.dp) + ) + } + LazyVerticalGrid( columns = GridCells.Fixed(3), modifier = Modifier .scrollable(state = rememberScrollState(), orientation = Orientation.Vertical) .padding(top = contentPadding.calculateTopPadding()) ) { - items(100) { i -> + items(monList) { index -> StorageEntry( - name = "Digimon $i", - icon = R.drawable.baseline_question_mark_24 + name = index.dimId.toString() + " - " + index.charIndex.toString(), + icon = R.drawable.ic_launcher_foreground, + modifier = Modifier + .padding(8.dp) ) } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt new file mode 100644 index 0000000..bf3e035 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt @@ -0,0 +1,12 @@ +package com.github.nacabaro.vbhelper.source + +import com.github.nacabaro.vbhelper.database.AppDatabase +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryCharacterData + +class StorageRepository ( + private val db: AppDatabase +) { + suspend fun getAllCharacters(): List { + return db.temporaryMonsterDao().getAllCharacters() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt new file mode 100644 index 0000000..33283ab --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt @@ -0,0 +1,27 @@ +package com.github.nacabaro.vbhelper.temporary_daos + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryBECharacterData +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryCharacterData +import com.github.nacabaro.vbhelper.temporary_domain.TemporaryTransformationHistory + +@Dao +interface TemporaryMonsterDao { + @Insert + fun insertCharacterData(temporaryCharacterData: TemporaryCharacterData): Int + + @Insert + fun insertBECharacterData(temporaryBECharacterData: TemporaryBECharacterData) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertTransformationHistory(vararg transformationHistory: TemporaryTransformationHistory) + + @Query("SELECT * FROM TemporaryTransformationHistory WHERE monId = :monId") + fun getTransformationHistory(monId: Int): List + + @Query("SELECT * FROM TemporaryCharacterData") + suspend fun getAllCharacters(): List +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt index cff7c7e..f7e2674 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryBECharacterData.kt @@ -3,6 +3,7 @@ package com.github.nacabaro.vbhelper.temporary_domain import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey +import com.github.cfogrady.vbnfc.be.BENfcCharacter import com.github.cfogrady.vbnfc.be.FirmwareVersion import com.github.cfogrady.vbnfc.data.NfcCharacter @@ -11,32 +12,33 @@ import com.github.cfogrady.vbnfc.data.NfcCharacter ForeignKey( entity = TemporaryCharacterData::class, parentColumns = ["id"], - childColumns = ["userId"], + childColumns = ["id"], onDelete = ForeignKey.CASCADE ) ] ) data class TemporaryBECharacterData ( @PrimaryKey(autoGenerate = true) val id: Int, - val trainingHp: UShort, - val trainingAp: UShort, - val trainingBp: UShort, - val remainingTrainingTimeInMinutes: UShort, - val itemEffectMentalStateValue: Byte, - val itemEffectMentalStateMinutesRemaining: Byte, - val itemEffectActivityLevelValue: Byte, - val itemEffectActivityLevelMinutesRemaining: Byte, - val itemEffectVitalPointsChangeValue: Byte, - val itemEffectVitalPointsChangeMinutesRemaining: Byte, + val trainingHp: Int, + val trainingAp: Int, + val trainingBp: Int, + val remainingTrainingTimeInMinutes: Int, + val itemEffectMentalStateValue: Int, + val itemEffectMentalStateMinutesRemaining: Int, + val itemEffectActivityLevelValue: Int, + val itemEffectActivityLevelMinutesRemaining: Int, + val itemEffectVitalPointsChangeValue: Int, + val itemEffectVitalPointsChangeMinutesRemaining: Int, val abilityRarity: NfcCharacter.AbilityRarity, - val abilityType: UShort, - val abilityBranch: UShort, - val abilityReset: Byte, - val rank: Byte, - val itemType: Byte, - val itemMultiplier: Byte, - val itemRemainingTime: Byte, + val abilityType: Int, + val abilityBranch: Int, + val abilityReset: Int, + val rank: Int, + val itemType: Int, + val itemMultiplier: Int, + val itemRemainingTime: Int, val otp0: String, val otp1: String, - var characterCreationFirmwareVersion: FirmwareVersion, + val minorVersion: Int, + val majorVersion: Int, ) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt index 640328d..e3cc6b6 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryCharacterData.kt @@ -4,46 +4,24 @@ import androidx.room.Entity import androidx.room.PrimaryKey import com.github.cfogrady.vbnfc.data.NfcCharacter -/* -dimId=16, -charIndex=8, -stage=4, -attribute=Free, -ageInDays=0, -nextAdventureMissionStage=9, -mood=99, -vitalPoints=9999, -transformationCountdown=1101, -injuryStatus=None, -trophies=0, -currentPhaseBattlesWon=19, -currentPhaseBattlesLost=4, -totalBattlesWon=36, -totalBattlesLost=10, -activityLevel=0, -heartRateCurrent=71, -*/ - - @Entity data class TemporaryCharacterData ( - @PrimaryKey(autoGenerate = true) val id: Int, - val dimId: UShort, - var charIndex: UShort, - var stage: Byte, + @PrimaryKey(autoGenerate = true) val id: Int = 0, + val dimId: Int, + var charIndex: Int, + var stage: Int, var attribute: NfcCharacter.Attribute, - var ageInDays: Byte, - var nextAdventureMissionStage: Byte, // next adventure mission stage on the character's dim - var mood: Byte, - var vitalPoints: UShort, - var transformationCountdown: UShort, + var ageInDays: Int, + var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim + var mood: Int, + var vitalPoints: Int, + var transformationCountdown: Int, var injuryStatus: NfcCharacter.InjuryStatus, - var trophies: UShort, - var currentPhaseBattlesWon: UShort, - var currentPhaseBattlesLost: UShort, - var totalBattlesWon: UShort, - var totalBattlesLost: UShort, - var activityLevel: Byte, - var heartRateCurrent: UByte, - var transformationHistory: Int + var trophies: Int, + var currentPhaseBattlesWon: Int, + var currentPhaseBattlesLost: Int, + var totalBattlesWon: Int, + var totalBattlesLost: Int, + var activityLevel: Int, + var heartRateCurrent: Int, ) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt index 4b23364..75ed5ca 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_domain/TemporaryTransformationHistory.kt @@ -1,13 +1,25 @@ package com.github.nacabaro.vbhelper.temporary_domain import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey -@Entity +@Entity( + foreignKeys = [ + ForeignKey( + entity = TemporaryCharacterData::class, + parentColumns = ["id"], + childColumns = ["monId"], + onDelete = ForeignKey.CASCADE + ) + ] +) // Bit lazy, will correct later... data class TemporaryTransformationHistory ( + @PrimaryKey(autoGenerate = true) val id: Int = 0, val monId: Int, - val toCharIndex: Byte, - val yearsSince1988: Byte, - val month: Byte, - val day: Byte + val toCharIndex: Int, + val yearsSince1988: Int, + val month: Int, + val day: Int ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/vm/StorageViewModel.kt b/app/src/main/java/com/github/nacabaro/vbhelper/vm/StorageViewModel.kt new file mode 100644 index 0000000..9b01721 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/vm/StorageViewModel.kt @@ -0,0 +1,2 @@ +package com.github.nacabaro.vbhelper.vm +