init
This commit is contained in:
@@ -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"),
|
||||||
|
|||||||
@@ -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(), {}, {})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -104,7 +104,7 @@ fun AddTripBottomSheet(
|
|||||||
|
|
||||||
var endDate by remember {
|
var endDate by remember {
|
||||||
mutableStateOf(
|
mutableStateOf(
|
||||||
tripToEdit?.startDate ?: LocalDate.now()
|
tripToEdit?.endDate ?: LocalDate.now()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user