diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java index a5aac91f0..076428bdf 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java @@ -4,6 +4,7 @@ import android.database.Cursor; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; +import org.json.JSONException; import java.io.IOException; import java.io.OutputStreamWriter; @@ -25,7 +26,8 @@ public class CsvDatabaseExporter implements DatabaseExporter DBHelper.LoyaltyCardDbIds.CARD_ID, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, - DBHelper.LoyaltyCardDbIds.BARCODE_TYPE); + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, + DBHelper.LoyaltyCardDbIds.EXTRAS); Cursor cursor = db.getLoyaltyCardCursor(); @@ -33,13 +35,23 @@ public class CsvDatabaseExporter implements DatabaseExporter { LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cursor); + String extras; + try { + extras = card.extras.toJSON().toString(); + } + catch (JSONException ex) + { + throw new IOException(ex); + } + printer.printRecord(card.id, card.store, card.note, card.cardId, card.headerColor, card.headerTextColor, - card.barcodeType); + card.barcodeType, + extras); if(Thread.currentThread().isInterrupted()) { diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java index c92748afe..39a3bcc13 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java @@ -149,11 +149,11 @@ public class CsvDatabaseImporter implements DatabaseImporter headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record, true); } - ExtrasHelper extras; + ExtrasHelper extras = new ExtrasHelper(); try { - extras = new ExtrasHelper().fromJSON(new JSONObject(extractString(DBHelper.LoyaltyCardDbIds.EXTRAS, record, "{}"))); + extras.fromJSON(new JSONObject(extractString(DBHelper.LoyaltyCardDbIds.EXTRAS, record, "{}"))); helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, headerTextColor, extras); } catch (JSONException ex) diff --git a/app/src/main/java/protect/card_locker/ExtrasHelper.java b/app/src/main/java/protect/card_locker/ExtrasHelper.java index f2ba1bf3f..15f3fefa7 100644 --- a/app/src/main/java/protect/card_locker/ExtrasHelper.java +++ b/app/src/main/java/protect/card_locker/ExtrasHelper.java @@ -1,6 +1,7 @@ package protect.card_locker; import android.support.annotation.NonNull; +import android.util.Log; import org.json.JSONException; import org.json.JSONObject; diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 0378f0bf2..bfcf9d6fb 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -46,12 +46,7 @@ public class ImportURIHelper { String barcodeType = uri.getQueryParameter(BARCODE_TYPE); Integer headerColor = Integer.parseInt(uri.getQueryParameter(HEADER_COLOR)); Integer headerTextColor = Integer.parseInt(uri.getQueryParameter(HEADER_TEXT_COLOR)); - // Extras was added in a later version, so don't crash if it doesn't exist - ExtrasHelper extras = new ExtrasHelper(); - if(uri.getQueryParameter(EXTRAS) != null) - { - extras = new ExtrasHelper().fromJSON(new JSONObject(uri.getQueryParameter(EXTRAS))); - } + ExtrasHelper extras = new ExtrasHelper().fromJSON(new JSONObject(uri.getQueryParameter(EXTRAS))); return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, extras); } catch (NullPointerException | NumberFormatException | JSONException ex) { throw new InvalidObjectException("Not a valid import URI"); @@ -59,7 +54,7 @@ public class ImportURIHelper { } // Protected for usage in tests - protected Uri toUri(LoyaltyCard loyaltyCard) { + protected Uri toUri(LoyaltyCard loyaltyCard) throws JSONException { Uri.Builder uriBuilder = new Uri.Builder(); uriBuilder.scheme("https"); uriBuilder.authority(host); @@ -70,7 +65,7 @@ public class ImportURIHelper { uriBuilder.appendQueryParameter(BARCODE_TYPE, loyaltyCard.barcodeType); uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString()); uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString()); - uriBuilder.appendQueryParameter(EXTRAS, loyaltyCard.extras.toString()); + uriBuilder.appendQueryParameter(EXTRAS, loyaltyCard.extras.toJSON().toString()); return uriBuilder.build(); } @@ -85,7 +80,14 @@ public class ImportURIHelper { context.startActivity(shareIntent); } - public void startShareIntent(LoyaltyCard loyaltyCard) { - startShareIntent(toUri(loyaltyCard)); + public boolean startShareIntent(LoyaltyCard loyaltyCard) { + try + { + startShareIntent(toUri(loyaltyCard)); + return true; + } + catch (JSONException ex) {} + + return false; } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index c61a402ba..34f350557 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -70,7 +70,7 @@ public class LoyaltyCard { try { - extras = new ExtrasHelper().fromJSON(new JSONObject(cursor.getString(extrasColumn))); + extras = extras.fromJSON(new JSONObject(cursor.getString(extrasColumn))); } catch (JSONException ex) { diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 68b736ca1..b4e1d1f59 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -207,7 +207,10 @@ public class MainActivity extends AppCompatActivity else if(item.getItemId() == R.id.action_share) { final ImportURIHelper importURIHelper = new ImportURIHelper(this); - importURIHelper.startShareIntent(card); + if(importURIHelper.startShareIntent(card)) + { + Toast.makeText(this, R.string.failedSharingCard, Toast.LENGTH_LONG).show(); + } return true; } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3474ea6b7..e8e5c7391 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,6 +45,7 @@ No Card ID entered Could not lookup loyalty card Could not parse the import Uri + Could not share card Could not show extra information: data not correctly formatted Could not save card diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 14709c47c..064a22e2d 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -105,7 +105,7 @@ public class ImportExportTest assertEquals(BARCODE_TYPE, card.barcodeType); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(Integer.valueOf(index*2), card.headerTextColor); - assertEquals(EXTRAS.toJSON().toString(), card.extras.toJSON().toString()); + assertEquals("{\"en\":{\"key\":\"value\"}}", card.extras.toJSON().toString()); index++; } diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 72157155f..2d4e0b6c9 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -56,7 +56,7 @@ public class ImportURITest { assertEquals(card.headerTextColor, parsedCard.headerTextColor); assertEquals(card.note, parsedCard.note); assertEquals(card.store, parsedCard.store); - assertEquals(card.extras.toString(), parsedCard.extras.toString()); + assertEquals(card.extras.toJSON().toString(), parsedCard.extras.toJSON().toString()); } @Test diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 8a4954d16..9f12110ab 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -655,7 +655,7 @@ public class LoyaltyCardViewActivityTest @Test public void importCard() { - Uri importUri = Uri.parse("https://brarcher.github.io/loyalty-card-locker/share?store=Example%20Store¬e=&cardid=123456&barcodetype=AZTEC&headercolor=-416706&headertextcolor=-1"); + Uri importUri = Uri.parse("https://brarcher.github.io/loyalty-card-locker/share?store=Example%20Store¬e=&cardid=123456&barcodetype=AZTEC&headercolor=-416706&headertextcolor=-1&extras={}"); Intent intent = new Intent(); intent.setData(importUri);