From 2e36fb8acf296872d541aa855d0a7cd1523e67ee Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 24 Aug 2021 14:07:35 +0700 Subject: [PATCH] fix(android): Fix Chrome version ranges for Keyman engine functionality --- .../com/tavultesoft/kmapro/MainActivity.java | 3 +-- .../java/com/tavultesoft/kmea/KMManager.java | 23 +++++++++++++++---- .../tavultesoft/kmea/util/WebViewUtils.java | 15 ++++++------ .../kmea/util/WebViewUtilsTest.java | 15 ++++++++---- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java index 5fc6e1d0b7..e120e75867 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java @@ -40,7 +40,6 @@ import com.keyman.android.DownloadIntentService; import com.tavultesoft.kmea.util.KMLog; import com.tavultesoft.kmea.util.KMPLink; import com.tavultesoft.kmea.util.KMString; -import com.tavultesoft.kmea.util.WebViewUtils; import com.tavultesoft.kmea.util.WebViewUtils.EngineWebViewVersionStatus; import android.Manifest; @@ -780,7 +779,7 @@ public class MainActivity extends BaseActivity implements OnKeyboardEventListene } private void checkChromeVersion(WebView webView) { - if (WebViewUtils.getEngineWebViewVersionStatus(context, webView, "") != EngineWebViewVersionStatus.FULL) { + if (KMManager.getEngineWebViewVersionStatus() != EngineWebViewVersionStatus.FULL) { LinearLayout updateChromeLayout = (LinearLayout) findViewById(R.id.updateChromeLayout); updateChromeLayout.setVisibility(View.VISIBLE); 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 c041789adf..a1fd43c9c3 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 @@ -179,6 +179,8 @@ public final class KMManager { protected static KMKeyboard InAppKeyboard = null; protected static KMKeyboard SystemKeyboard = null; protected static HashMap currentLexicalModel = null; + protected static WebViewUtils.EngineWebViewVersionStatus engineWebViewVersionStatus = + WebViewUtils.EngineWebViewVersionStatus.UNDETERMINED; public final static String predictionPrefSuffix = ".mayPredict"; public final static String correctionPrefSuffix = ".mayCorrect"; @@ -371,13 +373,20 @@ public final class KMManager { } /** - * Get the Keyman Engine mode based on the Chrome version - * @param aContext - * @param webView - If provided, the Chrome version of webView is deterermined + * Get the Keyman Engine mode. * @return WebViewUtils.EngineWebViewVersionStatus */ - public static WebViewUtils.EngineWebViewVersionStatus getEngineWebViewVersionStatus(Context aContext, WebView webView) { - return WebViewUtils.getEngineWebViewVersionStatus(aContext, webView, ""); + public static WebViewUtils.EngineWebViewVersionStatus getEngineWebViewVersionStatus() { + return engineWebViewVersionStatus; + } + + /** + * Set the Keyman Engine mode based on the Chrome version + * @param aContext + * @param webView - If provided, the Chrome version of the WebView is determined + */ + public static void setEngineWebViewVersionStatus(Context aContext, WebView webView) { + engineWebViewVersionStatus = WebViewUtils.getEngineWebViewVersionStatus(aContext, webView, ""); } // Check if a keyboard namespace is reserved @@ -515,6 +524,8 @@ public final class KMManager { InAppKeyboard.setWebViewClient(new KMInAppKeyboardWebViewClient(appContext)); InAppKeyboard.addJavascriptInterface(new KMInAppKeyboardJSHandler(appContext, InAppKeyboard), "jsInterface"); InAppKeyboard.loadKeyboard(); + + setEngineWebViewVersionStatus(appContext, InAppKeyboard); } } @@ -528,6 +539,8 @@ public final class KMManager { SystemKeyboard.setWebViewClient(new KMSystemKeyboardWebViewClient(appContext)); SystemKeyboard.addJavascriptInterface(new KMSystemKeyboardJSHandler(appContext, SystemKeyboard), "jsInterface"); SystemKeyboard.loadKeyboard(); + + setEngineWebViewVersionStatus(appContext, SystemKeyboard); } } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java index 02cd91dabc..e31b8860a1 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/WebViewUtils.java @@ -16,9 +16,10 @@ public final class WebViewUtils { // Keyman Engine functionality based on Chrome version public enum EngineWebViewVersionStatus { - DISABLED, // WebView doesn't support touch keyboard features - DEGRADED, // WebView supports touch keyboards but not LDML keyboards - FULL; // WebView supports touch keyboards and LDML keyboards + UNDETERMINED, // Functionality not determined yet + DISABLED, // WebView doesn't support touch keyboard features + DEGRADED, // WebView supports touch keyboards but not LDML keyboards + FULL; // WebView supports touch keyboards and LDML keyboards } private static final String CHROME_INSTALL_PATTERN_FORMATSTR = "^.*Chrome/([\\d.]+).*$"; @@ -41,13 +42,13 @@ public final class WebViewUtils { chromeVersion = getChromeVersion(context, webView); } - if (FileUtils.compareVersions(chromeVersion, "57.0") == FileUtils.VERSION_GREATER) { - return EngineWebViewVersionStatus.FULL; - } else if (FileUtils.compareVersions(chromeVersion, "37.0") == FileUtils.VERSION_GREATER) { + if (FileUtils.compareVersions("37.0", chromeVersion) == FileUtils.VERSION_GREATER) { + return EngineWebViewVersionStatus.DISABLED; + } else if (FileUtils.compareVersions("57.0", chromeVersion) == FileUtils.VERSION_GREATER) { return EngineWebViewVersionStatus.DEGRADED; } - return EngineWebViewVersionStatus.DISABLED; + return EngineWebViewVersionStatus.FULL; } // Inject a meta viewport tag into the head of the file if it doesn't exist diff --git a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java index e1b4499bc2..ec70707392 100644 --- a/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java +++ b/android/KMEA/app/src/test/java/com/tavultesoft/kmea/util/WebViewUtilsTest.java @@ -38,15 +38,22 @@ public class WebViewUtilsTest { } @Test - public void test_Chrome57_EngineWebViewVersionStatusDegraded() { - String chromeVersion = "57.0"; + public void test_Chrome37_EngineWebViewVersionStatusDegraded() { + String chromeVersion = "37.0"; Assert.assertEquals(WebViewUtils.getEngineWebViewVersionStatus(context, null, chromeVersion), WebViewUtils.EngineWebViewVersionStatus.DEGRADED); } @Test - public void test_Chrome58_EngineWebViewVersionStatusFull() { - String chromeVersion = "58.0"; + public void test_Chrome56_EngineWebViewVersionStatusDegraded() { + String chromeVersion = "56.0"; + Assert.assertEquals(WebViewUtils.getEngineWebViewVersionStatus(context, null, chromeVersion), + WebViewUtils.EngineWebViewVersionStatus.DEGRADED); + } + + @Test + public void test_Chrome57_EngineWebViewVersionStatusFull() { + String chromeVersion = "57.0"; Assert.assertEquals(WebViewUtils.getEngineWebViewVersionStatus(context, null, chromeVersion), WebViewUtils.EngineWebViewVersionStatus.FULL); }