diff --git a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp index 369c7d50ee0fe9fb96e8011474782dc2bf7e0952..b069e22034ba515c26cc78435a898cb9f54794e1 100644 --- a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp +++ b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp @@ -30,6 +30,7 @@ #include "napi/native_api.h" #include "napi/native_node_api.h" #include "napi_base_context.h" +#include "tasks/task.h" namespace OHOS { namespace MiscServices { @@ -450,7 +451,7 @@ napi_value JsInputMethodEngineSetting::CreatePanel(napi_env env, napi_callback_i ctxt->SetAction(std::move(input), std::move(output)); // 3 means JsAPI:createPanel has 3 params at most. - AsyncCall asyncCall(env, info, ctxt, 3); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_CREATE_PANEL, env, info, ctxt, 3); return asyncCall.Call(env, exec, "createPanel"); } @@ -492,7 +493,7 @@ napi_value JsInputMethodEngineSetting::DestroyPanel(napi_env env, napi_callback_ ctxt->SetAction(std::move(input), std::move(output)); // 2 means JsAPI:destroyPanel has 2 params at most. - AsyncCall asyncCall(env, info, ctxt, 2); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_DESTROY_PANEL, env, info, ctxt, 2); return asyncCall.Call(env, exec, "destroyPanel"); } diff --git a/frameworks/js/napi/inputmethodability/js_panel.cpp b/frameworks/js/napi/inputmethodability/js_panel.cpp index 70acaa9492007c50bfe8c11744182f7a6b53ab69..71e9bc1874caec5142d8f2ab72bb81855283db67 100644 --- a/frameworks/js/napi/inputmethodability/js_panel.cpp +++ b/frameworks/js/napi/inputmethodability/js_panel.cpp @@ -23,6 +23,7 @@ #include "js_utils.h" #include "napi/native_common.h" #include "panel_listener_impl.h" +#include "tasks/task.h" namespace OHOS { namespace MiscServices { @@ -36,6 +37,7 @@ constexpr int32_t MAX_INPUT_REGION_LEN = 4; const constexpr char *LANDSCAPE_REGION_PARAM_NAME = "landscapeInputRegion"; const constexpr char *PORTRAIT_REGION_PARAM_NAME = "portraitInputRegion"; FFRTBlockQueue JsPanel::jsQueue_{ MAX_WAIT_TIME }; +std::map> JsPanel::panelActions_; napi_value JsPanel::Init(napi_env env) { @@ -167,7 +169,7 @@ napi_value JsPanel::SetUiContent(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input), std::move(output)); // 3 means JsAPI:setUiContent has 3 params at most. - AsyncCall asyncCall(env, info, ctxt, 3); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_SET_UICONTENT_PANEL, env, info, ctxt, 3); return asyncCall.Call(env, exec, "setUiContent"); } @@ -205,7 +207,7 @@ napi_value JsPanel::Resize(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 3 means JsAPI:resize has 3 params at most. - AsyncCall asyncCall(env, info, ctxt, 3); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_RESIZE_PANEL, env, info, ctxt, 3); return asyncCall.Call(env, exec, "resize"); } @@ -245,7 +247,7 @@ napi_value JsPanel::MoveTo(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 3 means JsAPI:moveTo has 3 params at most. - AsyncCall asyncCall(env, info, ctxt, 3); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_MOVE_TO_PANEL, env, info, ctxt, 3); return asyncCall.Call(env, exec, "moveTo"); } @@ -279,19 +281,17 @@ napi_value JsPanel::GetDisplayId(napi_env env, napi_callback_info info) auto ctxt = std::make_shared(env, info); auto input = [ctxt](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status { ctxt->info = { std::chrono::system_clock::now(), JsEvent::GET_DISPLAYID }; - jsQueue_.Push(ctxt->info); return napi_ok; }; auto exec = [ctxt](AsyncCall::Context *ctx) { - jsQueue_.Wait(ctxt->info); if (ctxt->inputMethodPanel == nullptr) { IMSA_HILOGE("inputMethodPanel_ is nullptr!"); ctxt->SetErrorCode(ErrorCode::ERROR_IME); - jsQueue_.Pop(); + panelActions_.erase(ctxt->info); return; } auto ret = ctxt->inputMethodPanel->GetDisplayId(ctxt->displayId); - jsQueue_.Pop(); + panelActions_.erase(ctxt->info); if (ret != ErrorCode::NO_ERROR) { IMSA_HILOGE("failed get displayId!"); ctxt->SetErrorCode(ret); @@ -311,7 +311,8 @@ napi_value JsPanel::GetDisplayId(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input), std::move(output)); // 1 means JsAPI:GetDisplayId has 1 params at most. - AsyncCall asyncCall(env, info, ctxt, 1); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_GET_DISPLAY_ID_PANEL,env, info, ctxt, 1); + panelActions_[ctxt->info] = ctxt; return asyncCall.Call(env, exec, "getDisplayId"); } @@ -355,7 +356,7 @@ napi_value JsPanel::Show(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 1 means JsAPI:show has 1 param at most. - AsyncCall asyncCall(env, info, ctxt, 1); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_SHOW_PANEL, env, info, ctxt, 1); return asyncCall.Call(env, exec, "show"); } @@ -386,7 +387,7 @@ napi_value JsPanel::Hide(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 1 means JsAPI:hide has 1 param at most. - AsyncCall asyncCall(env, info, ctxt, 1); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_HIDE_PANEL, env, info, ctxt, 1); return asyncCall.Call(env, exec, "panel.hide"); } @@ -668,7 +669,7 @@ napi_value JsPanel::AdjustPanelRect(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 2 means JsAPI:adjustPanelRect has 2 params at most - AsyncCall asyncCall(env, info, ctxt, 2); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_ADJUST_PANEL_RECT_PANEL, env, info, ctxt, 2); return asyncCall.Call(env, exec, "adjustPanelRect"); } @@ -710,7 +711,7 @@ napi_value JsPanel::UpdateRegion(napi_env env, napi_callback_info info) }; ctxt->SetAction(std::move(input)); // 1 means JsAPI:updateRegion has 1 params at most - AsyncCall asyncCall(env, info, ctxt, 1); + AsyncCallIMA asyncCall(TASK_TYPE_IMA_UPDATE_REGION_PANEL, env, info, ctxt, 1); return asyncCall.Call(env, exec, "updateRegion"); } diff --git a/frameworks/js/napi/inputmethodability/js_panel.h b/frameworks/js/napi/inputmethodability/js_panel.h index 9fc9942328262eb3e95b58004ca88f76c6c0fb9e..e6d4dc69daff6fddcc099a51533113e144e7dd6e 100644 --- a/frameworks/js/napi/inputmethodability/js_panel.h +++ b/frameworks/js/napi/inputmethodability/js_panel.h @@ -53,6 +53,10 @@ struct JsEventInfo { { return (timestamp == info.timestamp && event == info.event); } + bool operator<(const JsEventInfo& info) const + { + return timestamp < info.timestamp; + } }; struct JsPanelRect { @@ -155,6 +159,7 @@ private: static thread_local napi_ref panelConstructorRef_; static FFRTBlockQueue jsQueue_; + static std::map> panelActions_; }; } // namespace MiscServices } // namespace OHOS diff --git a/frameworks/js/napi/inputmethodclient/async_call.cpp b/frameworks/js/napi/inputmethodclient/async_call.cpp index 80d1720d39ac9417f2f1107244d35d28e1e11cb2..97ff34ce19841ad4d9ddd6f076b69fd63f171e52 100644 --- a/frameworks/js/napi/inputmethodclient/async_call.cpp +++ b/frameworks/js/napi/inputmethodclient/async_call.cpp @@ -19,6 +19,8 @@ #include "global.h" #include "js_utils.h" +#include "tasks/task.h" +#include "task_manager.h" namespace OHOS { namespace MiscServices { @@ -78,6 +80,11 @@ napi_value AsyncCall::Call(napi_env env, Context::ExecAction exec, const std::st } else { napi_get_undefined(env, &promise); } + CallImpl(env, resourceName); + return promise; +} + +void AsyncCall::CallImpl(napi_env env, const std::string &resourceName) { napi_async_work work = context_->work; napi_value resource = nullptr; std::string name = "IMF_" + resourceName; @@ -86,7 +93,6 @@ napi_value AsyncCall::Call(napi_env env, Context::ExecAction exec, const std::st context_->work = work; context_ = nullptr; napi_queue_async_work_with_qos(env, work, napi_qos_user_initiated); - return promise; } napi_value AsyncCall::Post(napi_env env, Context::ExecAction exec, std::shared_ptr queue, const char *func) @@ -239,5 +245,30 @@ AsyncCall::InnerTask::~InnerTask() name, startTime, endTime, endTime - startTime); } } +AsyncCallIMA::AsyncCallIMA(int32_t actionType, napi_env env, napi_callback_info info, + std::shared_ptr context, size_t maxParamCount):AsyncCall(env, info, context, maxParamCount), actionType_(actionType) { + +} + +struct AppTask: public Task { + AppTask(int32_t taskType, std::function actionFunc): Task(static_cast(taskType)) { + actions_.emplace_back(std::make_unique(actionFunc)); + } + ~AppTask() = default; +}; + +void AsyncCallIMA::CallImpl(napi_env env, const std::string &resourceName) { + AsyncContext* context = context_; + int32_t actionType = actionType_; + auto taskAction = [env, context, actionType]() { + AsyncCall::OnExecute(env, context); + auto completeFunc = [env, context]() { + AsyncCall::OnComplete(env, napi_ok, context); + }; + auto handler = std::make_shared(AppExecFwk::EventRunner::GetMainEventRunner()); + handler->PostTask(completeFunc, "IMA_Action:" + std::to_string(actionType), 0, AppExecFwk::EventQueue::Priority::VIP); + }; + TaskManager::GetInstance().PostTask(std::make_shared(actionType, taskAction)); +} } // namespace MiscServices } // namespace OHOS diff --git a/frameworks/js/napi/inputmethodclient/async_call.h b/frameworks/js/napi/inputmethodclient/async_call.h index f37a26da7d5d8ed71796cbdb5da35dec8a7a859f..cb597a832643c2670f983c11199972f47ec6d4d9 100644 --- a/frameworks/js/napi/inputmethodclient/async_call.h +++ b/frameworks/js/napi/inputmethodclient/async_call.h @@ -25,7 +25,7 @@ namespace OHOS { namespace MiscServices { -class AsyncCall final { +class AsyncCall { public: class Context { public: @@ -120,7 +120,8 @@ public: napi_value Call(napi_env env, Context::ExecAction exec = nullptr, const std::string &resourceName = "AsyncCall"); napi_value Post(napi_env env, Context::ExecAction exec, std::shared_ptr queue, const char *func); napi_value SyncCall(napi_env env, Context::ExecAction exec = nullptr); - +private: + virtual void CallImpl(napi_env env, const std::string &resourceName); private: enum Arg : int { ARG_ERROR, ARG_DATA, ARG_BUTT }; static void OnExecute(napi_env env, void *data); @@ -138,7 +139,18 @@ private: AsyncContext *context_ = nullptr; napi_env env_ = nullptr; +protected: + friend class AsyncCallIMA; }; + +class AsyncCallIMA : public AsyncCall { +public : + AsyncCallIMA(int32_t actionType, napi_env env, napi_callback_info info, std::shared_ptr context, size_t maxParamCount); + virtual void CallImpl(napi_env env, const std::string &resourceName) override; +protected: + const int32_t actionType_; +}; + } // namespace MiscServices } // namespace OHOS #endif // ASYNC_CALL_H diff --git a/frameworks/native/inputmethod_ability/include/tasks/task.h b/frameworks/native/inputmethod_ability/include/tasks/task.h index 051f21e13becd197ed74a901e7061ceae7316243..1fdfec16b962d7c31b19df6d6d3fdad2461b2eef 100644 --- a/frameworks/native/inputmethod_ability/include/tasks/task.h +++ b/frameworks/native/inputmethod_ability/include/tasks/task.h @@ -43,7 +43,15 @@ enum TaskType : uint32_t { TASK_TYPE_IMA_BEGIN = TASK_TYPE_OFFSET(SOURCE_TYPE_IMA), TASK_TYPE_IMA_SHOW_PANEL = TASK_TYPE_IMA_BEGIN, TASK_TYPE_IMA_HIDE_PANEL, - TASK_TYPE_IMA_END = TASK_TYPE_IMA_HIDE_PANEL, + TASK_TYPE_IMA_SET_UICONTENT_PANEL, + TASK_TYPE_IMA_RESIZE_PANEL, + TASK_TYPE_IMA_MOVE_TO_PANEL, + TASK_TYPE_IMA_ADJUST_PANEL_RECT_PANEL, + TASK_TYPE_IMA_UPDATE_REGION_PANEL, + TASK_TYPE_IMA_GET_DISPLAY_ID_PANEL, + TASK_TYPE_IMA_CREATE_PANEL, + TASK_TYPE_IMA_DESTROY_PANEL, + TASK_TYPE_IMA_END = TASK_TYPE_IMA_DESTROY_PANEL, // Task from IMSA TASK_TYPE_IMSA_BEGIN = TASK_TYPE_OFFSET(SOURCE_TYPE_IMSA),