From 0c61abf4f06f391d138544eee77ec79b3736ac34 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Sat, 27 Sep 2025 00:07:25 +0200 Subject: [PATCH] Add barcode encoding support - Add new barcodeencoding field to database - Read barcode encoding from pkpass file - Add barcodeencoding to import/export - Add barcodeencoding to share URI - On default, use zxing's GuessEncoding function in StringUtils (this should not use UTF-8 unless needed) - Allow manually forcing ISO-8859-1 or UTF-8 --- .../card_locker/BarcodeImageWriterTask.java | 25 ++- .../card_locker/BarcodeSelectorAdapter.java | 4 +- .../java/protect/card_locker/DBHelper.java | 24 ++- .../protect/card_locker/ImportURIHelper.java | 14 ++ .../java/protect/card_locker/LoyaltyCard.java | 28 +++- .../card_locker/LoyaltyCardEditActivity.java | 47 +++++- .../card_locker/LoyaltyCardViewActivity.java | 6 + .../java/protect/card_locker/PkpassParser.kt | 6 +- .../contentprovider/CardsContentProvider.java | 1 + .../importexport/CatimaExporter.java | 2 + .../importexport/CatimaImporter.java | 12 +- .../importexport/FidmeImporter.java | 3 +- .../importexport/VoucherVaultImporter.java | 3 +- .../res/layout/loyalty_card_edit_activity.xml | 26 +++ app/src/main/res/values/strings.xml | 2 + .../protect/card_locker/DatabaseTest.java | 34 ++-- .../protect/card_locker/ImportExportTest.java | 64 ++++++-- .../protect/card_locker/ImportURITest.java | 11 +- .../LoyaltyCardCursorAdapterTest.java | 20 +-- .../LoyaltyCardViewActivityTest.java | 150 ++++++++++-------- .../protect/card_locker/MainActivityTest.java | 18 +-- .../java/protect/card_locker/PkpassTest.kt | 10 ++ .../java/protect/card_locker/TestHelpers.java | 2 +- .../CardsContentProviderTest.java | 5 +- .../res/protect/card_locker/catima_v2.csv | 45 +++--- 25 files changed, 409 insertions(+), 153 deletions(-) diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java index fa7af5761..0588bffda 100644 --- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java +++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java @@ -4,17 +4,24 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; +import android.util.ArrayMap; import android.util.Log; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.Nullable; + +import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.StringUtils; import java.lang.ref.WeakReference; +import java.nio.charset.Charset; +import java.util.Map; import protect.card_locker.async.CompatCallable; @@ -39,6 +46,7 @@ public class BarcodeImageWriterTask implements CompatCallable { private final WeakReference textViewReference; private String cardId; private final CatimaBarcode format; + private final Charset encoding; private final int imageHeight; private final int imageWidth; private final int imagePadding; @@ -48,7 +56,7 @@ public class BarcodeImageWriterTask implements CompatCallable { BarcodeImageWriterTask( Context context, ImageView imageView, String cardIdString, - CatimaBarcode barcodeFormat, TextView textView, + CatimaBarcode barcodeFormat, @Nullable Charset barcodeEncoding, TextView textView, boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding, boolean isFullscreen ) { mContext = context; @@ -62,6 +70,7 @@ public class BarcodeImageWriterTask implements CompatCallable { cardId = cardIdString; format = barcodeFormat; + encoding = barcodeEncoding; int imageViewHeight = imageView.getHeight(); int imageViewWidth = imageView.getWidth(); @@ -172,10 +181,22 @@ public class BarcodeImageWriterTask implements CompatCallable { } MultiFormatWriter writer = new MultiFormatWriter(); + + Map encodeHints = new ArrayMap<>(); + // Use charset if defined or guess otherwise + if (encoding != null) { + Log.d(TAG, "Encoding explicitly set, " + encoding.name()); + encodeHints.put(EncodeHintType.CHARACTER_SET, encoding); + } else { + String guessedEncoding = StringUtils.guessEncoding(cardId.getBytes(), new ArrayMap<>()); + Log.d(TAG, "Guessed encoding: " + guessedEncoding); + encodeHints.put(EncodeHintType.CHARACTER_SET, Charset.forName(guessedEncoding)); + } + BitMatrix bitMatrix; try { try { - bitMatrix = writer.encode(cardId, format.format(), imageWidth, imageHeight, null); + bitMatrix = writer.encode(cardId, format.format(), imageWidth, imageHeight, encodeHints); } catch (Exception e) { // Cast a wider net here and catch any exception, as there are some // cases where an encoder may fail if the data is invalid for the diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java index 1ca94e6fc..783b82ab2 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java @@ -92,13 +92,13 @@ public class BarcodeSelectorAdapter extends ArrayAdapter Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true, false); + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, null, text, true, null, true, false); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); } }); } else { Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null, true, false); + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, null, text, true, null, true, false); mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); } } diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 88ad9167b..23b59d56b 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -10,8 +10,11 @@ import android.database.sqlite.SQLiteOpenHelper; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.Nullable; + import java.io.FileNotFoundException; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Currency; @@ -23,7 +26,7 @@ import java.util.Set; public class DBHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "Catima.db"; public static final int ORIGINAL_DATABASE_VERSION = 1; - public static final int DATABASE_VERSION = 17; + public static final int DATABASE_VERSION = 18; // NB: changing these values requires a migration public static final int DEFAULT_ZOOM_LEVEL = 100; @@ -49,6 +52,7 @@ public class DBHelper extends SQLiteOpenHelper { public static final String CARD_ID = "cardid"; public static final String BARCODE_ID = "barcodeid"; public static final String BARCODE_TYPE = "barcodetype"; + public static final String BARCODE_ENCODING = "barcodeencoding"; public static final String STAR_STATUS = "starstatus"; public static final String LAST_USED = "lastused"; public static final String ZOOM_LEVEL = "zoomlevel"; @@ -112,6 +116,7 @@ public class DBHelper extends SQLiteOpenHelper { LoyaltyCardDbIds.CARD_ID + " TEXT not null," + LoyaltyCardDbIds.BARCODE_ID + " TEXT," + LoyaltyCardDbIds.BARCODE_TYPE + " TEXT," + + LoyaltyCardDbIds.BARCODE_ENCODING + " TEXT," + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'," + LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0', " + LoyaltyCardDbIds.ZOOM_LEVEL + " INTEGER DEFAULT '" + DEFAULT_ZOOM_LEVEL + "', " + @@ -335,6 +340,11 @@ public class DBHelper extends SQLiteOpenHelper { db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + " ADD COLUMN " + LoyaltyCardDbIds.ZOOM_LEVEL_WIDTH + " INTEGER DEFAULT '100' "); } + + if (oldVersion < 18 && newVersion >= 18) { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.BARCODE_ENCODING + " TEXT"); + } } public static Set imageFiles(Context context, final SQLiteDatabase database) { @@ -396,7 +406,8 @@ public class DBHelper extends SQLiteOpenHelper { public static long insertLoyaltyCard( final SQLiteDatabase database, final String store, final String note, final Date validFrom, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor, + final String barcodeId, final CatimaBarcode barcodeType, final @Nullable Charset barcodeEncoding, + final Integer headerColor, final int starStatus, final Long lastUsed, final int archiveStatus) { database.beginTransaction(); @@ -411,6 +422,7 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); + contentValues.put(LoyaltyCardDbIds.BARCODE_ENCODING, barcodeEncoding != null ? barcodeEncoding.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); @@ -430,7 +442,8 @@ public class DBHelper extends SQLiteOpenHelper { final SQLiteDatabase database, final int id, final String store, final String note, final Date validFrom, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, final String barcodeId, - final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus, + final CatimaBarcode barcodeType, final @Nullable Charset barcodeEncoding, + final Integer headerColor, final int starStatus, final Long lastUsed, final int archiveStatus) { database.beginTransaction(); @@ -446,6 +459,7 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); + contentValues.put(LoyaltyCardDbIds.BARCODE_ENCODING, barcodeEncoding != null ? barcodeEncoding.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); @@ -465,7 +479,8 @@ public class DBHelper extends SQLiteOpenHelper { SQLiteDatabase database, final int id, final String store, final String note, final Date validFrom, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, final String barcodeId, - final CatimaBarcode barcodeType, final Integer headerColor, final int starStatus, + final CatimaBarcode barcodeType, final @Nullable Charset barcodeEncoding, + final Integer headerColor, final int starStatus, final Long lastUsed, final int archiveStatus) { database.beginTransaction(); @@ -480,6 +495,7 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); + contentValues.put(LoyaltyCardDbIds.BARCODE_ENCODING, barcodeEncoding != null ? barcodeEncoding.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 99c904b7e..b0e8d37ac 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -4,11 +4,14 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import androidx.annotation.Nullable; + import java.io.InvalidObjectException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLDecoder; import java.net.URLEncoder; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Currency; import java.util.Date; @@ -25,6 +28,7 @@ public class ImportURIHelper { private static final String CARD_ID = DBHelper.LoyaltyCardDbIds.CARD_ID; private static final String BARCODE_ID = DBHelper.LoyaltyCardDbIds.BARCODE_ID; private static final String BARCODE_TYPE = DBHelper.LoyaltyCardDbIds.BARCODE_TYPE; + private static final String BARCODE_ENCODING = DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING; private static final String HEADER_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_COLOR; private final Context context; @@ -66,6 +70,7 @@ public class ImportURIHelper { try { // These values are allowed to be null CatimaBarcode barcodeType = null; + Charset barcodeEncoding = null; Date validFrom = null; Date expiry = null; BigDecimal balance = new BigDecimal("0"); @@ -103,6 +108,11 @@ public class ImportURIHelper { barcodeType = CatimaBarcode.fromName(unparsedBarcodeType); } + String unparsedBarcodeEncoding = kv.get(BARCODE_ENCODING); + if (unparsedBarcodeEncoding != null && !unparsedBarcodeEncoding.equals("")) { + barcodeEncoding = Charset.forName(unparsedBarcodeEncoding); + } + String unparsedBalance = kv.get(BALANCE); if (unparsedBalance != null && !unparsedBalance.equals("")) { balance = new BigDecimal(unparsedBalance); @@ -136,6 +146,7 @@ public class ImportURIHelper { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, 0, Utils.getUnixTime(), @@ -195,6 +206,9 @@ public class ImportURIHelper { if (loyaltyCard.barcodeType != null) { fragment = appendFragment(fragment, BARCODE_TYPE, loyaltyCard.barcodeType.name()); } + if (loyaltyCard.barcodeEncoding != null) { + fragment = appendFragment(fragment, BARCODE_ENCODING, loyaltyCard.barcodeEncoding.name()); + } if (loyaltyCard.headerColor != null) { fragment = appendFragment(fragment, HEADER_COLOR, loyaltyCard.headerColor.toString()); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index b4fe33498..3a9318318 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.util.Currency; import java.util.Date; import java.util.List; @@ -31,6 +32,8 @@ public class LoyaltyCard { @Nullable public CatimaBarcode barcodeType; @Nullable + public Charset barcodeEncoding; + @Nullable public Integer headerColor; public int starStatus; public long lastUsed; @@ -62,6 +65,7 @@ public class LoyaltyCard { public static final String BUNDLE_LOYALTY_CARD_CARD_ID = "loyaltyCardCardId"; public static final String BUNDLE_LOYALTY_CARD_BARCODE_ID = "loyaltyCardBarcodeId"; public static final String BUNDLE_LOYALTY_CARD_BARCODE_TYPE = "loyaltyCardBarcodeType"; + public static final String BUNDLE_LOYALTY_CARD_BARCODE_ENCODING = "loyaltyCardBarcodeEncoding"; public static final String BUNDLE_LOYALTY_CARD_HEADER_COLOR = "loyaltyCardHeaderColor"; public static final String BUNDLE_LOYALTY_CARD_STAR_STATUS = "loyaltyCardStarStatus"; public static final String BUNDLE_LOYALTY_CARD_LAST_USED = "loyaltyCardLastUsed"; @@ -90,6 +94,7 @@ public class LoyaltyCard { setCardId(""); setBarcodeId(null); setBarcodeType(null); + setBarcodeEncoding(null); setHeaderColor(null); setStarStatus(0); setLastUsed(Utils.getUnixTime()); @@ -124,7 +129,7 @@ public class LoyaltyCard { public LoyaltyCard(final int id, final String store, final String note, @Nullable final Date validFrom, @Nullable final Date expiry, final BigDecimal balance, @Nullable final Currency balanceType, final String cardId, @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, - @Nullable final Integer headerColor, final int starStatus, + @Nullable final Charset barcodeEncoding, @Nullable final Integer headerColor, final int starStatus, final long lastUsed, final int zoomLevel, final int zoomLevelWidth, final int archiveStatus, @Nullable Bitmap imageThumbnail, @Nullable String imageThumbnailPath, @Nullable Bitmap imageFront, @Nullable String imageFrontPath, @@ -139,6 +144,7 @@ public class LoyaltyCard { setCardId(cardId); setBarcodeId(barcodeId); setBarcodeType(barcodeType); + setBarcodeEncoding(barcodeEncoding); setHeaderColor(headerColor); setStarStatus(starStatus); setLastUsed(lastUsed); @@ -244,6 +250,10 @@ public class LoyaltyCard { this.barcodeType = barcodeType; } + public void setBarcodeEncoding(@Nullable Charset barcodeEncoding) { + this.barcodeEncoding = barcodeEncoding; + } + public void setHeaderColor(@Nullable Integer headerColor) { this.headerColor = headerColor; } @@ -379,6 +389,11 @@ public class LoyaltyCard { } else if (requireFull) { throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_BARCODE_TYPE); } + if (bundle.containsKey(BUNDLE_LOYALTY_CARD_BARCODE_ENCODING)) { + setBarcodeEncoding(Charset.forName(bundle.getString(BUNDLE_LOYALTY_CARD_BARCODE_ENCODING))); + } else if (requireFull) { + throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_BARCODE_ENCODING); + } if (bundle.containsKey(BUNDLE_LOYALTY_CARD_HEADER_COLOR)) { int tmpHeaderColor = bundle.getInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR); setHeaderColor(tmpHeaderColor != -1 ? tmpHeaderColor : null); @@ -462,6 +477,9 @@ public class LoyaltyCard { if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_TYPE)) { bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); } + if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_BARCODE_ENCODING)) { + bundle.putString(BUNDLE_LOYALTY_CARD_BARCODE_ENCODING, barcodeEncoding != null ? barcodeEncoding.name() : null); + } if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_HEADER_COLOR)) { bundle.putInt(BUNDLE_LOYALTY_CARD_HEADER_COLOR, headerColor != null ? headerColor : -1); } @@ -539,6 +557,9 @@ public class LoyaltyCard { // barcodeType int barcodeTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE); CatimaBarcode barcodeType = !cursor.isNull(barcodeTypeColumn) ? CatimaBarcode.fromName(cursor.getString(barcodeTypeColumn)) : null; + // barcodeEncoding + int barcodeEncodingColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING); + Charset barcodeEncoding = !cursor.isNull(barcodeEncodingColumn) ? Charset.forName(cursor.getString(barcodeEncodingColumn)) : null; // headerColor int headerColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR); Integer headerColor = !cursor.isNull(headerColorColumn) ? cursor.getInt(headerColorColumn) : null; @@ -564,6 +585,7 @@ public class LoyaltyCard { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, starStatus, lastUsed, @@ -593,6 +615,7 @@ public class LoyaltyCard { Utils.equals(a.barcodeId, b.barcodeId) && // nullable String Utils.equals(a.barcodeType == null ? null : a.barcodeType.format(), b.barcodeType == null ? null : b.barcodeType.format()) && // nullable CatimaBarcode with no overridden .equals(), so we need to check .format() + Utils.equals(a.barcodeEncoding, b.barcodeEncoding) && // nullable String Utils.equals(a.headerColor, b.headerColor) && // nullable Integer a.starStatus == b.starStatus && // non-nullable int a.archiveStatus == b.archiveStatus && // non-nullable int @@ -619,7 +642,7 @@ public class LoyaltyCard { public String toString() { return String.format( "LoyaltyCard{%n id=%s,%n store=%s,%n note=%s,%n validFrom=%s,%n expiry=%s,%n" - + " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n" + + " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n barcodeEncoding=%s,%n" + " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n zoomLevelWidth=%s,%n archiveStatus=%s%n" + " imageThumbnail=%s,%n imageThumbnailPath=%s,%n imageFront=%s,%n imageFrontPath=%s,%n imageBack=%s,%n imageBackPath=%s,%n}", this.id, @@ -632,6 +655,7 @@ public class LoyaltyCard { this.cardId, this.barcodeId, this.barcodeType != null ? this.barcodeType.format() : null, + this.barcodeEncoding != null ? this.barcodeEncoding.name() : null, this.headerColor, this.starStatus, this.lastUsed, diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 2d57dd5a9..a15501c7d 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -70,6 +70,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InvalidObjectException; import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; @@ -128,6 +130,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements TextView cardIdFieldView; AutoCompleteTextView barcodeIdField; AutoCompleteTextView barcodeTypeField; + AutoCompleteTextView barcodeEncodingField; ImageView barcodeImage; View barcodeImageLayout; View barcodeCaptureLayout; @@ -229,6 +232,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements viewModel.setHasChanged(true); } + protected void setLoyaltyCardBarcodeEncoding(@Nullable Charset barcodeEncoding) { + viewModel.getLoyaltyCard().setBarcodeEncoding(barcodeEncoding); + + generateBarcode(); + + viewModel.setHasChanged(true); + } + protected void setLoyaltyCardHeaderColor(@Nullable Integer headerColor) { viewModel.getLoyaltyCard().setHeaderColor(headerColor); @@ -334,6 +345,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements cardIdFieldView = binding.cardIdView; barcodeIdField = binding.barcodeIdField; barcodeTypeField = binding.barcodeTypeField; + barcodeEncodingField = binding.barcodeEncodingField; barcodeImage = binding.barcode; barcodeImage.setClipToOutline(true); barcodeImageLayout = binding.barcodeLayout; @@ -577,6 +589,30 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } }); + barcodeEncodingField.addTextChangedListener(new SimpleTextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (!s.toString().isEmpty()) { + Log.d(TAG, "Setting barcode encoding to " + s.toString()); + if (s.toString().equals(getString(R.string.automatic))) { + setLoyaltyCardBarcodeEncoding(null); + } else { + setLoyaltyCardBarcodeEncoding(Charset.forName(s.toString())); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + ArrayList barcodeEncodingList = new ArrayList<>(); + barcodeEncodingList.add(getString(R.string.automatic)); + barcodeEncodingList.add(StandardCharsets.ISO_8859_1.name()); + barcodeEncodingList.add(StandardCharsets.UTF_8.name()); + ArrayAdapter barcodeEncodingAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, barcodeEncodingList); + barcodeEncodingField.setAdapter(barcodeEncodingAdapter); + } + }); + binding.tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { @@ -773,6 +809,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements barcodeIdField.setText(barcodeId != null && !barcodeId.isEmpty() ? barcodeId : getString(R.string.sameAsCardId)); CatimaBarcode barcodeType = viewModel.getLoyaltyCard().barcodeType; barcodeTypeField.setText(barcodeType != null ? barcodeType.prettyName() : getString(R.string.noBarcode)); + Charset barcodeEncoding = viewModel.getLoyaltyCard().barcodeEncoding; + barcodeEncodingField.setText(barcodeEncoding != null ? barcodeEncoding.name() : getString(R.string.automatic)); // 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. @@ -1479,9 +1517,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements // This makes the DBHelper set it to the current date // So that new and edited card are always on top when sorting by recently used if (viewModel.getUpdateLoyaltyCard()) { - DBHelper.updateLoyaltyCard(mDatabase, viewModel.getLoyaltyCardId(), viewModel.getLoyaltyCard().store, viewModel.getLoyaltyCard().note, viewModel.getLoyaltyCard().validFrom, viewModel.getLoyaltyCard().expiry, viewModel.getLoyaltyCard().balance, viewModel.getLoyaltyCard().balanceType, viewModel.getLoyaltyCard().cardId, viewModel.getLoyaltyCard().barcodeId, viewModel.getLoyaltyCard().barcodeType, viewModel.getLoyaltyCard().headerColor, viewModel.getLoyaltyCard().starStatus, null, viewModel.getLoyaltyCard().archiveStatus); + DBHelper.updateLoyaltyCard(mDatabase, viewModel.getLoyaltyCardId(), viewModel.getLoyaltyCard().store, viewModel.getLoyaltyCard().note, viewModel.getLoyaltyCard().validFrom, viewModel.getLoyaltyCard().expiry, viewModel.getLoyaltyCard().balance, viewModel.getLoyaltyCard().balanceType, viewModel.getLoyaltyCard().cardId, viewModel.getLoyaltyCard().barcodeId, viewModel.getLoyaltyCard().barcodeType, viewModel.getLoyaltyCard().barcodeEncoding, viewModel.getLoyaltyCard().headerColor, viewModel.getLoyaltyCard().starStatus, null, viewModel.getLoyaltyCard().archiveStatus); } else { - viewModel.setLoyaltyCardId((int) DBHelper.insertLoyaltyCard(mDatabase, viewModel.getLoyaltyCard().store, viewModel.getLoyaltyCard().note, viewModel.getLoyaltyCard().validFrom, viewModel.getLoyaltyCard().expiry, viewModel.getLoyaltyCard().balance, viewModel.getLoyaltyCard().balanceType, viewModel.getLoyaltyCard().cardId, viewModel.getLoyaltyCard().barcodeId, viewModel.getLoyaltyCard().barcodeType, viewModel.getLoyaltyCard().headerColor, 0, null, 0)); + viewModel.setLoyaltyCardId((int) DBHelper.insertLoyaltyCard(mDatabase, viewModel.getLoyaltyCard().store, viewModel.getLoyaltyCard().note, viewModel.getLoyaltyCard().validFrom, viewModel.getLoyaltyCard().expiry, viewModel.getLoyaltyCard().balance, viewModel.getLoyaltyCard().balanceType, viewModel.getLoyaltyCard().cardId, viewModel.getLoyaltyCard().barcodeId, viewModel.getLoyaltyCard().barcodeType, viewModel.getLoyaltyCard().barcodeEncoding, viewModel.getLoyaltyCard().headerColor, 0, null, 0)); } try { @@ -1596,6 +1634,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements String cardIdString = viewModel.getLoyaltyCard().barcodeId != null ? viewModel.getLoyaltyCard().barcodeId : viewModel.getLoyaltyCard().cardId; CatimaBarcode barcodeFormat = viewModel.getLoyaltyCard().barcodeType; + Charset barcodeEncoding = viewModel.getLoyaltyCard().barcodeEncoding; if (cardIdString == null || cardIdString.isEmpty() || barcodeFormat == null) { barcodeImageLayout.setVisibility(View.GONE); @@ -1615,13 +1654,13 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); Log.d(TAG, "ImageView size now known"); - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, LoyaltyCardEditActivity.this, true, false); + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, barcodeEncoding, null, false, LoyaltyCardEditActivity.this, true, false); viewModel.getTaskHandler().executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); } }); } else { Log.d(TAG, "ImageView size known known, creating barcode"); - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, null, false, this, true, false); + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), barcodeImage, cardIdString, barcodeFormat, barcodeEncoding, null, false, this, true, false); viewModel.getTaskHandler().executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 766355e7e..3ede42119 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -39,6 +39,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; @@ -58,6 +59,7 @@ import com.google.zxing.BarcodeFormat; import java.io.File; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; @@ -87,6 +89,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements String cardIdString; String barcodeIdString; CatimaBarcode format; + @Nullable + Charset barcodeEncoding; Bitmap frontImageBitmap; Bitmap backImageBitmap; @@ -686,6 +690,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements format = loyaltyCard.barcodeType; cardIdString = loyaltyCard.cardId; barcodeIdString = loyaltyCard.barcodeId; + barcodeEncoding = loyaltyCard.barcodeEncoding; binding.mainImageDescription.setText(loyaltyCard.cardId); @@ -959,6 +964,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements barcodeRenderTarget, barcodeIdString != null ? barcodeIdString : cardIdString, format, + barcodeEncoding, null, false, this, diff --git a/app/src/main/java/protect/card_locker/PkpassParser.kt b/app/src/main/java/protect/card_locker/PkpassParser.kt index 149236150..b1638aadd 100644 --- a/app/src/main/java/protect/card_locker/PkpassParser.kt +++ b/app/src/main/java/protect/card_locker/PkpassParser.kt @@ -14,6 +14,7 @@ import org.json.JSONObject import java.io.FileNotFoundException import java.io.IOException import java.math.BigDecimal +import java.nio.charset.Charset import java.text.DateFormat import java.text.ParseException import java.time.ZonedDateTime @@ -40,6 +41,7 @@ class PkpassParser(context: Context, uri: Uri?) { private var cardId: String = context.getString(R.string.noBarcode) private var barcodeId: String? = null private var barcodeType: CatimaBarcode? = null + private var barcodeEncoding: Charset? = null private var headerColor: Int? = null private val starStatus = 0 private val lastUsed: Long = 0 @@ -134,6 +136,7 @@ class PkpassParser(context: Context, uri: Uri?) { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, starStatus, lastUsed, @@ -342,13 +345,14 @@ class PkpassParser(context: Context, uri: Uri?) { else -> throw IllegalArgumentException("No valid barcode type") } - // FIXME: We probably need to do something with the messageEncoding field try { cardId = barcodeInfo.getString("altText") barcodeId = barcodeInfo.getString("message") + barcodeEncoding = Charset.forName(barcodeInfo.getString("messageEncoding")) } catch (ignored: JSONException) { cardId = barcodeInfo.getString("message") barcodeId = null + barcodeEncoding = Charset.forName(barcodeInfo.getString("messageEncoding")) } // Don't set barcodeId if it's the same as cardId diff --git a/app/src/main/java/protect/card_locker/contentprovider/CardsContentProvider.java b/app/src/main/java/protect/card_locker/contentprovider/CardsContentProvider.java index 44d5b2378..77c6ccb37 100644 --- a/app/src/main/java/protect/card_locker/contentprovider/CardsContentProvider.java +++ b/app/src/main/java/protect/card_locker/contentprovider/CardsContentProvider.java @@ -52,6 +52,7 @@ public class CardsContentProvider extends ContentProvider { LoyaltyCardDbIds.CARD_ID, LoyaltyCardDbIds.BARCODE_ID, LoyaltyCardDbIds.BARCODE_TYPE, + // FIXME: Expose BARCODE_ENCODING but without ever exposing the null value (so apps using this don't have to guess) LoyaltyCardDbIds.STAR_STATUS, LoyaltyCardDbIds.LAST_USED, LoyaltyCardDbIds.ARCHIVE_STATUS, diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java index 6803e3cf2..a311dd191 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -134,6 +134,7 @@ public class CatimaExporter implements Exporter { DBHelper.LoyaltyCardDbIds.CARD_ID, DBHelper.LoyaltyCardDbIds.BARCODE_ID, DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, + DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, DBHelper.LoyaltyCardDbIds.STAR_STATUS, DBHelper.LoyaltyCardDbIds.LAST_USED, @@ -154,6 +155,7 @@ public class CatimaExporter implements Exporter { card.cardId, card.barcodeId, card.barcodeType != null ? card.barcodeType.name() : "", + card.barcodeEncoding != null ? card.barcodeEncoding.name() : "", card.headerColor, card.starStatus, card.lastUsed, diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java index 5cc348895..a6567dd44 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -20,6 +20,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Currency; @@ -127,10 +128,10 @@ public class CatimaImporter implements Importer { LoyaltyCard existing = DBHelper.getLoyaltyCard(context, database, card.id); if (existing == null) { DBHelper.insertLoyaltyCard(database, card.id, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType, - card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); + card.cardId, card.barcodeId, card.barcodeType, card.barcodeEncoding, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); } else if (!isDuplicate(context, existing, card, existingImages, imageChecksums)) { long newId = DBHelper.insertLoyaltyCard(database, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType, - card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); + card.cardId, card.barcodeId, card.barcodeType, card.barcodeEncoding, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); idMap.put(card.id, (int) newId); } } @@ -458,6 +459,12 @@ public class CatimaImporter implements Importer { barcodeType = CatimaBarcode.fromName(unparsedBarcodeType); } + Charset barcodeEncoding = null; + String unparsedBarcodeEncoding = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING, record, ""); + if (!unparsedBarcodeEncoding.isEmpty()) { + barcodeEncoding = Charset.forName(unparsedBarcodeEncoding); + } + Integer headerColor = null; try { headerColor = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record); @@ -501,6 +508,7 @@ public class CatimaImporter implements Importer { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, starStatus, lastUsed, diff --git a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java index d60786ff6..4e61875e1 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -160,6 +160,7 @@ public class FidmeImporter implements Importer { cardId, null, barcodeType, + null, headerColor, starStatus, Utils.getUnixTime(), @@ -181,7 +182,7 @@ public class FidmeImporter implements Importer { for (LoyaltyCard card : data.cards) { // Do not use card.id which is set to -1 DBHelper.insertLoyaltyCard(database, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType, - card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); + card.cardId, card.barcodeId, card.barcodeType, card.barcodeEncoding, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); } } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java index bf0dc076a..2eaecd9f7 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -162,6 +162,7 @@ public class VoucherVaultImporter implements Importer { cardId, null, barcodeType, + null, headerColor, 0, Utils.getUnixTime(), @@ -186,7 +187,7 @@ public class VoucherVaultImporter implements Importer { for (LoyaltyCard card : data.cards) { // Do not use card.id which is set to -1 DBHelper.insertLoyaltyCard(database, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType, - card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); + card.cardId, card.barcodeId, card.barcodeType, card.barcodeEncoding, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); } } } \ No newline at end of file diff --git a/app/src/main/res/layout/loyalty_card_edit_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml index 83861d226..d69dbc9cd 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -191,6 +191,32 @@ + + + + + + + + + + Copy value Copied to clipboard No value found + Barcode encoding + Automatic diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index 5c89dc82e..c84ac1567 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -21,6 +21,7 @@ import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Currency; import java.util.List; @@ -41,7 +42,7 @@ public class DatabaseTest { @Test public void addRemoveOneGiftCard() { assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -57,6 +58,7 @@ public class DatabaseTest { assertEquals("cardId", loyaltyCard.cardId); assertEquals(null, loyaltyCard.barcodeId); assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format()); + assertEquals(null, loyaltyCard.barcodeEncoding); assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(0, loyaltyCard.starStatus); assertEquals(0, loyaltyCard.archiveStatus); @@ -69,12 +71,12 @@ public class DatabaseTest { @Test public void updateGiftCard() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR, 0, null, 0); + result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), StandardCharsets.UTF_8, DEFAULT_HEADER_COLOR, 0, null, 0); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -89,6 +91,7 @@ public class DatabaseTest { assertEquals("cardId1", loyaltyCard.cardId); assertEquals(null, loyaltyCard.barcodeId); assertEquals(BarcodeFormat.AZTEC, loyaltyCard.barcodeType.format()); + assertEquals(StandardCharsets.UTF_8, loyaltyCard.barcodeEncoding); assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(0, loyaltyCard.starStatus); assertEquals(0, loyaltyCard.archiveStatus); @@ -96,7 +99,7 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyStar() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -116,6 +119,7 @@ public class DatabaseTest { assertEquals("cardId", loyaltyCard.cardId); assertEquals(null, loyaltyCard.barcodeId); assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format()); + assertEquals(null, loyaltyCard.barcodeEncoding); assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(1, loyaltyCard.starStatus); assertEquals(0, loyaltyCard.archiveStatus); @@ -126,14 +130,14 @@ public class DatabaseTest { assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, null, new BigDecimal("0"), null, "cardId1", - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null, 0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null, 0); assertEquals(false, result); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); } @Test public void emptyGiftCardValues() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, null, new BigDecimal("0"), null, "", null, null, null, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, null, new BigDecimal("0"), null, "", null, null, null, null, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -149,6 +153,7 @@ public class DatabaseTest { assertEquals("", loyaltyCard.cardId); assertEquals(null, loyaltyCard.barcodeId); assertEquals(null, loyaltyCard.barcodeType); + assertEquals(null, loyaltyCard.barcodeEncoding); // headerColor is randomly generated when not given, so skip assertEquals(0, loyaltyCard.starStatus); assertEquals(0, loyaltyCard.archiveStatus); @@ -162,7 +167,7 @@ public class DatabaseTest { // that they are sorted for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { long id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), StandardCharsets.UTF_8, index, 0, null,0); boolean result = (id != -1); assertTrue(result); } @@ -186,6 +191,7 @@ public class DatabaseTest { assertEquals("cardId" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID))); assertEquals(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); + assertEquals(StandardCharsets.UTF_8.name(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING))); assertEquals(index, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))); assertEquals(0, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS))); assertEquals(0, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS))); @@ -208,10 +214,10 @@ public class DatabaseTest { for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { if (index == CARDS_TO_ADD - 1) { id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null,0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, index, 1, null,0); } else { id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null,0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, index, 0, null,0); } boolean result = (id != -1); assertTrue(result); @@ -235,6 +241,7 @@ public class DatabaseTest { assertEquals("cardId" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID))); assertEquals(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); + assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ENCODING))); assertEquals(index, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))); assertEquals(1, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS))); @@ -310,7 +317,7 @@ public class DatabaseTest { public void updateGroup() { // Create card assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -422,7 +429,7 @@ public class DatabaseTest { public void cardAddAndRemoveGroups() { // Create card assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -490,6 +497,7 @@ public class DatabaseTest { assertEquals("cardId", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.UPC_A, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(null, card.headerColor); assertEquals(0, card.starStatus); assertEquals(0, card.lastUsed); @@ -507,6 +515,7 @@ public class DatabaseTest { assertEquals("cardId", card2.cardId); assertEquals(null, card2.barcodeId); assertEquals(null, card2.barcodeType); // Empty string should've become null + assertEquals(null, card.barcodeEncoding); assertEquals(null, card2.headerColor); assertEquals(0, card2.starStatus); assertEquals(0, card2.lastUsed); @@ -516,7 +525,7 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyBalance() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -536,6 +545,7 @@ public class DatabaseTest { assertEquals("cardId", loyaltyCard.cardId); assertEquals(null, loyaltyCard.barcodeId); assertEquals(BarcodeFormat.UPC_A, loyaltyCard.barcodeType.format()); + assertEquals(null, loyaltyCard.barcodeEncoding); assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(0, loyaltyCard.starStatus); assertEquals(0, loyaltyCard.archiveStatus); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 370af487f..e10d10d85 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; @@ -73,7 +74,7 @@ public class ImportExportTest { for (int index = cardsToAdd; index > 4; index--) { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, null, index, 1, null,0); boolean result = (id != -1); assertTrue(result); } @@ -81,7 +82,7 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); //if index is even - long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, null, index, 0, null,0); boolean result = (id != -1); assertTrue(result); } @@ -90,7 +91,7 @@ public class ImportExportTest { @Test public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, 0, null,0); boolean result = (id != -1); assertTrue(result); @@ -104,10 +105,11 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", null, new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); + id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", null, new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, 0, null,0); result = (id != -1); assertTrue(result); @@ -121,10 +123,11 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", null, new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); + id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", null, new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, 0, null,0); result = (id != -1); assertTrue(result); @@ -139,12 +142,13 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); // This will break after 19 January 2038 // If someone is still maintaining this code base by then: I love you - id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", null, new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null,0); + id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", null, new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, 0, null,0); result = (id != -1); assertTrue(result); @@ -158,6 +162,7 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); @@ -188,6 +193,7 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(0, card.starStatus); @@ -219,6 +225,7 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(0, card.starStatus); } @@ -250,6 +257,7 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(1, card.starStatus); @@ -272,6 +280,7 @@ public class ImportExportTest { assertEquals(BARCODE_DATA, card.cardId); assertEquals(null, card.barcodeId); assertEquals(BARCODE_TYPE.format(), card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(0, card.starStatus); @@ -660,6 +669,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertNull(card.headerColor); assertEquals(0, card.starStatus); @@ -686,6 +696,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertNull(card.headerColor); assertEquals(0, card.starStatus); @@ -724,6 +735,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(null, card.barcodeType); + assertEquals(null, card.barcodeEncoding); assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); @@ -750,6 +762,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(1, (long) card.headerColor); assertEquals(1, card.starStatus); @@ -776,6 +789,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); @@ -809,6 +823,7 @@ public class ImportExportTest { assertEquals("12345", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.AZTEC, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(1, (long) card.headerColor); assertEquals(0, card.starStatus); @@ -830,7 +845,7 @@ public class ImportExportTest { HashMap loyaltyCardIconImages = new HashMap<>(); // Create card 1 - int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null,0); + int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), StandardCharsets.UTF_8, 1, 0, null,0); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId)); DBHelper.insertGroup(mDatabase, "One"); List groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One")); @@ -844,7 +859,7 @@ public class ImportExportTest { loyaltyCardIconImages.put(loyaltyCardId, bitmap1); // Create card 2 - loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, null, new BigDecimal(0), null, "123456", null, null, 2, 1, null,0); + loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, null, new BigDecimal(0), null, "123456", null, null, null, 2, 1, null,0); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId)); // Export everything @@ -875,6 +890,7 @@ public class ImportExportTest { assertEquals(loyaltyCard.barcodeId, dbLoyaltyCard.barcodeId); assertEquals(loyaltyCard.starStatus, dbLoyaltyCard.starStatus); assertEquals(loyaltyCard.barcodeType != null ? loyaltyCard.barcodeType.format() : null, dbLoyaltyCard.barcodeType != null ? dbLoyaltyCard.barcodeType.format() : null); + assertEquals(loyaltyCard.barcodeEncoding != null ? loyaltyCard.barcodeEncoding : null, dbLoyaltyCard.barcodeEncoding != null ? dbLoyaltyCard.barcodeEncoding : null); assertEquals(loyaltyCard.balanceType, dbLoyaltyCard.balanceType); assertEquals(loyaltyCard.headerColor, dbLoyaltyCard.headerColor); @@ -930,7 +946,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResultType.Success, result.resultType()); - assertEquals(7, DBHelper.getLoyaltyCardCount(mDatabase)); + assertEquals(8, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(3, DBHelper.getGroupCount(mDatabase)); // Check all groups @@ -961,6 +977,7 @@ public class ImportExportTest { assertEquals("1234", card1.cardId); assertEquals("5432", card1.barcodeId); assertEquals(BarcodeFormat.QR_CODE, card1.barcodeType.format()); + assertEquals(null, card1.barcodeEncoding); assertEquals(1, (long) card1.headerColor); assertEquals(0, card1.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.front)); @@ -978,6 +995,7 @@ public class ImportExportTest { assertEquals("a", card8.cardId); assertEquals(null, card8.barcodeId); assertEquals(null, card8.barcodeType); + assertEquals(null, card8.barcodeEncoding); assertEquals(-5317, (long) card8.headerColor); assertEquals(0, card8.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.front)); @@ -995,6 +1013,7 @@ public class ImportExportTest { assertEquals("A", card2.cardId); assertEquals(null, card2.barcodeId); assertEquals(null, card2.barcodeType); + assertEquals(null, card2.barcodeEncoding); assertEquals(-9977996, (long) card2.headerColor); assertEquals(0, card2.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.front)); @@ -1012,6 +1031,7 @@ public class ImportExportTest { assertEquals("dhd", card3.cardId); assertEquals(null, card3.barcodeId); assertEquals(null, card3.barcodeType); + assertEquals(null, card3.barcodeEncoding); assertEquals(-9977996, (long) card3.headerColor); assertEquals(0, card3.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.front)); @@ -1029,6 +1049,7 @@ public class ImportExportTest { assertEquals("dhshsvshs", card4.cardId); assertEquals(null, card4.barcodeId); assertEquals(null, card4.barcodeType); + assertEquals(null, card4.barcodeEncoding); assertEquals(-10902850, (long) card4.headerColor); assertEquals(1, card4.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.front)); @@ -1046,6 +1067,7 @@ public class ImportExportTest { assertEquals("98765432", card5.cardId); assertEquals("23456", card5.barcodeId); assertEquals(BarcodeFormat.CODE_128, card5.barcodeType.format()); + assertEquals(StandardCharsets.ISO_8859_1, card5.barcodeEncoding); assertEquals(-10902850, (long) card5.headerColor); assertEquals(0, card5.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.front)); @@ -1063,12 +1085,31 @@ public class ImportExportTest { assertEquals("a", card6.cardId); assertEquals("-5317", card6.barcodeId); assertEquals(BarcodeFormat.AZTEC, card6.barcodeType.format()); + assertEquals(null, card6.barcodeEncoding); assertEquals(null, card6.headerColor); assertEquals(0, card6.starStatus); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card6.id, ImageLocationType.front)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card6.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card6.id, ImageLocationType.icon)); + LoyaltyCard card9 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 9); + + assertEquals("cheese", card9.store); + assertEquals("", card9.note); + assertEquals(null, card9.validFrom); + assertEquals(null, card9.expiry); + assertEquals(new BigDecimal("0"), card9.balance); + assertEquals(null, card9.balanceType); + assertEquals("Käseschnitte", card9.cardId); + assertEquals(null, card9.barcodeId); + assertEquals(BarcodeFormat.AZTEC, card9.barcodeType.format()); + assertEquals(StandardCharsets.UTF_8, card9.barcodeEncoding); + assertEquals(-5414233, (long) card9.headerColor); + assertEquals(0, card9.starStatus); + assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card9.id, ImageLocationType.front)); + assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card9.id, ImageLocationType.back)); + assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card9.id, ImageLocationType.icon)); + TestHelpers.getEmptyDb(activity); } @@ -1092,6 +1133,7 @@ public class ImportExportTest { assertEquals("82825292629272726", card.cardId); assertEquals(null, card.barcodeId); assertEquals(null, card.barcodeType); + assertEquals(null, card.barcodeEncoding); assertEquals(0, card.starStatus); card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); @@ -1105,6 +1147,7 @@ public class ImportExportTest { assertEquals("123456", card.cardId); assertEquals(null, card.barcodeId); assertEquals(null, card.barcodeType); + assertEquals(null, card.barcodeEncoding); assertEquals(0, card.starStatus); card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3); @@ -1118,6 +1161,7 @@ public class ImportExportTest { assertEquals("123435363634", card.cardId); assertEquals(null, card.barcodeId); assertEquals(null, card.barcodeType); + assertEquals(null, card.barcodeEncoding); assertEquals(0, card.starStatus); TestHelpers.getEmptyDb(activity); @@ -1143,6 +1187,7 @@ public class ImportExportTest { assertEquals("123456", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.CODE_128, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Color.GRAY, (long) card.headerColor); assertEquals(0, card.starStatus); @@ -1157,6 +1202,7 @@ public class ImportExportTest { assertEquals("26846363", card.cardId); assertEquals(null, card.barcodeId); assertEquals(BarcodeFormat.CODE_39, card.barcodeType.format()); + assertEquals(null, card.barcodeEncoding); assertEquals(Color.rgb(128, 0, 128), (long) card.headerColor); assertEquals(0, card.starStatus); diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index f0b867827..370373ee7 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -20,6 +20,7 @@ import org.robolectric.RobolectricTestRunner; import java.io.InvalidObjectException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.util.Currency; import java.util.Date; @@ -41,7 +42,7 @@ public class ImportURITest { // Generate card Date date = new Date(); - DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), StandardCharsets.UTF_8, Color.BLACK, 1, null,0); // Get card LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); @@ -62,6 +63,7 @@ public class ImportURITest { assertEquals(card.cardId, parsedCard.cardId); assertEquals(card.barcodeId, parsedCard.barcodeId); assertEquals(card.barcodeType.format(), parsedCard.barcodeType.format()); + assertEquals(card.barcodeEncoding, parsedCard.barcodeEncoding); assertEquals(card.headerColor, parsedCard.headerColor); // No export of starStatus for export URL foreseen therefore 0 will be imported assertEquals(0, parsedCard.starStatus); @@ -71,7 +73,7 @@ public class ImportURITest { @Test public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException { // Generate card - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, null, 0, null,0); // Get card LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); @@ -92,6 +94,7 @@ public class ImportURITest { assertEquals(card.cardId, parsedCard.cardId); assertEquals(card.barcodeId, parsedCard.barcodeId); assertEquals(card.barcodeType.format(), parsedCard.barcodeType.format()); + assertEquals(card.barcodeEncoding, parsedCard.barcodeEncoding); assertNull(parsedCard.headerColor); // No export of starStatus for export URL foreseen therefore 0 will be imported assertEquals(0, parsedCard.starStatus); @@ -101,7 +104,7 @@ public class ImportURITest { @Test public void parseWithTrailingSlash() throws InvalidObjectException, UnsupportedEncodingException { // Generate card - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), StandardCharsets.UTF_8, null, 0, null,0); // Get card LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); @@ -123,6 +126,7 @@ public class ImportURITest { assertEquals(card.cardId, parsedCard.cardId); assertEquals(card.barcodeId, parsedCard.barcodeId); assertEquals(card.barcodeType.format(), parsedCard.barcodeType.format()); + assertEquals(card.barcodeEncoding, parsedCard.barcodeEncoding); assertNull(parsedCard.headerColor); // No export of starStatus for export URL foreseen therefore 0 will be imported assertEquals(0, parsedCard.starStatus); @@ -183,6 +187,7 @@ public class ImportURITest { assertEquals("12345", parsedCard.cardId); assertEquals(null, parsedCard.barcodeId); assertEquals(BarcodeFormat.ITF, parsedCard.barcodeType.format()); + assertEquals(null, parsedCard.barcodeEncoding); assertEquals(Integer.valueOf(-416706), parsedCard.headerColor); assertEquals(0, parsedCard.starStatus); } diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 7f647c161..05a4745dd 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -96,7 +96,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterEmptyNote() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -111,7 +111,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterWithNote() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -126,10 +126,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterStarring() { - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,1)); - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,1)); - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0)); - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,1)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 1, null,1)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 1, null,0)); assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -177,7 +177,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0Points() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -192,7 +192,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0EUR() { - DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -207,7 +207,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter100Points() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -222,7 +222,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter10USD() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 2fc8d6121..94644f9f9 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -65,6 +65,8 @@ import org.robolectric.shadows.ShadowLog; import java.io.IOException; import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.ParseException; import java.time.Instant; @@ -133,6 +135,7 @@ public class LoyaltyCardViewActivityTest { final String cardId, final String barcodeId, final String barcodeType, + final String barcodeEncoding, boolean creatingNewCard) throws ParseException { SQLiteDatabase database = new DBHelper(activity).getWritableDatabase(); if (creatingNewCard) { @@ -150,6 +153,7 @@ public class LoyaltyCardViewActivityTest { final TextView cardIdField = activity.findViewById(R.id.cardIdView); final TextView barcodeIdField = activity.findViewById(R.id.barcodeIdField); final TextView barcodeTypeField = activity.findViewById(R.id.barcodeTypeField); + final TextView barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField); storeField.setText(store); noteField.setText(note); @@ -160,6 +164,7 @@ public class LoyaltyCardViewActivityTest { cardIdField.setText(cardId); barcodeIdField.setText(barcodeId); barcodeTypeField.setText(barcodeType); + barcodeEncodingField.setText(barcodeEncoding); assertEquals(false, activity.isFinishing()); activity.findViewById(R.id.fabSave).performClick(); @@ -207,6 +212,14 @@ public class LoyaltyCardViewActivityTest { } else { assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format()); } + + // The special "Automatic" string shouldn't actually be written to the loyalty card + if (barcodeEncoding.equals(activity.getApplicationContext().getString(R.string.automatic))) { + assertEquals(null, card.barcodeEncoding); + } else { + assertEquals(Charset.forName(barcodeEncoding), card.barcodeEncoding); + } + assertNotNull(card.headerColor); database.close(); @@ -323,6 +336,7 @@ public class LoyaltyCardViewActivityTest { final String expiryString, final String balanceString, final String balanceTypeString, final String cardId, final String barcodeId, final String barcodeType, + final String barcodeEncoding, final Bitmap frontImage, final Bitmap backImage) { if (mode == ViewMode.VIEW_CARD) { checkFieldProperties(activity, R.id.main_image_description, View.VISIBLE, cardId, FieldTypeView.TextView); @@ -338,6 +352,7 @@ public class LoyaltyCardViewActivityTest { checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView); checkFieldProperties(activity, R.id.barcodeIdField, View.VISIBLE, barcodeId, FieldTypeView.TextView); checkFieldProperties(activity, R.id.barcodeTypeField, View.VISIBLE, barcodeType, FieldTypeView.TextView); + checkFieldProperties(activity, R.id.barcodeEncodingField, View.VISIBLE, barcodeEncoding, FieldTypeView.TextView); //checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null, FieldTypeView.ImageView); checkFieldProperties(activity, R.id.frontImage, View.VISIBLE, frontImage, FieldTypeView.ImageView); checkFieldProperties(activity, R.id.backImage, View.VISIBLE, backImage, FieldTypeView.ImageView); @@ -359,7 +374,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check default settings - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); } @Test @@ -379,7 +394,7 @@ public class LoyaltyCardViewActivityTest { System.out.println(); if (!newCard) { - cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0); } else { cardId = null; } @@ -394,7 +409,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check default settings - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), newCard ? context.getString(R.string.automatic) : StandardCharsets.UTF_8.name(), null, null); // Change everything final EditText storeField = activity.findViewById(R.id.storeNameEdit); @@ -406,6 +421,7 @@ public class LoyaltyCardViewActivityTest { final EditText cardIdField = activity.findViewById(R.id.cardIdView); final EditText barcodeField = activity.findViewById(R.id.barcodeIdField); final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField); + final EditText barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField); final ImageView frontImageView = activity.findViewById(R.id.frontImage); final ImageView backImageView = activity.findViewById(R.id.backImage); @@ -426,13 +442,14 @@ public class LoyaltyCardViewActivityTest { cardIdField.setText("12345678"); barcodeField.setText("87654321"); barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName()); + barcodeEncodingField.setText(StandardCharsets.ISO_8859_1.name()); activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true); activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true); shadowOf(getMainLooper()).idle(); // Check if changed - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); + checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap); // Resume activityController.pause(); @@ -441,7 +458,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); + checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap); // Rotate to landscape activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); @@ -449,7 +466,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); + checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap); // Rotate to portrait shadowOf(getMainLooper()).idle(); @@ -457,7 +474,7 @@ public class LoyaltyCardViewActivityTest { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), frontBitmap, backBitmap); + checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap); } } @@ -471,7 +488,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); } @Test @@ -531,18 +548,18 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); shadowOf(getMainLooper()).idle(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.name(), true); + saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.name(), context.getString(R.string.automatic), true); } @Test @@ -555,7 +572,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); // Complete barcode capture in failure captureBarcodeWithResult(activity, false); @@ -563,7 +580,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); } @Test @@ -576,13 +593,13 @@ public class LoyaltyCardViewActivityTest { LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "", context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Cancel the loyalty card creation assertEquals(false, activity.isFinishing()); @@ -627,17 +644,16 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); - activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -647,7 +663,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -656,7 +672,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null); + checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), StandardCharsets.UTF_8.name(), null, null); database.close(); } @@ -666,7 +682,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -675,13 +691,13 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), StandardCharsets.UTF_8.name(), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), StandardCharsets.UTF_8.name(), null, null); database.close(); } @@ -691,7 +707,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); @@ -700,13 +716,13 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Cancel the loyalty card creation assertEquals(false, activity.isFinishing()); @@ -730,7 +746,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -739,7 +755,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Set date to today MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField); @@ -753,7 +769,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -763,7 +779,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -772,13 +788,13 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Set date to never MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField); expiryField.setText(expiryField.getAdapter().getItem(0).toString(), false); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -788,7 +804,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -797,7 +813,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Set balance to 10 points EditText balanceField = activity.findViewById(R.id.balanceField); @@ -826,7 +842,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "€", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "€", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), context.getString(R.string.automatic), null, null); database.close(); } @@ -839,7 +855,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -848,7 +864,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "10.00", "$", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); shadowOf(getMainLooper()).idle(); @@ -870,7 +886,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", "₩", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", "₩", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -880,7 +896,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -889,7 +905,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Change barcode ID EditText barcodeField = activity.findViewById(R.id.barcodeIdField); @@ -902,7 +918,7 @@ public class LoyaltyCardViewActivityTest { AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog()); assertNull(updateBarcodeIdDialog); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -912,7 +928,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -921,7 +937,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -936,7 +952,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -946,7 +962,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -955,7 +971,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -973,7 +989,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -983,7 +999,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -992,7 +1008,7 @@ public class LoyaltyCardViewActivityTest { activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -1010,7 +1026,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); database.close(); } @@ -1020,7 +1036,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1065,7 +1081,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1086,7 +1102,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, null, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1107,7 +1123,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, null, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1117,7 +1133,7 @@ public class LoyaltyCardViewActivityTest { activityController.resume(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.name(), false); + saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.name(), activity.getApplicationContext().getString(R.string.automatic), false); database.close(); } @@ -1127,7 +1143,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1137,7 +1153,7 @@ public class LoyaltyCardViewActivityTest { activityController.resume(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), activity.getApplicationContext().getString(R.string.noBarcode), false); + saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.anyDate), activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), activity.getApplicationContext().getString(R.string.noBarcode), activity.getApplicationContext().getString(R.string.automatic), false); database.close(); } @@ -1147,7 +1163,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(true, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1157,18 +1173,18 @@ public class LoyaltyCardViewActivityTest { activityController.resume(); // First check if the card is as expected - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), context.getString(R.string.automatic), null, null); // Complete empty barcode selection successfully selectBarcodeWithResult(activity, BARCODE_DATA, null, true); activityController.resume(); // Check if the barcode type is NO_BARCODE as expected - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), null, null); + checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), null, null); assertEquals(View.GONE, activity.findViewById(R.id.barcodeLayout).getVisibility()); // Check if the special NO_BARCODE string doesn't get saved - saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), false); + saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.anyDate), context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), context.getString(R.string.automatic), false); database.close(); } @@ -1178,7 +1194,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); Activity activity = (Activity) activityController.get(); @@ -1215,7 +1231,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); AppCompatActivity activity = (AppCompatActivity) activityController.get(); @@ -1311,7 +1327,7 @@ public class LoyaltyCardViewActivityTest { final Context context = ApplicationProvider.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase(); - long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null, 0); + long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, null, Color.BLACK, 0, null, 0); ActivityController activityController = createActivityWithLoyaltyCard(false, (int) cardId); AppCompatActivity activity = (AppCompatActivity) activityController.get(); @@ -1350,7 +1366,7 @@ public class LoyaltyCardViewActivityTest { public void importCard() { Date date = new Date(); - Uri importUri = Uri.parse("https://catima.app/share#store%3DExample%2BStore%26note%3D%26validfrom%3D" + date.getTime() + "%26expiry%3D" + date.getTime() + "%26balance%3D10.00%26balancetype%3DUSD%26cardid%3D123456%26barcodetype%3DAZTEC%26headercolor%3D-416706"); + Uri importUri = Uri.parse("https://catima.app/share#store%3DExample%2BStore%26note%3D%26validfrom%3D" + date.getTime() + "%26expiry%3D" + date.getTime() + "%26balance%3D10.00%26balancetype%3DUSD%26cardid%3D123456%26barcodetype%3DAZTEC%26barcodeencoding%3D" + StandardCharsets.UTF_8.name() + "%26headercolor%3D-416706"); Intent intent = new Intent(); intent.setData(importUri); @@ -1366,7 +1382,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", DateFormat.getDateInstance(DateFormat.LONG).format(date), DateFormat.getDateInstance(DateFormat.LONG).format(date), "10.00", "$", "123456", context.getString(R.string.sameAsCardId), "Aztec", StandardCharsets.UTF_8.name(), null, null); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); } @@ -1386,7 +1402,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "Aztec", null, null); + checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), "Aztec", context.getString(R.string.automatic), null, null); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); } } diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index edba9b332..3b1ad9b0c 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -97,7 +97,7 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -132,10 +132,10 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0); - DBHelper.insertLoyaltyCard(database, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0); + DBHelper.insertLoyaltyCard(database, "storeB", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "storeA", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "storeD", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 1, null,0); + DBHelper.insertLoyaltyCard(database, "storeC", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 1, null,0); assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -229,8 +229,8 @@ public class MainActivityTest { TabLayout groupTabs = mainActivity.findViewById(R.id.groups); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); DBHelper.insertGroup(database, "Group one"); List groups = new ArrayList<>(); @@ -485,8 +485,8 @@ public class MainActivityTest { SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), null, Color.BLACK, 0, null,0); String finalQuery = "store"; assert mSearchView != null; diff --git a/app/src/test/java/protect/card_locker/PkpassTest.kt b/app/src/test/java/protect/card_locker/PkpassTest.kt index 884b85c31..a6d16f8fe 100644 --- a/app/src/test/java/protect/card_locker/PkpassTest.kt +++ b/app/src/test/java/protect/card_locker/PkpassTest.kt @@ -14,6 +14,7 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.shadows.ShadowContentResolver import org.robolectric.shadows.ShadowLog import java.math.BigDecimal +import java.nio.charset.StandardCharsets import java.util.Date @RunWith(RobolectricTestRunner::class) @@ -101,6 +102,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -167,6 +169,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -264,6 +267,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -330,6 +334,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -373,6 +378,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -395,6 +401,7 @@ class PkpassTest { Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -485,6 +492,7 @@ class PkpassTest { Assert.assertEquals("No barcode", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(null, parsedCard.barcodeType) + Assert.assertEquals(null, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -551,6 +559,7 @@ class PkpassTest { Assert.assertEquals("No barcode", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(null, parsedCard.barcodeType) + Assert.assertEquals(null, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) @@ -612,6 +621,7 @@ class PkpassTest { Assert.assertEquals("ca4phaix1ahkahD2eiVi5iepahxa6rei", parsedCard.cardId) Assert.assertEquals(null, parsedCard.barcodeId) Assert.assertEquals(BarcodeFormat.QR_CODE, parsedCard.barcodeType!!.format()) + Assert.assertEquals(StandardCharsets.ISO_8859_1, parsedCard.barcodeEncoding) Assert.assertEquals(Color.parseColor("#0014e6"), parsedCard.headerColor) Assert.assertEquals(0, parsedCard.starStatus) Assert.assertEquals(0, parsedCard.archiveStatus) diff --git a/app/src/test/java/protect/card_locker/TestHelpers.java b/app/src/test/java/protect/card_locker/TestHelpers.java index 1704902a2..b2185d668 100644 --- a/app/src/test/java/protect/card_locker/TestHelpers.java +++ b/app/src/test/java/protect/card_locker/TestHelpers.java @@ -55,7 +55,7 @@ public class TestHelpers { for (int index = cardsToAdd; index > 0; index--) { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null,0); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, null, index, 0, null,0); boolean result = (id != -1); assertTrue(result); } diff --git a/app/src/test/java/protect/card_locker/contentprovider/CardsContentProviderTest.java b/app/src/test/java/protect/card_locker/contentprovider/CardsContentProviderTest.java index ffe75a639..fd3d5ef13 100644 --- a/app/src/test/java/protect/card_locker/contentprovider/CardsContentProviderTest.java +++ b/app/src/test/java/protect/card_locker/contentprovider/CardsContentProviderTest.java @@ -19,6 +19,8 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -94,13 +96,14 @@ public class CardsContentProviderTest { final String cardId = "a-card-id"; final String barcodeId = "barcode-id"; final CatimaBarcode barcodeType = CatimaBarcode.fromName("QR_CODE"); + final Charset barcodeEncoding = StandardCharsets.UTF_8; final int headerColor = 0xFFFF00FF; final int starStatus = 1; final long lastUsed = 1687112282000L; final int archiveStatus = 1; long id = DBHelper.insertLoyaltyCard( mDatabase, store, note, validFrom, expiry, balance, balanceType, - cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, + cardId, barcodeId, barcodeType, barcodeEncoding, headerColor, starStatus, lastUsed, archiveStatus ); assertEquals("expect first card", 1, id); diff --git a/app/src/test/res/protect/card_locker/catima_v2.csv b/app/src/test/res/protect/card_locker/catima_v2.csv index 57dbc79da..948679137 100644 --- a/app/src/test/res/protect/card_locker/catima_v2.csv +++ b/app/src/test/res/protect/card_locker/catima_v2.csv @@ -1,24 +1,25 @@ -2 - -_id -Health -Food -Fashion - -_id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus -1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,1,QR_CODE,0, -8,Clothes Store,Note about store,,,0,,a,,-5317,,0, -2,Department Store,,,1618041729,0,,A,,-9977996,,0, +2 + +_id +Health +Food +Fashion + +_id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,barcodetype,barcodeencoding,headercolor,starstatus,lastused,archive +4,Pharmacy,,,,0,,dhshsvshs,,,,-10902850,1,1766674633,0 +1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,QR_CODE,,1,0,1766674620,0 +9,cheese,,,,0,,Käseschnitte,,AZTEC,UTF-8,-5414233,0,1766674767,0 +8,Clothes Store,Note about store,,,0,,a,,,,-5317,0,1766674625,0 +2,Department Store,,,1618041729,0,,A,,,,-9977996,0,0,0 3,Grocery Store,"Multiline note about grocery store -with blank line",,,150,,dhd,,-9977996,,0, -4,Pharmacy,,,,0,,dhshsvshs,,-10902850,,1, -5,Restaurant,Note about restaurant here,,,0,,98765432,23456,-10902850,CODE_128,0, -6,Shoe Store,,,,12.50,EUR,a,-5317,,AZTEC,0, - -cardId,groupId -8,Fashion -3,Food -4,Health -5,Food -6,Fashion +with blank line",,,150,,dhd,,,,-9977996,0,1766674627,0 +5,Restaurant,Note about restaurant here,,,0,,98765432,23456,CODE_128,ISO-8859-1,-10902850,0,1766674774,0 +6,Shoe Store,,,,12.50,EUR,a,-5317,AZTEC,,,0,1766674629,0 + +cardId,groupId +4,Health +8,Fashion +3,Food +5,Food +6,Fashion