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

View File

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

View File

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

View File

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

View File

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