diff --git a/app/src/main/assets/items.db b/app/src/main/assets/items.db new file mode 100644 index 0000000..8ab0d21 Binary files /dev/null and b/app/src/main/assets/items.db differ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt index 569662b..eaa7d0e 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -24,6 +24,7 @@ import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter import com.github.nacabaro.vbhelper.navigation.AppNavigationHandlers +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImpl import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme @@ -63,12 +64,17 @@ class MainActivity : ComponentActivity() { this::unregisterActivityLifecycleListener ) val settingsScreenController = SettingsScreenControllerImpl(this) + val itemsScreenController = ItemsScreenControllerImpl(this) super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { VBHelperTheme { - MainApplication(scanScreenController, settingsScreenController) + MainApplication( + scanScreenController = scanScreenController, + settingsScreenController = settingsScreenController, + itemsScreenController = itemsScreenController + ) } } Log.i("MainActivity", "Activity onCreated") @@ -189,13 +195,15 @@ class MainActivity : ComponentActivity() { @Composable private fun MainApplication( scanScreenController: ScanScreenControllerImpl, - settingsScreenController: SettingsScreenControllerImpl + settingsScreenController: SettingsScreenControllerImpl, + itemsScreenController: ItemsScreenControllerImpl ) { AppNavigation( applicationNavigationHandlers = AppNavigationHandlers( settingsScreenController, scanScreenController, + itemsScreenController ), onClickImportCard = { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt index ceebb76..6df7570 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt @@ -1,6 +1,5 @@ package com.github.nacabaro.vbhelper.components -import android.util.Log import android.widget.Toast import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -23,22 +22,18 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.github.nacabaro.vbhelper.utils.BitmapData import com.github.nacabaro.vbhelper.utils.getBitmap import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.TextUnit import com.github.nacabaro.vbhelper.utils.getObscuredBitmap -import java.nio.ByteBuffer @Composable fun CharacterEntry( icon: BitmapData, - obscure: Boolean = false, modifier: Modifier = Modifier, + obscure: Boolean = false, shape: Shape = MaterialTheme.shapes.medium, multiplier: Int = 3, onClick: () -> Unit = { } @@ -79,8 +74,6 @@ fun ItemDisplay( icon: Int, textValue: String, modifier: Modifier = Modifier, - iconSize: Dp = 48.dp, - textSize: TextUnit = 24.sp, definition: String = "", ) { val context = LocalContext.current @@ -101,15 +94,14 @@ fun ItemDisplay( painter = painterResource(icon), contentDescription = "Vitals", modifier = Modifier + .fillMaxSize(0.5f) .padding(8.dp) - .size(iconSize) ) Text( text = textValue, textAlign = TextAlign.Center, - fontSize = textSize, fontFamily = MaterialTheme.typography.titleLarge.fontFamily, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/ItemElement.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/ItemElement.kt new file mode 100644 index 0000000..067d164 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/ItemElement.kt @@ -0,0 +1,211 @@ +package com.github.nacabaro.vbhelper.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.github.nacabaro.vbhelper.R +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImpl +import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme + +@Composable +fun ItemElement( + itemIcon: Int, + lengthIcon: Int, + modifier: Modifier = Modifier, + onClick: (() -> Unit) = { } +) { + Card ( + onClick = onClick, + modifier = modifier + .aspectRatio(1f) + ) { + Box(modifier = Modifier.fillMaxSize()) { + // Background image (full size) + Icon( + painter = painterResource(id = itemIcon), + contentDescription = null, + modifier = Modifier + .size(96.dp) + .align(Alignment.Center) + ) + Icon( + painter = painterResource(id = lengthIcon), + contentDescription = null, + tint = MaterialTheme.colorScheme.surfaceTint, + modifier = Modifier + .size(48.dp) // Set the size of the overlay image + .padding(4.dp + ) + .align(Alignment.TopStart) // Align to the top end (top-right corner) + ) + } + } +} + +@Composable +fun ItemDialog( + name: String, + description: String, + itemIcon: Int, + lengthIcon: Int, + amount: Int, + onClickUse: () -> Unit, + onClickCancel: () -> Unit +) { + Dialog( + onDismissRequest = onClickCancel, + properties = DialogProperties( + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { + Card ( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + Column ( + modifier = Modifier + .padding(16.dp) + ) { + Row { + Box(modifier = Modifier) { + // Background image (full size) + Icon( + painter = painterResource(id = itemIcon), + contentDescription = null, + modifier = Modifier + .size(96.dp) + .align(Alignment.Center) + ) + Icon( + painter = painterResource(id = lengthIcon), + contentDescription = null, + tint = MaterialTheme.colorScheme.outline, + modifier = Modifier + .size(64.dp) // Set the size of the overlay image + .align(Alignment.BottomEnd) // Align to the top end (top-right corner) + ) + } + Column ( + modifier = Modifier + .padding(16.dp) + ) { + Text( + fontSize = MaterialTheme.typography.titleLarge.fontSize, + text = name, + modifier = Modifier + .fillMaxWidth() + ) + } + } + Text( + textAlign = TextAlign.Center, + fontSize = MaterialTheme.typography.bodyMedium.fontSize, + fontFamily = MaterialTheme.typography.bodyMedium.fontFamily, + text = description + ) + Text( + textAlign = TextAlign.Center, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + text = "You have $amount of this item", + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) + Row ( + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + ) { + Button( + onClick = onClickUse + ) { + Text("Use item") + } + Spacer(modifier = Modifier.size(8.dp)) + Button( + onClick = onClickCancel + ) { + Text("Cancel") + } + } + } + } + } +} + +fun getIconResource(index: Int): Int { + return when (index) { + ItemsScreenControllerImpl.ItemTypes.PPTraining.id -> R.drawable.baseline_agility_24 + ItemsScreenControllerImpl.ItemTypes.APTraining.id -> R.drawable.baseline_attack_24 + ItemsScreenControllerImpl.ItemTypes.HPTraining.id -> R.drawable.baseline_shield_24 + ItemsScreenControllerImpl.ItemTypes.BPTraining.id -> R.drawable.baseline_trophy_24 + ItemsScreenControllerImpl.ItemTypes.AllTraining.id -> R.drawable.baseline_arrow_up_24 + 6 -> R.drawable.baseline_timer_24 + 7 -> R.drawable.baseline_rank_24 + 8 -> R.drawable.baseline_vitals_24 + else -> R.drawable.baseline_question_mark_24 + } +} + +fun getLengthResource(index: Int): Int { + return when (index) { + 15 -> R.drawable.baseline_15_min_timer + 30 -> R.drawable.baseline_30_min_timer + 60 -> R.drawable.baseline_60_min_timer + -60 -> R.drawable.baseline_60_min_timer + 300 -> R.drawable.baseline_5_hour_timer + 600 -> R.drawable.baseline_10_hour_timer + -720 -> R.drawable.baseline_12_hour_timer + -1440 -> R.drawable.baseline_24_hour_timer + 6000 -> R.drawable.baseline_reset_24 + 1000 -> R.drawable.baseline_single_arrow_up + 2500 -> R.drawable.baseline_double_arrow_up + 5000 -> R.drawable.baseline_triple_arrow_up + 9999 -> R.drawable.baseline_health_24 + -500 -> R.drawable.baseline_single_arrow_down + -1000 -> R.drawable.baseline_double_arrow_down + -2500 -> R.drawable.baseline_triple_arrow_down + -9999 -> R.drawable.baseline_reset_24 + else -> R.drawable.baseline_question_mark_24 + } +} + +@Composable +@Preview(showBackground = true) +fun PreviewItemDialog() { + VBHelperTheme { + ItemDialog( + name = "AP Training x3 (60 min)", + description = "Boosts AP during training (for 60 minutes)", + itemIcon = R.drawable.baseline_attack_24, + lengthIcon = R.drawable.baseline_60_min_timer, + onClickUse = { }, + onClickCancel = { }, + amount = 19 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt new file mode 100644 index 0000000..3aad016 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt @@ -0,0 +1,45 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Query +import com.github.nacabaro.vbhelper.dtos.ItemDtos + +@Dao +interface ItemDao { + @Query(""" + SELECT Items.*, UserItems.quantity + FROM Items + LEFT JOIN UserItems ON Items.id = UserItems.itemId + ORDER BY Items.itemIcon ASC + """) + suspend fun getAllItems(): List + + @Query(""" + SELECT Items.*, UserItems.quantity + FROM Items + JOIN UserItems ON Items.id = UserItems.itemId + """) + suspend fun getAllUserItems(): List + + @Query(""" + SELECT Items.*, UserItems.quantity + FROM Items + JOIN UserItems ON Items.id = UserItems.itemId + WHERE UserItems.itemId = :itemId + """) + fun getUserItem(itemId: Long): ItemDtos.ItemsWithQuantities + + @Query(""" + UPDATE UserItems + SET quantity = quantity - 1 + WHERE itemId = :itemId + """) + fun useItem(itemId: Long) + + @Query(""" + UPDATE UserItems + SET quantity = quantity - :itemAmount + WHERE itemId = :itemId + """) + suspend fun purchaseItem(itemId: Long, itemAmount: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt index 90975cb..0dbea43 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Upsert import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory @@ -17,6 +18,12 @@ interface UserCharacterDao { @Insert fun insertBECharacterData(characterData: BECharacterData) + @Upsert + fun updateCharacter(character: UserCharacter) + + @Upsert + fun updateBECharacterData(characterData: BECharacterData) + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertTransformationHistory(vararg transformationHistory: TransformationHistory) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt index 25501a5..7bc9f56 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -5,6 +5,7 @@ import androidx.room.RoomDatabase import com.github.nacabaro.vbhelper.daos.CharacterDao import com.github.nacabaro.vbhelper.daos.DexDao import com.github.nacabaro.vbhelper.daos.DiMDao +import com.github.nacabaro.vbhelper.daos.ItemDao import com.github.nacabaro.vbhelper.daos.UserCharacterDao import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.domain.characters.Card @@ -13,6 +14,8 @@ 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.TransformationHistory import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter +import com.github.nacabaro.vbhelper.domain.items.Items +import com.github.nacabaro.vbhelper.domain.items.UserItems @Database( version = 1, @@ -23,7 +26,9 @@ import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter UserCharacter::class, BECharacterData::class, TransformationHistory::class, - Dex::class + Dex::class, + Items::class, + UserItems::class ] ) abstract class AppDatabase : RoomDatabase() { @@ -31,4 +36,5 @@ abstract class AppDatabase : RoomDatabase() { abstract fun characterDao(): CharacterDao abstract fun userCharacterDao(): UserCharacterDao abstract fun dexDao(): DexDao + abstract fun itemDao(): ItemDao } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt index e84819e..4724bc6 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/di/DefaultAppContainer.kt @@ -22,7 +22,9 @@ class DefaultAppContainer(private val context: Context) : AppContainer { context = context, klass = AppDatabase::class.java, "internalDb" - ).build() + ) + .createFromAsset("items.db") + .build() } override val dataStoreSecretsRepository = DataStoreSecretsRepository(context.secretsStore) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/BECharacterData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/BECharacterData.kt index 82c3a36..c3b69c1 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/BECharacterData.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/BECharacterData.kt @@ -20,7 +20,7 @@ data class BECharacterData ( val trainingHp: Int, val trainingAp: Int, val trainingBp: Int, - val remainingTrainingTimeInMinutes: Int, + var remainingTrainingTimeInMinutes: Int, val itemEffectMentalStateValue: Int, val itemEffectMentalStateMinutesRemaining: Int, val itemEffectActivityLevelValue: Int, @@ -32,9 +32,9 @@ data class BECharacterData ( val abilityBranch: Int, val abilityReset: Int, val rank: Int, - val itemType: Int, - val itemMultiplier: Int, - val itemRemainingTime: Int, + var itemType: Int, + var itemMultiplier: Int, + var itemRemainingTime: Int, val otp0: String, val otp1: String, val minorVersion: Int, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt new file mode 100644 index 0000000..934d303 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt @@ -0,0 +1,14 @@ +package com.github.nacabaro.vbhelper.domain.items + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class Items( + @PrimaryKey val id: Long, + val name: String, + val description: String, + val itemIcon: Int, + val itemLength: Int, + val price: Int +) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/UserItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/UserItems.kt new file mode 100644 index 0000000..5c98774 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/UserItems.kt @@ -0,0 +1,20 @@ +package com.github.nacabaro.vbhelper.domain.items + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey + +@Entity( + foreignKeys = [ + ForeignKey( + entity = Items::class, + parentColumns = ["id"], + childColumns = ["itemId"], + onDelete = ForeignKey.CASCADE + ) + ] +) +data class UserItems( + @PrimaryKey val itemId: Long, + val quantity: Int, +) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt new file mode 100644 index 0000000..8e296e8 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt @@ -0,0 +1,14 @@ +package com.github.nacabaro.vbhelper.dtos + + +object ItemDtos { + data class ItemsWithQuantities ( + val id: Long, + val name: String, + val description: String, + val itemIcon: Int, + val itemLength: Int, + val price: Int, + val quantity: Int, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt index 5d417b1..13e8fd4 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt @@ -11,17 +11,20 @@ import com.github.nacabaro.vbhelper.screens.BattlesScreen import com.github.nacabaro.vbhelper.screens.DexScreen import com.github.nacabaro.vbhelper.screens.DiMScreen import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreen -import com.github.nacabaro.vbhelper.screens.ItemsScreen +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen import com.github.nacabaro.vbhelper.screens.SpriteViewer import com.github.nacabaro.vbhelper.screens.StorageScreen +import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImpl import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl data class AppNavigationHandlers( val settingsScreenController: SettingsScreenControllerImpl, val scanScreenController: ScanScreenControllerImpl, + val itemsScreenController: ItemsScreenControllerImpl ) @Composable @@ -96,6 +99,17 @@ fun AppNavigation( navController = navController ) } + composable(NavigationItems.ApplyItem.route) { + val itemId = it.arguments?.getString("itemId") + if (itemId != null) { + ChooseCharacterScreen( + itemsScreenController = applicationNavigationHandlers + .itemsScreenController, + navController = navController, + itemId = itemId.toLong() + ) + } + } } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt index bc0bd38..45c654e 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt @@ -16,4 +16,7 @@ sealed class NavigationItems ( object Viewer : NavigationItems("Viewer", R.drawable.baseline_image_24, "Viewer") object CardView : NavigationItems("Card/{cardId}", R.drawable.baseline_image_24, "Card") object Items : NavigationItems("Items", R.drawable.baseline_data_24, "Items") + object MyItems : NavigationItems("MyItems", R.drawable.baseline_data_24, "My items") + object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store") + object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item") } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt deleted file mode 100644 index 76b9532..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/ItemsScreen.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.nacabaro.vbhelper.screens - -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.navigation.NavController - -@Composable -fun ItemsScreen( - navController: NavController -) { - Text(text = "Items") -} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt index 597fca0..89a6e52 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/StorageScreen.kt @@ -1,6 +1,5 @@ package com.github.nacabaro.vbhelper.screens -import android.util.Log import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Arrangement @@ -8,7 +7,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items @@ -66,7 +64,7 @@ fun StorageScreen( } Scaffold ( - topBar = { TopBanner(text = "My Digimon") } + topBar = { TopBanner(text = "My characters") } ) { contentPadding -> if (monList.value.isEmpty()) { Column ( @@ -101,31 +99,31 @@ fun StorageScreen( selectedCharacter = index.id } ) + } + } - if (selectedCharacter != null) { - StorageDialog( - characterId = selectedCharacter!!, - onDismissRequest = { selectedCharacter = null }, - onClickSetActive = { - coroutineScope.launch { - withContext(Dispatchers.IO) { - storageRepository.setActiveCharacter(selectedCharacter!!) - selectedCharacter = null - } - navController.navigate(NavigationItems.Home.route) - } - }, - onSendToBracelet = { - navController.navigate( - NavigationItems.Scan.route.replace( - "{characterId}", - selectedCharacter.toString() - ) - ) + if (selectedCharacter != null) { + StorageDialog( + characterId = selectedCharacter!!, + onDismissRequest = { selectedCharacter = null }, + onClickSetActive = { + coroutineScope.launch { + withContext(Dispatchers.IO) { + storageRepository.setActiveCharacter(selectedCharacter!!) + selectedCharacter = null } + navController.navigate(NavigationItems.Home.route) + } + }, + onSendToBracelet = { + navController.navigate( + NavigationItems.Scan.route.replace( + "{characterId}", + selectedCharacter.toString() + ) ) } - } + ) } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt index 433530c..9b58058 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt @@ -15,8 +15,10 @@ import com.github.nacabaro.vbhelper.R import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.ItemDisplay import com.github.nacabaro.vbhelper.components.TransformationHistoryCard +import com.github.nacabaro.vbhelper.components.getIconResource import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImpl import com.github.nacabaro.vbhelper.utils.BitmapData import java.util.Locale @@ -153,6 +155,24 @@ fun BEBEmHomeScreen( .aspectRatio(1f) .padding(8.dp) ) + if (beData.itemRemainingTime != 0) { + ItemDisplay( + icon = getIconResource(beData.itemType), + textValue = "${beData.itemRemainingTime} m", + definition = when (beData.itemType) { + ItemsScreenControllerImpl.ItemTypes.PPTraining.id -> "PP Training" + ItemsScreenControllerImpl.ItemTypes.HPTraining.id -> "HP Training" + ItemsScreenControllerImpl.ItemTypes.APTraining.id -> "AP Training" + ItemsScreenControllerImpl.ItemTypes.BPTraining.id -> "BP Training" + ItemsScreenControllerImpl.ItemTypes.AllTraining.id -> "All Training" + else -> "" + }, + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } } Row ( modifier = Modifier diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt index 3d8ef15..9b4ea06 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt @@ -16,8 +16,10 @@ import com.github.nacabaro.vbhelper.R import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.ItemDisplay import com.github.nacabaro.vbhelper.components.TransformationHistoryCard +import com.github.nacabaro.vbhelper.components.getIconResource import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImpl import com.github.nacabaro.vbhelper.utils.BitmapData import kotlin.text.format @@ -33,7 +35,7 @@ fun BEDiMHomeScreen( .padding(top = contentPadding.calculateTopPadding()) .verticalScroll(state = rememberScrollState()) ) { - Row ( + Row( modifier = Modifier .fillMaxWidth() ) { @@ -49,7 +51,7 @@ fun BEDiMHomeScreen( .weight(1f) .aspectRatio(1f) ) - Column ( + Column( modifier = Modifier .weight(0.5f) .aspectRatio(0.5f) @@ -74,7 +76,7 @@ fun BEDiMHomeScreen( ) } } - Row ( + Row( modifier = Modifier .fillMaxWidth() ) { @@ -108,7 +110,7 @@ fun BEDiMHomeScreen( .padding(8.dp) ) } - Row ( + Row( modifier = Modifier .fillMaxWidth() ) { @@ -130,8 +132,13 @@ fun BEDiMHomeScreen( textValue = when { activeMon.totalBattlesLost == 0 -> "0.00 %" else -> { - val battleWinPercentage = activeMon.totalBattlesWon.toFloat() / (activeMon.totalBattlesWon + activeMon.totalBattlesLost).toFloat() - String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + val battleWinPercentage = + activeMon.totalBattlesWon.toFloat() / (activeMon.totalBattlesWon + activeMon.totalBattlesLost).toFloat() + String.format( + Locale.getDefault(), + "%.2f", + battleWinPercentage * 100 + ) + " %" // Specify locale } }, definition = "Total battle win %", @@ -145,8 +152,13 @@ fun BEDiMHomeScreen( textValue = when { activeMon.totalBattlesLost == 0 -> "0.00 %" else -> { - val battleWinPercentage = activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat() - String.format(Locale.getDefault(), "%.2f", battleWinPercentage * 100) + " %" // Specify locale + val battleWinPercentage = + activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat() + String.format( + Locale.getDefault(), + "%.2f", + battleWinPercentage * 100 + ) + " %" // Specify locale } }, definition = "Current phase win %", @@ -155,8 +167,26 @@ fun BEDiMHomeScreen( .aspectRatio(1f) .padding(8.dp) ) + if (beData.itemRemainingTime != 0) { + ItemDisplay( + icon = getIconResource(beData.itemType), + textValue = "${beData.itemRemainingTime} m", + definition = when (beData.itemType) { + ItemsScreenControllerImpl.ItemTypes.PPTraining.id -> "PP Training" + ItemsScreenControllerImpl.ItemTypes.HPTraining.id -> "HP Training" + ItemsScreenControllerImpl.ItemTypes.APTraining.id -> "AP Training" + ItemsScreenControllerImpl.ItemTypes.BPTraining.id -> "BP Training" + ItemsScreenControllerImpl.ItemTypes.AllTraining.id -> "All Training" + else -> "" + }, + modifier = Modifier + .weight(1f) + .aspectRatio(1f) + .padding(8.dp) + ) + } } - Row ( + Row( modifier = Modifier .fillMaxWidth() ) { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt new file mode 100644 index 0000000..fe52df1 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt @@ -0,0 +1,90 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + +import android.widget.Toast +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.Scaffold +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.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.CharacterEntry +import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.source.StorageRepository +import com.github.nacabaro.vbhelper.utils.BitmapData +import kotlinx.coroutines.launch + + +@Composable +fun ChooseCharacterScreen( + navController: NavController, + itemsScreenController: ItemsScreenControllerImpl, + itemId: Long +) { + val coroutineScope = rememberCoroutineScope() + val application = LocalContext.current.applicationContext as VBHelper + val storageRepository = StorageRepository(application.container.db) + val characterList = remember { + mutableStateOf>(emptyList()) + } + + var selectedCharacter by remember { mutableStateOf(null) } + + LaunchedEffect(storageRepository) { + coroutineScope.launch { + characterList.value = storageRepository.getAllCharacters() + } + } + + LaunchedEffect (selectedCharacter) { + if (selectedCharacter != null) { + itemsScreenController.applyItem(itemId, selectedCharacter!!) { + Toast.makeText( + application.applicationContext, + "Item applied!", + Toast.LENGTH_SHORT + ).show() + navController.popBackStack() + } + } + } + + Scaffold( + topBar = { + TopBanner( + text = "Choose character", + onBackClick = { + navController.popBackStack() + } + ) + } + ) { contentPadding -> + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + ) { + items(characterList.value) { + CharacterEntry( + icon = BitmapData( + bitmap = it.spriteIdle, + width = it.spriteWidth, + height = it.spriteHeight + ) + ) { + selectedCharacter = it.id + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt new file mode 100644 index 0000000..8bbcbc3 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreen.kt @@ -0,0 +1,60 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.Text +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.compose.ui.Modifier +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.navigation.NavigationItems + +@Composable +fun ItemsScreen( + navController: NavController, +) { + var selectedTabItem by remember { mutableStateOf(0) } + val items = listOf( + NavigationItems.MyItems, + NavigationItems.ItemsStore + ) + Scaffold( + topBar = { + Column { + TopBanner("Items") + TabRow( + selectedTabIndex = selectedTabItem, + modifier = Modifier + ) { + items.forEachIndexed { index, item -> + Tab( + text = { Text(item.label) }, + selected = selectedTabItem == index, + onClick = { selectedTabItem = index } + ) + } + } + } + } + ) { contentPadding -> + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = contentPadding.calculateTopPadding()) + ) { + when (selectedTabItem) { + 0 -> MyItems(navController) + 1 -> ItemsStore(navController) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenController.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenController.kt new file mode 100644 index 0000000..d967c08 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenController.kt @@ -0,0 +1,6 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + + +interface ItemsScreenController { + fun applyItem(itemId: Long, characterId: Long, onCompletion: () -> Unit) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt new file mode 100644 index 0000000..c604236 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt @@ -0,0 +1,118 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + +import androidx.activity.ComponentActivity +import androidx.lifecycle.lifecycleScope +import com.github.nacabaro.vbhelper.database.AppDatabase +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.dtos.ItemDtos +import com.github.nacabaro.vbhelper.utils.DeviceType +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class ItemsScreenControllerImpl ( + private val context: ComponentActivity, +): ItemsScreenController { + private var database: AppDatabase + + enum class ItemTypes(val id: Int) { + PPTraining(1), + HPTraining(2), + APTraining(3), + BPTraining(4), + AllTraining(5), + EvoTimer(6), + LimitTimer(7), + Vitals(8) + } + + init { + val application = context.applicationContext as VBHelper + database = application.container.db + } + + override fun applyItem(itemId: Long, characterId: Long, onCompletion: () -> Unit) { + context.lifecycleScope.launch { + withContext(Dispatchers.IO) { + val item = getItem(itemId) + val characterData = database.userCharacterDao().getCharacter(characterId) + val beCharacterData: BECharacterData + //var vbCharacterData: VBCharacterData + + if (characterData.characterType == DeviceType.BEDevice) { + beCharacterData = database.userCharacterDao().getBeData(characterId) + } else { + TODO("Not implemented") + //vbCharacterData = database.userCharacterDao().getVbData(characterId) + } + + if (item.itemIcon in 1 .. 5 && characterData.characterType == DeviceType.BEDevice) { + beCharacterData.itemType = item.itemIcon + beCharacterData.itemMultiplier = 3 + beCharacterData.itemRemainingTime = item.itemLength + + database + .userCharacterDao() + .updateBECharacterData(beCharacterData) + + } else if (item.itemIcon == ItemTypes.EvoTimer.id) { + characterData.transformationCountdown += item.itemLength + if (characterData.transformationCountdown < 0) { + characterData.transformationCountdown = 0 + } + + // VB does not like it when the transformationCountdown is 0 + if (characterData.characterType == DeviceType.VBDevice && + characterData.transformationCountdown <= 0 ) { + characterData.transformationCountdown = 1 + } + + database + .userCharacterDao() + .updateCharacter(characterData) + + } else if (item.itemIcon == ItemTypes.LimitTimer.id) { + beCharacterData.remainingTrainingTimeInMinutes += item.itemLength + if (beCharacterData.remainingTrainingTimeInMinutes > 6000) { + beCharacterData.remainingTrainingTimeInMinutes = 6000 + } + + database + .userCharacterDao() + .updateBECharacterData(beCharacterData) + + } else if (item.itemIcon == ItemTypes.Vitals.id) { + characterData.vitalPoints += item.itemLength + if (characterData.vitalPoints < 0) { + characterData.vitalPoints = 0 + } else if (characterData.vitalPoints > 9999) { + characterData.vitalPoints = 9999 + } + + database + .userCharacterDao() + .updateCharacter(characterData) + } + + consumeItem(item.id) + + context.runOnUiThread { + onCompletion() + } + } + } + } + + private fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities { + return database + .itemDao() + .getUserItem(itemId) + } + + private fun consumeItem(itemId: Long) { + database + .itemDao() + .useItem(itemId) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsStore.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsStore.kt new file mode 100644 index 0000000..771838c --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsStore.kt @@ -0,0 +1,75 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.Text +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.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.ItemDialog +import com.github.nacabaro.vbhelper.components.ItemElement +import com.github.nacabaro.vbhelper.components.getIconResource +import com.github.nacabaro.vbhelper.components.getLengthResource +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.dtos.ItemDtos +import com.github.nacabaro.vbhelper.source.ItemsRepository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@Composable +fun ItemsStore( + navController: NavController +) { + val application = LocalContext.current.applicationContext as VBHelper + val itemsRepository = ItemsRepository(application.container.db) + val myItems = remember { mutableStateOf(emptyList()) } + var selectedElementIndex by remember { mutableStateOf(null) } + + LaunchedEffect(itemsRepository) { + withContext(Dispatchers.IO) { + myItems.value = itemsRepository.getAllItems() + } + } + + if (myItems.value.isEmpty()) { + Text("No items") + } else { + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier + ) { + items(myItems.value) { index -> + ItemElement( + itemIcon = getIconResource(index.itemIcon), + lengthIcon = getLengthResource(index.itemLength), + modifier = Modifier + .padding(8.dp), + onClick = { + selectedElementIndex = myItems.value.indexOf(index) + } + ) + } + } + + if (selectedElementIndex != null) { + ItemDialog( + name = myItems.value[selectedElementIndex!!].name, + description = myItems.value[selectedElementIndex!!].description, + itemIcon = getIconResource(myItems.value[selectedElementIndex!!].itemIcon), + lengthIcon = getLengthResource(myItems.value[selectedElementIndex!!].itemLength), + amount = myItems.value[selectedElementIndex!!].quantity, + onClickUse = { }, + onClickCancel = { selectedElementIndex = null } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/MyItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/MyItems.kt new file mode 100644 index 0000000..098c2fd --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/MyItems.kt @@ -0,0 +1,97 @@ +package com.github.nacabaro.vbhelper.screens.itemsScreen + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.Text +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.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.ItemDialog +import com.github.nacabaro.vbhelper.components.ItemElement +import com.github.nacabaro.vbhelper.components.getIconResource +import com.github.nacabaro.vbhelper.components.getLengthResource +import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.dtos.ItemDtos +import com.github.nacabaro.vbhelper.navigation.NavigationItems +import com.github.nacabaro.vbhelper.source.ItemsRepository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@Composable +fun MyItems( + navController: NavController, +) { + val application = LocalContext.current.applicationContext as VBHelper + val itemsRepository = ItemsRepository(application.container.db) + val myItems = remember { mutableStateOf(emptyList()) } + var selectedElementIndex by remember { mutableStateOf(null) } + + LaunchedEffect(itemsRepository) { + withContext(Dispatchers.IO) { + myItems.value = itemsRepository.getUserItems() + } + } + + if (myItems.value.isEmpty()) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.fillMaxSize() + ) { + Text("No items") + } + } else { + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier + ) { + items(myItems.value) { index -> + ItemElement( + itemIcon = getIconResource(index.itemIcon), + lengthIcon = getLengthResource(index.itemLength), + modifier = Modifier + .padding(8.dp), + onClick = { + selectedElementIndex = myItems.value.indexOf(index) + } + ) + } + } + + if (selectedElementIndex != null) { + ItemDialog( + name = myItems.value[selectedElementIndex!!].name, + description = myItems.value[selectedElementIndex!!].description, + itemIcon = getIconResource(myItems.value[selectedElementIndex!!].itemIcon), + lengthIcon = getLengthResource(myItems.value[selectedElementIndex!!].itemLength), + amount = myItems.value[selectedElementIndex!!].quantity, + onClickUse = { + navController + .navigate( + NavigationItems + .ApplyItem.route + .replace( + "{itemId}", + myItems.value[selectedElementIndex!!].id.toString() + ) + ) + selectedElementIndex = null + }, + onClickCancel = { selectedElementIndex = null } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/ItemsRepository.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/ItemsRepository.kt new file mode 100644 index 0000000..8d6d705 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/ItemsRepository.kt @@ -0,0 +1,17 @@ +package com.github.nacabaro.vbhelper.source + +import com.github.nacabaro.vbhelper.database.AppDatabase +import com.github.nacabaro.vbhelper.domain.items.Items +import com.github.nacabaro.vbhelper.dtos.ItemDtos + +class ItemsRepository( + private val db: AppDatabase +) { + suspend fun getAllItems(): List { + return db.itemDao().getAllItems() + } + + suspend fun getUserItems(): List { + return db.itemDao().getAllUserItems() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_10_hour_timer.xml b/app/src/main/res/drawable/baseline_10_hour_timer.xml new file mode 100644 index 0000000..b0e95af --- /dev/null +++ b/app/src/main/res/drawable/baseline_10_hour_timer.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/drawable/baseline_12_hour_timer.xml b/app/src/main/res/drawable/baseline_12_hour_timer.xml new file mode 100644 index 0000000..c94c7ca --- /dev/null +++ b/app/src/main/res/drawable/baseline_12_hour_timer.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/baseline_15_min_timer.xml b/app/src/main/res/drawable/baseline_15_min_timer.xml new file mode 100644 index 0000000..e6dcd6e --- /dev/null +++ b/app/src/main/res/drawable/baseline_15_min_timer.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_24_hour_timer.xml b/app/src/main/res/drawable/baseline_24_hour_timer.xml new file mode 100644 index 0000000..327f067 --- /dev/null +++ b/app/src/main/res/drawable/baseline_24_hour_timer.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/baseline_30_min_timer.xml b/app/src/main/res/drawable/baseline_30_min_timer.xml new file mode 100644 index 0000000..e84db54 --- /dev/null +++ b/app/src/main/res/drawable/baseline_30_min_timer.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_5_hour_timer.xml b/app/src/main/res/drawable/baseline_5_hour_timer.xml new file mode 100644 index 0000000..695d1f7 --- /dev/null +++ b/app/src/main/res/drawable/baseline_5_hour_timer.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_60_min_timer.xml b/app/src/main/res/drawable/baseline_60_min_timer.xml new file mode 100644 index 0000000..092fd19 --- /dev/null +++ b/app/src/main/res/drawable/baseline_60_min_timer.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_arrow_up_24.xml b/app/src/main/res/drawable/baseline_arrow_up_24.xml new file mode 100644 index 0000000..54cb31c --- /dev/null +++ b/app/src/main/res/drawable/baseline_arrow_up_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_double_arrow_down.xml b/app/src/main/res/drawable/baseline_double_arrow_down.xml new file mode 100644 index 0000000..0c5ea21 --- /dev/null +++ b/app/src/main/res/drawable/baseline_double_arrow_down.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/baseline_double_arrow_up.xml b/app/src/main/res/drawable/baseline_double_arrow_up.xml new file mode 100644 index 0000000..b54d9a0 --- /dev/null +++ b/app/src/main/res/drawable/baseline_double_arrow_up.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/baseline_reset_24.xml b/app/src/main/res/drawable/baseline_reset_24.xml new file mode 100644 index 0000000..5b1a1ab --- /dev/null +++ b/app/src/main/res/drawable/baseline_reset_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_shield_24.xml b/app/src/main/res/drawable/baseline_shield_24.xml new file mode 100644 index 0000000..8e3b2ca --- /dev/null +++ b/app/src/main/res/drawable/baseline_shield_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_single_arrow_down.xml b/app/src/main/res/drawable/baseline_single_arrow_down.xml new file mode 100644 index 0000000..6a59bd4 --- /dev/null +++ b/app/src/main/res/drawable/baseline_single_arrow_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_single_arrow_up.xml b/app/src/main/res/drawable/baseline_single_arrow_up.xml new file mode 100644 index 0000000..4223055 --- /dev/null +++ b/app/src/main/res/drawable/baseline_single_arrow_up.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/baseline_triple_arrow_down.xml b/app/src/main/res/drawable/baseline_triple_arrow_down.xml new file mode 100644 index 0000000..1833357 --- /dev/null +++ b/app/src/main/res/drawable/baseline_triple_arrow_down.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_triple_arrow_up.xml b/app/src/main/res/drawable/baseline_triple_arrow_up.xml new file mode 100644 index 0000000..b3eabe6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_triple_arrow_up.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2186327..505e807 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,18 +1,18 @@ [versions] agp = "8.7.3" -datastore = "1.1.1" +datastore = "1.1.2" kotlin = "2.0.0" coreKtx = "1.15.0" junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1" lifecycleRuntimeKtx = "2.8.7" -activityCompose = "1.9.3" -composeBom = "2024.04.01" +activityCompose = "1.10.0" +composeBom = "2025.01.00" protobufGradlePlugin = "0.9.4" protobufJavalite = "4.27.0" roomRuntime = "2.6.1" -vbNfcReader = "0.1.0" +vbNfcReader = "0.2.0-SNAPSHOT" dimReader = "2.1.0" [libraries]