From 5067b49aaad8cfda41c0c426ad47dd6128c132ef Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Sat, 12 Mar 2022 10:13:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=8F=8D=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E5=8F=82=E6=95=B0=E4=B8=8D=E5=AF=B9=E7=9A=84?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyongfei --- .../include/js_input_method_engine_listener.h | 1 + .../include/js_keyboard_delegate_listener.h | 1 + .../src/js_input_method_engine.cpp | 16 ++++++++++------ .../src/js_input_method_engine_listener.cpp | 18 ++++++++++++++++++ .../src/js_keyboard_delegate.cpp | 15 ++++++++++----- .../src/js_keyboard_delegate_listener.cpp | 17 +++++++++++++++++ 6 files changed, 57 insertions(+), 11 deletions(-) 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 0b0dc09..37bc588 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 @@ -35,6 +35,7 @@ namespace MiscServices { virtual ~JsInputMethodEngineListener() = default; void RegisterListenerWithType(NativeEngine& engine, std::string type, NativeValue* value); void UnregisterListenerWithType(std::string type, NativeValue* value); + void UnregisterAllListenerWithType(std::string type); void OnKeyboardStatus(bool isShow); void OnInputStart(); void OnInputStop(std::string imeId); diff --git a/interfaces/kits/js/napi/inputmethodengine/include/js_keyboard_delegate_listener.h b/interfaces/kits/js/napi/inputmethodengine/include/js_keyboard_delegate_listener.h index 8e62c92..8fc3cd5 100644 --- a/interfaces/kits/js/napi/inputmethodengine/include/js_keyboard_delegate_listener.h +++ b/interfaces/kits/js/napi/inputmethodengine/include/js_keyboard_delegate_listener.h @@ -35,6 +35,7 @@ namespace MiscServices { virtual ~JsKeyboardDelegateListener() = default; void RegisterListenerWithType(NativeEngine& engine, std::string type, NativeValue* value); void UnregisterListenerWithType(std::string type, NativeValue* value); + void UnregisterAllListenerWithType(std::string type); bool OnKeyEvent(int32_t keyCode, int32_t keyStatus); void OnCursorUpdate(int32_t positionX, int32_t positionY, int height); void OnSelectionChange(int32_t oldBegin, int32_t oldEnd, int32_t newBegin, int32_t newEnd); 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 6c0eb13..726738a 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 @@ -94,13 +94,17 @@ namespace MiscServices { return engine.CreateUndefined(); } - std::lock_guard lock(mtx_); - NativeValue* value = info.argv[1]; - if (!value->IsCallable()) { - IMSA_HILOGI("JsInputMethodEngine::OnUnregisterWindowManagerCallback info->argv[1] is not callable"); - return engine.CreateUndefined(); + if (info.argc == 1) { + imeListener_->UnregisterAllListenerWithType(cbType); + } else { + std::lock_guard lock(mtx_); + NativeValue* value = info.argv[1]; + if (!value->IsCallable()) { + IMSA_HILOGI("JsInputMethodEngine::OnUnregisterWindowManagerCallback info->argv[1] is not callable"); + return engine.CreateUndefined(); + } + imeListener_->UnregisterListenerWithType(cbType, value); } - imeListener_->UnregisterListenerWithType(cbType, value); return engine.CreateUndefined(); } } 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 697377e..d61a3e7 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 @@ -47,6 +47,24 @@ namespace MiscServices { return; } + void JsInputMethodEngineListener::UnregisterAllListenerWithType(std::string type) + { + IMSA_HILOGI("JsInputMethodEngineListener::UnregisterAllListenerWithType"); + // should do type check + if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { + IMSA_HILOGI("methodName %{public}s not registerted!", type.c_str()); + return; + } + for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) { + jsCbMap_[type].erase(it); + } + // one type with multi jscallback, erase type when there is no callback in one type + if (jsCbMap_[type].empty()) { + jsCbMap_.erase(type); + } + return; + } + void JsInputMethodEngineListener::UnregisterListenerWithType(std::string type, NativeValue* value) { IMSA_HILOGI("JsInputMethodEngineListener::UnregisterListenerWithType"); diff --git a/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate.cpp b/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate.cpp index 1111ae5..7b51b6d 100644 --- a/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate.cpp +++ b/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate.cpp @@ -95,12 +95,17 @@ namespace MiscServices { } std::lock_guard lock(mtx_); - NativeValue* value = info.argv[1]; - if (!value->IsCallable()) { - IMSA_HILOGI("JsKeyboardDelegate::OnUnregisterWindowManagerCallback info->argv[1] is not callable"); - return engine.CreateUndefined(); + + if (info.argc == 1) { + kdListener_->UnregisterAllListenerWithType(cbType); + } else { + NativeValue* value = info.argv[1]; + if (!value->IsCallable()) { + IMSA_HILOGI("JsKeyboardDelegate::OnUnregisterWindowManagerCallback info->argv[1] is not callable"); + return engine.CreateUndefined(); + } + kdListener_->UnregisterListenerWithType(cbType, value); } - kdListener_->UnregisterListenerWithType(cbType, value); return engine.CreateUndefined(); } } diff --git a/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate_listener.cpp b/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate_listener.cpp index f8e5b9a..9eadaef 100644 --- a/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate_listener.cpp +++ b/interfaces/kits/js/napi/inputmethodengine/src/js_keyboard_delegate_listener.cpp @@ -45,6 +45,23 @@ namespace MiscServices { static_cast(jsCbMap_.size()), type.c_str(), static_cast(jsCbMap_[type].size())); return; } + void JsKeyboardDelegateListener::UnregisterAllListenerWithType(std::string type) + { + IMSA_HILOGI("JsKeyboardDelegateListener::UnregisterAllListenerWithType"); + // should do type check + if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { + IMSA_HILOGI("methodName %{public}s not registerted!", type.c_str()); + return; + } + for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) { + jsCbMap_[type].erase(it); + } + // one type with multi jscallback, erase type when there is no callback in one type + if (jsCbMap_[type].empty()) { + jsCbMap_.erase(type); + } + return; + } void JsKeyboardDelegateListener::UnregisterListenerWithType(std::string type, NativeValue* value) {