diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 5dc16dd3c..105b9d5fc 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -85,9 +85,7 @@ public class StocardImporter implements Importer providers = parseProviders(zipInputStream); } else if (startsWith(nameParts, cardBaseName, 1)) { // Extract cardName - if (localFileHeader.isDirectory()) { - cardName = nameParts[cardBaseName.length]; - } + cardName = nameParts[cardBaseName.length].split("\\.", 2)[0]; // This is the card itself if (nameParts.length == cardBaseName.length + 1) { @@ -95,13 +93,13 @@ public class StocardImporter implements Importer if (fileName.endsWith(".json")) { JSONObject jsonObject = readJSON(zipInputStream); - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "cardId", jsonObject.getString("input_id") ); - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "_providerId", @@ -112,7 +110,7 @@ public class StocardImporter implements Importer ); try { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "barcodeType", @@ -121,7 +119,7 @@ public class StocardImporter implements Importer } catch (JSONException ignored) {} } } else if (fileName.endsWith("notes/default.json")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "note", @@ -129,14 +127,14 @@ public class StocardImporter implements Importer .getString("content") ); } else if (fileName.endsWith("/images/front.png")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "frontImage", read(zipInputStream) ); } else if (fileName.endsWith("/images/back.png")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "backImage", @@ -153,10 +151,8 @@ public class StocardImporter implements Importer SQLiteDatabase database = db.getWritableDatabase(); database.beginTransaction(); - for(Map.Entry> entry : loyaltyCardHashMap.entrySet()) { - HashMap loyaltyCardData = entry.getValue(); - - String store = providers.get(loyaltyCardData.get("_providerId")); + for (HashMap loyaltyCardData : loyaltyCardHashMap.values()) { + String store = providers.get(loyaltyCardData.get("_providerId").toString()); String note = (String) loyaltyCardData.getOrDefault("note", ""); String cardId = (String) loyaltyCardData.get("cardId"); String barcodeTypeString = (String) loyaltyCardData.getOrDefault("barcodeType", null); @@ -228,13 +224,29 @@ public class StocardImporter implements Importer } private HashMap parseProviders(ZipInputStream zipInputStream) throws IOException, JSONException { + // FIXME: This is probably completely wrong, but it works for the one and only test file I have JSONObject jsonObject = readJSON(zipInputStream); - HashMap providers = new HashMap<>(); JSONArray providerIdList = jsonObject.getJSONArray("provider_id_list"); JSONArray providerList = jsonObject.getJSONArray("provider_list"); + + // Resort, put IDs with - in them after IDs without any - + List providerIds = new ArrayList<>(); + List customProviderIds = new ArrayList<>(); + + for (int i = 0; i < providerIdList.length(); i++) { + String providerId = providerIdList.get(i).toString(); + if (providerId.contains("-")) { + customProviderIds.add(providerId); + } else { + providerIds.add(providerId); + } + } + providerIds.addAll(customProviderIds); + + HashMap providers = new HashMap<>(); for (int i = 0; i < jsonObject.getInt("number_of_cards"); i++) { - providers.put(providerIdList.get(i).toString(), providerList.get(i).toString()); + providers.put(providerIds.get(i), providerList.get(i).toString()); } return providers; diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 421efc836..e1e6d919f 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -1140,19 +1140,7 @@ public class ImportExportTest LoyaltyCard card = db.getLoyaltyCard(1); - assertEquals("Air Miles", card.store); - assertEquals("", card.note); - assertEquals(null, card.expiry); - assertEquals(new BigDecimal("0"), card.balance); - assertEquals(null, card.balanceType); - assertEquals("7649484", card.cardId); - assertEquals(null, card.barcodeId); - assertEquals(null, card.barcodeType); - assertEquals(0, card.starStatus); - - card = db.getLoyaltyCard(2); - - assertEquals("Gamma", card.store); + assertEquals("GAMMA", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); @@ -1162,16 +1150,28 @@ public class ImportExportTest assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); + card = db.getLoyaltyCard(2); + + assertEquals("Air Miles", card.store); + assertEquals("szjsbs", card.note); + assertEquals(null, card.expiry); + assertEquals(new BigDecimal("0"), card.balance); + assertEquals(null, card.balanceType); + assertEquals("7649484", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(null, card.barcodeType); + assertEquals(0, card.starStatus); + card = db.getLoyaltyCard(3); - assertEquals("Jö", card.store); + assertEquals("jö", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); - assertEquals("20975646", card.cardId); - assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.barcodeId); - assertEquals(null, card.barcodeType); + assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(BarcodeFormat.RSS_EXPANDED, card.barcodeType); assertEquals(0, card.starStatus); TestHelpers.getEmptyDb(activity);