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 f7f60bee5b2ef9faeb337c577e66777c1b2ccbb9..ef880ed9801ab033c45e292814ab3795fc79b566 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 5aeb244521bedbc88f876202e0a39ad5ed1d5898..fe3dab1ad042a8a935d32eb426579e6b91d496b9 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 a7676468dcddd8df9546181a4b61d7dc09c7dc26..cdc88980dcadae9bafd9e99542a4b05cce29a72b 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; } }