LoyaltyCardEditActivity: fix wrong balance parse after locale changes (#1454)

This commit is contained in:
FC Stegerman
2023-08-05 09:29:59 +00:00
committed by GitHub
parent 1b2f939c5a
commit 7e3a5a9831

View File

@@ -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<Group> 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