diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt index a6f5993..172f303 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt @@ -28,27 +28,8 @@ interface CharacterDao { FROM Character c JOIN UserCharacter uc ON c.id = uc.charId JOIN Card d ON c.dimId = d.id - WHERE uc.id = :charId + WHERE c.id = :charId """ ) suspend fun getCharacterInfo(charId: Long): CharacterDtos.CardCharacterInfo - - @Query(""" - INSERT INTO TransformationHistory(monId, stageId, transformationDate) - VALUES - (:monId, - (SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId), - :transformationDate) - """) - fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long) - - @Query(""" - INSERT INTO VitalsHistory(charId, date, vitalPoints) - VALUES - (:charId, - (:date), - :vitalPoints) - """) - fun insertVitals(charId: Long, date: Long, vitalPoints: Int) - } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt index af0e849..39d43ee 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt @@ -156,4 +156,20 @@ interface UserCharacterDao { """ ) suspend fun getCharacterInfo(charId: Long): Character + + + @Query(""" + INSERT INTO TransformationHistory(monId, stageId, transformationDate) + VALUES + (:monId, + (SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId), + :transformationDate) + """) + fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long) + + @Upsert + fun insertVitals(vararg vitalsHistory: VitalsHistory) + + @Query("""SELECT * FROM VitalsHistory WHERE charId = :charId ORDER BY id ASC""") + suspend fun getVitalsHistory(charId: Long): List } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CardProgress.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CardProgress.kt index d40aa93..9ec48f2 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CardProgress.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CardProgress.kt @@ -15,7 +15,7 @@ import androidx.room.PrimaryKey ] ) data class CardProgress( - @PrimaryKey val cardId: Int, + @PrimaryKey val cardId: Long, val currentStage: Int, val unlocked: Boolean ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/VitalsHistory.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/VitalsHistory.kt index a92a177..313e7c1 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/VitalsHistory.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/VitalsHistory.kt @@ -17,6 +17,8 @@ import androidx.room.PrimaryKey data class VitalsHistory ( @PrimaryKey(autoGenerate = true) val id: Long = 0, val charId: Long, - val date: Long, + val year: Int, + val month: Int, + val day: Int, val vitalPoints: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt index 58add74..da6b07d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt @@ -57,11 +57,33 @@ fun ScanScreen( val storageRepository = StorageRepository(application.container.db) var nfcCharacter by remember { mutableStateOf(null) } + /* + This is in the case there is an active character, + that way active characters are quicker to send. + */ + var selectedCharacterId by remember { mutableStateOf(null) } + selectedCharacterId = characterId + val context = LocalContext.current + LaunchedEffect(storageRepository) { withContext(Dispatchers.IO) { - if(characterId != null && nfcCharacter == null) { - nfcCharacter = scanScreenController.characterToNfc(characterId) + /* + First check if there is a character sent through the navigation system + If there is not, that means we got here through the home screen nfc button + If we got here through the home screen, it does not hurt to check if there is + an active character. + */ + if (characterId != null && nfcCharacter == null) { + selectedCharacterId = characterId + nfcCharacter = scanScreenController.characterToNfc(selectedCharacterId!!) + } + else if (characterId == null && nfcCharacter == null) { + val activeCharacter = storageRepository.getActiveCharacter() + if (activeCharacter != null) { + selectedCharacterId = activeCharacter.id + nfcCharacter = scanScreenController.characterToNfc(selectedCharacterId!!) + } } } } @@ -120,13 +142,15 @@ fun ScanScreen( ) } - if (!isDoneSendingCard) { - scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) { - isDoneSendingCard = true - } - } else if (!isDoneWritingCharacter) { - scanScreenController.onClickWrite(secrets!!, nfcCharacter!!) { - isDoneWritingCharacter = true + if (secrets != null && nfcCharacter != null) { + if (!isDoneSendingCard) { + scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) { + isDoneSendingCard = true + } + } else if (!isDoneWritingCharacter) { + scanScreenController.onClickWrite(secrets!!, nfcCharacter!!) { + isDoneWritingCharacter = true + } } } @@ -147,7 +171,7 @@ fun ScanScreen( LaunchedEffect(storageRepository) { withContext(Dispatchers.IO) { storageRepository - .deleteCharacter(characterId!!) + .deleteCharacter(selectedCharacterId!!) } } } @@ -173,7 +197,7 @@ fun ScanScreen( } else { ChooseConnectOption( onClickRead = when { - characterId != null -> null + selectedCharacterId != null -> null else -> { { if(secrets == null) { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt index ed951eb..f610f5f 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt @@ -146,108 +146,6 @@ class ScanScreenControllerImpl( componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS)) } - /* - // Todo: Move all of this to a separate class - // Todo: Test the new mess - // Todo: Remove this - - private fun addCharacterScannedIntoDatabase(nfcCharacter: NfcCharacter): String { - val application = componentActivity.applicationContext as VBHelper - val storageRepository = application.container.db - - val dimData = storageRepository - .dimDao() - .getDimById(nfcCharacter.dimId.toInt()) - - if (dimData == null) return "Card not found" - - val cardCharData = storageRepository - .characterDao() - .getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), dimData.id) - - val characterData = UserCharacter( - charId = cardCharData.id, - ageInDays = nfcCharacter.ageInDays.toInt(), - mood = nfcCharacter.mood.toInt(), - vitalPoints = nfcCharacter.vitalPoints.toInt(), - transformationCountdown = nfcCharacter.transformationCountdownInMinutes.toInt(), - injuryStatus = nfcCharacter.injuryStatus, - trophies = nfcCharacter.trophies.toInt(), - currentPhaseBattlesWon = nfcCharacter.currentPhaseBattlesWon.toInt(), - currentPhaseBattlesLost = nfcCharacter.currentPhaseBattlesLost.toInt(), - totalBattlesWon = nfcCharacter.totalBattlesWon.toInt(), - totalBattlesLost = nfcCharacter.totalBattlesLost.toInt(), - activityLevel = nfcCharacter.activityLevel.toInt(), - heartRateCurrent = nfcCharacter.heartRateCurrent.toInt(), - characterType = when (nfcCharacter) { - is BENfcCharacter -> DeviceType.BEDevice - else -> DeviceType.VBDevice - }, - isActive = true - ) - - storageRepository - .userCharacterDao() - .clearActiveCharacter() - - val characterId: Long = storageRepository - .userCharacterDao() - .insertCharacterData(characterData) - - if (nfcCharacter is BENfcCharacter) { - val extraCharacterData = BECharacterData( - id = characterId, - trainingHp = nfcCharacter.trainingHp.toInt(), - trainingAp = nfcCharacter.trainingAp.toInt(), - trainingBp = nfcCharacter.trainingBp.toInt(), - remainingTrainingTimeInMinutes = nfcCharacter.remainingTrainingTimeInMinutes.toInt(), - itemEffectActivityLevelValue = nfcCharacter.itemEffectActivityLevelValue.toInt(), - itemEffectMentalStateValue = nfcCharacter.itemEffectMentalStateValue.toInt(), - itemEffectMentalStateMinutesRemaining = nfcCharacter.itemEffectMentalStateMinutesRemaining.toInt(), - itemEffectActivityLevelMinutesRemaining = nfcCharacter.itemEffectActivityLevelMinutesRemaining.toInt(), - itemEffectVitalPointsChangeValue = nfcCharacter.itemEffectVitalPointsChangeValue.toInt(), - itemEffectVitalPointsChangeMinutesRemaining = nfcCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(), - abilityRarity = nfcCharacter.abilityRarity, - abilityType = nfcCharacter.abilityType.toInt(), - abilityBranch = nfcCharacter.abilityBranch.toInt(), - abilityReset = nfcCharacter.abilityReset.toInt(), - rank = nfcCharacter.abilityReset.toInt(), - itemType = nfcCharacter.itemType.toInt(), - itemMultiplier = nfcCharacter.itemMultiplier.toInt(), - itemRemainingTime = nfcCharacter.itemRemainingTime.toInt(), - otp0 = "", //nfcCharacter.value!!.otp0.toString(), - otp1 = "", //nfcCharacter.value!!.otp1.toString(), - minorVersion = nfcCharacter.characterCreationFirmwareVersion.minorVersion.toInt(), - majorVersion = nfcCharacter.characterCreationFirmwareVersion.majorVersion.toInt(), - ) - - storageRepository - .userCharacterDao() - .insertBECharacterData(extraCharacterData) - - val transformationHistoryWatch = nfcCharacter.transformationHistory - transformationHistoryWatch.map { item -> - if (item.toCharIndex.toInt() != 255) { - val date = GregorianCalendar(item.year.toInt(), item.month.toInt(), item.day.toInt()) - .time - .time - - storageRepository - .characterDao() - .insertTransformation(characterId, item.toCharIndex.toInt(), dimData.id, date) - - storageRepository - .dexDao() - .insertCharacter(item.toCharIndex.toInt(), dimData.id, date) - } - } - } else if (nfcCharacter is VBNfcCharacter) { - return "Not implemented yet" - } - - return "Done reading character!" - }*/ - override fun characterFromNfc(nfcCharacter: NfcCharacter): String { val nfcConverter = FromNfcConverter( componentActivity = componentActivity diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/FromNfcConverter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/FromNfcConverter.kt index 09d41d0..459afbc 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/FromNfcConverter.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/FromNfcConverter.kt @@ -1,5 +1,6 @@ package com.github.nacabaro.vbhelper.screens.scanScreen.converters +import android.util.Log import androidx.activity.ComponentActivity import com.github.cfogrady.vbnfc.be.BENfcCharacter import com.github.cfogrady.vbnfc.data.NfcCharacter @@ -11,6 +12,7 @@ import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData +import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory import com.github.nacabaro.vbhelper.utils.DeviceType import java.util.GregorianCalendar @@ -57,8 +59,6 @@ class FromNfcConverter ( isActive = true ) - updateCardProgress(cardData, nfcCharacter) - database .userCharacterDao() .clearActiveCharacter() @@ -85,6 +85,11 @@ class FromNfcConverter ( dimData = cardData ) + addVitalsHistoryToDatabase( + characterId = characterId, + nfcCharacter = nfcCharacter + ) + return "Done reading character!" } @@ -95,7 +100,7 @@ class FromNfcConverter ( cardData: Card ) { val currentCardProgress = CardProgress( - cardId = cardData.cardId, + cardId = cardData.id, currentStage = nfcCharacter.nextAdventureMissionStage.toInt(), unlocked = nfcCharacter.nextAdventureMissionStage.toInt() > cardData.stageCount ) @@ -107,23 +112,6 @@ class FromNfcConverter ( - private fun updateCardProgress( - cardData: Card, - nfcCharacter: NfcCharacter, - ) { - val cardProgress = CardProgress( - cardId = cardData.cardId, - currentStage = nfcCharacter.nextAdventureMissionStage.toInt(), - unlocked = nfcCharacter.nextAdventureMissionStage.toInt() > cardData.stageCount - ) - - database - .cardProgressDao() - .updateDimProgress(cardProgress) - } - - - private fun addVbCharacterToDatabase( characterId: Long, nfcCharacter: VBNfcCharacter @@ -139,8 +127,6 @@ class FromNfcConverter ( .insertVBCharacterData(extraCharacterData) addSpecialMissionsToDatabase(nfcCharacter, characterId) - - addVitalsHistoryToDatabase(characterId, nfcCharacter) } @@ -212,23 +198,20 @@ class FromNfcConverter ( nfcCharacter: NfcCharacter ) { val vitalsHistoryWatch = nfcCharacter.vitalHistory - vitalsHistoryWatch.map { item -> - val date = GregorianCalendar( - item.year.toInt(), - item.month.toInt(), - item.day.toInt() + val vitalsHistory = vitalsHistoryWatch.map { historyElement -> + Log.d("VitalsHistory", "${historyElement.year.toInt()} ${historyElement.month.toInt()} ${historyElement.day.toInt()}") + VitalsHistory( + charId = characterId, + year = historyElement.year.toInt(), + month = historyElement.month.toInt(), + day = historyElement.day.toInt(), + vitalPoints = historyElement.vitalsGained.toInt() ) - .time - .time - - database - .characterDao() - .insertVitals( - characterId, - date, - item.vitalsGained.toInt() - ) } + + database + .userCharacterDao() + .insertVitals(*vitalsHistory.toTypedArray()) } @@ -249,7 +232,7 @@ class FromNfcConverter ( .time database - .characterDao() + .userCharacterDao() .insertTransformation( characterId, item.toCharIndex.toInt(), diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/ToNfcConverter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/ToNfcConverter.kt index 9227869..819aa2a 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/ToNfcConverter.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/converters/ToNfcConverter.kt @@ -1,6 +1,7 @@ package com.github.nacabaro.vbhelper.screens.scanScreen.converters import android.icu.util.Calendar +import android.util.Log import androidx.activity.ComponentActivity import com.github.cfogrady.vbnfc.be.BENfcCharacter import com.github.cfogrady.vbnfc.be.FirmwareVersion @@ -81,9 +82,7 @@ class ToNfcConverter( activityLevel = userCharacter.activityLevel.toByte(), heartRateCurrent = userCharacter.heartRateCurrent.toUByte(), transformationHistory = paddedTransformationArray, - vitalHistory = Array(7) { - NfcCharacter.DailyVitals(0u, 0u, 0u, 0u) - }, + vitalHistory = generateVitalsHistoryArray(characterId), appReserved1 = ByteArray(12) {0}, appReserved2 = Array(3) {0u}, generation = vbData.generation.toUShort(), @@ -120,6 +119,39 @@ class ToNfcConverter( + private suspend fun generateVitalsHistoryArray( + characterId: Long + ): Array { + val vitalsHistory = database + .userCharacterDao() + .getVitalsHistory(characterId) + + val nfcVitalsHistory = Array(7) { + NfcCharacter.DailyVitals(0u, 0u, 0u, 0u) + } + + vitalsHistory.mapIndexed { index, historyElement -> + var actualYear = 0 + if (historyElement.year != 2000) { + actualYear = historyElement.year + } + nfcVitalsHistory[index] = NfcCharacter.DailyVitals( + day = historyElement.day.toUByte(), + month = historyElement.month.toUByte(), + year = actualYear.toUShort(), + vitalsGained = vitalsHistory[index].vitalPoints.toUShort() + ) + } + + nfcVitalsHistory.map { + Log.d("NFC", it.toString()) + } + + return nfcVitalsHistory + } + + + private suspend fun nfcToBENfc( characterId: Long, characterInfo: CharacterDtos.CardCharacterInfo, @@ -157,9 +189,7 @@ class ToNfcConverter( activityLevel = userCharacter.activityLevel.toByte(), heartRateCurrent = userCharacter.heartRateCurrent.toUByte(), transformationHistory = paddedTransformationArray, - vitalHistory = Array(7) { - NfcCharacter.DailyVitals(0u, 0u, 0u, 0u) - }, + vitalHistory = generateVitalsHistoryArray(characterId), appReserved1 = ByteArray(12) {0}, appReserved2 = Array(3) {0u}, trainingHp = beData.trainingHp.toUShort(), diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt index b81a198..0e46146 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt @@ -132,7 +132,7 @@ class SettingsScreenControllerImpl( .insertNewDim(cardModel) val cardProgress = CardProgress( - cardId = cardModel.cardId, + cardId = dimId, currentStage = 0, unlocked = false )