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 7250006..1d1485a 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -11,10 +11,12 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.lifecycle.lifecycleScope +import com.github.cfogrady.vb.dim.card.BemCard import com.github.cfogrady.vb.dim.card.DimReader import com.github.nacabaro.vbhelper.navigation.AppNavigation import com.github.cfogrady.vbnfc.be.BENfcCharacter import com.github.cfogrady.vbnfc.data.NfcCharacter +import com.github.cfogrady.vbnfc.vb.VBNfcCharacter import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.domain.Dim import com.github.nacabaro.vbhelper.domain.Sprites @@ -22,6 +24,7 @@ import com.github.nacabaro.vbhelper.domain.Character import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter +import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData import com.github.nacabaro.vbhelper.navigation.AppNavigationHandlers import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.SettingsScreenController @@ -29,6 +32,8 @@ import com.github.nacabaro.vbhelper.source.ApkSecretsImporter import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import java.util.Date +import java.util.GregorianCalendar class MainActivity : ComponentActivity() { @@ -105,13 +110,17 @@ class MainActivity : ComponentActivity() { inputStream.use { fileReader -> val dimReader = DimReader() val card = dimReader.readCard(fileReader, false) + + Log.i("MainActivity", "Card name: ${card is BemCard}") + val dimModel = Dim( dimId = card.header.dimId, logo = card.spriteData.sprites[0].pixelData, name = card.spriteData.text, // TODO Make user write card name stageCount = card.adventureLevels.levels.size, logoHeight = card.spriteData.sprites[0].height, - logoWidth = card.spriteData.sprites[0].width + logoWidth = card.spriteData.sprites[0].width, + isBEm = card is BemCard ) val dimId = storageRepository @@ -120,7 +129,11 @@ class MainActivity : ComponentActivity() { val characters = card.characterStats.characterEntries - var spriteCounter = 10 + var spriteCounter = when (card is BemCard) { + true -> 55 + false -> 10 + } + val domainCharacters = mutableListOf() for (index in 0 until characters.size) { @@ -144,12 +157,14 @@ class MainActivity : ComponentActivity() { ) // TODO: Improve this - if (index == 0) { - spriteCounter += 6 - } else if (index == 1) { - spriteCounter += 7 - } else { + if (card is BemCard) { spriteCounter += 14 + } else { + when (index) { + 0 -> spriteCounter += 6 + 1 -> spriteCounter += 7 + else -> spriteCounter += 14 + } } } @@ -216,9 +231,7 @@ class MainActivity : ComponentActivity() { .dimDao() .getDimById(nfcCharacter.value!!.dimId.toInt()) - if (dimData == null) { - return "Card not found" - } + if (dimData == null) return "Card not found" val cardCharData = storageRepository .characterDao() @@ -244,60 +257,63 @@ class MainActivity : ComponentActivity() { characterType = when (nfcCharacter.value) { is BENfcCharacter -> com.github.nacabaro.vbhelper.domain.DeviceType.BEDevice else -> com.github.nacabaro.vbhelper.domain.DeviceType.VBDevice - } + }, + isActive = true ) + storageRepository + .userCharacterDao() + .clearActiveCharacter() + val characterId: Long = storageRepository .userCharacterDao() .insertCharacterData(characterData) if (nfcCharacter.value is BENfcCharacter) { - val beCharacter = nfcCharacter as MutableStateFlow + val beCharacter = nfcCharacter.value as BENfcCharacter val extraCharacterData = BECharacterData( 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(), + trainingHp = beCharacter.trainingHp.toInt(), + trainingAp = beCharacter.trainingAp.toInt(), + trainingBp = beCharacter.trainingBp.toInt(), + remainingTrainingTimeInMinutes = beCharacter.remainingTrainingTimeInMinutes.toInt(), + itemEffectActivityLevelValue = beCharacter.itemEffectActivityLevelValue.toInt(), + itemEffectMentalStateValue = beCharacter.itemEffectMentalStateValue.toInt(), + itemEffectMentalStateMinutesRemaining = beCharacter.itemEffectMentalStateMinutesRemaining.toInt(), + itemEffectActivityLevelMinutesRemaining = beCharacter.itemEffectActivityLevelMinutesRemaining.toInt(), + itemEffectVitalPointsChangeValue = beCharacter.itemEffectVitalPointsChangeValue.toInt(), + itemEffectVitalPointsChangeMinutesRemaining = beCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(), + abilityRarity = beCharacter.abilityRarity, + abilityType = beCharacter.abilityType.toInt(), + abilityBranch = beCharacter.abilityBranch.toInt(), + abilityReset = beCharacter.abilityReset.toInt(), + rank = beCharacter.abilityReset.toInt(), + itemType = beCharacter.itemType.toInt(), + itemMultiplier = beCharacter.itemMultiplier.toInt(), + itemRemainingTime = beCharacter.itemRemainingTime.toInt(), otp0 = "", //beCharacter.value!!.otp0.toString(), otp1 = "", //beCharacter.value!!.otp1.toString(), - minorVersion = beCharacter.value!!.characterCreationFirmwareVersion.minorVersion.toInt(), - majorVersion = beCharacter.value!!.characterCreationFirmwareVersion.majorVersion.toInt(), + minorVersion = beCharacter.characterCreationFirmwareVersion.minorVersion.toInt(), + majorVersion = beCharacter.characterCreationFirmwareVersion.majorVersion.toInt(), ) storageRepository .userCharacterDao() .insertBECharacterData(extraCharacterData) - val transformationHistoryWatch = beCharacter.value!!.transformationHistory - val domainTransformationHistory = transformationHistoryWatch.map { item -> - TransformationHistory( - monId = characterId, - toCharIndex = item.toCharIndex.toInt(), - year = item.year.toInt(), - month = item.month.toInt(), - day = item.day.toInt() - ) + val transformationHistoryWatch = beCharacter.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 - .userCharacterDao() - .insertTransformationHistory(*domainTransformationHistory.toTypedArray()) - } else { + } else if (nfcCharacter.value is VBNfcCharacter) { return "Not implemented yet" } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt index 85ae2e0..e328625 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt @@ -1,48 +1,113 @@ package com.github.nacabaro.vbhelper.components -import android.graphics.Bitmap +import android.util.Log +import android.widget.Toast import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Card +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.github.nacabaro.vbhelper.domain.Sprites +import androidx.compose.ui.unit.sp import com.github.nacabaro.vbhelper.utils.BitmapData import com.github.nacabaro.vbhelper.utils.getBitmap -import java.nio.ByteBuffer +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.TextUnit @Composable fun CharacterEntry( icon: BitmapData, modifier: Modifier = Modifier, + shape: Shape = MaterialTheme.shapes.medium, + multiplier: Int = 3, onClick: () -> Unit = { } ) { val bitmap = remember (icon.bitmap) { icon.getBitmap() } val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } + val density: Float = LocalContext.current.resources.displayMetrics.density + val dpSize = (icon.width * multiplier / density).dp Card( - shape = MaterialTheme.shapes.medium, + shape = shape, onClick = onClick, modifier = modifier + .aspectRatio(1f) .padding(8.dp) - .size(96.dp) ) { - Image( - bitmap = imageBitmap, - contentDescription = "Icon", - filterQuality = FilterQuality.None, + Box( + contentAlignment = Alignment.BottomCenter, modifier = Modifier - .padding(8.dp) .fillMaxSize() - ) + .padding(16.dp) + ) { + Image( + bitmap = imageBitmap, + contentDescription = "Icon", + filterQuality = FilterQuality.None, + modifier = Modifier + .size(dpSize) + ) + } + } +} + +@Composable +fun ItemDisplay( + icon: Int, + textValue: String, + modifier: Modifier = Modifier, + iconSize: Dp = 48.dp, + textSize: TextUnit = 24.sp, + definition: String = "", +) { + val context = LocalContext.current + Card( + modifier = modifier, + shape = androidx.compose.material.MaterialTheme.shapes.small, + onClick = { + Toast.makeText(context, definition, Toast.LENGTH_SHORT).show() + } + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + ) { + Icon( + painter = painterResource(icon), + contentDescription = "Vitals", + modifier = Modifier + .padding(8.dp) + .size(iconSize) + ) + Text( + text = textValue, + textAlign = TextAlign.Center, + fontSize = textSize, + fontFamily = MaterialTheme.typography.titleLarge.fontFamily, + fontWeight = FontWeight.Bold + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt index 5958e8b..336b2b9 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/DexDimEntry.kt @@ -1,6 +1,5 @@ package com.github.nacabaro.vbhelper.components -import android.graphics.Bitmap import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row @@ -15,10 +14,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.github.nacabaro.vbhelper.utils.BitmapData import com.github.nacabaro.vbhelper.utils.getBitmap -import java.nio.ByteBuffer @Composable fun DexDiMEntry( @@ -27,10 +26,10 @@ fun DexDiMEntry( onClick: () -> Unit, modifier: Modifier = Modifier ) { - val bitmap = remember (logo.bitmap) { - logo.getBitmap() - } + val bitmap = remember (logo.bitmap) { logo.getBitmap() } val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } + val density: Float = LocalContext.current.resources.displayMetrics.density + val dpSize = (logo.width * 4 / density).dp Card ( shape = MaterialTheme.shapes.medium, @@ -49,7 +48,7 @@ fun DexDiMEntry( filterQuality = FilterQuality.None, modifier = Modifier .padding(8.dp) - .size(64.dp) + .size(dpSize) ) Text( text = name, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt index 55c4fa0..9dfca9d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt @@ -23,6 +23,7 @@ fun TopBanner( modifier: Modifier = Modifier, onGearClick: (() -> Unit)? = null, onBackClick: (() -> Unit)? = null, + onScanClick: (() -> Unit)? = null ) { Box( // Use Box to overlay elements modifier = modifier @@ -37,7 +38,7 @@ fun TopBanner( modifier = Modifier .align(Alignment.Center) // Center the text ) - if (onGearClick != null) { + if (onGearClick != null) { IconButton( onClick = onGearClick, modifier = Modifier @@ -50,7 +51,18 @@ fun TopBanner( } } - if (onBackClick != null) { + if (onScanClick != null) { + IconButton( + onClick = onScanClick, + modifier = Modifier + .align(Alignment.CenterStart) // Place gear icon at the end + ) { + Icon( + painter = painterResource(R.drawable.baseline_nfc_24), // Use a gear icon + contentDescription = "Scan" + ) + } + } else if (onBackClick != null) { IconButton( onClick = onBackClick, modifier = Modifier diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/TransformationHistoryCard.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/TransformationHistoryCard.kt new file mode 100644 index 0000000..399dd7a --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/TransformationHistoryCard.kt @@ -0,0 +1,76 @@ +package com.github.nacabaro.vbhelper.components + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Card +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.FilterQuality +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.utils.BitmapData +import com.github.nacabaro.vbhelper.utils.getBitmap + +@Composable +fun TransformationHistoryCard( + transformationHistory: List, + modifier: Modifier= Modifier +) { + Card ( + shape = androidx.compose.material.MaterialTheme.shapes.small, + modifier = modifier + ) { + LazyRow ( + modifier = Modifier + .padding(8.dp) + ) { + items(transformationHistory) { transformation -> + TransformationHistoryItem(transformation) + } + } + } +} + +@Composable +fun TransformationHistoryItem( + transformation: CharacterDtos.TransformationHistory +) { + val bitmapData = BitmapData( + bitmap = transformation.spriteIdle, + width = transformation.spriteWidth, + height = transformation.spriteHeight + ) + val bitmap = remember (bitmapData) { bitmapData.getBitmap() } + val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } + val density: Float = LocalContext.current.resources.displayMetrics.density + val dpSize = (bitmap.width * 3 / density).dp + + Box ( + contentAlignment = Alignment.BottomCenter, + modifier = Modifier + .aspectRatio(1f) + .fillMaxWidth() + .size((64*3/density).dp) + ) { + Image( + bitmap = imageBitmap, + contentDescription = "Transformation", + filterQuality = FilterQuality.None, + modifier = Modifier + .size(dpSize) + + ) + } + +} \ No newline at end of file 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 7b0642f..e15aada 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 @@ -6,6 +6,7 @@ import androidx.room.Query import com.github.nacabaro.vbhelper.domain.Character import com.github.nacabaro.vbhelper.domain.Sprites import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import java.util.GregorianCalendar @Dao interface CharacterDao { @@ -37,4 +38,13 @@ interface CharacterDao { WHERE uc.id = :charId """) suspend fun getCharacterInfo(charId: Long): CharacterDtos.DiMInfo + + @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) } \ 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 450cec9..e2cffed 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 @@ -20,17 +20,30 @@ interface UserCharacterDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertTransformationHistory(vararg transformationHistory: TransformationHistory) - @Query("SELECT * FROM TransformationHistory WHERE monId = :monId") - fun getTransformationHistory(monId: Long): List + @Query(""" + SELECT + c.id AS id, + c.sprite1 AS spriteIdle, + c.spritesWidth AS spriteWidth, + c.spritesHeight AS spriteHeight, + c.monIndex AS monIndex, + t.transformationDate AS transformationDate + FROM TransformationHistory t + JOIN Character c ON c.id = t.stageId + WHERE monId = :monId + """) + fun getTransformationHistory(monId: Long): List? @Query(""" SELECT uc.*, c.sprite1 AS spriteIdle, c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight + c.spritesHeight AS spriteHeight, + d.isBEm as isBemCard FROM UserCharacter uc JOIN Character c ON uc.charId = c.id + JOIN Dim d ON c.dimId = d.id """) suspend fun getAllCharacters(): List @@ -39,4 +52,28 @@ interface UserCharacterDao { @Query("SELECT * FROM BECharacterData WHERE id = :id") suspend fun getBeData(id: Long): BECharacterData + + @Query(""" + SELECT + uc.*, + c.sprite1 AS spriteIdle, + c.spritesWidth AS spriteWidth, + c.spritesHeight AS spriteHeight, + d.isBEm as isBemCard + FROM UserCharacter uc + JOIN Character c ON uc.charId = c.id + JOIN Dim d ON c.dimId = d.id + WHERE uc.isActive = 1 + LIMIT 1 + """) + suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? + + @Query("DELETE FROM UserCharacter WHERE id = :id") + fun deleteCharacterById(id: Long) + + @Query("UPDATE UserCharacter SET isActive = 0 WHERE isActive = 1") + fun clearActiveCharacter() + + @Query("UPDATE UserCharacter SET isActive = 1 WHERE id = :id") + fun setActiveCharacter(id: Long) } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Dim.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Dim.kt index 81e5fc1..58dad07 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Dim.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Dim.kt @@ -13,5 +13,6 @@ data class Dim( val logoWidth: Int, val logoHeight: Int, val name: String, - val stageCount: Int + val stageCount: Int, + val isBEm: Boolean ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt index 6b4be4d..4d493d1 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt @@ -3,6 +3,7 @@ package com.github.nacabaro.vbhelper.domain.device_data import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey +import com.github.nacabaro.vbhelper.domain.Character @Entity( foreignKeys = [ @@ -11,14 +12,18 @@ import androidx.room.PrimaryKey parentColumns = ["id"], childColumns = ["monId"], onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = Character::class, + parentColumns = ["id"], + childColumns = ["stageId"], + onDelete = ForeignKey.CASCADE ) ] ) data class TransformationHistory ( @PrimaryKey(autoGenerate = true) val id: Long = 0, val monId: Long, - val toCharIndex: Int, - val year: Int, - val month: Int, - val day: Int + val stageId: Long, + val transformationDate: Long ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt index bf9ce37..2169495 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt @@ -35,5 +35,6 @@ data class UserCharacter ( var totalBattlesLost: Int, var activityLevel: Int, var heartRateCurrent: Int, - var characterType: DeviceType + var characterType: DeviceType, + var isActive: Boolean ) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt index f7514cb..5e9717e 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt @@ -26,11 +26,21 @@ object CharacterDtos { var characterType: DeviceType, val spriteIdle: ByteArray, val spriteWidth: Int, - val spriteHeight: Int + val spriteHeight: Int, + val isBemCard: Boolean ) data class DiMInfo( val cardId: Int, val charId: Int ) + + data class TransformationHistory( + val id: Long, + val spriteIdle: ByteArray, + val spriteWidth: Int, + val spriteHeight: Int, + val monIndex: Int, + val transformationDate: Long + ) } \ No newline at end of file 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 24220ed..892e627 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 @@ -11,7 +11,8 @@ import androidx.navigation.compose.rememberNavController import com.github.nacabaro.vbhelper.screens.BattlesScreen import com.github.nacabaro.vbhelper.screens.DexScreen import com.github.nacabaro.vbhelper.screens.DiMScreen -import com.github.nacabaro.vbhelper.screens.HomeScreen +import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreen +import com.github.nacabaro.vbhelper.screens.ItemsScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.SettingsScreen @@ -89,6 +90,11 @@ fun AppNavigation( ) } } + composable(NavigationItems.Items.route) { + ItemsScreen( + navController = navController + ) + } } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt index 36aabc0..fa905ab 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt @@ -13,7 +13,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState @Composable fun BottomNavigationBar(navController: NavController) { val items = listOf( - NavigationItems.Scan, + NavigationItems.Items, NavigationItems.Battles, NavigationItems.Home, NavigationItems.Dex, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt index 5e92c7c..4f47596 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt @@ -15,4 +15,5 @@ sealed class NavigationItems ( object Settings : NavigationItems("Settings", R.drawable.baseline_settings_24, "Settings") object Viewer : NavigationItems("Viewer", R.drawable.baseline_image_24, "Viewer") object CardView : NavigationItems("Card/{dimId}", R.drawable.baseline_image_24, "Card") + object Items : NavigationItems("Items", R.drawable.baseline_data_24, "Items") } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt deleted file mode 100644 index 5491405..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.nacabaro.vbhelper.screens - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import com.github.nacabaro.vbhelper.components.TopBanner -import com.github.nacabaro.vbhelper.navigation.NavigationItems - -@Composable -fun HomeScreen( - navController: NavController -) { - Scaffold ( - topBar = { - TopBanner( - text = "VB Helper", - onGearClick = { - navController.navigate(NavigationItems.Settings.route) - } - ) - } - ) { contentPadding -> - Box ( - modifier = Modifier - .padding(top = contentPadding.calculateTopPadding()) - ) { - Text("Home Screen") - } - } -} diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt new file mode 100644 index 0000000..76b9532 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt @@ -0,0 +1,12 @@ +package com.github.nacabaro.vbhelper.screens + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.navigation.NavController + +@Composable +fun ItemsScreen( + navController: NavController +) { + Text(text = "Items") +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt index c7dea43..cfa6040 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt @@ -81,6 +81,7 @@ fun SpriteViewer( contentDescription = "Sprite", modifier = Modifier .size(256.dp) + .padding(8.dp) ) } } 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 c237072..597fca0 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 @@ -14,6 +14,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.Scaffold @@ -41,7 +42,9 @@ import com.github.nacabaro.vbhelper.dtos.CharacterDtos import com.github.nacabaro.vbhelper.navigation.NavigationItems import com.github.nacabaro.vbhelper.source.StorageRepository import com.github.nacabaro.vbhelper.utils.BitmapData +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @Composable @@ -62,8 +65,6 @@ fun StorageScreen( } } - Log.d("StorageScreen", "monList: $monList") - Scaffold ( topBar = { TopBanner(text = "My Digimon") } ) { contentPadding -> @@ -72,7 +73,7 @@ fun StorageScreen( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, modifier = Modifier - .padding(contentPadding) + .padding(top = contentPadding.calculateTopPadding()) .fillMaxSize() ) { Text( @@ -96,9 +97,6 @@ fun StorageScreen( width = index.spriteWidth, height = index.spriteHeight ), - modifier = Modifier - .padding(8.dp) - .size(96.dp), onClick = { selectedCharacter = index.id } @@ -108,6 +106,15 @@ fun StorageScreen( StorageDialog( characterId = selectedCharacter!!, onDismissRequest = { selectedCharacter = null }, + onClickSetActive = { + coroutineScope.launch { + withContext(Dispatchers.IO) { + storageRepository.setActiveCharacter(selectedCharacter!!) + selectedCharacter = null + } + navController.navigate(NavigationItems.Home.route) + } + }, onSendToBracelet = { navController.navigate( NavigationItems.Scan.route.replace( @@ -127,7 +134,8 @@ fun StorageScreen( fun StorageDialog( characterId: Long, onDismissRequest: () -> Unit, - onSendToBracelet: () -> Unit + onSendToBracelet: () -> Unit, + onClickSetActive: () -> Unit ) { val coroutineScope = rememberCoroutineScope() val application = LocalContext.current.applicationContext as VBHelper @@ -162,12 +170,20 @@ fun StorageDialog( .padding(8.dp) ) } - Row { + Row ( + modifier = Modifier + .verticalScroll(rememberScrollState()) + ) { Button( onClick = onSendToBracelet ) { Text(text = "Send to bracelet") } + Button( + onClick = onClickSetActive + ) { + Text(text = "Set active") + } Button( onClick = onDismissRequest ) { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt new file mode 100644 index 0000000..433530c --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt @@ -0,0 +1,201 @@ +package com.github.nacabaro.vbhelper.screens.homeScreens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.github.nacabaro.vbhelper.R +import com.github.nacabaro.vbhelper.components.CharacterEntry +import com.github.nacabaro.vbhelper.components.ItemDisplay +import com.github.nacabaro.vbhelper.components.TransformationHistoryCard +import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.utils.BitmapData +import java.util.Locale + +@Composable +fun BEBEmHomeScreen( + activeMon: CharacterDtos.CharacterWithSprites, + beData: BECharacterData, + transformationHistory: List, + contentPadding: PaddingValues +) { + Column( + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + .verticalScroll(state = rememberScrollState()) + ) { + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + CharacterEntry( + icon = BitmapData( + bitmap = activeMon.spriteIdle, + width = activeMon.spriteWidth, + height = activeMon.spriteHeight + ), + multiplier = 8, + shape = androidx.compose.material.MaterialTheme.shapes.small, + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + ) + Column ( + modifier = Modifier + .weight(0.5f) + .aspectRatio(0.5f) + ) { + ItemDisplay( + icon = R.drawable.baseline_vitals_24, + textValue = activeMon.vitalPoints.toString(), + definition = "Vitals", + modifier = Modifier + .weight(0.5f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_trophy_24, + textValue = activeMon.trophies.toString(), + definition = "Trophies", + modifier = Modifier + .weight(0.5f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + ItemDisplay( + icon = R.drawable.baseline_mood_24, + textValue = activeMon.mood.toString(), + definition = "Mood", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + val timeInHours = (beData.remainingTrainingTimeInMinutes / 60) + ItemDisplay( + icon = R.drawable.baseline_timer_24, + textValue = "$timeInHours h", + definition = "Training limit", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_rank_24, + textValue = beData.rank.toString(), + definition = "Rank", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + val transformationCountdownInHours = activeMon.transformationCountdown / 60 + ItemDisplay( + icon = R.drawable.baseline_next_24, + textValue = when (transformationCountdownInHours) { + 0 -> "${activeMon.transformationCountdown} m" + else -> "$transformationCountdownInHours h" + }, + definition = "Next timer", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_swords_24, + textValue = when { + activeMon.totalBattlesLost == 0 -> "0.00 %" + else -> { + val battleWinPercentage = activeMon.totalBattlesWon.toFloat() / (activeMon.totalBattlesWon + activeMon.totalBattlesLost).toFloat() + String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + } + }, + definition = "Total battle win %", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_swords_24, + textValue = when { + activeMon.totalBattlesLost == 0 -> "0.00 %" + else -> { + val battleWinPercentage = activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat() + String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + } + }, + definition = "Current phase win %", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + TransformationHistoryCard( + transformationHistory = transformationHistory, + modifier = Modifier + .weight(1f) + .padding(8.dp) + ) + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + ItemDisplay( + icon = R.drawable.baseline_health_24, + textValue = "+${beData.trainingHp}", + definition = "Training HP", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_agility_24, + textValue = "+${beData.trainingBp}", + definition = "Training BP", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_attack_24, + textValue = "+${beData.trainingAp}", + definition = "Training AP", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt new file mode 100644 index 0000000..3d8ef15 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt @@ -0,0 +1,171 @@ +package com.github.nacabaro.vbhelper.screens.homeScreens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import java.util.Locale +import androidx.compose.ui.unit.dp +import com.github.nacabaro.vbhelper.R +import com.github.nacabaro.vbhelper.components.CharacterEntry +import com.github.nacabaro.vbhelper.components.ItemDisplay +import com.github.nacabaro.vbhelper.components.TransformationHistoryCard +import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.utils.BitmapData +import kotlin.text.format + +@Composable +fun BEDiMHomeScreen( + activeMon: CharacterDtos.CharacterWithSprites, + beData: BECharacterData, + transformationHistory: List, + contentPadding: PaddingValues +) { + Column( + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + .verticalScroll(state = rememberScrollState()) + ) { + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + CharacterEntry( + icon = BitmapData( + bitmap = activeMon.spriteIdle, + width = activeMon.spriteWidth, + height = activeMon.spriteHeight + ), + multiplier = 8, + shape = androidx.compose.material.MaterialTheme.shapes.small, + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + ) + Column ( + modifier = Modifier + .weight(0.5f) + .aspectRatio(0.5f) + ) { + ItemDisplay( + icon = R.drawable.baseline_vitals_24, + textValue = activeMon.vitalPoints.toString(), + definition = "Vitals", + modifier = Modifier + .weight(0.5f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_trophy_24, + textValue = activeMon.trophies.toString(), + definition = "Trophies", + modifier = Modifier + .weight(0.5f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + ItemDisplay( + icon = R.drawable.baseline_mood_24, + textValue = activeMon.mood.toString(), + definition = "Mood", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + val timeInHours = (beData.remainingTrainingTimeInMinutes / 60) + ItemDisplay( + icon = R.drawable.baseline_timer_24, + textValue = "$timeInHours h", + definition = "Training limit", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + // Maybe get rid of this? + ItemDisplay( + icon = R.drawable.baseline_rank_24, + textValue = beData.rank.toString(), + definition = "Rank", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + val transformationCountdownInHours = activeMon.transformationCountdown / 60 + ItemDisplay( + icon = R.drawable.baseline_next_24, + textValue = when (transformationCountdownInHours) { + 0 -> "${activeMon.transformationCountdown} m" + else -> "$transformationCountdownInHours h" + }, + definition = "Next timer", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_swords_24, + textValue = when { + activeMon.totalBattlesLost == 0 -> "0.00 %" + else -> { + val battleWinPercentage = activeMon.totalBattlesWon.toFloat() / (activeMon.totalBattlesWon + activeMon.totalBattlesLost).toFloat() + String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + } + }, + definition = "Total battle win %", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + ItemDisplay( + icon = R.drawable.baseline_swords_24, + textValue = when { + activeMon.totalBattlesLost == 0 -> "0.00 %" + else -> { + val battleWinPercentage = activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat() + String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + } + }, + definition = "Current phase win %", + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } + Row ( + modifier = Modifier + .fillMaxWidth() + ) { + TransformationHistoryCard( + transformationHistory = transformationHistory, + modifier = Modifier + .weight(1f) + .padding(8.dp) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt new file mode 100644 index 0000000..b19f9ce --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt @@ -0,0 +1,102 @@ +package com.github.nacabaro.vbhelper.screens.homeScreens + +import android.util.Log +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.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.domain.DeviceType +import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.navigation.NavigationItems +import com.github.nacabaro.vbhelper.source.StorageRepository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@Composable +fun HomeScreen( + navController: NavController +) { + val application = LocalContext.current.applicationContext as VBHelper + val storageRepository = StorageRepository(application.container.db) + val activeMon = remember { mutableStateOf(null) } + val transformationHistory = remember { mutableStateOf?>(null) } + val beData = remember { mutableStateOf(null) } + val vbData = remember { mutableStateOf(null) } + + LaunchedEffect(storageRepository, activeMon) { + withContext(Dispatchers.IO) { + activeMon.value = storageRepository.getActiveCharacter() + if (activeMon.value != null) { + beData.value = storageRepository.getCharacterBeData(activeMon.value!!.id) + transformationHistory.value = storageRepository.getTransformationHistory(activeMon.value!!.id) + } + } + } + + Scaffold ( + topBar = { + TopBanner( + text = "VB Helper", + onScanClick = { + navController.navigate(NavigationItems.Scan.route) + }, + onGearClick = { + navController.navigate(NavigationItems.Settings.route) + } + ) + } + ) { contentPadding -> + if (activeMon.value == null || (beData.value == null && vbData.value == null) || transformationHistory.value == null) { + Column ( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(top = contentPadding.calculateTopPadding()) + ) { + Text(text = "Nothing to see here") + } + } else { + if (activeMon.value!!.isBemCard) { + Log.d("HomeScreen", "BEDeviceBEm") + BEBEmHomeScreen( + activeMon = activeMon.value!!, + beData = beData.value!!, + transformationHistory = transformationHistory.value!!, + contentPadding = contentPadding + ) + } else if (!activeMon.value!!.isBemCard && activeMon.value!!.characterType == DeviceType.BEDevice) { + Log.d("HomeScreen", "BEDevice") + BEDiMHomeScreen( + activeMon = activeMon.value!!, + beData = beData.value!!, + transformationHistory = transformationHistory.value!!, + contentPadding = contentPadding + ) + } else { + VBDiMHomeScreen( + activeMon = activeMon.value!!, + vbData = vbData.value!!, + transformationHistory = transformationHistory.value!!, + contentPadding = contentPadding + ) + } + } + } +} + + diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt new file mode 100644 index 0000000..2670fa7 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt @@ -0,0 +1,16 @@ +package com.github.nacabaro.vbhelper.screens.homeScreens + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.runtime.Composable +import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData +import com.github.nacabaro.vbhelper.dtos.CharacterDtos + +@Composable +fun VBDiMHomeScreen( + activeMon: CharacterDtos.CharacterWithSprites, + vbData: VBCharacterData, + transformationHistory: List, + contentPadding: PaddingValues +) { + TODO("Not implemented yet") +} \ 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 c9f892d..a4cbb03 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 @@ -61,7 +61,7 @@ fun ScanScreen( val context = LocalContext.current LaunchedEffect(storageRepository) { withContext(Dispatchers.IO) { - if(characterId != null) { + if(characterId != null && nfcCharacter == null) { nfcCharacter = characterToNfc(context, characterId) } } @@ -129,6 +129,12 @@ fun ScanScreen( } else if (isDoneSendingCard && isDoneWritingCharacter) { writingScreen = false navController.navigate(NavigationItems.Home.route) + LaunchedEffect(storageRepository) { + withContext(Dispatchers.IO) { + storageRepository + .deleteCharacter(characterId!!) + } + } } if (readingScreen) { 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 index 8e1f753..46eda24 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt @@ -21,11 +21,24 @@ class StorageRepository ( return db.userCharacterDao().getBeData(id) } - fun getTransformationHistory(characterId: Long): List { + fun getTransformationHistory(characterId: Long): List? { return db.userCharacterDao().getTransformationHistory(characterId) } suspend fun getCharacterData(id: Long): CharacterDtos.DiMInfo { return db.characterDao().getCharacterInfo(id) } + + suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? { + return db.userCharacterDao().getActiveCharacter() + } + + fun deleteCharacter(id: Long) { + return db.userCharacterDao().deleteCharacterById(id) + } + + fun setActiveCharacter(id: Long) { + db.userCharacterDao().clearActiveCharacter() + return db.userCharacterDao().setActiveCharacter(id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/utils/CharacterToNFCCharacter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/utils/CharacterToNFCCharacter.kt index 5cce1f5..655ceb8 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/utils/CharacterToNFCCharacter.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/utils/CharacterToNFCCharacter.kt @@ -1,12 +1,15 @@ package com.github.nacabaro.vbhelper.utils import android.content.Context +import android.icu.util.Calendar +import android.icu.util.GregorianCalendar import com.github.cfogrady.vbnfc.be.BENfcCharacter import com.github.cfogrady.vbnfc.be.FirmwareVersion import com.github.cfogrady.vbnfc.data.NfcCharacter import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.domain.DeviceType import com.github.nacabaro.vbhelper.source.StorageRepository +import java.util.Date suspend fun characterToNfc(context: Context, characterId: Long): NfcCharacter? { val app = context.applicationContext as VBHelper @@ -18,18 +21,27 @@ suspend fun characterToNfc(context: Context, characterId: Long): NfcCharacter? { if (userCharacter.characterType == DeviceType.BEDevice) { val beData = storageRepository.getCharacterBeData(characterId) val transformationHistory = storageRepository - .getTransformationHistory(characterId) + .getTransformationHistory(characterId)!! .map { + val date = Date(it.transformationDate) + val calendar = GregorianCalendar() + calendar.time = date + NfcCharacter.Transformation( - toCharIndex = it.toCharIndex.toUByte(), - year = it.year.toUShort(), - month = it.month.toUByte(), - day = it.day.toUByte() + toCharIndex = it.monIndex.toUByte(), + year = calendar + .get(Calendar.YEAR) + .toUShort(), + month = calendar + .get(Calendar.MONTH) + .toUByte(), + day = calendar + .get(Calendar.DAY_OF_MONTH) + .toUByte() ) }.toTypedArray() - // Maybe this is the issue? - val dummyVitalHistory = arrayOf() + val paddedTransformationArray = padTransformationArray(transformationHistory) val nfcData = BENfcCharacter( dimId = characterInfo.cardId.toUShort(), @@ -55,7 +67,7 @@ suspend fun characterToNfc(context: Context, characterId: Long): NfcCharacter? { totalBattlesLost = userCharacter.totalBattlesLost.toUShort(), activityLevel = userCharacter.activityLevel.toByte(), heartRateCurrent = userCharacter.heartRateCurrent.toUByte(), - transformationHistory = transformationHistory, + transformationHistory = paddedTransformationArray, vitalHistory = Array(7) { NfcCharacter.DailyVitals(0u, 0u, 0u, 0u) }, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/utils/padTransformationArray.kt b/app/src/main/java/com/github/nacabaro/vbhelper/utils/padTransformationArray.kt new file mode 100644 index 0000000..ea879f5 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/utils/padTransformationArray.kt @@ -0,0 +1,23 @@ +package com.github.nacabaro.vbhelper.utils + +import com.github.cfogrady.vbnfc.data.NfcCharacter + +fun padTransformationArray( + transformationArray: Array +): Array { + if (transformationArray.size >= 8) { + return transformationArray + } + + val paddedArray = Array(8) { + NfcCharacter.Transformation( + toCharIndex = 255u, + year = 65535u, + month = 255u, + day = 255u + ) + } + + System.arraycopy(transformationArray, 0, paddedArray, 0, transformationArray.size) + return paddedArray +} \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_age_24.xml b/app/src/main/res/drawable/baseline_age_24.xml new file mode 100644 index 0000000..5b29ae4 --- /dev/null +++ b/app/src/main/res/drawable/baseline_age_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_agility_24.xml b/app/src/main/res/drawable/baseline_agility_24.xml new file mode 100644 index 0000000..20f2dd4 --- /dev/null +++ b/app/src/main/res/drawable/baseline_agility_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_attack_24.xml b/app/src/main/res/drawable/baseline_attack_24.xml new file mode 100644 index 0000000..1108e0a --- /dev/null +++ b/app/src/main/res/drawable/baseline_attack_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_data_24.xml b/app/src/main/res/drawable/baseline_data_24.xml new file mode 100644 index 0000000..6d0bd0a --- /dev/null +++ b/app/src/main/res/drawable/baseline_data_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_free_24.xml b/app/src/main/res/drawable/baseline_free_24.xml new file mode 100644 index 0000000..063cab9 --- /dev/null +++ b/app/src/main/res/drawable/baseline_free_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_health_24.xml b/app/src/main/res/drawable/baseline_health_24.xml new file mode 100644 index 0000000..814db97 --- /dev/null +++ b/app/src/main/res/drawable/baseline_health_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_mood_24.xml b/app/src/main/res/drawable/baseline_mood_24.xml new file mode 100644 index 0000000..de50a41 --- /dev/null +++ b/app/src/main/res/drawable/baseline_mood_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_next_24.xml b/app/src/main/res/drawable/baseline_next_24.xml new file mode 100644 index 0000000..312ef73 --- /dev/null +++ b/app/src/main/res/drawable/baseline_next_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_rank_24.xml b/app/src/main/res/drawable/baseline_rank_24.xml new file mode 100644 index 0000000..44f3deb --- /dev/null +++ b/app/src/main/res/drawable/baseline_rank_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_timer_24.xml b/app/src/main/res/drawable/baseline_timer_24.xml new file mode 100644 index 0000000..58bfc8c --- /dev/null +++ b/app/src/main/res/drawable/baseline_timer_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_trophy_24.xml b/app/src/main/res/drawable/baseline_trophy_24.xml new file mode 100644 index 0000000..2270f74 --- /dev/null +++ b/app/src/main/res/drawable/baseline_trophy_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_vaccine_24.xml b/app/src/main/res/drawable/baseline_vaccine_24.xml new file mode 100644 index 0000000..66cfe60 --- /dev/null +++ b/app/src/main/res/drawable/baseline_vaccine_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_virus_24.xml b/app/src/main/res/drawable/baseline_virus_24.xml new file mode 100644 index 0000000..177cfb8 --- /dev/null +++ b/app/src/main/res/drawable/baseline_virus_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_vitals_24.xml b/app/src/main/res/drawable/baseline_vitals_24.xml new file mode 100644 index 0000000..bd21dd2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_vitals_24.xml @@ -0,0 +1,9 @@ + + +