diff --git a/frameworks/ets/ani/ani_common/include/ani_common_util.h b/frameworks/ets/ani/ani_common/include/ani_common_util.h index 6c04d37037f6b7c4338430d87cd4c7c01351f2b2..b04d07660a1615d0a7995f550777906466351c8b 100644 --- a/frameworks/ets/ani/ani_common/include/ani_common_util.h +++ b/frameworks/ets/ani/ani_common/include/ani_common_util.h @@ -67,6 +67,7 @@ bool SetStringArrayProperty(ani_env *env, ani_object param, const char *name, co bool SetRefProperty(ani_env *env, ani_object param, const char *name, ani_ref value); bool WrapArrayString(ani_env *env, ani_object &arrayObj, const std::vector &values); bool UnwrapArrayString(ani_env *env, const ani_object &arrayObj, std::vector &stringList); +ani_object CreateEmptyArray(ani_env *env); } // namespace AppExecFwk } // namespace OHOS #endif // OHOS_ABILITY_RUNTIME_ANI_COMMON_UTIL_H diff --git a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp index 51a122518bdf0626fac292fc512aa93f15c41b06..47970276c6641b2f23fd2073e1fad999ddd4df31 100644 --- a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp +++ b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp @@ -1021,5 +1021,33 @@ bool UnwrapArrayString(ani_env *env, const ani_object &arrayObj, std::vectorFindClass("Lescompat/Array;", &arrayCls); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::JSNAPI, "FindClass failed status: %{public}d", status); + return nullptr; + } + ani_method arrayCtor; + status = env->Class_FindMethod(arrayCls, "", ":V", &arrayCtor); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::JSNAPI, "find ctor failed status: %{public}d", status); + return nullptr; + } + ani_object arrayObj; + status = env->Object_New(arrayCls, arrayCtor, &arrayObj); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::JSNAPI, "Object_New array failed status: %{public}d", status); + return nullptr; + } + return arrayObj; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/frameworks/ets/ets/application/ApplicationContext.ets b/frameworks/ets/ets/application/ApplicationContext.ets index cdba8ab952af261866576c8c18455972a99dde0c..9c090765425a1b75cb09fc753d334956f285ee03 100644 --- a/frameworks/ets/ets/application/ApplicationContext.ets +++ b/frameworks/ets/ets/application/ApplicationContext.ets @@ -42,6 +42,7 @@ export default class ApplicationContext extends Context { public native nativesetColorMode(colorMode: ConfigurationConstant.ColorMode): void; public native nativesetFont(font: string): void; public native nativerestartApp(want: Want): void; + public native nativeGetAllRunningInstanceKeys(callback: AsyncCallbackWrapper>): void; public native nativeOnApplicationStateChangeSync(callback: ApplicationStateChangeCallback): void; public native nativeOffApplicationStateChangeSync(callback?: ApplicationStateChangeCallback): void; public native nativegetCurrentAppCloneIndex(): number; @@ -173,6 +174,24 @@ export default class ApplicationContext extends Context { }); return p; } + + getAllRunningInstanceKeys(): Promise> { + let p = new Promise>((resolve: (data: Array) => void, + reject: (err: BusinessError) => void): void => { + let myCall = new AsyncCallbackWrapper>((err: BusinessError, + data: Array) => { + if (err.code == 0) { + resolve(data); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + this.nativeGetAllRunningInstanceKeys(myCall); + }); + }); + return p; + } clearUpApplicationData(callback: AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); diff --git a/frameworks/native/appkit/ability_runtime/context/ets_application_context_utils.cpp b/frameworks/native/appkit/ability_runtime/context/ets_application_context_utils.cpp index 89b5761d84df1df0b77e4978c5fab0924488f6b2..343b94b8c0250f00e296dc56dc8cafe839a1517c 100644 --- a/frameworks/native/appkit/ability_runtime/context/ets_application_context_utils.cpp +++ b/frameworks/native/appkit/ability_runtime/context/ets_application_context_utils.cpp @@ -453,6 +453,40 @@ ani_string EtsApplicationContextUtils::GetCurrentInstanceKey([[maybe_unused]]ani return aniStr; } +void EtsApplicationContextUtils::GetAllRunningInstanceKeys([[maybe_unused]]ani_env *env, + [[maybe_unused]]ani_object aniObj, ani_object callback) +{ + TAG_LOGD(AAFwkTag::APPKIT, "GetAllRunningInstanceKeys Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env"); + return; + } + ani_object emptyArray = AppExecFwk::CreateEmptyArray(env); + std::vector instanceKeys; + auto applicationContext = applicationContext_.lock(); + if (!applicationContext) { + TAG_LOGE(AAFwkTag::APPKIT, "null context"); + AppExecFwk::AsyncCallback(env, callback, CreateStsError(env, + AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT), emptyArray); + return; + } + if (applicationContext->GetCurrentAppMode() != static_cast(AppExecFwk::MultiAppModeType::MULTI_INSTANCE)) { + TAG_LOGE(AAFwkTag::APPKIT, "not supported"); + AppExecFwk::AsyncCallback(env, callback, CreateStsErrorByNativeErr(env, + AAFwk::ERR_MULTI_INSTANCE_NOT_SUPPORTED), emptyArray); + return; + } + ErrCode innerErrCode = applicationContext->GetAllRunningInstanceKeys(instanceKeys); + if (innerErrCode != ERR_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "innerErrCode=%{public}d", innerErrCode); + AppExecFwk::AsyncCallback(env, callback, CreateStsErrorByNativeErr(env, (int32_t)innerErrCode), emptyArray); + return; + } + ani_object stringArray; + AppExecFwk::WrapArrayString(env, stringArray, instanceKeys); + AppExecFwk::AsyncCallback(env, callback, CreateStsError(env, AbilityErrorCode::ERROR_OK), stringArray); +} + void EtsApplicationContextUtils::BindApplicationContextFunc(ani_env* aniEnv, ani_class& contextClass) { if (aniEnv == nullptr) { @@ -490,6 +524,8 @@ void EtsApplicationContextUtils::BindApplicationContextFunc(ani_env* aniEnv, ani reinterpret_cast(EtsApplicationContextUtils::SetFont)}, ani_native_function {"nativerestartApp", "L@ohos/app/ability/Want/Want;:V", reinterpret_cast(EtsApplicationContextUtils::RestartApp)}, + ani_native_function {"nativeGetAllRunningInstanceKeys", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsApplicationContextUtils::GetAllRunningInstanceKeys)}, ani_native_function {"nativeOnApplicationStateChangeSync", "L@ohos/app/ability/ApplicationStateChangeCallback/ApplicationStateChangeCallback;:V", reinterpret_cast(EtsApplicationContextUtils::NativeOnApplicationStateChangeSync)}, diff --git a/interfaces/kits/native/appkit/ability_runtime/context/ets_application_context_utils.h b/interfaces/kits/native/appkit/ability_runtime/context/ets_application_context_utils.h index 89422eeafc7238e025170028546a355a1eba9438..977c852beef3b6b79c40869efe1e2a4db8a8efe8 100644 --- a/interfaces/kits/native/appkit/ability_runtime/context/ets_application_context_utils.h +++ b/interfaces/kits/native/appkit/ability_runtime/context/ets_application_context_utils.h @@ -51,6 +51,8 @@ public: ani_object callback); static void GetRunningProcessInformation([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, ani_object callback); + static void GetAllRunningInstanceKeys([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, + ani_object callback); static ani_double NativeOnSync([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, ani_string type, ani_object envCallback); static void NativeOffSync([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj,