This commit is contained in:
Rafal Wisniewski
2026-04-25 13:32:46 +02:00
parent 3847e311a5
commit 795ce9812a
6 changed files with 59 additions and 28 deletions

View File

@@ -487,7 +487,7 @@ fun NumberKeyboard(
onLongClick = onLongBackspaceClick onLongClick = onLongBackspaceClick
) )
"+", "/", "-", "*" -> KeyboardButton( "+", "÷", "-", "×" -> KeyboardButton(
text = key, text = key,
onClick = { onOperatorClick(key) }, onClick = { onOperatorClick(key) },
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
@@ -531,7 +531,7 @@ fun KeyboardButton(
) { ) {
when { when {
text != null -> Text( text != null -> Text(
text, text = text,
style = MaterialTheme.typography.headlineMedium style = MaterialTheme.typography.headlineMedium
) )
@@ -541,7 +541,7 @@ fun KeyboardButton(
} }
val keyboard = listOf( val keyboard = listOf(
listOf("+", "-", "*", "/"), listOf("+", "-", "×", "÷"),
listOf("1", "2", "3"), listOf("1", "2", "3"),
listOf("4", "5", "6"), listOf("4", "5", "6"),
listOf("7", "8", "9"), listOf("7", "8", "9"),

View File

@@ -2,6 +2,7 @@ package cc.n0th1ng.tripmoney.screens.listexpense
import android.os.Build import android.os.Build
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePicker
import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.DatePickerDialog
@@ -20,13 +21,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import cc.n0th1ng.tripmoney.R.* import cc.n0th1ng.tripmoney.R.*
import cc.n0th1ng.tripmoney.theme.TripMoneyTheme
import cc.n0th1ng.tripmoney.utils.AllPreviews
import java.time.Instant import java.time.Instant
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.LocalTime import java.time.LocalTime
import java.time.ZoneId import java.time.ZoneId
import java.util.Calendar
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@@ -38,8 +41,10 @@ fun DateRangePicker(
onConfirm: (LocalDate, LocalDate) -> Unit onConfirm: (LocalDate, LocalDate) -> Unit
) { ) {
val datePickerState = val datePickerState =
rememberDateRangePickerState(initialSelectedStartDateMillis = startDate.toEpochMilli(), rememberDateRangePickerState(
initialSelectedEndDateMillis = endDate.toEpochMilli()) initialSelectedStartDateMillis = startDate.toEpochMilli(),
initialSelectedEndDateMillis = endDate.toEpochMilli()
)
DatePickerDialog( DatePickerDialog(
onDismissRequest = onDismiss, onDismissRequest = onDismiss,
@@ -64,7 +69,8 @@ fun DateRangePicker(
TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) }
} }
) { ) {
DateRangePicker(state = datePickerState, showModeToggle = false, DateRangePicker(
state = datePickerState, showModeToggle = false,
title = {}) title = {})
} }
} }
@@ -73,27 +79,35 @@ fun DateRangePicker(
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun DatePicker( fun DatePicker(
dateTime: LocalDate = LocalDate.now(), date: LocalDate = LocalDate.now(),
onDismiss: () -> Unit, onDismiss: () -> Unit,
onConfirm: (LocalDate) -> Unit onConfirm: (LocalDate) -> Unit
) { ) {
val datePickerState = val datePickerState =
rememberDatePickerState(initialSelectedDateMillis = dateTime.toEpochMilli()) rememberDatePickerState(initialSelectedDateMillis = date.toEpochMilli())
DatePickerDialog( DatePickerDialog(
onDismissRequest = onDismiss, onDismissRequest = onDismiss,
confirmButton = { confirmButton = {
TextButton(onClick = { Row() {
val selectedMillis = datePickerState.selectedDateMillis TextButton(onClick = {
if (selectedMillis != null) { onConfirm(LocalDate.now().minusDays(1))
val selectedDate = Instant.ofEpochMilli(selectedMillis) }) {
.atZone(ZoneId.systemDefault()) Text(stringResource(string.yesterday))
.toLocalDate() }
onConfirm(selectedDate) TextButton(onClick = {
val selectedMillis = datePickerState.selectedDateMillis
if (selectedMillis != null) {
val selectedDate = Instant.ofEpochMilli(selectedMillis)
.atZone(ZoneId.systemDefault())
.toLocalDate()
onConfirm(selectedDate)
}
}) {
Text("OK")
} }
}) {
Text("OK")
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) }
@@ -103,13 +117,17 @@ fun DatePicker(
} }
} }
@RequiresApi(Build.VERSION_CODES.O)
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun TimePicker(onDismiss: () -> Unit, onConfirm: (TimePickerState) -> Unit) { fun TimePicker(
val currentTime = Calendar.getInstance() onDismiss: () -> Unit,
onConfirm: (TimePickerState) -> Unit,
time: LocalTime = LocalTime.now()
) {
val timePickerState = rememberTimePickerState( val timePickerState = rememberTimePickerState(
initialHour = currentTime.get(Calendar.HOUR_OF_DAY), initialHour = time.hour,
initialMinute = currentTime.get(Calendar.MINUTE), initialMinute = time.minute,
is24Hour = true is24Hour = true
) )
@@ -141,7 +159,9 @@ fun DateTimePicker(
var date by remember { mutableStateOf(dateTime.toLocalDate()) } var date by remember { mutableStateOf(dateTime.toLocalDate()) }
if (showDatePicker) { if (showDatePicker) {
DatePicker(onDismiss = { showDatePicker = false }, onConfirm = { newDate -> DatePicker(
date = dateTime.toLocalDate(),
onDismiss = { showDatePicker = false }, onConfirm = { newDate ->
date = newDate date = newDate
showDatePicker = false showDatePicker = false
showTimePicker = true showTimePicker = true
@@ -157,7 +177,7 @@ fun DateTimePicker(
showDatePicker = true showDatePicker = true
val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute) val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute)
onChange(LocalDateTime.of(date, newTime)) onChange(LocalDateTime.of(date, newTime))
}) }, time = dateTime.toLocalTime())
} }
} }
@@ -167,4 +187,13 @@ fun LocalDateTime.toEpochMilli(): Long =
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
fun LocalDate.toEpochMilli(): Long = fun LocalDate.toEpochMilli(): Long =
this.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() this.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant().toEpochMilli()
@RequiresApi(Build.VERSION_CODES.O)
@AllPreviews
@Composable
fun DatePickerPreview() {
TripMoneyTheme {
DatePicker(LocalDate.now(), {}, {})
}
}

View File

@@ -104,7 +104,7 @@ fun AddTripBottomSheet(
var endDate by remember { var endDate by remember {
mutableStateOf( mutableStateOf(
tripToEdit?.startDate ?: LocalDate.now() tripToEdit?.endDate ?: LocalDate.now()
) )
} }

View File

@@ -3,7 +3,8 @@ package cc.n0th1ng.tripmoney.utils
enum class Currencies { enum class Currencies {
PLN, PLN,
EUR, EUR,
USD; USD,
RON;
companion object { companion object {
fun default(): Currencies { fun default(): Currencies {

View File

@@ -39,4 +39,5 @@
<string name="budget">Budget</string> <string name="budget">Budget</string>
<string name="money_left">Money left</string> <string name="money_left">Money left</string>
<string name="add_expense_settings">Open add expense form on startup</string> <string name="add_expense_settings">Open add expense form on startup</string>
<string name="yesterday">Yesterday</string>
</resources> </resources>

View File

@@ -26,7 +26,7 @@ class BaselineProfileGenerator {
packageName = "cc.n0th1ng.tripmoney", packageName = "cc.n0th1ng.tripmoney",
includeInStartupProfile = true includeInStartupProfile = true
) { ) {
pressHome() // pressHome()
startActivityAndWait() startActivityAndWait()
device.waitForIdle() device.waitForIdle()