From 0fd7ce64b0e67de48fdf689a1dd67c11f26a70ee Mon Sep 17 00:00:00 2001 From: s30030188 Date: Mon, 23 Jun 2025 17:11:08 +0800 Subject: [PATCH] =?UTF-8?q?GetCurrentTopAbility=E5=AE=9E=E7=8E=B0=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=88=86=E6=94=AF=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: s30030188 --- .../include/ets_ability_delegator.h | 2 +- .../src/ets_ability_delegator.cpp | 24 ++++++++---- .../ets/ets/application/AbilityDelegator.ets | 39 +++++++------------ 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h b/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h index b53a5ae67ca..87b05936a13 100644 --- a/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h +++ b/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h @@ -90,7 +90,7 @@ public: static void StartAbility(ani_env* env, [[maybe_unused]]ani_object object, ani_object wantObj, ani_object callback); - static ani_ref GetCurrentTopAbility(ani_env* env); + static ani_ref GetCurrentTopAbility(ani_env* env, ani_object callback); private: [[maybe_unused]] void RetrieveStringFromAni(ani_env *env, ani_string string, std::string &resString); diff --git a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp index f63953f35ad..eb04415d8da 100644 --- a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp +++ b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp @@ -454,25 +454,33 @@ void EtsAbilityDelegator::StartAbility(ani_env* env, [[maybe_unused]]ani_object return; } -ani_ref EtsAbilityDelegator::GetCurrentTopAbility(ani_env* env) +ani_ref EtsAbilityDelegator::GetCurrentTopAbility(ani_env* env, ani_object callback) { TAG_LOGD(AAFwkTag::DELEGATOR, "called"); ani_object objValue = nullptr; auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator(AbilityRuntime::Runtime::Language::STS); + int32_t resultCode = 0; if (delegator != nullptr) { auto property = delegator->GetCurrentTopAbility(); auto etsbaseProperty = std::static_pointer_cast(property); if (!etsbaseProperty || etsbaseProperty->object_.expired()) { TAG_LOGE(AAFwkTag::DELEGATOR, "invalid property"); - return {}; + resultCode = COMMON_FAILED; + } else { + std::unique_lock lck(g_mutexAbilityRecord); + g_abilityRecord.emplace(etsbaseProperty->object_, etsbaseProperty->token_); + objValue = etsbaseProperty->object_.lock()->aniObj; } - std::unique_lock lck(g_mutexAbilityRecord); - g_abilityRecord.emplace(etsbaseProperty->object_, etsbaseProperty->token_); - return etsbaseProperty->object_.lock()->aniRef; - } else { - TAG_LOGE(AAFwkTag::DELEGATOR, "delegator is nullptr"); - return {}; } + ani_ref callbackRef = nullptr; + auto status = env->GlobalReference_Create(callback, &callbackRef); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::DELEGATOR, "Create Gloabl ref for delegator failed %{public}d", status); + AbilityRuntime::ThrowStsError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER); + return objValue; + } + AppExecFwk::AsyncCallback(env, reinterpret_cast(callbackRef), + OHOS::AbilityRuntime::CreateStsErrorByNativeErr(env, resultCode), objValue); return objValue; } diff --git a/frameworks/ets/ets/application/AbilityDelegator.ets b/frameworks/ets/ets/application/AbilityDelegator.ets index a7676468dcd..a10adc1e746 100644 --- a/frameworks/ets/ets/application/AbilityDelegator.ets +++ b/frameworks/ets/ets/application/AbilityDelegator.ets @@ -100,7 +100,7 @@ export interface AbilityDelegator { } class AbilityDelegatorInner implements AbilityDelegator { - public native nativeGetCurrentTopAbility(): UIAbility; + public native nativeGetCurrentTopAbility(callback: AsyncCallbackWrapper): UIAbility; public native printSync(msg: string): void; @@ -459,37 +459,26 @@ class AbilityDelegatorInner implements AbilityDelegator { } getCurrentTopAbility(callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); let p = taskpool.execute((): UIAbility => { - return this.nativeGetCurrentTopAbility() + this.nativeGetCurrentTopAbility(myCall) }); console.log("getCurrentTopAbility callback2_04"); - p.then((e: NullishType) => { - let ability = e as UIAbility; - let resultCode: Int = 0; - let error: BusinessError = { code: resultCode, data: undefined }; - callback(error, ability); - console.log("getCurrentTopAbility callback2_06"); - }).catch((err: Error): void => { - console.log("getCurrentTopAbility callback2_0606 err end"); - callback(err as BusinessError, {}); - }); } getCurrentTopAbility(): Promise { - let p: Promise = - new Promise((resolve: (v: UIAbility) => void, reject: (error: Error) => void) => { - console.log("getCurrentTopAbility promise1_01"); - let pPromise1 = taskpool.execute((): UIAbility => { - return this.nativeGetCurrentTopAbility(); - }); - pPromise1.then((e: NullishType) => { - console.log("getCurrentTopAbility promise1_04"); - let r: UIAbility = e as UIAbility; - resolve(r); - }).catch((err: Error): void => { + let p: Promise = new Promise((resolve: (v: UIAbility) => void, reject: (error: Error) => void) => { + console.log("getCurrentTopAbility promise1_01"); + let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: UIAbility | undefined) => { + if (err == null || err.code == 0) { + resolve(data as UIAbility); + } else { reject(err); - console.log("getCurrentTopAbility promise1 end"); - }); + } }); + taskpool.execute((): UIAbility => { + this.nativeGetCurrentTopAbility(myCall); + }); + }); return p; } } -- Gitee