From aad98ba55bae58e5e330616ac33181616f4ec87b Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Thu, 9 Jan 2020 20:16:54 +0100 Subject: [PATCH] Fix NPE when sharing cards without header values --- .../protect/card_locker/ImportURIHelper.java | 26 ++++++++++++++++--- .../protect/card_locker/ImportURITest.java | 25 ++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index d3133bcb3..5aeeb0cec 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -35,12 +35,24 @@ public class ImportURIHelper { } try { + // These values are allowed to be null + Integer headerColor = null; + Integer headerTextColor = null; + String store = uri.getQueryParameter(STORE); String note = uri.getQueryParameter(NOTE); String cardId = uri.getQueryParameter(CARD_ID); String barcodeType = uri.getQueryParameter(BARCODE_TYPE); - Integer headerColor = Integer.parseInt(uri.getQueryParameter(HEADER_COLOR)); - Integer headerTextColor = Integer.parseInt(uri.getQueryParameter(HEADER_TEXT_COLOR)); + String unparsedHeaderColor = uri.getQueryParameter(HEADER_COLOR); + if(unparsedHeaderColor != null) + { + headerColor = Integer.parseInt(unparsedHeaderColor); + } + String unparsedHeaderTextColor = uri.getQueryParameter(HEADER_TEXT_COLOR); + if(unparsedHeaderTextColor != null) + { + headerTextColor = Integer.parseInt(unparsedHeaderTextColor); + } return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor); } catch (NullPointerException | NumberFormatException ex) { throw new InvalidObjectException("Not a valid import URI"); @@ -57,8 +69,14 @@ public class ImportURIHelper { uriBuilder.appendQueryParameter(NOTE, loyaltyCard.note); uriBuilder.appendQueryParameter(CARD_ID, loyaltyCard.cardId); uriBuilder.appendQueryParameter(BARCODE_TYPE, loyaltyCard.barcodeType); - uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString()); - uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString()); + if(loyaltyCard.headerColor != null) + { + uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString()); + } + if(loyaltyCard.headerTextColor != null) + { + uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString()); + } return uriBuilder.build(); } diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index 015c43395..d6f6a3438 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -12,6 +12,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.io.InvalidObjectException; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static protect.card_locker.DBHelper.LoyaltyCardDbIds; @@ -53,6 +54,30 @@ public class ImportURITest { assertEquals(card.store, parsedCard.store); } + @Test + public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException + { + // Generate card + db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, null, null); + + // Get card + LoyaltyCard card = db.getLoyaltyCard(1); + + // Card to URI + Uri cardUri = importURIHelper.toUri(card); + + // Parse URI + LoyaltyCard parsedCard = importURIHelper.parse(cardUri); + + // Compare everything + assertEquals(card.barcodeType, parsedCard.barcodeType); + assertEquals(card.cardId, parsedCard.cardId); + assertEquals(card.note, parsedCard.note); + assertEquals(card.store, parsedCard.store); + assertNull(parsedCard.headerColor); + assertNull(parsedCard.headerTextColor); + } + @Test public void failToParseInvalidUri() {