From c419a81d9e1a7830af672c90d6f1bc16621c9518 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Sun, 1 Jun 2025 15:39:17 +0800 Subject: [PATCH] add ability_OnConfigurationUpdated_OnMemoryLevel Signed-off-by: zhangzezhong --- .../include/sts_ui_extension.h | 3 + .../src/sts_ui_extension.cpp | 131 ++++++++++++++++-- .../ets/ets/@ohos.app.ability.Ability.ets | 24 ++++ .../@ohos.app.ability.ExtensionAbility.ets | 19 +++ .../ets/ets/@ohos.app.ability.UIAbility.ets | 3 +- .../@ohos.app.ability.UIExtensionAbility.ets | 3 +- frameworks/ets/ets/BUILD.gn | 55 ++++++-- .../ability_runtime/ets_extension_context.cpp | 19 ++- frameworks/native/ability/native/BUILD.gn | 13 +- .../ability_runtime/sts_ability_context.cpp | 15 ++ .../native/ability_runtime/sts_ui_ability.cpp | 58 ++++++-- .../ability/native/ets_extension_common.cpp | 110 +++++++++++++++ .../ability_runtime/ets_extension_context.h | 11 +- .../ability_runtime/sts_ability_context.h | 3 + .../ability/native/ets_extension_common.h | 72 ++++++++++ 15 files changed, 499 insertions(+), 40 deletions(-) create mode 100644 frameworks/ets/ets/@ohos.app.ability.Ability.ets create mode 100644 frameworks/ets/ets/@ohos.app.ability.ExtensionAbility.ets create mode 100644 frameworks/native/ability/native/ets_extension_common.cpp create mode 100644 interfaces/kits/native/ability/native/ets_extension_common.h diff --git a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h index 8264a8bc71e..24bec62e5e9 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h +++ b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h @@ -174,6 +174,8 @@ public: */ void ConfigurationUpdated(); + void OnAbilityConfigurationUpdated(const AppExecFwk::Configuration &configuration); + void ResetEnv(ani_env* env); private: @@ -181,6 +183,7 @@ private: const std::shared_ptr &application); ani_object CreateSTSContext(ani_env *env, std::shared_ptr context, int32_t screenMode, const std::shared_ptr &application); + void RegisterAbilityConfigUpdateCallback(); bool CallObjectMethod(bool withResult, const char* name, const char* signature, ...); ani_status CallOnDisconnect(const AAFwk::Want &want, bool withResult = false); ani_object CreateStsLaunchParam(ani_env* env, const AAFwk::LaunchParam& param); diff --git a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp index b281109f8da..3c10c6eebb1 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp @@ -14,27 +14,31 @@ */ #include "sts_ui_extension.h" + #include "ability_context.h" #include "ability_delegator_registry.h" #include "ability_info.h" #include "ability_manager_client.h" #include "ability_start_setting.h" +#include "ani_common_configuration.h" +#include "ani_common_want.h" #include "array_wrapper.h" #include "configuration_utils.h" #include "connection_manager.h" #include "context.h" -#include "hitrace_meter.h" +#include "ets_extension_common.h" +#include "ets_extension_context.h" #include "hilog_tag_wrapper.h" +#include "hitrace_meter.h" #include "insight_intent_executor_info.h" #include "insight_intent_executor_mgr.h" #include "int_wrapper.h" +#include "string_wrapper.h" +#include "sts_data_struct_converter.h" #include "sts_runtime.h" -#include "ani_common_want.h" +#include "sts_ui_extension_context.h" #include "ui_extension_window_command.h" #include "want_params_wrapper.h" -#include "sts_data_struct_converter.h" -#include "sts_ui_extension_context.h" -#include "string_wrapper.h" namespace OHOS { namespace AbilityRuntime { @@ -108,6 +112,7 @@ void StsUIExtension::Init(const std::shared_ptr &record, return; } + RegisterAbilityConfigUpdateCallback(); if (record != nullptr) { token_ = record->GetToken(); } @@ -142,9 +147,62 @@ void StsUIExtension::Init(const std::shared_ptr &record, TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); } BindContext(env, record->GetWant(), application); + SetExtensionCommon( + EtsExtensionCommon::Create(stsRuntime_, static_cast(*stsObj_), shellContextRef_)); RegisterDisplayInfoChangedListener(); } +void StsUIExtension::RegisterAbilityConfigUpdateCallback() +{ + auto context = GetContext(); + auto uiExtensionAbility = std::static_pointer_cast(shared_from_this()); + std::weak_ptr abilityWptr = uiExtensionAbility; + context->RegisterAbilityConfigUpdateCallback( + [abilityWptr, abilityContext = context](AppExecFwk::Configuration &config) { + std::shared_ptr abilitySptr = abilityWptr.lock(); + if (abilitySptr == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null abilitySptr"); + return; + } + if (abilityContext == nullptr || abilityContext->GetAbilityInfo() == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext or null GetAbilityInfo"); + return; + } + if (abilityContext->GetAbilityConfiguration() == nullptr) { + auto abilityModuleContext = abilityContext->CreateModuleContext( + abilityContext->GetAbilityInfo()->moduleName); + if (abilityModuleContext == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null abilityModuleContext"); + return; + } + auto abilityResourceMgr = abilityModuleContext->GetResourceManager(); + abilityContext->SetAbilityResourceManager(abilityResourceMgr); + AbilityRuntime::ApplicationConfigurationManager::GetInstance(). + AddIgnoreContext(abilityContext, abilityResourceMgr); + TAG_LOGE(AAFwkTag::UIABILITY, "%{public}zu", + AbilityRuntime::ApplicationConfigurationManager::GetInstance().GetIgnoreContext().size()); + } + abilityContext->SetAbilityConfiguration(config); + if (config.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE). + compare(AppExecFwk::ConfigurationInner::COLOR_MODE_AUTO) == 0) { + config.AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE, + AbilityRuntime::ApplicationConfigurationManager::GetInstance().GetColorMode()); + + if (AbilityRuntime::ApplicationConfigurationManager::GetInstance(). + GetColorModeSetLevel() > AbilityRuntime::SetLevel::System) { + config.AddItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP, + AppExecFwk::ConfigurationInner::IS_SET_BY_APP); + } + abilityContext->GetAbilityConfiguration()-> + RemoveItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); + abilityContext->GetAbilityConfiguration()-> + RemoveItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP); + } + + abilitySptr->OnAbilityConfigurationUpdated(config); + }); +} + std::shared_ptr StsUIExtension::LoadModule(ani_env *env) { std::shared_ptr stsNativeReference = std::make_shared(); @@ -220,6 +278,9 @@ void StsUIExtension::BindContext(ani_env*env, std::shared_ptr want, TAG_LOGE(AAFwkTag::STSRUNTIME, "status: %{public}d", status); ResetEnv(env); } + shellContextRef_ = std::make_shared(); + shellContextRef_->aniObj = contextObj; + shellContextRef_->aniRef = contextRef; } ani_object StsUIExtension::CreateStsLaunchParam(ani_env* env, const AAFwk::LaunchParam& param) @@ -245,6 +306,9 @@ void StsUIExtension::OnStart(const AAFwk::Want &want, sptr s TAG_LOGE(AAFwkTag::UI_EXT, "env not found Ability.sts"); return; } + if (context != nullptr) { + EtsExtensionContext::ConfigurationUpdated(env, shellContextRef_, context->GetConfiguration()); + } const char *signature = "L@ohos/app/ability/AbilityConstant/AbilityConstant/LaunchParam;:V"; auto launchParam = Extension::GetLaunchParam(); @@ -690,18 +754,53 @@ bool StsUIExtension::CallObjectMethod(bool withResult, const char *name, const c return false; } -void StsUIExtension::OnConfigurationUpdated(const AppExecFwk::Configuration& configuration) +void StsUIExtension::OnConfigurationUpdated(const AppExecFwk::Configuration &configuration) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); Extension::OnConfigurationUpdated(configuration); + TAG_LOGD(AAFwkTag::UI_EXT, "OnConfigurationUpdated called"); auto context = GetContext(); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "context null"); + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); return; } + auto abilityConfig = context->GetAbilityConfiguration(); + auto configUtils = std::make_shared(); + if (abilityConfig != nullptr) { + auto newConfig = configUtils->UpdateGlobalConfig( + configuration, context->GetConfiguration(), abilityConfig, context->GetResourceManager()); + if (newConfig.GetItemSize() == 0) { + return; + } + if (context->GetWindow()) { + TAG_LOGI(AAFwkTag::UIABILITY, "newConfig: %{public}s", newConfig.GetName().c_str()); + auto diffConfiguration = std::make_shared(newConfig); + context->GetWindow()->UpdateConfigurationForSpecified(diffConfiguration, context->GetResourceManager()); + } + } else { + auto configUtils = std::make_shared(); + configUtils->UpdateGlobalConfig(configuration, context->GetConfiguration(), context->GetResourceManager()); + } + ConfigurationUpdated(); +} +void StsUIExtension::OnAbilityConfigurationUpdated(const AppExecFwk::Configuration &configuration) +{ + HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); + Extension::OnConfigurationUpdated(configuration); + TAG_LOGD(AAFwkTag::UI_EXT, "OnAbilityConfigurationUpdated called"); + auto context = GetContext(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); + return; + } auto configUtils = std::make_shared(); - configUtils->UpdateGlobalConfig(configuration, context->GetConfiguration(), context->GetResourceManager()); + configUtils->UpdateAbilityConfig(configuration, context->GetResourceManager()); + if (context->GetWindow()) { + TAG_LOGI(AAFwkTag::UIABILITY, "newConfig: %{public}s", configuration.GetName().c_str()); + auto diffConfiguration = std::make_shared(configuration); + context->GetWindow()->UpdateConfigurationForSpecified(diffConfiguration, context->GetResourceManager()); + } ConfigurationUpdated(); } @@ -729,7 +828,7 @@ void StsUIExtension::OnAbilityResult(int requestCode, int resultCode, const Want void StsUIExtension::ConfigurationUpdated() { - ani_env* env = stsRuntime_.GetAniEnv(); + auto env = stsRuntime_.GetAniEnv(); if (env == nullptr) { TAG_LOGE(AAFwkTag::UI_EXT, "env null"); return; @@ -739,12 +838,24 @@ void StsUIExtension::ConfigurationUpdated() TAG_LOGE(AAFwkTag::UI_EXT, "context null"); return; } - + auto abilityConfig = context->GetAbilityConfiguration(); auto fullConfig = context->GetConfiguration(); if (fullConfig == nullptr) { TAG_LOGE(AAFwkTag::UI_EXT, "fullConfig null"); return; } + auto realConfig = AppExecFwk::Configuration(*fullConfig); + if (abilityConfig != nullptr) { + std::vector changeKeyV; + realConfig.CompareDifferent(changeKeyV, *abilityConfig); + if (!changeKeyV.empty()) { + realConfig.Merge(changeKeyV, *abilityConfig); + } + } + auto realConfigPtr = std::make_shared(realConfig); + EtsExtensionContext::ConfigurationUpdated(env, shellContextRef_, realConfigPtr); + ani_object aniConfiguration = OHOS::AppExecFwk::WrapConfiguration(env, realConfig); + CallObjectMethod(false, "onConfigurationUpdate", nullptr, aniConfiguration); } #ifdef SUPPORT_GRAPHICS diff --git a/frameworks/ets/ets/@ohos.app.ability.Ability.ets b/frameworks/ets/ets/@ohos.app.ability.Ability.ets new file mode 100644 index 00000000000..ec1a0d6ea93 --- /dev/null +++ b/frameworks/ets/ets/@ohos.app.ability.Ability.ets @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; +import { Configuration } from '@ohos.app.ability.Configuration'; +export default class Ability { + onConfigurationUpdate(newConfig: Configuration): void { + } + + onMemoryLevel(level: AbilityConstant.MemoryLevel): void { + } +} diff --git a/frameworks/ets/ets/@ohos.app.ability.ExtensionAbility.ets b/frameworks/ets/ets/@ohos.app.ability.ExtensionAbility.ets new file mode 100644 index 00000000000..09368e1869f --- /dev/null +++ b/frameworks/ets/ets/@ohos.app.ability.ExtensionAbility.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ability from '@ohos.app.ability.Ability'; + +export default class ExtensionAbility extends Ability { +} diff --git a/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets b/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets index dee014b5f1c..9ecc909a161 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets @@ -13,6 +13,7 @@ * limitations under the License. */ +import Ability from '@ohos.app.ability.Ability'; import AbilityConstant from '@ohos.app.ability.AbilityConstant'; import UIAbilityContext from 'application.UIAbilityContext'; import Want from '@ohos.app.ability.Want'; @@ -31,7 +32,7 @@ export interface Callee { on(method: string, callback: CalleeCallback): void; } -export default class UIAbility { +export default class UIAbility extends Ability { private destroyCallbackPoint: long; private native nativeOnDestroyCallback(): void; private callOnDestroy(): boolean { diff --git a/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets b/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets index 8f2edb1093a..6adad7a3b44 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets @@ -14,12 +14,11 @@ */ import AbilityConstant from '@ohos.app.ability.AbilityConstant'; +import ExtensionAbility from '@ohos.app.ability.ExtensionAbility'; import Want from '@ohos.app.ability.Want'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; import UIExtensionContext from 'application.UIExtensionContext'; -class ExtensionAbility{} - export default class UIExtensionAbility extends ExtensionAbility { private isOnDestroyAsync: boolean = true; diff --git a/frameworks/ets/ets/BUILD.gn b/frameworks/ets/ets/BUILD.gn index ae9a2fc41a8..8204dc7b54d 100644 --- a/frameworks/ets/ets/BUILD.gn +++ b/frameworks/ets/ets/BUILD.gn @@ -349,8 +349,7 @@ generate_static_abc("ability_runtime_shell_cmd_result_abc") { files = [ "./application/shellCmdResult.ets" ] is_boot_abc = "True" - device_dst_file = - "/system/framework/ability_runtime_shell_cmd_result_abc.abc" + device_dst_file = "/system/framework/ability_runtime_shell_cmd_result_abc.abc" } ohos_prebuilt_etc("ability_runtime_shell_cmd_result_abc_etc") { @@ -609,8 +608,7 @@ generate_static_abc("ability_runtime_ability_caller_abc") { files = [ "./caller/Caller.ets" ] is_boot_abc = "True" - device_dst_file = - "/system/framework/ability_runtime_ability_caller_abc.abc" + device_dst_file = "/system/framework/ability_runtime_ability_caller_abc.abc" } ohos_prebuilt_etc("ability_runtime_ability_caller_abc_etc") { @@ -626,8 +624,7 @@ generate_static_abc("ability_runtime_ability_callee_abc") { files = [ "./callee/Callee.ets" ] is_boot_abc = "True" - device_dst_file = - "/system/framework/ability_runtime_ability_callee_abc.abc" + device_dst_file = "/system/framework/ability_runtime_ability_callee_abc.abc" } ohos_prebuilt_etc("ability_runtime_ability_callee_abc_etc") { @@ -757,7 +754,8 @@ generate_static_abc("ability_runtime_insight_intent_context_abc") { files = [ "./@ohos.app.ability.InsightIntentContext.ets" ] is_boot_abc = "True" - device_dst_file = "/system/framework/ability_runtime_insight_intent_context_abc.abc" + device_dst_file = + "/system/framework/ability_runtime_insight_intent_context_abc.abc" } ohos_prebuilt_etc("ability_runtime_insight_intent_context_abc_etc") { @@ -773,7 +771,8 @@ generate_static_abc("ability_runtime_insight_intent_driver_abc") { files = [ "./@ohos.app.ability.insightIntentDriver.ets" ] is_boot_abc = "True" - device_dst_file = "/system/framework/ability_runtime_insight_intent_driver_abc.abc" + device_dst_file = + "/system/framework/ability_runtime_insight_intent_driver_abc.abc" } ohos_prebuilt_etc("ability_runtime_insight_intent_driver_abc_etc") { @@ -789,7 +788,8 @@ generate_static_abc("ability_runtime_insight_intent_executor_abc") { files = [ "./@ohos.app.ability.InsightIntentExecutor.ets" ] is_boot_abc = "True" - device_dst_file = "/system/framework/ability_runtime_insight_intent_executor_abc.abc" + device_dst_file = + "/system/framework/ability_runtime_insight_intent_executor_abc.abc" } ohos_prebuilt_etc("ability_runtime_insight_intent_executor_abc_etc") { @@ -800,6 +800,39 @@ ohos_prebuilt_etc("ability_runtime_insight_intent_executor_abc_etc") { deps = [ ":ability_runtime_insight_intent_executor_abc" ] } +generate_static_abc("ability_runtime_extension_ability_abc") { + base_url = "./" + files = [ "./@ohos.app.ability.ExtensionAbility.ets" ] + + is_boot_abc = "True" + device_dst_file = + "/system/framework/ability_runtime_extension_ability_abc.abc" +} + +ohos_prebuilt_etc("ability_runtime_extension_ability_abc_etc") { + source = "$target_out_dir/ability_runtime_extension_ability_abc.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":ability_runtime_extension_ability_abc" ] +} + +generate_static_abc("ability_runtime_ability_abc") { + base_url = "./" + files = [ "./@ohos.app.ability.Ability.ets" ] + + is_boot_abc = "True" + device_dst_file = "/system/framework/ability_runtime_ability_abc.abc" +} + +ohos_prebuilt_etc("ability_runtime_ability_abc_etc") { + source = "$target_out_dir/ability_runtime_ability_abc.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":ability_runtime_ability_abc" ] +} + group("ets_packages") { deps = [ ":ability_ability_application_abc_etc", @@ -809,7 +842,9 @@ group("ets_packages") { ":ability_delegator_application_testRunner_abc_etc", ":ability_delegator_args_abc_etc", ":ability_delegator_registry_abc_etc", + ":ability_runtime_OpenLink_Options_abc_etc", ":ability_runtime_abilityResult_abc_etc", + ":ability_runtime_ability_abc_etc", ":ability_runtime_ability_callee_abc_etc", ":ability_runtime_ability_caller_abc_etc", ":ability_runtime_ability_constant_abc_etc", @@ -828,6 +863,7 @@ group("ets_packages") { ":ability_runtime_context_abc_etc", ":ability_runtime_environment_callback_abc_etc", ":ability_runtime_event_hub_abc_etc", + ":ability_runtime_extension_ability_abc_etc", ":ability_runtime_extension_context_abc_etc", ":ability_runtime_insight_intent_abc_etc", ":ability_runtime_insight_intent_context_abc_etc", @@ -848,6 +884,5 @@ group("ets_packages") { ":ability_runtime_want_constant_abc_etc", ":service_extension_ability_abc_etc", ":ui_extension_ability_ani_etc", - ":ability_runtime_OpenLink_Options_abc_etc", ] } diff --git a/frameworks/native/ability/ability_runtime/ets_extension_context.cpp b/frameworks/native/ability/ability_runtime/ets_extension_context.cpp index ece2571d88e..b28e374afa2 100644 --- a/frameworks/native/ability/ability_runtime/ets_extension_context.cpp +++ b/frameworks/native/ability/ability_runtime/ets_extension_context.cpp @@ -14,10 +14,12 @@ */ #include "ets_extension_context.h" + #include "ani_common_configuration.h" -#include "hilog_tag_wrapper.h" #include "common_fun_ani.h" +#include "hilog_tag_wrapper.h" #include "sts_context_utils.h" +#include "sts_runtime.h" namespace OHOS { namespace AbilityRuntime { @@ -107,5 +109,20 @@ void CreatEtsExtensionContext(ani_env* aniEnv, ani_class contextClass, ani_objec return; } } + +void EtsExtensionContext::ConfigurationUpdated(ani_env *env, const std::shared_ptr &stsContext, + const std::shared_ptr &config) +{ + if (env == nullptr || stsContext == nullptr || config == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "env or stsContext or config is null"); + return; + } + ani_ref configurationRef = OHOS::AppExecFwk::WrapConfiguration(env, *config); + ani_status status = env->Object_SetFieldByName_Ref(stsContext->aniObj, "config", configurationRef); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::CONTEXT, "Object_SetFieldByName_Ref status: %{public}d", status); + return; + } +} } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/native/ability/native/BUILD.gn b/frameworks/native/ability/native/BUILD.gn index cb53b53e804..4b3854a45d2 100644 --- a/frameworks/native/ability/native/BUILD.gn +++ b/frameworks/native/ability/native/BUILD.gn @@ -361,8 +361,8 @@ ohos_shared_library("abilitykit_native") { "init:libbegetutil", "ipc:ipc_core", "ipc:ipc_napi", - "ipc:rpc_ani", "ipc:rpc", + "ipc:rpc_ani", "json:nlohmann_json_static", "napi:ace_napi", "resource_management:global_resmgr", @@ -537,12 +537,14 @@ ohos_shared_library("extensionkit_native") { defines += [ "AMS_LOG_DOMAIN = 0xD001300" ] include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/ability/native", + "${ability_runtime_path}/frameworks/ets/ani/enum_convert", "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime", "${ability_runtime_napi_path}/inner/napi_common", ] sources = [ "${ability_runtime_native_path}/ability/native/app_module_checker.cpp", + "${ability_runtime_native_path}/ability/native/ets_extension_common.cpp", "${ability_runtime_native_path}/ability/native/extension.cpp", "${ability_runtime_native_path}/ability/native/extension_config_mgr.cpp", "${ability_runtime_native_path}/ability/native/extension_impl.cpp", @@ -565,6 +567,7 @@ ohos_shared_library("extensionkit_native") { "${ability_runtime_napi_path}/inner/napi_common:napi_common", "${ability_runtime_native_path}/ability:ability_context_native", "${ability_runtime_native_path}/appkit:app_context", + "${ability_runtime_path}/frameworks/ets/ani/ani_common:ani_common", ] external_deps = [ @@ -578,6 +581,7 @@ ohos_shared_library("extensionkit_native") { "ipc:ipc_napi", "json:nlohmann_json_static", "napi:ace_napi", + "runtime_core:ani", ] public_deps = [ ":abilitykit_utils" ] @@ -741,10 +745,11 @@ config("uiability_config") { ohos_shared_library("uiabilitykit_native") { include_dirs = [ "${ability_runtime_path}/frameworks/ets/ani/ani_common/include", + "${ability_runtime_path}/frameworks/ets/ani/enum_convert", "${ability_runtime_path}/interfaces/kits/native/ability/native", "${ability_runtime_path}/interfaces/kits/native/ability/native/ability_runtime", - "${ability_runtime_path}/interfaces/kits/native/ability/native/ui_extension_ability", "${ability_runtime_path}/utils/global/time/include", + "${ability_runtime_path}/frameworks/ets/ani/ui_extension_ability/include", ] sources = [ @@ -1052,15 +1057,16 @@ ohos_shared_library("service_extension") { "${ability_runtime_native_path}/ability/native:ability_business_error", "${ability_runtime_native_path}/ability/native:insight_intent_executor", "${ability_runtime_native_path}/appkit:app_context", + "${ability_runtime_native_path}/appkit:app_context_utils", "${ability_runtime_native_path}/insight_intent/insight_intent_context:insightintentcontext", "${ability_runtime_path}/frameworks/ets/ani/ani_common:ani_common", - "${ability_runtime_native_path}/appkit:app_context_utils", ] external_deps = [ "ability_base:configuration", "ability_base:want", "ability_base:zuri", + "bundle_framework:bms_ani_common", "c_utils:utils", "common_event_service:cesfwk_innerkits", "eventhandler:libeventhandler", @@ -1073,7 +1079,6 @@ ohos_shared_library("service_extension") { "runtime_core:ani", "safwk:system_ability_fwk", "samgr:samgr_proxy", - "bundle_framework:bms_ani_common", ] if (ability_runtime_graphics) { diff --git a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp index f333a2d17e0..af3ed371a87 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp @@ -683,6 +683,21 @@ void StsAbilityContext::NativeRequestModalUIExtension(ani_env *env, ani_object a AppExecFwk::AsyncCallback(env, callbackObj, errorObject, nullptr); } +void StsAbilityContext::ConfigurationUpdated(ani_env *env, std::shared_ptr &stsContext, + const std::shared_ptr &config) +{ + if (env == nullptr || stsContext == nullptr || config == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "env or stsContext or config is null"); + return; + } + ani_ref configurationRef = OHOS::AppExecFwk::WrapConfiguration(env, *config); + ani_status status = env->Object_SetFieldByName_Ref(stsContext->aniObj, "config", configurationRef); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "Object_SetFieldByName_Ref status: %{public}d", status); + return; + } +} + bool BindNativeMethods(ani_env *env, ani_class &cls) { ani_status status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls); diff --git a/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp b/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp index 441fb597b50..6d724d3c60d 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp @@ -14,6 +14,7 @@ */ #include "sts_ui_ability.h" + #include #include #include @@ -23,6 +24,9 @@ #include "ability_manager_client.h" #include "ability_recovery.h" #include "ability_start_setting.h" +#include "ani_common_configuration.h" +#include "ani_common_want.h" +#include "ani_enum_convert.h" #include "ani_remote_object.h" #include "app_recovery.h" #include "connection_manager.h" @@ -32,22 +36,21 @@ #include "hilog_tag_wrapper.h" #include "hitrace_meter.h" #include "if_system_ability_manager.h" +#include "insight_intent_execute_param.h" #include "insight_intent_executor_info.h" #include "insight_intent_executor_mgr.h" -#include "insight_intent_execute_param.h" #include "ohos_application.h" +#include "string_wrapper.h" #include "sts_ability_context.h" #include "sts_caller_complex.h" #include "sts_data_struct_converter.h" +#include "system_ability_definition.h" +#include "time_util.h" #ifdef SUPPORT_SCREEN #include "ani_window_stage.h" #include "distributed_client.h" #include "scene_board_judgement.h" #endif -#include "ani_common_want.h" -#include "string_wrapper.h" -#include "system_ability_definition.h" -#include "time_util.h" namespace OHOS { namespace AbilityRuntime { @@ -78,6 +81,7 @@ constexpr const int32_t API12 = 12; constexpr const int32_t API_VERSION_MOD = 100; constexpr const char* UI_ABILITY_CONTEXT_CLASS_NAME = "Lapplication/UIAbilityContext/UIAbilityContext;"; constexpr const char* UI_ABILITY_CLASS_NAME = "L@ohos/app/ability/UIAbility/UIAbility;"; +constexpr const char* MEMORY_LEVEL_ENUM_NAME = "L@ohos/app/ability/AbilityConstant/AbilityConstant/MemoryLevel;"; void OnDestroyPromiseCallback(ani_env* env, ani_object aniObj) { @@ -1142,37 +1146,71 @@ void StsUIAbility::OnConfigurationUpdated(const Configuration &configuration) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); UIAbility::OnConfigurationUpdated(configuration); - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::UIABILITY, "OnConfigurationUpdated called"); if (abilityContext_ == nullptr) { TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext"); return; } + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "env null"); + return; + } + auto abilityConfig = abilityContext_->GetAbilityConfiguration(); auto fullConfig = abilityContext_->GetConfiguration(); if (fullConfig == nullptr) { TAG_LOGE(AAFwkTag::UIABILITY, "null fullConfig"); return; } - - TAG_LOGD(AAFwkTag::UIABILITY, "fullConfig: %{public}s", fullConfig->GetName().c_str()); + auto realConfig = AppExecFwk::Configuration(*fullConfig); + if (abilityConfig != nullptr) { + std::vector changeKeyV; + realConfig.CompareDifferent(changeKeyV, *abilityConfig); + if (!changeKeyV.empty()) { + realConfig.Merge(changeKeyV, *abilityConfig); + } + } + TAG_LOGD(AAFwkTag::UIABILITY, "realConfig: %{public}s", realConfig.GetName().c_str()); + ani_object aniConfiguration = OHOS::AppExecFwk::WrapConfiguration(env, realConfig); + CallObjectMethod(false, "onConfigurationUpdate", nullptr, aniConfiguration); + auto realConfigPtr = std::make_shared(realConfig); + StsAbilityContext::ConfigurationUpdated(env, shellContextRef_, realConfigPtr); } void StsUIAbility::OnMemoryLevel(int level) { UIAbility::OnMemoryLevel(level); - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::UIABILITY, "OnMemoryLevel called"); if (stsAbilityObj_ == nullptr) { TAG_LOGE(AAFwkTag::UIABILITY, "null stsAbilityObj_"); return; } + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + return; + } + ani_enum_item levelEnum {}; + if (!OHOS::AAFwk::AniEnumConvertUtil::EnumConvertNativeToSts(env, MEMORY_LEVEL_ENUM_NAME, level, levelEnum)) { + TAG_LOGE(AAFwkTag::UIABILITY, "levelEnum NativeToSts failed"); + return; + } + CallObjectMethod(false, "onMemoryLevel", nullptr, levelEnum); } void StsUIAbility::UpdateContextConfiguration() { - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::UIABILITY, "UpdateContextConfiguration called"); if (abilityContext_ == nullptr) { TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext_"); return; } + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + return; + } + StsAbilityContext::ConfigurationUpdated(env, shellContextRef_, abilityContext_->GetConfiguration()); } void StsUIAbility::OnNewWant(const Want &want) diff --git a/frameworks/native/ability/native/ets_extension_common.cpp b/frameworks/native/ability/native/ets_extension_common.cpp new file mode 100644 index 00000000000..2e5a0b4d08b --- /dev/null +++ b/frameworks/native/ability/native/ets_extension_common.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ets_extension_common.h" + +#include "ani_common_configuration.h" +#include "ani_enum_convert.h" +#include "ets_extension_context.h" +#include "hilog_tag_wrapper.h" +#include "sts_runtime.h" + +namespace OHOS { +namespace AbilityRuntime { +namespace { +constexpr const char *MEMORY_LEVEL_ENUM_NAME = "L@ohos/app/ability/AbilityConstant/AbilityConstant/MemoryLevel;"; +} + +using namespace OHOS::AppExecFwk; + +std::shared_ptr EtsExtensionCommon::Create( + STSRuntime &stsRuntime, STSNativeReference &stsObj, const std::shared_ptr &shellContextRef) +{ + return std::make_shared(stsRuntime, stsObj, shellContextRef); +} + +EtsExtensionCommon::EtsExtensionCommon( + STSRuntime &stsRuntime, STSNativeReference &stsObj, const std::shared_ptr &shellContextRef) + : stsRuntime_(stsRuntime), stsObj_(stsObj), shellContextRef_(shellContextRef) +{} + +EtsExtensionCommon::~EtsExtensionCommon() {} + +void EtsExtensionCommon::OnConfigurationUpdated(const std::shared_ptr &fullConfig) +{ + TAG_LOGD(AAFwkTag::EXT, "OnConfigurationUpdated called"); + if (!fullConfig) { + TAG_LOGE(AAFwkTag::EXT, "invalid config"); + return; + } + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::EXT, "env null"); + return; + } + if (shellContextRef_ == nullptr) { + TAG_LOGE(AAFwkTag::EXT, "shellContextRef_ null"); + return; + } + EtsExtensionContext::ConfigurationUpdated(env, shellContextRef_, fullConfig); + + ani_object aniConfiguration = OHOS::AppExecFwk::WrapConfiguration(env, *fullConfig); + CallObjectMethod("onConfigurationUpdate", nullptr, aniConfiguration); +} + +void EtsExtensionCommon::OnMemoryLevel(int level) +{ + TAG_LOGD(AAFwkTag::EXT, "OnMemoryLevel called"); + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::EXT, "env null"); + return; + } + + ani_enum_item levelEnum {}; + if (!OHOS::AAFwk::AniEnumConvertUtil::EnumConvertNativeToSts(env, MEMORY_LEVEL_ENUM_NAME, level, levelEnum)) { + TAG_LOGE(AAFwkTag::EXT, "levelEnum failed"); + return; + } + CallObjectMethod("onMemoryLevel", nullptr, levelEnum); +} + +void EtsExtensionCommon::CallObjectMethod(const char *name, const char *signature, ...) +{ + TAG_LOGD(AAFwkTag::EXT, "name: %{public}s", name); + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::EXT, "null env"); + return; + } + ani_method method {}; + ani_status status = env->Class_FindMethod(stsObj_.aniCls, name, signature, &method); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::EXT, "Class_FindMethod status: %{public}d", status); + env->ResetError(); + return; + } + va_list args; + va_start(args, signature); + if ((status = env->Object_CallMethod_Void_V(stsObj_.aniObj, method, args)) != ANI_OK) { + TAG_LOGE(AAFwkTag::EXT, "Object_CallMethod_Void_V status: %{public}d", status); + stsRuntime_.HandleUncaughtError(); + return; + } + va_end(args); + TAG_LOGI(AAFwkTag::EXT, "CallObjectMethod end, name: %{public}s", name); +} +} // namespace AbilityRuntime +} // namespace OHOS diff --git a/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h b/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h index eccb984ecbe..199c7cdb7fe 100644 --- a/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h +++ b/interfaces/kits/native/ability/ability_runtime/ets_extension_context.h @@ -15,12 +15,19 @@ #ifndef OHOS_ABILITY_RUNTIME_STS_EXTENSION_CONTEXT_H #define OHOS_ABILITY_RUNTIME_STS_EXTENSION_CONTEXT_H - -#include "extension_context.h" + #include "ani.h" +#include "extension_context.h" namespace OHOS { namespace AbilityRuntime { +struct STSNativeReference; +class EtsExtensionContext final { +public: + static void ConfigurationUpdated(ani_env *env, const std::shared_ptr &stsContext, + const std::shared_ptr &config); +}; + void CreatEtsExtensionContext(ani_env* aniEnv, ani_class contextClass, ani_object contextObj, std::shared_ptr context, std::shared_ptr abilityInfo); diff --git a/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h b/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h index 0ea60e801b7..662de96d658 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h +++ b/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h @@ -68,6 +68,9 @@ public: static void NativeRequestModalUIExtension(ani_env *env, ani_object aniObj, ani_string pickerWantObj, ani_object callBackObj); + static void ConfigurationUpdated(ani_env *env, std::shared_ptr &stsContext, + const std::shared_ptr &config); + private: static void InheritWindowMode(ani_env *env, ani_object aniObj, AAFwk::Want &want); void StartAbilityInner([[maybe_unused]] ani_env *env, [[maybe_unused]] ani_object aniObj, diff --git a/interfaces/kits/native/ability/native/ets_extension_common.h b/interfaces/kits/native/ability/native/ets_extension_common.h new file mode 100644 index 00000000000..b3c2eaa1331 --- /dev/null +++ b/interfaces/kits/native/ability/native/ets_extension_common.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_ABILITY_RUNTIME_ETS_EXTENSION_COMMON_H +#define OHOS_ABILITY_RUNTIME_ETS_EXTENSION_COMMON_H + +#include "configuration.h" +#include "service_extension.h" + +namespace OHOS { +namespace AbilityRuntime { +struct STSNativeReference; +class ServiceExtension; +class STSRuntime; +/** + * @brief Basic ets extension common components. + */ +class EtsExtensionCommon : public ExtensionCommon, + public std::enable_shared_from_this { +public: + EtsExtensionCommon(STSRuntime &stsRuntime, STSNativeReference &stsObj, + const std::shared_ptr &shellContextRef); + + virtual ~EtsExtensionCommon() override; + + /** + * @brief Create JsServiceExtension. + * + * @param stsRuntime The runtime. + * @param etsObj The ets object instance. + * @return The JsServiceExtension instance. + */ + static std::shared_ptr Create(STSRuntime &stsRuntime, STSNativeReference &stsObj, + const std::shared_ptr &shellContextRef); + + /** + * @brief Called when the system configuration is updated. + * + * @param configuration Indicates the updated configuration information. + */ + void OnConfigurationUpdated(const std::shared_ptr &fullConfig) override; + + /** + * @brief Notify current memory level. + * + * @param level Current memory level. + */ + void OnMemoryLevel(int level) override; + +private: + void CallObjectMethod(const char *name, const char *signature, ...); + +private: + STSRuntime& stsRuntime_; + STSNativeReference& stsObj_; + std::shared_ptr shellContextRef_ = nullptr; +}; +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_ETS_EXTENSION_COMMON_H -- Gitee