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..09be2718c604ac6218f45d39dd10e62f6d60d371 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,12 @@ */ 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 OnAcquireFormStateFn = (want: Want) => formInfo.FormState; type OnStopFn = () => void; @@ -54,5 +58,11 @@ export default class FormExtensionAbility { console.log(`FormExtensionAbility onRemoveForm, formId: ${formId}`); } + onConfigurationUpdate(newConfig: Configuration): void { + console.log(`FormExtensionAbility onConfigurationUpdate`); + } + + public onAcquireFormState?: OnAcquireFormStateFn; + 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..0ded712d5c0a343419d1cbcff0cd7946a2e504c0 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 c8ccbbadf8420d5179a79b3dbd0f76b6d3046fb7..9c34448253c60b3c086a703be0c078223c2f5b55 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_common_configuration.h" +#include "ani_enum_convert.h" #include "form_provider_data.h" #include "form_runtime/form_extension_provider_client.h" #include "hilog_tag_wrapper.h" @@ -655,5 +657,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 cb53b53e80448a824c756cc3b0b0b72068aca6ca..f0424c9c30b7ab3007894328346bf397a86b8610 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 = [