From f7d7b142b6b894948f80c89f338f2283b41cfe1a Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Thu, 4 Sep 2025 14:44:03 +0800 Subject: [PATCH] add ani uiExtensionContent loadContentByName Signed-off-by: zhangzezhong --- .../ets_ui_extension_content_session.h | 2 + .../src/ets_ui_extension_content_session.cpp | 45 ++++++++++++++++++- ....app.ability.UIExtensionContentSession.ets | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h index 0bf386f510d..0b0a4a05561 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h +++ b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h @@ -76,6 +76,7 @@ public: static void NativeSendData(ani_env *env, ani_object obj, ani_object data); static void NativeLoadContent(ani_env *env, ani_object obj, ani_string path, ani_object storage); + static void NativeLoadContentByName(ani_env *env, ani_object obj, ani_string path, ani_object storage); static void NativeTerminateSelf(ani_env *env, ani_object obj, ani_object callback); static void NativeSetWindowBackgroundColor(ani_env *env, ani_object obj, ani_string color); static int NativeTerminateSelfWithResult( @@ -115,6 +116,7 @@ private: ani_object GetUIExtensionWindowProxy(ani_env *env, ani_object object); void SetWindowPrivacyModeInner(ani_env *env, ani_boolean isPrivacyMode, ani_object callbackObj, ani_vm *etsVm, ani_ref callbackRef); + void LoadContentByName(ani_env *env, ani_object object, ani_string path, ani_object storage); static ani_status BindNativeMethod(ani_env *env, ani_class cls); sptr sessionInfo_; diff --git a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp index 2637bd52075..4dc8e0ccefb 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp @@ -215,6 +215,15 @@ void EtsUIExtensionContentSession::NativeSetWindowPrivacyMode( } } +void EtsUIExtensionContentSession::NativeLoadContentByName(ani_env *env, ani_object obj, + ani_string path, ani_object storage) +{ + auto etsContentSession = EtsUIExtensionContentSession::GetEtsContentSession(env, obj); + if (etsContentSession != nullptr) { + etsContentSession->LoadContentByName(env, obj, path, storage); + } +} + EtsUIExtensionContentSession::EtsUIExtensionContentSession( sptr sessionInfo, sptr uiWindow, std::weak_ptr &context, @@ -294,7 +303,10 @@ ani_status EtsUIExtensionContentSession::BindNativeMethod(ani_env *env, ani_clas ani_native_function {"nativeStartAbilityByTypeSync", SIGNATURE_START_ABILITY_BY_TYPE, reinterpret_cast(EtsUIExtensionContentSession::NativeStartAbilityByTypeSync)}, ani_native_function {"nativeSetWindowPrivacyMode", SIGNATURE_SET_WINDOW_PRIVACY_MODE, - reinterpret_cast(EtsUIExtensionContentSession::NativeSetWindowPrivacyMode)} + reinterpret_cast(EtsUIExtensionContentSession::NativeSetWindowPrivacyMode)}, + ani_native_function {"loadContentByName", + "Lstd/core/String;Larkui/stateManagement/storage/localStorage/LocalStorage;:V", + reinterpret_cast(EtsUIExtensionContentSession::NativeLoadContentByName)} }; ani_status status = ANI_ERROR; if ((status = env->Class_BindNativeMethods(cls, methods.data(), methods.size())) != ANI_OK @@ -773,6 +785,37 @@ void EtsUIExtensionContentSession::SetWindowPrivacyModeInner(ani_env *env, ani_b } } +void EtsUIExtensionContentSession::LoadContentByName(ani_env *env, ani_object object, + ani_string path, ani_object storage) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "LoadContent called"); + std::string contextPath; + if (!OHOS::AppExecFwk::GetStdString(env, path, contextPath)) { + TAG_LOGE(AAFwkTag::UI_EXT, "invalid param"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parameter error: Path must be a string."); + return; + } + TAG_LOGD(AAFwkTag::UI_EXT, "contextPath: %{public}s", contextPath.c_str()); + if (uiWindow_ == nullptr || sessionInfo_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "uiWindow_ or sessionInfo_ is nullptr"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); + return; + } + if (sessionInfo_->isAsyncModalBinding && isFirstTriggerBindModal_) { + TAG_LOGD(AAFwkTag::UI_EXT, "Trigger binding UIExtension modal window"); + uiWindow_->TriggerBindModalUIExtension(); + isFirstTriggerBindModal_ = false; + } + sptr parentToken = sessionInfo_->parentToken; + Rosen::WMError ret = uiWindow_->AniSetUIContentByName(contextPath, env, storage, + Rosen::BackupAndRestoreType::NONE, parentToken); + if (ret != Rosen::WMError::WM_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "AniSetUIContent failed, ret=%{public}d", ret); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); + } + TAG_LOGD(AAFwkTag::UI_EXT, "LoadContent end"); +} + bool EtsUIExtensionContentSession::CheckStartAbilityByTypeParam( ani_env *env, ani_string aniType, ani_ref aniWantParam, std::string &type, AAFwk::WantParams &wantParam) { diff --git a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets index bb7fe873a25..33c81b12139 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets @@ -53,6 +53,7 @@ export default class UIExtensionContentSession { } native nativeSendData(data: Record): void; native loadContent(path: string, storage?: LocalStorage): void; + native loadContentByName(path: string, storage?: LocalStorage): void; native setWindowBackgroundColor(color: string): void; native getUIExtensionHostWindowProxy(): uiExtensionHost.UIExtensionHostWindowProxy; native getUIExtensionWindowProxy(): uiExtension.WindowProxy; -- Gitee