diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java index 2492ba2136..0366300261 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/CloudRepository.java @@ -356,7 +356,7 @@ public class CloudRepository { } } - protected List processKeyboardJSON(JSONObject query, boolean fromKMP) { + protected static List processKeyboardJSON(JSONObject query, boolean fromKMP) { List keyboardsList = new ArrayList<>(); if (query.length() == 0) { return keyboardsList; @@ -389,7 +389,7 @@ public class CloudRepository { hashMap.put(KMManager.KMKey_PackageID, pkgID); hashMap.put(KMManager.KMKey_KeyboardID, kbID); hashMap.put(KMManager.KMKey_LanguageName, langName); - hashMap.put(KMManager.KMKey_LanguageID, langID); + hashMap.put(KMManager.KMKey_LanguageID, langID.toLowerCase()); hashMap.put(KMManager.KMKey_KeyboardVersion, kbVersion); hashMap.put(KMManager.KMKey_CustomKeyboard, isCustom); hashMap.put(KMManager.KMKey_Font, kbFont); @@ -409,7 +409,7 @@ public class CloudRepository { return keyboardsList; } - protected List processLexicalModelJSON(JSONArray models) { + protected static List processLexicalModelJSON(JSONArray models) { List modelList = new ArrayList<>(models.length()); try { @@ -451,7 +451,7 @@ public class CloudRepository { HashMap hashMap = new HashMap(); hashMap.put(KMManager.KMKey_PackageID, packageID); - hashMap.put(KMManager.KMKey_LanguageID, languageID); + hashMap.put(KMManager.KMKey_LanguageID, languageID.toLowerCase()); hashMap.put(KMManager.KMKey_LexicalModelID, modelID); hashMap.put(KMManager.KMKey_LexicalModelName, modelName); hashMap.put(KMManager.KMKey_LanguageName, langName); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java index 17a7c5ad22..d94eab5d1e 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessor.java @@ -72,7 +72,7 @@ public class LexicalModelPackageProcessor extends PackageProcessor { models[i].put(KMManager.KMKey_LexicalModelID, jsonEntry.getString("id")); // Use package version for the lexical model version models[i].put(KMManager.KMKey_LexicalModelVersion, packageVersion); - models[i].put(KMManager.KMKey_LanguageID, languages.getJSONObject(i).getString("id")); + models[i].put(KMManager.KMKey_LanguageID, languages.getJSONObject(i).getString("id").toLowerCase()); models[i].put(KMManager.KMKey_LanguageName, languages.getJSONObject(i).getString("name")); if (welcomeExists(packageId)) { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java index e6c065a68f..52f83a953e 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/packages/PackageProcessor.java @@ -156,7 +156,7 @@ public class PackageProcessor { keyboards[i].put(KMManager.KMKey_PackageID, packageId); keyboards[i].put(KMManager.KMKey_KeyboardName, jsonEntry.getString("name")); keyboards[i].put(KMManager.KMKey_KeyboardID, jsonEntry.getString("id")); - keyboards[i].put(KMManager.KMKey_LanguageID, languages.getJSONObject(i).getString("id")); + keyboards[i].put(KMManager.KMKey_LanguageID, languages.getJSONObject(i).getString("id").toLowerCase()); keyboards[i].put(KMManager.KMKey_LanguageName, languages.getJSONObject(i).getString("name")); keyboards[i].put(KMManager.KMKey_KeyboardVersion, jsonEntry.getString("version")); if (jsonEntry.has("displayFont")) { diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/data/CloudRepositoryTest.java b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/data/CloudRepositoryTest.java new file mode 100644 index 0000000000..47b6ad98e9 --- /dev/null +++ b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/data/CloudRepositoryTest.java @@ -0,0 +1,62 @@ +package com.tavultesoft.kmea.data; + +import com.tavultesoft.kmea.JSONParser; +import com.tavultesoft.kmea.KMManager; +import com.tavultesoft.kmea.data.LexicalModel; +import com.tavultesoft.kmea.packages.JSONUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +// In Keyman 13.0, this becomes CloudDataJsonUtilTest +@RunWith(RobolectricTestRunner.class) +public class CloudRepositoryTest { + private static final File TEST_RESOURCE_ROOT = new File("test_resources", "cloud"); + private static final String TAG = "CloudDataJsonUtilTest"; + + private final String pkgID = "sil_cameroon_qwerty"; + private final String langID = "bag-Latn"; + private final String langName = "Tuki (Latin)"; + private final String keyboardID = "sil_cameroon_qwerty"; + private final String keyboardName = "Cameroon QWERTY"; + private final String keyboardVersion = "6.0.1"; + private final String customKeyboard = "N"; + private final String aFont = "AndikaAfr"; + private final String oskFont = aFont; + + @Before + public void initializeTestPackage() { + JSONUtils.initialize(TEST_RESOURCE_ROOT); + } + + @Test + public void shouldLowercaseLanguageID() { + JSONParser parser = new JSONParser(); + + // Test processKeyboardJSON() + JSONObject query = parser.getJSONObjectFromFile(new File(TEST_RESOURCE_ROOT, "bag-Latn.json")); + List keyboardResults = CloudRepository.processKeyboardJSON(query, false); + Keyboard kbInfo = keyboardResults.get(0); + Assert.assertEquals("bag-latn", kbInfo.getLanguageCode()); + + // Test processLexicalModelJSON() + query = parser.getJSONObjectFromFile(new File(TEST_RESOURCE_ROOT, "sencoten.json")); + JSONArray cloud = new JSONArray(); + cloud.put(query); + List results = CloudRepository.processLexicalModelJSON(cloud); + + LexicalModel lmInfo = results.get(0); + Assert.assertEquals("str-latn", lmInfo.getLanguageCode()); + } + +} diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java index a1c67bfe42..6b22f3ed87 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java +++ b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/packages/LexicalModelPackageProcessorTest.java @@ -79,6 +79,7 @@ public class LexicalModelPackageProcessorTest { Assert.assertEquals(en_custom, models[0]); // Lexical model same, but different language pairing + // Verifies en-US from kmp.json gets lower-cased en_custom.put(KMManager.KMKey_LanguageID, "en-us"); en_custom.put(KMManager.KMKey_LanguageName, "English (US)"); diff --git a/android/KMEA/test_resources/cloud/bag-Latn.json b/android/KMEA/test_resources/cloud/bag-Latn.json new file mode 100644 index 0000000000..daa0966c52 --- /dev/null +++ b/android/KMEA/test_resources/cloud/bag-Latn.json @@ -0,0 +1,39 @@ +{ + "options": { + "context": "language", + "dateFormat": "standard", + "device": "androidphone", + "keyboardBaseUri": "https://s.keyman.com/keyboard/", + "fontBaseUri": "https://s.keyman.com/font/deploy/", + "keyboardVersion": "current" + }, + "languages": { + "languages": [ + { + "name": "Tuki (Latin)", + "id": "bag-latn", + "region": 2, + "keyboards": [ + { + "id": "sil_cameroon_azerty", + "name": "Cameroon AZERTY", + "filename": "sil_cameroon_azerty/6.0/sil_cameroon_azerty-6.0.js", + "version": "6.0", + "source": "https://github.com/keymanapp/keyboards/tree/master/release/sil/sil_cameroon_azerty", + "lastModified": "2019-11-28", + "fileSize": 55534 + }, + { + "id": "sil_cameroon_qwerty", + "name": "Cameroon QWERTY", + "filename": "sil_cameroon_qwerty/6.0.1/sil_cameroon_qwerty-6.0.1.js", + "version": "6.0.1", + "source": "https://github.com/keymanapp/keyboards/tree/master/release/sil/sil_cameroon_qwerty", + "lastModified": "2019-11-28", + "fileSize": 55348 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/android/KMEA/test_resources/cloud/sencoten.json b/android/KMEA/test_resources/cloud/sencoten.json new file mode 100644 index 0000000000..346e6c853c --- /dev/null +++ b/android/KMEA/test_resources/cloud/sencoten.json @@ -0,0 +1,22 @@ + + { + "id": "nrc.str.sencoten", + "name": "SEN\u0106O\u0166EN (Saanich Dialect) Lexical Model", + "license": "mit", + "version": "1.0.4", + "languages": [ + "str-Latn" + ], + "authorName": "Eddie Antonio Santos", + "jsFileSize": 2116107, + "jsFilename": "https://downloads.keyman.com/models/nrc.str.sencoten/1.0.4/nrc.str.sencoten.model.js", + "sourcePath": "release/nrc/nrc.str.sencoten", + "authorEmail": "Eddie.Santos@nrc-cnrc.gc.ca", + "description": "SEN\u0106O\u0166EN (Saanich Dialect)", + "packageFileSize": 257025, + "packageFilename": "https://downloads.keyman.com/models/nrc.str.sencoten/1.0.4/nrc.str.sencoten.model.kmp", + "packageIncludes": [], + "lastModifiedDate": "2019-11-28T00:41:52.076Z", + "minKeymanVersion": "12.0" + } + diff --git a/android/KMEA/test_resources/packages/en.custom/example.en.custom.model.kmp b/android/KMEA/test_resources/packages/en.custom/example.en.custom.model.kmp index 0628ca2499..aa74835b0a 100644 Binary files a/android/KMEA/test_resources/packages/en.custom/example.en.custom.model.kmp and b/android/KMEA/test_resources/packages/en.custom/example.en.custom.model.kmp differ