From 360cb23ce4d012f6294f9d559752ee9df07b8c51 Mon Sep 17 00:00:00 2001 From: fatihbudak Date: Mon, 2 Jun 2025 16:03:07 +0300 Subject: [PATCH] added onconfigurationupdated and onacquireformstate Signed-off-by: fatihbudak --- .../@ohos.app.form.FormExtensionAbility.ets | 11 +++ .../include/sts_form_extension.h | 4 + .../src/sts_form_extension.cpp | 78 +++++++++++++++++++ frameworks/native/ability/native/BUILD.gn | 1 + 4 files changed, 94 insertions(+) diff --git a/frameworks/ets/ani/form_extension_ability/ets/@ohos.app.form.FormExtensionAbility.ets b/frameworks/ets/ani/form_extension_ability/ets/@ohos.app.form.FormExtensionAbility.ets index ec46ff21057..3f91e1dc550 100644 --- a/frameworks/ets/ani/form_extension_ability/ets/@ohos.app.form.FormExtensionAbility.ets +++ b/frameworks/ets/ani/form_extension_ability/ets/@ohos.app.form.FormExtensionAbility.ets @@ -14,8 +14,10 @@ */ import formBindingData from '@ohos.app.form.formBindingData'; +import formInfo from '@ohos.app.form.formInfo'; import FormExtensionContext from './application/FormExtensionContext'; import Want from '@ohos.app.ability.Want'; +import { Configuration } from '@ohos.app.ability.Configuration'; type OnStopFn = () => void; @@ -54,5 +56,14 @@ export default class FormExtensionAbility { console.log(`FormExtensionAbility onRemoveForm, formId: ${formId}`); } + onConfigurationUpdate(newConfig: Configuration): void { + console.log(`FormExtensionAbility onConfigurationUpdate`); + } + + onAcquireFormState (want: Want): formInfo.FormState { + console.log(`FormExtensionAbility onAcquireFormState`); + return formInfo.FormState.DEFAULT; + } + public onStop?: OnStopFn; } \ No newline at end of file diff --git a/frameworks/ets/ani/form_extension_ability/include/sts_form_extension.h b/frameworks/ets/ani/form_extension_ability/include/sts_form_extension.h index 31b5cf3671e..467d2062805 100644 --- a/frameworks/ets/ani/form_extension_ability/include/sts_form_extension.h +++ b/frameworks/ets/ani/form_extension_ability/include/sts_form_extension.h @@ -51,6 +51,10 @@ public: sptr OnConnect(const OHOS::AAFwk::Want &want) override; + void OnConfigurationUpdated(const AppExecFwk::Configuration& configuration) override; + + FormState OnAcquireFormState(const Want &want) override; + void OnStop() override; private: void BindContext(std::shared_ptr &abilityInfo, std::shared_ptr want, diff --git a/frameworks/ets/ani/form_extension_ability/src/sts_form_extension.cpp b/frameworks/ets/ani/form_extension_ability/src/sts_form_extension.cpp index c8ccbbadf84..573784e30d6 100644 --- a/frameworks/ets/ani/form_extension_ability/src/sts_form_extension.cpp +++ b/frameworks/ets/ani/form_extension_ability/src/sts_form_extension.cpp @@ -21,6 +21,8 @@ #include "ability_info.h" #include "ani.h" #include "ani_common_want.h" +#include "ani_enum_convert.h" +#include "ani_common_configuration.h" #include "form_provider_data.h" #include "form_runtime/form_extension_provider_client.h" #include "hilog_tag_wrapper.h" @@ -620,6 +622,82 @@ bool STSFormExtension::CreateAndFillRecordObject(ani_env *env, const std::mapGetConfiguration(); + if (!fullConfig) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null configuration"); + return; + } + + ani_object aniConfiguration = OHOS::AppExecFwk::WrapConfiguration(env, *fullConfig); + ani_method method = nullptr; + ani_status status = env->Class_FindMethod(stsAbilityObj_->aniCls, + "onConfigurationUpdate", "L@ohos/app/ability/Configuration/Configuration;:V", &method); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "Class_FindMethod failed, status: %{public}d", status); + return; + } + status = env->Object_CallMethod_Void(stsAbilityObj_->aniObj, method, aniConfiguration); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "CALL Object_CallMethod failed, status: %{public}d", status); + return; + } + TAG_LOGI(AAFwkTag::FORM_EXT, "OnConfigurationUpdated End"); +} + +FormState STSFormExtension::OnAcquireFormState(const Want &want) +{ + TAG_LOGI(AAFwkTag::FORM_EXT, "OnAcquireFormState Call"); + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "env nullptr"); + return AppExecFwk::FormState::DEFAULT; + } + ani_ref wantRef = OHOS::AppExecFwk::WrapWant(env, want); + if (wantRef == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "wantRef nullptr"); + return AppExecFwk::FormState::DEFAULT; + } + + ani_ref nameRef; + ani_status status = env->Object_GetFieldByName_Ref( + static_cast(stsAbilityObj_->aniRef), "onAcquireFormState", &nameRef); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "Object_GetFieldByName status: %{public}d, %{public}p, %{public}p", + status, stsAbilityObj_->aniRef, stsAbilityObj_->aniObj); + return AppExecFwk::FormState::DEFAULT; + } + ani_ref argv[] = { wantRef }; + ani_ref result; + status = env->FunctionalObject_Call(static_cast(nameRef), 1, argv, &result); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::FORM_EXT, "FunctionalObject_Call status: %{public}d", status); + return AppExecFwk::FormState::DEFAULT; + } + int32_t state = static_cast(FormState::DEFAULT); + AAFwk::AniEnumConvertUtil::EnumConvertStsToNative(env, static_cast(result), state); + TAG_LOGI(AAFwkTag::FORM_EXT, "state: %{public}d", state); + if (state <= static_cast(AppExecFwk::FormState::UNKNOWN) || + state > static_cast(AppExecFwk::FormState::READY)) { + return AppExecFwk::FormState::UNKNOWN; + } + TAG_LOGI(AAFwkTag::FORM_EXT, "OnAcquireFormState End"); + return static_cast(state); +} + void STSFormExtension::OnStop() { TAG_LOGI(AAFwkTag::FORM_EXT, "OnStop begin"); diff --git a/frameworks/native/ability/native/BUILD.gn b/frameworks/native/ability/native/BUILD.gn index cb53b53e804..f0424c9c30b 100644 --- a/frameworks/native/ability/native/BUILD.gn +++ b/frameworks/native/ability/native/BUILD.gn @@ -927,6 +927,7 @@ ohos_shared_library("form_extension") { "${ability_runtime_path}/frameworks/ets/ani/form_extension_ability/include", "${ability_runtime_path}/interfaces/kits/native/ability/native", "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime", + "${ability_runtime_path}/frameworks/ets/ani/enum_convert", ] sources = [ -- Gitee