From ca93f89e1b43ba7deae2538dc8a7f5b7904a1573 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Wed, 11 Dec 2019 15:32:45 +0100 Subject: [PATCH] Add Eurowings support --- .../protect/card_locker/PkpassImporter.java | 12 +++++++ .../java/protect/card_locker/PkpassTest.java | 34 +++++++++++++++---- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/protect/card_locker/PkpassImporter.java b/app/src/main/java/protect/card_locker/PkpassImporter.java index 4a05bf3cf..60794bfb5 100644 --- a/app/src/main/java/protect/card_locker/PkpassImporter.java +++ b/app/src/main/java/protect/card_locker/PkpassImporter.java @@ -109,6 +109,12 @@ public class PkpassImporter { Integer.parseInt(headerColorMatcher.group(2)), Integer.parseInt(headerColorMatcher.group(3))); } + if(headerColor == null) + { + // Maybe they violate the spec, let's parse it in a format Android understands + // Necessary for at least Eurowings + headerColor = Color.parseColor(json.getString("backgroundColor")); + } // Optional. Color of the label text, specified as a CSS-style RGB triple. For example, rgb(255, 255, 255). @@ -121,6 +127,12 @@ public class PkpassImporter { Integer.parseInt(headerTextColorMatcher.group(2)), Integer.parseInt(headerTextColorMatcher.group(3))); } + if(headerTextColor == null) + { + // Maybe they violate the spec, let's parse it in a format Android understands + // Necessary for at least Eurowings + headerTextColor = Color.parseColor(json.getString("labelColor")); + } return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor); } diff --git a/app/src/test/java/protect/card_locker/PkpassTest.java b/app/src/test/java/protect/card_locker/PkpassTest.java index 896ffcb37..eb80babb1 100644 --- a/app/src/test/java/protect/card_locker/PkpassTest.java +++ b/app/src/test/java/protect/card_locker/PkpassTest.java @@ -3,6 +3,8 @@ package protect.card_locker; import android.app.Activity; import android.graphics.Color; +import com.google.zxing.BarcodeFormat; + import org.json.JSONException; import org.json.JSONObject; import org.junit.Before; @@ -107,11 +109,31 @@ public class PkpassTest { LoyaltyCard card = pkpassImporter.fromPassJSON(json); // Compare everything - assertEquals(card.barcodeType, "QR_CODE"); - assertEquals(card.cardId, "0000001"); - assertEquals(card.note, "Staff Pass for Employee Number 001"); - assertEquals(card.store, "Passbook Example Company"); - assertEquals(card.headerColor.toString(), String.valueOf(Color.rgb(90, 90, 90))); - assertEquals(card.headerTextColor.toString(), String.valueOf(Color.rgb(255, 255, 255))); + assertEquals(BarcodeFormat.QR_CODE.name(), card.barcodeType); + assertEquals("0000001", card.cardId); + assertEquals("Staff Pass for Employee Number 001", card.note); + assertEquals("Passbook Example Company", card.store); + assertEquals(String.valueOf(Color.rgb(90, 90, 90)), card.headerColor.toString()); + assertEquals(String.valueOf(Color.rgb(255, 255, 255)), card.headerTextColor.toString()); + } + + @Test + public void parseEurowingsTicket() throws JSONException + { + // https://github.com/brarcher/loyalty-card-locker/issues/309#issuecomment-563465333 + JSONObject json = new JSONObject("{\"description\":\"Eurowings Boarding Pass\",\"formatVersion\":1,\"organizationName\":\"EUROWINGS\",\"passTypeIdentifier\":\"pass.wings.boardingpass\",\"serialNumber\":\"quUBzi53bVIzpO2R15jEzRdG54Pb4qPbggEXZT7XKWx6AN%2bg8nfShLvh9teneKWV\",\"teamIdentifier\":\"M2DAP2XTGE\",\"authenticationToken\":\"d5828a30d7644eeffa9e900ac91ac6ec\",\"webServiceURL\":\"https://mobile.eurowings.com/booking/scripts/Passbook/PassbookPassGenerator.aspx?\",\"relevantDate\":\"2019-09-08T05:00+02:00\",\"backgroundColor\":\"#FFFFFF\",\"foregroundColor\":\"#333333\",\"labelColor\":\"#AA0061\",\"boardingPass\":{\"transitType\":\"PKTransitTypeAir\",\"headerFields\":[{\"key\":\"gate\",\"label\":\"gate_str\",\"value\":\"B61\"},{\"key\":\"seat\",\"label\":\"seat_str\",\"value\":\"16E\"}],\"primaryFields\":[{\"key\":\"origin\",\"label\":\"Cologne-Bonn\",\"value\":\"CGN\"},{\"key\":\"destination\",\"label\":\"Dubrovnik\",\"value\":\"DBV\"}],\"secondaryFields\":[{\"key\":\"name\",\"label\":\"name_str\",\"value\":\"John Doe\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"status\",\"label\":\"status_str\",\"value\":\"-\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"boardinggroup\",\"label\":\"boardinggroup_str\",\"value\":\"GROUP 1\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"tarif\",\"label\":\"fare_str\",\"value\":\"SMART\",\"textAlignment\":\"PKTextAlignmentLeft\"}],\"auxiliaryFields\":[{\"key\":\"flightNumber\",\"label\":\"flight_str\",\"value\":\"EW 954\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"departureDate\",\"label\":\"date_str\",\"value\":\"08/09/2019\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"boarding\",\"label\":\"boarding_str\",\"value\":\"05:00\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"closure\",\"label\":\"closure_str\",\"value\":\"05:15\",\"textAlignment\":\"PKTextAlignmentLeft\"}],\"backFields\":[{\"key\":\"info\",\"label\":\"\",\"value\":\"info_content_str\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"recordlocator\",\"label\":\"recordlocator_str\",\"value\":\"JBZPPP\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"sequence\",\"label\":\"sequence_str\",\"value\":\"73\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"notice\",\"label\":\"notice_str\",\"value\":\"notice_content_str\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"baggage\",\"label\":\"baggage_str\",\"value\":\"baggage_content_str\",\"textAlignment\":\"PKTextAlignmentLeft\"},{\"key\":\"contact\",\"label\":\"contact_str\",\"value\":\"contact_content_str\",\"textAlignment\":\"PKTextAlignmentLeft\"}]},\"barcode\":{\"format\":\"PKBarcodeFormatAztec\",\"message\":\"M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A016E0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N\",\"messageEncoding\":\"iso-8859-1\"}}"); + + // Parse Pkpass JSON + LoyaltyCard card = pkpassImporter.fromPassJSON(json); + + // Compare everything + assertEquals(BarcodeFormat.AZTEC.name(), card.barcodeType); + assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A016E0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", card.cardId); + assertEquals("Eurowings Boarding Pass", card.note); + assertEquals("EUROWINGS", card.store); + + // Violates the spec, but we want to support it anyway... + assertEquals(String.valueOf(Color.parseColor("#FFFFFF")), card.headerColor.toString()); + assertEquals(String.valueOf(Color.parseColor("#AA0061")), card.headerTextColor.toString()); } }