From 467de1e927d9d2e342f446a65efde27f2dc0c52d Mon Sep 17 00:00:00 2001 From: Isaac Serrano Date: Thu, 11 Jun 2026 21:52:35 -0700 Subject: [PATCH 1/2] hotfix: numpad layout to use weights and dynamic screen height Signed-off-by: Isaac Serrano --- .../presentation/ui/history/TransactionEditScreen.kt | 9 +++++++-- .../presentation/ui/theme/component/numpad/Numpad.kt | 11 +++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/TransactionEditScreen.kt b/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/TransactionEditScreen.kt index 48f2f75..be4108a 100644 --- a/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/TransactionEditScreen.kt +++ b/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/TransactionEditScreen.kt @@ -58,6 +58,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.role @@ -140,6 +141,10 @@ fun TransactionEditScreen( var isCalculation by remember { mutableStateOf(false) } + // Calculate dynamic target height for numpad to take 48% of screen height + val configuration = LocalConfiguration.current + val screenHeight = configuration.screenHeightDp.dp + val targetNumpadHeight = screenHeight * 0.48f val baseTextStyle = MaterialTheme.typography.displayLargeCondensed.copy( fontWeight = FontWeight.W500 @@ -330,7 +335,7 @@ fun TransactionEditScreen( Numpad( modifier = Modifier .fillMaxWidth() - .weight(2f), + .height(targetNumpadHeight), editorState = editorState, onNumberInput = { digit -> editedAmount = if (editedAmount == "0") { @@ -886,4 +891,4 @@ private fun evaluateCalculation(input: String): String? { } catch (e: Exception) { null } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/serranoie/app/minus/presentation/ui/theme/component/numpad/Numpad.kt b/app/src/main/java/com/serranoie/app/minus/presentation/ui/theme/component/numpad/Numpad.kt index d58fb0c..482a32a 100644 --- a/app/src/main/java/com/serranoie/app/minus/presentation/ui/theme/component/numpad/Numpad.kt +++ b/app/src/main/java/com/serranoie/app/minus/presentation/ui/theme/component/numpad/Numpad.kt @@ -9,7 +9,6 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith -import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.foundation.gestures.detectVerticalDragGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -36,6 +35,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalHapticFeedback @@ -94,7 +94,7 @@ fun Numpad( onApplyPressedForTutorial: (() -> Unit)? = null, onDragProgressChanged: (Float) -> Unit = {}, dragProgress: Float = 0f, - rowHeight: Dp = 55.dp, + rowHeight: Dp = 55.dp, // Still kept for backward compatibility but internal logic now uses weights ) { val view = LocalView.current val haptic = LocalHapticFeedback.current @@ -186,14 +186,14 @@ fun Numpad( Box( Modifier .fillMaxWidth() - .height(rowHeight * effectiveDragProgress) + .weight(effectiveDragProgress.coerceAtLeast(0.01f)) // Ensure weight > 0 to prevent crash .clipToBounds(), contentAlignment = androidx.compose.ui.Alignment.BottomCenter ) { Row( Modifier .fillMaxWidth() - .height(rowHeight) + .fillMaxHeight() .graphicsLayer(alpha = effectiveDragProgress) ) { val operators = listOf('÷', '×', '+', '-') @@ -216,7 +216,7 @@ fun Numpad( Row( Modifier .fillMaxWidth() - .height(rowHeight * 4) + .weight(4f) // Use weight instead of fixed height ) { Column( modifier = Modifier @@ -279,7 +279,6 @@ fun Numpad( text = i.toString(), onClick = { onNumberInput(i) - onNumberPressedForTutorial?.invoke() debugProgress = 0 haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) }) From 1cb5112a66f46f3cf9f1aec4e837687af57df395 Mon Sep 17 00:00:00 2001 From: Isaac Serrano Date: Thu, 11 Jun 2026 21:52:35 -0700 Subject: [PATCH 2/2] hotfix: numpad layout to use weights and dynamic screen height Signed-off-by: Isaac Serrano --- .../minus/presentation/ui/history/History.kt | 29 +- app/src/main/res/values-es/strings.xml | 11 +- app/src/main/res/values-fr/strings.xml | 494 +++++++++--------- app/src/main/res/values/strings.xml | 1 + 4 files changed, 285 insertions(+), 250 deletions(-) diff --git a/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/History.kt b/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/History.kt index 5055e7c..38fc663 100644 --- a/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/History.kt +++ b/app/src/main/java/com/serranoie/app/minus/presentation/ui/history/History.kt @@ -4,9 +4,9 @@ import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api @@ -20,11 +20,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalView import androidx.compose.ui.unit.dp import androidx.datastore.preferences.core.emptyPreferences import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.serranoie.app.minus.R import com.serranoie.app.minus.domain.model.Transaction import com.serranoie.app.minus.presentation.RECURRENT_PAYMENTS_VIEW_MODE_KEY import com.serranoie.app.minus.presentation.settingsDataStore @@ -59,6 +61,7 @@ fun History( onShowInfoSnackbar: (message: String) -> Unit = {}, ) { val context = LocalContext.current + val resources = LocalResources.current val view = LocalView.current val uiState by viewModel.uiState.collectAsStateWithLifecycle() val preferences by context.settingsDataStore.data.collectAsStateWithLifecycle(initialValue = emptyPreferences()) @@ -67,9 +70,10 @@ fun History( } val scrollState = rememberLazyListState() - val isAtEndOfList = remember(scrollState.canScrollForward, scrollState.layoutInfo.visibleItemsInfo) { - !scrollState.canScrollForward && scrollState.layoutInfo.visibleItemsInfo.lastOrNull() != null - } + val isAtEndOfList = + remember(scrollState.canScrollForward, scrollState.layoutInfo.visibleItemsInfo) { + !scrollState.canScrollForward && scrollState.layoutInfo.visibleItemsInfo.lastOrNull() != null + } LaunchedEffect(isAtEndOfList) { viewModel.processIntent(BudgetSystemIntent.SetLockSwipeable(!isAtEndOfList)) @@ -176,10 +180,16 @@ fun History( fun queueDeleteWithUndo(transaction: Transaction) { pendingRemovedTransactions = pendingRemovedTransactions + (transaction.id to transaction) - onQueueDeleteWithUndo(transaction, "${transaction.comment.ifEmpty { "Gasto" }} eliminado", { + onQueueDeleteWithUndo( + transaction, + resources.getString( + R.string.expense_deleted_format, + transaction.comment.ifEmpty { resources.getString(R.string.generic_expense) }, + ), + ) { pendingRemovedTransactions = pendingRemovedTransactions - transaction.id onCancelPendingDelete() - }) + } } fun toggleExpandedDate(date: LocalDate) { @@ -194,7 +204,12 @@ fun History( viewModel.processIntent( BudgetTransactionIntent.EditTransactionTapped(updatedTransaction) ) - onShowInfoSnackbar("${updatedTransaction.comment.ifEmpty { "Gasto" }} ha sido modificado") + onShowInfoSnackbar( + resources.getString( + R.string.expense_modified_format, + updatedTransaction.comment.ifEmpty { resources.getString(R.string.generic_expense) }, + ), + ) onSaved() } diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 63288c1..dc87054 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -85,7 +85,8 @@ Nuevo período de ahorro %1$s eliminado - Gastos + %1$s ha sido modificado + Gasto Gasto sin nombre Gasto recurrente — %1$s Ocultar suscripciones fuera del período @@ -108,8 +109,8 @@ - %d día - %d días + %d día left + %d días left Presupuesto total @@ -325,7 +326,7 @@ Sobrante del presupuesto - Puedes elegir como distribuir el balance del presupuesto al final de cada día.\n\nPor ejemplo, tienes un presupuesto de 500 al día, y ayer gastaste 400: puedes repartir 100 en los días que queda, o gastar 600 (presupuesto por día + sobrante del periodo anterior) hoy. + Puedes elegir como distribuir el balance del presupuesto al final de cada día.\n\nFor ejemplo, tienes un presupuesto de 500 al día, y ayer gastaste 400: puedes repartir 100 en los días que queda, o gastar 600 (presupuesto por día + sobrante del periodo anterior) hoy. Preguntarme siempre Al final del período te preguntaremos qué hacer con el sobrante Repartir entre todos los días @@ -338,4 +339,4 @@ Horizontal Mostrar los pagos recurrentes como tarjetas horizontales Vertical - + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 399fe8d..9cef1e1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,200 +1,201 @@ Minus - Today - Yesterday - Tomorrow - Apply - Accept - Cancel + Aujourd\'hui + Hier + Demain + Appliquer + Accepter + Annuler OK - Save - Delete - Edit - Close - Done - Add - Remove - Back - Next - Period - Previous values + Enregistrer + Supprimer + Modifier + Fermer + Terminé + Ajouter + Retirer + Retour + Suivant + Période + Valeurs précédentes Budget - Recurrent Expense - Let\'s define the recurrent expense - How often do you want to pay this expense? - Weekly - Biweekly - Monthly - Previous day - Next day - Day %1$d of each month - Limit date + Dépense récurrente + Définissons la dépense récurrente + À quelle fréquence souhaitez-vous payer cette dépense ? + Hebdomadaire + Toutes les deux semaines + Mensuel + Jour précédent + Jour suivant + Le %1$d de chaque mois + Date limite Date - Change date - It will be charged every week until %1$s. - It will be charged every two weeks until %1$s. - It will be charged every month on day %1$d until %2$s. - Credit card cutoff date - To track credit expenses, set the billing cutoff day (1-31). - Cutoff day + Modifier la date + Il sera prélevé chaque semaine jusqu\'au %1$s. + Il sera prélevé toutes les deux semaines jusqu\'au %1$s. + Il sera prélevé chaque mois le %1$d jusqu\'au %2$s. + Date de clôture de la carte de crédit + Pour suivre les dépenses à crédit, définissez le jour de clôture de facturation (1-31). + Jour de clôture - Period finished - Remaining budget - What do you want to do with the remaining money? - Split equally - Add %1$s to the budget for the next few days - Carry to tomorrow - Add %1$s to tomorrow\'s budget - View analytics - Review the summary of the finished period + Période terminée + Budget restant + Que voulez-vous faire de l\'argent restant ? + Répartir équitablement + Ajouter %1$s au budget pour les prochains jours + Reporter à demain + Ajouter %1$s au budget de demain + Voir les analyses + Consulter le résumé de la période terminée - Edit recurrent expense - Edit expense - Cancel edit - Configure recurrence - Make recurrent - Select time - Billing day - End date - Frequency - Weekly (every 7 days) - Biweekly (every 14 days) - - Edit Budget - New budget period + Modifier la dépense récurrente + Modifier la dépense + Annuler la modification + Configurer la récurrence + Rendre récurrent + Choisir l\'heure + Jour de facturation + Date de fin + Fréquence + Hebdomadaire (tous les 7 jours) + Bihebdomadaire (tous les 14 jours) + + Modifier le budget + Nouvelle période budgétaire - %d expense for the next period - %d expenses for the next period + %d dépense pour la période suivante + %d dépenses pour la période suivante - New Budget Period - Quick view of your expenses and add new ones - Total Expenses - New Expense - Daily average - Expenses history - Single expense - + Add Expense - Finalize period? - Finalize budget period early - This will close the current period and start a new one. Are you sure? - Finalize - No ending date - How do you want to split the budget? - New Budget Period + Nouvelle période budgétaire + Aperçu rapide de vos dépenses et ajout de nouvelles + Total des dépenses + Nouvelle dépense + Moyenne quotidienne + Historique des dépenses + Dépense unique + + Ajouter une dépense + Finaliser la période ? + Finaliser la période budgétaire plus tôt + Cela clôturera la période actuelle et en commencera une nouvelle. Êtes-vous sûr ? + Finaliser + Pas de date de fin + Comment voulez-vous répartir le budget ? + Nouvelle période budgétaire - %1$s deleted - Expense + %1$s supprimé + %1$s a été modifié + Dépense Dépense sans nom Dépense récurrente — %1$s - Hide subscriptions outside of the period - Show subscriptions outside of the period - Hide past period expenses - Show past period expenses + Masquer les abonnements hors période + Afficher les abonnements hors période + Masquer les dépenses de la période passée + Afficher les dépenses de la période passée - Category + Catégorie - Budget must be greater than 0 - No end date defined - No days defined - Budget must be for at least one day + Le budget doit être supérieur à 0 + Aucune date de fin définie + Aucun jour défini + Le budget doit être d\'au moins un jour - Analytics + Analyses - %d day - %d days + %d jour + %d jours - %d day left - %d days left + %d jour restant + %d jours restants - Total budget - Minimum spent - Maximum spent - Average per day spent + Budget total + Dépense minimale + Dépense maximale + Moyenne dépensée par jour - Days\nremaining + Jours\nrestants - See spent and remaining budget at a glance - Countdown days remaining in budget period - Full budget overview with top category and days left - Heatmap calendar to see spending distribution - Current month heatmap calendar - Quick shortcut to add a new expense - Add new expense + Consultez le budget dépensé et restant en un coup d\'œil + Compte à rebours des jours restants dans la période budgétaire + Aperçu complet du budget avec la catégorie principale et les jours restants + Calendrier thermique pour voir la répartition des dépenses + Calendrier thermique du mois en cours + Raccourci rapide pour ajouter une nouvelle dépense + Ajouter une nouvelle dépense - Spent - Left - Remaining - Total Spent - days left - Budget Overview - - Daily - Weekly - Biweekly - Monthly - - Today\'s budget - This week - This fortnight - This month - - Total: %1$s - - Welcome to Minus! - Hi and welcome, lets start saving together. - Set a budget - Estimate how much money you need for a period and stay informed about how much you can save. - Track every expense - This app helps you calculate how much you can spend per day, week, biweekly period, or month so you stay on track and know what is left. - Spend wisely - Over time, you will learn how much you can save and how much you can spend. - Set a budget + Dépensé + Restant + Restant + Total dépensé + jours restants + Aperçu du budget + + Quotidien + Hebdomadaire + Bihebdomadaire + Mensuel + + Budget d\'aujourd\'hui + Cette semaine + Cette quinzaine + Ce mois-ci + + Total : %1$s + + Bienvenue sur Minus ! + Bonjour et bienvenue, commençons à épargner ensemble. + Définir un budget + Estimez l\'argent dont vous avez besoin pour une période et restez informé de ce que vous pouvez économiser. + Suivre chaque dépense + Cette application vous aide à calculer ce que vous pouvez dépenser par jour, semaine, quinzaine ou mois pour garder le cap. + Dépenser intelligemment + Au fil du temps, vous apprendrez combien vous pouvez économiser et combien vous pouvez dépenser. + Définir un budget - Select the period - %1$d days · %2$s - %3$s - How do you want to view your budget? + Sélectionnez la période + %1$d jours · %2$s - %3$s + Comment souhaitez-vous visualiser votre budget ? - Settings - Appearance + Paramètres + Apparence Notifications - Features - App information - Data backup - Tutorial - - Theme - Change the app theme style - Typography - Change the app typography style + Fonctionnalités + Informations sur l\'application + Sauvegarde des données + Tutoriel + + Thème + Changer le style de thème de l\'application + Typographie + Changer le style de typographie de l\'application Material You - Use wallpaper colors to apply a dynamic app theme - Credit quick toggle in editor - Tap to see details and controls - When enabled, the credit-card quick toggle appears next to the recurrent button while typing an amount in the editor. If disabled, that button is hidden to keep the quick-capture UI cleaner. - Enable credit quick toggle - - Period end time - The notification will be shown the day after the period ends - Exact alarms - Enabled to try showing notifications at the selected time - Disabled; Android may delay the notification - - About - Learn more about the app and its development - Found a bug? - Create a bug report and we will fix it soon + Utiliser les couleurs du fond d\'écran pour appliquer un thème dynamique + Utiliser la carte de crédit comme paiement + Appuyez pour voir plus de détails + Une fois activé, vous pouvez marquer les paiements effectués avec une carte de crédit. \nEn déclarant une date de facturation, vous saurez combien payer à votre banque avant de devoir payer des intérêts. + Activer l\'usage CC + + Heure de fin de période + La notification sera affichée le lendemain de la fin de la période + Alarmes exactes + Activé pour essayer d\'afficher les notifications à l\'heure sélectionnée + Désactivé ; Android peut retarder la notification + + À propos + En savoir plus sur l\'application et son développement + Un bug ? + Créez un rapport de bug et nous le corrigerons bientôt Version @@ -228,108 +229,125 @@ Captures d’écran ou vidéos (jusqu’à 10 Mo) %1$d pièce(s) jointe(s) sélectionnée(s) - Back up data - Back up data to minus_export.csv - Import CSV - Import data from a CSV file - - Reset tutorial - You will see gesture hints, info, and actions across the app again. - - App theme - Light - Always use light theme - Dark - Always use dark theme - Follow system - Use the system theme setting - - App typography - Default - Use the base typography - Condensed - Use compact typography + Sauvegarder les données + Sauvegarder les données dans minus_export.csv + Importer un CSV + Importer des données à partir d\'un fichier CSV + + Réinitialiser le tutoriel + Vous verrez à nouveau les indices de gestes, les infos et les actions dans l\'application. + + Thème de l\'application + Clair + Toujours utiliser le thème clair + Sombre + Toujours utiliser le thème sombre + Suivre le système + Utiliser le paramètre de thème du système + + Typographie de l\'application + Par défaut + Utiliser la typographie de base + Condensée + Utiliser une typographie compacte Expressive - Use expressive typography + Utiliser une typographie expressive - Expand - Collapse + Développer + Réduire - Budget exhausted - No budget - daily - weekly - biweekly - %1$s budget exhausted - %1$s and %2$s budget exhausted - %1$s, %2$s and %3$s budget exhausted + Budget épuisé + Aucun budget + quotidien + hebdomadaire + bihebdomadaire + Budget %1$s épuisé + Budgets %1$s et %2$s épuisés + Budgets %1$s, %2$s et %3$s épuisés - Spent - Available: %1$s%% + Dépensé + Disponible : %1$s%% - Uncategorized - Remaining - We can\'t split your spending by categories - Use tags to see the chart by categories + Non catégorisé + Restant + Nous ne pouvons pas répartir vos dépenses par catégories + Utilisez des étiquettes pour voir le graphique par catégories - This chart shows money spent for each day in the period + Ce graphique montre l\'argent dépensé pour chaque jour de la période - No recorded expenses - Add an expense to get started + Aucune dépense enregistrée + Ajoutez une dépense pour commencer - Upcoming recurrent payments - Recurrent Payments on this period + Paiements récurrents à venir + Paiements récurrents sur cette période - Today - Tomorrow - In %1$d days - In %1$d weeks - Unnamed recurrent expense - Delete recurrent expense - this recurrent expense - Are you sure you want to delete "%1$s"? - This action will remove the whole recurrent expense configuration and you will not receive more notifications. + Aujourd\'hui + Demain + Dans %1$d jours + Dans %1$d semaines + Dépense récurrente sans nom + Supprimer la dépense récurrente + cette dépense récurrente + Êtes-vous sûr de vouloir supprimer "%1$s" ? + Cette action supprimera toute la configuration de la dépense récurrente et vous ne recevrez plus de notifications. - Unnamed subscription - Weekly - Biweekly - Monthly + Abonnement sans nom + Hebdomadaire + Toutes les deux semaines + Mensuel - Period finished - What do you want to do with the remaining money? - Split equally - Add %1$s to the budget for the next days - Carry to tomorrow - Add %1$s to tomorrow\'s budget - View analytics - Review the summary of the finished period + Période terminée + Que voulez-vous faire de l\'argent restant ? + Répartir équitablement + Ajouter %1$s au budget pour les prochains jours + Reporter à demain + Ajouter %1$s au budget de demain + Voir les analyses + Consulter le résumé de la période terminée - Period finished - Huh? You didn\'t spend anything this period - Watch out! You went over budget in this period - Here are the stats for all your spending + Période terminée + Euh ? Vous n\'avez rien dépensé cette période + Attention ! Vous avez dépassé votre budget cette période + Voici les statistiques de toutes vos dépenses - Savings recommendation - The classic 50/30/20 method divides your budget into 50% needs, 30% wants, and 20% savings, helping you control spending and save consistently. - Current savings - Available: %1$s - Ideal savings: %1$s - Current savings: %1$s - Recurring expenses - One-time expenses - If you save the 20% each period for about 6 months, you could build: + Recommandation d\'épargne + La méthode classique 50/30/20 divise votre budget en 50 % de besoins, 30 % d\'envies et 20 % d\'épargne, vous aidant ainsi à contrôler vos dépenses et à épargner régulièrement. + Épargne actuelle + Disponible : %1$s + Épargne idéale : %1$s + Épargne actuelle : %1$s + Dépenses récurrentes + Dépenses ponctuelles + Si vous épargnez les 20 % à chaque période pendant environ 6 mois, vous pourriez constituer : - Show all expenses from the previous period… + Afficher toutes les dépenses de la période précédente… + + + Utiliser %d jours + Restant + Devise + Sélectionner la devise + Sélectionné + + + Surplus budgétaire + Vous pouvez choisir comment répartir votre solde budgétaire à la fin de chaque journée.\n\nPar exemple, vous avez un budget de 500 par jour et vous avez dépensé 400 hier : vous pouvez répartir les 100 sur les jours restants, ou dépenser 600 aujourd\'hui (budget quotidien + surplus de la période précédente). + Toujours me demander + À la fin de la période, nous vous demanderons quoi faire du surplus + Répartir sur tous les jours + Le surplus est divisé équitablement entre tous les jours de la nouvelle période + Ajouter au premier jour + Tout le surplus est ajouté au premier jour de la nouvelle période \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47d0ece..a147a11 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ %1$s deleted + %1$s has been modified Expense Unnamed expense Recurrent expense — %1$s