From 5c74336c10aa62dc7b244b333f9a11a93c4cbc09 Mon Sep 17 00:00:00 2001 From: soraefir Date: Sat, 27 Jun 2026 12:18:33 +0200 Subject: [PATCH] Fixes for currency, logo, render and more --- .../android/bill_edit/EditBillActivity.kt | 5 +- .../android/bill_edit/EditBillScreen.kt | 34 +--- .../android/bill_edit/EditBillViewModel.kt | 8 +- .../helcel/cowspent/android/drawer/Drawer.kt | 11 +- .../cowspent/android/helper/AlertDialog.kt | 174 +++++++++--------- .../cowspent/android/helper/UserAvatar.kt | 21 +++ .../android/main/BillsListComponents.kt | 11 +- .../project/member/MemberManagementDialog.kt | 11 +- .../statistics/ProjectSankeyDiagram.kt | 6 +- .../res/drawable/ic_launcher_foreground.xml | 1 - .../res/drawable/ic_launcher_monochrome.xml | 31 ++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- 13 files changed, 178 insertions(+), 139 deletions(-) create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml diff --git a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt index 611dd12..a088640 100644 --- a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt @@ -209,6 +209,7 @@ class EditBillActivity : AppCompatActivity() { calendar.timeInMillis = austrianBill.date.time viewModel.timestamp = calendar.timeInMillis / 1000 viewModel.amount = austrianBill.amount.toString() + viewModel.updateSplits() return@registerForActivityResult } catch (_: ParseException) { } @@ -220,6 +221,7 @@ class EditBillActivity : AppCompatActivity() { viewModel.timestamp = calendar.timeInMillis / 1000 } viewModel.amount = croatianBill.amount.toString() + viewModel.updateSplits() return@registerForActivityResult } catch (_: ParseException) { } @@ -235,7 +237,8 @@ class EditBillActivity : AppCompatActivity() { viewModel.repeat, bill.paymentMode, viewModel.categoryRemoteId, viewModel.getFinalComment(), viewModel.paymentModeRemoteId ) - viewModel.timestamp = bill.timestamp + calendar.timeInMillis = System.currentTimeMillis() + viewModel.timestamp = calendar.timeInMillis / 1000 viewModel.isNewBill = true showToast(this, "Duplicating bill...") diff --git a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillScreen.kt b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillScreen.kt index 212e41f..bccaa90 100644 --- a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillScreen.kt +++ b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillScreen.kt @@ -207,9 +207,7 @@ fun BillBasicInfoSection( items = options, onItemSelected = { index -> if (index == 0) { - viewModel.selectedCurrencyName = "" - viewModel.selectedCurrencyRate = 1.0 - viewModel.updateSplits() + viewModel.resetCurrency() } else { viewModel.convertCurrency(viewModel.currencies[index - 1]) } @@ -217,7 +215,7 @@ fun BillBasicInfoSection( ) } ) { - Icon(Icons.Default.SwapHoriz, contentDescription = null) + Icon(Icons.Default.SwapHoriz, contentDescription = "Change Currency") } }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number) @@ -238,7 +236,7 @@ fun BillBasicInfoSection( onClick = onDateClick, modifier = Modifier.weight(1f), enabled = canEdit, - leadingIcon = { Icon(Icons.Default.Event, contentDescription = null) } + leadingIcon = { Icon(Icons.Default.Event, contentDescription = "Select Date") } ) Spacer(modifier = Modifier.width(8.dp)) ClickableOutlinedTextField( @@ -246,7 +244,7 @@ fun BillBasicInfoSection( onClick = onTimeClick, modifier = Modifier.weight(1f), enabled = canEdit, - leadingIcon = { Icon(Icons.Default.AccessTime, contentDescription = null) } + leadingIcon = { Icon(Icons.Default.AccessTime, contentDescription = "Select Time") } ) } } @@ -269,12 +267,8 @@ fun PayerSection( leadingIcon = { Box(modifier = Modifier.padding(start = 12.dp)) { if (selectedPayer != null) { - UserAvatar( - name = selectedPayer.name, - r = selectedPayer.r, - g = selectedPayer.g, - b = selectedPayer.b, - disabled = !selectedPayer.isActivated, + MemberAvatar( + member = selectedPayer, size = 24.dp ) } else { @@ -288,12 +282,8 @@ fun PayerSection( viewModel.payerId = member.id payerExpanded = false }) { - UserAvatar( - name = member.name, - r = member.r, - g = member.g, - b = member.b, - disabled = !member.isActivated, + MemberAvatar( + member = member, size = 24.dp ) Spacer(modifier = Modifier.width(8.dp)) @@ -398,12 +388,8 @@ fun OwerSelectionSection( enabled = canEdit, onCheckedChange = { viewModel.toggleMember(member.id, it) } ) - UserAvatar( - name = member.name, - r = member.r, - g = member.g, - b = member.b, - disabled = !member.isActivated, + MemberAvatar( + member = member, size = 32.dp ) Spacer(modifier = Modifier.width(8.dp)) diff --git a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillViewModel.kt b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillViewModel.kt index 7e71cbe..defdb8c 100644 --- a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillViewModel.kt +++ b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillViewModel.kt @@ -131,8 +131,6 @@ class EditBillViewModel : ViewModel() { } fun convertCurrency(currency: DBCurrency) { - if (amountAsDouble == 0.0) return - selectedCurrencyName = currency.name ?: "" selectedCurrencyRate = currency.exchangeRate @@ -142,6 +140,12 @@ class EditBillViewModel : ViewModel() { updateSplits() } + fun resetCurrency() { + selectedCurrencyName = "" + selectedCurrencyRate = 1.0 + updateSplits() + } + fun getFinalAmount(): Double { return SupportUtil.round2(amountAsDouble / selectedCurrencyRate) } diff --git a/app/src/main/java/net/helcel/cowspent/android/drawer/Drawer.kt b/app/src/main/java/net/helcel/cowspent/android/drawer/Drawer.kt index f46b967..d2bc0c3 100644 --- a/app/src/main/java/net/helcel/cowspent/android/drawer/Drawer.kt +++ b/app/src/main/java/net/helcel/cowspent/android/drawer/Drawer.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import net.helcel.cowspent.R -import net.helcel.cowspent.android.helper.UserAvatar +import net.helcel.cowspent.android.helper.MemberAvatar import net.helcel.cowspent.android.helper.formatBalance import net.helcel.cowspent.android.helper.lazyVerticalScrollbar import net.helcel.cowspent.android.helper.TextIcon @@ -279,13 +279,8 @@ fun DrawerItem( verticalAlignment = Alignment.CenterVertically ) { if (member != null) { - UserAvatar( - name = member.name, - r = member.r, - g = member.g, - b = member.b, - avatar = member.avatar, - disabled = !member.isActivated, + MemberAvatar( + member = member, size = 24.dp, alpha = alpha ) diff --git a/app/src/main/java/net/helcel/cowspent/android/helper/AlertDialog.kt b/app/src/main/java/net/helcel/cowspent/android/helper/AlertDialog.kt index 284d1af..421a38c 100644 --- a/app/src/main/java/net/helcel/cowspent/android/helper/AlertDialog.kt +++ b/app/src/main/java/net/helcel/cowspent/android/helper/AlertDialog.kt @@ -111,49 +111,54 @@ fun AlertDialog( if (message != null) Spacer(Modifier.height(8.dp)) LazyColumn { itemsIndexed(items) { index, item -> - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - onItemSelected?.invoke(index) + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + onItemSelected?.invoke(index) + } + .padding(vertical = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + if (itemIcons != null && index < itemIcons.size) { + Icon( + itemIcons[index], + contentDescription = null, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colors.primary.copy(alpha = 0.7f) + ) + Spacer(Modifier.width(16.dp)) + } + + val text = item.toString() + if (text.contains("|")) { + val parts = text.split("|") + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = parts[0].trim(), + style = MaterialTheme.typography.body1, + fontWeight = FontWeight.Bold + ) + Text( + text = parts[1].trim(), + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f) + ) + } + } else { + Text( + text = text, + style = MaterialTheme.typography.body1 + ) } - .padding(vertical = 12.dp), - verticalAlignment = Alignment.CenterVertically - ) { - if (itemIcons != null && index < itemIcons.size) { - Icon( - itemIcons[index], - contentDescription = null, - modifier = Modifier.size(24.dp), - tint = MaterialTheme.colors.primary.copy(alpha = 0.7f) - ) - Spacer(Modifier.width(16.dp)) } - - val text = item.toString() - if (text.contains("|")) { - val parts = text.split("|") - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = parts[0].trim(), - style = MaterialTheme.typography.body1, - fontWeight = FontWeight.Bold - ) - Text( - text = parts[1].trim(), - style = MaterialTheme.typography.body2, - color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f) - ) - } - } else { - Text( - text = text, - style = MaterialTheme.typography.body1 - ) + if (index < items.size - 1) { + Divider(color = MaterialTheme.colors.onSurface.copy(alpha = 0.08f)) } } } @@ -239,49 +244,54 @@ fun AlertDialogContent( if (message != null) Spacer(Modifier.height(8.dp)) LazyColumn { itemsIndexed(items) { index, item -> - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - onItemSelected?.invoke(index) + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + onItemSelected?.invoke(index) + } + .padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + if (itemIcons != null && index < itemIcons.size) { + Icon( + itemIcons[index], + contentDescription = null, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colors.primary.copy(alpha = 0.7f) + ) + Spacer(Modifier.width(16.dp)) + } + + val text = item.toString() + if (text.contains("|")) { + val parts = text.split("|") + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = parts[0].trim(), + style = MaterialTheme.typography.body1, + fontWeight = FontWeight.Bold + ) + Text( + text = parts[1].trim(), + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f) + ) + } + } else { + Text( + text = text, + style = MaterialTheme.typography.body1 + ) } - .padding(vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - if (itemIcons != null && index < itemIcons.size) { - Icon( - itemIcons[index], - contentDescription = null, - modifier = Modifier.size(24.dp), - tint = MaterialTheme.colors.primary.copy(alpha = 0.7f) - ) - Spacer(Modifier.width(16.dp)) } - - val text = item.toString() - if (text.contains("|")) { - val parts = text.split("|") - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = parts[0].trim(), - style = MaterialTheme.typography.body1, - fontWeight = FontWeight.Bold - ) - Text( - text = parts[1].trim(), - style = MaterialTheme.typography.body2, - color = MaterialTheme.colors.onSurface.copy(alpha = 0.6f) - ) - } - } else { - Text( - text = text, - style = MaterialTheme.typography.body1 - ) + if (index < items.size - 1) { + Divider(color = MaterialTheme.colors.onSurface.copy(alpha = 0.08f)) } } } diff --git a/app/src/main/java/net/helcel/cowspent/android/helper/UserAvatar.kt b/app/src/main/java/net/helcel/cowspent/android/helper/UserAvatar.kt index 30bd1c8..3a61358 100644 --- a/app/src/main/java/net/helcel/cowspent/android/helper/UserAvatar.kt +++ b/app/src/main/java/net/helcel/cowspent/android/helper/UserAvatar.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import android.graphics.BitmapFactory import android.util.Base64 +import net.helcel.cowspent.model.DBMember @Composable fun UserAvatar( @@ -91,6 +92,26 @@ fun UserAvatar( } } +@Composable +fun MemberAvatar( + member: DBMember, + modifier: Modifier = Modifier, + size: Dp = 40.dp, + alpha: Float = 1f +) { + UserAvatar( + name = member.name, + modifier = modifier, + size = size, + r = member.r, + g = member.g, + b = member.b, + avatar = member.avatar, + disabled = !member.isActivated, + alpha = alpha + ) +} + @Preview @Composable fun UserAvatarPreview() { diff --git a/app/src/main/java/net/helcel/cowspent/android/main/BillsListComponents.kt b/app/src/main/java/net/helcel/cowspent/android/main/BillsListComponents.kt index cb855b2..8c20bc1 100644 --- a/app/src/main/java/net/helcel/cowspent/android/main/BillsListComponents.kt +++ b/app/src/main/java/net/helcel/cowspent/android/main/BillsListComponents.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import net.helcel.cowspent.R -import net.helcel.cowspent.android.helper.UserAvatar +import net.helcel.cowspent.android.helper.MemberAvatar import net.helcel.cowspent.model.DBBill import net.helcel.cowspent.model.DBMember import net.helcel.cowspent.util.SupportUtil @@ -83,13 +83,8 @@ fun BillItemRow(bill: DBBill, payer: DBMember?, onClick: () -> Unit) { ) { if (payer != null) { Box { - UserAvatar( - name = payer.name, - r = payer.r, - g = payer.g, - b = payer.b, - avatar = payer.avatar, - disabled = !payer.isActivated, + MemberAvatar( + member = payer, size = 40.dp ) if (bill.repeat != null && bill.repeat != DBBill.NON_REPEATED) { diff --git a/app/src/main/java/net/helcel/cowspent/android/project/member/MemberManagementDialog.kt b/app/src/main/java/net/helcel/cowspent/android/project/member/MemberManagementDialog.kt index d2121f3..aa476f4 100644 --- a/app/src/main/java/net/helcel/cowspent/android/project/member/MemberManagementDialog.kt +++ b/app/src/main/java/net/helcel/cowspent/android/project/member/MemberManagementDialog.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.helcel.cowspent.R -import net.helcel.cowspent.android.helper.UserAvatar +import net.helcel.cowspent.android.helper.MemberAvatar import net.helcel.cowspent.android.helper.lazyVerticalScrollbar import net.helcel.cowspent.model.DBMember @@ -84,13 +84,8 @@ fun MemberManagementDialogContent( .padding(vertical = 12.dp), verticalAlignment = Alignment.CenterVertically ) { - UserAvatar( - name = member.name, - r = member.r, - g = member.g, - b = member.b, - avatar = member.avatar, - disabled = !member.isActivated, + MemberAvatar( + member = member, size = 40.dp ) Spacer(modifier = Modifier.width(16.dp)) diff --git a/app/src/main/java/net/helcel/cowspent/android/statistics/ProjectSankeyDiagram.kt b/app/src/main/java/net/helcel/cowspent/android/statistics/ProjectSankeyDiagram.kt index 416a5cc..351234f 100644 --- a/app/src/main/java/net/helcel/cowspent/android/statistics/ProjectSankeyDiagram.kt +++ b/app/src/main/java/net/helcel/cowspent/android/statistics/ProjectSankeyDiagram.kt @@ -66,7 +66,7 @@ import androidx.core.graphics.toColorInt import kotlinx.coroutines.launch import net.helcel.cowspent.R import net.helcel.cowspent.android.helper.EditableExposedDropdownMenu -import net.helcel.cowspent.android.helper.UserAvatar +import net.helcel.cowspent.android.helper.MemberAvatar import net.helcel.cowspent.android.helper.formatShortValue import net.helcel.cowspent.model.DBBill import net.helcel.cowspent.model.DBCategory @@ -170,7 +170,7 @@ fun ProjectSankeyDiagram( leadingIcon = { Box(modifier = Modifier.padding(start = 12.dp)) { if (selectedMember != null) { - UserAvatar(name = selectedMember.name, r = selectedMember.r, g = selectedMember.g, b = selectedMember.b, disabled = !selectedMember.isActivated, size = 24.dp) + MemberAvatar(member = selectedMember, size = 24.dp) } else Icon(Icons.Default.Group, contentDescription = null) } }, @@ -182,7 +182,7 @@ fun ProjectSankeyDiagram( } allMembers.forEach { member -> DropdownMenuItem(onClick = { selectedMemberId = member.id; expanded = false }) { - UserAvatar(name = member.name, r = member.r, g = member.g, b = member.b, disabled = !member.isActivated, size = 24.dp) + MemberAvatar(member = member, size = 24.dp) Spacer(modifier = Modifier.width(12.dp)) Text(member.name) } diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 030fd29..e0c14c5 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -29,7 +29,6 @@ - diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000..2979fd6 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 50ec886..04091bd 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 50ec886..04091bd 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file