diff --git a/android/KMEA/app/src/main/assets/android-host.js b/android/KMEA/app/src/main/assets/android-host.js index 7736fc6c60f..1e30573d921 100644 --- a/android/KMEA/app/src/main/assets/android-host.js +++ b/android/KMEA/app/src/main/assets/android-host.js @@ -230,10 +230,8 @@ function setNumericLayer() { } } -function updateKMText(text) { - if(text == undefined) { - text = ''; - } +function updateKMText(k) { + var text = (k == undefined) || !k.text ? '' : k.text; console_debug('updateKMText(text=' + text + ') with: \n' + build_context_string(keyman.context)); diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboard.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboard.java index cbc859d352b..9e8472b720d 100644 --- a/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboard.java +++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMKeyboard.java @@ -29,6 +29,7 @@ import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.res.Configuration; +import android.net.Uri; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; @@ -149,17 +150,19 @@ protected void setShouldIgnoreSelectionChange(boolean ignore) { protected boolean updateText(String text) { boolean result = false; + JSONObject reg = new JSONObject(); String kmText = ""; if (text != null) { - // Replace special literal characters to pass to Javascript - kmText = text.toString().replace("\\", "\\u005C") - .replace("%", "\\u0025") - .replace("'", "\\u0027") - .replace("\n", "\\n"); + // Use JSON to handle passing string to Javascript + try { + reg.put("text", text.toString()); + } catch (JSONException e) { + KMLog.LogException(TAG, "", e); + } } if (KMManager.isKeyboardLoaded(this.keyboardType) && !shouldIgnoreTextChange) { - this.loadJavascript(KMString.format("updateKMText('%s')", kmText)); + this.loadJavascript(KMString.format("updateKMText(%s)", reg.toString())); result = true; } @@ -348,7 +351,8 @@ public void run() { allCalls.append(";"); } - loadUrl("javascript:" + allCalls.toString()); + // Ensure strings save for Javascript. TBD: Spacebartext, font + loadUrl("javascript:" + Uri.encode(allCalls.toString())); if(javascriptAfterLoad.size() > 0 && keyboardSet) { callJavascriptAfterLoad();