diff --git a/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp b/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp index 6fc4759141121029404339eb3c759d5c4f8fd996..42717b576c7abe4f944b79b6a5ed39270b7a0e7c 100644 --- a/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp +++ b/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp @@ -47,6 +47,7 @@ constexpr int32_t ERR_FAILURE = -1; class EtsAbilityManager final { public: static ani_object GetForegroundUIAbilities(ani_env *env); + static void GetForegroundUIAbilitiesCallBack(ani_env *env, ani_object callbackObj); static void GetTopAbility(ani_env *env, ani_object callback); static void GetAbilityRunningInfos(ani_env *env, ani_object callback); static void IsEmbeddedOpenAllowed(ani_env *env, ani_object contextObj, ani_string aniAppId, ani_object callbackObj); @@ -109,6 +110,38 @@ ani_object EtsAbilityManager::GetForegroundUIAbilities(ani_env *env) return aniArray; } +void EtsAbilityManager::GetForegroundUIAbilitiesCallBack(ani_env *env, ani_object callbackObj) +{ + TAG_LOGD(AAFwkTag::ABILITYMGR, "call GetForegroundUIAbilitiesCallBack"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null env"); + return; + } + + sptr abilityManager = GetAbilityManagerInstance(); + if (abilityManager == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityManager is null"); + AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER); + return; + } + std::vector list; + int32_t ret = abilityManager->GetForegroundUIAbilities(list); + if (ret != ERR_OK) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "failed: ret=%{public}d", ret); + AbilityRuntime::AbilityErrorCode code = AbilityRuntime::GetJsErrorCodeByNativeError(ret); + AbilityRuntime::EtsErrorUtil::ThrowError(env, code); + return; + } + TAG_LOGD(AAFwkTag::ABILITYMGR, "GetForegroundUIAbilities succeeds, list.size=%{public}zu", list.size()); + ani_object aniArray = AppExecFwk::CreateAniAbilityStateDataArray(env, list); + if (aniArray == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null aniArray"); + AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER); + return; + } + AppExecFwk::AsyncCallback(env, callbackObj, EtsErrorUtil::CreateErrorByNativeErr(env, ERR_OK), aniArray); +} + void EtsAbilityManager::GetTopAbility(ani_env *env, ani_object callback) { TAG_LOGD(AAFwkTag::ABILITYMGR, "call GetTopAbility"); @@ -295,6 +328,10 @@ void EtsAbilityManagerRegistryInit(ani_env *env) "nativeGetForegroundUIAbilities", ETS_ABILITY_MANAGER_SIGNATURE_ARRAY, reinterpret_cast(EtsAbilityManager::GetForegroundUIAbilities) }, + ani_native_function { + "getForegroundUIAbilitiesCallback", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsAbilityManager::GetForegroundUIAbilitiesCallBack) + }, ani_native_function {"nativeGetTopAbility", ETS_ABILITY_MANAGER_SIGNATURE_CALLBACK, reinterpret_cast(EtsAbilityManager::GetTopAbility)}, ani_native_function { "nativeGetAbilityRunningInfos", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", diff --git a/frameworks/ets/ani/ani_common/src/ani_common_remote.cpp b/frameworks/ets/ani/ani_common/src/ani_common_remote.cpp index f74600380b2d68ca5ee3d2364a5600f9ce27a8ff..e78b9a839a19887a87d085f7858149459d2b49c4 100644 --- a/frameworks/ets/ani/ani_common/src/ani_common_remote.cpp +++ b/frameworks/ets/ani/ani_common/src/ani_common_remote.cpp @@ -28,7 +28,7 @@ ani_object AniRemote::CreateAniRemoteObject(ani_env *env, const sptrClass_FindMethod(cls, "", "l:", &method)) != ANI_OK) { + if ((status = env->Class_FindMethod(cls, "", ":V", &method)) != ANI_OK) { TAG_LOGE(AAFwkTag::ABILITY, "RemoteProxy ctor: %{public}d", status); return nullptr; } diff --git a/frameworks/ets/ani/service_extension_ability/src/ets_service_extension.cpp b/frameworks/ets/ani/service_extension_ability/src/ets_service_extension.cpp index 0e73682a183c8faf144fcd11e577f30344ec0174..c5e26b60281f1aa4d36b0ae67311f08766869379 100644 --- a/frameworks/ets/ani/service_extension_ability/src/ets_service_extension.cpp +++ b/frameworks/ets/ani/service_extension_ability/src/ets_service_extension.cpp @@ -50,7 +50,7 @@ constexpr const char *ON_CREATE_SIGNATURE = "L@ohos/app/ability/Want/Want;:V"; constexpr const char *VOID_SIGNATURE = ":V"; constexpr const char *CHECK_PROMISE_SIGNATURE = "Lstd/core/Object;:Z"; constexpr const char *CALL_PROMISE_SIGNATURE = "Lstd/core/Promise;:Z"; -constexpr const char *ON_DISCONNECT_SIGNATURE = "L@ohos/app/ability/Want/Want;:V"; +constexpr const char *ON_DISCONNECT_SIGNATURE = "L@ohos/app/ability/Want/Want;:Z"; constexpr const char *ON_REQUEST_SIGNATURE = "L@ohos/app/ability/Want/Want;I:V"; constexpr const char *ON_CONFIGURATION_UPDATE_SIGNATURE = "L@ohos/app/ability/Configuration/Configuration;:V"; constexpr const char *ON_DUMP_SIGNATURE = "Lescompat/Array;:Lescompat/Array;"; @@ -320,7 +320,7 @@ void EtsServiceExtension::OnDisconnect( HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::SERVICE_EXT, "OnDisconnect"); auto env = etsRuntime_.GetAniEnv(); - if (env) { + if (env == nullptr) { TAG_LOGE(AAFwkTag::SERVICE_EXT, "null env"); return; } @@ -350,8 +350,17 @@ void EtsServiceExtension::OnDisconnect( TAG_LOGE(AAFwkTag::SERVICE_EXT, "status : %{public}d", status); return; } + ani_method method {}; + if ((status = env->Class_FindMethod(etsObj_->aniCls, "callOnDisconnect", ON_DISCONNECT_SIGNATURE, &method)) + != ANI_OK || method == nullptr) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "status : %{public}d", status); + return; + } ani_boolean callResult = ANI_FALSE; - CallObjectMethod(true, "callOnDisconnect", ON_DISCONNECT_SIGNATURE, &callResult, wantRef); + if ((status = env->Object_CallMethod_Boolean(etsObj_->aniObj, method, &callResult, wantRef)) != ANI_OK) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "status : %{public}d", status); + return; + } isAsyncCallback = callResult; } diff --git a/frameworks/ets/ani/service_extension_ability/src/ets_service_extension_context.cpp b/frameworks/ets/ani/service_extension_ability/src/ets_service_extension_context.cpp index 05fe8a0f6371022e20f868c40fc7e386ee189c83..bbda8657de3734a3b3c6d4039cc6f4a4fdd7c7c0 100644 --- a/frameworks/ets/ani/service_extension_ability/src/ets_service_extension_context.cpp +++ b/frameworks/ets/ani/service_extension_ability/src/ets_service_extension_context.cpp @@ -80,7 +80,8 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) std::array CleanerMethods = { ani_native_function { "clean", nullptr, reinterpret_cast(EtsServiceExtensionContext::Finalizer) }, }; - if ((status = env->Class_BindNativeMethods(cleanerCls, CleanerMethods.data(), CleanerMethods.size())) != ANI_OK) { + if ((status = env->Class_BindNativeMethods(cleanerCls, CleanerMethods.data(), CleanerMethods.size())) != ANI_OK + && status != ANI_ALREADY_BINDED) { TAG_LOGE(AAFwkTag::UI_EXT, "bind method status : %{public}d", status); return false; } diff --git a/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets b/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets index 6d653337ba12c9945a1f267aa00104c516d0b6af..a9b7acbafd8908353cf6034657d943c9a14f1eba 100644 --- a/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets +++ b/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets @@ -49,11 +49,13 @@ export default namespace abilityManager { return p; } - export function getForegroundUIAbilities(callback: AsyncCallback, void>): void { - let myCall = new AsyncCallbackWrapper>(callback); - taskpool.execute((): void => { - abilityManager.getForegroundUIAbilitiesCallback(myCall); - }) + export function getForegroundUIAbilities(callback: AsyncCallback>): void { + let myCall = new AsyncCallbackWrapper>(callback); + taskpool.execute((): void => { + abilityManager.getForegroundUIAbilitiesCallback(myCall); + }).catch((err: BusinessError): void => { + callback(err, undefined); + }); } export function getTopAbility():Promise {