diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java index f4de13790..084aa634e 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java @@ -83,7 +83,7 @@ public class CsvDatabaseImporter implements DatabaseImporter * "key" as the key. If no such key exists, or the data is not a valid * int, a FormatException is thrown. */ - private int extractInt(String key, CSVRecord record) + private Integer extractInt(String key, CSVRecord record, boolean nullIsOk) throws FormatException { if(record.isMapped(key) == false) @@ -91,6 +91,12 @@ public class CsvDatabaseImporter implements DatabaseImporter throw new FormatException("Field not used but expected: " + key); } + String value = record.get(key); + if(value.isEmpty() && nullIsOk) + { + return null; + } + try { return Integer.parseInt(record.get(key)); @@ -108,7 +114,7 @@ public class CsvDatabaseImporter implements DatabaseImporter private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record) throws IOException, FormatException { - int id = extractInt(DBHelper.LoyaltyCardDbIds.ID, record); + int id = extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false); String store = extractString(DBHelper.LoyaltyCardDbIds.STORE, record, ""); if(store.isEmpty()) @@ -136,8 +142,8 @@ public class CsvDatabaseImporter implements DatabaseImporter if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR) && record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR)) { - headerColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record); - headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record); + headerColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record, true); + headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record, true); } helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, headerTextColor); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 884a097a5..8e49be146 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -312,8 +312,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity @Override public void onColorSelected(int dialogId, int color) { - Toast.makeText(LoyaltyCardEditActivity.this, "Color: " + Integer.toHexString(color), Toast.LENGTH_LONG).show(); - if(isBackgroundColor) { headingColorSample.setBackgroundColor(color); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 523851236..dd182e712 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -310,4 +310,57 @@ public class ImportExportTest assertNull(card.headerColor); assertNull(card.headerTextColor); } + + @Test + public void importWithoutNullColors() throws IOException + { + String csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "\n"; + csvText += "1,store,note,12345,type,,"; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + InputStreamReader inStream = new InputStreamReader(inputStream); + + // Import the CSV data + boolean result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertTrue(result); + assertEquals(1, db.getLoyaltyCardCount()); + + LoyaltyCard card = db.getLoyaltyCard(1); + + assertEquals("store", card.store); + assertEquals("note", card.note); + assertEquals("12345", card.cardId); + assertEquals("type", card.barcodeType); + assertNull(card.headerColor); + assertNull(card.headerTextColor); + } + + @Test + public void importWithoutInvalidColors() throws IOException + { + String csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "\n"; + csvText += "1,store,note,12345,type,not a number,invalid"; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + InputStreamReader inStream = new InputStreamReader(inputStream); + + // Import the CSV data + boolean result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertEquals(false, result); + assertEquals(0, db.getLoyaltyCardCount()); + } }