diff --git a/CHANGELOG.md b/CHANGELOG.md index 47ac819d7..e4e4c3406 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Arabic language support - Display archived card count in group overview +- Fix balance parsing bugs (made cards not savable in Arabic and other language with non-Western numbers) - Fix custom theme not applying to main screen correctly - Improve display of selected cards - Fix crash when leaving cardview in RTL layouts for cards with expiry or balance diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 472b747d8..9782162fb 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -8,7 +8,6 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; diff --git a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java index aaa8540e2..c86c62d25 100644 --- a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java +++ b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java @@ -16,13 +16,13 @@ import android.service.controls.actions.ControlAction; import android.service.controls.templates.StatelessTemplate; import android.util.Log; -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; - import java.util.List; import java.util.concurrent.Flow; import java.util.function.Consumer; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + @RequiresApi(Build.VERSION_CODES.R) public class CardsOnPowerScreenService extends ControlsProviderService { diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index 74210fe33..0e5d461ae 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -16,6 +16,12 @@ import android.widget.EditText; import android.widget.FrameLayout; import android.widget.Toast; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.ActionBar; @@ -23,15 +29,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - import protect.card_locker.async.TaskHandler; import protect.card_locker.importexport.DataFormat; import protect.card_locker.importexport.ImportExportResult; diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 20e145861..bb8041eba 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -16,12 +16,6 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.content.ContextCompat; -import androidx.core.graphics.BlendModeColorFilterCompat; -import androidx.core.graphics.BlendModeCompat; -import androidx.recyclerview.widget.RecyclerView; - import com.google.android.material.card.MaterialCardView; import java.math.BigDecimal; @@ -30,6 +24,10 @@ import java.util.ArrayList; import java.util.Currency; import java.util.Date; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.graphics.BlendModeColorFilterCompat; +import androidx.core.graphics.BlendModeCompat; +import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index d10343326..c0e81b80f 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -9,7 +9,6 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.content.res.TypedArray; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -52,6 +51,7 @@ import java.io.IOException; import java.io.InvalidObjectException; import java.math.BigDecimal; import java.text.DateFormat; +import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -76,8 +76,6 @@ import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.exifinterface.media.ExifInterface; import androidx.fragment.app.DialogFragment; -import androidx.palette.graphics.Palette; - import protect.card_locker.async.TaskHandler; public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { @@ -402,11 +400,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { - BigDecimal balance = Utils.parseCurrency(s.toString(), Utils.currencyHasDecimals(tempLoyaltyCard.balanceType)); + BigDecimal balance = Utils.parseBalance(s.toString(), tempLoyaltyCard.balanceType); updateTempState(LoyaltyCardField.balance, balance); validBalance = true; - - } catch (NumberFormatException e) { + } catch (ParseException e) { validBalance = false; e.printStackTrace(); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java index 4ed97eb92..4ceb46994 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardLockerApplication.java @@ -3,9 +3,6 @@ package protect.card_locker; import android.app.Application; import androidx.appcompat.app.AppCompatDelegate; - -import com.google.android.material.color.DynamicColors; - import protect.card_locker.preferences.Settings; public class LoyaltyCardLockerApplication extends Application { diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 54f8f7682..f7fabce78 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -57,7 +57,6 @@ import androidx.core.graphics.ColorUtils; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.widget.NestedScrollView; import androidx.core.widget.TextViewCompat; - import protect.card_locker.async.TaskHandler; import protect.card_locker.preferences.Settings; diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 9af259fdc..73cc6db69 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -19,6 +19,14 @@ import android.view.View; import android.widget.CheckBox; import android.widget.Toast; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.tabs.TabLayout; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.ActionBar; @@ -28,15 +36,6 @@ import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; import androidx.core.splashscreen.SplashScreen; import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.tabs.TabLayout; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { diff --git a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java index 1ec9b6c2d..9e198719b 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java @@ -8,8 +8,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import androidx.recyclerview.widget.RecyclerView; - public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { private HashMap mIndexCardMap; private HashMap mInGroupOverlay; diff --git a/app/src/main/java/protect/card_locker/UCropWrapper.java b/app/src/main/java/protect/card_locker/UCropWrapper.java index 2f32d5001..af5f3c07c 100644 --- a/app/src/main/java/protect/card_locker/UCropWrapper.java +++ b/app/src/main/java/protect/card_locker/UCropWrapper.java @@ -10,15 +10,15 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; +import com.google.android.material.color.MaterialColors; +import com.google.android.material.textview.MaterialTextView; +import com.yalantis.ucrop.UCropActivity; + import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatImageView; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; -import com.google.android.material.color.MaterialColors; -import com.google.android.material.textview.MaterialTextView; -import com.yalantis.ucrop.UCropActivity; - public class UCropWrapper extends UCropActivity { public static final String UCROP_TOOLBAR_TYPEFACE_STYLE = "ucop_toolbar_typeface_style"; diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 43175783d..892cce2ed 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -16,7 +16,6 @@ import android.os.LocaleList; import android.provider.MediaStore; import android.util.Log; import android.util.TypedValue; -import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; @@ -37,6 +36,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.text.NumberFormat; +import java.text.ParseException; import java.util.Calendar; import java.util.Currency; import java.util.Date; @@ -48,7 +48,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.graphics.ColorUtils; import androidx.exifinterface.media.ExifInterface; - import androidx.palette.graphics.Palette; import protect.card_locker.preferences.Settings; @@ -239,32 +238,19 @@ public class Utils { return numberFormat.format(value); } - static public Boolean currencyHasDecimals(Currency currency) { + static public BigDecimal parseBalance(String value, Currency currency) throws ParseException { + NumberFormat numberFormat = NumberFormat.getInstance(); + if (currency == null) { - return false; + numberFormat.setMaximumFractionDigits(0); + } else { + numberFormat.setMinimumFractionDigits(currency.getDefaultFractionDigits()); + numberFormat.setMaximumFractionDigits(currency.getDefaultFractionDigits()); } - return currency.getDefaultFractionDigits() != 0; - } + Log.d(TAG, numberFormat.parse(value).toString()); - static public BigDecimal parseCurrency(String value, Boolean hasDecimals) throws NumberFormatException { - // If there are no decimals expected, remove all separators before parsing - if (!hasDecimals) { - value = value.replaceAll("[^0-9]", ""); - return new BigDecimal(value); - } - - // There are many ways users can write a currency, so we fix it up a bit - // 1. Replace all non-numbers with dots - value = value.replaceAll("[^0-9]", "."); - - // 2. Remove all but the last dot - while (value.split("\\.").length > 2) { - value = value.replaceFirst("\\.", ""); - } - - // Parse as BigDecimal - return new BigDecimal(value); + return new BigDecimal(numberFormat.parse(value).toString()); } static public byte[] bitmapToByteArray(Bitmap bitmap) { diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index 1f6e95790..36e2ec10e 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -4,7 +4,6 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.util.Log; -import java.io.IOException; import java.io.OutputStream; public class MultiFormatExporter { diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java index 362c14317..a5306dd33 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java @@ -6,13 +6,7 @@ import android.util.Log; import net.lingala.zip4j.exception.ZipException; -import org.json.JSONException; - -import java.io.IOException; import java.io.InputStream; -import java.text.ParseException; - -import protect.card_locker.FormatException; public class MultiFormatImporter { private static final String TAG = "Catima"; diff --git a/app/src/main/java/protect/card_locker/preferences/Settings.java b/app/src/main/java/protect/card_locker/preferences/Settings.java index 05c083062..dfa701a04 100644 --- a/app/src/main/java/protect/card_locker/preferences/Settings.java +++ b/app/src/main/java/protect/card_locker/preferences/Settings.java @@ -9,7 +9,6 @@ import androidx.annotation.IntegerRes; import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.PreferenceManager; - import protect.card_locker.R; import protect.card_locker.Utils; diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index d2fc17448..3d9d09529 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -6,6 +6,8 @@ import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; +import com.google.android.material.color.DynamicColors; + import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -18,9 +20,6 @@ import androidx.fragment.app.DialogFragment; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; - -import com.google.android.material.color.DynamicColors; - import nl.invissvenska.numberpickerpreference.NumberDialogPreference; import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment; import protect.card_locker.CatimaAppCompatActivity; diff --git a/app/src/main/res/raw/contributors.txt b/app/src/main/res/raw/contributors.txt index 5c94a56c8..a9d0957fd 100644 --- a/app/src/main/res/raw/contributors.txt +++ b/app/src/main/res/raw/contributors.txt @@ -58,6 +58,7 @@ Michalis Rosdyana Kusuma umoenks Thomas Bertels +Runner inesre lgasp phlostically @@ -89,6 +90,7 @@ Reza Rohan Babbar Ronak Upadhyay Rose Liverman +Samarth Asthan Simone Dotto Subhashish Anand darkodo diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 5b01feecb..b8e5a20a0 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -39,7 +39,6 @@ import java.text.ParseException; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Currency; import java.util.Date; import java.util.HashMap; diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 1b3542c27..86bb83854 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -1,13 +1,11 @@ package protect.card_locker; import android.app.Activity; -import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.view.View; -import android.widget.ImageView; import android.widget.TextView; import com.google.zxing.BarcodeFormat; @@ -26,10 +24,7 @@ import java.util.Currency; import java.util.Date; import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.ConstraintSet; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.preference.PreferenceManager; - import protect.card_locker.preferences.Settings; import static org.junit.Assert.assertEquals; diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 1c12b9317..eb0247f75 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -18,7 +18,6 @@ import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; diff --git a/app/src/test/java/protect/card_locker/UtilsTest.java b/app/src/test/java/protect/card_locker/UtilsTest.java deleted file mode 100644 index 9db9a4bcc..000000000 --- a/app/src/test/java/protect/card_locker/UtilsTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package protect.card_locker; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -import java.math.BigDecimal; -import java.util.Currency; - -import static org.junit.Assert.assertEquals; - -@RunWith(RobolectricTestRunner.class) -@Config(sdk = 23) -public class UtilsTest { - @Test - public void parseBalances() { - assertEquals("1", Utils.parseCurrency("1", false).toPlainString()); - - assertEquals("1", Utils.parseCurrency("1", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1.00", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1,00", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1 00", true).toPlainString()); - - assertEquals("25", Utils.parseCurrency("2.5", false).toPlainString()); - assertEquals("25", Utils.parseCurrency("2,5", false).toPlainString()); - assertEquals("25", Utils.parseCurrency("2 5", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2.05", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2,05", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2 05", false).toPlainString()); - - assertEquals("2.5", Utils.parseCurrency("2.5", true).toPlainString()); - assertEquals("2.5", Utils.parseCurrency("2,5", true).toPlainString()); - assertEquals("2.5", Utils.parseCurrency("2 5", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2.05", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2,05", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2 05", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2.50", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2,50", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2 50", true).toPlainString()); - - assertEquals("995", Utils.parseCurrency("9.95", false).toPlainString()); - assertEquals("995", Utils.parseCurrency("9,95", false).toPlainString()); - assertEquals("995", Utils.parseCurrency("9 95", false).toPlainString()); - - assertEquals("9.95", Utils.parseCurrency("9.95", true).toPlainString()); - assertEquals("9.95", Utils.parseCurrency("9,95", true).toPlainString()); - assertEquals("9.95", Utils.parseCurrency("9 95", true).toPlainString()); - - assertEquals("1234", Utils.parseCurrency("1234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1.234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1,234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1 234", false).toPlainString()); - - assertEquals("1234", Utils.parseCurrency("1234", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1.234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1.234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1,234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1,234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234 00", true).toPlainString()); - - } - - @Test - public void formatBalances() { - Currency euro = Currency.getInstance("EUR"); - - assertEquals("1", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), null)); - assertEquals("1.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), euro)); - - assertEquals("25", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), null)); - assertEquals("25.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), null)); - assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), null)); - assertEquals("2.05", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), null)); - assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), euro)); - - assertEquals("995", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), null)); - assertEquals("995.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), euro)); - - assertEquals("10", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), null)); - assertEquals("9.95", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), euro)); - - assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), null)); - assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), euro)); - - assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), null)); - assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), euro)); - } -} diff --git a/fastlane/metadata/android/en-US/changelogs/110.txt b/fastlane/metadata/android/en-US/changelogs/110.txt index b16fd279d..11f389ab3 100644 --- a/fastlane/metadata/android/en-US/changelogs/110.txt +++ b/fastlane/metadata/android/en-US/changelogs/110.txt @@ -1,5 +1,6 @@ - Arabic language support - Display archived card count in group overview +- Fix balance parsing bugs (made cards not savable in Arabic and other language with non-Western numbers) - Fix custom theme not applying to main screen correctly - Improve display of selected cards - Fix crash when leaving cardview in RTL layouts for cards with expiry or balance