diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java index fa7af57612..0588bffda8 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.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 @@ private Bitmap generate() { } 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 1ca94e6fc7..783b82ab22 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 void onGlobalLayout() { 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 88ad9167bb..23b59d56bd 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.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 @@ 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 static class LoyaltyCardDbIds { 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 void onCreate(SQLiteDatabase db) { 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 void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 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 @@ private static void updateFTS(final SQLiteDatabase db, final int id, final Strin 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 static long insertLoyaltyCard( 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 static long insertLoyaltyCard( 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 static long insertLoyaltyCard( 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 static boolean updateLoyaltyCard( 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 static boolean updateLoyaltyCard( 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 99c904b7e4..b0e8d37ac8 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.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 LoyaltyCard parse(Uri uri) throws InvalidObjectException { 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 LoyaltyCard parse(Uri uri) throws InvalidObjectException { 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 LoyaltyCard parse(Uri uri) throws InvalidObjectException { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, 0, Utils.getUnixTime(), @@ -195,6 +206,9 @@ protected Uri toUri(LoyaltyCard loyaltyCard) throws UnsupportedEncodingException 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 b4fe334983..3a93183187 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.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 LoyaltyCard() { setCardId(""); setBarcodeId(null); setBarcodeType(null); + setBarcodeEncoding(null); setHeaderColor(null); setStarStatus(0); setLastUsed(Utils.getUnixTime()); @@ -124,7 +129,7 @@ public 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 LoyaltyCard(final int id, final String store, final String note, @Nullabl setCardId(cardId); setBarcodeId(barcodeId); setBarcodeType(barcodeType); + setBarcodeEncoding(barcodeEncoding); setHeaderColor(headerColor); setStarStatus(starStatus); setLastUsed(lastUsed); @@ -244,6 +250,10 @@ public void setBarcodeType(@Nullable CatimaBarcode barcodeType) { 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 void updateFromBundle(@NonNull Bundle bundle, boolean requireFull) { } 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 Bundle toBundle(Context context, List exportLimit) { 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 static LoyaltyCard fromCursor(Context context, Cursor cursor) { // 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 static LoyaltyCard fromCursor(Context context, Cursor cursor) { cardId, barcodeId, barcodeType, + barcodeEncoding, headerColor, starStatus, lastUsed, @@ -593,6 +615,7 @@ public static boolean isDuplicate(Context context, final LoyaltyCard a, final Lo 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 static boolean nullableBitmapsEqual(@Nullable Bitmap a, @Nullable Bitmap 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 String toString() { 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 2d57dd5a91..a15501c7d4 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.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 @@ protected void setLoyaltyCardBarcodeType(@Nullable CatimaBarcode barcodeType) { 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 @@ protected void onCreate(Bundle savedInstanceState) { 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 void afterTextChanged(Editable s) { } }); + 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 @@ protected void onResume() { 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 @@ private void doSave() { // 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 @@ private void generateBarcode() { 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 void onGlobalLayout() { 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 766355e7e0..3ede421190 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.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 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 @@ protected void onResume() { format = loyaltyCard.barcodeType; cardIdString = loyaltyCard.cardId; barcodeIdString = loyaltyCard.barcodeId; + barcodeEncoding = loyaltyCard.barcodeEncoding; binding.mainImageDescription.setText(loyaltyCard.cardId); @@ -959,6 +964,7 @@ private void drawBarcode(boolean addPadding) { 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 149236150c..b1638aadd7 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 44d5b23781..77c6ccb37a 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 static class Version { 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 6803e3cf24..a311dd1910 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 @@ private void writeCSV(Context context, SQLiteDatabase database, OutputStreamWrit 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 @@ private void writeCSV(Context context, SQLiteDatabase database, OutputStreamWrit 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 5cc348895c..a6567dd44e 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.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 Map saveAndDeduplicate(Context context, SQLiteDatabase 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 @@ private LoyaltyCard importLoyaltyCard(CSVRecord record) throws FormatException { 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 @@ private LoyaltyCard importLoyaltyCard(CSVRecord record) throws FormatException { 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 d60786ff60..4e61875e11 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 @@ private LoyaltyCard importLoyaltyCard(Context context, CSVRecord record) throws cardId, null, barcodeType, + null, headerColor, starStatus, Utils.getUnixTime(), @@ -181,7 +182,7 @@ public void saveAndDeduplicate(SQLiteDatabase database, final ImportedData data) 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 bf0dc076a7..2eaecd9f78 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 ImportedData importJSON(JSONArray jsonArray) throws FormatException, JSON cardId, null, barcodeType, + null, headerColor, 0, Utils.getUnixTime(), @@ -186,7 +187,7 @@ public void saveAndDeduplicate(SQLiteDatabase database, final ImportedData data) 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 83861d226e..d69dbc9cd2 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 5c89dc82e9..c84ac1567e 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.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 void setUp() { @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 void addRemoveOneGiftCard() { 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 void addRemoveOneGiftCard() { @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 void updateGiftCard() { 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 void updateGiftCard() { @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 void updateGiftCardOnlyStar() { 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 void updateMissingGiftCard() { 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 void emptyGiftCardValues() { 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 void giftCardsViaCursor() { // 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 void giftCardsViaCursor() { 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 void giftCardsViaCursor() { 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 void giftCardsViaCursor() { 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 void addRemoveOneGroup() { 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 void updateGroupDuplicate() { 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 void databaseUpgradeFromVersion1() { 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 void databaseUpgradeFromVersion1() { 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 void databaseUpgradeFromVersion1() { @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 void updateGiftCardOnlyBalance() { 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 370af487f8..e10d10d858 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.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 @@ private void addLoyaltyCardsFiveStarred() { 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 @@ private void addLoyaltyCardsFiveStarred() { 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 @@ private void addLoyaltyCardsFiveStarred() { @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 void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { 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 void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { 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 void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { 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 void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { 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 @@ private void checkLoyaltyCards() { 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 @@ private void checkLoyaltyCardsAndDuplicates(int numCards) { 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 @@ private void checkLoyaltyCardsFiveStarred() { 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 @@ private void checkLoyaltyCardsFiveStarred() { 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 void importWithoutColorsV1() { 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 void importWithoutNullColorsV1() { 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 void importWithNoBarcodeTypeV1() { 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 void importWithStarredFieldV1() { 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 void importWithNoStarredFieldV1() { 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 void importWithInvalidStarFieldV1() { 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 void exportImportV2Zip() throws FileNotFoundException { 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 void exportImportV2Zip() throws FileNotFoundException { 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 void exportImportV2Zip() throws FileNotFoundException { 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 void importV2CSV() { // 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 void importV2CSV() { 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 void importV2CSV() { 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 void importV2CSV() { 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 void importV2CSV() { 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 void importV2CSV() { 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 void importV2CSV() { 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 void importV2CSV() { 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 void importFidme() { 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 void importFidme() { 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 void importFidme() { 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 void importVoucherVault() { 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 void importVoucherVault() { 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 f0b8678271..370373ee75 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 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 void ensureNoDataLoss() throws InvalidObjectException, UnsupportedEncodin // 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 void ensureNoDataLoss() throws InvalidObjectException, UnsupportedEncodin 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 void ensureNoDataLoss() throws InvalidObjectException, UnsupportedEncodin @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 void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, 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 void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, @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 void parseWithTrailingSlash() throws InvalidObjectException, UnsupportedE 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 void parseAdditionalUnforeseenData() { 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 7f647c1614..05a4745dd1 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 @@ private void checkView(final View view, final String store, final String note, f @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 void TestCursorAdapterEmptyNote() { @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 void TestCursorAdapterWithNote() { @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 void TestCursorAdapterStarring() { @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 void TestCursorAdapter0Points() { @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 void TestCursorAdapter0EUR() { @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 void TestCursorAdapter100Points() { @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 2fc8d6121f..94644f9f98 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 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 @@ private void saveLoyaltyCardWithArguments(final Activity activity, 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 @@ private void saveLoyaltyCardWithArguments(final Activity activity, 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 @@ private void saveLoyaltyCardWithArguments(final Activity activity, 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 @@ private void saveLoyaltyCardWithArguments(final Activity activity, } 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 @@ private void checkAllFields(final Activity activity, ViewMode mode, 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 @@ private void checkAllFields(final Activity activity, ViewMode mode, 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 void noCrashOnRegionlessLocale() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void noDataLossOnResumeOrRotate() { 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 void startWithoutParametersCheckFieldsAvailable() { 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 void startWithoutParametersCaptureBarcodeCreateLoyaltyCard() throws IOExc 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 void startWithoutParametersCaptureBarcodeFailure() throws IOException { 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 void startWithoutParametersCaptureBarcodeFailure() throws IOException { 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 void startWithoutParametersCaptureBarcodeCancel() throws IOException { 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 void startWithLoyaltyCardEditModeCheckDisplay() throws IOException { 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 void startWithLoyaltyCardViewModeCheckDisplay() { 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 void startWithLoyaltyCardViewModeCheckDisplay() { 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 void startWithLoyaltyCardWithBarcodeUpdateBarcode() throws IOException { 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 void startWithLoyaltyCardWithBarcodeUpdateBarcode() throws IOException { 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 void startWithLoyaltyCardWithReceiptUpdateReceiptCancel() throws IOExcept 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 void startWithLoyaltyCardWithReceiptUpdateReceiptCancel() throws IOExcept 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 void startWithLoyaltyCardNoExpirySetExpiry() throws IOException { 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 void startWithLoyaltyCardNoExpirySetExpiry() throws IOException { 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 void startWithLoyaltyCardNoExpirySetExpiry() throws IOException { 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 void startWithLoyaltyCardExpirySetNoExpiry() throws IOException { 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 void startWithLoyaltyCardExpirySetNoExpiry() throws IOException { 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 void startWithLoyaltyCardNoBalanceSetBalance() throws IOException { 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 void startWithLoyaltyCardNoBalanceSetBalance() throws IOException { 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 void onFocusChange(View v, boolean hasFocus) { 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 void startWithLoyaltyCardBalanceSetNoBalance() throws IOException { 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 void startWithLoyaltyCardBalanceSetNoBalance() throws IOException { 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 void startWithLoyaltyCardBalanceSetNoBalance() throws IOException { 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 void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID() { 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 void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID() { 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 void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID() { 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 void startWithLoyaltyCardSameAsCardIDUpdateCardID() { 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 void startWithLoyaltyCardSameAsCardIDUpdateCardID() { 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 void startWithLoyaltyCardSameAsCardIDUpdateCardID() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate() { 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 void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate() { 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 void checkMenu() throws IOException { 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 void startWithoutParametersViewBack() { 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 void startWithoutColors() { 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 void startLoyaltyCardWithoutColorsSave() throws IOException, ParseExcepti 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 void startLoyaltyCardWithoutColorsSave() throws IOException, ParseExcepti 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 void startLoyaltyCardWithExplicitNoBarcodeSave() throws IOException, Pars 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 void startLoyaltyCardWithExplicitNoBarcodeSave() throws IOException, Pars 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 void removeBarcodeFromLoyaltyCard() throws IOException, ParseException { 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 void removeBarcodeFromLoyaltyCard() throws IOException, ParseException { 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 void checkPushStarIcon() { 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 void checkBarcodeFullscreenWorkflow() { 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 void checkNoBarcodeFullscreenWorkflow() { 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 void checkNoBarcodeFullscreenWorkflow() { 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 void importCard() { 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 void importCardOldFormat() { 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 edba9b3323..3b1ad9b0ca 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 void addOneLoyaltyCard() { 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 void addFourLoyaltyCardsTwoStarred() // Main screen showing starred card 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 void testFiltering() { 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 void testSearchQueryRestorationAfterNavigatingBack() { 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 884b85c31f..a6d16f8fea 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 1704902a27..b2185d6688 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 static void addLoyaltyCards(final SQLiteDatabase mDatabase, final int car 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 ffe75a6396..fd3d5ef13f 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.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 void testCards() { 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 57dbc79da0..948679137c 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