diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 0759bf7c3..c920c70e1 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -309,7 +309,6 @@ public class Utils { FileOutputStream out = context.openFileOutput(fileName, Context.MODE_PRIVATE); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); - } static public void saveCardImage(Context context, Bitmap bitmap, int loyaltyCardId, boolean front) throws FileNotFoundException { @@ -331,11 +330,15 @@ public class Utils { return retrieveCardImage(context, getCardImageFileName(loyaltyCardId, front)); } - static public Object hashmapGetOrDefault(HashMap hashMap, String key, Object defaultValue) { - Object value = hashMap.get(key); + static public Object hashmapGetOrDefault(HashMap hashMap, Object key, Object defaultValue, Class keyType) { + Object value = hashMap.get(keyType.cast(key)); if (value == null) { return defaultValue; } return value; } + + static public Object hashmapGetOrDefault(HashMap hashMap, String key, Object defaultValue) { + return hashmapGetOrDefault(hashMap, key, defaultValue, String.class); + } } diff --git a/app/src/main/res/drawable/ic_android_launcher.xml b/app/src/main/res/drawable/ic_android_launcher.xml deleted file mode 100644 index 9788de509..000000000 --- a/app/src/main/res/drawable/ic_android_launcher.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml b/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml deleted file mode 100644 index b6caf720f..000000000 --- a/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/list_divider.xml b/app/src/main/res/drawable/list_divider.xml deleted file mode 100644 index 5afbb0145..000000000 --- a/app/src/main/res/drawable/list_divider.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 7874bb400..f787152a7 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -29,6 +29,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; @@ -38,6 +39,7 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Currency; import java.util.Date; +import java.util.HashMap; import java.util.List; import androidx.core.content.res.ResourcesCompat; @@ -867,46 +869,106 @@ public class ImportExportTest } @Test - public void exportV2() throws FileNotFoundException + public void exportImportV2Zip() throws FileNotFoundException { - db.insertGroup("Example"); - + // Prepare images BitmapDrawable launcher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); BitmapDrawable roundLauncher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher_round, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); - Bitmap frontImage = launcher.getBitmap(); - Bitmap backImage = roundLauncher.getBitmap(); + Bitmap launcherBitmap = launcher.getBitmap(); + Bitmap roundLauncherBitmap = roundLauncher.getBitmap(); - int loyaltyCard = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", BarcodeFormat.QR_CODE, 1, 0); + // Set up cards and groups + HashMap loyaltyCardHashMap = new HashMap<>(); + HashMap> loyaltyCardGroups = new HashMap<>(); + HashMap loyaltyCardFrontImages = new HashMap<>(); + HashMap loyaltyCardBackImages = new HashMap<>(); - Utils.saveCardImage(activity.getApplicationContext(), Utils.resizeBitmap(frontImage), loyaltyCard, true); - Utils.saveCardImage(activity.getApplicationContext(), Utils.resizeBitmap(backImage), loyaltyCard, false); + // Create card 1 + int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", BarcodeFormat.QR_CODE, 1, 0); + loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); + db.insertGroup("One"); + List groups = Arrays.asList(db.getGroup("One")); + db.setLoyaltyCardGroups(loyaltyCardId, groups); + loyaltyCardGroups.put(loyaltyCardId, groups); + Utils.saveCardImage(activity.getApplicationContext(), launcherBitmap, loyaltyCardId, true); + Utils.saveCardImage(activity.getApplicationContext(), roundLauncherBitmap, loyaltyCardId, false); + loyaltyCardFrontImages.put(loyaltyCardId, launcherBitmap); + loyaltyCardBackImages.put(loyaltyCardId, roundLauncherBitmap); - db.setLoyaltyCardGroups(loyaltyCard, Arrays.asList(db.getGroup("Example"))); + // Create card 2 + loyaltyCardId = (int) db.insertLoyaltyCard("Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1); + loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); + // Export everything ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); - MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima); - String outputCsv = "2\r\n" + - "\r\n" + - "_id\r\n" + - "Example\r\n" + - "\r\n" + - "_id,store,note,expiry,balance,balancetype,cardid,barcodeid,barcodetype,headercolor,starstatus,frontimage,backimage\r\n" + - "1,Card 1,Note 1,1618053234,100,USD,1234,5432,QR_CODE,1,0,\"iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQAAAADcA-lXAAAANklEQVR42u3BAQEAAACCIP-vbkhA\n" + - "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8G4IAAAFjdVCkAAAAAElFTkSuQmCC\n\",\"iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQAAAADcA-lXAAAANklEQVR42u3BAQEAAACCIP-vbkhA\n" + - "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8G4IAAAFjdVCkAAAAAElFTkSuQmCC\n\"\r\n" + - "\r\n" + - "cardId,groupId\r\n" + - "1,Example\r\n"; + // Wipe database + TestHelpers.getEmptyDb(activity); - assertEquals(outputCsv, outputStream.toString()); + // Import everything + MultiFormatImporter.importData(activity.getApplicationContext(), db, new ByteArrayInputStream(outputStream.toByteArray()), DataFormat.Catima, null); + + // Ensure everything is there + assertEquals(loyaltyCardHashMap.size(), db.getLoyaltyCardCount()); + + for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) { + LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID); + + LoyaltyCard dbLoyaltyCard = db.getLoyaltyCard(loyaltyCardID); + + assertEquals(loyaltyCard.id, dbLoyaltyCard.id); + assertEquals(loyaltyCard.store, dbLoyaltyCard.store); + assertEquals(loyaltyCard.note, dbLoyaltyCard.note); + assertEquals(loyaltyCard.expiry, dbLoyaltyCard.expiry); + assertEquals(loyaltyCard.balance, dbLoyaltyCard.balance); + assertEquals(loyaltyCard.cardId, dbLoyaltyCard.cardId); + assertEquals(loyaltyCard.barcodeId, dbLoyaltyCard.barcodeId); + assertEquals(loyaltyCard.starStatus, dbLoyaltyCard.starStatus); + assertEquals(loyaltyCard.barcodeType, dbLoyaltyCard.barcodeType); + assertEquals(loyaltyCard.balanceType, dbLoyaltyCard.balanceType); + assertEquals(loyaltyCard.headerColor, dbLoyaltyCard.headerColor); + + List emptyGroup = new ArrayList<>(); + + assertEquals( + groupsToGroupNames( + (List) Utils.hashmapGetOrDefault( + loyaltyCardGroups, + loyaltyCardID, + emptyGroup, + Integer.class + ) + ), + groupsToGroupNames( + db.getLoyaltyCardGroups( + loyaltyCardID + ) + ) + ); + + Bitmap expectedFrontImage = loyaltyCardFrontImages.get(loyaltyCardID); + Bitmap expectedBackImage = loyaltyCardBackImages.get(loyaltyCardID); + Bitmap actualFrontImage = Utils.retrieveCardImage(activity.getApplicationContext(), Utils.getCardImageFileName(loyaltyCardID, true)); + Bitmap actualBackImage = Utils.retrieveCardImage(activity.getApplicationContext(), Utils.getCardImageFileName(loyaltyCardID, false)); + + if (expectedFrontImage != null) { + assertTrue(expectedFrontImage.sameAs(actualFrontImage)); + } else { + assertNull(actualFrontImage); + } + + if (expectedBackImage != null) { + assertTrue(expectedBackImage.sameAs(actualBackImage)); + } else { + assertNull(actualBackImage); + } + } } @Test - public void importV2() + public void importV2CSV() { String csvText = "2\n" + "\n" + @@ -915,16 +977,14 @@ public class ImportExportTest "Food\n" + "Fashion\n" + "\n" + - "_id,store,note,expiry,balance,balancetype,cardid,barcodeid,headercolor,barcodetype,starstatus,frontimage,backimage\n" + - "1,Card 1,Note 1,1618053234,100,USD,1234,5432,1,QR_CODE,0,\"iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQAAAADcA-lXAAAANklEQVR42u3BAQEAAACCIP-vbkhA\n" + - "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8G4IAAAFjdVCkAAAAAElFTkSuQmCC\n\",\"iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQAAAADcA-lXAAAANklEQVR42u3BAQEAAACCIP-vbkhA\n" + - "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8G4IAAAFjdVCkAAAAAElFTkSuQmCC\n\"\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,,,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" + + "_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" + + "3,Grocery Store,,,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" + @@ -958,12 +1018,6 @@ public class ImportExportTest assertEquals(Arrays.asList(8, 6), db.getGroupCardIds("Fashion")); // Check all cards - BitmapDrawable launcher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); - BitmapDrawable roundLauncher = (BitmapDrawable) ResourcesCompat.getDrawableForDensity(activity.getResources(), R.mipmap.ic_launcher_round, DisplayMetrics.DENSITY_XXXHIGH, activity.getTheme()); - - Bitmap frontImage = launcher.getBitmap(); - Bitmap backImage = roundLauncher.getBitmap(); - LoyaltyCard card1 = db.getLoyaltyCard(1); assertEquals("Card 1", card1.store); @@ -976,8 +1030,8 @@ public class ImportExportTest assertEquals(BarcodeFormat.QR_CODE, card1.barcodeType); assertEquals(1, (long) card1.headerColor); assertEquals(0, card1.starStatus); - assertTrue(Utils.resizeBitmap(frontImage).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, true))); - assertTrue(Utils.resizeBitmap(backImage).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, false))); + assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, true)); + assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, false)); LoyaltyCard card8 = db.getLoyaltyCard(8); diff --git a/app/src/test/java/protect/card_locker/TestHelpers.java b/app/src/test/java/protect/card_locker/TestHelpers.java index cccca7bc6..36683f8ae 100644 --- a/app/src/test/java/protect/card_locker/TestHelpers.java +++ b/app/src/test/java/protect/card_locker/TestHelpers.java @@ -1,11 +1,33 @@ package protect.card_locker; import android.app.Activity; +import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; + public class TestHelpers { static public DBHelper getEmptyDb(Activity activity) { DBHelper db = new DBHelper(activity); + + // Make sure no files remain + Cursor cursor = db.getLoyaltyCardCursor(); + cursor.moveToFirst(); + while (!cursor.isAfterLast()) { + int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID); + + try { + Utils.saveCardImage(activity.getApplicationContext(), null, cardID, true); + } catch (FileNotFoundException ignored) {} + try { + Utils.saveCardImage(activity.getApplicationContext(), null, cardID, false); + } catch (FileNotFoundException ignored) {} + + cursor.moveToNext(); + } + // Make sure DB is empty SQLiteDatabase database = db.getWritableDatabase(); database.execSQL("delete from " + DBHelper.LoyaltyCardDbIds.TABLE);