diff --git a/frameworks/ets/ani/ability_manager/include/ets_ability_manager_utils.h b/frameworks/ets/ani/ability_manager/include/ets_ability_manager_utils.h index a02473141222bf51d589285c3f6a63e0e0a9f4da..85fd508357a5c354c03c1d9117de240abeede719 100644 --- a/frameworks/ets/ani/ability_manager/include/ets_ability_manager_utils.h +++ b/frameworks/ets/ani/ability_manager/include/ets_ability_manager_utils.h @@ -35,6 +35,8 @@ bool WrapExtensionRunningInfo(ani_env *env, ani_object &infoObj, const AAFwk::Ex bool WrapExtensionRunningInfoInner( ani_env *env, ani_object &infoObj, const AAFwk::ExtensionRunningInfo &info, ani_class cls); bool WrapArrayString(ani_env *env, ani_object &arrayObj, const std::vector &values); +bool WrapExtensionRunningInfoArray( + ani_env *env, ani_object &arrayObj, const std::vector &infos); } // namespace AbilityManagerEts } // namespace OHOS #endif // OHOS_ABILITY_RUNTIME_ETS_ABILITY_MANAGER_UTILS_H 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 3a539fc486fc69845136699d037241e443dbf82c..9bc387246a6552f07f159a07d97a7d4bec4f9670 100644 --- a/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp +++ b/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp @@ -113,7 +113,7 @@ public: static void QueryAtomicServiceStartupRule(ani_env *env, ani_object contextObj, ani_string aniAppId, ani_object callbackObj); static void QueryAtomicServiceStartupRuleCheck(ani_env *env, ani_object contextObj); - + static void GetExtensionRunningInfos(ani_env *env, ani_int upperLimit, ani_object callback); private: static sptr GetAbilityManagerInstance(); static sptr GetAppManagerInstance(); @@ -651,6 +651,33 @@ void EtsAbilityManager::NativeUpdateConfiguration(ani_env *env, ani_object confi EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), nullptr); } +void EtsAbilityManager::GetExtensionRunningInfos(ani_env *env, ani_int upperLimit, ani_object callback) +{ + TAG_LOGD(AAFwkTag::ABILITYMGR, "call GetExtensionRunningInfos"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null env"); + return; + } + std::vector infos; + auto errcode = AAFwk::AbilityManagerClient::GetInstance()->GetExtensionRunningInfos(upperLimit, infos); + if (errcode != ERR_OK) { + AppExecFwk::AsyncCallback(env, callback, + EtsErrorUtil::CreateErrorByNativeErr(env, errcode), nullptr); + return; + } + + ani_object extensionArray = nullptr; + AbilityManagerEts::WrapExtensionRunningInfoArray(env, extensionArray, infos); + if (extensionArray == nullptr) { + AppExecFwk::AsyncCallback(env, callback, + EtsErrorUtil::CreateErrorByNativeErr(env, + static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INNER)), nullptr); + return; + } + AppExecFwk::AsyncCallback(env, callback, + EtsErrorUtil::CreateErrorByNativeErr(env, errcode), extensionArray); +} + void EtsAbilityManagerRegistryInit(ani_env *env) { TAG_LOGD(AAFwkTag::ABILITYMGR, "call EtsAbilityManagerRegistryInit"); @@ -681,6 +708,8 @@ void EtsAbilityManagerRegistryInit(ani_env *env) reinterpret_cast(EtsAbilityManager::GetTopAbility)}, ani_native_function { "nativeGetAbilityRunningInfos", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityManager::GetAbilityRunningInfos) }, + ani_native_function {"nativeGetExtensionRunningInfos", "ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsAbilityManager::GetExtensionRunningInfos)}, ani_native_function { "nativeIsEmbeddedOpenAllowed", "Lapplication/Context/Context;Lstd/core/String;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityManager::IsEmbeddedOpenAllowed) }, diff --git a/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp b/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp index 8d585f896d72cf83b272d2ee66ae43eb995185fd..6af6313bbff64448633536438a206baf5128fd42 100644 --- a/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp +++ b/frameworks/ets/ani/ability_manager/src/ets_ability_manager_utils.cpp @@ -27,7 +27,7 @@ constexpr const char *CLASSNAME_ABILITY_RRUNNINGINFO = "Lapplication/AbilityRunn constexpr const char *ABILITY_STATE_ENUM_NAME = "L@ohos/app/ability/abilityManager/abilityManager/AbilityState;"; constexpr const char *CLASSNAME_EXTENSION_RUNNINGINFO = "Lapplication/ExtensionRunningInfo/ExtensionRunningInfoInner;"; constexpr const char *EXTENSION_ABILITY_TYPE_ENUM_NAME - = "L@ohos/app/ability/abilityManager/abilityManager/ExtensionAbilityType;"; + = "L@ohos/bundle/bundleManager/bundleManager/ExtensionAbilityType;"; bool WrapAbilityRunningInfoArray( ani_env *env, ani_object &arrayObj, const std::vector &infos) @@ -205,6 +205,44 @@ bool WrapArrayString(ani_env *env, ani_object &arrayObj, const std::vector &infos) +{ + TAG_LOGD(AAFwkTag::ABILITYMGR, "WrapExtensionRunningInfoArray"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null env"); + return false; + } + ani_class arrayCls = nullptr; + ani_method arrayCtor = nullptr; + ani_status status = ANI_ERROR; + if ((status = env->FindClass(CLASSNAME_ARRAY, &arrayCls)) != ANI_OK || arrayCls == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "FindClass failed, status : %{public}d", status); + return false; + } + if ((status = env->Class_FindMethod(arrayCls, "", "I:V", &arrayCtor)) != ANI_OK || arrayCtor == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "Class_FindMethod failed, status : %{public}d", status); + return false; + } + if ((status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size())) != ANI_OK || arrayObj == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "Object_New failed, status : %{public}d", status); + return false; + } + for (size_t i = 0; i < infos.size(); i++) { + ani_object infoObj = nullptr; + if (!WrapExtensionRunningInfo(env, infoObj, infos[i])) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "WrapExtensionRunningInfo failed"); + return false; + } + status = env->Object_CallMethodByName_Void(arrayObj, "$_set", SET_OBJECT_VOID_SIGNATURE, i, infoObj); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "Object_CallMethodByName_Void failed, status : %{public}d", status); + return false; + } + } + return true; +} + bool WrapExtensionRunningInfo(ani_env *env, ani_object &infoObj, const AAFwk::ExtensionRunningInfo &info) { TAG_LOGD(AAFwkTag::ABILITYMGR, "WrapExtensionRunningInfo"); @@ -271,8 +309,10 @@ bool WrapExtensionRunningInfoInner( TAG_LOGE(AAFwkTag::ABILITYMGR, "set startTimee failed, status: %{public}d", status); return false; } - bool result = WrapArrayString(env, infoObj, info.clientPackage); - if (((status = env->Object_SetFieldByName_Boolean(infoObj, "clientPackage", result)) != ANI_OK)) { + ani_object stringArray = nullptr; + WrapArrayString(env, stringArray, info.clientPackage); + if (((status = env->Object_SetPropertyByName_Ref( + infoObj, "clientPackage", reinterpret_cast(stringArray))) != ANI_OK)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "set clientPackage failed, 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 650f11693f19e3f1ac213fd4efb87fef03f5747b..646d8c5652321e72341baa6a270f5e1328a91f85 100644 --- a/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets +++ b/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets @@ -18,6 +18,7 @@ import { ElementName } from 'bundleManager.ElementName' import { BusinessError, AsyncCallback } from '@ohos.base'; import AsyncCallbackWrapper from './utils/AbilityUtils'; import { AbilityRunningInfo as _AbilityRunningInfo } from 'application.AbilityRunningInfo'; +import { ExtensionRunningInfo } from 'application.ExtensionRunningInfo'; import _AbilityStateData from 'application.AbilityStateData'; import Context from 'application.Context'; import { Configuration } from '@ohos.app.ability.Configuration'; @@ -43,6 +44,8 @@ export default namespace abilityManager { export native function nativeUpdateConfiguration(config: Configuration, callback: AsyncCallbackWrapper): void; export native function nativeQueryAtomicServiceStartupRule(context: Context, appId: string, callback:AsyncCallbackWrapper) : void; export native function nativeQueryAtomicServiceStartupRuleCheck(context: Context): void; + export native function nativeGetExtensionRunningInfos(upperLimit:int, callback:AsyncCallbackWrapper>) : void; + export function getForegroundUIAbilities():Promise> { let p = new Promise>((resolve: (data: Array) => void, reject: (error: Error) => void): void => { let executeFunc = (): Array => { @@ -227,6 +230,31 @@ export default namespace abilityManager { }); } + export function getExtensionRunningInfos(upperLimit: int): Promise> { + let p = new Promise>((resolve: (data: Array)=>void, + reject:(err: BusinessError)=>void):void => { + let myCall = new AsyncCallbackWrapper>((err: BusinessError | null, + data: Array | undefined)=>{ + if (err == null || err.code == 0) { + resolve(data as Array); + } else { + reject(err); + } + }); + taskpool.execute(():void => { + abilityManager.nativeGetExtensionRunningInfos(upperLimit, myCall); + }); + }); + return p; + } + + export function getExtensionRunningInfos(upperLimit: int, callback: AsyncCallback>): void { + let myCall = new AsyncCallbackWrapper>(callback); + taskpool.execute( (): void => { + abilityManager.nativeGetExtensionRunningInfos(upperLimit, myCall); + }); + } + export enum AbilityState { INITIAL = 0, FOCUS = 2,