From 120190a2f70f3079ad3ee472b5c04f76ee2ec850 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Tue, 1 Jul 2025 21:15:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0setAbilityInstanceInfo?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzezhong --- .../ets/ets/application/UIAbilityContext.ets | 18 +++++++ frameworks/native/ability/native/BUILD.gn | 2 + .../ability_runtime/sts_ability_context.cpp | 50 +++++++++++++++++++ .../ability_runtime/sts_ability_context.h | 5 +- 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/frameworks/ets/ets/application/UIAbilityContext.ets b/frameworks/ets/ets/application/UIAbilityContext.ets index 6cd38d8892b..4090670e314 100644 --- a/frameworks/ets/ets/application/UIAbilityContext.ets +++ b/frameworks/ets/ets/application/UIAbilityContext.ets @@ -27,6 +27,7 @@ import { HapModuleInfo } from 'bundleManager.HapModuleInfo'; import AsyncCallbackWrapper from '../utils/AbilityUtils'; import OpenLinkOptions from '@ohos.app.ability.OpenLinkOptions'; import { LocalStorage } from '@ohos.arkui.stateManagement'; +import image from '@ohos.multimedia.image'; // remove local declaration after Any type is supported type Any = Object | null | undefined @@ -74,6 +75,7 @@ export default class UIAbilityContext extends Context { private native nativeIsTerminating(): boolean; private native nativeMoveAbilityToBackground(callback: AsyncCallbackWrapper): void; private native nativeRequestModalUIExtension(pickerWant: Want, callback: AsyncCallbackWrapper): void; + private native nativeSetAbilityInstanceInfo(label: string, icon: image.PixelMap, callback: AsyncCallbackWrapper): void; startAbility(want: Want, callback: AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { @@ -342,4 +344,20 @@ export default class UIAbilityContext extends Context { }); }); } + + setAbilityInstanceInfo(label: string, icon: image.PixelMap): Promise { + let p:Promise = new Promise((resolve: (data:undefined)=>void, reject: (err: BusinessError)=>void):void => { + let syncCall = new AsyncCallbackWrapper((err: BusinessError | null)=>{ + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + this.nativeSetAbilityInstanceInfo(label, icon, syncCall); + }); + }); + return p; + } } diff --git a/frameworks/native/ability/native/BUILD.gn b/frameworks/native/ability/native/BUILD.gn index 29d0c9bd676..99178d6f0ca 100644 --- a/frameworks/native/ability/native/BUILD.gn +++ b/frameworks/native/ability/native/BUILD.gn @@ -358,6 +358,8 @@ ohos_shared_library("abilitykit_native") { "hilog:libhilog", "hisysevent:libhisysevent", "hitrace:hitrace_meter", + "image_framework:image", + "image_framework:image_taihe", "init:libbegetutil", "ipc:ipc_core", "ipc:ipc_napi", 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 724f7d86fd0..530c99382e4 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp @@ -51,6 +51,9 @@ #include "sts_caller_complex.h" #include "sts_context_utils.h" #include "sts_error_utils.h" +#ifdef SUPPORT_GRAPHICS +#include "pixel_map_taihe_ani.h" +#endif namespace OHOS { namespace AbilityRuntime { @@ -767,6 +770,48 @@ ani_object StsAbilityContext::NativeTransferDynamic(ani_env *env, ani_object, an return nullptr; } +#ifdef SUPPORT_SCREEN +void StsAbilityContext::SetAbilityInstanceInfo(ani_env *env, ani_object aniObj, ani_string labelObj, ani_object iconObj, + ani_object callback) +{ + TAG_LOGD(AAFwkTag::UIABILITY, "SetAbilityInstanceInfo called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + return; + } + + auto context = GetAbilityContext(env, aniObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + ThrowStsInvalidParamError(env, "context null"); + return; + } + + std::string label; + if (!AppExecFwk::GetStdString(env, labelObj, label)) { + TAG_LOGE(AAFwkTag::UIABILITY, "Failed to parse label"); + ThrowStsInvalidParamError(env, "Parse param label failed"); + return; + } + + auto icon = OHOS::Media::PixelMapTaiheAni::GetNativePixelMap(env, iconObj); + if (icon == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "Failed to unwrap PixelMap"); + ThrowStsInvalidParamError(env, "Parse param icon failed"); + return; + } + + ErrCode ret = context->SetAbilityInstanceInfo(label, icon); + ani_object errorObj = nullptr; + if (ret == ERR_OK) { + errorObj = CreateStsError(env, AbilityErrorCode::ERROR_OK); + } else { + errorObj = CreateStsErrorByNativeErr(env, static_cast(ret)); + } + AppExecFwk::AsyncCallback(env, callback, errorObj, nullptr); +} +#endif + bool BindNativeMethods(ani_env *env, ani_class &cls) { ani_status status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls); @@ -818,6 +863,11 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) reinterpret_cast(StsAbilityContext::NativeTransferStatic) }, ani_native_function { "nativeTransferDynamic", "Lstd/core/Object;:Lstd/interop/ESValue;", reinterpret_cast(StsAbilityContext::NativeTransferDynamic) }, +#ifdef SUPPORT_GRAPHICS + ani_native_function { "nativeSetAbilityInstanceInfo", + "Lstd/core/String;L@ohos/multimedia/image/image/PixelMap;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(StsAbilityContext::SetAbilityInstanceInfo) }, +#endif }; status = env->Class_BindNativeMethods(cls, functions.data(), functions.size()); }); 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 b174b1cfa60..219b5d08b3b 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 @@ -69,7 +69,10 @@ public: ani_object callBackObj); 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); - +#ifdef SUPPORT_GRAPHICS + static void SetAbilityInstanceInfo(ani_env *env, ani_object aniObj, ani_string labelObj, ani_object iconObj, + ani_object callback); +#endif 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