diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml index 9052f4bbd9..f90d471d35 100644 --- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml +++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml @@ -192,15 +192,6 @@ android:launchMode="singleTask" android:theme="@style/AppTheme.Base" /> - - - \ No newline at end of file diff --git a/android/KMEA/app/src/main/AndroidManifest.xml b/android/KMEA/app/src/main/AndroidManifest.xml index 28dedc9740..4b2f8eb62c 100644 --- a/android/KMEA/app/src/main/AndroidManifest.xml +++ b/android/KMEA/app/src/main/AndroidManifest.xml @@ -69,6 +69,16 @@ android:theme="@style/Theme.AppCompat.Light.Dialog" > + + + + \ No newline at end of file diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java index ea84960876..766557ce89 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java @@ -39,6 +39,7 @@ public class KMKeyboardDownloaderActivity extends AppCompatActivity { public static final String ARG_MODEL_ID = "KMKeyboardActivity.modelID"; public static final String ARG_MODEL_NAME = "KMKeyboardActivity.modelName"; public static final String ARG_MODEL_URL = "KMKeyboardActivity.modelURL"; + public static final String ARG_MODEL_CUSTOM_HELP_LINK = "KMKeyboardActivity.customHelpLink"; // custom keyboard public static final String ARG_KEYBOARD = "KMKeyboardActivity.keyboard"; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java index bccc76f973..158968e5e2 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMManager.java @@ -701,6 +701,7 @@ public final class KMManager { languageJSONArray.put(languageID); modelObj.put("languages", languageJSONArray); modelObj.put("path", path); + modelObj.put("CustomHelpLink", lexicalModelInfo.get(KMKey_CustomHelpLink)); } catch (JSONException e) { Log.e(TAG, "Invalid lexical model to register"); return false; @@ -770,7 +771,7 @@ public final class KMManager { * Search the installed lexical models list and see if there's an * associated model for a given language ID * @param langId - String of the language ID - * @return HashMap Keyboard information if it exists. Otherwise null + * @return HashMap Model information if it exists. Otherwise null */ public static HashMap getAssociatedLexicalModel(String langId) { ArrayList> lexicalModelsList = getLexicalModelsList(appContext); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java index f3ff21cc06..d04714be42 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java @@ -100,7 +100,7 @@ public final class KeyboardInfoActivity extends AppCompatActivity { // Starting with Android N, you can't pass file:// to intents, so we use FileProvider try { Uri contentUri = FileProvider.getUriForFile( - context, getApplication().getPackageName() + ".fileProvider", customHelp); + context, "com.tavultesoft.kmea.fileProvider", customHelp); i.setDataAndType(contentUri, "text/html"); } catch (Exception e) { Log.e("KeyboardInfoActivity", "Failed to access " + customHelp.toString()); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardSettingsActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardSettingsActivity.java index 85aeac80b0..db82379430 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardSettingsActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardSettingsActivity.java @@ -27,6 +27,7 @@ import android.widget.SimpleAdapter; import android.widget.TextView; import com.tavultesoft.kmea.util.FileUtils; +import com.tavultesoft.kmea.util.MapCompat; import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_KEYBOARD; @@ -41,6 +42,7 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { private final String titleKey = "title"; private final String subtitleKey = "subtitle"; private final String iconKey = "icon"; + private final String isEnabledKey = "isEnabled"; @Override public void onCreate(Bundle savedInstanceState) { @@ -68,9 +70,10 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { if (titleFont != null) textView.setTypeface(titleFont, Typeface.BOLD); - boolean isCustomKeyboard = getIntent().getBooleanExtra(KMManager.KMKey_CustomKeyboard, false); + final boolean isCustomKeyboard = getIntent().getBooleanExtra(KMManager.KMKey_CustomKeyboard, false); infoList = new ArrayList>(); + // Display keyboard version title String icon = "0"; HashMap hashMap = new HashMap(); hashMap.put(titleKey, getString(R.string.keyboard_version)); @@ -78,15 +81,18 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { hashMap.put(iconKey, icon); infoList.add(hashMap); + // Display keyboard help link final String customHelpLink = getIntent().getStringExtra(KMManager.KMKey_CustomHelpLink); - if (!isCustomKeyboard || customHelpLink != null) { + if (isCustomKeyboard && customHelpLink == null) { + icon = "0"; + } else { icon = String.valueOf(R.drawable.ic_arrow_forward); - hashMap = new HashMap(); - hashMap.put(titleKey, getString(R.string.help_link)); - hashMap.put(subtitleKey, ""); - hashMap.put(iconKey, icon); - infoList.add(hashMap); } + hashMap = new HashMap(); + hashMap.put(titleKey, getString(R.string.help_link)); + hashMap.put(subtitleKey, ""); + hashMap.put(iconKey, icon); + infoList.add(hashMap); if (!packageID.equalsIgnoreCase(KMManager.KMDefault_UndefinedPackageID) || !kbID.equalsIgnoreCase(KMManager.KMDefault_KeyboardID)) { @@ -100,13 +106,34 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { String[] from = new String[]{titleKey, subtitleKey, iconKey}; int[] to = new int[]{R.id.text1, R.id.text2, R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, infoList, R.layout.list_row_layout2, from, to); + + ListAdapter adapter = new SimpleAdapter(context, infoList, R.layout.list_row_layout2, from, to) { + @Override + public boolean isEnabled(int position) { + HashMap hashMap = (HashMap) infoList.get(position); + String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); + + if (itemTitle.equals(getString(R.string.keyboard_version))) { + // No point in 'clicking' on version info. + return false; + // Visibly disables the help option when help isn't available. + } else if (itemTitle.equals(getString(R.string.help_link)) && isCustomKeyboard && customHelpLink == null) { + return false; + } + + return super.isEnabled(position); + } + }; listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - if (position == 1) { + HashMap hashMap = (HashMap)parent.getItemAtPosition(position); + String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); + + // "Help" link clicked + if (itemTitle.equals(getString(R.string.help_link))) { Intent i = new Intent(Intent.ACTION_VIEW); if (customHelpLink != null) { @@ -116,7 +143,7 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { // Starting with Android N, you can't pass file:// to intents, so we use FileProvider try { Uri contentUri = FileProvider.getUriForFile( - context, getApplication().getPackageName() + ".fileProvider", customHelp); + context, "com.tavultesoft.kmea.fileProvider", customHelp); i.setDataAndType(contentUri, "text/html"); } catch (Exception e) { Log.e("KeyboardInfoActivity", "Failed to access " + customHelp.toString()); @@ -131,7 +158,8 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { i.setData(Uri.parse(helpUrlStr)); startActivity(i); } - } else if (position == 2) { + // "Uninstall Keyboard" clicked + } else if (itemTitle.equals(getString(R.string.uninstall_keyboard))) { // Uninstall selected keyboard String title = String.format("%s: %s", languageName, kbName); String keyboardKey = String.format("%s_%s", languageID, kbID); @@ -140,11 +168,7 @@ public final class KeyboardSettingsActivity extends AppCompatActivity { dialog.show(getFragmentManager(), "dialog"); } } - - }); - - } @Override diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java index 807507078e..27828e8964 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguageSettingsActivity.java @@ -47,6 +47,7 @@ public final class LanguageSettingsActivity extends AppCompatActivity { private String associatedLexicalModel = ""; private String lgCode; private String lgName; + private String customHelpLink; private SharedPreferences prefs; private final static String TAG = "LanguageSettingsAct"; @@ -119,6 +120,7 @@ public final class LanguageSettingsActivity extends AppCompatActivity { lgCode = bundle.getString(KMManager.KMKey_LanguageID); lgName = bundle.getString(KMManager.KMKey_LanguageName); + customHelpLink = bundle.getString(KMManager.KMKey_CustomHelpLink); // Necessary to properly insert a language name into the title. (Has a %s slot for it.) String title = String.format(getString(R.string.title_language_settings), lgName); @@ -168,6 +170,7 @@ public final class LanguageSettingsActivity extends AppCompatActivity { Bundle bundle = new Bundle(); bundle.putString(KMManager.KMKey_LanguageID, lgCode); bundle.putString(KMManager.KMKey_LanguageName, lgName); + bundle.putString(KMManager.KMKey_CustomHelpLink, customHelpLink); Intent i = new Intent(context, ModelPickerActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); i.putExtras(bundle); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguagesSettingsActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguagesSettingsActivity.java index 438b4bd6ac..50fd72cd8f 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguagesSettingsActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/LanguagesSettingsActivity.java @@ -107,6 +107,7 @@ public final class LanguagesSettingsActivity extends AppCompatActivity if(associatedLexicalModel != null) { args.putString(KMManager.KMKey_LexicalModelName, associatedLexicalModel.get(KMManager.KMKey_LexicalModelName)); + args.putString(KMManager.KMKey_CustomHelpLink, associatedLexicalModel.get(KMManager.KMKey_CustomHelpLink)); } Intent intent = new Intent(context, LanguageSettingsActivity.class); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java index 198f19cec3..93ba85519c 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java @@ -31,6 +31,7 @@ import android.widget.TextView; import android.widget.Toast; import com.tavultesoft.kmea.util.FileUtils; +import com.tavultesoft.kmea.util.MapCompat; import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_MODEL; @@ -72,10 +73,9 @@ public final class ModelInfoActivity extends AppCompatActivity { textView.setTypeface(titleFont, Typeface.BOLD); final String modelVersion = getIntent().getStringExtra(KMManager.KMKey_LexicalModelVersion); - final String customModel = getIntent().getStringExtra(KMManager.KMKey_CustomModel); infoList = new ArrayList>(); - // Display model title + // Display model version title final String noIcon = "0"; HashMap hashMap = new HashMap(); hashMap.put(titleKey, getString(R.string.model_version)); @@ -85,17 +85,16 @@ public final class ModelInfoActivity extends AppCompatActivity { // Display model help link final String customHelpLink = getIntent().getStringExtra(KMManager.KMKey_CustomHelpLink); - String icon = String.valueOf(R.drawable.ic_arrow_forward); hashMap = new HashMap(); hashMap.put(titleKey, getString(R.string.help_link)); hashMap.put(subtitleKey, ""); - if(customHelpLink != null) { + // For now, lexical model help only available when installed via custom packages + if(!customHelpLink.equals("")) { hashMap.put(iconKey, icon); } else { hashMap.put(iconKey, noIcon); } - infoList.add(hashMap); // Display link to uninstall model @@ -111,11 +110,14 @@ public final class ModelInfoActivity extends AppCompatActivity { ListAdapter adapter = new SimpleAdapter(context, infoList, R.layout.list_row_layout2, from, to) { @Override public boolean isEnabled(int position) { - if(position == 0) { + HashMap hashMap = (HashMap)infoList.get(position); + String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); + + if (itemTitle.equals(getString(R.string.model_version))) { // No point in 'clicking' on version info. return false; // Visibly disables the help option when help isn't available. - } else if(position == 1 && customHelpLink == null) { + } else if (itemTitle.equals(getString(R.string.help_link)) && customHelpLink.equals("")) { return false; } @@ -127,18 +129,21 @@ public final class ModelInfoActivity extends AppCompatActivity { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - if (position == 1) { - // Help link to model + HashMap hashMap = (HashMap)parent.getItemAtPosition(position); + String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); + + // "Help" link clicked + if (itemTitle.equals(getString(R.string.help_link))) { Intent i = new Intent(Intent.ACTION_VIEW); - if (customHelpLink != null) { + if (!customHelpLink.equals("")) { if (FileUtils.isWelcomeFile(customHelpLink)) { File customHelp = new File(new File(customHelpLink).getAbsolutePath()); i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Starting with Android N, you can't pass file:// to intents, so we use FileProvider try { Uri contentUri = FileProvider.getUriForFile( - context, getApplication().getPackageName() + ".fileProvider", customHelp); + context, "com.tavultesoft.kmea.fileProvider", customHelp); i.setDataAndType(contentUri, "text/html"); } catch (Exception e) { Log.e("ModelInfoActivity", "Failed to access " + customHelp.toString()); @@ -151,8 +156,9 @@ public final class ModelInfoActivity extends AppCompatActivity { } else { // We should always have a help file packaged with models. } - } else if (position == 2) { - // Confirmation to delete model + // "Uninstall Model" clicked + } else if (itemTitle.equals(getString(R.string.uninstall_model))) { + // Uninstall selected model String lexicalModelKey = String.format("%s_%s_%s", packageID, languageID, modelID); DialogFragment dialog = ConfirmDialogFragment.newInstance( DIALOG_TYPE_DELETE_MODEL, modelName, getString(R.string.confirm_delete_model), lexicalModelKey); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java index 9765d3280f..b2301d671b 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java @@ -46,6 +46,7 @@ public final class ModelPickerActivity extends AppCompatActivity { private final static String TAG = "ModelPickerActivity"; private String languageID = ""; + private String customHelpLink = ""; @Override public void onCreate(Bundle savedInstanceState) { @@ -63,9 +64,11 @@ public final class ModelPickerActivity extends AppCompatActivity { Bundle bundle = getIntent().getExtras(); String newLanguageID = bundle.getString(KMManager.KMKey_LanguageID); + String newCustomHelpLink = bundle.getString(KMManager.KMKey_CustomHelpLink); // Sometimes we need to re-initialize the list of models that are displayed in the ListView languageID = newLanguageID; + customHelpLink = newCustomHelpLink; final String languageName = bundle.getString(KMManager.KMKey_LanguageName); textView.setText(String.format(getString(R.string.model_picker_header), languageName)); @@ -123,8 +126,7 @@ public final class ModelPickerActivity extends AppCompatActivity { bundle.putString(KMManager.KMKey_LexicalModelName, modelName); bundle.putString(KMManager.KMKey_LexicalModelVersion, modelInfo.get(KMManager.KMKey_LexicalModelVersion)); - bundle.putString(KMManager.KMKey_CustomModel, - MapCompat.getOrDefault(new HashMap<>(modelInfo), KMManager.KMKey_CustomModel, "N")); + bundle.putString(KMManager.KMKey_CustomHelpLink, customHelpLink); Intent i = new Intent(context, ModelInfoActivity.class); i.putExtras(bundle); startActivityForResult(i, 1); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java index 936c7b9b45..2dddca0ddb 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/data/LexicalModel.java @@ -64,6 +64,8 @@ public class LexicalModel implements Serializable, LanguageResource { return null; } + String customHelpLink = map.get(KMManager.KMKey_CustomHelpLink); + bundle.putString(KMKeyboardDownloaderActivity.ARG_PKG_ID, getPackage()); bundle.putString(KMKeyboardDownloaderActivity.ARG_MODEL_ID, getResourceId()); bundle.putString(KMKeyboardDownloaderActivity.ARG_LANG_ID, getLanguageCode()); @@ -71,6 +73,7 @@ public class LexicalModel implements Serializable, LanguageResource { bundle.putString(KMKeyboardDownloaderActivity.ARG_LANG_NAME, getLanguageName()); bundle.putBoolean(KMKeyboardDownloaderActivity.ARG_IS_CUSTOM, false); bundle.putString(KMKeyboardDownloaderActivity.ARG_MODEL_URL, modelURL); + bundle.putString(KMKeyboardDownloaderActivity.ARG_MODEL_CUSTOM_HELP_LINK, customHelpLink); return bundle; } 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 3a15cdf17f..14b1f96bb4 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 @@ -80,6 +80,8 @@ public class LexicalModelPackageProcessor extends PackageProcessor { File welcomeFile = new File(packageDir, "welcome.htm"); // Only storing relative instead of absolute paths as a convenience for unit tests. models[i].put(KMManager.KMKey_CustomHelpLink, welcomeFile.getPath()); + } else { + models[i].put(KMManager.KMKey_CustomHelpLink, ""); } } return models; diff --git a/android/KMAPro/kMAPro/src/main/res/xml/file_paths.xml b/android/KMEA/app/src/main/res/xml/file_paths.xml similarity index 68% rename from android/KMAPro/kMAPro/src/main/res/xml/file_paths.xml rename to android/KMEA/app/src/main/res/xml/file_paths.xml index 0ca3a0ac7a..d49c655026 100644 --- a/android/KMAPro/kMAPro/src/main/res/xml/file_paths.xml +++ b/android/KMEA/app/src/main/res/xml/file_paths.xml @@ -1,5 +1,7 @@ + + 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 4eb4e59886..8d79f64923 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 @@ -73,6 +73,7 @@ public class LexicalModelPackageProcessorTest { en_custom.put(KMManager.KMKey_LexicalModelVersion, "1.0.0"); en_custom.put(KMManager.KMKey_LanguageID, "en"); en_custom.put(KMManager.KMKey_LanguageName, "English"); + en_custom.put(KMManager.KMKey_CustomHelpLink, ""); Assert.assertEquals(en_custom, models[0]); diff --git a/android/history.md b/android/history.md index 3bfd484b14..2135439cbb 100644 --- a/android/history.md +++ b/android/history.md @@ -7,6 +7,9 @@ * New Feature: * Allow user to "Add keyboard from local device" from Settings menu (#1992) +* Bug Fix: + * Fix keyboard and dictionary info pages (#2020) + ## 2019-08-27 12.0.4080 beta * Fix menu icon and text alignment (#1999)