diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 38e0d71d5..eb534c186 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -66,7 +66,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo private void onClickAction(int position) { Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All); selected.moveToPosition(position); - LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(selected); + LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(CardShortcutConfigure.this, selected); Log.d(TAG, "Creating shortcut for card " + loyaltyCard.store + "," + loyaltyCard.id); diff --git a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java index 1e21fc6b8..b010b4b79 100644 --- a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java +++ b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java @@ -42,7 +42,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService { Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.Unarchived); return subscriber -> { while (loyaltyCardCursor.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(loyaltyCardCursor); + LoyaltyCard card = LoyaltyCard.fromCursor(this, loyaltyCardCursor); Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .putExtra(LoyaltyCardViewActivity.BUNDLE_ID, card.id); @@ -69,7 +69,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService { for (String controlId : controlIds) { Control control; Integer cardId = this.controlIdToCardId(controlId); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId); + LoyaltyCard card = DBHelper.getLoyaltyCard(this, mDatabase, cardId); if (card != null) { Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 7fd52962d..927b2ef32 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -332,10 +332,10 @@ public class DBHelper extends SQLiteOpenHelper { Set files = new HashSet<>(); Cursor cardCursor = getLoyaltyCardCursor(database); while (cardCursor.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor); + LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor); for (ImageLocationType imageLocationType : ImageLocationType.values()) { String name = Utils.getCardImageFileName(card.id, imageLocationType); - if (Utils.retrieveCardImageAsFile(context, name).exists()) { + if (card.getImageForImageLocationType(imageLocationType) != null) { files.add(name); } } @@ -535,14 +535,14 @@ public class DBHelper extends SQLiteOpenHelper { return (rowsUpdated == 1); } - public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) { + public static LoyaltyCard getLoyaltyCard(Context context, SQLiteDatabase database, final int id) { Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null); LoyaltyCard card = null; if (data.getCount() == 1) { data.moveToFirst(); - card = LoyaltyCard.fromCursor(data); + card = LoyaltyCard.fromCursor(context, data); } data.close(); diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index b733d71d4..61bcff3bc 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -125,7 +125,26 @@ public class ImportURIHelper { headerColor = Integer.parseInt(unparsedHeaderColor); } - return new LoyaltyCard(-1, store, note, validFrom, 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, + null, + null, + null + ); } catch (NumberFormatException | UnsupportedEncodingException | ArrayIndexOutOfBoundsException ex) { throw new InvalidObjectException("Not a valid import URI"); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 03473f9ea..d656c6d00 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -1,9 +1,9 @@ package protect.card_locker; +import android.content.Context; import android.database.Cursor; +import android.graphics.Bitmap; import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -14,7 +14,7 @@ import java.util.Date; import java.util.List; import java.util.Objects; -public class LoyaltyCard implements Parcelable { +public class LoyaltyCard { public int id; public String store; public String note; @@ -37,6 +37,13 @@ public class LoyaltyCard implements Parcelable { public int zoomLevel; public int archiveStatus; + @Nullable + public Bitmap imageThumbnail; + @Nullable + public Bitmap imageFront; + @Nullable + public Bitmap imageBack; + public static final String BUNDLE_LOYALTY_CARD_ID = "loyaltyCardId"; public static final String BUNDLE_LOYALTY_CARD_STORE = "loyaltyCardStore"; public static final String BUNDLE_LOYALTY_CARD_NOTE = "loyaltyCardNote"; @@ -52,6 +59,13 @@ public class LoyaltyCard implements Parcelable { public static final String BUNDLE_LOYALTY_CARD_LAST_USED = "loyaltyCardLastUsed"; public static final String BUNDLE_LOYALTY_CARD_ZOOM_LEVEL = "loyaltyCardZoomLevel"; public static final String BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS = "loyaltyCardArchiveStatus"; + public static final String BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL = "loyaltyCardImageThumbnail"; + public static final String BUNDLE_LOYALTY_CARD_IMAGE_FRONT = "loyaltyCardImageFront"; + public static final String BUNDLE_LOYALTY_CARD_IMAGE_BACK = "loyaltyCardImageBack"; + + private static final String TEMP_IMAGE_THUMBNAIL_FILE_NAME = "loyaltyCardTempImageThumbnailFileName"; + private static final String TEMP_IMAGE_FRONT_FILE_NAME = "loyaltyCardTempImageFrontFileName"; + private static final String TEMP_IMAGE_BACK_FILE_NAME = "loyaltyCardTempImageBackFileName"; /** * Create a loyalty card object with default values @@ -72,6 +86,9 @@ public class LoyaltyCard implements Parcelable { setLastUsed(Utils.getUnixTime()); setZoomLevel(100); setArchiveStatus(0); + setImageThumbnail(null); + setImageFront(null); + setImageBack(null); } /** @@ -97,7 +114,8 @@ public class LoyaltyCard implements Parcelable { @Nullable final Date expiry, final BigDecimal balance, @Nullable final Currency balanceType, final String cardId, @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, @Nullable final Integer headerColor, final int starStatus, - final long lastUsed, final int zoomLevel, final int archiveStatus) { + final long lastUsed, final int zoomLevel, final int archiveStatus, + @Nullable Bitmap imageThumbnail, @Nullable Bitmap imageFront, @Nullable Bitmap imageBack) { setId(id); setStore(store); setNote(note); @@ -113,6 +131,9 @@ public class LoyaltyCard implements Parcelable { setLastUsed(lastUsed); setZoomLevel(zoomLevel); setArchiveStatus(archiveStatus); + setImageThumbnail(imageThumbnail); + setImageFront(imageFront); + setImageBack(imageBack); } public void setId(int id) { @@ -187,60 +208,32 @@ public class LoyaltyCard implements Parcelable { this.archiveStatus = archiveStatus; } - protected LoyaltyCard(Parcel in) { - setId(in.readInt()); - setStore(Objects.requireNonNull(in.readString())); - setNote(Objects.requireNonNull(in.readString())); - long tmpValidFrom = in.readLong(); - setValidFrom(tmpValidFrom > 0 ? new Date(tmpValidFrom) : null); - long tmpExpiry = in.readLong(); - setExpiry(tmpExpiry > 0 ? new Date(tmpExpiry) : null); - setBalance((BigDecimal) in.readValue(BigDecimal.class.getClassLoader())); - setBalanceType((Currency) in.readValue(Currency.class.getClassLoader())); - setCardId(Objects.requireNonNull(in.readString())); - setBarcodeId(in.readString()); - String tmpBarcodeType = in.readString(); - setBarcodeType((tmpBarcodeType != null && !tmpBarcodeType.isEmpty()) ? CatimaBarcode.fromName(tmpBarcodeType) : null); - int tmpHeaderColor = in.readInt(); - setHeaderColor(tmpHeaderColor != -1 ? tmpHeaderColor : null); - setStarStatus(in.readInt()); - setLastUsed(in.readLong()); - setZoomLevel(in.readInt()); - setArchiveStatus(in.readInt()); + public void setImageThumbnail(@Nullable Bitmap imageThumbnail) { + this.imageThumbnail = imageThumbnail; } - @Override - public void writeToParcel(Parcel parcel, int flags) { - 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); - parcel.writeString(cardId); - parcel.writeString(barcodeId); - parcel.writeString(barcodeType != null ? barcodeType.name() : ""); - parcel.writeInt(headerColor != null ? headerColor : -1); - parcel.writeInt(starStatus); - parcel.writeLong(lastUsed); - parcel.writeInt(zoomLevel); - parcel.writeInt(archiveStatus); + public void setImageFront(@Nullable Bitmap imageFront) { + this.imageFront = imageFront; } - @NonNull - public static LoyaltyCard fromBundle(Bundle bundle, boolean requireFull) { - // Grab default card - LoyaltyCard loyaltyCard = new LoyaltyCard(); - - // Update from bundle - loyaltyCard.updateFromBundle(bundle, requireFull); - - // Return updated version - return loyaltyCard; + public void setImageBack(@Nullable Bitmap imageBack) { + this.imageBack = imageBack; } - public void updateFromBundle(@NonNull Bundle bundle, boolean requireFull) { + @Nullable + public Bitmap getImageForImageLocationType(ImageLocationType imageLocationType) { + if (imageLocationType == ImageLocationType.icon) { + return imageThumbnail; + } else if (imageLocationType == ImageLocationType.front) { + return imageFront; + } else if (imageLocationType == ImageLocationType.back) { + return imageBack; + } + + throw new IllegalArgumentException("Unknown image location type"); + } + + public void updateFromBundle(@NonNull Context context, @NonNull Bundle bundle, boolean requireFull) { if (bundle.containsKey(BUNDLE_LOYALTY_CARD_ID)) { setId(bundle.getInt(BUNDLE_LOYALTY_CARD_ID)); } else if (requireFull) { @@ -321,9 +314,39 @@ public class LoyaltyCard implements Parcelable { } else if (requireFull) { throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS); } + if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) { + String tempImageName = bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL); + if (tempImageName != null) { + setImageThumbnail(Utils.loadTempImage(context, tempImageName)); + } else { + setImageThumbnail(null); + } + } else if (requireFull) { + throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL); + } + if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) { + String tempImageName = bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT); + if (tempImageName != null) { + setImageFront(Utils.loadTempImage(context, tempImageName)); + } else { + setImageFront(null); + } + } else if (requireFull) { + throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_FRONT); + } + if (bundle.containsKey(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) { + String tempImageName = bundle.getString(BUNDLE_LOYALTY_CARD_IMAGE_BACK); + if (tempImageName != null) { + setImageBack(Utils.loadTempImage(context, tempImageName)); + } else { + setImageBack(null); + } + } else if (requireFull) { + throw new IllegalArgumentException("Missing key " + BUNDLE_LOYALTY_CARD_IMAGE_BACK); + } } - public Bundle toBundle(List exportLimit) { + public Bundle toBundle(Context context, List exportLimit) { boolean exportIsLimited = !exportLimit.isEmpty(); Bundle bundle = new Bundle(); @@ -373,11 +396,37 @@ public class LoyaltyCard implements Parcelable { if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS)) { bundle.putInt(BUNDLE_LOYALTY_CARD_ARCHIVE_STATUS, archiveStatus); } + // There is an (undocumented) size limit to bundles of around 2MB(?), when going over it you will experience a random crash + // So, instead of storing the bitmaps directly, we write the bitmap to a temp file and store the path + if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL)) { + if (imageThumbnail != null) { + Utils.saveTempImage(context, imageThumbnail, TEMP_IMAGE_THUMBNAIL_FILE_NAME, Bitmap.CompressFormat.PNG); + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, TEMP_IMAGE_THUMBNAIL_FILE_NAME); + } else { + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_THUMBNAIL, null); + } + } + if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_FRONT)) { + if (imageFront != null) { + Utils.saveTempImage(context, imageFront, TEMP_IMAGE_FRONT_FILE_NAME, Bitmap.CompressFormat.PNG); + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, TEMP_IMAGE_FRONT_FILE_NAME); + } else { + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_FRONT, null); + } + } + if (!exportIsLimited || exportLimit.contains(BUNDLE_LOYALTY_CARD_IMAGE_BACK)) { + if (imageBack != null) { + Utils.saveTempImage(context, imageBack, TEMP_IMAGE_BACK_FILE_NAME, Bitmap.CompressFormat.PNG); + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, TEMP_IMAGE_BACK_FILE_NAME); + } else { + bundle.putString(BUNDLE_LOYALTY_CARD_IMAGE_BACK, null); + } + } return bundle; } - public static LoyaltyCard fromCursor(Cursor cursor) { + public static LoyaltyCard fromCursor(Context context, Cursor cursor) { // id int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); // store @@ -414,11 +463,37 @@ public class LoyaltyCard implements Parcelable { int zoomLevel = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ZOOM_LEVEL)); // archiveStatus int archiveStatus = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ARCHIVE_STATUS)); + // imageThumbnail + Bitmap imageThumbnail = Utils.retrieveCardImage(context, id, ImageLocationType.icon); + // imageFront + Bitmap imageFront = Utils.retrieveCardImage(context, id, ImageLocationType.front); + // imageBack + Bitmap imageBack = Utils.retrieveCardImage(context, id, ImageLocationType.back); - return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, zoomLevel, archiveStatus); + return new LoyaltyCard( + id, + store, + note, + validFrom, + expiry, + balance, + balanceType, + cardId, + barcodeId, + barcodeType, + headerColor, + starStatus, + lastUsed, + zoomLevel, + archiveStatus, + imageThumbnail, + imageFront, + imageBack + ); } public static boolean isDuplicate(final LoyaltyCard a, final LoyaltyCard b) { + // Note: Bitmap comparing is slow, be careful when calling this method // Skip lastUsed & zoomLevel return a.id == b.id && // non-nullable int a.store.equals(b.store) && // non-nullable String @@ -433,12 +508,23 @@ public class LoyaltyCard implements Parcelable { b.barcodeType == null ? null : b.barcodeType.format()) && // nullable CatimaBarcode with no overridden .equals(), so we need to check .format() Utils.equals(a.headerColor, b.headerColor) && // nullable Integer a.starStatus == b.starStatus && // non-nullable int - a.archiveStatus == b.archiveStatus; // non-nullable int + a.archiveStatus == b.archiveStatus && // non-nullable int + nullableBitmapsEqual(a.imageThumbnail, b.imageThumbnail) && // nullable Bitmap + nullableBitmapsEqual(a.imageFront, b.imageFront) && // nullable Bitmap + nullableBitmapsEqual(a.imageBack, b.imageBack); // nullable Bitmap } - @Override - public int describeContents() { - return 0; + public static boolean nullableBitmapsEqual(@Nullable Bitmap a, @Nullable Bitmap b) { + if (a == null && b == null) { + return true; + } + + if (a != null && b != null) { + return a.sameAs(b); + } + + // One is null and the other isn't, so it's not equal + return false; } @NonNull @@ -447,7 +533,8 @@ public class LoyaltyCard implements Parcelable { return String.format( "LoyaltyCard{%n id=%s,%n store=%s,%n note=%s,%n validFrom=%s,%n expiry=%s,%n" + " balance=%s,%n balanceType=%s,%n cardId=%s,%n barcodeId=%s,%n barcodeType=%s,%n" - + " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n archiveStatus=%s%n}", + + " headerColor=%s,%n starStatus=%s,%n lastUsed=%s,%n zoomLevel=%s,%n archiveStatus=%s%n" + + " imageThumbnail=%s,%n imageFront=%s,%n imageBack=%s,%n}", this.id, this.store, this.note, @@ -462,19 +549,10 @@ public class LoyaltyCard implements Parcelable { this.starStatus, this.lastUsed, this.zoomLevel, - this.archiveStatus + this.archiveStatus, + this.imageThumbnail, + this.imageFront, + this.imageBack ); } - - public static final Creator CREATOR = new Creator() { - @Override - public LoyaltyCard createFromParcel(Parcel in) { - return new LoyaltyCard(in); - } - - @Override - public LoyaltyCard[] newArray(int size) { - return new LoyaltyCard[size]; - } - }; } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index f43aece3d..446df08bf 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -80,7 +80,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter mCropperLauncher; int mRequestedImage = 0; - int mCropperFinishedType = 0; UCrop.Options mCropperOptions; - boolean mFrontImageUnsaved = false; - boolean mBackImageUnsaved = false; - boolean mIconUnsaved = false; - - boolean mFrontImageRemoved = false; - boolean mBackImageRemoved = false; - boolean mIconRemoved = false; - final private TaskHandler mTasks = new TaskHandler(); // store system locale for Build.VERSION.SDK_INT < Build.VERSION_CODES.N @@ -288,7 +267,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements // If we have to import a loyalty card, do so if (updateLoyaltyCard || duplicateFromLoyaltyCardId) { - tempLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId); + tempLoyaltyCard = DBHelper.getLoyaltyCard(this, mDatabase, loyaltyCardId); if (tempLoyaltyCard == null) { Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); @@ -307,7 +286,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements // If the intent contains any loyalty card fields, override those fields in our current temp card if (b != null) { - tempLoyaltyCard.updateFromBundle(b, false); + tempLoyaltyCard.updateFromBundle(this, b, false); } Log.d(TAG, "Edit activity: id=" + loyaltyCardId @@ -321,56 +300,28 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements super.onSaveInstanceState(savedInstanceState); tabs = binding.tabs; savedInstanceState.putInt(STATE_TAB_INDEX, tabs.getSelectedTabPosition()); - savedInstanceState.putParcelable(STATE_TEMP_CARD, tempLoyaltyCard); + savedInstanceState.putBundle(STATE_TEMP_CARD, tempLoyaltyCard.toBundle(this, new ArrayList<>())); savedInstanceState.putSerializable(STATE_TEMP_CARD_FIELD, tempLoyaltyCardField); - savedInstanceState.putInt(STATE_REQUESTED_IMAGE, mRequestedImage); - - Object cardImageFrontObj = cardImageFront.getTag(); - if (mFrontImageUnsaved && (cardImageFrontObj instanceof Bitmap) && Utils.saveTempImage(this, (Bitmap) cardImageFrontObj, TEMP_UNSAVED_FRONT_IMAGE_NAME, TEMP_UNSAVED_IMAGE_FORMAT) != null) { - savedInstanceState.putInt(STATE_FRONT_IMAGE_UNSAVED, 1); - } else { - savedInstanceState.putInt(STATE_FRONT_IMAGE_UNSAVED, 0); - } - - Object cardImageBackObj = cardImageBack.getTag(); - if (mBackImageUnsaved && (cardImageBackObj instanceof Bitmap) && Utils.saveTempImage(this, (Bitmap) cardImageBackObj, TEMP_UNSAVED_BACK_IMAGE_NAME, TEMP_UNSAVED_IMAGE_FORMAT) != null) { - savedInstanceState.putInt(STATE_BACK_IMAGE_UNSAVED, 1); - } else { - savedInstanceState.putInt(STATE_BACK_IMAGE_UNSAVED, 0); - } - - Object thumbnailObj = thumbnail.getTag(); - if (mIconUnsaved && (thumbnailObj instanceof Bitmap) && Utils.saveTempImage(this, (Bitmap) thumbnailObj, TEMP_UNSAVED_ICON_NAME, TEMP_UNSAVED_IMAGE_FORMAT) != null) { - savedInstanceState.putInt(STATE_ICON_UNSAVED, 1); - } else { - savedInstanceState.putInt(STATE_ICON_UNSAVED, 0); - } savedInstanceState.putInt(STATE_UPDATE_LOYALTY_CARD, updateLoyaltyCard ? 1 : 0); savedInstanceState.putInt(STATE_HAS_CHANGED, hasChanged ? 1 : 0); - savedInstanceState.putInt(STATE_FRONT_IMAGE_REMOVED, mFrontImageRemoved ? 1 : 0); - savedInstanceState.putInt(STATE_BACK_IMAGE_REMOVED, mBackImageRemoved ? 1 : 0); - savedInstanceState.putInt(STATE_ICON_REMOVED, mIconRemoved ? 1 : 0); savedInstanceState.putInt(STATE_OPEN_SET_ICON_MENU, openSetIconMenu ? 1 : 0); } @Override public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { onRestoring = true; - tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD); + tempLoyaltyCard = new LoyaltyCard(); + Bundle tempCardBundle = savedInstanceState.getBundle(STATE_TEMP_CARD); + if (tempCardBundle != null) { + tempLoyaltyCard.updateFromBundle(this, tempCardBundle, true); + } tempLoyaltyCardField = (LoyaltyCardField) savedInstanceState.getSerializable(STATE_TEMP_CARD_FIELD); super.onRestoreInstanceState(savedInstanceState); tabs = binding.tabs; tabs.selectTab(tabs.getTabAt(savedInstanceState.getInt(STATE_TAB_INDEX))); - mRequestedImage = savedInstanceState.getInt(STATE_REQUESTED_IMAGE); - mFrontImageUnsaved = savedInstanceState.getInt(STATE_FRONT_IMAGE_UNSAVED) == 1; - mBackImageUnsaved = savedInstanceState.getInt(STATE_BACK_IMAGE_UNSAVED) == 1; - mIconUnsaved = savedInstanceState.getInt(STATE_ICON_UNSAVED) == 1; updateLoyaltyCard = savedInstanceState.getInt(STATE_UPDATE_LOYALTY_CARD) == 1; hasChanged = savedInstanceState.getInt(STATE_HAS_CHANGED) == 1; - mFrontImageRemoved = savedInstanceState.getInt(STATE_FRONT_IMAGE_REMOVED) == 1; - mBackImageRemoved = savedInstanceState.getInt(STATE_BACK_IMAGE_REMOVED) == 1; - mIconRemoved = savedInstanceState.getInt(STATE_ICON_REMOVED) == 1; openSetIconMenu = savedInstanceState.getInt(STATE_OPEN_SET_ICON_MENU) == 1; } @@ -425,7 +376,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements setLoyaltyCardStore(storeName); generateIcon(storeName); - if (storeName.length() == 0) { + if (storeName.isEmpty()) { storeFieldEdit.setError(getString(R.string.field_must_not_be_empty)); } else { storeFieldEdit.setError(null); @@ -705,7 +656,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements return; } - tempLoyaltyCard.updateFromBundle(resultIntentBundle, false); + tempLoyaltyCard.updateFromBundle(this, resultIntentBundle, false); generateBarcode(); hasChanged = true; } @@ -727,20 +678,13 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements if (bitmap != null) { if (requestedFrontImage()) { - mFrontImageRemoved = false; - mFrontImageUnsaved = true; - setCardImage(cardImageFront, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true); + setCardImage(ImageLocationType.front, cardImageFront, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true); } else if (requestedBackImage()) { - mBackImageRemoved = false; - mBackImageUnsaved = true; - setCardImage(cardImageBack, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true); + setCardImage(ImageLocationType.back, cardImageBack, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true); } else { - mIconRemoved = false; - mIconUnsaved = true; setThumbnailImage(Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_SMALL)); } Log.d("cropper", "mRequestedImage: " + mRequestedImage); - mCropperFinishedType = mRequestedImage; hasChanged = true; } else { Toast.makeText(LoyaltyCardEditActivity.this, R.string.errorReadingImage, Toast.LENGTH_LONG).show(); @@ -813,26 +757,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements return mRequestedImage == Utils.CARD_IMAGE_FROM_CAMERA_FRONT || mRequestedImage == Utils.CARD_IMAGE_FROM_FILE_FRONT; } - private boolean croppedFrontImage() { - return mCropperFinishedType == Utils.CARD_IMAGE_FROM_CAMERA_FRONT || mCropperFinishedType == Utils.CARD_IMAGE_FROM_FILE_FRONT; - } - private boolean requestedBackImage() { return mRequestedImage == Utils.CARD_IMAGE_FROM_CAMERA_BACK || mRequestedImage == Utils.CARD_IMAGE_FROM_FILE_BACK; } - private boolean croppedBackImage() { - return mCropperFinishedType == Utils.CARD_IMAGE_FROM_CAMERA_BACK || mCropperFinishedType == Utils.CARD_IMAGE_FROM_FILE_BACK; - } - private boolean requestedIcon() { return mRequestedImage == Utils.CARD_IMAGE_FROM_CAMERA_ICON || mRequestedImage == Utils.CARD_IMAGE_FROM_FILE_ICON; } - private boolean croppedIcon() { - return mCropperFinishedType == Utils.CARD_IMAGE_FROM_CAMERA_ICON || mCropperFinishedType == Utils.CARD_IMAGE_FROM_FILE_ICON; - } - @SuppressLint("DefaultLocale") @Override protected void onResume() { @@ -842,40 +774,12 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements onResuming = true; - if (!initDone) { - if (updateLoyaltyCard) { - setTitle(R.string.editCardTitle); - } else { - setTitle(R.string.addCardTitle); - } - - if (updateLoyaltyCard || duplicateFromLoyaltyCardId) { - if (!mFrontImageUnsaved && !croppedFrontImage() && !mFrontImageRemoved) { - setCardImage(cardImageFront, Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.front), true); - } - if (!mBackImageUnsaved && !croppedBackImage() && !mBackImageRemoved) { - setCardImage(cardImageBack, Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.back), true); - } - if (!mIconUnsaved && !croppedIcon() && !mIconRemoved) { - setThumbnailImage(Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.icon)); - } - } else { - setTitle(R.string.addCardTitle); - } - - if (mFrontImageUnsaved && !croppedFrontImage()) { - setCardImage(cardImageFront, Utils.loadTempImage(this, TEMP_UNSAVED_FRONT_IMAGE_NAME), true); - } - if (mBackImageUnsaved && !croppedBackImage()) { - setCardImage(cardImageBack, Utils.loadTempImage(this, TEMP_UNSAVED_BACK_IMAGE_NAME), true); - } - if (mIconUnsaved && !croppedIcon()) { - setThumbnailImage(Utils.loadTempImage(this, TEMP_UNSAVED_ICON_NAME)); - } + if (updateLoyaltyCard) { + setTitle(R.string.editCardTitle); + } else { + setTitle(R.string.addCardTitle); } - mCropperFinishedType = 0; - boolean hadChanges = hasChanged; storeFieldEdit.setText(tempLoyaltyCard.store); @@ -961,6 +865,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } } + setThumbnailImage(tempLoyaltyCard.imageThumbnail); + setCardImage(ImageLocationType.front, cardImageFront, tempLoyaltyCard.imageFront, true); + setCardImage(ImageLocationType.back, cardImageBack, tempLoyaltyCard.imageBack, true); + // Initialization has finished if (!initDone) { initDone = true; @@ -1000,7 +908,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } protected void setThumbnailImage(@Nullable Bitmap bitmap) { - setCardImage(thumbnail, bitmap, false); + setCardImage(ImageLocationType.icon, thumbnail, bitmap, false); if (bitmap != null) { int headerColor = Utils.getHeaderColorFromImage(bitmap, Utils.getHeaderColor(this, tempLoyaltyCard)); @@ -1021,8 +929,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } } - protected void setCardImage(ImageView imageView, Bitmap bitmap, boolean applyFallback) { - imageView.setTag(bitmap); + protected void setCardImage(ImageLocationType imageLocationType, ImageView imageView, Bitmap bitmap, boolean applyFallback) { + if (imageLocationType == ImageLocationType.icon) { + tempLoyaltyCard.setImageThumbnail(bitmap); + } else if (imageLocationType == ImageLocationType.front) { + tempLoyaltyCard.setImageFront(bitmap); + } else if (imageLocationType == ImageLocationType.back) { + tempLoyaltyCard.setImageBack(bitmap); + } else { + throw new IllegalArgumentException("Unknown image type"); + } if (bitmap != null) { imageView.setImageBitmap(bitmap); @@ -1279,30 +1195,30 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements class ChooseCardImage implements View.OnClickListener { @Override public void onClick(View v) throws NoSuchElementException { + Bitmap currentImage; + ImageLocationType imageLocationType; ImageView targetView; if (v.getId() == R.id.frontImageHolder) { + currentImage = tempLoyaltyCard.imageFront; + imageLocationType = ImageLocationType.front; targetView = cardImageFront; } else if (v.getId() == R.id.backImageHolder) { + currentImage = tempLoyaltyCard.imageBack; + imageLocationType = ImageLocationType.back; targetView = cardImageBack; } else if (v.getId() == R.id.thumbnail) { + currentImage = tempLoyaltyCard.imageThumbnail; + imageLocationType = ImageLocationType.icon; targetView = thumbnail; } else { throw new IllegalArgumentException("Invalid IMAGE ID " + v.getId()); } LinkedHashMap> cardOptions = new LinkedHashMap<>(); - if (targetView.getTag() != null && v.getId() != R.id.thumbnail) { + if (currentImage != null && v.getId() != R.id.thumbnail) { cardOptions.put(getString(R.string.removeImage), () -> { - if (targetView == cardImageFront) { - mFrontImageRemoved = true; - mFrontImageUnsaved = false; - } else { - mBackImageRemoved = true; - mBackImageUnsaved = false; - } - - setCardImage(targetView, null, true); + setCardImage(imageLocationType, targetView, null, true); return null; }); } @@ -1358,21 +1274,17 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements }); if (v.getId() == R.id.thumbnail) { - if (cardImageFront.getTag() instanceof Bitmap) { + if (tempLoyaltyCard.imageFront != null) { cardOptions.put(getString(R.string.useFrontImage), () -> { - mIconRemoved = false; - mIconUnsaved = true; - setThumbnailImage(Utils.resizeBitmap((Bitmap) cardImageFront.getTag(), Utils.BITMAP_SIZE_SMALL)); + setThumbnailImage(Utils.resizeBitmap(tempLoyaltyCard.imageFront, Utils.BITMAP_SIZE_SMALL)); return null; }); } - if (cardImageBack.getTag() instanceof Bitmap) { + if (tempLoyaltyCard.imageBack != null) { cardOptions.put(getString(R.string.useBackImage), () -> { - mIconRemoved = false; - mIconUnsaved = true; - setThumbnailImage(Utils.resizeBitmap((Bitmap) cardImageBack.getTag(), Utils.BITMAP_SIZE_SMALL)); + setThumbnailImage(Utils.resizeBitmap(tempLoyaltyCard.imageBack, Utils.BITMAP_SIZE_SMALL)); return null; }); @@ -1423,8 +1335,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements setLoyaltyCardHeaderColor(color); // Unset image if set - mIconRemoved = true; - mIconUnsaved = false; setThumbnailImage(null); } @@ -1602,16 +1512,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements } try { - Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front); - Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back); - Utils.saveCardImage(this, (Bitmap) thumbnail.getTag(), loyaltyCardId, ImageLocationType.icon); + Utils.saveCardImage(this, tempLoyaltyCard.imageFront, loyaltyCardId, ImageLocationType.front); + Utils.saveCardImage(this, tempLoyaltyCard.imageBack, loyaltyCardId, ImageLocationType.back); + Utils.saveCardImage(this, tempLoyaltyCard.imageThumbnail, loyaltyCardId, ImageLocationType.icon); } catch (FileNotFoundException e) { e.printStackTrace(); } DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, selectedGroups); - ShortcutHelper.updateShortcuts(this, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); + ShortcutHelper.updateShortcuts(this, DBHelper.getLoyaltyCard(this, mDatabase, loyaltyCardId)); if (duplicateFromLoyaltyCardId) { Intent intent = new Intent(getApplicationContext(), MainActivity.class); @@ -1745,7 +1655,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements return; } - if (thumbnail.getTag() == null) { + if (tempLoyaltyCard.imageThumbnail == null) { thumbnail.setBackgroundColor(tempLoyaltyCard.headerColor); LetterBitmap letterBitmap = Utils.generateIcon(this, store, tempLoyaltyCard.headerColor); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 71d898d2e..fdd0c6594 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -660,7 +660,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements window.setAttributes(attributes); } - loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId); + loyaltyCard = DBHelper.getLoyaltyCard(this, database, loyaltyCardId); if (loyaltyCard == null) { Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 78f0880af..c5c7fa8be 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -429,7 +429,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard @Override public void onUserChoseParseResult(ParseResult parseResult) { Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - Bundle bundle = parseResult.toLoyaltyCardBundle(); + Bundle bundle = parseResult.toLoyaltyCardBundle(MainActivity.this); if (group != null) { bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group); } diff --git a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java index 258d5ddec..e0f41e0cb 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java @@ -33,7 +33,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { @Override public void onBindViewHolder(LoyaltyCardListItemViewHolder inputHolder, Cursor inputCursor) { - LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(inputCursor); + LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(mContext, inputCursor); Boolean overlayValue = mInGroupOverlay.get(loyaltyCard.id); if ((overlayValue != null ? overlayValue : isLoyaltyCardInGroup(loyaltyCard.id))) { mAnimationItemsIndex.put(inputCursor.getPosition(), true); diff --git a/app/src/main/java/protect/card_locker/ParseResult.kt b/app/src/main/java/protect/card_locker/ParseResult.kt index 190db5ec1..d1bb634a0 100644 --- a/app/src/main/java/protect/card_locker/ParseResult.kt +++ b/app/src/main/java/protect/card_locker/ParseResult.kt @@ -1,5 +1,6 @@ package protect.card_locker +import android.content.Context import android.os.Bundle class ParseResult( @@ -7,9 +8,9 @@ class ParseResult( val loyaltyCard: LoyaltyCard) { var note: String? = null - fun toLoyaltyCardBundle(): Bundle { + fun toLoyaltyCardBundle(context: Context): Bundle { when (parseResultType) { - ParseResultType.FULL -> return loyaltyCard.toBundle(listOf()) + ParseResultType.FULL -> return loyaltyCard.toBundle(context, listOf()) ParseResultType.BARCODE_ONLY -> { val defaultLoyaltyCard = LoyaltyCard() defaultLoyaltyCard.setBarcodeId(null) @@ -17,6 +18,7 @@ class ParseResult( defaultLoyaltyCard.setCardId(loyaltyCard.cardId) return defaultLoyaltyCard.toBundle( + context, listOf( LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_ID, LoyaltyCard.BUNDLE_LOYALTY_CARD_BARCODE_TYPE, diff --git a/app/src/main/java/protect/card_locker/PkpassParser.kt b/app/src/main/java/protect/card_locker/PkpassParser.kt index 313196b6c..d3c325826 100644 --- a/app/src/main/java/protect/card_locker/PkpassParser.kt +++ b/app/src/main/java/protect/card_locker/PkpassParser.kt @@ -125,7 +125,10 @@ class PkpassParser(context: Context, uri: Uri?) { starStatus, lastUsed, zoomLevel, - archiveStatus + archiveStatus, + image, + null, + null ) } diff --git a/app/src/main/java/protect/card_locker/ScanActivity.java b/app/src/main/java/protect/card_locker/ScanActivity.java index f2b7ef135..5aa33a5fa 100644 --- a/app/src/main/java/protect/card_locker/ScanActivity.java +++ b/app/src/main/java/protect/card_locker/ScanActivity.java @@ -299,7 +299,7 @@ public class ScanActivity extends CatimaAppCompatActivity { private void returnResult(ParseResult parseResult) { Intent result = new Intent(); - Bundle bundle = parseResult.toLoyaltyCardBundle(); + Bundle bundle = parseResult.toLoyaltyCardBundle(ScanActivity.this); if (addGroup != null) { bundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, addGroup); } diff --git a/app/src/main/java/protect/card_locker/ShortcutHelper.java b/app/src/main/java/protect/card_locker/ShortcutHelper.java index bd9d7f115..9b93e9598 100644 --- a/app/src/main/java/protect/card_locker/ShortcutHelper.java +++ b/app/src/main/java/protect/card_locker/ShortcutHelper.java @@ -86,7 +86,7 @@ class ShortcutHelper { for (int index = 0; index < list.size(); index++) { ShortcutInfoCompat prevShortcut = list.get(index); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId())); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, Integer.parseInt(prevShortcut.getId())); // skip outdated cards that no longer exist if (loyaltyCard != null) { diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 4fb9e1441..6817605d2 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -176,7 +176,6 @@ public class Utils { } static public List retrieveBarcodesFromPkPass(Context context, Uri uri) { - // FIXME: Also return image Log.i(TAG, "Received Pkpass file with possible barcode"); if (uri == null) { Log.e(TAG, "Pkpass did not contain any data"); @@ -836,7 +835,7 @@ public class Utils { } } - public static Bitmap loadImage(String path) { + public static @Nullable Bitmap loadImage(String path) { try { return BitmapFactory.decodeStream(new FileInputStream(path)); } catch (IOException e) { @@ -845,7 +844,7 @@ public class Utils { } } - public static Bitmap loadTempImage(Context context, String name) { + public static @Nullable Bitmap loadTempImage(Context context, String name) { return loadImage(context.getCacheDir() + "/" + name); } 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 530f9c194..c56e75666 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -49,7 +49,7 @@ public class CatimaExporter implements Exporter { // Generate CSV ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream(); OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8); - writeCSV(database, catimaOutputStreamWriter); + writeCSV(context, database, catimaOutputStreamWriter); // Add CSV to zip file ZipParameters csvZipParameters = createZipParameters("catima.csv", password); @@ -64,12 +64,12 @@ public class CatimaExporter implements Exporter { Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database); while (cardCursor.moveToNext()) { // For each card - LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor); + LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor); // For each image for (ImageLocationType imageLocationType : ImageLocationType.values()) { // If it exists, add to the .zip file - Bitmap image = Utils.retrieveCardImage(context, card.id, imageLocationType); + Bitmap image = card.getImageForImageLocationType(imageLocationType); if (image != null) { ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, imageLocationType), password); zipOutputStream.putNextEntry(imageZipParameters); @@ -95,7 +95,7 @@ public class CatimaExporter implements Exporter { return zipParameters; } - private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException { + private void writeCSV(Context context, SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException { CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180); // Print the version @@ -142,7 +142,7 @@ public class CatimaExporter implements Exporter { Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database); while (cardCursor.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor); + LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor); printer.printRecord(card.id, card.store, @@ -176,7 +176,7 @@ public class CatimaExporter implements Exporter { Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database); while (cardCursor2.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(cardCursor2); + LoyaltyCard card = LoyaltyCard.fromCursor(context, cardCursor2); for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) { printer.printRecord(card.id, group._id); 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 cca491f2d..08e3f97a7 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -124,7 +124,7 @@ public class CatimaImporter implements Importer { Set existingImages = DBHelper.imageFiles(context, database); for (LoyaltyCard card : data.cards) { - LoyaltyCard existing = DBHelper.getLoyaltyCard(database, card.id); + LoyaltyCard existing = DBHelper.getLoyaltyCard(context, database, card.id); if (existing == null) { DBHelper.insertLoyaltyCard(database, card.id, card.store, card.note, card.validFrom, card.expiry, card.balance, card.balanceType, card.cardId, card.barcodeId, card.barcodeType, card.headerColor, card.starStatus, card.lastUsed, card.archiveStatus); @@ -490,7 +490,26 @@ public class CatimaImporter implements Importer { // We catch this exception so we can still import old backups } - return new LoyaltyCard(id, store, note, validFrom, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed, DBHelper.DEFAULT_ZOOM_LEVEL, archiveStatus); + return new LoyaltyCard( + id, + store, + note, + validFrom, + expiry, + balance, + balanceType, + cardId, + barcodeId, + barcodeType, + headerColor, + starStatus, + lastUsed, + DBHelper.DEFAULT_ZOOM_LEVEL, + archiveStatus, + null, + null, + null + ); } /** 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 9275ff203..e25a41d16 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -149,7 +149,26 @@ public class FidmeImporter implements Importer { // TODO: Front and back image // use -1 for the ID, it will be ignored when inserting the card into the DB - return new LoyaltyCard(-1, store, note, null, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, headerColor, starStatus, Utils.getUnixTime(), DBHelper.DEFAULT_ZOOM_LEVEL, archiveStatus); + return new LoyaltyCard( + -1, + store, + note, + null, + null, + BigDecimal.valueOf(0), + null, + cardId, + null, + barcodeType, + headerColor, + starStatus, + Utils.getUnixTime(), + DBHelper.DEFAULT_ZOOM_LEVEL, + archiveStatus, + null, + null, + null + ); } public void saveAndDeduplicate(SQLiteDatabase database, final ImportedData data) { 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 94aa98aa2..c022696bb 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -354,7 +354,26 @@ public class StocardImporter implements Importer { long lastUsed = record.lastUsed != null ? record.lastUsed : Utils.getUnixTime(); - LoyaltyCard card = new LoyaltyCard(tempID, store, note, null, null, BigDecimal.valueOf(0), null, record.cardId, null, barcodeType, headerColor, 0, lastUsed, DBHelper.DEFAULT_ZOOM_LEVEL, 0); + LoyaltyCard card = new LoyaltyCard( + tempID, + store, + note, + null, + null, + BigDecimal.valueOf(0), + null, + record.cardId, + null, + barcodeType, + headerColor, + 0, + lastUsed, + DBHelper.DEFAULT_ZOOM_LEVEL, + 0, + null, + null, + null + ); importedData.cards.add(card); Map images = new HashMap<>(); 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 b45d81efe..94c7ba5e8 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -151,7 +151,26 @@ public class VoucherVaultImporter implements Importer { } // use -1 for the ID, it will be ignored when inserting the card into the DB - importedData.cards.add(new LoyaltyCard(-1, store, "", null, expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime(), DBHelper.DEFAULT_ZOOM_LEVEL, 0)); + importedData.cards.add(new LoyaltyCard( + -1, + store, + "", + null, + expiry, + balance, + balanceType, + cardId, + null, + barcodeType, + headerColor, + 0, + Utils.getUnixTime(), + DBHelper.DEFAULT_ZOOM_LEVEL, + 0, + null, + null, + null + )); } return importedData; diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index a57b02b04..a0e965c8f 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -46,7 +46,7 @@ public class DatabaseTest { assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -64,7 +64,7 @@ public class DatabaseTest { result = DBHelper.deleteLoyaltyCard(mDatabase, mActivity, 1); assertTrue(result); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - assertNull(DBHelper.getLoyaltyCard(mDatabase, 1)); + assertNull(DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1)); } @Test @@ -78,7 +78,7 @@ public class DatabaseTest { assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store1", loyaltyCard.store); assertEquals("note1", loyaltyCard.note); @@ -105,7 +105,7 @@ public class DatabaseTest { assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -138,7 +138,7 @@ public class DatabaseTest { assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("", loyaltyCard.store); assertEquals("", loyaltyCard.note); @@ -480,7 +480,7 @@ public class DatabaseTest { dbHelper.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION); // Determine that the entries are queryable and the fields are correct - LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId); + LoyaltyCard card = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), database, newCardId); assertEquals("store", card.store); assertEquals("", card.note); assertEquals(null, card.validFrom); @@ -496,7 +496,7 @@ public class DatabaseTest { assertEquals(100, card.zoomLevel); // Determine that the entries are queryable and the fields are correct - LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2); + LoyaltyCard card2 = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), database, newCardId2); assertEquals("store", card2.store); assertEquals("", card2.note); assertEquals(null, card2.validFrom); @@ -523,7 +523,7 @@ public class DatabaseTest { assertTrue(result); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mActivity.getApplicationContext(), mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index c90bff3db..13bf3eb4a 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -94,7 +94,7 @@ public class ImportExportTest { boolean result = (id != -1); assertTrue(result); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id); assertEquals("No Expiry", card.store); assertEquals("", card.note); assertEquals(null, card.validFrom); @@ -111,7 +111,7 @@ public class ImportExportTest { result = (id != -1); assertTrue(result); - card = DBHelper.getLoyaltyCard(mDatabase, (int) id); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id); assertEquals("Past", card.store); assertEquals("", card.note); assertEquals(null, card.validFrom); @@ -128,7 +128,7 @@ public class ImportExportTest { result = (id != -1); assertTrue(result); - card = DBHelper.getLoyaltyCard(mDatabase, (int) id); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id); assertEquals("Today", card.store); assertEquals("", card.note); assertEquals(null, card.validFrom); @@ -148,7 +148,7 @@ public class ImportExportTest { result = (id != -1); assertTrue(result); - card = DBHelper.getLoyaltyCard(mDatabase, (int) id); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, (int) id); assertEquals("Future", card.store); assertEquals("", card.note); assertEquals(null, card.validFrom); @@ -174,7 +174,7 @@ public class ImportExportTest { int index = 1; while (cursor.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(cursor); + LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); String expectedStore = String.format("store, \"%4d", index); String expectedNote = String.format("note, \"%4d", index); @@ -200,7 +200,7 @@ public class ImportExportTest { Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); while (cursor.moveToNext()) { - LoyaltyCard card = LoyaltyCard.fromCursor(cursor); + LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); // ID goes up for duplicates (b/c the cursor orders by store), down for originals int index = card.id > numCards ? card.id - numCards : numCards - card.id + 1; @@ -236,7 +236,7 @@ public class ImportExportTest { while (index < 10) { cursor.moveToNext(); - LoyaltyCard card = LoyaltyCard.fromCursor(cursor); + LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); String expectedStore = String.format("store, \"%4d", index); String expectedNote = String.format("note, \"%4d", index); @@ -258,7 +258,7 @@ public class ImportExportTest { index = 1; while (cursor.moveToNext() && index < 5) { - LoyaltyCard card = LoyaltyCard.fromCursor(cursor); + LoyaltyCard card = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); String expectedStore = String.format("store, \"%4d", index); String expectedNote = String.format("note, \"%4d", index); @@ -649,7 +649,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -675,7 +675,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -713,7 +713,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -739,7 +739,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -765,7 +765,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -798,7 +798,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -831,7 +831,7 @@ public class ImportExportTest { // Create card 1 int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1601510400), new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null,0); - loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); + loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId)); DBHelper.insertGroup(mDatabase, "One"); List groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One")); DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups); @@ -845,7 +845,7 @@ public class ImportExportTest { // Create card 2 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)); + loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardId)); // Export everything ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); @@ -863,7 +863,7 @@ public class ImportExportTest { for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) { LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID); - LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardID); + LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, loyaltyCardID); assertEquals(loyaltyCard.id, dbLoyaltyCard.id); assertEquals(loyaltyCard.store, dbLoyaltyCard.store); @@ -950,7 +950,7 @@ public class ImportExportTest { assertEquals(Arrays.asList(8, 6), DBHelper.getGroupCardIds(mDatabase, "Fashion")); // Check all cards - LoyaltyCard card1 = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card1 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("Card 1", card1.store); assertEquals("Note 1", card1.note); @@ -967,7 +967,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.icon)); - LoyaltyCard card8 = DBHelper.getLoyaltyCard(mDatabase, 8); + LoyaltyCard card8 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 8); assertEquals("Clothes Store", card8.store); assertEquals("Note about store", card8.note); @@ -984,7 +984,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.icon)); - LoyaltyCard card2 = DBHelper.getLoyaltyCard(mDatabase, 2); + LoyaltyCard card2 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); assertEquals("Department Store", card2.store); assertEquals("", card2.note); @@ -1001,7 +1001,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.icon)); - LoyaltyCard card3 = DBHelper.getLoyaltyCard(mDatabase, 3); + LoyaltyCard card3 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3); assertEquals("Grocery Store", card3.store); assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note); @@ -1018,7 +1018,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.icon)); - LoyaltyCard card4 = DBHelper.getLoyaltyCard(mDatabase, 4); + LoyaltyCard card4 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 4); assertEquals("Pharmacy", card4.store); assertEquals("", card4.note); @@ -1035,7 +1035,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.icon)); - LoyaltyCard card5 = DBHelper.getLoyaltyCard(mDatabase, 5); + LoyaltyCard card5 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 5); assertEquals("Restaurant", card5.store); assertEquals("Note about restaurant here", card5.note); @@ -1052,7 +1052,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.icon)); - LoyaltyCard card6 = DBHelper.getLoyaltyCard(mDatabase, 6); + LoyaltyCard card6 = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 6); assertEquals("Shoe Store", card6.store); assertEquals("", card6.note); @@ -1081,7 +1081,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("Hema", card.store); assertEquals("2021-03-24 18:35:08 UTC", card.note); @@ -1094,7 +1094,7 @@ public class ImportExportTest { assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); - card = DBHelper.getLoyaltyCard(mDatabase, 2); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); assertEquals("test", card.store); assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note); @@ -1107,7 +1107,7 @@ public class ImportExportTest { assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); - card = DBHelper.getLoyaltyCard(mDatabase, 3); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3); assertEquals("Albert Heijn", card.store); assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note); @@ -1138,7 +1138,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("Air Miles", card.store); assertEquals("szjsbs", card.note); @@ -1156,7 +1156,7 @@ public class ImportExportTest { assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back))); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon)); - card = DBHelper.getLoyaltyCard(mDatabase, 2); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); assertEquals("GAMMA", card.store); assertEquals("", card.note); @@ -1174,7 +1174,7 @@ public class ImportExportTest { assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back)); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon)); - card = DBHelper.getLoyaltyCard(mDatabase, 3); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3); assertEquals("jö", card.store); assertEquals("", card.note); @@ -1205,7 +1205,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("Foo", card.store); assertEquals("", card.note); @@ -1223,7 +1223,7 @@ public class ImportExportTest { assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back)); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon)); - card = DBHelper.getLoyaltyCard(mDatabase, 2); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); assertEquals("Air Miles", card.store); assertEquals("szjsbs\nMiles", card.note); @@ -1241,7 +1241,7 @@ public class ImportExportTest { assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back))); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon)); - card = DBHelper.getLoyaltyCard(mDatabase, 3); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 3); assertEquals("GAMMA", card.store); assertEquals("", card.note); @@ -1259,7 +1259,7 @@ public class ImportExportTest { assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.back)); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, ImageLocationType.icon)); - card = DBHelper.getLoyaltyCard(mDatabase, 4); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 4); assertEquals("jö", card.store); assertEquals("", card.note); @@ -1289,7 +1289,7 @@ public class ImportExportTest { assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); assertEquals("Clothes Store", card.store); assertEquals("", card.note); @@ -1303,7 +1303,7 @@ public class ImportExportTest { assertEquals(Color.GRAY, (long) card.headerColor); assertEquals(0, card.starStatus); - card = DBHelper.getLoyaltyCard(mDatabase, 2); + card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 2); assertEquals("Department Store", card.store); assertEquals("", card.note); diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 492c6ae3e..f0b867827 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -25,12 +25,13 @@ import java.util.Date; @RunWith(RobolectricTestRunner.class) public class ImportURITest { + private Activity activity; private ImportURIHelper importURIHelper; private SQLiteDatabase mDatabase; @Before public void setUp() { - Activity activity = Robolectric.setupActivity(MainActivity.class); + activity = Robolectric.setupActivity(MainActivity.class); importURIHelper = new ImportURIHelper(activity); mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase(); } @@ -43,7 +44,7 @@ public class ImportURITest { 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); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); // Card to URI Uri cardUri = importURIHelper.toUri(card); @@ -73,7 +74,7 @@ public class ImportURITest { 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); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); // Card to URI Uri cardUri = importURIHelper.toUri(card); @@ -103,7 +104,7 @@ public class ImportURITest { 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); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); // Card to URI, with a trailing slash Uri cardUri = importURIHelper.toUri(card).buildUpon().path("/share/").build(); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 1ada6674d..7f647c161 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -97,7 +97,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterEmptyNote() { DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); @@ -112,7 +112,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterWithNote() { DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); @@ -137,7 +137,7 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(4, cursor.getCount()); assertTrue(cursor.moveToFirst()); - LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(cursor); + LoyaltyCard loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); assertEquals("storeD", loyaltyCard.store); View view = createView(cursor); ConstraintLayout star = view.findViewById(R.id.star); @@ -146,7 +146,7 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(View.GONE, archive.getVisibility()); assertTrue(cursor.moveToNext()); - loyaltyCard = LoyaltyCard.fromCursor(cursor); + loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); assertEquals("storeC", loyaltyCard.store); view = createView(cursor); star = view.findViewById(R.id.star); @@ -155,7 +155,7 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(View.GONE, archive.getVisibility()); assertTrue(cursor.moveToNext()); - loyaltyCard = LoyaltyCard.fromCursor(cursor); + loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); assertEquals("storeB", loyaltyCard.store); view = createView(cursor); star = view.findViewById(R.id.star); @@ -164,7 +164,7 @@ public class LoyaltyCardCursorAdapterTest { assertEquals(View.VISIBLE, archive.getVisibility()); assertTrue(cursor.moveToNext()); - loyaltyCard = LoyaltyCard.fromCursor(cursor); + loyaltyCard = LoyaltyCard.fromCursor(activity.getApplicationContext(), cursor); assertEquals("storeA", loyaltyCard.store); view = createView(cursor); star = view.findViewById(R.id.star); @@ -178,7 +178,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0Points() { DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); @@ -193,7 +193,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0EUR() { DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); @@ -208,7 +208,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter100Points() { DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); @@ -223,7 +223,7 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter10USD() { DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null,0); - LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), mDatabase, 1); Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index cada3eba0..ad8a5bc73 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -167,7 +167,7 @@ public class LoyaltyCardViewActivityTest { assertEquals(1, DBHelper.getLoyaltyCardCount(database)); - LoyaltyCard card = DBHelper.getLoyaltyCard(database, 1); + LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1); assertEquals(store, card.store); assertEquals(note, card.note); assertEquals(balance, card.balance); @@ -216,7 +216,7 @@ public class LoyaltyCardViewActivityTest { * Initiate and complete a barcode capture, either in success * or in failure */ - private void captureBarcodeWithResult(final Activity activity, final boolean success) throws IOException { + private void captureBarcodeWithResult(final Activity activity, final boolean success) { // Start image capture final Button startButton = activity.findViewById(R.id.enterButton); startButton.performClick(); @@ -238,7 +238,7 @@ public class LoyaltyCardViewActivityTest { loyaltyCard.setCardId(BARCODE_DATA); ParseResult parseResult = new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard); - resultIntent.putExtras(parseResult.toLoyaltyCardBundle()); + resultIntent.putExtras(parseResult.toLoyaltyCardBundle(activity)); // Respond to image capture, success shadowOf(activity).receiveResult( @@ -251,7 +251,7 @@ public class LoyaltyCardViewActivityTest { * Initiate and complete a barcode selection, either in success * or in failure */ - private void selectBarcodeWithResult(final Activity activity, final String barcodeData, final String barcodeType, final boolean success) throws IOException { + private void selectBarcodeWithResult(final Activity activity, final String barcodeData, final String barcodeType, final boolean success) { // Start barcode selector final Button startButton = activity.findViewById(R.id.enterButton); startButton.performClick(); @@ -278,7 +278,7 @@ public class LoyaltyCardViewActivityTest { loyaltyCard.setCardId(barcodeData); ParseResult parseResult = new ParseResult(ParseResultType.BARCODE_ONLY, loyaltyCard); - resultIntent.putExtras(parseResult.toLoyaltyCardBundle()); + resultIntent.putExtras(parseResult.toLoyaltyCardBundle(activity)); // Respond to barcode selection, success shadowOf(activity).receiveResult( @@ -302,8 +302,10 @@ public class LoyaltyCardViewActivityTest { } else if (fieldType == FieldTypeView.ImageView) { ImageView imageView = (ImageView) view; Bitmap image = null; - if (imageView.getTag() != null) { + try { image = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); + } catch (ClassCastException e) { + // This is probably a VectorDrawable, the placeholder image. Aka: No image. } assertEquals(contents, image); } else { @@ -419,8 +421,8 @@ public class LoyaltyCardViewActivityTest { cardIdField.setText("12345678"); barcodeField.setText("87654321"); barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName()); - activity.setCardImage(frontImageView, frontBitmap, true); - activity.setCardImage(backImageView, backBitmap, true); + activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true); + activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true); shadowOf(getMainLooper()).idle();