Skip to content

Commit aad98ba

Browse files
Fix NPE when sharing cards without header values
1 parent 2b50e50 commit aad98ba

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

app/src/main/java/protect/card_locker/ImportURIHelper.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,24 @@ public LoyaltyCard parse(Uri uri) throws InvalidObjectException {
3535
}
3636

3737
try {
38+
// These values are allowed to be null
39+
Integer headerColor = null;
40+
Integer headerTextColor = null;
41+
3842
String store = uri.getQueryParameter(STORE);
3943
String note = uri.getQueryParameter(NOTE);
4044
String cardId = uri.getQueryParameter(CARD_ID);
4145
String barcodeType = uri.getQueryParameter(BARCODE_TYPE);
42-
Integer headerColor = Integer.parseInt(uri.getQueryParameter(HEADER_COLOR));
43-
Integer headerTextColor = Integer.parseInt(uri.getQueryParameter(HEADER_TEXT_COLOR));
46+
String unparsedHeaderColor = uri.getQueryParameter(HEADER_COLOR);
47+
if(unparsedHeaderColor != null)
48+
{
49+
headerColor = Integer.parseInt(unparsedHeaderColor);
50+
}
51+
String unparsedHeaderTextColor = uri.getQueryParameter(HEADER_TEXT_COLOR);
52+
if(unparsedHeaderTextColor != null)
53+
{
54+
headerTextColor = Integer.parseInt(unparsedHeaderTextColor);
55+
}
4456
return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor);
4557
} catch (NullPointerException | NumberFormatException ex) {
4658
throw new InvalidObjectException("Not a valid import URI");
@@ -57,8 +69,14 @@ protected Uri toUri(LoyaltyCard loyaltyCard) {
5769
uriBuilder.appendQueryParameter(NOTE, loyaltyCard.note);
5870
uriBuilder.appendQueryParameter(CARD_ID, loyaltyCard.cardId);
5971
uriBuilder.appendQueryParameter(BARCODE_TYPE, loyaltyCard.barcodeType);
60-
uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString());
61-
uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString());
72+
if(loyaltyCard.headerColor != null)
73+
{
74+
uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString());
75+
}
76+
if(loyaltyCard.headerTextColor != null)
77+
{
78+
uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString());
79+
}
6280

6381
return uriBuilder.build();
6482
}

app/src/test/java/protect/card_locker/ImportURITest.java

+25
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.robolectric.annotation.Config;
1313
import java.io.InvalidObjectException;
1414
import static org.junit.Assert.assertEquals;
15+
import static org.junit.Assert.assertNull;
1516
import static org.junit.Assert.assertTrue;
1617
import static protect.card_locker.DBHelper.LoyaltyCardDbIds;
1718

@@ -53,6 +54,30 @@ public void ensureNoDataLoss() throws InvalidObjectException
5354
assertEquals(card.store, parsedCard.store);
5455
}
5556

57+
@Test
58+
public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException
59+
{
60+
// Generate card
61+
db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, null, null);
62+
63+
// Get card
64+
LoyaltyCard card = db.getLoyaltyCard(1);
65+
66+
// Card to URI
67+
Uri cardUri = importURIHelper.toUri(card);
68+
69+
// Parse URI
70+
LoyaltyCard parsedCard = importURIHelper.parse(cardUri);
71+
72+
// Compare everything
73+
assertEquals(card.barcodeType, parsedCard.barcodeType);
74+
assertEquals(card.cardId, parsedCard.cardId);
75+
assertEquals(card.note, parsedCard.note);
76+
assertEquals(card.store, parsedCard.store);
77+
assertNull(parsedCard.headerColor);
78+
assertNull(parsedCard.headerTextColor);
79+
}
80+
5681
@Test
5782
public void failToParseInvalidUri()
5883
{

0 commit comments

Comments
 (0)