mirror of
https://github.com/nacabaro/vbhelper.git
synced 2026-10-01 15:41:36 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93f568dd8d |
@@ -91,4 +91,7 @@ dependencies {
|
|||||||
implementation("com.google.android.material:material:1.2.0")
|
implementation("com.google.android.material:material:1.2.0")
|
||||||
implementation(libs.protobuf.javalite)
|
implementation(libs.protobuf.javalite)
|
||||||
implementation("androidx.compose.material:material")
|
implementation("androidx.compose.material:material")
|
||||||
|
implementation("androidx.glance:glance:1.1.1")
|
||||||
|
implementation("androidx.glance:glance-appwidget:1.1.1")
|
||||||
|
implementation("androidx.work:work-runtime-ktx:2.9.0")
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,15 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<receiver android:name=".widget.CharacterDisplayWidgetReceiver"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/widget_info" />
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -14,7 +14,6 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp
|
|||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
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.screens.storageScreen.StorageScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme
|
import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme
|
||||||
|
|
||||||
@@ -46,7 +45,6 @@ class MainActivity : ComponentActivity() {
|
|||||||
val adventureScreenController = AdventureScreenControllerImpl(this)
|
val adventureScreenController = AdventureScreenControllerImpl(this)
|
||||||
val storageScreenController = StorageScreenControllerImpl(this)
|
val storageScreenController = StorageScreenControllerImpl(this)
|
||||||
val homeScreenController = HomeScreenControllerImpl(this)
|
val homeScreenController = HomeScreenControllerImpl(this)
|
||||||
val spriteViewerController = SpriteViewerControllerImpl(this)
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -60,8 +58,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
itemsScreenController = itemsScreenController,
|
itemsScreenController = itemsScreenController,
|
||||||
adventureScreenController = adventureScreenController,
|
adventureScreenController = adventureScreenController,
|
||||||
homeScreenController = homeScreenController,
|
homeScreenController = homeScreenController,
|
||||||
storageScreenController = storageScreenController,
|
storageScreenController = storageScreenController
|
||||||
spriteViewerController = spriteViewerController
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,7 +90,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
adventureScreenController: AdventureScreenControllerImpl,
|
adventureScreenController: AdventureScreenControllerImpl,
|
||||||
storageScreenController: StorageScreenControllerImpl,
|
storageScreenController: StorageScreenControllerImpl,
|
||||||
homeScreenController: HomeScreenControllerImpl,
|
homeScreenController: HomeScreenControllerImpl,
|
||||||
spriteViewerController: SpriteViewerControllerImpl
|
|
||||||
) {
|
) {
|
||||||
AppNavigation(
|
AppNavigation(
|
||||||
applicationNavigationHandlers = AppNavigationHandlers(
|
applicationNavigationHandlers = AppNavigationHandlers(
|
||||||
@@ -102,8 +99,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
itemsScreenController,
|
itemsScreenController,
|
||||||
adventureScreenController,
|
adventureScreenController,
|
||||||
storageScreenController,
|
storageScreenController,
|
||||||
homeScreenController,
|
homeScreenController
|
||||||
spriteViewerController
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,15 +23,14 @@ interface AdventureDao {
|
|||||||
uc.*,
|
uc.*,
|
||||||
c.stage,
|
c.stage,
|
||||||
c.attribute,
|
c.attribute,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.width AS spriteWidth,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.height AS spriteHeight,
|
c.spritesHeight AS spriteHeight,
|
||||||
d.isBEm as isBemCard,
|
d.isBEm as isBemCard,
|
||||||
a.finishesAdventure AS finishesAdventure,
|
a.finishesAdventure AS finishesAdventure,
|
||||||
a.originalDuration AS originalTimeInMinutes
|
a.originalDuration AS originalTimeInMinutes
|
||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
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 Card d ON c.dimId = d.id
|
||||||
JOIN Adventure a ON uc.id = a.characterId
|
JOIN Adventure a ON uc.id = a.characterId
|
||||||
""")
|
""")
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.daos
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Query
|
|
||||||
import androidx.room.Upsert
|
|
||||||
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
interface CardProgressDao {
|
|
||||||
@Upsert
|
|
||||||
fun updateDimProgress(vararg cardProgresses: CardProgress)
|
|
||||||
|
|
||||||
@Query(
|
|
||||||
"SELECT currentStage FROM CardProgress WHERE cardId = :cardId"
|
|
||||||
)
|
|
||||||
fun getCardProgress(cardId: Int): Int
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ import androidx.room.Dao
|
|||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
import com.github.nacabaro.vbhelper.domain.Sprites
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
@@ -12,24 +12,40 @@ interface CharacterDao {
|
|||||||
@Insert
|
@Insert
|
||||||
suspend fun insertCharacter(vararg characterData: Character)
|
suspend fun insertCharacter(vararg characterData: Character)
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Character")
|
||||||
|
suspend fun getAllCharacters(): List<Character>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Character WHERE dimId = :dimId")
|
||||||
|
suspend fun getCharacterByDimId(dimId: Int): List<Character>
|
||||||
|
|
||||||
@Query("SELECT * FROM Character WHERE monIndex = :monIndex AND dimId = :dimId LIMIT 1")
|
@Query("SELECT * FROM Character WHERE monIndex = :monIndex AND dimId = :dimId LIMIT 1")
|
||||||
fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character
|
fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character
|
||||||
|
|
||||||
@Insert
|
@Insert
|
||||||
suspend fun insertSprite(vararg sprite: Sprite)
|
suspend fun insertSprite(vararg sprite: Sprites)
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Sprites")
|
||||||
|
suspend fun getAllSprites(): List<Sprites>
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
d.cardId as cardId,
|
d.dimId as cardId,
|
||||||
c.monIndex as charId,
|
c.monIndex as charId
|
||||||
c.stage as stage,
|
|
||||||
c.attribute as attribute
|
|
||||||
FROM Character c
|
FROM Character c
|
||||||
JOIN UserCharacter uc ON c.id = uc.charId
|
JOIN UserCharacter uc ON c.id = uc.charId
|
||||||
JOIN Card d ON c.dimId = d.id
|
JOIN Card d ON c.dimId = d.id
|
||||||
WHERE c.id = :charId
|
WHERE uc.id = :charId
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
suspend fun getCharacterInfo(charId: Long): CharacterDtos.CardCharacterInfo
|
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)
|
||||||
}
|
}
|
||||||
@@ -19,12 +19,11 @@ interface DexDao {
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS id,
|
c.id AS id,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.width AS spriteWidth,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.height AS spriteHeight,
|
c.spritesHeight AS spriteHeight,
|
||||||
d.discoveredOn AS discoveredOn
|
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
|
LEFT JOIN dex d ON c.id = d.id
|
||||||
WHERE c.dimId = :cardId
|
WHERE c.dimId = :cardId
|
||||||
""")
|
""")
|
||||||
|
|||||||
+6
-3
@@ -4,13 +4,16 @@ import androidx.room.Dao
|
|||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import com.github.nacabaro.vbhelper.domain.card.Card
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface CardDao {
|
interface DiMDao {
|
||||||
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
||||||
suspend fun insertNewDim(card: Card): Long
|
suspend fun insertNewDim(card: Card): Long
|
||||||
|
|
||||||
@Query("SELECT * FROM Card WHERE cardId = :id")
|
@Query("SELECT * FROM Card")
|
||||||
|
suspend fun getAllDims(): List<Card>
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Card WHERE dimId = :id")
|
||||||
fun getDimById(id: Int): Card?
|
fun getDimById(id: Int): Card?
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.daos
|
||||||
|
|
||||||
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Upsert
|
||||||
|
import com.github.nacabaro.vbhelper.domain.DimProgress
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
interface DiMProgressDao {
|
||||||
|
@Upsert
|
||||||
|
suspend fun updateDimProgress(vararg dimProgress: DimProgress)
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
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<Sprite>
|
|
||||||
}
|
|
||||||
@@ -8,10 +8,7 @@ import androidx.room.Upsert
|
|||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
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.UserCharacter
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory
|
import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
@@ -22,9 +19,6 @@ interface UserCharacterDao {
|
|||||||
@Insert
|
@Insert
|
||||||
fun insertBECharacterData(characterData: BECharacterData)
|
fun insertBECharacterData(characterData: BECharacterData)
|
||||||
|
|
||||||
@Insert
|
|
||||||
fun insertVBCharacterData(characterData: VBCharacterData)
|
|
||||||
|
|
||||||
@Upsert
|
@Upsert
|
||||||
fun updateCharacter(character: UserCharacter)
|
fun updateCharacter(character: UserCharacter)
|
||||||
|
|
||||||
@@ -34,23 +28,19 @@ interface UserCharacterDao {
|
|||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
fun insertTransformationHistory(vararg transformationHistory: TransformationHistory)
|
fun insertTransformationHistory(vararg transformationHistory: TransformationHistory)
|
||||||
|
|
||||||
@Insert
|
|
||||||
fun insertSpecialMissions(vararg specialMissions: SpecialMissions)
|
|
||||||
|
|
||||||
@Query("""
|
@Query("""
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS id,
|
c.id AS id,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.width AS spriteWidth,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.height AS spriteHeight,
|
c.spritesHeight AS spriteHeight,
|
||||||
c.monIndex AS monIndex,
|
c.monIndex AS monIndex,
|
||||||
t.transformationDate AS transformationDate
|
t.transformationDate AS transformationDate
|
||||||
FROM TransformationHistory t
|
FROM TransformationHistory t
|
||||||
JOIN Character c ON c.id = t.stageId
|
JOIN Character c ON c.id = t.stageId
|
||||||
JOIN Sprite s ON s.id = c.spriteId
|
|
||||||
WHERE monId = :monId
|
WHERE monId = :monId
|
||||||
""")
|
""")
|
||||||
suspend fun getTransformationHistory(monId: Long): List<CharacterDtos.TransformationHistory>?
|
fun getTransformationHistory(monId: Long): List<CharacterDtos.TransformationHistory>?
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
@@ -58,10 +48,9 @@ interface UserCharacterDao {
|
|||||||
uc.*,
|
uc.*,
|
||||||
c.stage,
|
c.stage,
|
||||||
c.attribute,
|
c.attribute,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.spriteIdle2 AS spriteIdle2,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.width AS spriteWidth,
|
c.spritesHeight AS spriteHeight,
|
||||||
s.height AS spriteHeight,
|
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -69,8 +58,7 @@ interface UserCharacterDao {
|
|||||||
a.characterId = uc.id as isInAdventure
|
a.characterId = uc.id as isInAdventure
|
||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON d.id = c.dimId
|
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
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
@@ -82,10 +70,9 @@ interface UserCharacterDao {
|
|||||||
uc.*,
|
uc.*,
|
||||||
c.stage,
|
c.stage,
|
||||||
c.attribute,
|
c.attribute,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.spriteIdle2 AS spriteIdle2,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.width AS spriteWidth,
|
c.spritesHeight AS spriteHeight,
|
||||||
s.height AS spriteHeight,
|
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -94,7 +81,6 @@ interface UserCharacterDao {
|
|||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON c.dimId = d.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
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
WHERE uc.id = :id
|
WHERE uc.id = :id
|
||||||
""")
|
""")
|
||||||
@@ -106,22 +92,15 @@ interface UserCharacterDao {
|
|||||||
@Query("SELECT * FROM BECharacterData WHERE id = :id")
|
@Query("SELECT * FROM BECharacterData WHERE id = :id")
|
||||||
suspend fun getBeData(id: Long): BECharacterData
|
suspend fun getBeData(id: Long): BECharacterData
|
||||||
|
|
||||||
@Query("SELECT * FROM VBCharacterData WHERE id = :id")
|
|
||||||
suspend fun getVbData(id: Long): VBCharacterData
|
|
||||||
|
|
||||||
@Query("SELECT * FROM SpecialMissions WHERE characterId = :id")
|
|
||||||
suspend fun getSpecialMissions(id: Long): List<SpecialMissions>
|
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
uc.*,
|
uc.*,
|
||||||
c.stage,
|
c.stage,
|
||||||
c.attribute,
|
c.attribute,
|
||||||
s.spriteIdle1 AS spriteIdle,
|
c.sprite1 AS spriteIdle,
|
||||||
s.spriteIdle2 AS spriteIdle2,
|
c.spritesWidth AS spriteWidth,
|
||||||
s.width AS spriteWidth,
|
c.spritesHeight AS spriteHeight,
|
||||||
s.height AS spriteHeight,
|
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -130,7 +109,6 @@ interface UserCharacterDao {
|
|||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON c.dimId = d.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
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
WHERE uc.isActive = 1
|
WHERE uc.isActive = 1
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
@@ -156,20 +134,4 @@ interface UserCharacterDao {
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
suspend fun getCharacterInfo(charId: Long): Character
|
suspend fun getCharacterInfo(charId: Long): Character
|
||||||
|
|
||||||
|
|
||||||
@Query("""
|
|
||||||
INSERT INTO TransformationHistory(monId, stageId, transformationDate)
|
|
||||||
VALUES
|
|
||||||
(:monId,
|
|
||||||
(SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId),
|
|
||||||
:transformationDate)
|
|
||||||
""")
|
|
||||||
fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long)
|
|
||||||
|
|
||||||
@Upsert
|
|
||||||
fun insertVitals(vararg vitalsHistory: VitalsHistory)
|
|
||||||
|
|
||||||
@Query("""SELECT * FROM VitalsHistory WHERE charId = :charId ORDER BY id ASC""")
|
|
||||||
suspend fun getVitalsHistory(charId: Long): List<VitalsHistory>
|
|
||||||
}
|
}
|
||||||
@@ -5,50 +5,38 @@ import androidx.room.RoomDatabase
|
|||||||
import com.github.nacabaro.vbhelper.daos.AdventureDao
|
import com.github.nacabaro.vbhelper.daos.AdventureDao
|
||||||
import com.github.nacabaro.vbhelper.daos.CharacterDao
|
import com.github.nacabaro.vbhelper.daos.CharacterDao
|
||||||
import com.github.nacabaro.vbhelper.daos.DexDao
|
import com.github.nacabaro.vbhelper.daos.DexDao
|
||||||
import com.github.nacabaro.vbhelper.daos.CardDao
|
import com.github.nacabaro.vbhelper.daos.DiMDao
|
||||||
import com.github.nacabaro.vbhelper.daos.CardProgressDao
|
|
||||||
import com.github.nacabaro.vbhelper.daos.ItemDao
|
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.daos.UserCharacterDao
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.domain.card.Card
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
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.Adventure
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Dex
|
import com.github.nacabaro.vbhelper.domain.characters.Dex
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory
|
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.UserCharacter
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
|
||||||
import com.github.nacabaro.vbhelper.domain.items.Items
|
import com.github.nacabaro.vbhelper.domain.items.Items
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
version = 1,
|
version = 1,
|
||||||
entities = [
|
entities = [
|
||||||
Card::class,
|
Card::class,
|
||||||
CardProgress::class,
|
|
||||||
Character::class,
|
Character::class,
|
||||||
Sprite::class,
|
Sprites::class,
|
||||||
UserCharacter::class,
|
UserCharacter::class,
|
||||||
BECharacterData::class,
|
BECharacterData::class,
|
||||||
VBCharacterData::class,
|
|
||||||
SpecialMissions::class,
|
|
||||||
TransformationHistory::class,
|
TransformationHistory::class,
|
||||||
VitalsHistory::class,
|
|
||||||
Dex::class,
|
Dex::class,
|
||||||
Items::class,
|
Items::class,
|
||||||
Adventure::class
|
Adventure::class
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
abstract class AppDatabase : RoomDatabase() {
|
abstract class AppDatabase : RoomDatabase() {
|
||||||
abstract fun cardDao(): CardDao
|
abstract fun dimDao(): DiMDao
|
||||||
abstract fun cardProgressDao(): CardProgressDao
|
|
||||||
abstract fun characterDao(): CharacterDao
|
abstract fun characterDao(): CharacterDao
|
||||||
abstract fun userCharacterDao(): UserCharacterDao
|
abstract fun userCharacterDao(): UserCharacterDao
|
||||||
abstract fun dexDao(): DexDao
|
abstract fun dexDao(): DexDao
|
||||||
abstract fun itemDao(): ItemDao
|
abstract fun itemDao(): ItemDao
|
||||||
abstract fun adventureDao(): AdventureDao
|
abstract fun adventureDao(): AdventureDao
|
||||||
abstract fun spriteDao(): SpriteDao
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.domain
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.ForeignKey
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
|
|
||||||
|
@Entity(
|
||||||
|
foreignKeys = [
|
||||||
|
ForeignKey(
|
||||||
|
entity = User::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["userId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
),
|
||||||
|
ForeignKey(
|
||||||
|
entity = Card::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["dimId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
data class DimProgress(
|
||||||
|
@PrimaryKey val dimId: Int,
|
||||||
|
@PrimaryKey val userId: Int,
|
||||||
|
val currentStage: Int,
|
||||||
|
val unlocked: Boolean
|
||||||
|
)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
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
|
||||||
|
)
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.card
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.ForeignKey
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity(
|
|
||||||
foreignKeys = [
|
|
||||||
ForeignKey(
|
|
||||||
entity = Card::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["cardId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
data class CardProgress(
|
|
||||||
@PrimaryKey val cardId: Long,
|
|
||||||
val currentStage: Int,
|
|
||||||
val unlocked: Boolean
|
|
||||||
)
|
|
||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.card
|
package com.github.nacabaro.vbhelper.domain.characters
|
||||||
|
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
@@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
|
|||||||
data class Card(
|
data class Card(
|
||||||
@PrimaryKey(autoGenerate = true)
|
@PrimaryKey(autoGenerate = true)
|
||||||
val id: Long = 0,
|
val id: Long = 0,
|
||||||
val cardId: Int,
|
val dimId: Int,
|
||||||
val logo: ByteArray,
|
val logo: ByteArray,
|
||||||
val logoWidth: Int,
|
val logoWidth: Int,
|
||||||
val logoHeight: Int,
|
val logoHeight: Int,
|
||||||
@@ -4,7 +4,6 @@ import androidx.room.Entity
|
|||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import androidx.room.ForeignKey
|
import androidx.room.ForeignKey
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
import com.github.nacabaro.vbhelper.domain.card.Card
|
|
||||||
|
|
||||||
@Entity(
|
@Entity(
|
||||||
foreignKeys = [
|
foreignKeys = [
|
||||||
@@ -13,25 +12,17 @@ import com.github.nacabaro.vbhelper.domain.card.Card
|
|||||||
parentColumns = ["id"],
|
parentColumns = ["id"],
|
||||||
childColumns = ["dimId"],
|
childColumns = ["dimId"],
|
||||||
onDelete = ForeignKey.CASCADE
|
onDelete = ForeignKey.CASCADE
|
||||||
),
|
|
||||||
ForeignKey(
|
|
||||||
entity = Sprite::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["spriteId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Character represents a character on a card. There should only be one of these per dimId
|
* Character represents a character on a DIM card. There should only be one of these per dimId
|
||||||
* and monIndex.
|
* and monIndex.
|
||||||
* TODO: Customs will mean this should be unique per cardName and monIndex
|
* TODO: Customs will mean this should be unique per cardName and monIndex
|
||||||
*/
|
*/
|
||||||
data class Character (
|
data class Character (
|
||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
val dimId: Long,
|
val dimId: Long,
|
||||||
val spriteId: Long,
|
|
||||||
val monIndex: Int,
|
val monIndex: Int,
|
||||||
val name: ByteArray,
|
val name: ByteArray,
|
||||||
val stage: Int, // These should be replaced with enums
|
val stage: Int, // These should be replaced with enums
|
||||||
@@ -39,6 +30,10 @@ data class Character (
|
|||||||
val baseHp: Int,
|
val baseHp: Int,
|
||||||
val baseBp: Int,
|
val baseBp: Int,
|
||||||
val baseAp: Int,
|
val baseAp: Int,
|
||||||
|
val sprite1: ByteArray,
|
||||||
|
val sprite2: ByteArray,
|
||||||
val nameWidth: Int,
|
val nameWidth: Int,
|
||||||
val nameHeight: Int
|
val nameHeight: Int,
|
||||||
|
val spritesWidth: Int,
|
||||||
|
val spritesHeight: Int
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
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
|
|
||||||
)
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.device_data
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.ForeignKey
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
import com.github.cfogrady.vbnfc.vb.SpecialMission
|
|
||||||
|
|
||||||
@Entity(
|
|
||||||
foreignKeys = [
|
|
||||||
ForeignKey(
|
|
||||||
entity = UserCharacter::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["characterId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
data class SpecialMissions (
|
|
||||||
@PrimaryKey(autoGenerate = true) var id: Long = 0,
|
|
||||||
var characterId: Long,
|
|
||||||
var goal: Int,
|
|
||||||
val watchId: Int,
|
|
||||||
val progress: Int,
|
|
||||||
val status: SpecialMission.Status,
|
|
||||||
val timeElapsedInMinutes: Int,
|
|
||||||
val timeLimitInMinutes: Int,
|
|
||||||
val missionType: SpecialMission.Type
|
|
||||||
)
|
|
||||||
@@ -24,6 +24,7 @@ data class UserCharacter (
|
|||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
var charId: Long,
|
var charId: Long,
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
|
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
|
|||||||
+2
-19
@@ -1,21 +1,4 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.device_data
|
package com.github.nacabaro.vbhelper.domain.device_data
|
||||||
|
|
||||||
import androidx.room.Entity
|
class VBCharacterData {
|
||||||
import androidx.room.ForeignKey
|
}
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity(
|
|
||||||
foreignKeys = [
|
|
||||||
ForeignKey(
|
|
||||||
entity = UserCharacter::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["id"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
data class VBCharacterData (
|
|
||||||
@PrimaryKey val id: Long,
|
|
||||||
val generation: Int,
|
|
||||||
val totalTrophies: Int
|
|
||||||
)
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.device_data
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.ForeignKey
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity(
|
|
||||||
foreignKeys = [
|
|
||||||
ForeignKey(
|
|
||||||
entity = UserCharacter::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["charId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
data class VitalsHistory (
|
|
||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
|
||||||
val charId: Long,
|
|
||||||
val year: Int,
|
|
||||||
val month: Int,
|
|
||||||
val day: Int,
|
|
||||||
val vitalPoints: Int
|
|
||||||
)
|
|
||||||
@@ -11,6 +11,7 @@ object CharacterDtos {
|
|||||||
var stage: Int,
|
var stage: Int,
|
||||||
var attribute: NfcCharacter.Attribute,
|
var attribute: NfcCharacter.Attribute,
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
|
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
@@ -24,7 +25,6 @@ object CharacterDtos {
|
|||||||
var heartRateCurrent: Int,
|
var heartRateCurrent: Int,
|
||||||
var characterType: DeviceType,
|
var characterType: DeviceType,
|
||||||
val spriteIdle: ByteArray,
|
val spriteIdle: ByteArray,
|
||||||
val spriteIdle2: ByteArray,
|
|
||||||
val spriteWidth: Int,
|
val spriteWidth: Int,
|
||||||
val spriteHeight: Int,
|
val spriteHeight: Int,
|
||||||
val nameSprite: ByteArray,
|
val nameSprite: ByteArray,
|
||||||
@@ -34,11 +34,9 @@ object CharacterDtos {
|
|||||||
val isInAdventure: Boolean
|
val isInAdventure: Boolean
|
||||||
)
|
)
|
||||||
|
|
||||||
data class CardCharacterInfo(
|
data class DiMInfo(
|
||||||
val cardId: Int,
|
val cardId: Int,
|
||||||
val charId: Int,
|
val charId: Int
|
||||||
val stage: Int,
|
|
||||||
val attribute: NfcCharacter.Attribute
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data class TransformationHistory(
|
data class TransformationHistory(
|
||||||
@@ -64,6 +62,7 @@ object CharacterDtos {
|
|||||||
var stage: Int,
|
var stage: Int,
|
||||||
var attribute: NfcCharacter.Attribute,
|
var attribute: NfcCharacter.Attribute,
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
|
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
|
|||||||
@@ -1,23 +1,12 @@
|
|||||||
package com.github.nacabaro.vbhelper.navigation
|
package com.github.nacabaro.vbhelper.navigation
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
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.foundation.layout.padding
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
|
||||||
import com.github.nacabaro.vbhelper.screens.BattlesScreen
|
import com.github.nacabaro.vbhelper.screens.BattlesScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.DexScreen
|
import com.github.nacabaro.vbhelper.screens.DexScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.DiMScreen
|
import com.github.nacabaro.vbhelper.screens.DiMScreen
|
||||||
@@ -26,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.ScanScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewer
|
import com.github.nacabaro.vbhelper.screens.SpriteViewer
|
||||||
import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreen
|
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen
|
import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen
|
||||||
@@ -35,9 +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.AdventureScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.CreditsScreen
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.CreditsScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewerControllerImpl
|
|
||||||
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.source.StorageRepository
|
|
||||||
|
|
||||||
data class AppNavigationHandlers(
|
data class AppNavigationHandlers(
|
||||||
val settingsScreenController: SettingsScreenControllerImpl,
|
val settingsScreenController: SettingsScreenControllerImpl,
|
||||||
@@ -45,8 +32,7 @@ data class AppNavigationHandlers(
|
|||||||
val itemsScreenController: ItemsScreenControllerImpl,
|
val itemsScreenController: ItemsScreenControllerImpl,
|
||||||
val adventureScreenController: AdventureScreenControllerImpl,
|
val adventureScreenController: AdventureScreenControllerImpl,
|
||||||
val storageScreenController: StorageScreenControllerImpl,
|
val storageScreenController: StorageScreenControllerImpl,
|
||||||
val homeScreenController: HomeScreenControllerImpl,
|
val homeScreenController: HomeScreenControllerImpl
|
||||||
val spriteViewerController: SpriteViewerControllerImpl
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -63,19 +49,8 @@ fun AppNavigation(
|
|||||||
NavHost(
|
NavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = NavigationItems.Home.route,
|
startDestination = NavigationItems.Home.route,
|
||||||
enterTransition = {
|
|
||||||
fadeIn(
|
|
||||||
animationSpec = tween(200)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
exitTransition = {
|
|
||||||
fadeOut(
|
|
||||||
animationSpec = tween(200)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(contentPadding)
|
.padding(contentPadding)
|
||||||
|
|
||||||
) {
|
) {
|
||||||
composable(NavigationItems.Battles.route) {
|
composable(NavigationItems.Battles.route) {
|
||||||
BattlesScreen()
|
BattlesScreen()
|
||||||
@@ -95,29 +70,12 @@ fun AppNavigation(
|
|||||||
}
|
}
|
||||||
composable(NavigationItems.Scan.route) {
|
composable(NavigationItems.Scan.route) {
|
||||||
val characterIdString = it.arguments?.getString("characterId")
|
val characterIdString = it.arguments?.getString("characterId")
|
||||||
var characterId by remember { mutableStateOf(characterIdString?.toLongOrNull()) }
|
val characterId = characterIdString?.toLongOrNull()
|
||||||
Log.d("ScanScreen", "characterId: $characterId")
|
|
||||||
val launchedFromHomeScreen = (characterIdString?.toLongOrNull() == null)
|
|
||||||
|
|
||||||
if (characterId == null) {
|
|
||||||
val context = LocalContext.current.applicationContext as VBHelper
|
|
||||||
val storageRepository = StorageRepository(context.container.db)
|
|
||||||
|
|
||||||
LaunchedEffect(characterId) {
|
|
||||||
if (characterId == null) {
|
|
||||||
val characterData = storageRepository.getActiveCharacter()
|
|
||||||
if (characterData != null) {
|
|
||||||
characterId = characterData.id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScanScreen(
|
ScanScreen(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
scanScreenController = applicationNavigationHandlers.scanScreenController,
|
scanScreenController = applicationNavigationHandlers.scanScreenController,
|
||||||
characterId = characterId,
|
characterId = characterId
|
||||||
launchedFromHomeScreen = launchedFromHomeScreen
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable(NavigationItems.Dex.route) {
|
composable(NavigationItems.Dex.route) {
|
||||||
@@ -133,8 +91,7 @@ fun AppNavigation(
|
|||||||
}
|
}
|
||||||
composable(NavigationItems.Viewer.route) {
|
composable(NavigationItems.Viewer.route) {
|
||||||
SpriteViewer(
|
SpriteViewer(
|
||||||
navController = navController,
|
navController = navController
|
||||||
spriteViewerController = applicationNavigationHandlers.spriteViewerController
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable(NavigationItems.CardView.route) {
|
composable(NavigationItems.CardView.route) {
|
||||||
|
|||||||
@@ -1,33 +1,9 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens
|
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.material3.Scaffold
|
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BattlesScreen() {
|
fun BattlesScreen() {
|
||||||
Scaffold (
|
Text("Battles Screen")
|
||||||
topBar = {
|
|
||||||
TopBanner(
|
|
||||||
text = "Online battles"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
) { contentPadding ->
|
|
||||||
Column(
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
|
||||||
verticalArrangement = Arrangement.Center,
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(top = contentPadding.calculateTopPadding())
|
|
||||||
.fillMaxSize()
|
|
||||||
) {
|
|
||||||
Text("Coming soon")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import com.github.nacabaro.vbhelper.utils.BitmapData
|
|||||||
import com.github.nacabaro.vbhelper.components.DexDiMEntry
|
import com.github.nacabaro.vbhelper.components.DexDiMEntry
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
||||||
import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
||||||
import com.github.nacabaro.vbhelper.source.DexRepository
|
import com.github.nacabaro.vbhelper.source.DexRepository
|
||||||
|
|||||||
+32
-9
@@ -1,38 +1,55 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.spriteViewer
|
package com.github.nacabaro.vbhelper.screens
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
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.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.mutableStateListOf
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
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
|
@Composable
|
||||||
fun SpriteViewer(
|
fun SpriteViewer(
|
||||||
navController: NavController,
|
navController: NavController
|
||||||
spriteViewerController: SpriteViewerController
|
|
||||||
) {
|
) {
|
||||||
val spriteList = remember { mutableStateListOf<Bitmap>() }
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
val application = LocalContext.current.applicationContext as VBHelper
|
||||||
|
val db = application.container.db
|
||||||
|
val spriteRepo = SpriteRepo(db)
|
||||||
|
|
||||||
|
val spriteList = remember { mutableStateListOf<Sprites>() }
|
||||||
|
|
||||||
Log.d("SpriteViewer", "spriteList: $spriteList")
|
Log.d("SpriteViewer", "spriteList: $spriteList")
|
||||||
|
|
||||||
LaunchedEffect(spriteViewerController) {
|
LaunchedEffect(spriteRepo) {
|
||||||
val sprites = spriteViewerController.getAllSprites()
|
coroutineScope.launch {
|
||||||
val bitmapData = spriteViewerController.convertToBitmap(sprites)
|
spriteList.clear()
|
||||||
spriteList.addAll(bitmapData)
|
spriteList.addAll(spriteRepo.getAllSprites())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Scaffold (
|
Scaffold (
|
||||||
@@ -52,7 +69,13 @@ fun SpriteViewer(
|
|||||||
.padding(top = contentPadding.calculateTopPadding())
|
.padding(top = contentPadding.calculateTopPadding())
|
||||||
) {
|
) {
|
||||||
items(spriteList) { sprite ->
|
items(spriteList) { sprite ->
|
||||||
val imageBitmap = remember(sprite) { sprite.asImageBitmap() }
|
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() }
|
||||||
Image(
|
Image(
|
||||||
bitmap = imageBitmap,
|
bitmap = imageBitmap,
|
||||||
contentDescription = "Sprite",
|
contentDescription = "Sprite",
|
||||||
@@ -34,6 +34,7 @@ import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
|||||||
import com.github.nacabaro.vbhelper.source.StorageRepository
|
import com.github.nacabaro.vbhelper.source.StorageRepository
|
||||||
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
||||||
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
||||||
|
import com.github.nacabaro.vbhelper.utils.characterToNfc
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -45,41 +46,30 @@ fun ScanScreen(
|
|||||||
navController: NavController,
|
navController: NavController,
|
||||||
characterId: Long?,
|
characterId: Long?,
|
||||||
scanScreenController: ScanScreenController,
|
scanScreenController: ScanScreenController,
|
||||||
launchedFromHomeScreen: Boolean
|
|
||||||
) {
|
) {
|
||||||
val secrets by scanScreenController.secretsFlow.collectAsState(null)
|
val secrets by scanScreenController.secretsFlow.collectAsState(null)
|
||||||
|
|
||||||
val application = LocalContext.current.applicationContext as VBHelper
|
|
||||||
val storageRepository = StorageRepository(application.container.db)
|
|
||||||
var nfcCharacter by remember { mutableStateOf<NfcCharacter?>(null) }
|
|
||||||
|
|
||||||
val context = LocalContext.current
|
|
||||||
|
|
||||||
LaunchedEffect(storageRepository) {
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
/*
|
|
||||||
First check if there is a character sent through the navigation system
|
|
||||||
If there is not, that means we got here through the home screen nfc button
|
|
||||||
If we got here through the home screen, it does not hurt to check if there is
|
|
||||||
an active character.
|
|
||||||
*/
|
|
||||||
if (characterId != null && nfcCharacter == null) {
|
|
||||||
nfcCharacter = scanScreenController.characterToNfc(characterId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var readingScreen by remember { mutableStateOf(false) }
|
var readingScreen by remember { mutableStateOf(false) }
|
||||||
var writingScreen by remember { mutableStateOf(false) }
|
var writingScreen by remember { mutableStateOf(false) }
|
||||||
var isDoneReadingCharacter by remember { mutableStateOf(false) }
|
var isDoneReadingCharacter by remember { mutableStateOf(false) }
|
||||||
var isDoneSendingCard by remember { mutableStateOf(false) }
|
var isDoneSendingCard by remember { mutableStateOf(false) }
|
||||||
var isDoneWritingCharacter by remember { mutableStateOf(false) }
|
var isDoneWritingCharacter by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
DisposableEffect(readingScreen) {
|
val application = LocalContext.current.applicationContext as VBHelper
|
||||||
|
val storageRepository = StorageRepository(application.container.db)
|
||||||
|
var nfcCharacter by remember { mutableStateOf<NfcCharacter?>(null) }
|
||||||
|
|
||||||
|
val context = LocalContext.current
|
||||||
|
LaunchedEffect(storageRepository) {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
if(characterId != null && nfcCharacter == null) {
|
||||||
|
nfcCharacter = characterToNfc(context, characterId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposableEffect(readingScreen || writingScreen, isDoneSendingCard) {
|
||||||
if(readingScreen) {
|
if(readingScreen) {
|
||||||
scanScreenController.registerActivityLifecycleListener(
|
scanScreenController.registerActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER, object: ActivityLifecycleListener {
|
||||||
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
|
||||||
object: ActivityLifecycleListener {
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
scanScreenController.cancelRead()
|
scanScreenController.cancelRead()
|
||||||
}
|
}
|
||||||
@@ -89,24 +79,12 @@ fun ScanScreen(
|
|||||||
isDoneReadingCharacter = true
|
isDoneReadingCharacter = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
)
|
})
|
||||||
scanScreenController.onClickRead(secrets!!) {
|
scanScreenController.onClickRead(secrets!!) {
|
||||||
isDoneReadingCharacter = true
|
isDoneReadingCharacter = true
|
||||||
}
|
}
|
||||||
}
|
} else if (writingScreen) {
|
||||||
onDispose {
|
|
||||||
if(readingScreen) {
|
|
||||||
scanScreenController.unregisterActivityLifecycleListener(
|
|
||||||
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER
|
|
||||||
)
|
|
||||||
scanScreenController.cancelRead()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DisposableEffect(writingScreen, isDoneSendingCard) {
|
|
||||||
if (writingScreen) {
|
|
||||||
scanScreenController.registerActivityLifecycleListener(
|
scanScreenController.registerActivityLifecycleListener(
|
||||||
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
||||||
object : ActivityLifecycleListener {
|
object : ActivityLifecycleListener {
|
||||||
@@ -127,9 +105,6 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
if (secrets != null && nfcCharacter != null) {
|
|
||||||
if (!isDoneSendingCard) {
|
if (!isDoneSendingCard) {
|
||||||
scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) {
|
scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) {
|
||||||
isDoneSendingCard = true
|
isDoneSendingCard = true
|
||||||
@@ -140,9 +115,8 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onDispose {
|
onDispose {
|
||||||
if(writingScreen) {
|
if(readingScreen || writingScreen) {
|
||||||
scanScreenController.unregisterActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER)
|
scanScreenController.unregisterActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER)
|
||||||
scanScreenController.cancelRead()
|
scanScreenController.cancelRead()
|
||||||
}
|
}
|
||||||
@@ -184,7 +158,7 @@ fun ScanScreen(
|
|||||||
} else {
|
} else {
|
||||||
ChooseConnectOption(
|
ChooseConnectOption(
|
||||||
onClickRead = when {
|
onClickRead = when {
|
||||||
!launchedFromHomeScreen -> null
|
characterId != null -> null
|
||||||
else -> {
|
else -> {
|
||||||
{
|
{
|
||||||
if(secrets == null) {
|
if(secrets == null) {
|
||||||
@@ -210,8 +184,7 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
navController = navController
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,17 +193,9 @@ fun ScanScreen(
|
|||||||
fun ChooseConnectOption(
|
fun ChooseConnectOption(
|
||||||
onClickRead: (() -> Unit)? = null,
|
onClickRead: (() -> Unit)? = null,
|
||||||
onClickWrite: (() -> Unit)? = null,
|
onClickWrite: (() -> Unit)? = null,
|
||||||
navController: NavController
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = { TopBanner(text = "Scan a Vital Bracelet") }
|
||||||
TopBanner(
|
|
||||||
text = "Scan a Vital Bracelet",
|
|
||||||
onBackClick = {
|
|
||||||
navController.popBackStack()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
) { contentPadding ->
|
) { contentPadding ->
|
||||||
Column(
|
Column(
|
||||||
verticalArrangement = Arrangement.Center,
|
verticalArrangement = Arrangement.Center,
|
||||||
@@ -294,10 +259,7 @@ fun ScanScreenPreview() {
|
|||||||
override fun onClickCheckCard(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
override fun onClickCheckCard(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
||||||
override fun onClickWrite(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
override fun onClickWrite(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
||||||
override fun cancelRead() {}
|
override fun cancelRead() {}
|
||||||
override fun characterFromNfc(nfcCharacter: NfcCharacter): String { return "" }
|
|
||||||
override suspend fun characterToNfc(characterId: Long): NfcCharacter? { return null }
|
|
||||||
},
|
},
|
||||||
characterId = null,
|
characterId = null
|
||||||
launchedFromHomeScreen = false
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
-3
@@ -15,7 +15,4 @@ interface ScanScreenController {
|
|||||||
|
|
||||||
fun registerActivityLifecycleListener(key: String, activityLifecycleListener: ActivityLifecycleListener)
|
fun registerActivityLifecycleListener(key: String, activityLifecycleListener: ActivityLifecycleListener)
|
||||||
fun unregisterActivityLifecycleListener(key: String)
|
fun unregisterActivityLifecycleListener(key: String)
|
||||||
|
|
||||||
fun characterFromNfc(nfcCharacter: NfcCharacter): String
|
|
||||||
suspend fun characterToNfc(characterId: Long): NfcCharacter?
|
|
||||||
}
|
}
|
||||||
+101
-12
@@ -11,17 +11,22 @@ import android.widget.Toast
|
|||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.github.cfogrady.vbnfc.TagCommunicator
|
import com.github.cfogrady.vbnfc.TagCommunicator
|
||||||
|
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
|
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
||||||
import com.github.nacabaro.vbhelper.ActivityLifecycleListener
|
import com.github.nacabaro.vbhelper.ActivityLifecycleListener
|
||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.converters.FromNfcConverter
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.converters.ToNfcConverter
|
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
||||||
import com.github.nacabaro.vbhelper.source.getCryptographicTransformerMap
|
import com.github.nacabaro.vbhelper.source.getCryptographicTransformerMap
|
||||||
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
||||||
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
||||||
|
import com.github.nacabaro.vbhelper.utils.DeviceType
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.stateIn
|
import kotlinx.coroutines.flow.stateIn
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import java.util.GregorianCalendar
|
||||||
|
|
||||||
class ScanScreenControllerImpl(
|
class ScanScreenControllerImpl(
|
||||||
override val secretsFlow: Flow<Secrets>,
|
override val secretsFlow: Flow<Secrets>,
|
||||||
@@ -44,7 +49,7 @@ class ScanScreenControllerImpl(
|
|||||||
override fun onClickRead(secrets: Secrets, onComplete: ()->Unit) {
|
override fun onClickRead(secrets: Secrets, onComplete: ()->Unit) {
|
||||||
handleTag(secrets) { tagCommunicator ->
|
handleTag(secrets) { tagCommunicator ->
|
||||||
val character = tagCommunicator.receiveCharacter()
|
val character = tagCommunicator.receiveCharacter()
|
||||||
val resultMessage = characterFromNfc(character)
|
val resultMessage = addCharacterScannedIntoDatabase(character)
|
||||||
onComplete.invoke()
|
onComplete.invoke()
|
||||||
resultMessage
|
resultMessage
|
||||||
}
|
}
|
||||||
@@ -146,17 +151,101 @@ class ScanScreenControllerImpl(
|
|||||||
componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
|
componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun characterFromNfc(nfcCharacter: NfcCharacter): String {
|
private fun addCharacterScannedIntoDatabase(nfcCharacter: NfcCharacter): String {
|
||||||
val nfcConverter = FromNfcConverter(
|
val application = componentActivity.applicationContext as VBHelper
|
||||||
componentActivity = componentActivity
|
val storageRepository = application.container.db
|
||||||
|
|
||||||
|
val dimData = storageRepository
|
||||||
|
.dimDao()
|
||||||
|
.getDimById(nfcCharacter.dimId.toInt())
|
||||||
|
|
||||||
|
if (dimData == null) return "Card not found"
|
||||||
|
|
||||||
|
val cardCharData = storageRepository
|
||||||
|
.characterDao()
|
||||||
|
.getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), dimData.id)
|
||||||
|
|
||||||
|
val characterData = UserCharacter(
|
||||||
|
charId = cardCharData.id,
|
||||||
|
ageInDays = nfcCharacter.ageInDays.toInt(),
|
||||||
|
nextAdventureMissionStage = nfcCharacter.nextAdventureMissionStage.toInt(),
|
||||||
|
mood = nfcCharacter.mood.toInt(),
|
||||||
|
vitalPoints = nfcCharacter.vitalPoints.toInt(),
|
||||||
|
transformationCountdown = nfcCharacter.transformationCountdownInMinutes.toInt(),
|
||||||
|
injuryStatus = nfcCharacter.injuryStatus,
|
||||||
|
trophies = nfcCharacter.trophies.toInt(),
|
||||||
|
currentPhaseBattlesWon = nfcCharacter.currentPhaseBattlesWon.toInt(),
|
||||||
|
currentPhaseBattlesLost = nfcCharacter.currentPhaseBattlesLost.toInt(),
|
||||||
|
totalBattlesWon = nfcCharacter.totalBattlesWon.toInt(),
|
||||||
|
totalBattlesLost = nfcCharacter.totalBattlesLost.toInt(),
|
||||||
|
activityLevel = nfcCharacter.activityLevel.toInt(),
|
||||||
|
heartRateCurrent = nfcCharacter.heartRateCurrent.toInt(),
|
||||||
|
characterType = when (nfcCharacter) {
|
||||||
|
is BENfcCharacter -> DeviceType.BEDevice
|
||||||
|
else -> DeviceType.VBDevice
|
||||||
|
},
|
||||||
|
isActive = true
|
||||||
)
|
)
|
||||||
return nfcConverter.addCharacter(nfcCharacter)
|
|
||||||
|
storageRepository
|
||||||
|
.userCharacterDao()
|
||||||
|
.clearActiveCharacter()
|
||||||
|
|
||||||
|
val characterId: Long = storageRepository
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertCharacterData(characterData)
|
||||||
|
|
||||||
|
if (nfcCharacter is BENfcCharacter) {
|
||||||
|
val extraCharacterData = BECharacterData(
|
||||||
|
id = characterId,
|
||||||
|
trainingHp = nfcCharacter.trainingHp.toInt(),
|
||||||
|
trainingAp = nfcCharacter.trainingAp.toInt(),
|
||||||
|
trainingBp = nfcCharacter.trainingBp.toInt(),
|
||||||
|
remainingTrainingTimeInMinutes = nfcCharacter.remainingTrainingTimeInMinutes.toInt(),
|
||||||
|
itemEffectActivityLevelValue = nfcCharacter.itemEffectActivityLevelValue.toInt(),
|
||||||
|
itemEffectMentalStateValue = nfcCharacter.itemEffectMentalStateValue.toInt(),
|
||||||
|
itemEffectMentalStateMinutesRemaining = nfcCharacter.itemEffectMentalStateMinutesRemaining.toInt(),
|
||||||
|
itemEffectActivityLevelMinutesRemaining = nfcCharacter.itemEffectActivityLevelMinutesRemaining.toInt(),
|
||||||
|
itemEffectVitalPointsChangeValue = nfcCharacter.itemEffectVitalPointsChangeValue.toInt(),
|
||||||
|
itemEffectVitalPointsChangeMinutesRemaining = nfcCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(),
|
||||||
|
abilityRarity = nfcCharacter.abilityRarity,
|
||||||
|
abilityType = nfcCharacter.abilityType.toInt(),
|
||||||
|
abilityBranch = nfcCharacter.abilityBranch.toInt(),
|
||||||
|
abilityReset = nfcCharacter.abilityReset.toInt(),
|
||||||
|
rank = nfcCharacter.abilityReset.toInt(),
|
||||||
|
itemType = nfcCharacter.itemType.toInt(),
|
||||||
|
itemMultiplier = nfcCharacter.itemMultiplier.toInt(),
|
||||||
|
itemRemainingTime = nfcCharacter.itemRemainingTime.toInt(),
|
||||||
|
otp0 = "", //nfcCharacter.value!!.otp0.toString(),
|
||||||
|
otp1 = "", //nfcCharacter.value!!.otp1.toString(),
|
||||||
|
minorVersion = nfcCharacter.characterCreationFirmwareVersion.minorVersion.toInt(),
|
||||||
|
majorVersion = nfcCharacter.characterCreationFirmwareVersion.majorVersion.toInt(),
|
||||||
|
)
|
||||||
|
|
||||||
|
storageRepository
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertBECharacterData(extraCharacterData)
|
||||||
|
|
||||||
|
val transformationHistoryWatch = nfcCharacter.transformationHistory
|
||||||
|
transformationHistoryWatch.map { item ->
|
||||||
|
if (item.toCharIndex.toInt() != 255) {
|
||||||
|
val date = GregorianCalendar(item.year.toInt(), item.month.toInt(), item.day.toInt())
|
||||||
|
.time
|
||||||
|
.time
|
||||||
|
|
||||||
|
storageRepository
|
||||||
|
.characterDao()
|
||||||
|
.insertTransformation(characterId, item.toCharIndex.toInt(), dimData.id, date)
|
||||||
|
|
||||||
|
storageRepository
|
||||||
|
.dexDao()
|
||||||
|
.insertCharacter(item.toCharIndex.toInt(), dimData.id, date)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (nfcCharacter is VBNfcCharacter) {
|
||||||
|
return "Not implemented yet"
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun characterToNfc(characterId: Long): NfcCharacter {
|
return "Done reading character!"
|
||||||
val nfcGenerator = ToNfcConverter(
|
|
||||||
componentActivity = componentActivity
|
|
||||||
)
|
|
||||||
return nfcGenerator.characterToNfc(characterId)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
-253
@@ -1,253 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.scanScreen.converters
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
|
||||||
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
|
||||||
import com.github.nacabaro.vbhelper.domain.card.Card
|
|
||||||
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
|
||||||
import com.github.nacabaro.vbhelper.utils.DeviceType
|
|
||||||
import java.util.GregorianCalendar
|
|
||||||
|
|
||||||
class FromNfcConverter (
|
|
||||||
componentActivity: ComponentActivity
|
|
||||||
) {
|
|
||||||
private val application = componentActivity.applicationContext as VBHelper
|
|
||||||
private val database = application.container.db
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun addCharacter(nfcCharacter: NfcCharacter): String {
|
|
||||||
val cardData = database
|
|
||||||
.cardDao()
|
|
||||||
.getDimById(nfcCharacter.dimId.toInt())
|
|
||||||
|
|
||||||
if (cardData == null)
|
|
||||||
return "Card not found"
|
|
||||||
|
|
||||||
val cardCharData = database
|
|
||||||
.characterDao()
|
|
||||||
.getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), cardData.id)
|
|
||||||
|
|
||||||
updateCardProgress(nfcCharacter, cardData)
|
|
||||||
|
|
||||||
val characterData = UserCharacter(
|
|
||||||
charId = cardCharData.id,
|
|
||||||
ageInDays = nfcCharacter.ageInDays.toInt(),
|
|
||||||
mood = nfcCharacter.mood.toInt(),
|
|
||||||
vitalPoints = nfcCharacter.vitalPoints.toInt(),
|
|
||||||
transformationCountdown = nfcCharacter.transformationCountdownInMinutes.toInt(),
|
|
||||||
injuryStatus = nfcCharacter.injuryStatus,
|
|
||||||
trophies = nfcCharacter.trophies.toInt(),
|
|
||||||
currentPhaseBattlesWon = nfcCharacter.currentPhaseBattlesWon.toInt(),
|
|
||||||
currentPhaseBattlesLost = nfcCharacter.currentPhaseBattlesLost.toInt(),
|
|
||||||
totalBattlesWon = nfcCharacter.totalBattlesWon.toInt(),
|
|
||||||
totalBattlesLost = nfcCharacter.totalBattlesLost.toInt(),
|
|
||||||
activityLevel = nfcCharacter.activityLevel.toInt(),
|
|
||||||
heartRateCurrent = nfcCharacter.heartRateCurrent.toInt(),
|
|
||||||
characterType = when (nfcCharacter) {
|
|
||||||
is BENfcCharacter -> DeviceType.BEDevice
|
|
||||||
else -> DeviceType.VBDevice
|
|
||||||
},
|
|
||||||
isActive = true
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.clearActiveCharacter()
|
|
||||||
|
|
||||||
val characterId: Long = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertCharacterData(characterData)
|
|
||||||
|
|
||||||
if (nfcCharacter is BENfcCharacter) {
|
|
||||||
addBeCharacterToDatabase(
|
|
||||||
characterId = characterId,
|
|
||||||
nfcCharacter = nfcCharacter
|
|
||||||
)
|
|
||||||
} else if (nfcCharacter is VBNfcCharacter) {
|
|
||||||
addVbCharacterToDatabase(
|
|
||||||
characterId = characterId,
|
|
||||||
nfcCharacter = nfcCharacter
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
addTransformationHistoryToDatabase(
|
|
||||||
characterId = characterId,
|
|
||||||
nfcCharacter = nfcCharacter,
|
|
||||||
dimData = cardData
|
|
||||||
)
|
|
||||||
|
|
||||||
addVitalsHistoryToDatabase(
|
|
||||||
characterId = characterId,
|
|
||||||
nfcCharacter = nfcCharacter
|
|
||||||
)
|
|
||||||
|
|
||||||
return "Done reading character!"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun updateCardProgress(
|
|
||||||
nfcCharacter: NfcCharacter,
|
|
||||||
cardData: Card
|
|
||||||
) {
|
|
||||||
val currentCardProgress = CardProgress(
|
|
||||||
cardId = cardData.id,
|
|
||||||
currentStage = nfcCharacter.nextAdventureMissionStage.toInt(),
|
|
||||||
unlocked = nfcCharacter.nextAdventureMissionStage.toInt() > cardData.stageCount
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.cardProgressDao()
|
|
||||||
.updateDimProgress(currentCardProgress)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun addVbCharacterToDatabase(
|
|
||||||
characterId: Long,
|
|
||||||
nfcCharacter: VBNfcCharacter
|
|
||||||
) {
|
|
||||||
val extraCharacterData = VBCharacterData(
|
|
||||||
id = characterId,
|
|
||||||
generation = nfcCharacter.generation.toInt(),
|
|
||||||
totalTrophies = nfcCharacter.totalTrophies.toInt()
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertVBCharacterData(extraCharacterData)
|
|
||||||
|
|
||||||
addSpecialMissionsToDatabase(nfcCharacter, characterId)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun addSpecialMissionsToDatabase(
|
|
||||||
nfcCharacter: VBNfcCharacter,
|
|
||||||
characterId: Long
|
|
||||||
) {
|
|
||||||
val specialMissionsWatch = nfcCharacter.specialMissions
|
|
||||||
val specialMissionsDb = specialMissionsWatch.map { item ->
|
|
||||||
SpecialMissions(
|
|
||||||
characterId = characterId,
|
|
||||||
goal = item.goal.toInt(),
|
|
||||||
watchId = item.id.toInt(),
|
|
||||||
progress = item.progress.toInt(),
|
|
||||||
status = item.status,
|
|
||||||
timeElapsedInMinutes = item.timeElapsedInMinutes.toInt(),
|
|
||||||
timeLimitInMinutes = item.timeLimitInMinutes.toInt(),
|
|
||||||
missionType = item.type,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertSpecialMissions(*specialMissionsDb.toTypedArray())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun addBeCharacterToDatabase(
|
|
||||||
characterId: Long,
|
|
||||||
nfcCharacter: BENfcCharacter
|
|
||||||
) {
|
|
||||||
val extraCharacterData = BECharacterData(
|
|
||||||
id = characterId,
|
|
||||||
trainingHp = nfcCharacter.trainingHp.toInt(),
|
|
||||||
trainingAp = nfcCharacter.trainingAp.toInt(),
|
|
||||||
trainingBp = nfcCharacter.trainingBp.toInt(),
|
|
||||||
remainingTrainingTimeInMinutes = nfcCharacter.remainingTrainingTimeInMinutes.toInt(),
|
|
||||||
itemEffectActivityLevelValue = nfcCharacter.itemEffectActivityLevelValue.toInt(),
|
|
||||||
itemEffectMentalStateValue = nfcCharacter.itemEffectMentalStateValue.toInt(),
|
|
||||||
itemEffectMentalStateMinutesRemaining = nfcCharacter.itemEffectMentalStateMinutesRemaining.toInt(),
|
|
||||||
itemEffectActivityLevelMinutesRemaining = nfcCharacter.itemEffectActivityLevelMinutesRemaining.toInt(),
|
|
||||||
itemEffectVitalPointsChangeValue = nfcCharacter.itemEffectVitalPointsChangeValue.toInt(),
|
|
||||||
itemEffectVitalPointsChangeMinutesRemaining = nfcCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(),
|
|
||||||
abilityRarity = nfcCharacter.abilityRarity,
|
|
||||||
abilityType = nfcCharacter.abilityType.toInt(),
|
|
||||||
abilityBranch = nfcCharacter.abilityBranch.toInt(),
|
|
||||||
abilityReset = nfcCharacter.abilityReset.toInt(),
|
|
||||||
rank = nfcCharacter.abilityReset.toInt(),
|
|
||||||
itemType = nfcCharacter.itemType.toInt(),
|
|
||||||
itemMultiplier = nfcCharacter.itemMultiplier.toInt(),
|
|
||||||
itemRemainingTime = nfcCharacter.itemRemainingTime.toInt(),
|
|
||||||
otp0 = "", //nfcCharacter.value!!.otp0.toString(),
|
|
||||||
otp1 = "", //nfcCharacter.value!!.otp1.toString(),
|
|
||||||
minorVersion = nfcCharacter.characterCreationFirmwareVersion.minorVersion.toInt(),
|
|
||||||
majorVersion = nfcCharacter.characterCreationFirmwareVersion.majorVersion.toInt(),
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertBECharacterData(extraCharacterData)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun addVitalsHistoryToDatabase(
|
|
||||||
characterId: Long,
|
|
||||||
nfcCharacter: NfcCharacter
|
|
||||||
) {
|
|
||||||
val vitalsHistoryWatch = nfcCharacter.vitalHistory
|
|
||||||
val vitalsHistory = vitalsHistoryWatch.map { historyElement ->
|
|
||||||
Log.d("VitalsHistory", "${historyElement.year.toInt()} ${historyElement.month.toInt()} ${historyElement.day.toInt()}")
|
|
||||||
VitalsHistory(
|
|
||||||
charId = characterId,
|
|
||||||
year = historyElement.year.toInt(),
|
|
||||||
month = historyElement.month.toInt(),
|
|
||||||
day = historyElement.day.toInt(),
|
|
||||||
vitalPoints = historyElement.vitalsGained.toInt()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertVitals(*vitalsHistory.toTypedArray())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun addTransformationHistoryToDatabase(
|
|
||||||
characterId: Long,
|
|
||||||
nfcCharacter: NfcCharacter,
|
|
||||||
dimData: Card
|
|
||||||
) {
|
|
||||||
val transformationHistoryWatch = nfcCharacter.transformationHistory
|
|
||||||
transformationHistoryWatch.map { item ->
|
|
||||||
if (item.toCharIndex.toInt() != 255) {
|
|
||||||
val date = GregorianCalendar(
|
|
||||||
item.year.toInt(),
|
|
||||||
item.month.toInt(),
|
|
||||||
item.day.toInt()
|
|
||||||
)
|
|
||||||
.time
|
|
||||||
.time
|
|
||||||
|
|
||||||
database
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertTransformation(
|
|
||||||
characterId,
|
|
||||||
item.toCharIndex.toInt(),
|
|
||||||
dimData.id,
|
|
||||||
date
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.dexDao()
|
|
||||||
.insertCharacter(
|
|
||||||
item.toCharIndex.toInt(),
|
|
||||||
dimData.id,
|
|
||||||
date
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-271
@@ -1,271 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.scanScreen.converters
|
|
||||||
|
|
||||||
import android.icu.util.Calendar
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
|
||||||
import com.github.cfogrady.vbnfc.be.FirmwareVersion
|
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
|
||||||
import com.github.cfogrady.vbnfc.vb.SpecialMission
|
|
||||||
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
|
||||||
import com.github.nacabaro.vbhelper.utils.DeviceType
|
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
class ToNfcConverter(
|
|
||||||
private val componentActivity: ComponentActivity
|
|
||||||
) {
|
|
||||||
private val application: VBHelper = componentActivity.applicationContext as VBHelper
|
|
||||||
private val database: AppDatabase = application.container.db
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
suspend fun characterToNfc(
|
|
||||||
characterId: Long
|
|
||||||
): NfcCharacter {
|
|
||||||
val app = componentActivity.applicationContext as VBHelper
|
|
||||||
val database = app.container.db
|
|
||||||
|
|
||||||
val userCharacter = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getCharacter(characterId)
|
|
||||||
|
|
||||||
val characterInfo = database
|
|
||||||
.characterDao()
|
|
||||||
.getCharacterInfo(userCharacter.charId)
|
|
||||||
|
|
||||||
val currentCardStage = database
|
|
||||||
.cardProgressDao()
|
|
||||||
.getCardProgress(characterInfo.cardId)
|
|
||||||
|
|
||||||
return if (userCharacter.characterType == DeviceType.BEDevice)
|
|
||||||
nfcToBENfc(characterId, characterInfo, currentCardStage, userCharacter)
|
|
||||||
else
|
|
||||||
nfcToVBNfc(characterId, characterInfo, currentCardStage, userCharacter)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private suspend fun nfcToVBNfc(
|
|
||||||
characterId: Long,
|
|
||||||
characterInfo: CharacterDtos.CardCharacterInfo,
|
|
||||||
currentCardStage: Int,
|
|
||||||
userCharacter: UserCharacter
|
|
||||||
): VBNfcCharacter {
|
|
||||||
val vbData = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getVbData(characterId)
|
|
||||||
|
|
||||||
val paddedTransformationArray = generateTransformationHistory(characterId)
|
|
||||||
|
|
||||||
val watchSpecialMissions = generateSpecialMissionsArray(characterId)
|
|
||||||
|
|
||||||
val nfcData = VBNfcCharacter(
|
|
||||||
dimId = characterInfo.cardId.toUShort(),
|
|
||||||
charIndex = characterInfo.charId.toUShort(),
|
|
||||||
stage = characterInfo.stage.toByte(),
|
|
||||||
attribute = characterInfo.attribute,
|
|
||||||
ageInDays = userCharacter.ageInDays.toByte(),
|
|
||||||
nextAdventureMissionStage = currentCardStage.toByte(),
|
|
||||||
mood = userCharacter.mood.toByte(),
|
|
||||||
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
|
||||||
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
|
||||||
injuryStatus = userCharacter.injuryStatus,
|
|
||||||
trophies = userCharacter.trophies.toUShort(),
|
|
||||||
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
|
||||||
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
|
||||||
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
|
||||||
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
|
||||||
activityLevel = userCharacter.activityLevel.toByte(),
|
|
||||||
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
|
||||||
transformationHistory = paddedTransformationArray,
|
|
||||||
vitalHistory = generateVitalsHistoryArray(characterId),
|
|
||||||
appReserved1 = ByteArray(12) {0},
|
|
||||||
appReserved2 = Array(3) {0u},
|
|
||||||
generation = vbData.generation.toUShort(),
|
|
||||||
totalTrophies = vbData.totalTrophies.toUShort(),
|
|
||||||
specialMissions = watchSpecialMissions.toTypedArray()
|
|
||||||
)
|
|
||||||
|
|
||||||
return nfcData
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private suspend fun generateSpecialMissionsArray(
|
|
||||||
characterId: Long
|
|
||||||
): List<SpecialMission> {
|
|
||||||
val specialMissions = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getSpecialMissions(characterId)
|
|
||||||
|
|
||||||
val watchSpecialMissions = specialMissions.map {
|
|
||||||
SpecialMission(
|
|
||||||
goal = it.goal.toUShort(),
|
|
||||||
id = it.watchId.toUShort(),
|
|
||||||
progress = it.progress.toUShort(),
|
|
||||||
status = it.status,
|
|
||||||
timeElapsedInMinutes = it.timeElapsedInMinutes.toUShort(),
|
|
||||||
timeLimitInMinutes = it.timeLimitInMinutes.toUShort(),
|
|
||||||
type = it.missionType
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return watchSpecialMissions
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private suspend fun generateVitalsHistoryArray(
|
|
||||||
characterId: Long
|
|
||||||
): Array<NfcCharacter.DailyVitals> {
|
|
||||||
val vitalsHistory = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getVitalsHistory(characterId)
|
|
||||||
|
|
||||||
val nfcVitalsHistory = Array(7) {
|
|
||||||
NfcCharacter.DailyVitals(0u, 0u, 0u, 0u)
|
|
||||||
}
|
|
||||||
|
|
||||||
vitalsHistory.mapIndexed { index, historyElement ->
|
|
||||||
var actualYear = 0
|
|
||||||
if (historyElement.year != 2000) {
|
|
||||||
actualYear = historyElement.year
|
|
||||||
}
|
|
||||||
nfcVitalsHistory[index] = NfcCharacter.DailyVitals(
|
|
||||||
day = historyElement.day.toUByte(),
|
|
||||||
month = historyElement.month.toUByte(),
|
|
||||||
year = actualYear.toUShort(),
|
|
||||||
vitalsGained = vitalsHistory[index].vitalPoints.toUShort()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
nfcVitalsHistory.map {
|
|
||||||
Log.d("NFC", it.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
return nfcVitalsHistory
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private suspend fun nfcToBENfc(
|
|
||||||
characterId: Long,
|
|
||||||
characterInfo: CharacterDtos.CardCharacterInfo,
|
|
||||||
currentCardStage: Int,
|
|
||||||
userCharacter: UserCharacter
|
|
||||||
): BENfcCharacter {
|
|
||||||
val beData = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getBeData(characterId)
|
|
||||||
|
|
||||||
val paddedTransformationArray = generateTransformationHistory(characterId)
|
|
||||||
|
|
||||||
val nfcData = BENfcCharacter(
|
|
||||||
dimId = characterInfo.cardId.toUShort(),
|
|
||||||
charIndex = characterInfo.charId.toUShort(),
|
|
||||||
stage = characterInfo.stage.toByte(),
|
|
||||||
attribute = characterInfo.attribute,
|
|
||||||
ageInDays = userCharacter.ageInDays.toByte(),
|
|
||||||
nextAdventureMissionStage = currentCardStage.toByte(),
|
|
||||||
mood = userCharacter.mood.toByte(),
|
|
||||||
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
|
||||||
itemEffectMentalStateValue = beData.itemEffectMentalStateValue.toByte(),
|
|
||||||
itemEffectMentalStateMinutesRemaining = beData.itemEffectMentalStateMinutesRemaining.toByte(),
|
|
||||||
itemEffectActivityLevelValue = beData.itemEffectActivityLevelValue.toByte(),
|
|
||||||
itemEffectActivityLevelMinutesRemaining = beData.itemEffectActivityLevelMinutesRemaining.toByte(),
|
|
||||||
itemEffectVitalPointsChangeValue = beData.itemEffectVitalPointsChangeValue.toByte(),
|
|
||||||
itemEffectVitalPointsChangeMinutesRemaining = beData.itemEffectVitalPointsChangeMinutesRemaining.toByte(),
|
|
||||||
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
|
||||||
injuryStatus = userCharacter.injuryStatus,
|
|
||||||
trainingPp = userCharacter.trophies.toUShort(),
|
|
||||||
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
|
||||||
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
|
||||||
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
|
||||||
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
|
||||||
activityLevel = userCharacter.activityLevel.toByte(),
|
|
||||||
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
|
||||||
transformationHistory = paddedTransformationArray,
|
|
||||||
vitalHistory = generateVitalsHistoryArray(characterId),
|
|
||||||
appReserved1 = ByteArray(12) {0},
|
|
||||||
appReserved2 = Array(3) {0u},
|
|
||||||
trainingHp = beData.trainingHp.toUShort(),
|
|
||||||
trainingAp = beData.trainingAp.toUShort(),
|
|
||||||
trainingBp = beData.trainingBp.toUShort(),
|
|
||||||
remainingTrainingTimeInMinutes = beData.remainingTrainingTimeInMinutes.toUShort(),
|
|
||||||
abilityRarity = beData.abilityRarity,
|
|
||||||
abilityType = beData.abilityType.toUShort(),
|
|
||||||
abilityBranch = beData.abilityBranch.toUShort(),
|
|
||||||
abilityReset = beData.abilityReset.toByte(),
|
|
||||||
rank = beData.rank.toByte(),
|
|
||||||
itemType = beData.itemType.toByte(),
|
|
||||||
itemMultiplier = beData.itemMultiplier.toByte(),
|
|
||||||
itemRemainingTime = beData.itemRemainingTime.toByte(),
|
|
||||||
otp0 = byteArrayOf(8),
|
|
||||||
otp1 = byteArrayOf(8),
|
|
||||||
characterCreationFirmwareVersion = FirmwareVersion(
|
|
||||||
minorVersion = beData.minorVersion.toByte(),
|
|
||||||
majorVersion = beData.majorVersion.toByte()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return nfcData
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private suspend fun generateTransformationHistory(
|
|
||||||
characterId: Long
|
|
||||||
): Array<NfcCharacter.Transformation> {
|
|
||||||
val transformationHistory = database
|
|
||||||
.userCharacterDao()
|
|
||||||
.getTransformationHistory(characterId)!!
|
|
||||||
.map {
|
|
||||||
val date = Date(it.transformationDate)
|
|
||||||
val calendar = android.icu.util.GregorianCalendar()
|
|
||||||
calendar.time = date
|
|
||||||
|
|
||||||
NfcCharacter.Transformation(
|
|
||||||
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()
|
|
||||||
|
|
||||||
val paddedTransformationArray = padTransformationArray(transformationHistory)
|
|
||||||
|
|
||||||
return paddedTransformationArray
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun padTransformationArray(
|
|
||||||
transformationArray: Array<NfcCharacter.Transformation>
|
|
||||||
): Array<NfcCharacter.Transformation> {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+24
-66
@@ -10,14 +10,12 @@ import androidx.activity.ComponentActivity
|
|||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import com.github.cfogrady.vb.dim.card.BemCard
|
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.vb.dim.card.DimReader
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
import com.github.nacabaro.vbhelper.domain.Sprites
|
||||||
import com.github.nacabaro.vbhelper.domain.card.Card
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.source.ApkSecretsImporter
|
import com.github.nacabaro.vbhelper.source.ApkSecretsImporter
|
||||||
import com.github.nacabaro.vbhelper.source.SecretsImporter
|
import com.github.nacabaro.vbhelper.source.SecretsImporter
|
||||||
@@ -118,9 +116,9 @@ class SettingsScreenControllerImpl(
|
|||||||
val card = dimReader.readCard(fileReader, false)
|
val card = dimReader.readCard(fileReader, false)
|
||||||
|
|
||||||
val cardModel = Card(
|
val cardModel = Card(
|
||||||
cardId = card.header.dimId,
|
dimId = card.header.dimId,
|
||||||
logo = card.spriteData.sprites[0].pixelData,
|
logo = card.spriteData.sprites[0].pixelData,
|
||||||
name = card.spriteData.text, // TODO Make user write card name
|
name = card.spriteData.text, // TODO Make user write card name// TODO Make user write card name
|
||||||
stageCount = card.adventureLevels.levels.size,
|
stageCount = card.adventureLevels.levels.size,
|
||||||
logoHeight = card.spriteData.sprites[0].height,
|
logoHeight = card.spriteData.sprites[0].height,
|
||||||
logoWidth = card.spriteData.sprites[0].width,
|
logoWidth = card.spriteData.sprites[0].width,
|
||||||
@@ -128,22 +126,10 @@ class SettingsScreenControllerImpl(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val dimId = database
|
val dimId = database
|
||||||
.cardDao()
|
.dimDao()
|
||||||
.insertNewDim(cardModel)
|
.insertNewDim(cardModel)
|
||||||
|
|
||||||
val cardProgress = CardProgress(
|
val characters = card.characterStats.characterEntries
|
||||||
cardId = dimId,
|
|
||||||
currentStage = 0,
|
|
||||||
unlocked = false
|
|
||||||
)
|
|
||||||
|
|
||||||
database
|
|
||||||
.cardProgressDao()
|
|
||||||
.updateDimProgress(cardProgress)
|
|
||||||
|
|
||||||
val characters = card
|
|
||||||
.characterStats
|
|
||||||
.characterEntries
|
|
||||||
|
|
||||||
var spriteCounter = when (card is BemCard) {
|
var spriteCounter = when (card is BemCard) {
|
||||||
true -> 54
|
true -> 54
|
||||||
@@ -153,53 +139,9 @@ class SettingsScreenControllerImpl(
|
|||||||
val domainCharacters = mutableListOf<Character>()
|
val domainCharacters = mutableListOf<Character>()
|
||||||
|
|
||||||
for (index in 0 until characters.size) {
|
for (index in 0 until characters.size) {
|
||||||
var domainSprite: Sprite?
|
|
||||||
|
|
||||||
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(
|
domainCharacters.add(
|
||||||
Character(
|
Character(
|
||||||
dimId = dimId,
|
dimId = dimId,
|
||||||
spriteId = spriteId,
|
|
||||||
monIndex = index,
|
monIndex = index,
|
||||||
name = card.spriteData.sprites[spriteCounter].pixelData,
|
name = card.spriteData.sprites[spriteCounter].pixelData,
|
||||||
stage = characters[index].stage,
|
stage = characters[index].stage,
|
||||||
@@ -207,8 +149,12 @@ class SettingsScreenControllerImpl(
|
|||||||
baseHp = characters[index].hp,
|
baseHp = characters[index].hp,
|
||||||
baseBp = characters[index].dp,
|
baseBp = characters[index].dp,
|
||||||
baseAp = characters[index].ap,
|
baseAp = characters[index].ap,
|
||||||
nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width,
|
sprite1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height,
|
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
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -226,6 +172,18 @@ class SettingsScreenControllerImpl(
|
|||||||
database
|
database
|
||||||
.characterDao()
|
.characterDao()
|
||||||
.insertCharacter(*domainCharacters.toTypedArray())
|
.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()
|
inputStream?.close()
|
||||||
|
|||||||
-9
@@ -1,9 +0,0 @@
|
|||||||
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<Sprite>
|
|
||||||
fun convertToBitmap(sprites: List<Sprite>): List<Bitmap>
|
|
||||||
}
|
|
||||||
-68
@@ -1,68 +0,0 @@
|
|||||||
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<Sprite> {
|
|
||||||
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<Sprite>): List<Bitmap> {
|
|
||||||
val bitmapList = mutableListOf<Bitmap>()
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.github.nacabaro.vbhelper.source
|
package com.github.nacabaro.vbhelper.source
|
||||||
|
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Card
|
||||||
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
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<Sprites> {
|
||||||
|
return db.characterDao().getAllSprites()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,10 +19,14 @@ class StorageRepository (
|
|||||||
return db.userCharacterDao().getBeData(id)
|
return db.userCharacterDao().getBeData(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getTransformationHistory(characterId: Long): List<CharacterDtos.TransformationHistory>? {
|
fun getTransformationHistory(characterId: Long): List<CharacterDtos.TransformationHistory>? {
|
||||||
return db.userCharacterDao().getTransformationHistory(characterId)
|
return db.userCharacterDao().getTransformationHistory(characterId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getCharacterData(id: Long): CharacterDtos.DiMInfo {
|
||||||
|
return db.characterDao().getCharacterInfo(id)
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? {
|
suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? {
|
||||||
return db.userCharacterDao().getActiveCharacter()
|
return db.userCharacterDao().getActiveCharacter()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
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.source.StorageRepository
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
suspend fun characterToNfc(context: Context, characterId: Long): NfcCharacter? {
|
||||||
|
val app = context.applicationContext as VBHelper
|
||||||
|
val database = app.container.db
|
||||||
|
val storageRepository = StorageRepository(database)
|
||||||
|
val userCharacter = storageRepository.getSingleCharacter(characterId)
|
||||||
|
val characterInfo = storageRepository.getCharacterData(characterId)
|
||||||
|
|
||||||
|
if (userCharacter.characterType == DeviceType.BEDevice) {
|
||||||
|
val beData = storageRepository.getCharacterBeData(characterId)
|
||||||
|
val transformationHistory = storageRepository
|
||||||
|
.getTransformationHistory(characterId)!!
|
||||||
|
.map {
|
||||||
|
val date = Date(it.transformationDate)
|
||||||
|
val calendar = GregorianCalendar()
|
||||||
|
calendar.time = date
|
||||||
|
|
||||||
|
NfcCharacter.Transformation(
|
||||||
|
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()
|
||||||
|
|
||||||
|
val paddedTransformationArray = padTransformationArray(transformationHistory)
|
||||||
|
|
||||||
|
val nfcData = BENfcCharacter(
|
||||||
|
dimId = characterInfo.cardId.toUShort(),
|
||||||
|
charIndex = characterInfo.charId.toUShort(),
|
||||||
|
stage = userCharacter.stage.toByte(),
|
||||||
|
attribute = userCharacter.attribute,
|
||||||
|
ageInDays = userCharacter.ageInDays.toByte(),
|
||||||
|
nextAdventureMissionStage = userCharacter.nextAdventureMissionStage.toByte(),
|
||||||
|
mood = userCharacter.mood.toByte(),
|
||||||
|
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
||||||
|
itemEffectMentalStateValue = beData.itemEffectMentalStateValue.toByte(),
|
||||||
|
itemEffectMentalStateMinutesRemaining = beData.itemEffectMentalStateMinutesRemaining.toByte(),
|
||||||
|
itemEffectActivityLevelValue = beData.itemEffectActivityLevelValue.toByte(),
|
||||||
|
itemEffectActivityLevelMinutesRemaining = beData.itemEffectActivityLevelMinutesRemaining.toByte(),
|
||||||
|
itemEffectVitalPointsChangeValue = beData.itemEffectVitalPointsChangeValue.toByte(),
|
||||||
|
itemEffectVitalPointsChangeMinutesRemaining = beData.itemEffectVitalPointsChangeMinutesRemaining.toByte(),
|
||||||
|
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
||||||
|
injuryStatus = userCharacter.injuryStatus,
|
||||||
|
trainingPp = userCharacter.trophies.toUShort(),
|
||||||
|
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
||||||
|
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
||||||
|
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
||||||
|
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
||||||
|
activityLevel = userCharacter.activityLevel.toByte(),
|
||||||
|
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
||||||
|
transformationHistory = paddedTransformationArray,
|
||||||
|
vitalHistory = Array(7) {
|
||||||
|
NfcCharacter.DailyVitals(0u, 0u, 0u, 0u)
|
||||||
|
},
|
||||||
|
appReserved1 = ByteArray(12) {0},
|
||||||
|
appReserved2 = Array(3) {0u},
|
||||||
|
trainingHp = beData.trainingHp.toUShort(),
|
||||||
|
trainingAp = beData.trainingAp.toUShort(),
|
||||||
|
trainingBp = beData.trainingBp.toUShort(),
|
||||||
|
remainingTrainingTimeInMinutes = beData.remainingTrainingTimeInMinutes.toUShort(),
|
||||||
|
abilityRarity = beData.abilityRarity,
|
||||||
|
abilityType = beData.abilityType.toUShort(),
|
||||||
|
abilityBranch = beData.abilityBranch.toUShort(),
|
||||||
|
abilityReset = beData.abilityReset.toByte(),
|
||||||
|
rank = beData.rank.toByte(),
|
||||||
|
itemType = beData.itemType.toByte(),
|
||||||
|
itemMultiplier = beData.itemMultiplier.toByte(),
|
||||||
|
itemRemainingTime = beData.itemRemainingTime.toByte(),
|
||||||
|
otp0 = byteArrayOf(8),
|
||||||
|
otp1 = byteArrayOf(8),
|
||||||
|
characterCreationFirmwareVersion = FirmwareVersion(
|
||||||
|
minorVersion = beData.minorVersion.toByte(),
|
||||||
|
majorVersion = beData.majorVersion.toByte()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return nfcData
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.utils
|
||||||
|
|
||||||
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
|
|
||||||
|
fun padTransformationArray(
|
||||||
|
transformationArray: Array<NfcCharacter.Transformation>
|
||||||
|
): Array<NfcCharacter.Transformation> {
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.widget
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.glance.GlanceTheme
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.glance.background
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||||
|
import androidx.datastore.preferences.preferencesDataStore
|
||||||
|
import androidx.glance.GlanceId
|
||||||
|
import androidx.glance.GlanceModifier
|
||||||
|
import androidx.glance.Image
|
||||||
|
import androidx.glance.ImageProvider
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidget
|
||||||
|
import androidx.glance.appwidget.provideContent
|
||||||
|
import androidx.glance.layout.Alignment
|
||||||
|
import androidx.glance.layout.Column
|
||||||
|
import androidx.glance.layout.fillMaxSize
|
||||||
|
import androidx.glance.layout.size
|
||||||
|
import androidx.glance.state.PreferencesGlanceStateDefinition
|
||||||
|
import androidx.glance.text.Text
|
||||||
|
import androidx.glance.unit.ColorProvider
|
||||||
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.utils.BitmapData
|
||||||
|
import com.github.nacabaro.vbhelper.utils.getBitmap
|
||||||
|
|
||||||
|
/*
|
||||||
|
RANT: Why did they have to create the components from Jetpack Compose
|
||||||
|
with a different API for Glance? Now there are things I use in Jetpack Compose
|
||||||
|
like the filterQuality, which isn't here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
val CURRENT_IMAGE_KEY = booleanPreferencesKey("current_image")
|
||||||
|
|
||||||
|
class CharacterDisplayWidget : GlanceAppWidget() {
|
||||||
|
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||||
|
val application = context.applicationContext as VBHelper
|
||||||
|
val storageRepository = application.container.db
|
||||||
|
|
||||||
|
val currentCharacter = storageRepository
|
||||||
|
.userCharacterDao()
|
||||||
|
.getActiveCharacter()
|
||||||
|
|
||||||
|
val multiplier = 4
|
||||||
|
|
||||||
|
provideContent {
|
||||||
|
var bitmapIdle1 by remember { mutableStateOf<Bitmap?>(null) }
|
||||||
|
var bitmapIdle2 by remember { mutableStateOf<Bitmap?>(null) }
|
||||||
|
var dpSize by remember { mutableStateOf(0.dp) }
|
||||||
|
|
||||||
|
if (currentCharacter != null) {
|
||||||
|
val currentCharacterBitmapIdle1 = BitmapData(
|
||||||
|
currentCharacter.spriteIdle,
|
||||||
|
currentCharacter.spriteWidth,
|
||||||
|
currentCharacter.spriteHeight
|
||||||
|
)
|
||||||
|
|
||||||
|
val currentCharacterBitmapIdle2 = BitmapData(
|
||||||
|
currentCharacter.spriteIdle2,
|
||||||
|
currentCharacter.spriteWidth,
|
||||||
|
currentCharacter.spriteHeight
|
||||||
|
)
|
||||||
|
|
||||||
|
bitmapIdle1 = currentCharacterBitmapIdle1.getBitmap()
|
||||||
|
bitmapIdle2 = currentCharacterBitmapIdle2.getBitmap()
|
||||||
|
|
||||||
|
val density: Float = application.resources.displayMetrics.density
|
||||||
|
dpSize = (currentCharacterBitmapIdle1.width * multiplier / density).dp
|
||||||
|
}
|
||||||
|
|
||||||
|
WidgetContent(
|
||||||
|
imageBitmapFrame1 = bitmapIdle1,
|
||||||
|
imageBitmapFrame2 = bitmapIdle2,
|
||||||
|
dpSize = dpSize
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun WidgetContent(
|
||||||
|
imageBitmapFrame1: Bitmap?,
|
||||||
|
imageBitmapFrame2: Bitmap?,
|
||||||
|
dpSize: Dp
|
||||||
|
) {
|
||||||
|
GlanceTheme {
|
||||||
|
Column (
|
||||||
|
horizontalAlignment = Alignment.Horizontal.CenterHorizontally,
|
||||||
|
verticalAlignment = Alignment.Vertical.CenterVertically,
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(ColorProvider(MaterialTheme.colorScheme.background))
|
||||||
|
) {
|
||||||
|
if (imageBitmapFrame1 != null) {
|
||||||
|
Image(
|
||||||
|
provider = ImageProvider(
|
||||||
|
bitmap = imageBitmapFrame1
|
||||||
|
),
|
||||||
|
contentDescription = "Character",
|
||||||
|
modifier = GlanceModifier
|
||||||
|
.size(dpSize)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Text(
|
||||||
|
text = "No character selected"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.widget
|
||||||
|
|
||||||
|
import androidx.glance.state.PreferencesGlanceStateDefinition
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.widget
|
||||||
|
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidget
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidgetReceiver
|
||||||
|
|
||||||
|
class CharacterDisplayWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||||
|
override val glanceAppWidget: GlanceAppWidget = CharacterDisplayWidget()
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.widget
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.glance.appwidget.GlanceAppWidgetManager
|
||||||
|
import androidx.glance.appwidget.state.updateAppWidgetState
|
||||||
|
import androidx.work.CoroutineWorker
|
||||||
|
import androidx.work.WorkerParameters
|
||||||
|
|
||||||
|
class CharacterDisplayWidgetWorker(
|
||||||
|
appContext: Context,
|
||||||
|
workerParams: WorkerParameters
|
||||||
|
) : CoroutineWorker(appContext, workerParams) {
|
||||||
|
|
||||||
|
override suspend fun doWork(): Result {
|
||||||
|
// Get all widget IDs for your ImageSwapWidget
|
||||||
|
val glanceIds = GlanceAppWidgetManager(applicationContext)
|
||||||
|
.getGlanceIds(CharacterDisplayWidget::class.java)
|
||||||
|
|
||||||
|
glanceIds.forEach { glanceId ->
|
||||||
|
// Update the widget's state (toggle the boolean)
|
||||||
|
updateAppWidgetState(
|
||||||
|
context = applicationContext,
|
||||||
|
glanceId = glanceId
|
||||||
|
) { prefs ->
|
||||||
|
val currentImageIsImage1 = prefs[CURRENT_IMAGE_KEY] ?: true
|
||||||
|
prefs[CURRENT_IMAGE_KEY] = !currentImageIsImage1 // Toggle the boolean
|
||||||
|
}
|
||||||
|
// Trigger the widget to redraw itself with the new state
|
||||||
|
CharacterDisplayWidget().update(applicationContext, glanceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indicate that the work was successful
|
||||||
|
return Result.success()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:initialLayout="@layout/glance_default_loading_layout"
|
||||||
|
android:minWidth="40dp"
|
||||||
|
android:minHeight="20dp"
|
||||||
|
android:minResizeWidth="20dp"
|
||||||
|
android:previewImage="@drawable/baseline_image_24"
|
||||||
|
android:resizeMode="horizontal|vertical"
|
||||||
|
android:updatePeriodMillis="300000"
|
||||||
|
android:widgetCategory="home_screen" />
|
||||||
Reference in New Issue
Block a user