diff --git a/frameworks/js/napi/ui_extension_context/ui_extension_context.js b/frameworks/js/napi/ui_extension_context/ui_extension_context.js index 7a258e043a0a70cf1b80adab521da8438a463975..6fd3e318d4e69425e5e0f8b2eed989cfcc81eda8 100755 --- a/frameworks/js/napi/ui_extension_context/ui_extension_context.js +++ b/frameworks/js/napi/ui_extension_context/ui_extension_context.js @@ -57,6 +57,9 @@ class UIExtensionContext extends ExtensionContext { return this.__context_impl__.disconnectServiceExtensionAbility(connection, callback); } + reportDrawnCompleted(callback) { + return this.__context_impl__.reportDrawnCompleted(callback); + } } export default UIExtensionContext; diff --git a/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp b/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp index 11a158fb9a3f07a9f1cc2420fb9e535be83d34fe..2549901dc57b755e6f687e97912d6d28be816b75 100644 --- a/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp @@ -382,9 +382,9 @@ napi_value JsEmbeddableUIAbilityContext::OnRequestDialogService(napi_env env, Na napi_value JsEmbeddableUIAbilityContext::OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info) { if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Report drawn completed in half screen mode."); - ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); - return CreateJsUndefined(env); + HILOG_INFO("Report Drawn Completed in half screen mode."); + CHECK_POINTER_RETURN(jsUIExtensionContext_); + return jsUIExtensionContext_->OnReportDrawnCompleted(env, info); } CHECK_POINTER_RETURN(jsAbilityContext_); return jsAbilityContext_->OnReportDrawnCompleted(env, info); diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp index f3a30e59e206d2df502724243b6938eed79632ef..77903b6daf76a6f5b8a6330982313635a17e316c 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp @@ -136,6 +136,11 @@ napi_value JsUIExtensionContext::DisconnectAbility(napi_env env, napi_callback_i GET_NAPI_INFO_AND_CALL(env, info, JsUIExtensionContext, OnDisconnectAbility); } +napi_value JsUIExtensionContext::ReportDrawnCompleted(napi_env env, napi_callback_info info) +{ + GET_NAPI_INFO_AND_CALL(env, info, JsUIExtensionContext, OnReportDrawnCompleted); +} + napi_value JsUIExtensionContext::OnStartAbility(napi_env env, NapiCallbackInfo& info) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); @@ -395,6 +400,35 @@ napi_value JsUIExtensionContext::OnDisconnectAbility(napi_env env, NapiCallbackI return result; } +napi_value JsUIExtensionContext::OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info) +{ + HILOG_DEBUG("called."); + auto innerErrorCode = std::make_shared(ERR_OK); + NapiAsyncTask::ExecuteCallback execute = [weak = context_, innerErrorCode]() { + auto context = weak.lock(); + if (!context) { + HILOG_WARN("context is released"); + *innerErrorCode = static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + return; + } + *innerErrorCode = context->ReportDrawnCompleted(); + }; + + NapiAsyncTask::CompleteCallback complete = [innerErrorCode](napi_env env, NapiAsyncTask& task, int32_t status) { + if (*innerErrorCode == ERR_OK) { + task.Resolve(env, CreateJsUndefined(env)); + } else { + task.Reject(env, CreateJsErrorByNativeErr(env, *innerErrorCode)); + } + }; + + napi_value lastParam = info.argv[INDEX_ZERO]; + napi_value result = nullptr; + NapiAsyncTask::ScheduleHighQos("JsUIExtensionContext::OnReportDrawnCompleted", + env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result)); + return result; +} + napi_value JsUIExtensionContext::CreateJsUIExtensionContext(napi_env env, std::shared_ptr context) { @@ -415,6 +449,7 @@ napi_value JsUIExtensionContext::CreateJsUIExtensionContext(napi_env env, BindNativeFunction(env, objValue, "terminateSelfWithResult", moduleName, TerminateSelfWithResult); BindNativeFunction(env, objValue, "connectServiceExtensionAbility", moduleName, ConnectAbility); BindNativeFunction(env, objValue, "disconnectServiceExtensionAbility", moduleName, DisconnectAbility); + BindNativeFunction(env, objValue, "reportDrawnCompleted", moduleName, ReportDrawnCompleted); return objValue; } diff --git a/frameworks/native/ability/native/ui_extension_ability/ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_ability/ui_extension_context.cpp index a6ca3960d856c2902f7bf56c7eb3d1e993772211..88a060c7368dea7455d99133980a4c4a650d6ebf 100755 --- a/frameworks/native/ability/native/ui_extension_ability/ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/ui_extension_context.cpp @@ -109,6 +109,16 @@ ErrCode UIExtensionContext::StartAbilityForResult( return err; } +ErrCode UIExtensionContext::ReportDrawnCompleted() +{ + HILOG_DEBUG("begin."); + ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->ReportDrawnCompleted(token_); + if (err != ERR_OK) { + HILOG_ERROR("ret=%{public}d", err); + } + return err; +} + void UIExtensionContext::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData) { HILOG_DEBUG("begin."); diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_context.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_context.h index 1f6b2f6bb35e5d0a6e70b3040b81e5bde90e8b04..aaefecec731d992fec2c1b613b55b9e77c8d2436 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_context.h @@ -38,6 +38,7 @@ public: static napi_value StartAbilityForResult(napi_env env, napi_callback_info info); static napi_value ConnectAbility(napi_env env, napi_callback_info info); static napi_value DisconnectAbility(napi_env env, napi_callback_info info); + static napi_value ReportDrawnCompleted(napi_env env, napi_callback_info info); protected: virtual napi_value OnStartAbility(napi_env env, NapiCallbackInfo& info); @@ -46,6 +47,7 @@ protected: virtual napi_value OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info); virtual napi_value OnConnectAbility(napi_env env, NapiCallbackInfo& info); virtual napi_value OnDisconnectAbility(napi_env env, NapiCallbackInfo& info); + virtual napi_value OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info); private: std::weak_ptr context_; diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension_context.h b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension_context.h index ba4be02478125b20a97769d9a61c3fd06f762470..69f0c044ee1fc4cad3977db81f5eae5715477c30 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension_context.h @@ -109,6 +109,8 @@ public: virtual int GenerateCurRequestCode(); + virtual ErrCode ReportDrawnCompleted(); + void SetWindow(sptr window); sptr GetWindow();