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) {