From 987df08ad4bb3e2d32614f8910fa8a6ca0cad215 Mon Sep 17 00:00:00 2001 From: liweifeng Date: Thu, 5 May 2022 16:16:18 +0800 Subject: [PATCH] =?UTF-8?q?FA=E5=8D=A1=E7=89=87=E8=83=BD=E5=8A=9B=E8=A1=A5?= =?UTF-8?q?=E9=BD=90=E9=9C=80=E6=B1=82=E5=9B=9E=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liweifeng Change-Id: I8a60a6ca07ef4c5f70b310eab7ad63204f3b1e1f --- adapter/ohos/entrance/ace_form_ability.cpp | 11 +++++++ adapter/ohos/entrance/ace_form_ability.h | 8 +++++ adapter/ohos/entrance/pa_container.cpp | 23 ++++++++++++++ adapter/ohos/entrance/pa_container.h | 1 + .../pa_engine/backend_delegate_impl.cpp | 7 +++-- .../pa_engine/backend_delegate_impl.h | 4 +-- .../engine/common/js_backend_engine.h | 2 +- .../pa_engine/engine/jsi/jsi_pa_engine.cpp | 31 ++++++++++++++++--- .../pa_engine/engine/jsi/jsi_pa_engine.h | 2 +- .../engine/quickjs/qjs_pa_engine.cpp | 24 ++++++++++---- .../pa_engine/engine/quickjs/qjs_pa_engine.h | 2 +- .../ohos/entrance/pa_engine/pa_backend.cpp | 10 +++--- adapter/ohos/entrance/pa_engine/pa_backend.h | 2 +- .../core/components/form/form_element.cpp | 2 +- .../form/resource/form_manager_delegate.cpp | 11 ++++++- .../form/resource/form_manager_delegate.h | 1 + 16 files changed, 116 insertions(+), 25 deletions(-) diff --git a/adapter/ohos/entrance/ace_form_ability.cpp b/adapter/ohos/entrance/ace_form_ability.cpp index b0581cb8..a6aad86c 100644 --- a/adapter/ohos/entrance/ace_form_ability.cpp +++ b/adapter/ohos/entrance/ace_form_ability.cpp @@ -142,6 +142,17 @@ void AceFormAbility::OnTriggerEvent(const int64_t formId, const std::string& mes Platform::PaContainer::OnTriggerEvent(instanceId_, formId, message); } +AppExecFwk::FormState AceFormAbility::OnAcquireFormState(const OHOS::AAFwk::Want &want) +{ + LOGI("AceFormAbility::OnAcquireState called"); + int32_t formState = Platform::PaContainer::OnAcquireFormState(instanceId_, want); + if (formState <= (int32_t) AppExecFwk::FormState::UNKNOWN || formState > (int32_t) AppExecFwk::FormState::READY) { + return AppExecFwk::FormState::UNKNOWN; + } else { + return (AppExecFwk::FormState) formState; + } +} + void AceFormAbility::OnUpdate(const int64_t formId) { LOGI("AceFormAbility::OnUpdate called: %{public}s", std::to_string(formId).c_str()); diff --git a/adapter/ohos/entrance/ace_form_ability.h b/adapter/ohos/entrance/ace_form_ability.h index 8c8f7db9..b40b18ad 100644 --- a/adapter/ohos/entrance/ace_form_ability.h +++ b/adapter/ohos/entrance/ace_form_ability.h @@ -69,6 +69,14 @@ public: */ virtual void OnTriggerEvent(const int64_t formId, const std::string& message) override; + /** + * @brief Called to notify the form supplier to acquire form state. + * + * @param want Indicates the detailed information about the form to be obtained, including + * the bundle name, module name, ability name, form name and form dimension. + */ + virtual AppExecFwk::FormState OnAcquireFormState(const OHOS::AAFwk::Want& want) override; + /** * @brief Called to notify the form provider to update a specified form. * diff --git a/adapter/ohos/entrance/pa_container.cpp b/adapter/ohos/entrance/pa_container.cpp index 9faca938..09bb66fd 100644 --- a/adapter/ohos/entrance/pa_container.cpp +++ b/adapter/ohos/entrance/pa_container.cpp @@ -199,6 +199,29 @@ bool PaContainer::OnTriggerEvent(int32_t instanceId, int64_t formId, const std:: return true; } +int32_t PaContainer::OnAcquireFormState(int32_t instanceId, const OHOS::AAFwk::Want& want) +{ + LOGI("PA: PaContainer::OnAcquireFormState start"); + auto container = AceEngine::Get().GetContainer(instanceId); + if (!container) { + LOGE("PA: container is nullptr"); + return -1; + } + auto aceContainer = AceType::DynamicCast(container); + if (!aceContainer) { + LOGE("PA: aceContainer is nullptr"); + return -1; + } + auto paBackend = AceType::DynamicCast(aceContainer->GetBackend()); + if (!paBackend) { + LOGE("PA: paBackend is nullptr"); + return -1; + } + int32_t formState = paBackend->OnAcquireFormState(want); + LOGI("PA: PaContainer::OnAcquireFormState end"); + return formState; +} + bool PaContainer::OnUpdate(int32_t instanceId, int64_t formId) { LOGI("PA: PaContainer::OnUpdate start"); diff --git a/adapter/ohos/entrance/pa_container.h b/adapter/ohos/entrance/pa_container.h index 97da6255..ab2fef0d 100644 --- a/adapter/ohos/entrance/pa_container.h +++ b/adapter/ohos/entrance/pa_container.h @@ -132,6 +132,7 @@ public: static bool OnCreate(int32_t instanceId, const OHOS::AAFwk::Want& want); static bool OnDelete(int32_t instanceId, int64_t formId); static bool OnTriggerEvent(int32_t instanceId, int64_t formId, const std::string& message); + static int32_t OnAcquireFormState(int32_t instanceId, const OHOS::AAFwk::Want& want); static bool OnUpdate(int32_t instanceId, int64_t formId); static bool OnCastTemptoNormal(int32_t instanceId, int64_t formId); static bool OnVisibilityChanged(int32_t instanceId, const std::map& formEventsMap); diff --git a/adapter/ohos/entrance/pa_engine/backend_delegate_impl.cpp b/adapter/ohos/entrance/pa_engine/backend_delegate_impl.cpp index ff31604c..40e32560 100644 --- a/adapter/ohos/entrance/pa_engine/backend_delegate_impl.cpp +++ b/adapter/ohos/entrance/pa_engine/backend_delegate_impl.cpp @@ -459,10 +459,13 @@ void BackendDelegateImpl::OnVisibilityChanged(const std::map& TaskExecutor::TaskType::JS); } -void BackendDelegateImpl::OnAcquireState(const OHOS::AAFwk::Want& want) +int32_t BackendDelegateImpl::OnAcquireFormState(const OHOS::AAFwk::Want &want) { - taskExecutor_->PostTask([acquireStateCallback = acquireStateCallback_, want] { acquireStateCallback(want); }, + auto ret = (int32_t) AppExecFwk::FormState::UNKNOWN; + taskExecutor_->PostSyncTask( + [acquireStateCallback = acquireStateCallback_, &ret, want] { ret = acquireStateCallback(want); }, TaskExecutor::TaskType::JS); + return ret; } void BackendDelegateImpl::OnCommand(const OHOS::AAFwk::Want &want, int startId) diff --git a/adapter/ohos/entrance/pa_engine/backend_delegate_impl.h b/adapter/ohos/entrance/pa_engine/backend_delegate_impl.h index 1ca2fe1f..c27a518d 100644 --- a/adapter/ohos/entrance/pa_engine/backend_delegate_impl.h +++ b/adapter/ohos/entrance/pa_engine/backend_delegate_impl.h @@ -63,7 +63,7 @@ using TriggerEventCallback = std::function; using CastTemptoNormalCallback = std::function; using VisibilityChangedCallback = std::function& formEventsMap)>; -using AcquireStateCallback = std::function; +using AcquireStateCallback = std::function; using CommandCallback = std::function; using CommandApplicationCallback = std::function; @@ -184,7 +184,7 @@ public: void OnUpdate(const int64_t formId); void OnCastTemptoNormal(const int64_t formId); void OnVisibilityChanged(const std::map& formEventsMap); - void OnAcquireState(const OHOS::AAFwk::Want& want); + int32_t OnAcquireFormState(const OHOS::AAFwk::Want& want); private: void LoadPa(const std::string& url, const OHOS::AAFwk::Want& want); diff --git a/adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine.h b/adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine.h index ef8e639a..1679bad0 100644 --- a/adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine.h +++ b/adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine.h @@ -78,7 +78,7 @@ public: virtual void OnUpdate(const int64_t formId) = 0; virtual void OnCastTemptoNormal(const int64_t formId) = 0; virtual void OnVisibilityChanged(const std::map& formEventsMap) = 0; - virtual void OnAcquireState(const OHOS::AAFwk::Want &want) = 0; + virtual int32_t OnAcquireFormState(const OHOS::AAFwk::Want &want) = 0; virtual void OnCommand(const OHOS::AAFwk::Want &want, int startId) = 0; void SetFormData(const AppExecFwk::FormProviderData &formProviderData) diff --git a/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.cpp b/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.cpp index 5c10d43a..f666ccf6 100644 --- a/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.cpp +++ b/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.cpp @@ -1539,12 +1539,35 @@ void JsiPaEngine::OnVisibilityChanged(const std::map& formEven CallFunc(func, argv); } -void JsiPaEngine::OnAcquireState(const OHOS::AAFwk::Want &want) +int32_t JsiPaEngine::OnAcquireFormState(const OHOS::AAFwk::Want &want) { - LOGI("JsiPaEngine OnAcquireState"); + LOGI("JsiPaEngine OnAcquireFormState"); + ACE_DCHECK(engineInstance_); + shared_ptr runtime = engineInstance_->GetJsRuntime(); + const std::vector>& argv = { WantToJsValue(want) }; - auto func = GetPaFunc("onAcquireState"); - CallFunc(func, argv); + auto func = GetPaFunc("onAcquireFormState"); + + if (func == nullptr) { + LOGI("no OnAcquireFormState!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; + } + + auto result = CallFunc(func, argv); + auto arkJSValue = std::static_pointer_cast(result); + if (arkJSValue->IsException(runtime)) { + LOGE("JsiPaEngine CallFunc FAILED!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; + } + + if (!arkJSValue->IsInt32(runtime)) { + LOGE("invalid return value!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; + } + + int32_t formState = arkJSValue->ToInt32(runtime); + LOGI("JsiPaEngine OnAcquireFormState, formState: %{public}d", formState); + return formState; } } // namespace OHOS::Ace diff --git a/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.h b/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.h index b0a3259d..3422587c 100644 --- a/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.h +++ b/adapter/ohos/entrance/pa_engine/engine/jsi/jsi_pa_engine.h @@ -162,7 +162,7 @@ public: void OnUpdate(const int64_t formId) override; void OnCastTemptoNormal(const int64_t formId) override; void OnVisibilityChanged(const std::map& formEventsMap) override; - void OnAcquireState(const OHOS::AAFwk::Want &want) override; + int32_t OnAcquireFormState(const OHOS::AAFwk::Want &want) override; private: void SetPostTask(NativeEngine* nativeEngine); diff --git a/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.cpp b/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.cpp index d6b467fe..6b642658 100644 --- a/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.cpp +++ b/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.cpp @@ -1481,14 +1481,18 @@ void QjsPaEngine::OnVisibilityChanged(const std::map& formEven return; } -void QjsPaEngine::OnAcquireState(const OHOS::AAFwk::Want& want) +int32_t QjsPaEngine::OnAcquireFormState(const OHOS::AAFwk::Want& want) { - LOGI("PA: QjsPaEngine OnAcquireState"); + LOGI("PA: QjsPaEngine OnAcquireFormState"); JSContext* ctx = engineInstance_->GetQjsContext(); ACE_DCHECK(ctx); Framework::QJSHandleScope handleScope(ctx); - JSValue paFunc = GetPaFunc("onAcquireState"); + JSValue paFunc = GetPaFunc("onAcquireFormState"); + if (JS_IsUndefined(paFunc)) { + LOGI("no OnAcquireFormState!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; + } napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(nativeEngine_), want); NativeValue* nativeWant = reinterpret_cast(napiWant); @@ -1496,10 +1500,18 @@ void QjsPaEngine::OnAcquireState(const OHOS::AAFwk::Want& want) JSValueConst argv[] = { jsWant }; JSValue retVal = Framework::QJSUtils::Call(ctx, paFunc, JS_UNDEFINED, countof(argv), argv); if (JS_IsException(retVal)) { - LOGE("PA: OnAcquireState FAILED!"); - return; + LOGE("PA: OnAcquireFormState FAILED!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; } - return; + + if (!JS_IsNumber(retVal)) { + LOGE("invalid return value!"); + return (int32_t)AppExecFwk::FormState::DEFAULT; + } + + int32_t formState = GetJsInt32Val(ctx, retVal); + LOGI("JsiPaEngine OnAcquireFormState, formState: %{public}d", formState); + return formState; } void QjsPaEngine::OnCommand(const OHOS::AAFwk::Want &want, int startId) diff --git a/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.h b/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.h index 2665f5e7..61c85d9e 100644 --- a/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.h +++ b/adapter/ohos/entrance/pa_engine/engine/quickjs/qjs_pa_engine.h @@ -171,7 +171,7 @@ public: void OnUpdate(const int64_t formId) override; void OnCastTemptoNormal(const int64_t formId) override; void OnVisibilityChanged(const std::map& formEventsMap) override; - void OnAcquireState(const OHOS::AAFwk::Want &want) override; + int32_t OnAcquireFormState(const OHOS::AAFwk::Want &want) override; void OnCommand(const OHOS::AAFwk::Want &want, int startId) override; private: diff --git a/adapter/ohos/entrance/pa_engine/pa_backend.cpp b/adapter/ohos/entrance/pa_engine/pa_backend.cpp index 8a624e4c..b54214d2 100644 --- a/adapter/ohos/entrance/pa_engine/pa_backend.cpp +++ b/adapter/ohos/entrance/pa_engine/pa_backend.cpp @@ -296,12 +296,12 @@ void PaBackend::InitializeBackendDelegate(const RefPtr& taskExecut }; builder.acquireStateCallback = [weakEngine = WeakPtr(jsBackendEngine_)]( - const OHOS::AAFwk::Want& want) { + const OHOS::AAFwk::Want& want) -> int32_t { auto jsBackendEngine = weakEngine.Upgrade(); if (!jsBackendEngine) { - return; + return -1; } - jsBackendEngine->OnAcquireState(want); + return jsBackendEngine->OnAcquireFormState(want); }; builder.commandApplicationCallback = [weakEngine = WeakPtr(jsBackendEngine_)]( @@ -494,9 +494,9 @@ void PaBackend::OnVisibilityChanged(const std::map& formEvents delegate_->OnVisibilityChanged(formEventsMap); } -void PaBackend::OnAcquireState(const OHOS::AAFwk::Want& want) +int32_t PaBackend::OnAcquireFormState(const OHOS::AAFwk::Want& want) { - delegate_->OnAcquireState(want); + return delegate_->OnAcquireFormState(want); } sptr PaBackend::OnConnect(const OHOS::AAFwk::Want& want) diff --git a/adapter/ohos/entrance/pa_engine/pa_backend.h b/adapter/ohos/entrance/pa_engine/pa_backend.h index 7a4ba5f1..04b0f65b 100644 --- a/adapter/ohos/entrance/pa_engine/pa_backend.h +++ b/adapter/ohos/entrance/pa_engine/pa_backend.h @@ -84,7 +84,7 @@ public: void OnUpdate(const int64_t formId); void OnCastTemptoNormal(const int64_t formId); void OnVisibilityChanged(const std::map& formEventsMap); - void OnAcquireState(const OHOS::AAFwk::Want& want); + int32_t OnAcquireFormState(const OHOS::AAFwk::Want& want); sptr OnConnect(const OHOS::AAFwk::Want& want); void OnDisConnect(const OHOS::AAFwk::Want& want); diff --git a/frameworks/core/components/form/form_element.cpp b/frameworks/core/components/form/form_element.cpp index 7467e521..f8132648 100644 --- a/frameworks/core/components/form/form_element.cpp +++ b/frameworks/core/components/form/form_element.cpp @@ -337,7 +337,7 @@ void FormElement::OnActionEvent(const std::string& action) const auto context = GetContext().Upgrade(); if (context) { LOGI("send action evetn to ability to process"); - context->OnActionEvent(action); + context->OnActionEvent(formManagerBridge_->WrapAction(action)); } #else HandleOnRouterEvent(eventAction); diff --git a/frameworks/core/components/form/resource/form_manager_delegate.cpp b/frameworks/core/components/form/resource/form_manager_delegate.cpp index 21b789a6..cf5de1a5 100644 --- a/frameworks/core/components/form/resource/form_manager_delegate.cpp +++ b/frameworks/core/components/form/resource/form_manager_delegate.cpp @@ -406,6 +406,15 @@ void FormManagerDelegate::OnDeathReceived() LOGE("relink to form manager fail!!!"); } } +std::string FormManagerDelegate::WrapAction(const std::string& action) +{ + auto eventAction = JsonUtil::ParseJsonString(action); + if (!eventAction->Contains("bundleName")) { + eventAction->Put("bundleName", wantCache_.GetElement().GetBundleName().c_str()); + } + auto newAction = eventAction->ToString(); + OHOS::AppExecFwk::FormMgr::GetInstance().UpdateRouterAction(runningCardId_, newAction); + return newAction; +} #endif - } // namespace OHOS::Ace diff --git a/frameworks/core/components/form/resource/form_manager_delegate.h b/frameworks/core/components/form/resource/form_manager_delegate.h index 36bb7dd1..2527b584 100644 --- a/frameworks/core/components/form/resource/form_manager_delegate.h +++ b/frameworks/core/components/form/resource/form_manager_delegate.h @@ -68,6 +68,7 @@ public: void OnActionEvent(const std::string& action); + std::string WrapAction(const std::string& action); #ifdef OHOS_STANDARD_SYSTEM void ProcessFormUpdate(const AppExecFwk::FormJsInfo &formJsInfo); void ProcessFormUninstall(const int64_t formId);