From c34de461ea5d7e5c7c61d8d4c6d7daef35e410ca Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Tue, 3 Jun 2025 20:59:24 +0800 Subject: [PATCH] add ets UIAbility_onConfigurationUpdate_onMemoryLevel Signed-off-by: zhangzezhong --- .../ets/ets/@ohos.app.ability.UIAbility.ets | 3 +- frameworks/native/ability/native/BUILD.gn | 5 +- .../ability_runtime/sts_ability_context.cpp | 15 +++++ .../native/ability_runtime/sts_ui_ability.cpp | 61 +++++++++++++++---- .../ability_runtime/sts_ability_context.h | 3 + 5 files changed, 73 insertions(+), 14 deletions(-) diff --git a/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets b/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets index 783667f4e87..082a598876b 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'; @@ -36,7 +37,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; diff --git a/frameworks/native/ability/native/BUILD.gn b/frameworks/native/ability/native/BUILD.gn index 87ec0335ef4..bf6817beceb 100644 --- a/frameworks/native/ability/native/BUILD.gn +++ b/frameworks/native/ability/native/BUILD.gn @@ -746,6 +746,7 @@ 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", @@ -1057,15 +1058,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", @@ -1078,7 +1080,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 cfe387fe175..2d94d9f5b56 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp @@ -789,6 +789,21 @@ ani_object StsAbilityContext::NativeTransferDynamic(ani_env *env, ani_object, an return 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::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; + } +} + 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 02adb10508c..d14feee86a7 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) { @@ -1141,37 +1145,72 @@ 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, "onConfigurationUpdated", nullptr, aniConfiguration); + 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) @@ -1288,9 +1327,9 @@ bool StsUIAbility::CallObjectMethod(bool withResult, const char *name, const cha ani_method method {}; if ((status = env->Class_FindMethod(cls, name, signature, &method)) != ANI_OK) { TAG_LOGE(AAFwkTag::UIABILITY, "status : %{public}d", status); + env->ResetError(); return false; } - env->ResetError(); if (withResult) { ani_boolean res = false; va_list args; 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 affb3fed16e..73b63fc3cfc 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 @@ -71,6 +71,9 @@ public: static ani_object NativeTransferStatic(ani_env *env, ani_object aniObj, ani_object input); static ani_object NativeTransferDynamic(ani_env *env, ani_object aniObj, ani_object input); + 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, -- Gitee