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 53% 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..e111ad7 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,55 +1,38 @@ -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 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 +52,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 deleted file mode 100644 index 84c0dbb..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.Sprites - -class SpriteRepo ( - private val db: AppDatabase -) { - suspend fun getAllSprites(): List { - return db.characterDao().getAllSprites() - } -}