diff --git a/adapter/ohos/cpp/ace_service_ability.cpp b/adapter/ohos/cpp/ace_service_ability.cpp index ce8d50b43f9b6e9454196a8be0ba2ef733b5bfde..fe2dac385d1e3b731178bb674908d1cb4df9e040 100644 --- a/adapter/ohos/cpp/ace_service_ability.cpp +++ b/adapter/ohos/cpp/ace_service_ability.cpp @@ -131,5 +131,13 @@ void AceServiceAbility::OnDisconnect(const Want &want) LOGI("AceServiceAbility::OnDisconnect end"); } +void AceServiceAbility::OnCommand(const AAFwk::Want &want, bool restart, int startId) +{ + LOGI("AceServiceAbility::OnCommand start"); + Ability::OnCommand(want, restart, startId); + Platform::PaContainer::OnCommand(want, startId, abilityId_); + LOGI("AceServiceAbility::OnCommand end"); +} + } } // namespace OHOS::Ace diff --git a/adapter/ohos/cpp/ace_service_ability.h b/adapter/ohos/cpp/ace_service_ability.h index 77c31bcc2222134d996548a82377f871e2b95baf..6108911382f4849d64e4a2c4941465edd84888bf 100644 --- a/adapter/ohos/cpp/ace_service_ability.h +++ b/adapter/ohos/cpp/ace_service_ability.h @@ -38,6 +38,7 @@ public: void OnStop() override; sptr OnConnect(const OHOS::AAFwk::Want &want) override; void OnDisconnect(const OHOS::AAFwk::Want &want) override; + void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; private: int32_t abilityId_ = 100000; diff --git a/adapter/ohos/cpp/pa_container.cpp b/adapter/ohos/cpp/pa_container.cpp index b92674cce0fc9472e0d775aed72df76186a2f7c2..c51d7839e9c77ace016260f71c192d3d30fca505 100644 --- a/adapter/ohos/cpp/pa_container.cpp +++ b/adapter/ohos/cpp/pa_container.cpp @@ -533,7 +533,7 @@ sptr PaContainer::OnConnect(int32_t instanceId, const OHOS::AAFwk LOGI("OnConnect with id %{private}d", instanceId); auto container = AceEngine::Get().GetContainer(instanceId); if (!container) { - LOGE("no AceContainer with id %{private}d", instanceId); + LOGE("no pa container with id %{private}d", instanceId); return nullptr; } auto aceContainer = AceType::DynamicCast(container); @@ -554,7 +554,7 @@ void PaContainer::OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want LOGI("OnDisConnect with id %{private}d", instanceId); auto container = AceEngine::Get().GetContainer(instanceId); if (!container) { - LOGE("no AceContainer with id %{private}d", instanceId); + LOGE("no pa container with id %{private}d", instanceId); return; } auto aceContainer = AceType::DynamicCast(container); @@ -569,4 +569,24 @@ void PaContainer::OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want } } +void PaContainer::OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId) +{ + LOGI("OnCommand with id %{private}d", instanceId); + auto container = AceEngine::Get().GetContainer(instanceId); + if (!container) { + LOGE("no pa container with id %{private}d", instanceId); + return; + } + auto aceContainer = AceType::DynamicCast(container); + auto back = aceContainer->GetBackend(); + if (back) { + auto paBackend = AceType::DynamicCast(back); + if (paBackend == nullptr) { + LOGE("DynamicCast paBackend failed with id %{private}d", instanceId); + return; + } + paBackend->OnCommand(want, startId); + } +} + } // namespace OHOS::Ace::Platform diff --git a/adapter/ohos/cpp/pa_container.h b/adapter/ohos/cpp/pa_container.h index ce2092ad9b13c76c9f6d010870c33b881b053008..d4282d11899defdc721d9030f604ed6ee6a33b66 100644 --- a/adapter/ohos/cpp/pa_container.h +++ b/adapter/ohos/cpp/pa_container.h @@ -149,6 +149,7 @@ public: static sptr OnConnect(int32_t instanceId, const OHOS::AAFwk::Want &want); static void OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want); static AppExecFwk::FormProviderData GetFormData(int32_t formId); + static void OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId); private: void InitializeBackend(); diff --git a/frameworks/bridge/pa_backend/backend_delegate_impl.cpp b/frameworks/bridge/pa_backend/backend_delegate_impl.cpp index 28e5d52cb1869f5037b910971c4719666b23353f..a34f58a1d61f25f043dcba7d51e4e98759269d78 100644 --- a/frameworks/bridge/pa_backend/backend_delegate_impl.cpp +++ b/frameworks/bridge/pa_backend/backend_delegate_impl.cpp @@ -58,7 +58,7 @@ BackendDelegateImpl::BackendDelegateImpl(const BackendDelegateImplBuilder &build castTemptoNormalCallback_(builder.castTemptoNormalCallback), visibilityChangedCallback_(builder.visibilityChangedCallback), acquireStateCallback_(builder.acquireStateCallback), - + commandCallback_(builder.commandCallback), manifestParser_(AceType::MakeRefPtr()), ability_(builder.ability), type_(builder.type), @@ -385,4 +385,11 @@ void BackendDelegateImpl::OnAcquireState(const OHOS::AAFwk::Want &want) TaskExecutor::TaskType::JS); } +void BackendDelegateImpl::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + taskExecutor_->PostTask( + [commandCallback = commandCallback_, want, startId] { commandCallback(want, startId); }, + TaskExecutor::TaskType::JS); +} + } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/pa_backend/backend_delegate_impl.h b/frameworks/bridge/pa_backend/backend_delegate_impl.h index 6163e9456fad21e7e019a0b6edb09d619b0fb175..b639bbf7415012388cbed792c24fb54292e34584 100644 --- a/frameworks/bridge/pa_backend/backend_delegate_impl.h +++ b/frameworks/bridge/pa_backend/backend_delegate_impl.h @@ -66,6 +66,7 @@ using UpdateFormCallback = std::function; using CastTemptoNormalCallback = std::function; using VisibilityChangedCallback = std::function& formEventsMap)>; using AcquireStateCallback = std::function; +using CommandCallback = std::function; struct BackendDelegateImplBuilder { RefPtr taskExecutor; @@ -93,6 +94,7 @@ struct BackendDelegateImplBuilder { CastTemptoNormalCallback castTemptoNormalCallback; VisibilityChangedCallback visibilityChangedCallback; AcquireStateCallback acquireStateCallback; + CommandCallback commandCallback; void* ability; BackendType type; }; @@ -143,6 +145,7 @@ public: void OnApplicationDestroy(const std::string &packageName); sptr OnConnect(const OHOS::AAFwk::Want &want); void OnDisConnect(const OHOS::AAFwk::Want &want); + void OnCommand(const OHOS::AAFwk::Want &want, int startId); int32_t Insert(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value); std::shared_ptr Query( @@ -207,6 +210,7 @@ private: CastTemptoNormalCallback castTemptoNormalCallback_; VisibilityChangedCallback visibilityChangedCallback_; AcquireStateCallback acquireStateCallback_; + CommandCallback commandCallback_; RefPtr manifestParser_; void* ability_; diff --git a/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h b/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h index 9bc875b0b43bfaf73fa95f77321a918a63ab12aa..d9fbb417cbcced113a84c28908d5281045461dc2 100644 --- a/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h +++ b/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h @@ -74,6 +74,8 @@ public: 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 void OnCommand(const OHOS::AAFwk::Want &want, int startId) = 0; + void SetFormData(const AppExecFwk::FormProviderData &formProviderData) { formProviderData_ = formProviderData; diff --git a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp index a4c557ae30c36af4b225c9142c95bc1dff4fec70..8ac26f06575e54e72fc55d14001a5f3f8e3d4d40 100644 --- a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp +++ b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp @@ -1095,7 +1095,6 @@ sptr QjsPaEngine::OnConnectService(const OHOS::AAFwk::Want &want) auto remoteObj = NAPI_ohos_rpc_getNativeRemoteObject(reinterpret_cast(nativeEngine_), reinterpret_cast(nativeValue)); JS_FreeValue(ctx, globalObj); - JS_FreeValue(ctx, retVal); return remoteObj; } } @@ -1128,6 +1127,7 @@ void QjsPaEngine::OnDisconnectService(const OHOS::AAFwk::Want &want) LOGE("Qjs OnDisconnectService FAILED!"); } JS_FreeValue(ctx, globalObj); + JS_FreeValue(ctx, retVal); } void QjsPaEngine::OnDelete(const int64_t formId) @@ -1261,4 +1261,38 @@ void QjsPaEngine::OnAcquireState(const OHOS::AAFwk::Want &want) return; } +void QjsPaEngine::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + LOGI("OnCommand"); + JSContext *ctx = engineInstance_->GetQjsContext(); + ACE_DCHECK(ctx); + + QJSHandleScope handleScope(ctx); + JSValue globalObj = JS_GetGlobalObject(ctx); + JSValue paObj = QJSUtils::GetPropertyStr(ctx, globalObj, "pa"); + if (!JS_IsObject(paObj)) { + LOGE("get onCommand function error"); + return; + } + JSValue onCommandFunc = QJSUtils::GetPropertyStr(ctx, paObj, "onCommand"); + if (!JS_IsFunction(ctx, onCommandFunc)) { + LOGE("onCommand function is not found!"); + JS_FreeValue(ctx, globalObj); + return; + } + napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(nativeEngine_), want); + NativeValue* nativeWant = reinterpret_cast(napiWant); + JSValue jsWant = (JSValue)*nativeWant; + JSValueConst argv[] = { + jsWant, + JS_NewInt32(ctx, startId) + }; + JSValue retVal = QJSUtils::Call(ctx, onCommandFunc, JS_UNDEFINED, countof(argv), argv); + if (JS_IsException(retVal)) { + LOGE("Qjs onCommand FAILED!"); + } + JS_FreeValue(ctx, globalObj); + JS_FreeValue(ctx, retVal); +} + } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h index ed18ab20ad5f9a902c56de4d26b5cddc4ecd7a3e..db004276c71ea320f57da31fb60d27dc123379c7 100644 --- a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h +++ b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h @@ -163,6 +163,7 @@ public: void OnCastTemptoNormal(const int64_t formId) override; void OnVisibilityChanged(const std::map& formEventsMap) override; void OnAcquireState(const OHOS::AAFwk::Want &want) override; + void OnCommand(const OHOS::AAFwk::Want &want, int startId) override; private: void GetLoadOptions(std::string& optionStr); diff --git a/frameworks/bridge/pa_backend/pa_backend.cpp b/frameworks/bridge/pa_backend/pa_backend.cpp index e98b7d655c2174ead1f5254ad0084f16f9e9e91d..933360a4430d671f53661b4fb87d6afac6167162 100644 --- a/frameworks/bridge/pa_backend/pa_backend.cpp +++ b/frameworks/bridge/pa_backend/pa_backend.cpp @@ -280,6 +280,15 @@ void PaBackend::InitializeBackendDelegate(const RefPtr &taskExecut jsBackendEngine->OnAcquireState(want); }; + builder.commandCallback = [weakEngine = WeakPtr(jsBackendEngine_)]( + const OHOS::AAFwk::Want &want, int startId) { + auto jsBackendEngine = weakEngine.Upgrade(); + if (!jsBackendEngine) { + return; + } + jsBackendEngine->OnCommand(want, startId); + }; + builder.taskExecutor = taskExecutor; builder.ability = ability_; builder.type = type_; @@ -414,4 +423,9 @@ void PaBackend::OnDisConnect(const OHOS::AAFwk::Want &want) delegate_->OnDisConnect(want); } +void PaBackend::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + delegate_->OnCommand(want, startId); +} + } // namespace OHOS::Ace diff --git a/frameworks/bridge/pa_backend/pa_backend.h b/frameworks/bridge/pa_backend/pa_backend.h index 18d077162c5ca437623ea8c9aced951674a1bd11..52d20af9e4abe63add663d9472abda0c4375d5fa 100644 --- a/frameworks/bridge/pa_backend/pa_backend.h +++ b/frameworks/bridge/pa_backend/pa_backend.h @@ -93,6 +93,8 @@ public: } } + void OnCommand(const OHOS::AAFwk::Want &want, int startId); + private: void InitializeBackendDelegate(const RefPtr& taskExecutor); BackendType type_ = BackendType::SERVICE;