From 7e3a5a98313e6d979d9b0da9ca746e4c319b6c78 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Sat, 5 Aug 2023 09:29:59 +0000 Subject: [PATCH] LoyaltyCardEditActivity: fix wrong balance parse after locale changes (#1454) --- .../card_locker/LoyaltyCardEditActivity.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 3c43dd7bf..0d47da74d 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -174,6 +174,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements String tempStoredOldBarcodeValue = null; boolean initDone = false; boolean onResuming = false; + boolean onRestoring = false; AlertDialog confirmExitDialog = null; boolean validBalance = true; @@ -300,6 +301,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements @Override public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { + onRestoring = true; tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD); super.onRestoreInstanceState(savedInstanceState); tabs = binding.tabs; @@ -395,7 +397,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements }); balanceField.setOnFocusChangeListener((v, hasFocus) -> { - if (!hasFocus) { + if (!hasFocus && !onResuming && !onRestoring) { balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(tempLoyaltyCard.balance, tempLoyaltyCard.balanceType)); } }); @@ -403,6 +405,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements balanceField.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + if (onResuming || onRestoring) return; try { BigDecimal balance = Utils.parseBalance(s.toString(), tempLoyaltyCard.balanceType); updateTempState(LoyaltyCardField.balance, balance); @@ -427,7 +430,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements updateTempState(LoyaltyCardField.balanceType, currency); - if (tempLoyaltyCard.balance != null) { + if (tempLoyaltyCard.balance != null && !onResuming && !onRestoring) { balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(tempLoyaltyCard.balance, currency)); } } @@ -828,11 +831,19 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements noteFieldEdit.setText(tempLoyaltyCard.note); formatDateField(this, validFromField, tempLoyaltyCard.validFrom); formatDateField(this, expiryField, tempLoyaltyCard.expiry); - formatBalanceCurrencyField(tempLoyaltyCard.balanceType); cardIdFieldView.setText(tempLoyaltyCard.cardId); barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId)); barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.prettyName() : getString(R.string.noBarcode)); + // We set the balance here (with onResuming/onRestoring == true) to prevent formatBalanceCurrencyField() from setting it (via onTextChanged), + // which can cause issues when switching locale because it parses the balance and e.g. the decimal separator may have changed. + formatBalanceCurrencyField(tempLoyaltyCard.balanceType); + BigDecimal balance = tempLoyaltyCard.balance == null ? new BigDecimal("0") : tempLoyaltyCard.balance; + tempLoyaltyCard = updateTempState(tempLoyaltyCard, LoyaltyCardField.balance, balance); + balanceField.setText(Utils.formatBalanceWithoutCurrencySymbol(tempLoyaltyCard.balance, tempLoyaltyCard.balanceType)); + validBalance = true; + Log.d(TAG, "Setting balance to " + balance); + if (groupsChips.getChildCount() == 0) { List existingGroups = DBHelper.getGroups(mDatabase); @@ -935,6 +946,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } onResuming = false; + onRestoring = false; // Fake click on the edit icon to cause the set icon option to pop up if the icon was // long-pressed in the view activity