From 7bd304ee713102bc7d4d40aa7f59a9b81f03f219 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 18 Jun 2020 21:44:14 +0700 Subject: [PATCH 1/4] fix(android): Implement menu to add language for installed keyboard pkg --- .../kMAPro/src/main/AndroidManifest.xml | 12 ++ .../kmapro/KeymanSettingsInstallActivity.java | 9 +- .../kmapro/SelectLanguageActivity.java | 137 ++++++++++++++++++ .../kmapro/SelectPackageActivity.java | 116 +++++++++++++++ .../kMAPro/src/main/res/values/strings.xml | 4 + .../kmea/data/KeyboardController.java | 45 ++++-- .../kmea/packages/PackageProcessor.java | 48 ++++++ 7 files changed, 356 insertions(+), 15 deletions(-) create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml index 49d7fdac07..83aad3d6d9 100644 --- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml +++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml @@ -226,6 +226,18 @@ android:parentActivityName=".KeymanSettingsActivity" android:launchMode="singleTask" android:theme="@style/AppTheme.Base" /> + + KeymanInstallActivity --> SelectPackageActivity --> SelectLanguageActivity + * Displays a list of available languages for the user to add for a given installed packageID/keyboardID. + */ +public final class SelectLanguageActivity extends AppCompatActivity { + private static final String TAG = "SelectLanguageActivity"; + private static ArrayList> list = null; + private static KMListAdapter listAdapter = null; + private static Typeface titleFont = null; + private static final String titleKey = "title"; + private static final String subtitleKey = "subtitle"; + private static final String iconKey = "icon"; + private static Context context; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); + context = this; + + setContentView(R.layout.activity_list_layout); + final Toolbar toolbar = findViewById(R.id.list_toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + getSupportActionBar().setDisplayShowTitleEnabled(false); + + final ListView listView = findViewById(R.id.listView); + listView.setFastScrollEnabled(true); + + final Keyboard keyboard = (Keyboard)getIntent().getSerializableExtra("keyboard"); + final String packageID = keyboard.getPackageID(); + final String keyboardID = keyboard.getKeyboardID(); + final String keyboardName = keyboard.getKeyboardName(); + String title = String.format(getString(R.string.title_select_language_for_package), keyboardName); + final TextView textView = findViewById(R.id.bar_title); + textView.setText(title); + if (titleFont != null) { + textView.setTypeface(titleFont, Typeface.BOLD); + } + + // Get the list of available languages from kmp.json + File resourceRoot = new File(context.getDir("data", Context.MODE_PRIVATE).toString() + File.separator); + PackageProcessor kmpProcessor = new PackageProcessor(resourceRoot); + List availableKeyboardsList = kmpProcessor.getLanguageList(packageID, keyboardID); + + list = new ArrayList>(); + for (Keyboard k : availableKeyboardsList) { + final String noIcon = "0"; + HashMap hashMap = new HashMap<>(); + hashMap.put(titleKey, k.getLanguageName()); + hashMap.put(subtitleKey, k.getLanguageID()); + String icon = String.valueOf(R.drawable.ic_arrow_forward); + hashMap.put(iconKey, icon); + list.add(hashMap); + } + + String[] from = new String[]{titleKey, subtitleKey, iconKey}; + int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + + ListAdapter adapter = new SimpleAdapter(context, list, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + }; + listView.setAdapter(adapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + HashMap hashMap = (HashMap) parent.getItemAtPosition(position); + Keyboard k = availableKeyboardsList.get(position); + KMManager.addKeyboard(context, k); + Toast.makeText(context, "Keyboard added", Toast.LENGTH_LONG).show(); + finish(); + } + }); + } + + @Override + public boolean onSupportNavigateUp() { + super.onBackPressed(); + return true; + } +} diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java new file mode 100644 index 0000000000..ae7d4206ce --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java @@ -0,0 +1,116 @@ +/** + * Copyright (C) 2020 SIL International. All rights reserved. + */ + +package com.tavultesoft.kmapro; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.SimpleAdapter; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.tavultesoft.kmea.KMManager; +import com.tavultesoft.kmea.KMPBrowserActivity; +import com.tavultesoft.kmea.data.Keyboard; +import com.tavultesoft.kmea.data.KeyboardController; +import com.tavultesoft.kmea.util.KMLog; +import com.tavultesoft.kmea.util.MapCompat; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Keyman Settings --> KeymanInstallActivity --> SelectPackageActivity + * Displays a list of installed package ID / keyboard IDs so the user can select a language from the kmp.json + */ +public final class SelectPackageActivity extends AppCompatActivity { + private static final String TAG = "SelectPackageActivity"; + private static ArrayList> list = null; + private static Typeface titleFont = null; + private static final String titleKey = "title"; + private static final String subtitleKey = "subtitle"; + private static final String iconKey = "icon"; + private static Context context; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); + context = this; + + setContentView(R.layout.activity_list_layout); + final Toolbar toolbar = findViewById(R.id.list_toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + getSupportActionBar().setDisplayShowTitleEnabled(false); + + final ListView listView = findViewById(R.id.listView); + listView.setFastScrollEnabled(true); + + Bundle bundle = getIntent().getExtras(); + + final TextView textView = findViewById(R.id.bar_title); + textView.setText(getString(R.string.title_select_keyboard_package_list)); + if (titleFont != null) { + textView.setTypeface(titleFont, Typeface.BOLD); + } + + List packagesList = KeyboardController.getInstance().getInstalledPackagesList(); + if (packagesList == null) { + // Should never actually happen + KMLog.LogError(TAG, "Installed keyboard package list is empty"); + finish(); + } + + list = new ArrayList>(); + for (Keyboard k : packagesList) { + String keyboardName = k.getKeyboardName(); + String pkgID = k.getPackageID(); + final String noIcon = "0"; + HashMap hashMap = new HashMap<>(); + hashMap.put(titleKey, keyboardName); + hashMap.put(subtitleKey, pkgID); + String icon = String.valueOf(R.drawable.ic_arrow_forward); + hashMap.put(iconKey, icon); + list.add(hashMap); + } + + String[] from = new String[]{titleKey, subtitleKey, iconKey}; + int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + + ListAdapter adapter = new SimpleAdapter(context, list, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + }; + listView.setAdapter(adapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + HashMap hashMap = (HashMap) parent.getItemAtPosition(position); + Bundle bundle = new Bundle(); + bundle.putSerializable("keyboard", packagesList.get(position)); + Intent intent = new Intent(context, SelectLanguageActivity.class); + intent.putExtras(bundle); + context.startActivity(intent); + } + }); + } + + @Override + public boolean onSupportNavigateUp() { + super.onBackPressed(); + return true; + } +} diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml index 910e2efd18..83f40eafb4 100644 --- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml @@ -58,6 +58,10 @@ Add language to installed keyboard (from keyboard package) + + Select Keyboard Package + Select language for %1$s\ + Search or type URL Bookmarks diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java index d5dfffd904..2e7c3c0eaa 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/KeyboardController.java @@ -122,6 +122,37 @@ public class KeyboardController { } } + /** + * Returns the list of installed keyboards with unique packageID/keyboardID + */ + public List getInstalledPackagesList() { + if (!isInitialized) { + KMLog.LogError(TAG, "getInstalledPackagesList while KeyboardController() not initialized"); + return null; + } + synchronized (list) { + List packagesList = new ArrayList(); + // Iterate through the installed keyboards list to find unique packageID/keyboardID + for (int i=0; i getLanguageList(String packageID, String keyboardID) { + File packagePath = new File(resourceRoot, KMManager.KMDefault_AssetPackages + File.separator + packageID); + List list = new ArrayList(); + JSONObject infoJSON = loadPackageInfo(packagePath); + try { + JSONArray keyboards = infoJSON.getJSONArray("keyboards"); + + for (int i = 0; i < keyboards.length(); i++) { + JSONObject keyboard = keyboards.getJSONObject(i); + if (keyboardID.equals(keyboard.getString("id"))) { + // Find the keyboard already installed. We'll use it as the base + // for creating new keyboards + int baseKeyboardIndex = KeyboardController.getInstance().getKeyboardIndex(packageID, keyboardID, ""); + if (baseKeyboardIndex == KeyboardController.INDEX_NOT_FOUND) { + continue; + } + Keyboard baseKeyboard = KeyboardController.getInstance().getKeyboardInfo(baseKeyboardIndex); + + JSONArray languages = keyboard.getJSONArray("languages"); + for (int j=0; j < languages.length(); j++) { + JSONObject language = languages.getJSONObject(j); + String languageID = language.getString("id"); + String languageName = language.getString("name"); + if (!KeyboardController.getInstance().keyboardExists(packageID, keyboardID, languageID)) { + Keyboard newKeyboard = new Keyboard(baseKeyboard); + newKeyboard.setLanguage(languageID, languageName); + list.add(newKeyboard); + } + } + // no need to continue processing + return list; + } + } + } catch (Exception e) { + KMLog.LogException(TAG, "getLanguageList() ", e); + } + return list; + } + /** * The master KMP processing method; use after a .kmp download to fully install within the filesystem. * This will overwrite an existing package. From 8e5d29557f580c6837c0432ef0db41b53a29f8f5 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 18 Jun 2020 22:03:59 +0700 Subject: [PATCH 2/4] chore(android): Cleanup unused imports --- .../kmapro/SelectLanguageActivity.java | 26 ------------------- .../kmapro/SelectPackageActivity.java | 4 --- 2 files changed, 30 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index 9976b3d4c4..7e202a1f3a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -4,54 +4,29 @@ package com.tavultesoft.kmapro; -import android.app.ProgressDialog; import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Typeface; -import android.net.Uri; import android.os.Bundle; -import android.os.Handler; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; -import android.widget.ImageButton; -import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMPBrowserActivity; -import com.tavultesoft.kmea.cloud.CloudDataJsonUtil; -import com.tavultesoft.kmea.data.CloudRepository; -import com.tavultesoft.kmea.data.Dataset; import com.tavultesoft.kmea.data.Keyboard; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.data.adapters.AdapterFilter; -import com.tavultesoft.kmea.data.adapters.NestedAdapter; -import com.tavultesoft.kmea.logic.ResourcesUpdateTool; import com.tavultesoft.kmea.packages.PackageProcessor; -import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.MapCompat; import java.io.File; import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.Map; /** * Keyman Settings --> KeymanInstallActivity --> SelectPackageActivity --> SelectLanguageActivity @@ -60,7 +35,6 @@ import java.util.Map; public final class SelectLanguageActivity extends AppCompatActivity { private static final String TAG = "SelectLanguageActivity"; private static ArrayList> list = null; - private static KMListAdapter listAdapter = null; private static Typeface titleFont = null; private static final String titleKey = "title"; private static final String subtitleKey = "subtitle"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java index ae7d4206ce..cf25028dae 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectPackageActivity.java @@ -16,16 +16,12 @@ import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.KMPBrowserActivity; import com.tavultesoft.kmea.data.Keyboard; import com.tavultesoft.kmea.data.KeyboardController; import com.tavultesoft.kmea.util.KMLog; -import com.tavultesoft.kmea.util.MapCompat; import java.util.ArrayList; import java.util.HashMap; From 97540655bc34bc03a31106230d75f4bb6f8c5eed Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Fri, 19 Jun 2020 12:55:42 +0700 Subject: [PATCH 3/4] feat(android): Address review comments * Fix strings * Refactor keyboard/list generation and return all the languages * Modify adapter to disable installed languages --- .../kmapro/SelectLanguageActivity.java | 29 ++++++--- .../kMAPro/src/main/res/values/strings.xml | 5 +- .../kmea/packages/PackageProcessor.java | 59 +++++++++++++------ 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index 7e202a1f3a..abe38bb7e5 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -10,9 +10,7 @@ import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.AdapterView; -import android.widget.ListAdapter; import android.widget.ListView; -import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; @@ -21,6 +19,7 @@ import androidx.appcompat.widget.Toolbar; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.data.Keyboard; +import com.tavultesoft.kmea.data.KeyboardController; import com.tavultesoft.kmea.packages.PackageProcessor; import java.io.File; @@ -35,11 +34,14 @@ import java.util.List; public final class SelectLanguageActivity extends AppCompatActivity { private static final String TAG = "SelectLanguageActivity"; private static ArrayList> list = null; + private static KMListAdapter adapter = null; private static Typeface titleFont = null; private static final String titleKey = "title"; private static final String subtitleKey = "subtitle"; private static final String iconKey = "icon"; + private static final String isEnabledKey = "isEnabled"; private static Context context; + private static final boolean excludeInstalledLanguages = false; @Override public void onCreate(Bundle savedInstanceState) { @@ -68,27 +70,34 @@ public final class SelectLanguageActivity extends AppCompatActivity { textView.setTypeface(titleFont, Typeface.BOLD); } - // Get the list of available languages from kmp.json + // Get the list of available Keyboards from kmp.json File resourceRoot = new File(context.getDir("data", Context.MODE_PRIVATE).toString() + File.separator); PackageProcessor kmpProcessor = new PackageProcessor(resourceRoot); - List availableKeyboardsList = kmpProcessor.getLanguageList(packageID, keyboardID); + List availableKeyboardsList = kmpProcessor.getKeyboardList( + packageID, keyboardID, excludeInstalledLanguages); + final String noIcon = "0"; list = new ArrayList>(); for (Keyboard k : availableKeyboardsList) { - final String noIcon = "0"; HashMap hashMap = new HashMap<>(); hashMap.put(titleKey, k.getLanguageName()); hashMap.put(subtitleKey, k.getLanguageID()); + String enable = "true"; String icon = String.valueOf(R.drawable.ic_arrow_forward); + if (!excludeInstalledLanguages && KeyboardController.getInstance().keyboardExists( + k.getPackageID(), k.getKeyboardID(), k.getLanguageID())) { + icon = String.valueOf(R.drawable.ic_check); + enable = "false"; + } hashMap.put(iconKey, icon); + hashMap.put(isEnabledKey, enable); list.add(hashMap); } String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{R.id.text1, R.id.text2, com.tavultesoft.kmea.R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, list, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { - }; + adapter = new KMListAdapter(context, list, R.layout.list_row_layout2, from, to); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @@ -97,7 +106,9 @@ public final class SelectLanguageActivity extends AppCompatActivity { HashMap hashMap = (HashMap) parent.getItemAtPosition(position); Keyboard k = availableKeyboardsList.get(position); KMManager.addKeyboard(context, k); - Toast.makeText(context, "Keyboard added", Toast.LENGTH_LONG).show(); + String confirmation = String.format(getString(R.string.added_language_to_keyboard), + k.getLanguageName(), k.getKeyboardName()); + Toast.makeText(context, confirmation, Toast.LENGTH_LONG).show(); finish(); } }); diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml index 83f40eafb4..0620910a34 100644 --- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml @@ -58,9 +58,10 @@ Add language to installed keyboard (from keyboard package) - + Select Keyboard Package - Select language for %1$s\ + Select language for %1$s + Added language %1$s to %2$s Search or type URL 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 cd744d042c..8b7b07a1d1 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 @@ -410,14 +410,50 @@ public class PackageProcessor { return false; } + /** + * Generates a list of Keyboards from the keyboard JSONObject. baseKeyboard contains + * keyboard information that's already installed. + * @param keyboardJSON JSONObject - Keyboard JSONObject from kmp.json (entry for keyboardID) + * @param baseKeyboard Keyboard - information of the keyboard that's already installed + * @param excludeInstalledLanguages - boolean whether to exclude languages that are already installed + * @return List + */ + private List getKeyboards(JSONObject keyboardJSON, Keyboard baseKeyboard, + boolean excludeInstalledLanguages ) { + List list = new ArrayList(); + String packageID = baseKeyboard.getPackageID(); + String keyboardID = baseKeyboard.getKeyboardID(); + try { + JSONArray languages = keyboardJSON.getJSONArray("languages"); + for (int j = 0; j < languages.length(); j++) { + JSONObject language = languages.getJSONObject(j); + String languageID = language.getString("id"); + String languageName = language.getString("name"); + if (!excludeInstalledLanguages || + !(KeyboardController.getInstance().keyboardExists(packageID, keyboardID, languageID))) { + // Copy keyboard info and update language + Keyboard newKeyboard = new Keyboard(baseKeyboard); + newKeyboard.setLanguage(languageID, languageName); + list.add(newKeyboard); + } + } + } catch (Exception e) { + KMLog.LogException(TAG, "getKeyboards() ", e); + } + return list; + } + /** * Get a list of available keyboard and language pairings that are available to add - * (parses the kmp.json for the languagae list) + * (parses the kmp.json for the language list) * @param packageID - String of the package ID * @param keyboardID - String of the keyboard ID - * @return List of keyboards that haven't been added yet + * @param excludeInstalledLanguages - Boolean whether to exclude + * installed languages from the returned list. + * @return List of based on kmp.json. If excludeInstalledLanguages is true, this list + * excludes languages already installed */ - public List getLanguageList(String packageID, String keyboardID) { + public List getKeyboardList(String packageID, String keyboardID, boolean excludeInstalledLanguages) { File packagePath = new File(resourceRoot, KMManager.KMDefault_AssetPackages + File.separator + packageID); List list = new ArrayList(); JSONObject infoJSON = loadPackageInfo(packagePath); @@ -434,24 +470,11 @@ public class PackageProcessor { continue; } Keyboard baseKeyboard = KeyboardController.getInstance().getKeyboardInfo(baseKeyboardIndex); - - JSONArray languages = keyboard.getJSONArray("languages"); - for (int j=0; j < languages.length(); j++) { - JSONObject language = languages.getJSONObject(j); - String languageID = language.getString("id"); - String languageName = language.getString("name"); - if (!KeyboardController.getInstance().keyboardExists(packageID, keyboardID, languageID)) { - Keyboard newKeyboard = new Keyboard(baseKeyboard); - newKeyboard.setLanguage(languageID, languageName); - list.add(newKeyboard); - } - } - // no need to continue processing - return list; + return getKeyboards(keyboard, baseKeyboard, excludeInstalledLanguages); } } } catch (Exception e) { - KMLog.LogException(TAG, "getLanguageList() ", e); + KMLog.LogException(TAG, "getKeyboardList() ", e); } return list; } From 6e2770535f950dee28c59b3503d288fe21b2035b Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Fri, 19 Jun 2020 13:21:26 +0700 Subject: [PATCH 4/4] feat(android): SelectLanguage title depends on installed list --- .../com/tavultesoft/kmapro/SelectLanguageActivity.java | 8 ++++++-- android/KMAPro/kMAPro/src/main/res/values/strings.xml | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java index abe38bb7e5..fd4b81432b 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/SelectLanguageActivity.java @@ -63,9 +63,10 @@ public final class SelectLanguageActivity extends AppCompatActivity { final String packageID = keyboard.getPackageID(); final String keyboardID = keyboard.getKeyboardID(); final String keyboardName = keyboard.getKeyboardName(); - String title = String.format(getString(R.string.title_select_language_for_package), keyboardName); + String title_install = String.format(getString(R.string.title_select_language_for_package), keyboardName); + String title_no_install = getString(R.string.all_languages_installed); final TextView textView = findViewById(R.id.bar_title); - textView.setText(title); + textView.setText(title_no_install); if (titleFont != null) { textView.setTypeface(titleFont, Typeface.BOLD); } @@ -88,6 +89,9 @@ public final class SelectLanguageActivity extends AppCompatActivity { k.getPackageID(), k.getKeyboardID(), k.getLanguageID())) { icon = String.valueOf(R.drawable.ic_check); enable = "false"; + } else { + // Update title + textView.setText(title_install); } hashMap.put(iconKey, icon); hashMap.put(isEnabledKey, enable); diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml index 0620910a34..6cc1c176ca 100644 --- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml @@ -62,6 +62,7 @@ Select Keyboard Package Select language for %1$s Added language %1$s to %2$s + All languages already installed Search or type URL