From 13fdb2c4acccbb74eb632e20a90fe642d12e53e3 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Tue, 23 Dec 2025 10:02:24 +0800 Subject: [PATCH] open static onSizeChange Signed-off-by: zhangzezhong --- .../include/ets_form_extension.h | 7 ++ .../src/ets_form_extension.cpp | 118 ++++++++++++++++++ .../@ohos.app.form.FormExtensionAbility.ets | 4 + 3 files changed, 129 insertions(+) diff --git a/frameworks/ets/ani/form_extension_ability/include/ets_form_extension.h b/frameworks/ets/ani/form_extension_ability/include/ets_form_extension.h index f3eec963da..af08ac5bd2 100644 --- a/frameworks/ets/ani/form_extension_ability/include/ets_form_extension.h +++ b/frameworks/ets/ani/form_extension_ability/include/ets_form_extension.h @@ -61,6 +61,8 @@ public: void OnConfigurationUpdated(const AppExecFwk::Configuration& configuration) override; FormState OnAcquireFormState(const Want &want) override; + + void OnSizeChanged(int64_t formId, int32_t newDimension, const Rect &newRect) override; private: void BindContext(std::shared_ptr &abilityInfo, std::shared_ptr want, const std::string &moduleName, const std::string &srcPath); @@ -79,6 +81,11 @@ private: std::vector &formDataProxies); bool ConvertFromDataProxies(ani_env *env, ani_object arrayValue, std::vector &formDataProxies); + + ani_object WrapFormRect(ani_env *env, const Rect &newRect); + + bool CreateObject(ani_env *env, ani_object &object, const std::string &className); + std::string ANIUtils_ANIStringToStdString(ani_env *env, ani_string ani_str); ani_status ANIUtils_FormIdToAniString(ani_env *env, int64_t formId, ani_string &formIdStr); std::unique_ptr etsObj_; diff --git a/frameworks/ets/ani/form_extension_ability/src/ets_form_extension.cpp b/frameworks/ets/ani/form_extension_ability/src/ets_form_extension.cpp index 69254a5eb3..aade381a9a 100644 --- a/frameworks/ets/ani/form_extension_ability/src/ets_form_extension.cpp +++ b/frameworks/ets/ani/form_extension_ability/src/ets_form_extension.cpp @@ -39,6 +39,10 @@ constexpr const char* RECORD_CLASS_NAME = "std.core.Record"; constexpr const char *FORM_LOCATION_STATE_ENUM_NAME = "@ohos.app.form.formInfo.formInfo.FormLocation"; constexpr const char *FORM_LOCATION_CHANGED_STATE_NAME = "C{std.core.String}C{@ohos.app.form.formInfo.formInfo.FormLocation}:"; +constexpr const char *FORM_DIMENSION_ENUM_NAME = "@ohos.app.form.formInfo.formInfo.FormDimension"; +constexpr const char *FORM_SIZE_CHANGED_NAME = + "C{std.core.String}C{@ohos.app.form.formInfo.formInfo.FormDimension}C{@ohos.app.form.formInfo.formInfo.Rect}:"; +constexpr const char* FORM_RECT_NAME = "@ohos.app.form.formInfo.formInfo.RectInner"; } extern "C" __attribute__((visibility("default"))) FormExtension *OHOS_ABILITY_ETSFormExtension( @@ -830,5 +834,119 @@ FormState ETSFormExtension::OnAcquireFormState(const Want &want) TAG_LOGI(AAFwkTag::FORM_EXT, "OnAcquireFormState End"); return static_cast(state); } + +void ETSFormExtension::OnSizeChanged(int64_t formId, int32_t newDimension, const Rect &newRect) +{ + TAG_LOGI(AAFwkTag::FORM_EXT, "Form size changed, formId: %{public}" PRId64, formId); + FormExtension::OnSizeChanged(formId, newDimension, newRect); + + auto env = etsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "env nullptr"); + return; + } + if (etsAbilityObj_ == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "etsAbilityObj nullptr"); + return; + } + + ani_string formIdStr = AppExecFwk::GetAniString(env, std::to_string(formId)); + ani_enum_item newDimensionItem = nullptr; + if (!OHOS::AAFwk::AniEnumConvertUtil::EnumConvert_NativeToEts(env, FORM_DIMENSION_ENUM_NAME, + newDimension, newDimensionItem) || newDimensionItem == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "newDimensionItem NativeToEts failed"); + return; + } + + ani_object formRectObject = WrapFormRect(env, newRect); + if (formRectObject == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "wrap formRectObject failed"); + return; + } + + ani_method function; + ani_status status = ANI_ERROR; + if ((status = env->Class_FindMethod( + etsAbilityObj_->aniCls, "onSizeChanged", FORM_SIZE_CHANGED_NAME, &function))) { + TAG_LOGE(AAFwkTag::FORM_EXT, "Class_FindMethod status: %{public}d", status); + return; + } + + status = env->Object_CallMethod_Void(etsAbilityObj_->aniObj, function, + formIdStr, newDimensionItem, formRectObject); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "Object_CallMethod status : %{public}d", status); + return; + } +} + +ani_object ETSFormExtension::WrapFormRect(ani_env *env, const Rect &rect) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "env nullptr"); + return nullptr; + } + + ani_object etsObject = nullptr; + if (!CreateObject(env, etsObject, FORM_RECT_NAME)) { + TAG_LOGE(AAFwkTag::FORM_EXT, "CreateObject failed"); + return nullptr; + } + + ani_status status = ANI_ERROR; + if ((status = env->Object_SetPropertyByName_Double(etsObject, "left", rect.left)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status: %{public}d", status); + return nullptr; + } + if ((status = env->Object_SetPropertyByName_Double(etsObject, "top", rect.top)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status: %{public}d", status); + return nullptr; + } + if ((status = env->Object_SetPropertyByName_Double(etsObject, "width", rect.width)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status: %{public}d", status); + return nullptr; + } + if ((status = env->Object_SetPropertyByName_Double(etsObject, "height", rect.height)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status: %{public}d", status); + return nullptr; + } + return etsObject; +} + +bool ETSFormExtension::CreateObject(ani_env *env, ani_object &object, const std::string &className) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null env"); + return false; + } + ani_status status = ANI_ERROR; + ani_class cls = nullptr; + if ((status = env->FindClass(className.c_str(), &cls)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status : %{public}d", status); + return false; + } + if (cls == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null cls"); + return false; + } + ani_method method = nullptr; + if ((status = env->Class_FindMethod(cls, "", ":", &method)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status : %{public}d", status); + return false; + } + if (method == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null method"); + return false; + } + if ((status = env->Object_New(cls, method, &object)) != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "status : %{public}d", status); + return false; + } + if (object == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null object"); + return false; + } + return true; +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/ets/ets/@ohos.app.form.FormExtensionAbility.ets b/frameworks/ets/ets/@ohos.app.form.FormExtensionAbility.ets index 48cfa9d999..2fc9998f3f 100644 --- a/frameworks/ets/ets/@ohos.app.form.FormExtensionAbility.ets +++ b/frameworks/ets/ets/@ohos.app.form.FormExtensionAbility.ets @@ -67,6 +67,10 @@ export default class FormExtensionAbility { console.log(`FormExtensionAbility onConfigurationUpdate`); } + onSizeChanged(formId: string, newDimension: formInfo.FormDimension, newRect: formInfo.Rect): void { + console.log('FormExtensionAbility onSizeChanged'); + } + public onAcquireFormState?: OnAcquireFormStateFn; public onStop?: OnStopFn;