diff --git a/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine.h b/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine.h index b13c1dc491aba4568b444618b5c2b1163fdb7c37..2b0f336fa08f92aea8299fc59feb1575177aec06 100644 --- a/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine.h +++ b/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine.h @@ -35,6 +35,8 @@ namespace OHOS { std::mutex mtx_; NativeValue* OnRegisterCallback(NativeEngine& engine, NativeCallbackInfo& info); NativeValue* OnUnRegisterCallback(NativeEngine& engine, NativeCallbackInfo& info); + std::shared_ptr GetMainHandler(); + std::shared_ptr mainHandler_ = nullptr; }; } } diff --git a/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine_listener.h b/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine_listener.h index 49dc77885c964444ca7bbb2c05044cf5a414a53a..0b0dc09b6bf135687180d88d4a0cdbad0dd29fbe 100644 --- a/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine_listener.h +++ b/interfaces/kits/js/napi/inputmethodengine/include/js_input_method_engine_listener.h @@ -23,11 +23,15 @@ #include #include "native_engine/native_engine.h" #include "native_engine/native_value.h" +#include "event_handler.h" +#include "event_runner.h" namespace OHOS { namespace MiscServices { class JsInputMethodEngineListener : virtual public RefBase { public: explicit JsInputMethodEngineListener(NativeEngine* engine) : engine_(engine) {} + JsInputMethodEngineListener(NativeEngine* engine, std::shared_ptr &handler) + : engine_(engine), mainHandler_(handler) {} virtual ~JsInputMethodEngineListener() = default; void RegisterListenerWithType(NativeEngine& engine, std::string type, NativeValue* value); void UnregisterListenerWithType(std::string type, NativeValue* value); @@ -43,6 +47,7 @@ namespace MiscServices { NativeEngine* engine_ = nullptr; std::mutex mMutex; std::map>> jsCbMap_; + std::shared_ptr mainHandler_ = nullptr; }; } } diff --git a/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine.cpp b/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine.cpp index ca145af535ea37240e8d391802ef07955903543d..6c0eb13d946e8fad5717f7341b5306a6bca8f00d 100644 --- a/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine.cpp +++ b/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine.cpp @@ -29,7 +29,8 @@ namespace MiscServices { JsInputMethodEngine::JsInputMethodEngine(NativeEngine* engine) { IMSA_HILOGI("JsInputMethodEngine::Constructor is called"); - imeListener_ = new JsInputMethodEngineListener(engine); + auto mainHandler = GetMainHandler(); + imeListener_ = new JsInputMethodEngineListener(engine, mainHandler); InputMethodAbility::GetInstance()->setImeListener(imeListener_); } @@ -39,6 +40,15 @@ namespace MiscServices { std::unique_ptr(static_cast(data)); } + std::shared_ptr JsInputMethodEngine::GetMainHandler() + { + if (!mainHandler_) { + mainHandler_ = + std::make_shared(AppExecFwk::EventRunner::GetMainEventRunner()); + } + return mainHandler_; + } + NativeValue* JsInputMethodEngine::RegisterCallback(NativeEngine* engine, NativeCallbackInfo* info) { JsInputMethodEngine* me = CheckParamsAndGetThis(engine, info); diff --git a/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine_listener.cpp b/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine_listener.cpp index 641ba20f9c74d6a7abd6c219b27e8f8a0b545408..697377eca0d9ed8cd778e0cedf293f14199df825 100644 --- a/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine_listener.cpp +++ b/interfaces/kits/js/napi/inputmethodengine/src/js_input_method_engine_listener.cpp @@ -133,32 +133,37 @@ namespace MiscServices { std::lock_guard lock(mMutex); IMSA_HILOGI("JsInputMethodEngineListener::OnKeyboardStatus"); - NativeValue* nativeValue = engine_->CreateObject(); - NativeObject* object = ConvertNativeValueTo(nativeValue); - if (object == nullptr) { - IMSA_HILOGI("Failed to convert rect to jsObject"); - return; - } - NativeValue* argv[] = {nativeValue}; - std::string methodName; - if (isShow) { - methodName = "keyboardShow"; - } else { - methodName = "keyboardHide"; - } - CallJsMethod(methodName, argv, ArraySize(argv)); + auto task = [this, isShow] () { + NativeValue* nativeValue = engine_->CreateObject(); + NativeObject* object = ConvertNativeValueTo < NativeObject >(nativeValue); + if (object == nullptr) { + IMSA_HILOGI("Failed to convert rect to jsObject"); + return; + } + NativeValue* argv[] = { nativeValue }; + std::string methodName; + if (isShow) { + methodName = "keyboardShow"; + } else { + methodName = "keyboardHide"; + } + CallJsMethod(methodName, argv, ArraySize(argv)); + }; + mainHandler_->PostTask(task); } void JsInputMethodEngineListener::OnInputStart() { std::lock_guard lock(mMutex); IMSA_HILOGI("JsInputMethodEngineListener::OnInputStart"); - - NativeValue *nativeValuekb = CreateKeyboardController(*engine_); - NativeValue *nativeValuetx = CreateTextInputClient(*engine_); - NativeValue* argv[] = {nativeValuekb, nativeValuetx}; - std::string methodName = "inputStart"; - CallJsMethod(methodName, argv, ArraySize(argv)); + auto task = [this] () { + NativeValue *nativeValuekb = CreateKeyboardController(*engine_); + NativeValue *nativeValuetx = CreateTextInputClient(*engine_); + NativeValue* argv[] = {nativeValuekb, nativeValuetx}; + std::string methodName = "inputStart"; + CallJsMethod(methodName, argv, ArraySize(argv)); + }; + mainHandler_->PostTask(task); } void JsInputMethodEngineListener::OnInputStop(std::string imeId) @@ -166,11 +171,14 @@ namespace MiscServices { std::lock_guard lock(mMutex); IMSA_HILOGI("JsInputMethodEngineListener::OnInputStop"); - NativeValue* nativeValue = CreateJsValue(*engine_, imeId); + auto task = [this, imeId] () { + NativeValue* nativeValue = CreateJsValue(*engine_, imeId); - NativeValue* argv[] = {nativeValue}; - std::string methodName = "inputStop"; - CallJsMethod(methodName, argv, ArraySize(argv)); + NativeValue* argv[] = { nativeValue }; + std::string methodName = "inputStop"; + CallJsMethod(methodName, argv, ArraySize(argv)); + }; + mainHandler_->PostTask(task); } } } \ No newline at end of file