Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,9 @@ class HistoryScreenE2ETest {

composeTestRule.mainClock.advanceTimeBy(500)

val editTitle = composeTestRule.activity.getString(R.string.edit_expense_title)
composeTestRule.onNodeWithText(editTitle).assertIsDisplayed()
val exitPillLabel =
composeTestRule.activity.getString(R.string.tap_to_exit_edit_transaction)
composeTestRule.onNodeWithText(exitPillLabel).assertIsDisplayed()

composeTestRule.onAllNodesWithText("Coffee").onLast().assertIsDisplayed()
}
Expand Down Expand Up @@ -368,8 +369,9 @@ class HistoryScreenE2ETest {

composeTestRule.waitForIdle()

val editTitle = composeTestRule.activity.getString(R.string.edit_expense_title)
composeTestRule.onNodeWithText(editTitle, substring = true).assertIsDisplayed()
val exitPillLabel =
composeTestRule.activity.getString(R.string.tap_to_exit_edit_transaction)
composeTestRule.onNodeWithText(exitPillLabel, substring = true).assertIsDisplayed()
composeTestRule.onAllNodesWithText("Coffee").onLast().assertIsDisplayed()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ class TransactionEditE2ETests {
private fun prettyTime(time: LocalTime): String =
String.format("%02d:%02d", time.hour, time.minute)

private fun cancelContentDesc(): String =
composeTestRule.activity.getString(R.string.cancel_edit_content_desc)
private fun exitPillLabel(): String =
composeTestRule.activity.getString(R.string.tap_to_exit_edit_transaction)

private fun saveLabel(): String = composeTestRule.activity.getString(R.string.save)

Expand Down Expand Up @@ -168,8 +168,7 @@ class TransactionEditE2ETests {
composeTestRule.mainClock.advanceTimeBy(500)
composeTestRule.waitForIdle()

val editTitle = composeTestRule.activity.getString(R.string.edit_expense_title)
composeTestRule.onNodeWithText(editTitle).assertIsDisplayed()
composeTestRule.onNodeWithText(exitPillLabel()).assertIsDisplayed()

composeTestRule.onAllNodesWithText("Groceries").assertCountEquals(1)

Expand All @@ -195,7 +194,7 @@ class TransactionEditE2ETests {
composeTestRule.mainClock.advanceTimeBy(500)
composeTestRule.waitForIdle()

composeTestRule.onNodeWithContentDescription(cancelContentDesc()).performClick()
composeTestRule.onNodeWithText(exitPillLabel()).performClick()

composeTestRule.waitForIdle()

Expand Down Expand Up @@ -352,9 +351,7 @@ class TransactionEditE2ETests {
composeTestRule.mainClock.advanceTimeBy(500)
composeTestRule.waitForIdle()

val recurrentTitle =
composeTestRule.activity.getString(R.string.edit_recurrent_expense_title)
composeTestRule.onNodeWithText(recurrentTitle).assertIsDisplayed()
composeTestRule.onNodeWithText(exitPillLabel()).assertIsDisplayed()

tapRecurrentToggle()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,13 @@ fun HistoryScreen(
}
}

DisposableEffect(Unit) {
onDispose {
viewModel.processIntent(HistoryUiIntent.SetEditingTransaction(null))
viewModel.processIntent(HistoryUiIntent.SetRecurrentToEdit(null))
}
}

SharedTransitionLayout {
AnimatedVisibility(visible = true) {
History(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ internal fun TransactionDateTimeRow(
) {
Row(
modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(4.dp),
horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.End),
verticalAlignment = Alignment.CenterVertically,
) {
Surface(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.focusable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
Expand All @@ -15,6 +14,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CreditCard
import androidx.compose.material.icons.rounded.EventRepeat
Expand All @@ -23,6 +23,7 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
Expand Down Expand Up @@ -59,6 +60,7 @@ import com.serranoie.app.minus.presentation.ui.theme.component.numpad.EditStage
import com.serranoie.app.minus.presentation.ui.theme.component.numpad.EditorState
import com.serranoie.app.minus.presentation.ui.theme.component.numpad.Numpad
import com.serranoie.app.minus.presentation.util.handleHardwareNumpadKeyEvent
import com.serranoie.app.minus.presentation.util.withTone
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.math.BigDecimal
Expand All @@ -70,6 +72,8 @@ import java.util.Date
import kotlin.time.Duration.Companion.milliseconds
import com.serranoie.app.minus.presentation.ui.theme.component.numpad.Transaction as NumpadTransaction

private const val ExitPillContentTone = 10.0

@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun TransactionEditScreen(
Expand Down Expand Up @@ -235,18 +239,38 @@ fun TransactionEditScreen(
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
TransactionEditTopBar(
isRecurrent = transaction.isRecurrent,
onCancel = onCancel,
)

Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(4.dp),
) {
val badColor = MinusTheme.budgetStatus.bad
Surface(
onClick = onCancel,
shape = CircleShape,
color = badColor,
contentColor = badColor.withTone(ExitPillContentTone),
modifier = Modifier
.weight(1f)
.height(50.dp),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 14.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
Text(
text = stringResource(R.string.tap_to_exit_edit_transaction),
style = MaterialTheme.typography.labelMediumEmphasized,
maxLines = 1,
)
}
}

if (isCreditQuickToggleEnabled) {
TransactionEditToggleButton(
checked = isCredit,
Expand Down Expand Up @@ -274,33 +298,32 @@ fun TransactionEditScreen(
contentDescription = stringResource(R.string.recurrent_expense),
position = TransactionEditTogglePosition.TRAILING,
)

Spacer(modifier = Modifier.weight(1f))
} else {
Box(modifier = Modifier.weight(1f)) {
TransactionEditToggleButton(
checked = isRecurrent,
onCheckedChange = {
scope.launch {
delay(180.milliseconds)
showRecurrentBottomSheet = true
}
},
icon = Icons.Rounded.EventRepeat,
contentDescription = stringResource(R.string.recurrent_expense),
position = TransactionEditTogglePosition.STANDALONE,
)
}
TransactionEditToggleButton(
checked = isRecurrent,
onCheckedChange = {
scope.launch {
delay(180.milliseconds)
showRecurrentBottomSheet = true
}
},
icon = Icons.Rounded.EventRepeat,
contentDescription = stringResource(R.string.recurrent_expense),
position = TransactionEditTogglePosition.STANDALONE,
)
}

TransactionDateTimeRow(
date = editedDate,
time = editedTime,
onDateClick = { showDatePicker = true },
onTimeClick = { showTimePicker = true },
)
}

TransactionDateTimeRow(
date = editedDate,
time = editedTime,
onDateClick = { showDatePicker = true },
onTimeClick = { showTimePicker = true },
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)

EditAmountDisplay(
rawAmount = editedAmount,
currencyCode = currencyCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CreditCard
Expand Down Expand Up @@ -36,7 +35,7 @@ import androidx.compose.ui.unit.dp
import com.serranoie.app.minus.presentation.ui.theme.MinusTheme

/** Fixed size so the [ToggleButtonDefaults.checkedShape] override renders as an exact circle. */
private val ToggleButtonSize = 40.dp
private val ToggleButtonSize = 50.dp

private val ToggleButtonOuterCorner = ToggleButtonSize / 2

Expand Down Expand Up @@ -67,7 +66,7 @@ private fun restShapeFor(position: TransactionEditTogglePosition): RoundedCorner
)
}

@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
internal fun TransactionEditToggleButton(
checked: Boolean,
Expand Down Expand Up @@ -98,15 +97,15 @@ internal fun TransactionEditToggleButton(
shapes = ToggleButtonShapes(
shape = restShape,
pressedShape = restShape,
checkedShape = CircleShape,
checkedShape = RoundedCornerShape(ToggleButtonOuterCorner),
),
colors = ToggleButtonDefaults.toggleButtonColors(
containerColor = MaterialTheme.colorScheme.tertiaryContainer.copy(alpha = 0.65f),
checkedContainerColor = MaterialTheme.colorScheme.tertiary,
contentColor = MaterialTheme.colorScheme.tertiary,
checkedContentColor = MaterialTheme.colorScheme.onTertiary,
),
contentPadding = PaddingValues(0.dp),
contentPadding = PaddingValues(4.dp),
modifier = modifier
.size(ToggleButtonSize)
.semantics { role = Role.RadioButton },
Expand Down

This file was deleted.

1 change: 1 addition & 0 deletions app/src/main/res/values-bg/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="edit_recurrent_expense_title">Редактиране на повтарящ се разход</string>
<string name="edit_expense_title">Редактиране на разход</string>
<string name="cancel_edit_content_desc">Отказ от редакция</string>
<string name="tap_to_exit_edit_transaction">Докоснете за изход</string>
<string name="configure_recurrence">Настройка на повторението</string>
<string name="make_recurrent">Направи повтарящ се</string>
<string name="select_time">Избери час</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="edit_recurrent_expense_title">Wiederkehrende Ausgaben bearbeiten</string>
<string name="edit_expense_title">Ausgabe bearbeiten</string>
<string name="cancel_edit_content_desc">Bearbeitung abbrechen</string>
<string name="tap_to_exit_edit_transaction">Zum Beenden tippen</string>
<string name="configure_recurrence">Wiederholung konfigurieren</string>
<string name="make_recurrent">Wiederholend</string>
<string name="select_time">Zeit auswählen</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-el/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="edit_recurrent_expense_title">Επεξεργασία επαναλαμβανόμενων εξόδων</string>
<string name="edit_expense_title">Επεξεργασία εξόδων</string>
<string name="cancel_edit_content_desc">Ακύρωση επεξεργασίας</string>
<string name="tap_to_exit_edit_transaction">Πατήστε για έξοδο</string>
<string name="configure_recurrence">Ρύθμιση επανάληψης</string>
<string name="make_recurrent">Κάντε επαναλαμβανόμενο</string>
<string name="select_time">Επιλογή ώρας</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-es-rMX/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="edit_recurrent_expense_title">Editar gasto recurrente</string>
<string name="edit_expense_title">Editar gasto</string>
<string name="cancel_edit_content_desc">Cancelar edición</string>
<string name="tap_to_exit_edit_transaction">Toca para salir</string>
<string name="configure_recurrence">Configurar recurrencia</string>
<string name="make_recurrent">Hacer Recurrente</string>
<string name="select_time">Seleccionar hora</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="edit_recurrent_expense_title">Editar gasto recurrente</string>
<string name="edit_expense_title">Editar gasto</string>
<string name="cancel_edit_content_desc">Cancelar edición</string>
<string name="tap_to_exit_edit_transaction">Toca para salir</string>
<string name="configure_recurrence">Configurar recurrencia</string>
<string name="make_recurrent">Hacer Recurrente</string>
<string name="select_time">Seleccionar hora</string>
Expand Down
Loading
Loading