From e8f441ba2becbdec5878bf2f2eb220906fa09f3a Mon Sep 17 00:00:00 2001 From: Nacho Date: Sun, 5 Jan 2025 01:58:08 +0100 Subject: [PATCH] Few things, again! - From "Battles" to "Battle" - Added a settings screen, to import keys and cards - Added a way to access the settings from home - Get character details --- .../nacabaro/vbhelper/components/TopBanner.kt | 50 ++++++++-- .../vbhelper/navigation/AppNavigation.kt | 10 +- .../vbhelper/navigation/BottomNavItem.kt | 3 +- .../nacabaro/vbhelper/screens/HomeScreen.kt | 29 +++++- .../vbhelper/screens/SettingsScreen.kt | 96 +++++++++++++++++++ .../vbhelper/screens/StorageScreen.kt | 89 +++++++++++++++-- .../vbhelper/source/StorageRepository.kt | 4 + .../temporary_daos/TemporaryMonsterDao.kt | 3 + .../res/drawable/baseline_arrow_back_24.xml | 5 + .../res/drawable/baseline_settings_24.xml | 5 + 10 files changed, 278 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/com/github/nacabaro/vbhelper/screens/SettingsScreen.kt create mode 100644 app/src/main/res/drawable/baseline_arrow_back_24.xml create mode 100644 app/src/main/res/drawable/baseline_settings_24.xml diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt index f5fc3d0..19e1e64 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/TopBanner.kt @@ -1,25 +1,63 @@ package com.github.nacabaro.vbhelper.components +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton 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.unit.dp import androidx.compose.ui.unit.sp +import com.github.nacabaro.vbhelper.R @Composable fun TopBanner( text: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + onGearClick: (() -> Unit)? = null, + onBackClick: (() -> Unit)? = null ) { - Text( - text = text, - textAlign = TextAlign.Center, - fontSize = 24.sp, + Box( // Use Box to overlay elements modifier = modifier .fillMaxWidth() .padding(16.dp) - ) + ) { + Text( + text = text, + textAlign = TextAlign.Center, + fontSize = 24.sp, + modifier = Modifier + .align(Alignment.Center) // Center the text + ) + if (onGearClick != null) { + IconButton( + onClick = onGearClick, + modifier = Modifier + .align(Alignment.CenterEnd) // Place gear icon at the end + ) { + Icon( + painter = painterResource(R.drawable.baseline_settings_24), // Use a gear icon + contentDescription = "Settings" + ) + } + } + + if (onBackClick != null) { + IconButton( + onClick = onBackClick, + modifier = Modifier + .align(Alignment.CenterStart) // Place gear icon at the end + ) { + Icon( + painter = painterResource(R.drawable.baseline_arrow_back_24), // Use a gear icon + contentDescription = "Settings" + ) + } + } + } } 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 828bfcc..0371b5e 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,6 +11,7 @@ import com.github.nacabaro.vbhelper.screens.BattlesScreen import com.github.nacabaro.vbhelper.screens.DexScreen import com.github.nacabaro.vbhelper.screens.HomeScreen import com.github.nacabaro.vbhelper.screens.ScanScreen +import com.github.nacabaro.vbhelper.screens.SettingsScreen import com.github.nacabaro.vbhelper.screens.StorageScreen @Composable @@ -36,7 +37,9 @@ fun AppNavigation( BattlesScreen() } composable(BottomNavItem.Home.route) { - HomeScreen() + HomeScreen( + navController = navController + ) } composable(BottomNavItem.Storage.route) { StorageScreen() @@ -52,6 +55,11 @@ fun AppNavigation( composable(BottomNavItem.Dex.route) { DexScreen() } + composable(BottomNavItem.Settings.route) { + SettingsScreen( + navController = navController + ) + } } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavItem.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavItem.kt index dad62ff..af0dd02 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavItem.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavItem.kt @@ -8,8 +8,9 @@ sealed class BottomNavItem ( var label: String ) { object Scan : BottomNavItem("Scan", R.drawable.baseline_nfc_24, "Scan") - object Battles : BottomNavItem("Battles", R.drawable.baseline_swords_24, "Battles") + object Battles : BottomNavItem("Battle", R.drawable.baseline_swords_24, "Battle") object Home : BottomNavItem("Home", R.drawable.baseline_cottage_24, "Home") object Dex : BottomNavItem("Dex", R.drawable.baseline_menu_book_24, "Dex") object Storage : BottomNavItem("Storage", R.drawable.baseline_catching_pokemon_24, "Storage") + object Settings : BottomNavItem("Settings", R.drawable.baseline_settings_24, "Settings") } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt index 97ec094..03b6985 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/HomeScreen.kt @@ -1,9 +1,34 @@ package com.github.nacabaro.vbhelper.screens +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.navigation.BottomNavItem @Composable -fun HomeScreen() { - Text("Home Screen") +fun HomeScreen( + navController: NavController +) { + Scaffold ( + topBar = { + TopBanner( + text = "VB Helper", + onGearClick = { + navController.navigate(BottomNavItem.Settings.route) + } + ) + } + ) { contentPadding -> + Box ( + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + ) { + Text("Home Screen") + } + } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SettingsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/SettingsScreen.kt new file mode 100644 index 0000000..9d54d2c --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/SettingsScreen.kt @@ -0,0 +1,96 @@ +package com.github.nacabaro.vbhelper.screens + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.github.nacabaro.vbhelper.components.TopBanner + +@Composable +fun SettingsScreen( + navController: NavController +) { + Scaffold ( + topBar = { + TopBanner( + text = "Settings", + onBackClick = { + navController.popBackStack() + } + ) + }, + modifier = Modifier + .fillMaxSize() + ) { contentPadding -> + Column ( + modifier = Modifier + .padding(top = contentPadding.calculateTopPadding()) + .fillMaxSize() + .verticalScroll(rememberScrollState()) + ) { + SettingsSection("General") + SettingsEntry(title = "Import VB key", description = "Import standard vital bracelet keys") { } + SettingsEntry(title = "Import VB Characters key", description = "Import standard vital bracelet keys") { } + SettingsEntry(title = "Import VB BE key", description = "Import standard vital bracelet keys") { } + SettingsEntry(title = "Import transform functions", description = "Import standard vital bracelet keys") { } + SettingsEntry(title = "Import decryption key", description = "Import standard vital bracelet keys") { } + SettingsSection("DiM/BEm management") + SettingsEntry(title = "Import DiM card", description = "Import DiM card file") { } + SettingsEntry(title = "Import BEm card", description = "Import BEm card file") { } + SettingsSection("About and credits") + SettingsEntry(title = "Credits", description = "Credits") { } + SettingsEntry(title = "About", description = "About") { } + } + } +} + +@Composable +fun SettingsEntry( + title: String, + description: String, + onClick: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .clickable { onClick() } + .padding(16.dp) + ) { + Text(text = title) + Text( + text = description, + fontSize = 12.sp, + color = MaterialTheme.colorScheme.outline + ) + } +} + +@Composable +fun SettingsSection( + title: String +) { + Box ( + modifier = Modifier + .padding(start = 16.dp) + ) { + Text( + text = title, + fontSize = 12.sp, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.primary + ) + } +} \ 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 30e100b..66b9baf 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 @@ -4,6 +4,7 @@ import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.scrollable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -12,7 +13,10 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button import androidx.compose.material3.Card +import androidx.compose.material3.CardElevation import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -23,12 +27,16 @@ import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +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.res.painterResource import androidx.compose.ui.text.style.TextAlign 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.components.TopBanner import com.github.nacabaro.vbhelper.di.VBHelper @@ -45,6 +53,7 @@ fun StorageScreen() { val storageRepository = StorageRepository(application.container.db) val monList = remember { mutableStateListOf() } + var selectedCharacter by remember { mutableStateOf(null) } LaunchedEffect(storageRepository) { coroutineScope.launch { @@ -60,11 +69,19 @@ fun StorageScreen() { topBar = { TopBanner(text = "My Digimon") } ) { contentPadding -> if (monList.isEmpty()) { - Text( - text = "Nothing to see here", + Column ( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, modifier = Modifier - .padding(8.dp) - ) + .padding(contentPadding) + .fillMaxSize() + ) { + Text( + text = "Nothing to see here", + textAlign = TextAlign.Center, + modifier = Modifier + ) + } } LazyVerticalGrid( @@ -74,12 +91,22 @@ fun StorageScreen() { .padding(top = contentPadding.calculateTopPadding()) ) { items(monList) { index -> + var showDialog by rememberSaveable { mutableStateOf(false) } + StorageEntry( name = index.dimId.toString() + " - " + index.charIndex.toString(), icon = R.drawable.ic_launcher_foreground, + onClick = { selectedCharacter = index.id }, modifier = Modifier .padding(8.dp) ) + + if (selectedCharacter != null) { + StorageDialog( + characterId = selectedCharacter!!, + onDismissRequest = { selectedCharacter = null } + ) + } } } } @@ -89,14 +116,16 @@ fun StorageScreen() { fun StorageEntry( name: String, icon: Int, + onClick: () -> Unit = {}, modifier: Modifier = Modifier ) { - Card ( + Card( shape = MaterialTheme.shapes.medium, + onClick = onClick, modifier = modifier .padding(8.dp) ) { - Column ( + Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .fillMaxSize() @@ -116,4 +145,52 @@ fun StorageEntry( ) } } +} + +@Composable +fun StorageDialog( + characterId: Long, + onDismissRequest: () -> Unit +) { + val coroutineScope = rememberCoroutineScope() + val application = LocalContext.current.applicationContext as VBHelper + val storageRepository = StorageRepository(application.container.db) + val character = remember { mutableStateOf(null) } + + LaunchedEffect(storageRepository) { + coroutineScope.launch { + character.value = storageRepository.getSingleCharacter(characterId) + } + } + + Dialog( + onDismissRequest = onDismissRequest, + properties = DialogProperties( + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { + Card( + shape = RoundedCornerShape(16.dp) + ) { + Column ( + modifier = Modifier + .padding(16.dp) + ) { + if (character.value != null) { + Text( + text = character.value?.toString() ?: "Loading...", + textAlign = TextAlign.Center, + modifier = Modifier + .padding(8.dp) + ) + } + Button( + onClick = onDismissRequest + ) { + Text(text = "Close") + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt index bf3e035..af37adc 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt @@ -9,4 +9,8 @@ class StorageRepository ( suspend fun getAllCharacters(): List { return db.temporaryMonsterDao().getAllCharacters() } + + suspend fun getSingleCharacter(id: Long): TemporaryCharacterData { + return db.temporaryMonsterDao().getCharacter(id) + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt index f77eb05..18b3d29 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/temporary_daos/TemporaryMonsterDao.kt @@ -24,4 +24,7 @@ interface TemporaryMonsterDao { @Query("SELECT * FROM TemporaryCharacterData") suspend fun getAllCharacters(): List + + @Query("SELECT * FROM TemporaryCharacterData WHERE id = :id") + suspend fun getCharacter(id: Long): TemporaryCharacterData } \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_arrow_back_24.xml b/app/src/main/res/drawable/baseline_arrow_back_24.xml new file mode 100644 index 0000000..075e95d --- /dev/null +++ b/app/src/main/res/drawable/baseline_arrow_back_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_settings_24.xml b/app/src/main/res/drawable/baseline_settings_24.xml new file mode 100644 index 0000000..6593f3a --- /dev/null +++ b/app/src/main/res/drawable/baseline_settings_24.xml @@ -0,0 +1,5 @@ + + + + +