From f1c620fe6512e991b797c4aa8bb2076cf22ae66b 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 | 30 ++++++++------ .../ets/ets/application/AbilityDelegator.ets | 41 +++++++------------ 3 files changed, 34 insertions(+), 39 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 f7f60bee5b2..ef880ed9801 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, [[maybe_unused]]ani_class aniClass, 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 5aeb244521b..fe3dab1ad04 100644 --- a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp +++ b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp @@ -47,11 +47,7 @@ enum ERROR_CODE { INCORRECT_PARAMETERS = 401, }; -#ifdef ENABLE_ERRCODE constexpr int COMMON_FAILED = 16000100; -#else -constexpr int COMMON_FAILED = -1; -#endif namespace { constexpr const char* CONTEXT_CLASS_NAME = "Lapplication/Context/Context;"; @@ -445,25 +441,35 @@ 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, [[maybe_unused]]ani_class aniClass, 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; + std::string resultMsg = ""; 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; + resultMsg = "Calling GetCurrentTopAbility 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::CreateStsError(env, resultCode, resultMsg), objValue); return objValue; } diff --git a/frameworks/ets/ets/application/AbilityDelegator.ets b/frameworks/ets/ets/application/AbilityDelegator.ets index a7676468dcd..cdc88980dca 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; @@ -458,38 +458,27 @@ class AbilityDelegatorInner implements AbilityDelegator { return p; } - getCurrentTopAbility(callback: AsyncCallback): void { + getCurrentTopAbility(callback: AsyncCallback): void { + let getCurrentTopAbilityCall = new AsyncCallbackWrapper(callback); let p = taskpool.execute((): UIAbility => { - return this.nativeGetCurrentTopAbility() + this.nativeGetCurrentTopAbility(getCurrentTopAbilityCall) }); 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 getCurrentTopAbilityCall = 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(getCurrentTopAbilityCall); + }); + }); return p; } } -- Gitee