diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 90e4270dd..53ec2ea5c 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -21,7 +21,7 @@ import java.util.List; 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 = 15; + public static final int DATABASE_VERSION = 16; public static class LoyaltyCardDbGroups { public static final String TABLE = "groups"; @@ -33,6 +33,7 @@ public class DBHelper extends SQLiteOpenHelper { public static final String TABLE = "cards"; public static final String ID = "_id"; public static final String STORE = "store"; + public static final String VALID_FROM = "validfrom"; public static final String EXPIRY = "expiry"; public static final String BALANCE = "balance"; public static final String BALANCE_TYPE = "balancetype"; @@ -95,6 +96,7 @@ public class DBHelper extends SQLiteOpenHelper { LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," + LoyaltyCardDbIds.STORE + " TEXT not null," + LoyaltyCardDbIds.NOTE + " TEXT not null," + + LoyaltyCardDbIds.VALID_FROM + " INTEGER," + LoyaltyCardDbIds.EXPIRY + " INTEGER," + LoyaltyCardDbIds.BALANCE + " TEXT not null DEFAULT '0'," + LoyaltyCardDbIds.BALANCE_TYPE + " TEXT," + @@ -314,6 +316,11 @@ public class DBHelper extends SQLiteOpenHelper { db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + " ADD COLUMN " + LoyaltyCardDbIds.ARCHIVE_STATUS + " INTEGER DEFAULT '0' "); } + + if (oldVersion < 16 && newVersion >= 16) { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.VALID_FROM + " INTEGER"); + } } private static ContentValues generateFTSContentValues(final int id, final String store, final String note) { @@ -358,8 +365,8 @@ public class DBHelper extends SQLiteOpenHelper { } public static long insertLoyaltyCard( - final SQLiteDatabase database, final String store, final String note, final Date expiry, - final BigDecimal balance, final Currency balanceType, final String cardId, + 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 int starStatus, final Long lastUsed, final int archiveStatus) { database.beginTransaction(); @@ -368,6 +375,7 @@ public class DBHelper extends SQLiteOpenHelper { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.NOTE, note); + contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); @@ -391,9 +399,10 @@ public class DBHelper extends SQLiteOpenHelper { public static long insertLoyaltyCard( final SQLiteDatabase database, final int id, final String store, final String note, - 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 Long lastUsed, final int archiveStatus) { + 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 Long lastUsed, final int archiveStatus) { database.beginTransaction(); // Card @@ -401,6 +410,7 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.ID, id); contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.NOTE, note); + contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); @@ -424,15 +434,17 @@ public class DBHelper extends SQLiteOpenHelper { public static boolean updateLoyaltyCard( SQLiteDatabase database, final int id, final String store, final String note, - 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 Long lastUsed, final int archiveStatus) { + 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 Long lastUsed, final int archiveStatus) { database.beginTransaction(); // Card ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.NOTE, note); + contentValues.put(LoyaltyCardDbIds.VALID_FROM, validFrom != null ? validFrom.getTime() : null); contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 11477b991..e01cd1b6d 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -18,6 +18,7 @@ import java.util.List; public class ImportURIHelper { private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE; private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE; + private static final String VALID_FROM = DBHelper.LoyaltyCardDbIds.VALID_FROM; private static final String EXPIRY = DBHelper.LoyaltyCardDbIds.EXPIRY; private static final String BALANCE = DBHelper.LoyaltyCardDbIds.BALANCE; private static final String BALANCE_TYPE = DBHelper.LoyaltyCardDbIds.BALANCE_TYPE; @@ -62,6 +63,7 @@ public class ImportURIHelper { try { // These values are allowed to be null CatimaBarcode barcodeType = null; + Date validFrom = null; Date expiry = null; BigDecimal balance = new BigDecimal("0"); Currency balanceType = null; @@ -106,6 +108,10 @@ public class ImportURIHelper { if (unparsedBalanceType != null && !unparsedBalanceType.equals("")) { balanceType = Currency.getInstance(unparsedBalanceType); } + String unparsedValidFrom = kv.get(VALID_FROM); + if (unparsedValidFrom != null && !unparsedValidFrom.equals("")) { + validFrom = new Date(Long.parseLong(unparsedValidFrom)); + } String unparsedExpiry = kv.get(EXPIRY); if (unparsedExpiry != null && !unparsedExpiry.equals("")) { expiry = new Date(Long.parseLong(unparsedExpiry)); @@ -116,7 +122,7 @@ public class ImportURIHelper { headerColor = Integer.parseInt(unparsedHeaderColor); } - return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100,0); + return new LoyaltyCard(-1, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime(), 100, 0); } catch (NullPointerException | NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) { throw new InvalidObjectException("Not a valid import URI"); } @@ -149,6 +155,9 @@ public class ImportURIHelper { if (loyaltyCard.balanceType != null) { fragment = appendFragment(fragment, BALANCE_TYPE, loyaltyCard.balanceType.getCurrencyCode()); } + if (loyaltyCard.validFrom != null) { + fragment = appendFragment(fragment, VALID_FROM, String.valueOf(loyaltyCard.validFrom.getTime())); + } if (loyaltyCard.expiry != null) { fragment = appendFragment(fragment, EXPIRY, String.valueOf(loyaltyCard.expiry.getTime())); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 31255a043..d8cbdea9b 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -14,6 +14,7 @@ public class LoyaltyCard implements Parcelable { public final int id; public final String store; public final String note; + public final Date validFrom; public final Date expiry; public final BigDecimal balance; public final Currency balanceType; @@ -33,14 +34,16 @@ public class LoyaltyCard implements Parcelable { public final long lastUsed; public int zoomLevel; - public LoyaltyCard(final int id, final String store, final String note, final Date expiry, - final BigDecimal balance, final Currency balanceType, final String cardId, - @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, + public LoyaltyCard(final int id, final String store, final String note, final Date validFrom, + final Date expiry, final BigDecimal balance, final Currency balanceType, + final String cardId, @Nullable final String barcodeId, + @Nullable final CatimaBarcode barcodeType, @Nullable final Integer headerColor, final int starStatus, final long lastUsed, final int zoomLevel, final int archiveStatus) { this.id = id; this.store = store; this.note = note; + this.validFrom = validFrom; this.expiry = expiry; this.balance = balance; this.balanceType = balanceType; @@ -58,6 +61,8 @@ public class LoyaltyCard implements Parcelable { id = in.readInt(); store = in.readString(); note = in.readString(); + long tmpValidFrom = in.readLong(); + validFrom = tmpValidFrom != -1 ? new Date(tmpValidFrom) : null; long tmpExpiry = in.readLong(); expiry = tmpExpiry != -1 ? new Date(tmpExpiry) : null; balance = (BigDecimal) in.readValue(BigDecimal.class.getClassLoader()); @@ -79,6 +84,7 @@ public class LoyaltyCard implements Parcelable { parcel.writeInt(id); parcel.writeString(store); parcel.writeString(note); + parcel.writeLong(validFrom != null ? validFrom.getTime() : -1); parcel.writeLong(expiry != null ? expiry.getTime() : -1); parcel.writeValue(balance); parcel.writeValue(balanceType); @@ -96,6 +102,7 @@ public class LoyaltyCard implements Parcelable { int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)); String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)); + long validFromLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM)); long expiryLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)); BigDecimal balance = new BigDecimal(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)); @@ -111,6 +118,7 @@ public class LoyaltyCard implements Parcelable { CatimaBarcode barcodeType = null; Currency balanceType = null; + Date validFrom = null; Date expiry = null; Integer headerColor = null; @@ -122,6 +130,10 @@ public class LoyaltyCard implements Parcelable { balanceType = Currency.getInstance(cursor.getString(balanceTypeColumn)); } + if (validFromLong > 0) { + validFrom = new Date(validFromLong); + } + if (expiryLong > 0) { expiry = new Date(expiryLong); } @@ -130,7 +142,7 @@ public class LoyaltyCard implements Parcelable { headerColor = cursor.getInt(headerColorColumn); } - return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed, zoomLevel,archived); + return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed, zoomLevel, archived); } @Override diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 185025f04..b95f1c2eb 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -120,6 +120,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter expiryList = new ArrayList<>(); - expiryList.add(0, getString(R.string.never)); - expiryList.add(1, getString(R.string.chooseExpiryDate)); - ArrayAdapter expiryAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, expiryList); - expiryField.setAdapter(expiryAdapter); - } - }); + addDateFieldTextChangedListener(expiryField, R.string.never, R.string.chooseExpiryDate, LoyaltyCardField.expiry); balanceField.setOnFocusChangeListener((v, hasFocus) -> { if (!hasFocus) { @@ -779,7 +754,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } } else { // New card, use default values - tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, Utils.getUnixTime(), 100,0); + tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, null, new BigDecimal("0"), null, "", null, null, null, 0, Utils.getUnixTime(), 100,0); } } @@ -822,7 +797,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { storeFieldEdit.setText(tempLoyaltyCard.store); noteFieldEdit.setText(tempLoyaltyCard.note); - formatExpiryField(this, expiryField, tempLoyaltyCard.expiry); + formatDateField(this, validFromField, tempLoyaltyCard.validFrom); + formatDateField(this, expiryField, tempLoyaltyCard.expiry); formatBalanceCurrencyField(tempLoyaltyCard.balanceType); cardIdFieldView.setText(tempLoyaltyCard.cardId); barcodeIdField.setText(tempLoyaltyCard.barcodeId != null ? tempLoyaltyCard.barcodeId : getString(R.string.sameAsCardId)); @@ -957,13 +933,56 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } } - protected static void formatExpiryField(Context context, EditText expiryField, Date expiry) { - expiryField.setTag(expiry); + protected void addDateFieldTextChangedListener(AutoCompleteTextView dateField, @StringRes int defaultOptionStringId, @StringRes int chooseDateOptionStringId, LoyaltyCardField loyaltyCardField) { + dateField.addTextChangedListener(new SimpleTextWatcher() { + CharSequence lastValue; - if (expiry == null) { - expiryField.setText(context.getString(R.string.never)); + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + lastValue = s; + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (s.toString().equals(getString(defaultOptionStringId))) { + dateField.setTag(null); + } else if (s.toString().equals(getString(chooseDateOptionStringId))) { + if (!lastValue.toString().equals(getString(chooseDateOptionStringId))) { + dateField.setText(lastValue); + } + DialogFragment datePickerFragment = new DatePickerFragment(LoyaltyCardEditActivity.this, dateField); + datePickerFragment.show(getSupportFragmentManager(), "datePicker"); + } + + updateTempState(loyaltyCardField, dateField.getTag()); + } + + @Override + public void afterTextChanged(Editable s) { + ArrayList dropdownOptions = new ArrayList<>(); + dropdownOptions.add(0, getString(defaultOptionStringId)); + dropdownOptions.add(1, getString(chooseDateOptionStringId)); + ArrayAdapter dropdownOptionsAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, dropdownOptions); + dateField.setAdapter(dropdownOptionsAdapter); + } + }); + } + + protected static void formatDateField(Context context, EditText textField, Date date) { + textField.setTag(date); + + if (date == null) { + String text; + if (textField.getId() == R.id.validFromField) { + text = context.getString(R.string.anyDate); + } else if (textField.getId() == R.id.expiryField) { + text = context.getString(R.string.never); + } else { + throw new IllegalArgumentException("Unknown textField Id " + textField.getId()); + } + textField.setText(text); } else { - expiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(expiry)); + textField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(date)); } } @@ -1282,11 +1301,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { implements DatePickerDialog.OnDateSetListener { final Context context; - final EditText expiryFieldEdit; + final EditText textFieldEdit; - DatePickerFragment(Context context, EditText expiryFieldEdit) { + DatePickerFragment(Context context, EditText textFieldEdit) { this.context = context; - this.expiryFieldEdit = expiryFieldEdit; + this.textFieldEdit = textFieldEdit; } @NonNull @@ -1295,7 +1314,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); - Date date = (Date) expiryFieldEdit.getTag(); + Date date = (Date) textFieldEdit.getTag(); if (date != null) { c.setTime(date); } @@ -1331,7 +1350,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { Date date = new Date(unixTime); - formatExpiryField(context, expiryFieldEdit, date); + formatDateField(context, textFieldEdit, date); } } @@ -1372,9 +1391,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { // 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 (updateLoyaltyCard) { - DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, tempLoyaltyCard.starStatus, null, tempLoyaltyCard.archiveStatus); + DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.validFrom, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, tempLoyaltyCard.starStatus, null, tempLoyaltyCard.archiveStatus); } else { - loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, null, 0); + loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.validFrom, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, null, 0); } try { diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardField.java b/app/src/main/java/protect/card_locker/LoyaltyCardField.java index cecf4845d..a516630f8 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardField.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardField.java @@ -4,6 +4,7 @@ public enum LoyaltyCardField { id, store, note, + validFrom, expiry, balance, balanceType, diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index d761e5040..9928b43aa 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -43,6 +43,7 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.StringRes; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; @@ -73,7 +74,9 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Currency; +import java.util.Date; import java.util.List; +import java.util.function.Predicate; import protect.card_locker.async.TaskHandler; import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding; @@ -525,19 +528,9 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements infoText.append(getString(R.string.balanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType))); } - if (loyaltyCard.expiry != null) { - String formattedExpiry = DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry); + appendDateInfo(infoText, loyaltyCard.validFrom, (Utils::isNotYetValid), R.string.validFromSentence, R.string.validFromSentence); - padSpannableString(infoText); - if (Utils.hasExpired(loyaltyCard.expiry)) { - int start = infoText.length(); - - infoText.append(getString(R.string.expiryStateSentenceExpired, formattedExpiry)); - infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - } else { - infoText.append(getString(R.string.expiryStateSentence, formattedExpiry)); - } - } + appendDateInfo(infoText, loyaltyCard.expiry, (Utils::hasExpired), R.string.expiryStateSentenceExpired, R.string.expiryStateSentence); infoTextview.setText(infoText); @@ -546,6 +539,21 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements infoDialog.create().show(); } + private void appendDateInfo(SpannableStringBuilder infoText, Date date, Predicate dateCheck, @StringRes int dateCheckTrueString, @StringRes int dateCheckFalseString) { + if (date != null) { + String formattedDate = DateFormat.getDateInstance(DateFormat.LONG).format(date); + + padSpannableString(infoText); + if (dateCheck.test(date)) { + int start = infoText.length(); + infoText.append(getString(dateCheckTrueString, formattedDate)); + infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + infoText.append(getString(dateCheckFalseString, formattedDate)); + } + } + } + private void showBalanceUpdateDialog() { AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this); builder.setTitle(R.string.updateBalanceTitle); diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 0b466a0cb..1aa154ae6 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -15,6 +15,7 @@ import android.net.Uri; import android.os.Build; import android.os.LocaleList; import android.provider.MediaStore; +import android.text.format.DateUtils; import android.util.Log; import android.util.TypedValue; import android.view.MenuItem; @@ -214,7 +215,21 @@ public class Utils { } } + static public Boolean isNotYetValid(Date validFromDate) { + // The note in `hasExpired` does not apply here, since the bug was fixed before this feature was added. + return validFromDate.after(getStartOfToday().getTime()); + } + static public Boolean hasExpired(Date expiryDate) { + // Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate + // at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference + // is not a problem for the way the comparison currently works, it's good to keep in mind such + // dates may exist in the DB in case the comparison changes in the future and the new one relies + // on both dates being set at 12:00 AM. + return expiryDate.before(getStartOfToday().getTime()); + } + + static private Calendar getStartOfToday() { // today Calendar date = new GregorianCalendar(); // reset hour, minutes, seconds and millis @@ -222,13 +237,7 @@ public class Utils { date.set(Calendar.MINUTE, 0); date.set(Calendar.SECOND, 0); date.set(Calendar.MILLISECOND, 0); - - // Note: In #1083 it was discovered that `DatePickerFragment` may sometimes store the expiryDate - // at 12:00 PM instead of 12:00 AM in the DB. While this has been fixed and the 12-hour difference - // is not a problem for the way the comparison currently works, it's good to keep in mind such - // dates may exist in the DB in case the comparison changes in the future and the new one relies - // on both dates being set at 12:00 AM. - return expiryDate.before(date.getTime()); + return date; } static public String formatBalance(Context context, BigDecimal value, Currency currency) { 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 95a95decd..263782d8d 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -127,6 +127,7 @@ public class CatimaExporter implements Exporter { printer.printRecord(DBHelper.LoyaltyCardDbIds.ID, DBHelper.LoyaltyCardDbIds.STORE, DBHelper.LoyaltyCardDbIds.NOTE, + DBHelper.LoyaltyCardDbIds.VALID_FROM, DBHelper.LoyaltyCardDbIds.EXPIRY, DBHelper.LoyaltyCardDbIds.BALANCE, DBHelper.LoyaltyCardDbIds.BALANCE_TYPE, @@ -146,6 +147,7 @@ public class CatimaExporter implements Exporter { printer.printRecord(card.id, card.store, card.note, + card.validFrom != null ? card.validFrom.getTime() : "", card.expiry != null ? card.expiry.getTime() : "", card.balance, card.balanceType, 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 40c290b22..dbd35162c 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -286,6 +286,12 @@ public class CatimaImporter implements Importer { } String note = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIds.NOTE, record, ""); + Date validFrom = null; + try { + validFrom = new Date(CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.VALID_FROM, record, true)); + } catch (NullPointerException | FormatException e) { + } + Date expiry = null; try { expiry = new Date(CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record, true)); @@ -355,7 +361,7 @@ public class CatimaImporter implements Importer { // We catch this exception so we can still import old backups } - DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus); + DBHelper.insertLoyaltyCard(database, id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, archiveStatus); } /** @@ -380,4 +386,4 @@ public class CatimaImporter implements Importer { cardGroups.add(DBHelper.getGroup(database, groupId)); DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups); } -} \ No newline at end of file +} 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 62ab8c464..b1e411a0f 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -128,6 +128,6 @@ public class FidmeImporter implements Importer { // TODO: Front and back image - DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, null,archiveStatus); + DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, null,archiveStatus); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 9b519c910..e02321f69 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -234,7 +234,7 @@ public class StocardImporter implements Importer { headerColor = Utils.getHeaderColorFromImage(cardIcon, headerColor); } - long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, 0, null,0); + long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, 0, null,0); if (cardIcon != null) { Utils.saveCardImage(context, cardIcon, (int) loyaltyCardInternalId, ImageLocationType.icon); 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 20f475e10..b0d103366 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -126,7 +126,7 @@ public class VoucherVaultImporter implements Importer { throw new FormatException("Unknown colour type found: " + colorFromJSON); } - DBHelper.insertLoyaltyCard(database, store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(),0); + DBHelper.insertLoyaltyCard(database, store, "", null, expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(),0); } bufferedReader.close(); diff --git a/app/src/main/res/drawable/ic_valid_from_24dp.xml b/app/src/main/res/drawable/ic_valid_from_24dp.xml new file mode 100644 index 000000000..16e3fec65 --- /dev/null +++ b/app/src/main/res/drawable/ic_valid_from_24dp.xml @@ -0,0 +1,16 @@ + + + + + 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 35100103e..db2804639 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -311,6 +311,32 @@ + + + + + + + + + + + + Enter amount Current balance: %s New balance: %s - \ No newline at end of file + Valid from + Any date + Choose Valid from date + Valid from: %s + diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index 78e9429c7..b35f3bbad 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -43,7 +43,7 @@ public class DatabaseTest { @Test public void addRemoveOneGiftCard() { assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -52,6 +52,7 @@ public class DatabaseTest { assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); + assertEquals(null, loyaltyCard.validFrom); assertEquals(null, loyaltyCard.expiry); assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(null, loyaltyCard.balanceType); @@ -70,12 +71,12 @@ public class DatabaseTest { @Test public void updateGiftCard() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), 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, 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), DEFAULT_HEADER_COLOR, 0, null, 0); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -83,6 +84,7 @@ public class DatabaseTest { assertNotNull(loyaltyCard); assertEquals("store1", loyaltyCard.store); assertEquals("note1", loyaltyCard.note); + assertEquals(null, loyaltyCard.validFrom); assertEquals(null, loyaltyCard.expiry); assertEquals(new BigDecimal("10.00"), loyaltyCard.balance); assertEquals(Currency.getInstance("EUR"), loyaltyCard.balanceType); @@ -96,7 +98,7 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyStar() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -109,6 +111,7 @@ public class DatabaseTest { assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); + assertEquals(null, loyaltyCard.validFrom); assertEquals(null, loyaltyCard.expiry); assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(null, loyaltyCard.balanceType); @@ -124,7 +127,7 @@ public class DatabaseTest { public void updateMissingGiftCard() { assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", + 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); assertEquals(false, result); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -132,7 +135,7 @@ public class DatabaseTest { @Test public void emptyGiftCardValues() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", 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, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -141,6 +144,7 @@ public class DatabaseTest { assertNotNull(loyaltyCard); assertEquals("", loyaltyCard.store); assertEquals("", loyaltyCard.note); + assertEquals(null, loyaltyCard.validFrom); assertEquals(null, loyaltyCard.expiry); assertEquals(new BigDecimal("0"), loyaltyCard.balance); assertEquals(null, loyaltyCard.balanceType); @@ -159,7 +163,7 @@ public class DatabaseTest { // Add the gift cards in reverse order, to ensure // that they are sorted for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + 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); boolean result = (id != -1); assertTrue(result); @@ -177,6 +181,7 @@ public class DatabaseTest { for (int index = 0; index < CARDS_TO_ADD; index++) { assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); + assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM))); assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); @@ -204,10 +209,10 @@ public class DatabaseTest { // that they are sorted 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, new BigDecimal("0"), null, "cardId" + index, + 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); } else { - id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + 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); } boolean result = (id != -1); @@ -225,6 +230,7 @@ public class DatabaseTest { int index = CARDS_TO_ADD - 1; assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); + assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM))); assertEquals(0, cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); @@ -239,6 +245,7 @@ public class DatabaseTest { for (index = 0; index < CARDS_TO_ADD - 1; index++) { assertEquals("store" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); assertEquals("note" + index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); + assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.VALID_FROM))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY))); assertEquals("0", cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE))); assertEquals(null, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE))); @@ -305,7 +312,7 @@ public class DatabaseTest { public void updateGroup() { // Create card assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -417,7 +424,7 @@ public class DatabaseTest { public void cardAddAndRemoveGroups() { // Create card assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -478,6 +485,7 @@ public class DatabaseTest { LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId); assertEquals("store", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -493,6 +501,7 @@ public class DatabaseTest { LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2); assertEquals("store", card2.store); assertEquals("", card2.note); + assertEquals(null, card2.validFrom); assertEquals(null, card2.expiry); assertEquals(new BigDecimal("0"), card2.balance); assertEquals(null, card2.balanceType); @@ -507,7 +516,7 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyBalance() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), DEFAULT_HEADER_COLOR, 0, null,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -520,6 +529,7 @@ public class DatabaseTest { assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); + assertEquals(null, loyaltyCard.validFrom); assertEquals(null, loyaltyCard.expiry); assertEquals(new BigDecimal(60), loyaltyCard.balance); assertEquals(null, loyaltyCard.balanceType); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index b8e5a20a0..f71db4713 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -86,7 +86,7 @@ public class ImportExportTest { 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, 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, index, 0, null,0); boolean result = (id != -1); assertTrue(result); } @@ -100,7 +100,7 @@ public class ImportExportTest { for (int index = cardsToAdd; index > 4; index--) { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, 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, index, 1, null,0); boolean result = (id != -1); assertTrue(result); } @@ -108,7 +108,7 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); //if index is even - long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, 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, index, 0, null,0); boolean result = (id != -1); assertTrue(result); } @@ -117,13 +117,14 @@ public class ImportExportTest { @Test public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { - long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", 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, 0, 0, null,0); boolean result = (id != -1); assertTrue(result); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("No Expiry", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -133,13 +134,14 @@ public class ImportExportTest { assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", 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, 0, 0, null,0); result = (id != -1); assertTrue(result); card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Past", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertTrue(card.expiry.before(new Date())); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -149,13 +151,14 @@ public class ImportExportTest { assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", 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, 0, 0, null,0); result = (id != -1); assertTrue(result); card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Today", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertTrue(card.expiry.before(new Date(new Date().getTime() + 86400))); assertTrue(card.expiry.after(new Date(new Date().getTime() - 86400))); assertEquals(new BigDecimal("0"), card.balance); @@ -168,13 +171,14 @@ public class ImportExportTest { // 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", "", 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, 0, 0, null,0); result = (id != -1); assertTrue(result); card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Future", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertTrue(card.expiry.after(new Date(new Date().getTime() + 86400))); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -216,6 +220,7 @@ public class ImportExportTest { assertEquals(expectedStore, card.store); assertEquals(expectedNote, card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(null, card.balanceType); @@ -248,6 +253,7 @@ public class ImportExportTest { assertEquals(expectedStore, card.store); assertEquals(expectedNote, card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(null, card.balanceType); @@ -269,6 +275,7 @@ public class ImportExportTest { assertEquals(expectedStore, card.store); assertEquals(expectedNote, card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal(String.valueOf(index)), card.balance); assertEquals(null, card.balanceType); @@ -632,6 +639,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -669,6 +677,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -730,6 +739,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -767,6 +777,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -804,6 +815,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -860,6 +872,7 @@ public class ImportExportTest { assertEquals("store", card.store); assertEquals("note", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -889,7 +902,7 @@ public class ImportExportTest { HashMap loyaltyCardIconImages = new HashMap<>(); // Create card 1 - int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", 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), 1, 0, null,0); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); DBHelper.insertGroup(mDatabase, "One"); List groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One")); @@ -903,7 +916,7 @@ public class ImportExportTest { loyaltyCardIconImages.put(loyaltyCardId, launcherBitmap); // Create card 2 - loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", 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, 2, 1, null,0); loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); // Export everything @@ -927,6 +940,7 @@ public class ImportExportTest { assertEquals(loyaltyCard.id, dbLoyaltyCard.id); assertEquals(loyaltyCard.store, dbLoyaltyCard.store); assertEquals(loyaltyCard.note, dbLoyaltyCard.note); + assertEquals(loyaltyCard.validFrom, dbLoyaltyCard.validFrom); assertEquals(loyaltyCard.expiry, dbLoyaltyCard.expiry); assertEquals(loyaltyCard.balance, dbLoyaltyCard.balance); assertEquals(loyaltyCard.cardId, dbLoyaltyCard.cardId); @@ -990,16 +1004,16 @@ public class ImportExportTest { "Food\n" + "Fashion\n" + "\n" + - "_id,store,note,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus\n" + - "1,Card 1,Note 1,1618053234,100,USD,1234,5432,1,QR_CODE,0,\r\n" + - "8,Clothes Store,Note about store,,0,,a,,-5317,,0,\n" + - "2,Department Store,,1618041729,0,,A,,-9977996,,0,\n" + + "_id,store,note,validfrom,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus\n" + + "1,Card 1,Note 1,1601510400,1618053234,100,USD,1234,5432,1,QR_CODE,0,\r\n" + + "8,Clothes Store,Note about store,,,0,,a,,-5317,,0,\n" + + "2,Department Store,,,1618041729,0,,A,,-9977996,,0,\n" + "3,Grocery Store,\"Multiline note about grocery store\n" + "\n" + - "with blank line\",,150,,dhd,,-9977996,,0,\n" + - "4,Pharmacy,,,0,,dhshsvshs,,-10902850,,1,\n" + - "5,Restaurant,Note about restaurant here,,0,,98765432,23456,-10902850,CODE_128,0,\n" + - "6,Shoe Store,,,12.50,EUR,a,-5317,,AZTEC,0,\n" + + "with blank line\",,,150,,dhd,,-9977996,,0,\n" + + "4,Pharmacy,,,,0,,dhshsvshs,,-10902850,,1,\n" + + "5,Restaurant,Note about restaurant here,,,0,,98765432,23456,-10902850,CODE_128,0,\n" + + "6,Shoe Store,,,,12.50,EUR,a,-5317,,AZTEC,0,\n" + "\n" + "cardId,groupId\n" + "8,Fashion\n" + @@ -1037,6 +1051,7 @@ public class ImportExportTest { assertEquals("Card 1", card1.store); assertEquals("Note 1", card1.note); + assertEquals(new Date(1601510400), card1.validFrom); assertEquals(new Date(1618053234), card1.expiry); assertEquals(new BigDecimal("100"), card1.balance); assertEquals(Currency.getInstance("USD"), card1.balanceType); @@ -1053,6 +1068,7 @@ public class ImportExportTest { assertEquals("Clothes Store", card8.store); assertEquals("Note about store", card8.note); + assertEquals(null, card8.validFrom); assertEquals(null, card8.expiry); assertEquals(new BigDecimal("0"), card8.balance); assertEquals(null, card8.balanceType); @@ -1069,6 +1085,7 @@ public class ImportExportTest { assertEquals("Department Store", card2.store); assertEquals("", card2.note); + assertEquals(null, card2.validFrom); assertEquals(new Date(1618041729), card2.expiry); assertEquals(new BigDecimal("0"), card2.balance); assertEquals(null, card2.balanceType); @@ -1085,6 +1102,7 @@ public class ImportExportTest { assertEquals("Grocery Store", card3.store); assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note); + assertEquals(null, card3.validFrom); assertEquals(null, card3.expiry); assertEquals(new BigDecimal("150"), card3.balance); assertEquals(null, card3.balanceType); @@ -1101,6 +1119,7 @@ public class ImportExportTest { assertEquals("Pharmacy", card4.store); assertEquals("", card4.note); + assertEquals(null, card4.validFrom); assertEquals(null, card4.expiry); assertEquals(new BigDecimal("0"), card4.balance); assertEquals(null, card4.balanceType); @@ -1117,6 +1136,7 @@ public class ImportExportTest { assertEquals("Restaurant", card5.store); assertEquals("Note about restaurant here", card5.note); + assertEquals(null, card5.validFrom); assertEquals(null, card5.expiry); assertEquals(new BigDecimal("0"), card5.balance); assertEquals(null, card5.balanceType); @@ -1133,6 +1153,7 @@ public class ImportExportTest { assertEquals("Shoe Store", card6.store); assertEquals("", card6.note); + assertEquals(null, card6.validFrom); assertEquals(null, card6.expiry); assertEquals(new BigDecimal("12.50"), card6.balance); assertEquals(Currency.getInstance("EUR"), card6.balanceType); @@ -1161,6 +1182,7 @@ public class ImportExportTest { assertEquals("Hema", card.store); assertEquals("2021-03-24 18:35:08 UTC", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1173,6 +1195,7 @@ public class ImportExportTest { assertEquals("test", card.store); assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1185,6 +1208,7 @@ public class ImportExportTest { assertEquals("Albert Heijn", card.store); assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1215,6 +1239,7 @@ public class ImportExportTest { assertEquals("GAMMA", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1231,6 +1256,7 @@ public class ImportExportTest { assertEquals("Air Miles", card.store); assertEquals("szjsbs", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1248,6 +1274,7 @@ public class ImportExportTest { // I don't think we can know this one, but falling back to an unique store name is at least something assertEquals("63536738-d64b-48ae-aeb8-82761523fa67", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); @@ -1301,6 +1328,7 @@ public class ImportExportTest { assertEquals("Clothes Store", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(Currency.getInstance("USD"), card.balanceType); @@ -1314,6 +1342,7 @@ public class ImportExportTest { assertEquals("Department Store", card.store); assertEquals("", card.note); + assertEquals(null, card.validFrom); assertEquals(new Date(1616716800000L), card.expiry); assertEquals(new BigDecimal("3.5"), card.balance); assertEquals(Currency.getInstance("USD"), card.balanceType); diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 894a726f4..c43515319 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -42,7 +42,7 @@ public class ImportURITest { // Generate card Date date = new Date(); - DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, 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), Color.BLACK, 1, null,0); // Get card LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -56,6 +56,7 @@ public class ImportURITest { // Compare everything assertEquals(card.store, parsedCard.store); assertEquals(card.note, parsedCard.note); + assertEquals(card.validFrom, parsedCard.validFrom); assertEquals(card.expiry, parsedCard.expiry); assertEquals(card.balance, parsedCard.balance); assertEquals(card.balanceType, parsedCard.balanceType); @@ -71,7 +72,7 @@ public class ImportURITest { @Test public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException { // Generate card - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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, 0, null,0); // Get card LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -85,6 +86,7 @@ public class ImportURITest { // Compare everything assertEquals(card.store, parsedCard.store); assertEquals(card.note, parsedCard.note); + assertEquals(card.validFrom, parsedCard.validFrom); assertEquals(card.expiry, parsedCard.expiry); assertEquals(card.balance, parsedCard.balance); assertEquals(card.balanceType, parsedCard.balanceType); @@ -143,6 +145,7 @@ public class ImportURITest { // Compare everything assertEquals("store", parsedCard.store); assertEquals("note", parsedCard.note); + assertEquals(null, parsedCard.validFrom); assertEquals(null, parsedCard.expiry); assertEquals(new BigDecimal("0"), parsedCard.balance); assertEquals(null, parsedCard.balanceType); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 86bb83854..8aa0399e4 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -62,9 +62,10 @@ public class LoyaltyCardCursorAdapterTest { return viewHolder.itemView; } - private void checkView(final View view, final String store, final String note, final String expiry, final String balance, boolean checkFontSizes) { + private void checkView(final View view, final String store, final String note, final String validFrom, final String expiry, final String balance, boolean checkFontSizes) { final TextView storeField = view.findViewById(R.id.store); final TextView noteField = view.findViewById(R.id.note); + final TextView validFromField = view.findViewById(R.id.validFrom); final TextView expiryField = view.findViewById(R.id.expiry); final TextView balanceField = view.findViewById(R.id.balance); @@ -75,6 +76,7 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(mediumFontSize, (int) storeField.getTextSize()); assertEquals(smallFontSize, (int) noteField.getTextSize()); + assertEquals(smallFontSize, (int) validFromField.getTextSize()); assertEquals(smallFontSize, (int) expiryField.getTextSize()); } @@ -86,6 +88,13 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(View.GONE, noteField.getVisibility()); } + if (!validFrom.isEmpty()) { + assertEquals(View.VISIBLE, validFromField.getVisibility()); + assertEquals(validFrom, validFromField.getText().toString()); + } else { + assertEquals(View.GONE, validFromField.getVisibility()); + } + if (!expiry.isEmpty()) { assertEquals(View.VISIBLE, expiryField.getVisibility()); assertEquals(expiry, expiryField.getText().toString()); @@ -104,7 +113,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterEmptyNote() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -112,14 +121,14 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "", false); + checkView(view, card.store, card.note, "", "", "", false); cursor.close(); } @Test public void TestCursorAdapterWithNote() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -127,17 +136,17 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "", false); + checkView(view, card.store, card.note, "", "", "", false); cursor.close(); } @Test public void TestCursorAdapterFontSizes() { - Date expiryDate = new Date(); - String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate); + Date date = new Date(); + String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(date); - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", date, date, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -146,21 +155,21 @@ public class LoyaltyCardCursorAdapterTest { setFontScale(50); View view = createView(cursor); - checkView(view, card.store, card.note, dateString, "", true); + checkView(view, card.store, card.note, dateString, dateString, "", true); setFontScale(200); view = createView(cursor); - checkView(view, card.store, card.note, dateString, "", true); + checkView(view, card.store, card.note, dateString, dateString, "", true); cursor.close(); } @Test public void TestCursorAdapterStarring() { - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", 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, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,1)); - assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", 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, 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), 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)); assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -208,7 +217,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0Points() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -216,14 +225,14 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "", false); + checkView(view, card.store, card.note, "", "", "", false); cursor.close(); } @Test public void TestCursorAdapter0EUR() { - DBHelper.insertLoyaltyCard(mDatabase,"store", "", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -231,14 +240,14 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "", false); + checkView(view, card.store, card.note, "", "", "", false); cursor.close(); } @Test public void TestCursorAdapter100Points() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -246,14 +255,14 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "100 points", false); + checkView(view, card.store, card.note, "", "", "100 points", false); cursor.close(); } @Test public void TestCursorAdapter10USD() { - DBHelper.insertLoyaltyCard(mDatabase, "store", "note", 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), Color.BLACK, 0, null,0); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); @@ -261,7 +270,7 @@ public class LoyaltyCardCursorAdapterTest { View view = createView(cursor); - checkView(view, card.store, card.note, "", "$10.00", false); + checkView(view, card.store, card.note, "", "", "$10.00", false); cursor.close(); } diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 01f067b6a..14a35a7ac 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -51,6 +51,8 @@ import java.io.IOException; import java.math.BigDecimal; import java.text.DateFormat; import java.text.ParseException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Currency; import java.util.Date; @@ -121,6 +123,7 @@ public class LoyaltyCardViewActivityTest { */ private void saveLoyaltyCardWithArguments(final Activity activity, final String store, final String note, + final String validFrom, final String expiry, final BigDecimal balance, final String balanceType, @@ -137,6 +140,7 @@ public class LoyaltyCardViewActivityTest { final EditText storeField = activity.findViewById(R.id.storeNameEdit); final EditText noteField = activity.findViewById(R.id.noteEdit); + final TextInputLayout validFromView = activity.findViewById(R.id.validFromView); final TextInputLayout expiryView = activity.findViewById(R.id.expiryView); final EditText balanceView = activity.findViewById(R.id.balanceField); final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField); @@ -146,6 +150,7 @@ public class LoyaltyCardViewActivityTest { storeField.setText(store); noteField.setText(note); + validFromView.setTag(validFrom); expiryView.setTag(expiry); balanceView.setText(balance.toPlainString()); balanceCurrencyField.setText(balanceType); @@ -164,6 +169,13 @@ public class LoyaltyCardViewActivityTest { assertEquals(note, card.note); assertEquals(balance, card.balance); + // The special "Any date" string shouldn't actually be written to the loyalty card + if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) { + assertEquals(null, card.validFrom); + } else { + assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom); + } + // The special "Never" string shouldn't actually be written to the loyalty card if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) { assertEquals(null, card.expiry); @@ -289,11 +301,11 @@ public class LoyaltyCardViewActivityTest { } private void checkAllFields(final Activity activity, ViewMode mode, - final String store, final String note, final String expiryString, - final String balanceString, final String balanceTypeString, - final String cardId, final String barcodeId, - final String barcodeType, final Bitmap frontImage, - final Bitmap backImage) { + final String store, final String note, final String validFromString, + final String expiryString, final String balanceString, + final String balanceTypeString, final String cardId, + final String barcodeId, final String barcodeType, + final Bitmap frontImage, final Bitmap backImage) { if (mode == ViewMode.VIEW_CARD) { checkFieldProperties(activity, R.id.cardIdView, View.VISIBLE, cardId, FieldTypeView.TextView); } else { @@ -301,6 +313,7 @@ public class LoyaltyCardViewActivityTest { checkFieldProperties(activity, R.id.storeNameEdit, editVisibility, store, FieldTypeView.TextView); checkFieldProperties(activity, R.id.noteEdit, editVisibility, note, FieldTypeView.TextView); + checkFieldProperties(activity, R.id.validFromView, editVisibility, validFromString, FieldTypeView.TextInputLayout); checkFieldProperties(activity, R.id.expiryView, editVisibility, expiryString, FieldTypeView.TextInputLayout); checkFieldProperties(activity, R.id.balanceField, editVisibility, balanceString, FieldTypeView.TextView); checkFieldProperties(activity, R.id.balanceCurrencyField, editVisibility, balanceTypeString, FieldTypeView.TextView); @@ -328,7 +341,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check default settings - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); } @Test @@ -355,7 +368,7 @@ public class LoyaltyCardViewActivityTest { SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); if (!newCard) { - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); } activityController.start(); @@ -365,11 +378,12 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check default settings - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.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(), null, null); // Change everything final EditText storeField = activity.findViewById(R.id.storeNameEdit); final EditText noteField = activity.findViewById(R.id.noteEdit); + final EditText validFromField = activity.findViewById(R.id.validFromField); final EditText expiryField = activity.findViewById(R.id.expiryField); final EditText balanceField = activity.findViewById(R.id.balanceField); final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField); @@ -380,13 +394,15 @@ public class LoyaltyCardViewActivityTest { final ImageView backImageView = activity.findViewById(R.id.backImage); Currency currency = Currency.getInstance("EUR"); + Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS)); Date expiryDate = new Date(); Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle); Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done); storeField.setText("correct store"); noteField.setText("correct note"); - LoyaltyCardEditActivity.formatExpiryField(context, expiryField, expiryDate); + LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate); + LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate); balanceField.setText("100"); balanceTypeField.setText(currency.getSymbol()); cardIdField.setText("12345678"); @@ -398,7 +414,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check if changed - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", 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(), frontBitmap, backBitmap); // Resume activityController.pause(); @@ -407,7 +423,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(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(), frontBitmap, backBitmap); // Rotate to landscape activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); @@ -415,7 +431,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(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(), frontBitmap, backBitmap); // Rotate to portrait shadowOf(getMainLooper()).idle(); @@ -423,7 +439,7 @@ public class LoyaltyCardViewActivityTest { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // Check if no changes lost - checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(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(), frontBitmap, backBitmap); } } @@ -437,7 +453,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); } @Test @@ -495,18 +511,18 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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(), null, null); shadowOf(getMainLooper()).idle(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", 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(), true); } @Test @@ -519,7 +535,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); // Complete barcode capture in failure captureBarcodeWithResult(activity, false); @@ -527,7 +543,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); } @Test @@ -540,13 +556,13 @@ public class LoyaltyCardViewActivityTest { LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.ADD_CARD, "", "", 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(), null, null); // Cancel the loyalty card creation assertEquals(false, activity.isFinishing()); @@ -591,13 +607,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -609,13 +625,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", 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(), null, null); database.close(); } @@ -627,19 +643,19 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -651,19 +667,19 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Complete barcode capture successfully captureBarcodeWithResult(activity, true); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Cancel the loyalty card creation assertEquals(false, activity.isFinishing()); @@ -689,13 +705,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Set date to today MaterialAutoCompleteTextView expiryField = activity.findViewById(R.id.expiryField); @@ -709,7 +725,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -721,19 +737,19 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), 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.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(), null, null); database.close(); } @@ -745,13 +761,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Set balance to 10 points EditText balanceField = activity.findViewById(R.id.balanceField); @@ -780,7 +796,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -795,13 +811,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + 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); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); shadowOf(getMainLooper()).idle(); @@ -823,7 +839,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -835,13 +851,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Change barcode ID EditText barcodeField = activity.findViewById(R.id.barcodeIdField); @@ -854,7 +870,7 @@ public class LoyaltyCardViewActivityTest { AlertDialog updateBarcodeIdDialog = (AlertDialog) (ShadowDialog.getLatestDialog()); assertNull(updateBarcodeIdDialog); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -866,13 +882,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -887,7 +903,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -899,13 +915,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -923,7 +939,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -935,13 +951,13 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Change card ID EditText cardIdField = activity.findViewById(R.id.cardIdView); @@ -959,7 +975,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); database.close(); } @@ -970,7 +986,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); @@ -1015,7 +1031,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); @@ -1034,7 +1050,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); activityController.start(); activityController.visible(); @@ -1053,14 +1069,14 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", 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(), false); database.close(); } @@ -1071,14 +1087,14 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); // Save and check the loyalty card - saveLoyaltyCardWithArguments(activity, "store", "note", 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), false); database.close(); } @@ -1090,25 +1106,25 @@ public class LoyaltyCardViewActivityTest { final Context context = activity.getApplicationContext(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); // First check if the card is as expected - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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(), null, null); // Complete empty barcode selection successfully selectBarcodeWithResult(activity, BARCODE_DATA, "", true); activityController.resume(); // Check if the barcode type is NO_BARCODE as expected - checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", 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), 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.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), false); database.close(); } @@ -1119,7 +1135,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); final int LARGE_FONT_SIZE = 40; @@ -1153,7 +1169,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); activityController.resume(); @@ -1187,7 +1203,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); @@ -1291,7 +1307,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); + DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null,0); activityController.start(); activityController.visible(); @@ -1331,7 +1347,7 @@ public class LoyaltyCardViewActivityTest { public void importCard() { Date date = new Date(); - Uri importUri = Uri.parse("https://catima.app/share#store%3DExample%2BStore%26note%3D%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%26headercolor%3D-416706"); Intent intent = new Intent(); intent.setData(importUri); @@ -1347,7 +1363,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); - checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", 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", null, null); assertEquals(-416706, ((ColorDrawable) activity.findViewById(R.id.thumbnail).getBackground()).getColor()); } @@ -1367,7 +1383,7 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - checkAllFields(activity, ViewMode.ADD_CARD, "Example Store", "", context.getString(R.string.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", 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 4c3c12cb2..51497f549 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -96,7 +96,7 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "store", "note", 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), Color.BLACK, 0, null,0); assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -131,10 +131,10 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - DBHelper.insertLoyaltyCard(database, "storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null,0); - DBHelper.insertLoyaltyCard(database, "storeC", "note", 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), 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); assertEquals(View.VISIBLE, helpSection.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -225,8 +225,8 @@ public class MainActivityTest { TabLayout groupTabs = mainActivity.findViewById(R.id.groups); SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); - DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, 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, 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), 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.insertGroup(database, "Group one"); List groups = new ArrayList<>();