diff --git a/app/src/main/java/protect/card_locker/PkpassParser.kt b/app/src/main/java/protect/card_locker/PkpassParser.kt index 313c3bb35..d8ecf22fe 100644 --- a/app/src/main/java/protect/card_locker/PkpassParser.kt +++ b/app/src/main/java/protect/card_locker/PkpassParser.kt @@ -296,30 +296,22 @@ class PkpassParser(context: Context, uri: Uri?) { } // Append type-specific info to the pass - noteText.append("\n\n") // Find the relevant pass type and parse it - var hasPassData = false for (passType in listOf("boardingPass", "coupon", "eventTicket", "generic")) { try { - noteText.append( - parsePassJSONPassFields( - jsonObject.getJSONObject(passType), - locale - ) + var extraText = parsePassJSONPassFields( + jsonObject.getJSONObject(passType), + locale ) - hasPassData = true + noteText.append("\n\n") + noteText.append(extraText) break } catch (ignored: JSONException) {} } - // Failed to parse anything, error out - if (!hasPassData) { - throw FormatException(mContext.getString(R.string.errorReadingFile)) - } - note = noteText.toString() } diff --git a/app/src/test/java/protect/card_locker/PkpassTest.kt b/app/src/test/java/protect/card_locker/PkpassTest.kt index 242e046a1..56cef6434 100644 --- a/app/src/test/java/protect/card_locker/PkpassTest.kt +++ b/app/src/test/java/protect/card_locker/PkpassTest.kt @@ -176,6 +176,69 @@ class PkpassTest { Assert.assertTrue(imageBitmap.sameAs(parser.image)) } + @Test + fun testFakeEmptyEurowingsPassForGitHubIssue2317() { + // Prepare + val context: Context = ApplicationProvider.getApplicationContext() + val pkpass = "pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass" + val image = "pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png" + + val pkpassUri = Uri.parse(pkpass) + val imageUri = Uri.parse(image) + ShadowContentResolver().registerInputStream(pkpassUri, javaClass.getResourceAsStream(pkpass)) + ShadowContentResolver().registerInputStream(imageUri, javaClass.getResourceAsStream(image)) + + val parser = PkpassParser(context, pkpassUri) + val imageBitmap = BitmapFactory.decodeStream(context.contentResolver.openInputStream(imageUri)) + + // Confirm this does not have languages + Assert.assertEquals(listOf("de", "en"), parser.listLocales()) + + // Confirm correct parsing (en) + var parsedCard = parser.toLoyaltyCard("de") + + Assert.assertEquals(-1, parsedCard.id) + Assert.assertEquals("EUROWINGS", parsedCard.store) + Assert.assertEquals("Eurowings Boarding Pass", parsedCard.note) + Assert.assertEquals(Date(1567911600000), parsedCard.validFrom) + Assert.assertEquals(null, parsedCard.expiry) + Assert.assertEquals(BigDecimal(0), parsedCard.balance) + Assert.assertEquals(null, parsedCard.balanceType) + Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) + Assert.assertEquals(0, parsedCard.starStatus) + Assert.assertEquals(0, parsedCard.archiveStatus) + Assert.assertEquals(0, parsedCard.lastUsed) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel) + + // Confirm correct image is used + Assert.assertTrue(imageBitmap.sameAs(parser.image)) + + // Confirm correct parsing (en) + parsedCard = parser.toLoyaltyCard("en") + + Assert.assertEquals(-1, parsedCard.id) + Assert.assertEquals("EUROWINGS", parsedCard.store) + Assert.assertEquals("Eurowings Boarding Pass", parsedCard.note) + Assert.assertEquals(Date(1567911600000), parsedCard.validFrom) + Assert.assertEquals(null, parsedCard.expiry) + Assert.assertEquals(BigDecimal(0), parsedCard.balance) + Assert.assertEquals(null, parsedCard.balanceType) + Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) + Assert.assertEquals(0, parsedCard.starStatus) + Assert.assertEquals(0, parsedCard.archiveStatus) + Assert.assertEquals(0, parsedCard.lastUsed) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel) + + // Confirm correct image is used + Assert.assertTrue(imageBitmap.sameAs(parser.image)) + } + @Test fun testDCBPkPass() { // Prepare diff --git a/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass new file mode 100644 index 000000000..42f58029a Binary files /dev/null and b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass differ diff --git a/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png new file mode 100644 index 000000000..ba1a78ff5 Binary files /dev/null and b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png differ