From da134247b17a2d9186cffe79d3372c30cffa4875 Mon Sep 17 00:00:00 2001 From: Christopher O'Grady Date: Wed, 19 Mar 2025 15:33:52 -0400 Subject: [PATCH 1/9] Remove duplicated stage and attribute from UserCharacter These fields are on the Character entity. --- .../nacabaro/vbhelper/daos/UserCharacterDao.kt | 12 ++++++++++++ .../nacabaro/vbhelper/domain/characters/Character.kt | 5 +++++ .../vbhelper/domain/device_data/UserCharacter.kt | 5 +++-- .../adventureScreen/AdventureScreenControllerImpl.kt | 2 +- .../screens/scanScreen/ScanScreenControllerImpl.kt | 2 -- 5 files changed, 21 insertions(+), 5 deletions(-) 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 6e8e33f..5d6c9c0 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 @@ -5,6 +5,7 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Upsert +import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory @@ -116,4 +117,15 @@ interface UserCharacterDao { @Query("UPDATE UserCharacter SET isActive = 1 WHERE id = :id") fun setActiveCharacter(id: Long) + + @Query( + """ + SELECT c.* + FROM Character c + join UserCharacter uc on c.id = uc.charId + where uc.id = :charId + LIMIT 1 + """ + ) + suspend fun getCharacterInfo(charId: Long): Character } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt index 3cb5b19..52f8010 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt @@ -14,6 +14,11 @@ import androidx.room.ForeignKey ) ] ) +/* + * Character represents a character on a DIM card. There should only be one of these per dimId + * and monIndex. + * TODO: Customs will mean this should be unique per cardName and monIndex + */ data class Character ( @PrimaryKey(autoGenerate = true) val id: Long = 0, val dimId: 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 75007d7..8f2afb0 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 @@ -17,11 +17,12 @@ import com.github.nacabaro.vbhelper.domain.characters.Character ) ] ) +/** + * UserCharacter represents and instance of a character. The charId should map to a Character + */ data class UserCharacter ( @PrimaryKey(autoGenerate = true) val id: Long = 0, var charId: Long, - var stage: Int, - var attribute: NfcCharacter.Attribute, var ageInDays: Int, var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim var mood: Int, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt index 7f01c9f..b775728 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt @@ -72,7 +72,7 @@ class AdventureScreenControllerImpl( private suspend fun generateItem(characterId: Long): ItemDtos.PurchasedItem { val character = database .userCharacterDao() - .getCharacter(characterId) + .getCharacterInfo(characterId) val randomItem = database .itemDao() 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 d7caf92..43638e9 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 @@ -167,8 +167,6 @@ class ScanScreenControllerImpl( val characterData = UserCharacter( charId = cardCharData.id, - stage = nfcCharacter.stage.toInt(), - attribute = nfcCharacter.attribute, ageInDays = nfcCharacter.ageInDays.toInt(), nextAdventureMissionStage = nfcCharacter.nextAdventureMissionStage.toInt(), mood = nfcCharacter.mood.toInt(), From 076f6bfacf7eaf18fc4a96dc4056293c20880658 Mon Sep 17 00:00:00 2001 From: Christopher O'Grady Date: Sat, 5 Apr 2025 20:31:03 -0400 Subject: [PATCH 2/9] Fix stage and attribute coming from character instead of UserCharacter --- .../java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt | 2 ++ .../com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt index ba2f907..b8d0f20 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt @@ -21,6 +21,8 @@ interface AdventureDao { @Query(""" SELECT uc.*, + c.stage, + c.attribute, c.sprite1 AS spriteIdle, c.spritesWidth AS spriteWidth, c.spritesHeight AS spriteHeight, 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 5d6c9c0..3bfdd6f 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 @@ -46,6 +46,8 @@ interface UserCharacterDao { """ SELECT uc.*, + c.stage, + c.attribute, c.sprite1 AS spriteIdle, c.spritesWidth AS spriteWidth, c.spritesHeight AS spriteHeight, @@ -66,6 +68,8 @@ interface UserCharacterDao { """ SELECT uc.*, + c.stage, + c.attribute, c.sprite1 AS spriteIdle, c.spritesWidth AS spriteWidth, c.spritesHeight AS spriteHeight, @@ -92,6 +96,8 @@ interface UserCharacterDao { """ SELECT uc.*, + c.stage, + c.attribute, c.sprite1 AS spriteIdle, c.spritesWidth AS spriteWidth, c.spritesHeight AS spriteHeight, From fce05870c5453334fe5ebb0fb1e575c4a01a74f6 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 26 Jul 2025 14:23:53 +0200 Subject: [PATCH 3/9] This should allow the app to build, otherwise it won't or it will crash --- .../github/nacabaro/vbhelper/domain/characters/Character.kt | 3 ++- .../screens/settingsScreen/SettingsScreenControllerImpl.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt index 52f8010..0480b08 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt @@ -3,6 +3,7 @@ package com.github.nacabaro.vbhelper.domain.characters import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.ForeignKey +import com.github.cfogrady.vbnfc.data.NfcCharacter @Entity( foreignKeys = [ @@ -25,7 +26,7 @@ data class Character ( val monIndex: Int, val name: ByteArray, val stage: Int, // These should be replaced with enums - val attribute: Int, // This one too + val attribute: NfcCharacter.Attribute, // This one too val baseHp: Int, val baseBp: Int, val baseAp: Int, 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 a9c87cc..6e87c13 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 @@ -11,6 +11,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import com.github.cfogrady.vb.dim.card.BemCard import com.github.cfogrady.vb.dim.card.DimReader +import com.github.cfogrady.vbnfc.data.NfcCharacter import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.domain.Sprites @@ -144,7 +145,7 @@ class SettingsScreenControllerImpl( monIndex = index, name = card.spriteData.sprites[spriteCounter].pixelData, stage = characters[index].stage, - attribute = characters[index].attribute, + attribute = NfcCharacter.Attribute.entries[characters[index].attribute], baseHp = characters[index].hp, baseBp = characters[index].dp, baseAp = characters[index].ap, From d46769b0cb0178bac44f1897925167c03110b67f Mon Sep 17 00:00:00 2001 From: Nacho Date: Sat, 26 Jul 2025 22:26:41 +0200 Subject: [PATCH 4/9] Added credits for the app in preparation for version 0.1 --- app/build.gradle.kts | 2 +- .../vbhelper/navigation/AppNavigation.kt | 6 +++ .../navigation/BottomNavigationBar.kt | 1 + .../vbhelper/navigation/NavigationItems.kt | 1 + .../screens/homeScreens/BetaWarning.kt | 46 +++++++++++++++++++ .../screens/homeScreens/HomeScreen.kt | 7 +++ .../screens/settingsScreen/CreditsScreen.kt | 40 ++++++++++++++++ .../screens/settingsScreen/SettingsScreen.kt | 5 +- 8 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 784ff18..9e700f0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,7 +15,7 @@ android { minSdk = 28 targetSdk = 35 versionCode = 1 - versionName = "1.0" + versionName = "Alpha 0.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } 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 35b13d4..b65d72b 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 @@ -23,6 +23,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreen import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl +import com.github.nacabaro.vbhelper.screens.settingsScreen.CreditsScreen import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl data class AppNavigationHandlers( @@ -125,6 +126,11 @@ fun AppNavigation( .adventureScreenController ) } + composable(NavigationItems.Credits.route) { + CreditsScreen( + 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 fa905ab..52560c1 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 @@ -19,6 +19,7 @@ fun BottomNavigationBar(navController: NavController) { NavigationItems.Dex, NavigationItems.Storage, ) + NavigationBar { val currentBackStackEntry = navController.currentBackStackEntryAsState() val currentRoute = currentBackStackEntry.value?.destination?.route 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 59140f1..623ae8a 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 @@ -20,4 +20,5 @@ sealed class NavigationItems ( object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store") object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item") object Adventure : NavigationItems("Adventure", R.drawable.baseline_fort_24, "Adventure") + object Credits : NavigationItems("Credits", R.drawable.baseline_data_24, "Credits") } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt new file mode 100644 index 0000000..ff62f8e --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt @@ -0,0 +1,46 @@ +package com.github.nacabaro.vbhelper.screens.homeScreens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog + +@Composable +fun BetaWarning( + onDismissRequest: () -> Unit +) { + Dialog( + onDismissRequest = onDismissRequest + ) { + Card { + Column ( + modifier = Modifier + .padding(16.dp) + ) { + Text( + text = "This application is currently in alpha and it is not complete. Do not use to store important characters for you, as any future updates might delete all your characters. Sorry for the inconvenience!" + ) + Spacer(modifier = Modifier.padding(8.dp)) + Text( + text = "Also, this application does not work yet with the original VB." + ) + Spacer(modifier = Modifier.padding(8.dp)) + Text( + text = "Thank you for your understanding and patience. Sincerely, the dev team." + ) + Spacer(modifier = Modifier.padding(8.dp)) + Button( + onClick = onDismissRequest + ) { + Text(text = "Dismiss") + } + } + } + } +} \ 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 index e038cbc..26931ad 100644 --- 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 @@ -46,6 +46,7 @@ fun HomeScreen( val beData = remember { mutableStateOf(null) } val vbData = remember { mutableStateOf(null) } var adventureMissionsFinished by rememberSaveable { mutableStateOf(false) } + var betaWarning by rememberSaveable { mutableStateOf(true) } LaunchedEffect(storageRepository, activeMon) { withContext(Dispatchers.IO) { @@ -140,6 +141,12 @@ fun HomeScreen( } } } + + if (betaWarning) { + BetaWarning { + betaWarning = false + } + } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt new file mode 100644 index 0000000..c57a0a1 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt @@ -0,0 +1,40 @@ +package com.github.nacabaro.vbhelper.screens.settingsScreen + +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.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner + +@Composable +fun CreditsScreen( + navController: NavController +) { + Scaffold ( + topBar = { + TopBanner( + text = "Credits", + onBackClick = { + navController.popBackStack() + } + ) + }, + modifier = Modifier + .fillMaxSize() + ) { contentPadding -> + Column ( + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + ) { + SettingsSection("Reverse engineering") + SettingsEntry(title = "cyanic", description = "Reversed the firmware and helped us during development.") { } + SettingsSection("Application development") + SettingsEntry(title = "cfogrady", description = "Developed vb-lib-nfc and part of this application.") { } + SettingsEntry(title = "nacabaro", description = "Developed this application.") { } + SettingsEntry(title = "lightheel", description = "Developing the battling part for this application, including server. Still in the works.") { } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt index 2265a4d..47ad33f 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.navigation.NavigationItems @Composable fun SettingsScreen( @@ -52,7 +53,9 @@ fun SettingsScreen( } SettingsEntry(title = "Rename DiM/BEm", description = "Set card name") { } SettingsSection("About and credits") - SettingsEntry(title = "Credits", description = "Credits") { } + SettingsEntry(title = "Credits", description = "Credits") { + navController.navigate(NavigationItems.Credits.route) + } SettingsEntry(title = "About", description = "About") { } SettingsSection("Data management") SettingsEntry(title = "Export data", description = "Export application database") { From 1e28a8c249ebc49608b1b2b3d8beb660168dbcd8 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 27 Jul 2025 19:42:25 +0200 Subject: [PATCH 5/9] Application now imports all the sprites related to the character into the internal database. --- .../github/nacabaro/vbhelper/MainActivity.kt | 10 ++- .../nacabaro/vbhelper/daos/AdventureDao.kt | 7 +- .../nacabaro/vbhelper/daos/CharacterDao.kt | 8 +-- .../github/nacabaro/vbhelper/daos/DexDao.kt | 9 +-- .../nacabaro/vbhelper/daos/SpriteDao.kt | 16 +++++ .../vbhelper/daos/UserCharacterDao.kt | 33 +++++---- .../nacabaro/vbhelper/database/AppDatabase.kt | 6 +- .../nacabaro/vbhelper/domain/Sprites.kt | 12 ---- .../vbhelper/domain/characters/Character.kt | 14 ++-- .../vbhelper/domain/characters/Sprite.kt | 23 +++++++ .../nacabaro/vbhelper/dtos/CharacterDtos.kt | 1 + .../vbhelper/navigation/AppNavigation.kt | 9 ++- .../SettingsScreenControllerImpl.kt | 67 ++++++++++++------ .../{ => spriteViewer}/SpriteViewer.kt | 34 +++------- .../spriteViewer/SpriteViewerController.kt | 9 +++ .../SpriteViewerControllerImpl.kt | 68 +++++++++++++++++++ .../nacabaro/vbhelper/source/SpriteRepo.kt | 4 +- 17 files changed, 235 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt delete mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt rename app/src/main/java/com/github/nacabaro/vbhelper/screens/{ => spriteViewer}/SpriteViewer.kt (61%) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.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 e39db36..cc8eff4 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -14,6 +14,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl +import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewerControllerImpl import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme @@ -45,6 +46,7 @@ class MainActivity : ComponentActivity() { val adventureScreenController = AdventureScreenControllerImpl(this) val storageScreenController = StorageScreenControllerImpl(this) val homeScreenController = HomeScreenControllerImpl(this) + val spriteViewerController = SpriteViewerControllerImpl(this) super.onCreate(savedInstanceState) @@ -58,7 +60,8 @@ class MainActivity : ComponentActivity() { itemsScreenController = itemsScreenController, adventureScreenController = adventureScreenController, homeScreenController = homeScreenController, - storageScreenController = storageScreenController + storageScreenController = storageScreenController, + spriteViewerController = spriteViewerController ) } } @@ -90,7 +93,7 @@ class MainActivity : ComponentActivity() { adventureScreenController: AdventureScreenControllerImpl, storageScreenController: StorageScreenControllerImpl, homeScreenController: HomeScreenControllerImpl, - + spriteViewerController: SpriteViewerControllerImpl ) { AppNavigation( applicationNavigationHandlers = AppNavigationHandlers( @@ -99,7 +102,8 @@ class MainActivity : ComponentActivity() { itemsScreenController, adventureScreenController, storageScreenController, - homeScreenController + homeScreenController, + spriteViewerController ) ) } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt index b8d0f20..e2519ae 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt @@ -23,14 +23,15 @@ interface AdventureDao { uc.*, c.stage, c.attribute, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, d.isBEm as isBemCard, a.finishesAdventure AS finishesAdventure, a.originalDuration AS originalTimeInMinutes FROM UserCharacter uc JOIN Character c ON uc.charId = c.id + JOIN Sprite s ON s.id = c.spriteId JOIN Card d ON c.dimId = d.id JOIN Adventure a ON uc.id = a.characterId """) 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 a42e6c7..52b9f6b 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 @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.Query import com.github.nacabaro.vbhelper.domain.characters.Character -import com.github.nacabaro.vbhelper.domain.Sprites +import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.dtos.CharacterDtos @Dao @@ -22,10 +22,10 @@ interface CharacterDao { fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character @Insert - suspend fun insertSprite(vararg sprite: Sprites) + suspend fun insertSprite(vararg sprite: Sprite) - @Query("SELECT * FROM Sprites") - suspend fun getAllSprites(): List + @Query("SELECT * FROM Sprite") + suspend fun getAllSprites(): List @Query( """ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt index d20b76f..bd6655f 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt @@ -19,11 +19,12 @@ interface DexDao { @Query(""" SELECT c.id AS id, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, d.discoveredOn AS discoveredOn - FROM character c + FROM Character c + JOIN Sprite s ON c.spriteId = s.id LEFT JOIN dex d ON c.id = d.id WHERE c.dimId = :cardId """) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt new file mode 100644 index 0000000..4d8d6e6 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt @@ -0,0 +1,16 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.github.nacabaro.vbhelper.domain.characters.Sprite + +@Dao +interface SpriteDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertSprite(sprite: Sprite): Long + + @Query("SELECT * FROM Sprite") + suspend fun getAllSprites(): List +} \ 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 3bfdd6f..e5f16e5 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 @@ -31,13 +31,14 @@ interface UserCharacterDao { @Query(""" SELECT c.id AS id, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, c.monIndex AS monIndex, t.transformationDate AS transformationDate FROM TransformationHistory t JOIN Character c ON c.id = t.stageId + JOIN Sprite s ON s.id = c.spriteId WHERE monId = :monId """) fun getTransformationHistory(monId: Long): List? @@ -48,9 +49,10 @@ interface UserCharacterDao { uc.*, c.stage, c.attribute, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.spriteIdle2 AS spriteIdle2, + s.width AS spriteWidth, + s.height AS spriteHeight, c.name as nameSprite, c.nameWidth as nameSpriteWidth, c.nameHeight as nameSpriteHeight, @@ -58,7 +60,8 @@ interface UserCharacterDao { a.characterId = uc.id as isInAdventure FROM UserCharacter uc JOIN Character c ON uc.charId = c.id - JOIN Card d ON c.dimId = d.id + JOIN Card d ON d.id = c.dimId + JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id """ ) @@ -70,9 +73,10 @@ interface UserCharacterDao { uc.*, c.stage, c.attribute, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.spriteIdle2 AS spriteIdle2, + s.width AS spriteWidth, + s.height AS spriteHeight, c.name as nameSprite, c.nameWidth as nameSpriteWidth, c.nameHeight as nameSpriteHeight, @@ -81,6 +85,7 @@ interface UserCharacterDao { FROM UserCharacter uc JOIN Character c ON uc.charId = c.id JOIN Card d ON c.dimId = d.id + JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id WHERE uc.id = :id """) @@ -98,9 +103,10 @@ interface UserCharacterDao { uc.*, c.stage, c.attribute, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.spriteIdle2 AS spriteIdle2, + s.width AS spriteWidth, + s.height AS spriteHeight, c.name as nameSprite, c.nameWidth as nameSpriteWidth, c.nameHeight as nameSpriteHeight, @@ -109,6 +115,7 @@ interface UserCharacterDao { FROM UserCharacter uc JOIN Character c ON uc.charId = c.id JOIN Card d ON c.dimId = d.id + JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id WHERE uc.isActive = 1 LIMIT 1 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 6b5bf5f..3779378 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 @@ -7,10 +7,11 @@ import com.github.nacabaro.vbhelper.daos.CharacterDao import com.github.nacabaro.vbhelper.daos.DexDao import com.github.nacabaro.vbhelper.daos.DiMDao import com.github.nacabaro.vbhelper.daos.ItemDao +import com.github.nacabaro.vbhelper.daos.SpriteDao import com.github.nacabaro.vbhelper.daos.UserCharacterDao import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.domain.characters.Card -import com.github.nacabaro.vbhelper.domain.Sprites +import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.domain.characters.Adventure import com.github.nacabaro.vbhelper.domain.characters.Dex import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData @@ -23,7 +24,7 @@ import com.github.nacabaro.vbhelper.domain.items.Items entities = [ Card::class, Character::class, - Sprites::class, + Sprite::class, UserCharacter::class, BECharacterData::class, TransformationHistory::class, @@ -39,4 +40,5 @@ abstract class AppDatabase : RoomDatabase() { abstract fun dexDao(): DexDao abstract fun itemDao(): ItemDao abstract fun adventureDao(): AdventureDao + abstract fun spriteDao(): SpriteDao } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt deleted file mode 100644 index cf4de84..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.nacabaro.vbhelper.domain - -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity -data class Sprites( - @PrimaryKey(autoGenerate = true) val id : Int, - val sprite: ByteArray, - val width: Int, - val height: Int -) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt index 0480b08..b521edf 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt @@ -12,9 +12,16 @@ import com.github.cfogrady.vbnfc.data.NfcCharacter parentColumns = ["id"], childColumns = ["dimId"], onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = Sprite::class, + parentColumns = ["id"], + childColumns = ["spriteId"], + onDelete = ForeignKey.CASCADE ) ] ) + /* * Character represents a character on a DIM card. There should only be one of these per dimId * and monIndex. @@ -23,6 +30,7 @@ import com.github.cfogrady.vbnfc.data.NfcCharacter data class Character ( @PrimaryKey(autoGenerate = true) val id: Long = 0, val dimId: Long, + val spriteId: Long, val monIndex: Int, val name: ByteArray, val stage: Int, // These should be replaced with enums @@ -30,10 +38,6 @@ data class Character ( val baseHp: Int, val baseBp: Int, val baseAp: Int, - val sprite1: ByteArray, - val sprite2: ByteArray, val nameWidth: Int, - val nameHeight: Int, - val spritesWidth: Int, - val spritesHeight: Int + val nameHeight: Int ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt new file mode 100644 index 0000000..1cb0d00 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt @@ -0,0 +1,23 @@ +package com.github.nacabaro.vbhelper.domain.characters + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class Sprite( + @PrimaryKey(autoGenerate = true) val id : Int = 0, + val spriteIdle1: ByteArray, + val spriteIdle2: ByteArray, + val spriteWalk1: ByteArray, + val spriteWalk2: ByteArray, + val spriteRun1: ByteArray, + val spriteRun2: ByteArray, + val spriteTrain1: ByteArray, + val spriteTrain2: ByteArray, + val spriteHappy: ByteArray, + val spriteSleep: ByteArray, + val spriteAttack: ByteArray, + val spriteDodge: ByteArray, + val width: Int, + val height: Int +) 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 2e5865a..435bc61 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 @@ -25,6 +25,7 @@ object CharacterDtos { var heartRateCurrent: Int, var characterType: DeviceType, val spriteIdle: ByteArray, + val spriteIdle2: ByteArray, val spriteWidth: Int, val spriteHeight: Int, val nameSprite: ByteArray, 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 b65d72b..f7b992f 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 @@ -15,7 +15,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen -import com.github.nacabaro.vbhelper.screens.SpriteViewer +import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewer import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreen import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen @@ -24,6 +24,7 @@ import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControl import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreen import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.CreditsScreen +import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewerControllerImpl import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl data class AppNavigationHandlers( @@ -32,7 +33,8 @@ data class AppNavigationHandlers( val itemsScreenController: ItemsScreenControllerImpl, val adventureScreenController: AdventureScreenControllerImpl, val storageScreenController: StorageScreenControllerImpl, - val homeScreenController: HomeScreenControllerImpl + val homeScreenController: HomeScreenControllerImpl, + val spriteViewerController: SpriteViewerControllerImpl ) @Composable @@ -91,7 +93,8 @@ fun AppNavigation( } composable(NavigationItems.Viewer.route) { SpriteViewer( - navController = navController + navController = navController, + spriteViewerController = applicationNavigationHandlers.spriteViewerController ) } composable(NavigationItems.CardView.route) { 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 6e87c13..372f859 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 @@ -10,11 +10,12 @@ import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import com.github.cfogrady.vb.dim.card.BemCard +import com.github.cfogrady.vb.dim.card.DimCard import com.github.cfogrady.vb.dim.card.DimReader import com.github.cfogrady.vbnfc.data.NfcCharacter import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.di.VBHelper -import com.github.nacabaro.vbhelper.domain.Sprites +import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.domain.characters.Card import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.source.ApkSecretsImporter @@ -139,9 +140,53 @@ class SettingsScreenControllerImpl( val domainCharacters = mutableListOf() for (index in 0 until characters.size) { + var domainSprite: Sprite? = null; + + if (index < 2 && card is DimCard) { + domainSprite = Sprite( + width = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.width, + height = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.height, + spriteIdle1 = card.spriteData.sprites[spriteCounter + 1].pixelData, + spriteIdle2 = card.spriteData.sprites[spriteCounter + 2].pixelData, + spriteWalk1 = card.spriteData.sprites[spriteCounter + 1].pixelData, + spriteWalk2 = card.spriteData.sprites[spriteCounter + 3].pixelData, + spriteRun1 = card.spriteData.sprites[spriteCounter + 1].pixelData, + spriteRun2 = card.spriteData.sprites[spriteCounter + 3].pixelData, + spriteTrain1 = card.spriteData.sprites[spriteCounter + 1].pixelData, + spriteTrain2 = card.spriteData.sprites[spriteCounter + 3].pixelData, + spriteHappy = card.spriteData.sprites[spriteCounter + 4].pixelData, + spriteSleep = card.spriteData.sprites[spriteCounter + 5].pixelData, + spriteAttack = card.spriteData.sprites[spriteCounter + 2].pixelData, + spriteDodge = card.spriteData.sprites[spriteCounter + 3].pixelData + ) + } else { + domainSprite = Sprite( + width = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.width, + height = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.height, + spriteIdle1 = card.spriteData.sprites[spriteCounter + 1].pixelData, + spriteIdle2 = card.spriteData.sprites[spriteCounter + 2].pixelData, + spriteWalk1 = card.spriteData.sprites[spriteCounter + 3].pixelData, + spriteWalk2 = card.spriteData.sprites[spriteCounter + 4].pixelData, + spriteRun1 = card.spriteData.sprites[spriteCounter + 5].pixelData, + spriteRun2 = card.spriteData.sprites[spriteCounter + 6].pixelData, + spriteTrain1 = card.spriteData.sprites[spriteCounter + 7].pixelData, + spriteTrain2 = card.spriteData.sprites[spriteCounter + 8].pixelData, + spriteHappy = card.spriteData.sprites[spriteCounter + 9].pixelData, + spriteSleep = card.spriteData.sprites[spriteCounter + 10].pixelData, + spriteAttack = card.spriteData.sprites[spriteCounter + 11].pixelData, + spriteDodge = card.spriteData.sprites[spriteCounter + 12].pixelData + ) + } + + + val spriteId = database + .spriteDao() + .insertSprite(domainSprite) + domainCharacters.add( Character( dimId = dimId, + spriteId = spriteId, monIndex = index, name = card.spriteData.sprites[spriteCounter].pixelData, stage = characters[index].stage, @@ -149,12 +194,8 @@ class SettingsScreenControllerImpl( baseHp = characters[index].hp, baseBp = characters[index].dp, baseAp = characters[index].ap, - sprite1 = card.spriteData.sprites[spriteCounter + 1].pixelData, - sprite2 = card.spriteData.sprites[spriteCounter + 2].pixelData, - nameWidth = card.spriteData.sprites[spriteCounter].width, - nameHeight = card.spriteData.sprites[spriteCounter].height, - spritesWidth = card.spriteData.sprites[spriteCounter + 1].width, - spritesHeight = card.spriteData.sprites[spriteCounter + 1].height + nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width, + nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height, ) ) @@ -172,18 +213,6 @@ class SettingsScreenControllerImpl( database .characterDao() .insertCharacter(*domainCharacters.toTypedArray()) - - val sprites = card.spriteData.sprites.map { sprite -> - Sprites( - id = 0, - sprite = sprite.pixelData, - width = sprite.width, - height = sprite.height - ) - } - database - .characterDao() - .insertSprite(*sprites.toTypedArray()) } inputStream?.close() 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/SpriteViewer.kt similarity index 61% rename from app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt index cfa6040..6376ebe 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt @@ -1,25 +1,19 @@ -package com.github.nacabaro.vbhelper.screens +package com.github.nacabaro.vbhelper.screens.spriteViewer import android.graphics.Bitmap import android.util.Log import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext @@ -27,29 +21,25 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.di.VBHelper -import com.github.nacabaro.vbhelper.domain.Sprites import com.github.nacabaro.vbhelper.source.SpriteRepo import kotlinx.coroutines.launch import java.nio.ByteBuffer @Composable fun SpriteViewer( - navController: NavController + navController: NavController, + spriteViewerController: SpriteViewerController ) { val coroutineScope = rememberCoroutineScope() - val application = LocalContext.current.applicationContext as VBHelper - val db = application.container.db - val spriteRepo = SpriteRepo(db) - val spriteList = remember { mutableStateListOf() } + val spriteList = remember { mutableStateListOf() } Log.d("SpriteViewer", "spriteList: $spriteList") - LaunchedEffect(spriteRepo) { - coroutineScope.launch { - spriteList.clear() - spriteList.addAll(spriteRepo.getAllSprites()) - } + LaunchedEffect(spriteViewerController) { + val sprites = spriteViewerController.getAllSprites() + val bitmapData = spriteViewerController.convertToBitmap(sprites) + spriteList.addAll(bitmapData) } Scaffold ( @@ -69,13 +59,7 @@ fun SpriteViewer( .padding(top = contentPadding.calculateTopPadding()) ) { items(spriteList) { sprite -> - val bitmap = remember (sprite.sprite) { - Log.d("SpriteViewer", "sprite: $sprite") - Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { - copyPixelsFromBuffer(ByteBuffer.wrap(sprite.sprite)) - } - } - val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } + val imageBitmap = remember(sprite) { sprite.asImageBitmap() } Image( bitmap = imageBitmap, contentDescription = "Sprite", diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt new file mode 100644 index 0000000..f53d800 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt @@ -0,0 +1,9 @@ +package com.github.nacabaro.vbhelper.screens.spriteViewer + +import android.graphics.Bitmap +import com.github.nacabaro.vbhelper.domain.characters.Sprite + +interface SpriteViewerController { + suspend fun getAllSprites(): List + fun convertToBitmap(sprites: List): List +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt new file mode 100644 index 0000000..1413f6b --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt @@ -0,0 +1,68 @@ +package com.github.nacabaro.vbhelper.screens.spriteViewer + +import android.graphics.Bitmap +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.compose.runtime.remember +import androidx.compose.ui.graphics.asImageBitmap +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.domain.characters.Sprite +import java.nio.ByteBuffer + +class SpriteViewerControllerImpl( + private val context: ComponentActivity +) : SpriteViewerController { + override suspend fun getAllSprites(): List { + val applicationContext = context.applicationContext as VBHelper + val db = applicationContext.container.db + val sprites = db.spriteDao().getAllSprites() + return sprites + } + + // I don't like this, chief + override fun convertToBitmap(sprites: List): List { + val bitmapList = mutableListOf() + + for (sprite in sprites) { + Log.d("SpriteViewer", "sprite: $sprite") + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteIdle1)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteIdle2)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteWalk1)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteWalk2)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteRun1)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteRun2)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteTrain1)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteTrain2)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteHappy)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteSleep)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteAttack)) + }) + bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply { + copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteDodge)) + }) + } + + return bitmapList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt index 84c0dbb..7418947 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt @@ -1,12 +1,12 @@ package com.github.nacabaro.vbhelper.source import com.github.nacabaro.vbhelper.database.AppDatabase -import com.github.nacabaro.vbhelper.domain.Sprites +import com.github.nacabaro.vbhelper.domain.characters.Sprite class SpriteRepo ( private val db: AppDatabase ) { - suspend fun getAllSprites(): List { + suspend fun getAllSprites(): List { return db.characterDao().getAllSprites() } } From 3f324ca14122a532f5ab09ac0c19880c19f564d1 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 27 Jul 2025 19:44:12 +0200 Subject: [PATCH 6/9] SpriteRepo is not needed anymore --- .../github/nacabaro/vbhelper/source/SpriteRepo.kt | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt deleted file mode 100644 index 7418947..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.nacabaro.vbhelper.source - -import com.github.nacabaro.vbhelper.database.AppDatabase -import com.github.nacabaro.vbhelper.domain.characters.Sprite - -class SpriteRepo ( - private val db: AppDatabase -) { - suspend fun getAllSprites(): List { - return db.characterDao().getAllSprites() - } -} From 39ba48d867ac1aca17af3bc5bfe87ebbef4564a2 Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 27 Jul 2025 19:46:07 +0200 Subject: [PATCH 7/9] Forgot to remove the dependency to SpriteRepo --- .../nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt index 6376ebe..e111ad7 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt @@ -16,22 +16,15 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner -import com.github.nacabaro.vbhelper.di.VBHelper -import com.github.nacabaro.vbhelper.source.SpriteRepo -import kotlinx.coroutines.launch -import java.nio.ByteBuffer @Composable fun SpriteViewer( navController: NavController, spriteViewerController: SpriteViewerController ) { - val coroutineScope = rememberCoroutineScope() - val spriteList = remember { mutableStateListOf() } Log.d("SpriteViewer", "spriteList: $spriteList") From 1a150ce7cec34101dd13b8af9110649677071335 Mon Sep 17 00:00:00 2001 From: Nacho Date: Mon, 28 Jul 2025 23:58:41 +0200 Subject: [PATCH 8/9] Few things: - Speed up the fade animation a tad bit - Added a back arrow in the scan screen - Improved a bit the placeholder of the battles screen, since it'd throw out the transition animation. --- .../vbhelper/navigation/AppNavigation.kt | 20 ++++++++++- .../vbhelper/screens/BattlesScreen.kt | 33 +++++++++++++++++-- .../vbhelper/screens/scanScreen/ScanScreen.kt | 13 ++++++-- 3 files changed, 61 insertions(+), 5 deletions(-) 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 f7b992f..03e0d78 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 @@ -1,5 +1,10 @@ package com.github.nacabaro.vbhelper.navigation +import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable @@ -51,11 +56,24 @@ fun AppNavigation( NavHost( navController = navController, startDestination = NavigationItems.Home.route, + enterTransition = { + fadeIn( + animationSpec = tween(200) + ) + }, + exitTransition = { + fadeOut( + animationSpec = tween(200) + ) + }, modifier = Modifier .padding(contentPadding) + ) { composable(NavigationItems.Battles.route) { - BattlesScreen() + BattlesScreen( + navController = navController + ) } composable(NavigationItems.Home.route) { HomeScreen( diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt index c9543c8..d7f9d5d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt @@ -1,9 +1,38 @@ package com.github.nacabaro.vbhelper.screens +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.foundation.layout.size +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.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.navigation.NavigationItems @Composable -fun BattlesScreen() { - Text("Battles Screen") +fun BattlesScreen( + navController: NavController +) { + Scaffold ( + topBar = { + TopBanner( + text = "Online battles" + ) + } + ) { contentPadding -> + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + .fillMaxSize() + ) { + Text("Coming soon") + } + } } 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 a4cbb03..0f45508 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 @@ -184,7 +184,8 @@ fun ScanScreen( } } } - } + }, + navController = navController ) } } @@ -193,9 +194,17 @@ fun ScanScreen( fun ChooseConnectOption( onClickRead: (() -> Unit)? = null, onClickWrite: (() -> Unit)? = null, + navController: NavController ) { Scaffold( - topBar = { TopBanner(text = "Scan a Vital Bracelet") } + topBar = { + TopBanner( + text = "Scan a Vital Bracelet", + onBackClick = { + navController.popBackStack() + } + ) + } ) { contentPadding -> Column( verticalArrangement = Arrangement.Center, From 13051145b79aba8fb95355e573a7ffe8e3e1e7c7 Mon Sep 17 00:00:00 2001 From: Nacho Date: Tue, 29 Jul 2025 00:01:02 +0200 Subject: [PATCH 9/9] Few things: - Speed up the fade animation a tad bit - Added a back arrow in the scan screen - Improved a bit the placeholder of the battles screen, since it'd throw out the transition animation. --- .../github/nacabaro/vbhelper/navigation/AppNavigation.kt | 6 +----- .../com/github/nacabaro/vbhelper/screens/BattlesScreen.kt | 7 +------ 2 files changed, 2 insertions(+), 11 deletions(-) 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 03e0d78..c2fd07c 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 @@ -1,7 +1,5 @@ package com.github.nacabaro.vbhelper.navigation -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -71,9 +69,7 @@ fun AppNavigation( ) { composable(NavigationItems.Battles.route) { - BattlesScreen( - navController = navController - ) + BattlesScreen() } composable(NavigationItems.Home.route) { HomeScreen( diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt index d7f9d5d..b50ef12 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt @@ -4,20 +4,15 @@ 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.foundation.layout.size 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.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner -import com.github.nacabaro.vbhelper.navigation.NavigationItems @Composable -fun BattlesScreen( - navController: NavController -) { +fun BattlesScreen() { Scaffold ( topBar = { TopBanner(