diff --git a/frameworks/inputmethod_ability/include/i_input_method_core.h b/frameworks/inputmethod_ability/include/i_input_method_core.h index 4fc9fef194b665978368519fc49230b21b530a8d..c5efbeea073be815405956aba3139d9be644fb61 100644 --- a/frameworks/inputmethod_ability/include/i_input_method_core.h +++ b/frameworks/inputmethod_ability/include/i_input_method_core.h @@ -36,10 +36,9 @@ namespace MiscServices { INITIALIZE_INPUT = FIRST_CALL_TRANSACTION, START_INPUT, STOP_INPUT, + DISPATCH_KEY, SHOW_KEYBOARD, HIDE_KEYBOARD, - ON_CURSOR_UPDATE, - ON_SELECT_TEXT_CHANGE, SET_KEYBOARD_TYPE, GET_KEYBOARD_WINDOW_HEIGHT, }; diff --git a/frameworks/inputmethod_controller/include/input_method_system_ability_proxy.h b/frameworks/inputmethod_controller/include/input_method_system_ability_proxy.h index 80fdc6f15b60a0c2336bbdf8cfee444400f5d743..39aa5cc21522497668382ca0d95654ac0ed7564a 100644 --- a/frameworks/inputmethod_controller/include/input_method_system_ability_proxy.h +++ b/frameworks/inputmethod_controller/include/input_method_system_ability_proxy.h @@ -40,6 +40,7 @@ namespace MiscServices { virtual void releaseInput(MessageParcel& data) override; virtual void startInput(MessageParcel& data) override; virtual void stopInput(MessageParcel& data) override; + virtual void DispatchKey(MessageParcel& data) override; virtual int32_t setInputMethodCore(sptr &core) override; int32_t Prepare(int32_t displayId, sptr &client, sptr &channel, diff --git a/frameworks/inputmethod_controller/src/input_method_controller.cpp b/frameworks/inputmethod_controller/src/input_method_controller.cpp index 0e92e0e80ee11df761d09cd977f62465bff05cec..a8fa03e52523826ca8ce86854264b1c2609c0e2a 100644 --- a/frameworks/inputmethod_controller/src/input_method_controller.cpp +++ b/frameworks/inputmethod_controller/src/input_method_controller.cpp @@ -350,13 +350,18 @@ using namespace MessageID; bool InputMethodController::dispatchKeyEvent(std::shared_ptr keyEvent) { IMSA_HILOGI("InputMethodController::dispatchKeyEvent"); - if (mAgent == nullptr) { - IMSA_HILOGI("InputMethodController::dispatchKeyEvent mAgent is nullptr"); + if (mImms == nullptr) { return false; } - IMSA_HILOGI("InputMethodController::dispatchKeyEvent (%{public}d, %{public}d)", - keyEvent->GetKeyCode(), keyEvent->GetKeyAction()); - mAgent->DispatchKey(keyEvent->GetKeyCode(), keyEvent->GetKeyAction()); + MessageParcel data; + if (!(data.WriteInterfaceToken(mImms->GetDescriptor()) + &&data.WriteRemoteObject(mClient->AsObject().GetRefPtr()) + &&data.WriteInt32(keyEvent->GetKeyCode()) + &&data.WriteInt32(keyEvent->GetKeyAction()))) { + return false; + } + mImms->DispatchKey(data); + return true; } } diff --git a/frameworks/inputmethod_controller/src/input_method_system_ability_proxy.cpp b/frameworks/inputmethod_controller/src/input_method_system_ability_proxy.cpp index 3ae9c12a797af7641830f25f2e1de17397fd7ee9..ba47a8a2262901b065cb4c0cdaac4ae7353e2637 100644 --- a/frameworks/inputmethod_controller/src/input_method_system_ability_proxy.cpp +++ b/frameworks/inputmethod_controller/src/input_method_system_ability_proxy.cpp @@ -97,6 +97,25 @@ namespace MiscServices { } } + void InputMethodSystemAbilityProxy::DispatchKey(MessageParcel& data) + { + IMSA_HILOGI("InputMethodSystemAbilityProxy::DispatchKey"); + MessageParcel reply; + MessageOption option; + + auto ret = Remote()->SendRequest(DISPATCH_KEY, data, reply, option); + if (ret != NO_ERROR) { + IMSA_HILOGI("InputMethodSystemAbilityProxy::DispatchKey SendRequest failed"); + return; + } + + ret = reply.ReadInt32(); + if (ret != NO_ERROR) { + IMSA_HILOGI("InputMethodSystemAbilityProxy::DispatchKey reply failed"); + return; + } + } + int32_t InputMethodSystemAbilityProxy::setInputMethodCore(sptr &core) { IMSA_HILOGI("InputMethodSystemAbilityProxy::setInputMethodCore"); diff --git a/interfaces/kits/js/napi/js_input_method_engine.cpp b/interfaces/kits/js/napi/js_input_method_engine.cpp index a1e8121b06f2b9ad676bd10ac8ace3ca8ccbb83a..bf7612e69a85189c2df10900187d5ce97afe2850 100644 --- a/interfaces/kits/js/napi/js_input_method_engine.cpp +++ b/interfaces/kits/js/napi/js_input_method_engine.cpp @@ -298,6 +298,7 @@ namespace MiscServices { DECLARE_NAPI_FUNCTION("InsertText", JS_InsertText), DECLARE_NAPI_FUNCTION("DeleteForward", JS_DeleteForward), DECLARE_NAPI_FUNCTION("DeleteBackward", JS_DeleteBackward), + DECLARE_NAPI_FUNCTION("MoveCursor", JS_MoveCursor), DECLARE_NAPI_FUNCTION("HideKeyboardSelf", JS_HideKeyboardSelf), DECLARE_NAPI_FUNCTION("GetTextBeforeCursor", JS_GetTextBeforeCursor), DECLARE_NAPI_FUNCTION("GetTextAfterCursor", JS_GetTextAfterCursor), diff --git a/services/include/i_input_method_system_ability.h b/services/include/i_input_method_system_ability.h index 290e4a1c6b7328e57f98e7256950a3e916ff8565..25246ab564b28b512167b8be60cd6154c66abffa 100644 --- a/services/include/i_input_method_system_ability.h +++ b/services/include/i_input_method_system_ability.h @@ -37,6 +37,7 @@ namespace MiscServices { RELEASE_INPUT, START_INPUT, STOP_INPUT, + DISPATCH_KEY, SET_INPUT_METHOD_CORE, GET_DISPLAY_MODE, GET_KEYBOARD_WINDOW_HEIGHT, @@ -52,6 +53,7 @@ namespace MiscServices { virtual void releaseInput(MessageParcel& data) = 0; virtual void startInput(MessageParcel& data) = 0; virtual void stopInput(MessageParcel& data) = 0; + virtual void DispatchKey(MessageParcel& data) = 0; virtual int32_t setInputMethodCore(sptr &core) = 0; virtual int32_t getDisplayMode(int32_t retMode) = 0; diff --git a/services/include/input_method_system_ability_stub.h b/services/include/input_method_system_ability_stub.h index ad4d8192a1a96ab752d9a3db7ea2b47237095bdb..ec836b260d711814c5268b44f705f75f87645b46 100644 --- a/services/include/input_method_system_ability_stub.h +++ b/services/include/input_method_system_ability_stub.h @@ -26,12 +26,14 @@ namespace OHOS { namespace MiscServices { class InputMethodSystemAbilityStub : public IRemoteStub { public: - int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; + int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, + MessageOption &option) override; virtual void prepareInput(MessageParcel& data) override; virtual void releaseInput(MessageParcel& data) override; virtual void startInput(MessageParcel& data) override; virtual void stopInput(MessageParcel& data) override; + virtual void DispatchKey(MessageParcel& data) override; void setInputMethodCoreFromHap(MessageParcel& data); protected: int32_t getUserId(int32_t uid); diff --git a/services/include/peruser_session.h b/services/include/peruser_session.h index 77fdbb513245fe3fdd45deb01e861fd2559dbbd5..ac2ecac85dd878756eecb0ffafe5352434b7071b 100644 --- a/services/include/peruser_session.h +++ b/services/include/peruser_session.h @@ -165,6 +165,7 @@ namespace MiscServices { void OnReleaseInput(Message *msg); void OnStartInput(Message *msg); void OnStopInput(Message *msg); + void DispatchKey(Message *msg); void OnClientDied(const wptr& who); void OnImsDied(const wptr& who); void OnHideKeyboardSelf(int flags); diff --git a/services/src/input_method_system_ability.cpp b/services/src/input_method_system_ability.cpp index 246dc981239870daf5f0f5a0ed72595cd64dee6b..a9a9bf7f987f583c27259813e000a9807bd3097c 100644 --- a/services/src/input_method_system_ability.cpp +++ b/services/src/input_method_system_ability.cpp @@ -418,6 +418,7 @@ namespace MiscServices { case MSG_ID_SET_DISPLAY_MODE: case MSG_ID_CLIENT_DIED: case MSG_ID_IMS_DIED: + case MSG_ID_DISPATCH_KEY: case MSG_ID_RESTART_IMS: { OnHandleMessage(msg); break; diff --git a/services/src/input_method_system_ability_stub.cpp b/services/src/input_method_system_ability_stub.cpp index 9532c5720d26e31a8371040b050213d995501181..09cfefda3c08efabae59403f9348cab994bf6903 100644 --- a/services/src/input_method_system_ability_stub.cpp +++ b/services/src/input_method_system_ability_stub.cpp @@ -61,6 +61,12 @@ namespace MiscServices { reply.WriteInt32(NO_ERROR); break; } + case DISPATCH_KEY: { + MessageParcel *msgParcel = (MessageParcel*) &data; + DispatchKey(*msgParcel); + reply.WriteInt32(NO_ERROR); + break; + } case SET_INPUT_METHOD_CORE: { MessageParcel *msgParcel = (MessageParcel*) &data; setInputMethodCoreFromHap(*msgParcel); @@ -245,6 +251,21 @@ namespace MiscServices { MessageHandler::Instance()->SendMessage(msg); } + void InputMethodSystemAbilityStub::DispatchKey(MessageParcel& data) + { + IMSA_HILOGI("InputMethodSystemAbilityStub::DispatchKey"); + int32_t uid = IPCSkeleton::GetCallingUid(); + int32_t userId = getUserId(uid); + MessageParcel *parcel = new MessageParcel(); + parcel->WriteInt32(userId); + parcel->WriteRemoteObject(data.ReadRemoteObject()); + parcel->WriteInt32(data.ReadInt32()); + parcel->WriteInt32(data.ReadInt32()); + + Message *msg = new Message(MSG_ID_DISPATCH_KEY, parcel); + MessageHandler::Instance()->SendMessage(msg); + } + /*! Prepare input \n Send prepareInput command to work thread. The handling of prepareInput is in the work thread of PerUserSession. diff --git a/services/src/peruser_session.cpp b/services/src/peruser_session.cpp index 3be9b5ad56bd2b2588b34cfe19b40e08e11eed93..16301064ce08be9c166cce88b7c8ef462d3ae7e0 100644 --- a/services/src/peruser_session.cpp +++ b/services/src/peruser_session.cpp @@ -152,6 +152,10 @@ namespace MiscServices { OnStopInput(msg); break; } + case MSG_ID_DISPATCH_KEY: { + DispatchKey(msg); + break; + } case MSG_ID_SET_INPUT_METHOD_CORE: { onSetInputMethodCore(msg); break; @@ -1338,5 +1342,21 @@ namespace MiscServices { IMSA_HILOGI("PerUserSession::OnStopInput End...[%{public}d]\n", userId_); } } + + void PerUserSession::DispatchKey(Message *msg) + { + IMSA_HILOGI("PerUserSession::DispatchKey"); + MessageParcel *data = msg->msgContent_; + + sptr clientObject = data->ReadRemoteObject(); + int32_t keyCode = data->ReadInt32(); + int32_t state = data->ReadInt32(); + + if (localControlChannel[currentIndex]->GetAgentAndChannel(&imsAgent, &imsChannel) == true) { + IMSA_HILOGI("PerUserSession::DispatchKey GetAgentAndChannel"); + sptr agent = new InputMethodAgentProxy(imsAgent->AsObject().GetRefPtr()); + agent->DispatchKey(keyCode, state); + } + } } }