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 ec46ff210576719525afd72e6dab0d844fd6c75a..3f91e1dc55077f49712fabfacda94a03d453a2f4 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 31b5cf3671eb87249b564d3c97cc21bb744d3de3..467d2062805c3fb8a3973fc477f2c7aa2dbf7aee 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 8a59dfe02785969d68e7a8a76fc6152612535cc9..287547b838f60bfbdfac64f06fca718a186b0519 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" @@ -661,5 +663,81 @@ void STSFormExtension::OnStop() TAG_LOGI(AAFwkTag::FORM_EXT, "OnStop End"); } + +void STSFormExtension::OnConfigurationUpdated(const AppExecFwk::Configuration& configuration) +{ + FormExtension::OnConfigurationUpdated(configuration); + TAG_LOGI(AAFwkTag::FORM_EXT, "OnConfigurationUpdated Call"); + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "env nullptr"); + return; + } + auto context = GetContext(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::FORM_EXT, "null context"); + return; + } + auto fullConfig = context->GetConfiguration(); + 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); +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/native/ability/native/BUILD.gn b/frameworks/native/ability/native/BUILD.gn index be9b389abb8f8569642fd009034f53167c79fa33..436c4ab92658a30ef0a67ed0ff09804f4dd5cc45 100644 --- a/frameworks/native/ability/native/BUILD.gn +++ b/frameworks/native/ability/native/BUILD.gn @@ -947,6 +947,7 @@ ohos_shared_library("sts_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 = [