Still can't get the stupid splash screen to fit the logo...

This commit is contained in:
2026-08-22 19:31:51 +09:00
parent 8d7d7b5f84
commit 982d176504
9 changed files with 295 additions and 222 deletions
@@ -9,6 +9,7 @@ import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -35,7 +36,7 @@ import swiss.qpq.gajumobile.ui.screens.EnvironmentInfoScreen
import swiss.qpq.gajumobile.ui.screens.ExplorerScreen
import swiss.qpq.gajumobile.ui.screens.LockScreen
import swiss.qpq.gajumobile.ui.screens.ManageAccountScreen
import swiss.qpq.gajumobile.ui.screens.ManageWalletScreen
import swiss.qpq.gajumobile.ui.screens.ManageWalletsScreen
import swiss.qpq.gajumobile.ui.screens.MnemonicRecoveryScreen
import swiss.qpq.gajumobile.ui.screens.MnemonicVerifyScreen
import swiss.qpq.gajumobile.ui.screens.QRReceiveScreen
@@ -99,8 +100,8 @@ enum class Screen {
QR_SCANNER,
QR_RECEIVE,
SETTINGS,
MANAGE_WALLET,
MANAGE_ACCOUNT,
MANAGE_WALLETS,
DELETE_CONFIRM,
EXPLORER,
VIEW_MNEMONIC,
@@ -154,6 +155,9 @@ fun GajuRouter(
var verifyMnemonicAccount by remember { mutableStateOf<Account?>(null) }
var verifyMnemonicPhrase by remember { mutableStateOf<Array<ByteArray>?>(null) }
var activeWalletIndex by rememberSaveable { mutableIntStateOf(0) }
var activeAccountIndex by rememberSaveable { mutableIntStateOf(0) }
when (currentScreen) {
Screen.CREATE_WALLET -> {
CreateWalletScreen(
@@ -294,14 +298,14 @@ fun GajuRouter(
}
DashboardScreen(
wallets = wallets,
selectedWalletIndex = activeWalletIndex,
onWalletIndexChange = { activeWalletIndex = it },
selectedAccountIndex = activeAccountIndex,
onAccountIndexChange = { activeAccountIndex = it },
balanceFormat = GajuFormat.Type.valueOf(appState.balanceFormat),
balanceUnit = GajuFormat.Unit.valueOf(appState.balanceUnit),
onSend = { navigateTo(Screen.QR_SCANNER) },
onReceive = { navigateTo(Screen.QR_RECEIVE) },
onAddWallet = {
selectedWalletId = ""
navigateTo(Screen.CREATE_WALLET)
},
onAddAccount = { walletId ->
selectedWalletId = walletId
navigateTo(Screen.SETUP_CHOICE)
@@ -316,27 +320,47 @@ fun GajuRouter(
"settings" -> Screen.SETTINGS
"transactions" -> Screen.EXPLORER
"environment_info" -> Screen.ENVIRONMENT_INFO
"manage_wallets" -> Screen.MANAGE_WALLETS
else -> null
}
if (screen != null) navigateTo(screen)
},
)
}
Screen.MANAGE_WALLET -> {
val wallet = remember(selectedWalletId, appState.walletsVersion) {
walletRepo.loadWallet(selectedWalletId)
} ?: return
ManageWalletScreen(
walletName = wallet.name,
onRename = { newName ->
walletRepo.saveWallet(wallet.copy(name = newName))
appStateManager.notifyWalletsChanged()
Screen.MANAGE_WALLETS -> {
val wallets = remember(appState.walletsVersion) {
walletRepo.listWallets().mapNotNull { walletRepo.loadWallet(it) }
}
ManageWalletsScreen(
wallets = wallets,
onAddWallet = {
selectedWalletId = ""
navigateTo(Screen.CREATE_WALLET)
},
onDelete = {
deleteType = "WALLET"
deleteName = wallet.name
navigateTo(Screen.DELETE_CONFIRM)
}
onRenameWallet = { id, newName ->
val wallet = walletRepo.loadWallet(id)
wallet?.let {
walletRepo.saveWallet(it.copy(name = newName))
appStateManager.notifyWalletsChanged()
}
},
onDeleteWallet = { id ->
val wallet = walletRepo.loadWallet(id)
wallet?.let {
selectedWalletId = id
deleteType = "WALLET"
deleteName = it.name
navigateTo(Screen.DELETE_CONFIRM)
}
},
onUpdateNetwork = { id, network ->
val wallet = walletRepo.loadWallet(id)
wallet?.let {
walletRepo.saveWallet(it.copy(network = network))
appStateManager.notifyWalletsChanged()
}
},
onBack = { navigateBack() }
)
}
Screen.MANAGE_ACCOUNT -> {
@@ -399,6 +423,7 @@ fun GajuRouter(
"dashboard" -> Screen.DASHBOARD
"transactions" -> Screen.EXPLORER
"environment_info" -> Screen.ENVIRONMENT_INFO
"manage_wallets" -> Screen.MANAGE_WALLETS
else -> null
}
if (screen != null) {
@@ -417,6 +442,7 @@ fun GajuRouter(
val screen = when (dest) {
"dashboard" -> Screen.DASHBOARD
"settings" -> Screen.SETTINGS
"manage_wallets" -> Screen.MANAGE_WALLETS
else -> null
}
if (screen != null) {
@@ -7,5 +7,6 @@ data class Wallet(
val id: String,
val name: String,
val accounts: List<Account> = emptyList(),
val createdAt: Long = System.currentTimeMillis()
val createdAt: Long = System.currentTimeMillis(),
val network: String = "Mainnet"
)
@@ -129,6 +129,14 @@ fun GajuTopBar(
expanded = menuExpanded,
onDismissRequest = { menuExpanded = false }
) {
DropdownMenuItem(
text = { Text("Manage Wallets") },
onClick = {
menuExpanded = false
onNavigate("manage_wallets")
},
leadingIcon = { Icon(painterResource(R.drawable.ic_account_box), null, modifier = Modifier.size(18.dp)) }
)
DropdownMenuItem(
text = { Text("Transactions") },
onClick = {
@@ -1,5 +1,6 @@
package swiss.qpq.gajumobile.ui.screens
import android.content.ClipData
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -24,24 +25,22 @@ import androidx.compose.material3.SecondaryScrollableTabRow
import androidx.compose.material3.Surface
import androidx.compose.material3.Tab
import androidx.compose.material3.TabRowDefaults
import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.ClipEntry
import androidx.compose.ui.platform.LocalClipboard
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.launch
import swiss.qpq.gajumobile.R
import swiss.qpq.gajumobile.data.models.Wallet
import swiss.qpq.gajumaru.core.formatting.GajuFormat
@@ -51,11 +50,14 @@ import swiss.qpq.gajumobile.ui.components.GajuTopBar
@Composable
fun DashboardScreen(
wallets: List<Wallet>,
selectedWalletIndex: Int,
onWalletIndexChange: (Int) -> Unit,
selectedAccountIndex: Int,
onAccountIndexChange: (Int) -> Unit,
balanceFormat: GajuFormat.Type = GajuFormat.Type.US,
balanceUnit: GajuFormat.Unit = GajuFormat.Unit.GAJU,
onSend: () -> Unit,
onReceive: () -> Unit,
onAddWallet: () -> Unit,
onAddAccount: (String) -> Unit,
onAccountSettings: (String, String) -> Unit,
onNavigate: (String) -> Unit,
@@ -67,15 +69,20 @@ fun DashboardScreen(
return
}
val clipboardManager = LocalClipboardManager.current
val walletPagerState = rememberPagerState(pageCount = { wallets.size })
val currentWallet = wallets[walletPagerState.currentPage]
val clipboard = LocalClipboard.current
val scope = rememberCoroutineScope()
val walletPagerState = rememberPagerState(initialPage = selectedWalletIndex.coerceIn(0, wallets.size - 1)) { wallets.size }
var selectedAccountIndex by remember(walletPagerState.currentPage) { mutableIntStateOf(0) }
// Sync pager state back to router
LaunchedEffect(walletPagerState.currentPage) {
onWalletIndexChange(walletPagerState.currentPage)
}
val currentWallet = wallets[walletPagerState.currentPage]
val currentAccount = currentWallet.accounts.getOrNull(selectedAccountIndex)
Scaffold(
topBar = { GajuTopBar(onNavigate = onNavigate) }
topBar = { GajuTopBar(onNavigate = onNavigate) },
) { innerPadding ->
Column(
modifier = Modifier
@@ -91,30 +98,6 @@ fun DashboardScreen(
.padding(vertical = 8.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
) {
Text(
text = "WALLET",
style = MaterialTheme.typography.labelSmall,
color = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.width(8.dp))
IconButton(
onClick = onAddWallet,
modifier = Modifier.size(24.dp)
) {
Icon(
painter = painterResource(id = R.drawable.ic_add),
contentDescription = "Add Wallet",
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(16.dp)
)
}
}
HorizontalPager(
state = walletPagerState,
modifier = Modifier.fillMaxWidth().height(48.dp),
@@ -148,7 +131,7 @@ fun DashboardScreen(
}
}
// Account Tabs - Inset below wallet
// Account Tabs
if (currentWallet.accounts.isNotEmpty()) {
Surface(
modifier = Modifier
@@ -174,7 +157,7 @@ fun DashboardScreen(
val isSelected = selectedAccountIndex == index
Tab(
selected = isSelected,
onClick = { selectedAccountIndex = index },
onClick = { onAccountIndexChange(index) },
text = {
Text(
text = account.label,
@@ -225,7 +208,11 @@ fun DashboardScreen(
)
Spacer(modifier = Modifier.width(8.dp))
IconButton(
onClick = { clipboardManager.setText(AnnotatedString(account.gajuId)) },
onClick = {
scope.launch {
clipboard.setClipEntry(ClipEntry(ClipData.newPlainText("Account ID", account.gajuId)))
}
},
modifier = Modifier.size(24.dp)
) {
Icon(
@@ -9,13 +9,13 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
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.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
@@ -34,13 +34,16 @@ fun LockScreen(
contentAlignment = Alignment.Center,
) {
Column(
modifier = Modifier.safeDrawingPadding(),
modifier = Modifier
.safeDrawingPadding()
.padding(horizontal = 32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.gajumobile_icon_colored),
contentDescription = null,
modifier = Modifier.size(100.dp),
painter = painterResource(id = R.drawable.gajumobile_horizontal_colored),
contentDescription = "GajuMobile",
modifier = Modifier.height(64.dp),
contentScale = ContentScale.Fit
)
Spacer(modifier = Modifier.height(48.dp))
Text(
@@ -1,5 +1,6 @@
package swiss.qpq.gajumobile.ui.screens
import android.content.ClipData
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
@@ -28,16 +29,18 @@ import androidx.compose.runtime.Composable
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.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.ClipEntry
import androidx.compose.ui.platform.LocalClipboard
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.launch
import swiss.qpq.gajumobile.R
import swiss.qpq.gajumobile.data.models.Account
import swiss.qpq.gajumobile.ui.components.GajuHeader
@@ -55,11 +58,12 @@ fun ManageAccountScreen(
onViewMnemonic: () -> Unit,
onVerifyMnemonic: () -> Unit,
onRename: (String) -> Unit,
onDelete: () -> Unit
onDelete: () -> Unit,
) {
val clipboardManager = LocalClipboardManager.current
var showRenameDialog by remember { mutableStateOf(false) }
var newName by remember(account.label) { mutableStateOf(account.label) }
val clipboard = LocalClipboard.current
val scope = rememberCoroutineScope()
var showRenameDialog by remember { mutableStateOf(value = false) }
var newName by remember(account.label) { mutableStateOf(value = account.label) }
if (showRenameDialog) {
androidx.compose.ui.window.Dialog(onDismissRequest = { showRenameDialog = false }) {
@@ -191,7 +195,11 @@ fun ManageAccountScreen(
)
Spacer(modifier = Modifier.width(8.dp))
IconButton(
onClick = { clipboardManager.setText(AnnotatedString(account.gajuId)) },
onClick = {
scope.launch {
clipboard.setClipEntry(ClipEntry(ClipData.newPlainText("Account ID", account.gajuId)))
}
},
modifier = Modifier.size(24.dp)
) {
Icon(
@@ -1,146 +0,0 @@
package swiss.qpq.gajumobile.ui.screens
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
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.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import swiss.qpq.gajumobile.R
import swiss.qpq.gajumobile.ui.components.GajuHeader
import swiss.qpq.gajumobile.ui.components.GajuTextField
import swiss.qpq.gajumobile.ui.components.ManageAction
@Composable
fun ManageWalletScreen(
walletName: String,
onRename: (String) -> Unit,
onDelete: () -> Unit
) {
var showRenameDialog by remember { mutableStateOf(false) }
var newName by remember { mutableStateOf(walletName) }
if (showRenameDialog) {
androidx.compose.ui.window.Dialog(onDismissRequest = { showRenameDialog = false }) {
Surface(
shape = RoundedCornerShape(16.dp),
color = MaterialTheme.colorScheme.surface,
tonalElevation = 8.dp
) {
Column(modifier = Modifier.padding(24.dp)) {
Text("Rename Wallet", style = MaterialTheme.typography.headlineSmall)
Spacer(modifier = Modifier.height(16.dp))
GajuTextField(
value = newName,
onValueChange = { newName = it },
label = "New Name"
)
Spacer(modifier = Modifier.height(24.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
TextButton(onClick = { showRenameDialog = false }) { Text("CANCEL") }
Spacer(modifier = Modifier.width(8.dp))
TextButton(onClick = {
onRename(newName)
showRenameDialog = false
}) { Text("SAVE") }
}
}
}
}
}
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
Column(
modifier = Modifier
.fillMaxWidth()
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
ManageAction(label = "Delete this wallet", icon = R.drawable.ic_delete, isDestructive = true, onClick = onDelete)
}
},
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
.padding(innerPadding)
.padding(horizontal = 24.dp)
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally,
) {
GajuHeader()
Text(
text = "Manage Wallet",
color = MaterialTheme.colorScheme.onBackground,
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.padding(vertical = 16.dp),
)
Surface(
modifier = Modifier.fillMaxWidth(),
color = MaterialTheme.colorScheme.surfaceVariant,
shape = RoundedCornerShape(8.dp),
) {
Row(
modifier = Modifier.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Spacer(modifier = Modifier.width(32.dp))
Text(text = walletName, color = MaterialTheme.colorScheme.onSurfaceVariant, fontWeight = FontWeight.Bold)
Icon(painterResource(R.drawable.settings), null, tint = MaterialTheme.colorScheme.onSurfaceVariant)
}
}
Spacer(modifier = Modifier.height(32.dp))
Text("Accounts within this wallet", color = MaterialTheme.colorScheme.onSurfaceVariant, fontSize = 14.sp)
// Real wallets will be iterated in Overview, here we just show a placeholder or we should pass account list
Text("Select an account from the MANAGE screen to configure individual account settings.",
color = MaterialTheme.colorScheme.onSurfaceVariant,
fontSize = 12.sp,
textAlign = TextAlign.Center,
modifier = Modifier.padding(top = 16.dp)
)
Spacer(modifier = Modifier.height(48.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
ManageAction(label = "Rename this wallet", icon = R.drawable.ic_edit, onClick = { showRenameDialog = true })
}
}
}
}
@@ -0,0 +1,184 @@
package swiss.qpq.gajumobile.ui.screens
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
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.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import swiss.qpq.gajumobile.R
import swiss.qpq.gajumobile.data.models.Wallet
import swiss.qpq.gajumobile.ui.components.GajuHeader
import swiss.qpq.gajumobile.ui.components.GajuTextField
import swiss.qpq.gajumobile.ui.components.ManageAction
@Composable
fun ManageWalletsScreen(
wallets: List<Wallet>,
onAddWallet: () -> Unit,
onRenameWallet: (String, String) -> Unit,
onDeleteWallet: (String) -> Unit,
onUpdateNetwork: (String, String) -> Unit,
onBack: () -> Unit
) {
var walletToRename by remember { mutableStateOf<Wallet?>(null) }
var newName by remember { mutableStateOf("") }
if (walletToRename != null) {
androidx.compose.ui.window.Dialog(onDismissRequest = { walletToRename = null }) {
Surface(
shape = RoundedCornerShape(16.dp),
color = MaterialTheme.colorScheme.surface,
tonalElevation = 8.dp
) {
Column(modifier = Modifier.padding(24.dp)) {
Text("Rename Wallet", style = MaterialTheme.typography.headlineSmall)
Spacer(modifier = Modifier.height(16.dp))
GajuTextField(
value = newName,
onValueChange = { newName = it },
label = "New Name"
)
Spacer(modifier = Modifier.height(24.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
TextButton(onClick = { walletToRename = null }) { Text("CANCEL") }
Spacer(modifier = Modifier.width(8.dp))
TextButton(onClick = {
walletToRename?.let { onRenameWallet(it.id, newName) }
walletToRename = null
}) { Text("SAVE") }
}
}
}
}
}
Scaffold { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
.padding(innerPadding)
.padding(horizontal = 24.dp)
.verticalScroll(rememberScrollState()),
horizontalAlignment = Alignment.CenterHorizontally
) {
GajuHeader()
Text(
"Manage Wallets",
style = MaterialTheme.typography.headlineMedium,
color = MaterialTheme.colorScheme.onBackground
)
Spacer(modifier = Modifier.height(24.dp))
wallets.forEach { wallet ->
WalletManagementCard(
wallet = wallet,
onRename = {
newName = wallet.name
walletToRename = wallet
},
onDelete = { onDeleteWallet(wallet.id) },
onUpdateNetwork = { onUpdateNetwork(wallet.id, it) }
)
Spacer(modifier = Modifier.height(16.dp))
}
Spacer(modifier = Modifier.height(24.dp))
ManageAction(
label = "Add new wallet",
icon = R.drawable.ic_add,
onClick = onAddWallet
)
Spacer(modifier = Modifier.height(32.dp))
TextButton(onClick = onBack) {
Text("Done")
}
}
}
}
@Composable
private fun WalletManagementCard(
wallet: Wallet,
onRename: () -> Unit,
onDelete: () -> Unit,
onUpdateNetwork: (String) -> Unit
) {
Surface(
color = MaterialTheme.colorScheme.surfaceVariant,
shape = RoundedCornerShape(12.dp),
modifier = Modifier.fillMaxWidth()
) {
Column(modifier = Modifier.padding(16.dp)) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = wallet.name,
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold,
modifier = Modifier.clickable { onRename() }
)
IconButton(onClick = onDelete) {
Icon(
painter = painterResource(id = R.drawable.ic_delete),
contentDescription = "Delete Wallet",
tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(20.dp)
)
}
}
Spacer(modifier = Modifier.height(8.dp))
GajuTextField(
value = wallet.network,
onValueChange = onUpdateNetwork,
label = "Network",
placeholder = "e.g. Mainnet, Testnet"
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "${wallet.accounts.size} account(s)",
style = MaterialTheme.typography.labelSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f)
)
}
}
}
@@ -16,6 +16,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextAlign
@@ -40,9 +41,10 @@ fun SetupChoiceScreen(
verticalArrangement = Arrangement.Center
) {
Image(
painter = painterResource(id = R.drawable.gajumobile_icon_colored),
contentDescription = null,
modifier = Modifier.size(100.dp),
painter = painterResource(id = R.drawable.gajumobile_horizontal_colored),
contentDescription = "GajuMobile",
modifier = Modifier.height(80.dp).padding(horizontal = 16.dp),
contentScale = ContentScale.Fit
)
Spacer(modifier = Modifier.height(48.dp))