From d9c48d27237c1040267e1e22cc2ca535efd497be Mon Sep 17 00:00:00 2001 From: jahorton Date: Wed, 8 May 2019 09:10:20 +0700 Subject: [PATCH] Fixes issues with context reset ops. --- .../KMEI/KeymanEngine/Classes/InputViewController.swift | 7 +++++++ .../KeymanEngine/Classes/KeymanWebViewController.swift | 4 ++++ ios/engine/KMEI/KeymanEngine/Classes/Manager.swift | 4 ++++ ios/engine/KMEI/KeymanEngine/Classes/TextField.swift | 3 +++ ios/engine/KMEI/KeymanEngine/Classes/TextView.swift | 3 +++ 5 files changed, 21 insertions(+) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift index a910d7d95d..191c129716 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift @@ -210,6 +210,8 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { } setContextState(text: context, range: NSRange(newRange, in: context)) + // Within the app, this is triggered after every keyboard input. + // We should NOT call .resetContext() here for this reason. } @objc func clearSwallowFlag() { @@ -429,8 +431,13 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { func clearText() { setContextState(text: nil, range: NSRange(location: 0, length: 0)) + keymanWeb.resetContext() log.info("Cleared text.") } + + func resetContext() { + keymanWeb.resetContext() + } func setContextState(text: String?, range: NSRange) { // Check for any LTR or RTL marks at the context's start; if they exist, we should diff --git a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift index 830dd233cd..8f15a6ae22 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift @@ -195,6 +195,10 @@ extension KeymanWebViewController { text = text.replacingOccurrences(of: "\n", with: "\\n") webView!.evaluateJavaScript("setKeymanVal('\(text)');", completionHandler: nil) } + + func resetContext() { + webView!.evaluateJavaScript("keyman.interface.resetContext();", completionHandler: nil) + } func setDeviceType(_ idiom: UIUserInterfaceIdiom) { let type: String diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift index 385cbe82ad..fce02a2541 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift @@ -906,6 +906,10 @@ public class Manager: NSObject, HTTPDownloadDelegate, UIGestureRecognizerDelegat func clearText() { inputViewController.clearText() } + + func resetContext() { + inputViewController.resetContext() + } func setContextState(text: String?, range: NSRange) { inputViewController.setContextState(text: text, range: range) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift b/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift index ad964d59b0..1e4b308e75 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift @@ -117,6 +117,7 @@ public class TextField: UITextField, KeymanResponder { length: offset(from: textRange.start, to: textRange.end)) Manager.shared.setContextState(text: self.text, range: newRange) + Manager.shared.resetContext() } } @@ -129,6 +130,7 @@ public class TextField: UITextField, KeymanResponder { length: offset(from: range.start, to: range.end)) Manager.shared.setContextState(text: self.text, range: newRange) + Manager.shared.resetContext() } } @@ -165,6 +167,7 @@ public class TextField: UITextField, KeymanResponder { length: offset(from: textRange.start, to: textRange.end)) Manager.shared.setContextState(text: text, range: newRange) + Manager.shared.resetContext() shouldUpdateKMText = false } } diff --git a/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift b/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift index 03024828e7..7233a1781b 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift @@ -110,12 +110,14 @@ public class TextView: UITextView, KeymanResponder { } Manager.shared.inputViewController.setContextState(text: self.text, range: selectedRange) + Manager.shared.resetContext() } } public override var selectedTextRange: UITextRange? { didSet { Manager.shared.setContextState(text: self.text, range: selectedRange) + Manager.shared.resetContext() } } @@ -272,6 +274,7 @@ extension TextView: UITextViewDelegate { if shouldUpdateKMText { // Catches copy/paste operations Manager.shared.setContextState(text: textView.text, range: textView.selectedRange) + Manager.shared.resetContext() shouldUpdateKMText = false } }