diff --git a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension_content_session.h b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension_content_session.h index 99cac035eb583e31c271b533b487ef470982a6f1..c186c6a2d546e51d190eaf9c400b90d0497f2c7d 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension_content_session.h +++ b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension_content_session.h @@ -18,8 +18,9 @@ #include "session_info.h" #include "start_options.h" -#include "window.h" #include "sts_runtime.h" +#include "ui_extension_context.h" +#include "window.h" namespace OHOS { namespace AbilityRuntime { @@ -70,14 +71,14 @@ private: class CallbackWrapper; public: StsUIExtensionContentSession(sptr sessionInfo, - sptr uiWindow, std::weak_ptr& context, + sptr uiWindow, std::weak_ptr& context, std::shared_ptr& abilityResultListeners); StsUIExtensionContentSession(sptr sessionInfo, sptr uiWindow); virtual ~StsUIExtensionContentSession() = default; static ani_object CreateStsUIExtensionContentSession(ani_env* env, sptr sessionInfo, sptr uiWindow, - std::weak_ptr context, + std::weak_ptr context, std::shared_ptr& abilityResultListeners, std::shared_ptr contentSessionPtr); void SendData(ani_env* env, ani_object object, ani_object data); @@ -91,6 +92,7 @@ public: void SetReceiveDataForResultCallback(ani_env* env, ani_object object); static void CallReceiveDataCallbackForResult(ani_vm* vm, ani_ref callbackRef, const AAFwk::WantParams& wantParams, AAFwk::WantParams& retWantParams); + ani_object StartAbilityByTypeSync(ani_env *env, ani_string aniType, ani_ref aniWantParam, ani_object startCallback); private: bool SetReceiveDataCallbackUnRegist(ani_env* env, ani_object functionObj); @@ -98,7 +100,7 @@ private: sptr sessionInfo_; sptr uiWindow_; - std::weak_ptr context_; + std::weak_ptr context_; ani_ref receiveDataCallback_ = nullptr; bool isRegistered_ = false; ani_ref receiveDataForResultCallback_ = nullptr; diff --git a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp index c6edf16f575d5b1ced41e202e0b3e7f9841db854..42550e3528019ef19ab24e8eafb9779100f6ceb0 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp @@ -504,7 +504,7 @@ bool StsUIExtension::HandleSessionCreate(const AAFwk::Want &want, const sptrGlobalReference_Create(wantObj, &wantRef)) != ANI_OK) { TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); } - std::weak_ptr wkctx = context; + std::weak_ptr wkctx = context; stsUiExtContentSession_ = std::make_shared(sessionInfo, uiWindow, wkctx, abilityResultListeners_); ani_object sessonObj = StsUIExtensionContentSession::CreateStsUIExtensionContentSession(env, diff --git a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension_content_session.cpp b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension_content_session.cpp index 324463e6762b01696877b388f9ad174085eedda2..17b619e11da0f1be6076caa5af31fd4acc406fcc 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension_content_session.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension_content_session.cpp @@ -12,32 +12,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include + #include "sts_ui_extension_content_session.h" -#include "sts_ui_extension_context.h" -#include "hilog_tag_wrapper.h" -#ifdef SUPPORT_SCREEN -#include "ui_content.h" -#endif // SUPPORT_SCREEN -#include "want.h" -#include "window.h" -#include "ability_manager_client.h" -#include "ani_common_want.h" +#include + +#include "ability_manager_client.h" #include "ani_common_util.h" +#include "ani_common_want.h" #include "ani_extension_window.h" +#include "ets_ui_extension_callback.h" #include "hilog_tag_wrapper.h" #include "ipc_skeleton.h" #include "remote_object_wrapper.h" +#include "sts_error_utils.h" +#include "sts_ui_extension_context.h" #include "tokenid_kit.h" +#ifdef SUPPORT_SCREEN +#include "ui_content.h" +#endif // SUPPORT_SCREEN +#include "want.h" #include "want_params_wrapper.h" -#include "sts_error_utils.h" +#include "window.h" + namespace OHOS { namespace AbilityRuntime { namespace { constexpr const char* UI_SESSION_CLASS_NAME = "L@ohos/app/ability/UIExtensionContentSession/UIExtensionContentSession;"; -} +} // namespace StsUIExtensionContentSession* GetStsContentSession(ani_env* env, ani_object obj) { @@ -150,9 +153,24 @@ ani_object NativeGetUIExtensionHostWindowProxy(ani_env* env, ani_object obj) return object; } +static ani_object NativeStartAbilityByTypeSync( + ani_env *env, ani_object obj, ani_string type, ani_ref wantParam, ani_object startCallback) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); + return nullptr; + } + auto stsContentSession = GetStsContentSession(env, obj); + if (stsContentSession == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null stsContentSession"); + return nullptr; + } + return stsContentSession->StartAbilityByTypeSync(env, type, wantParam, startCallback); +} + StsUIExtensionContentSession::StsUIExtensionContentSession( sptr sessionInfo, sptr uiWindow, - std::weak_ptr &context, + std::weak_ptr &context, std::shared_ptr& abilityResultListeners) : sessionInfo_(sessionInfo), uiWindow_(uiWindow), context_(context) { @@ -171,7 +189,7 @@ StsUIExtensionContentSession::StsUIExtensionContentSession(sptr sessionInfo, sptr uiWindow, - std::weak_ptr context, + std::weak_ptr context, std::shared_ptr& abilityResultListeners, std::shared_ptr contentSessionPtr) { @@ -206,7 +224,9 @@ ani_object StsUIExtensionContentSession::CreateStsUIExtensionContentSession(ani_ ani_native_function {"nativeSetReceiveDataCallback", nullptr, reinterpret_cast(OHOS::AbilityRuntime::NativeSetReceiveDataCallback)}, ani_native_function {"nativeSetReceiveDataForResultCallback", nullptr, - reinterpret_cast(OHOS::AbilityRuntime::NativeSetReceiveDataForResultCallback)} + reinterpret_cast(OHOS::AbilityRuntime::NativeSetReceiveDataForResultCallback)}, + ani_native_function { "nativeStartAbilityByTypeSync", nullptr, + reinterpret_cast(OHOS::AbilityRuntime::NativeStartAbilityByTypeSync) } }; if ((status = env->Class_BindNativeMethods(cls, methods.data(), methods.size())) != ANI_OK) { TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); @@ -564,5 +584,47 @@ void StsUIExtensionContentSession::CallReceiveDataCallbackForResult(ani_vm* vm, } TAG_LOGD(AAFwkTag::UI_EXT, "CallReceiveDataCallbackForResult end"); } + +ani_object StsUIExtensionContentSession::StartAbilityByTypeSync( + ani_env *env, ani_string aniType, ani_ref aniWantParam, ani_object startCallback) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "StartAbilityByTypeSync call"); + ani_object aniObject = CreateStsError(env, AbilityErrorCode::ERROR_OK); + std::string type; + if (!AppExecFwk::GetStdString(env, aniType, type)) { + TAG_LOGE(AAFwkTag::UI_EXT, "parse type failed"); + ThrowStsInvalidParamError(env, "Parse param type failed, type must be string."); + return aniObject; + } + + AAFwk::WantParams wantParam; + if (!AppExecFwk::UnwrapWantParams(env, aniWantParam, wantParam)) { + TAG_LOGE(AAFwkTag::UI_EXT, "parse wantParam failed"); + ThrowStsInvalidParamError(env, "Parse param want failed, want must be Want."); + return aniObject; + } + + ani_vm *vm = nullptr; + if (env->GetVM(&vm) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "get vm failed"); + ThrowStsInvalidParamError(env, "Get vm failed."); + return aniObject; + } + ErrCode innerErrCode = ERR_OK; + std::shared_ptr callback = std::make_shared(vm); + callback->SetEtsCallbackObject(startCallback); + auto context = context_.lock(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); + return CreateStsError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } +#ifdef SUPPORT_SCREEN + innerErrCode = context->StartAbilityByType(type, wantParam, callback); +#endif + if (innerErrCode != ERR_OK) { + return CreateStsErrorByNativeErr(env, innerErrCode); + } + return aniObject; +} } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets index 64066274f0fc4b10972509ef3686851fea241597..0bd7eb6d118126d3ff2a10aecfb4ae576a3f8269 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets @@ -19,6 +19,8 @@ import { BusinessError } from '@ohos.base'; import uiExtensionHost from '@ohos.uiExtensionHost'; import { LocalStorage } from '@ohos.arkui.stateManagement'; import AsyncCallbackWrapper from './utils/AbilityUtils'; +import AbilityStartCallback from 'application.AbilityStartCallback'; + export default class UIExtensionContentSession { nativeContextSession:long = 0; native nativeSendData(data: Record): void; @@ -29,6 +31,7 @@ export default class UIExtensionContentSession { native nativeSetReceiveDataForResultCallback(callback: (data: Record) => Record): void; native terminateSelfSync(callback:AsyncCallbackWrapper): void; native terminateSelfWithResultSync(parameter: AbilityResult, callback:AsyncCallbackWrapper): void; + private native nativeStartAbilityByTypeSync(type: string, wantParam: Record, startCallback: AbilityStartCallback): BusinessError; sendData(data: Record): void { this.nativeSendData(data); @@ -87,4 +90,37 @@ export default class UIExtensionContentSession { }); return p; } + + startAbilityByType(type: string, wantParam: Record, startCallback: AbilityStartCallback, + callback: AsyncCallback): void { + let p1 = taskpool.execute((): BusinessError => { + return this.nativeStartAbilityByTypeSync(type, wantParam, startCallback); + }); + p1.then((e: NullishType) => { + let retError = e as BusinessError; + callback(retError, undefined); + }, (err: Error): void => { + callback(err as BusinessError, undefined); + }); + } + + startAbilityByType(type: string, wantParam: Record, + startCallback: AbilityStartCallback): Promise { + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): BusinessError => { + return this.nativeStartAbilityByTypeSync(type, wantParam, startCallback); + }); + p1.then((e: NullishType) => { + let retError = e as BusinessError; + if (retError.code === 0) { + resolve(undefined); + } else { + reject(retError); + } + }).catch((err: Error): void => { + reject(err as BusinessError); + }); + }); + return p; + } } diff --git a/frameworks/ets/ets/application/AbilityStartCallback.ets b/frameworks/ets/ets/application/AbilityStartCallback.ets index a444eb813a529bf6b3a69c40dfb97f958227a3a1..4cb35fa610fc94855188cd25ba108b80c6b50e19 100644 --- a/frameworks/ets/ets/application/AbilityStartCallback.ets +++ b/frameworks/ets/ets/application/AbilityStartCallback.ets @@ -15,7 +15,7 @@ import { AbilityResult } from 'ability.abilityResult'; - export default class AbilityStartCallback { - onError(code: int, name: string, message: string) {} - onResult?:(parameter: AbilityResult)=>void = (parameter:AbilityResult) => {} -} \ No newline at end of file +export default interface AbilityStartCallback { + onError(code: int, name: string, message: string): void; + onResult?:(parameter: AbilityResult)=>void; +} diff --git a/frameworks/native/ability/BUILD.gn b/frameworks/native/ability/BUILD.gn index f0dd8b2acb4cd61a1f7b189d158e4563a5f485d4..c28974c93c7e00552af63efbf2c1a1d887a71bcf 100644 --- a/frameworks/native/ability/BUILD.gn +++ b/frameworks/native/ability/BUILD.gn @@ -63,8 +63,9 @@ ohos_shared_library("ability_context_native") { "ability_runtime/js_extension_context.cpp", "ability_runtime/local_call_container.cpp", "ability_runtime/local_call_record.cpp", + "native/ets_ui_extension_callback.cpp", "native/js_ui_extension_callback.cpp", - "native/sts_ui_extension_callback.cpp", + "native/ui_extension_callback.cpp", ] deps = [ @@ -86,6 +87,7 @@ ohos_shared_library("ability_context_native") { "ability_base:want", "access_token:libaccesstoken_sdk", "access_token:libtoken_callback_sdk", + "bundle_framework:bms_ani_common", "c_utils:utils", "common_event_service:cesfwk_innerkits", "eventhandler:libeventhandler", @@ -96,7 +98,6 @@ ohos_shared_library("ability_context_native") { "ipc:ipc_core", "napi:ace_napi", "runtime_core:ani", - "bundle_framework:bms_ani_common", ] public_external_deps = [ "ability_base:extractortool", diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index 8e51b491e88fa1113050155820c1db69295f0eac..2f4bfb174655434dfc019f823fa3d8f7b2e8586a 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -1027,7 +1027,7 @@ Ace::UIContent* AbilityContextImpl::GetUIContent() } ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type, - AAFwk::WantParams &wantParams, const std::shared_ptr &uiExtensionCallbacks) + AAFwk::WantParams &wantParams, const std::shared_ptr &uiExtensionCallback) { TAG_LOGD(AAFwkTag::CONTEXT, "call"); auto uiContent = GetUIContent(); @@ -1044,14 +1044,18 @@ ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type, wantParams.Remove(FLAG_AUTH_READ_URI_PERMISSION); } Ace::ModalUIExtensionCallbacks callback; - callback.onError = [uiExtensionCallbacks](int32_t arg, const std::string &str1, const std::string &str2) { - uiExtensionCallbacks->OnError(arg); + if (uiExtensionCallback == nullptr) { + TAG_LOGE(AAFwkTag::UISERVC_EXT, "null uiExtensionCallback"); + return ERR_INVALID_VALUE; + } + callback.onError = [uiExtensionCallback](int32_t arg, const std::string &str1, const std::string &str2) { + uiExtensionCallback->OnError(arg); }; - callback.onRelease = [uiExtensionCallbacks](int32_t arg) { - uiExtensionCallbacks->OnRelease(arg); + callback.onRelease = [uiExtensionCallback](int32_t arg) { + uiExtensionCallback->OnRelease(arg); }; - callback.onResult = [uiExtensionCallbacks](int32_t arg1, const OHOS::AAFwk::Want arg2) { - uiExtensionCallbacks->OnResult(arg1, arg2); + callback.onResult = [uiExtensionCallback](int32_t arg1, const OHOS::AAFwk::Want arg2) { + uiExtensionCallback->OnResult(arg1, arg2); }; Ace::ModalUIExtensionConfig config; @@ -1060,8 +1064,8 @@ ErrCode AbilityContextImpl::StartAbilityByType(const std::string &type, TAG_LOGE(AAFwkTag::CONTEXT, "createModalUIExtension failed"); return ERR_INVALID_VALUE; } - uiExtensionCallbacks->SetUIContent(uiContent); - uiExtensionCallbacks->SetSessionId(sessionId); + uiExtensionCallback->SetUIContent(uiContent); + uiExtensionCallback->SetSessionId(sessionId); return ERR_OK; } diff --git a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp index fdf67dfc95620e56ff447ede2e0a5742cc6d5a74..ca2654ee3b91c9aaa9474963d7cac1c2001a482f 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -34,6 +34,7 @@ #include "js_error_utils.h" #include "js_runtime_utils.h" #include "js_uiservice_ability_connection.h" +#include "js_ui_extension_callback.h" #include "js_ui_service_proxy.h" #include "mission_info.h" #include "napi_common_ability.h" diff --git a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp index 724f7d86fd044229ea89f032a78dc4a2fead2674..f06b9477c1edea9d2d50b111d04cb2fbbae6dda2 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ability_context.cpp @@ -41,7 +41,7 @@ #include "ani_enum_convert.h" #include "open_link_options.h" #include "start_options.h" -#include "sts_ui_extension_callback.h" +#include "ets_ui_extension_callback.h" #include "tokenid_kit.h" #include "ui_ability_servicehost_stub_impl.h" #include "ui_service_extension_connection_constants.h" @@ -75,10 +75,10 @@ void GenerateCallerCallBack(std::shared_ptr calls, return; } auto callBackDone = [weakData = std::weak_ptr(calls)] (const sptr &obj) { - TAG_LOGI(AAFwkTag::UIABILITY, "callBackDone called start"); + TAG_LOGI(AAFwkTag::CONTEXT, "callBackDone called start"); auto calldata = weakData.lock(); if (calldata == nullptr) { - TAG_LOGW(AAFwkTag::UIABILITY, "calldata released"); + TAG_LOGW(AAFwkTag::CONTEXT, "calldata released"); return; } std::lock_guard lock(calldata->mutexlock); @@ -100,7 +100,7 @@ void WaitForCalleeObj(std::shared_ptr callData) return; } if (callData->condition.wait_for(lock, std::chrono::seconds(CALLER_TIME_OUT)) == std::cv_status::timeout) { - TAG_LOGE(AAFwkTag::UIABILITY, "callExecute waiting callee timeout"); + TAG_LOGE(AAFwkTag::CONTEXT, "callExecute waiting callee timeout"); } } } @@ -112,19 +112,19 @@ std::shared_ptr StsAbilityContext::GetAbilityContext(ani_env *en ani_field contextField = nullptr; ani_status status = ANI_ERROR; if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return nullptr; } if ((status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } if ((status = env->Class_FindField(cls, "nativeContext", &contextField)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } if ((status = env->Object_GetField_Long(aniObj, contextField, &nativeContextLong)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } auto weakContext = reinterpret_cast*>(nativeContextLong); @@ -139,34 +139,34 @@ ani_object StsAbilityContext::SetAbilityContext(ani_env *env, const std::shared_ ani_method method {}; ani_field field = nullptr; if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null context"); return nullptr; } if ((status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } if ((status = env->Class_FindMethod(cls, "", ":V", &method)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } if ((status = env->Object_New(cls, method, &contextObj)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } if ((status = env->Class_FindField(cls, "nativeContext", &field)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return nullptr; } auto workContext = new (std::nothrow) std::weak_ptr(context); if (workContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "workContext nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "workContext nullptr"); return nullptr; } ani_long nativeContextLong = (ani_long)workContext; if ((status = env->Object_SetField_Long(contextObj, field, nativeContextLong)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); delete workContext; workContext = nullptr; return nullptr; @@ -181,7 +181,7 @@ void StsAbilityContext::InheritWindowMode(ani_env *env, ani_object aniObj, AAFwk // only split mode need inherit auto context = GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "context null"); + TAG_LOGE(AAFwkTag::CONTEXT, "context null"); return; } auto windowMode = context->GetCurrentWindowMode(); @@ -237,7 +237,7 @@ void StsAbilityContext::StartAbilityInner([[maybe_unused]] ani_env *env, [[maybe OHOS::AppExecFwk::UnwrapWant(env, wantObj, want); auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "context null"); + TAG_LOGE(AAFwkTag::CONTEXT, "context null"); ThrowStsInvalidParamError(env, "context null"); return; } @@ -277,7 +277,7 @@ void StsAbilityContext::StartAbility1([[maybe_unused]] ani_env *env, [[maybe_unu ani_object wantObj, ani_object call) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); GetInstance().StartAbilityInner(env, aniObj, wantObj, nullptr, call); } @@ -285,7 +285,7 @@ void StsAbilityContext::StartAbility2([[maybe_unused]] ani_env *env, [[maybe_unu ani_object wantObj, ani_object opt, ani_object call) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); GetInstance().StartAbilityInner(env, aniObj, wantObj, opt, call); } @@ -303,7 +303,7 @@ void StsAbilityContext::StartAbilityForResultInner(ani_env *env, ani_object aniO { auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); ThrowStsErrorByNativeErr(env, static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)); return; } @@ -313,7 +313,7 @@ void StsAbilityContext::StartAbilityForResultInner(ani_env *env, ani_object aniO if (startOptionsObj) { OHOS::AppExecFwk::UnwrapStartOptions(env, startOptionsObj, startOptions); } - TAG_LOGE(AAFwkTag::UIABILITY, "displayId:%{public}d", startOptions.GetDisplayID()); + TAG_LOGE(AAFwkTag::CONTEXT, "displayId:%{public}d", startOptions.GetDisplayID()); std::string startTime = std::to_string(std::chrono::duration_cast(std::chrono:: system_clock::now().time_since_epoch()).count()); ani_ref callbackRef = nullptr; @@ -354,7 +354,7 @@ void StsAbilityContext::StartAbilityForResultInner(ani_env *env, ani_object aniO // TO DO: free install void StsAbilityContext::StartAbilityForResult1(ani_env *env, ani_object aniObj, ani_object wantObj, ani_object callback) { - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); StartAbilityForResultInner(env, aniObj, wantObj, nullptr, callback); } @@ -362,7 +362,7 @@ void StsAbilityContext::StartAbilityForResult1(ani_env *env, ani_object aniObj, void StsAbilityContext::StartAbilityForResult2(ani_env *env, ani_object aniObj, ani_object wantObj, ani_object startOptionsObj, ani_object callback) { - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); StartAbilityForResultInner(env, aniObj, wantObj, startOptionsObj, callback); } @@ -370,10 +370,10 @@ void StsAbilityContext::TerminateSelf( ani_env *env, ani_object aniObj, ani_object callback) { ani_object aniObject = nullptr; - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "context null"); + TAG_LOGE(AAFwkTag::CONTEXT, "context null"); aniObject = CreateStsInvalidParamError(env, "context null"); AppExecFwk::AsyncCallback(env, callback, aniObject, nullptr); return; @@ -391,10 +391,10 @@ void StsAbilityContext::TerminateSelfWithResult( ani_env *env, ani_object aniObj, ani_object abilityResult, ani_object callback) { ani_object aniObject = nullptr; - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); aniObject = CreateStsInvalidParamError(env, "context null"); AppExecFwk::AsyncCallback(env, callback, aniObject, nullptr); return; @@ -416,10 +416,10 @@ void StsAbilityContext::reportDrawnCompletedSync([[maybe_unused]] ani_env *env, ani_object callback) { ani_object aniObject = nullptr; - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); auto context = GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "context null"); + TAG_LOGE(AAFwkTag::CONTEXT, "context null"); aniObject = CreateStsInvalidParamError(env, "context null"); AppExecFwk::AsyncCallback(env, callback, aniObject, nullptr); return; @@ -433,60 +433,57 @@ void StsAbilityContext::reportDrawnCompletedSync([[maybe_unused]] ani_env *env, AppExecFwk::AsyncCallback(env, callback, aniObject, nullptr); } -ani_object StsAbilityContext::StartAbilityByTypeSync([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, - ani_string aniType, ani_ref aniWantParam, ani_object startCallback) +ani_object StsAbilityContext::StartAbilityByTypeSync( + ani_env *env, ani_object aniObj, ani_string aniType, ani_ref aniWantParam, ani_object startCallback) { - TAG_LOGD(AAFwkTag::UIABILITY, "call"); - auto context = GetAbilityContext(env, aniObj); + TAG_LOGD(AAFwkTag::CONTEXT, "call"); ani_object aniObject = CreateStsError(env, AbilityErrorCode::ERROR_OK); - if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "get abilityContext failed."); - ThrowStsInvalidParamError(env, "context null"); - return aniObject; - } - std::string type; if (!AppExecFwk::GetStdString(env, aniType, type)) { - TAG_LOGE(AAFwkTag::UI_EXT, "parse type failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse type failed"); ThrowStsInvalidParamError(env, "Parse param type failed, type must be string."); return aniObject; } AAFwk::WantParams wantParam; if (!AppExecFwk::UnwrapWantParams(env, aniWantParam, wantParam)) { - TAG_LOGE(AAFwkTag::UI_EXT, "parse wantParam failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse wantParam failed"); ThrowStsInvalidParamError(env, "Parse param want failed, want must be Want."); return aniObject; } - ani_vm *aniVM = nullptr; - if (env->GetVM(&aniVM) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "get aniVM failed"); - ThrowStsInvalidParamError(env, "Get aniVm failed."); + ani_vm *vm = nullptr; + if (env->GetVM(&vm) != ANI_OK) { + TAG_LOGE(AAFwkTag::CONTEXT, "get vm failed"); + ThrowStsInvalidParamError(env, "Get vm failed."); return aniObject; } ErrCode innerErrCode = ERR_OK; - std::shared_ptr callback = std::make_shared(); - callback->SetStsCallbackObject(aniVM, startCallback); - innerErrCode = context->StartAbilityByType(type, wantParam, callback); - if (innerErrCode == ERR_OK) { - return aniObject; - } else if (innerErrCode == static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)) { + std::shared_ptr callback = std::make_shared(vm); + callback->SetEtsCallbackObject(startCallback); + auto context = GetAbilityContext(env, aniObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); return CreateStsError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); - } else { + } +#ifdef SUPPORT_SCREEN + innerErrCode = context->StartAbilityByType(type, wantParam, callback); +#endif + if (innerErrCode != ERR_OK) { return CreateStsErrorByNativeErr(env, innerErrCode); } + return aniObject; } void StsAbilityContext::StartServiceExtensionAbilitySync([[maybe_unused]]ani_env *env, [[maybe_unused]]ani_object aniObj, [[maybe_unused]] ani_object wantObj, [[maybe_unused]] ani_object callbackobj) { - TAG_LOGD(AAFwkTag::UIABILITY, "call"); + TAG_LOGD(AAFwkTag::CONTEXT, "call"); ani_object errorObject = nullptr; ErrCode ret = ERR_OK; auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); ret = static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); errorObject = CreateStsError(env, static_cast(ret)); AppExecFwk::AsyncCallback(env, callbackobj, errorObject, nullptr); @@ -494,7 +491,7 @@ void StsAbilityContext::StartServiceExtensionAbilitySync([[maybe_unused]]ani_env } AAFwk::Want want; if (!OHOS::AppExecFwk::UnwrapWant(env, wantObj, want)) { - TAG_LOGE(AAFwkTag::UIABILITY, "UnwrapWant filed"); + TAG_LOGE(AAFwkTag::CONTEXT, "UnwrapWant filed"); errorObject = CreateStsInvalidParamError(env, "UnwrapWant filed"); AppExecFwk::AsyncCallback(env, callbackobj, errorObject, nullptr); } @@ -509,17 +506,17 @@ void StsAbilityContext::StartServiceExtensionAbilitySync([[maybe_unused]]ani_env ani_object StsAbilityContext::StartAbilityByCall(ani_env *env, ani_object aniObj, ani_object wantObj) { - TAG_LOGI(AAFwkTag::UIABILITY, "StartAbilityByCall"); + TAG_LOGI(AAFwkTag::CONTEXT, "StartAbilityByCall"); auto context = GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); ThrowStsError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); return nullptr; } AAFwk::Want want; if (!AppExecFwk::UnwrapWant(env, wantObj, want)) { - TAG_LOGE(AAFwkTag::UIABILITY, "parse want failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse want failed"); ThrowStsInvalidParamError(env, "Parse param want failed, want must be Want."); return nullptr; } @@ -528,7 +525,7 @@ ani_object StsAbilityContext::StartAbilityByCall(ani_env *env, ani_object aniObj GenerateCallerCallBack(callData, callerCallBack); auto ret = context->StartAbilityByCall(want, callerCallBack, -1); if (ret != 0) { - TAG_LOGE(AAFwkTag::UIABILITY, "startAbility failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "startAbility failed"); ThrowStsErrorByNativeErr(env, ret); return nullptr; } @@ -557,22 +554,22 @@ ani_object StsAbilityContext::StartAbilityByCall(ani_env *env, ani_object aniObj void StsAbilityContext::NativeOpenLinkSync(ani_env *env, ani_object aniObj, ani_string aniLink, ani_object myCallbackobj, ani_object optionsObj, ani_object callbackobj) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeOpenLinkSync"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeOpenLinkSync"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return; } ani_status status = ANI_ERROR; ani_boolean isOptionsUndefined = true; if ((status = env->Reference_IsUndefined(optionsObj, &isOptionsUndefined)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); } ani_boolean isCallbackUndefined = true; if ((status = env->Reference_IsUndefined(callbackobj, &isCallbackUndefined)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); } if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); } GetInstance().OpenLinkInner(env, aniObj, aniLink, myCallbackobj, optionsObj, callbackobj, !isOptionsUndefined, !isCallbackUndefined); @@ -580,9 +577,9 @@ void StsAbilityContext::NativeOpenLinkSync(ani_env *env, ani_object aniObj, ani_ void StsAbilityContext::NativeRestoreWindowStage(ani_env *env, ani_object aniObj, ani_object localStorage) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeRestoreWindowStage"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeRestoreWindowStage"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return; } auto context = StsAbilityContext::GetAbilityContext(env, aniObj); @@ -594,7 +591,7 @@ void StsAbilityContext::NativeRestoreWindowStage(ani_env *env, ani_object aniObj ani_status status = ANI_ERROR; ani_boolean isLocalStorageUndefined = true; if ((status = env->Reference_IsUndefined(localStorage, &isLocalStorageUndefined)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return; } if (isLocalStorageUndefined) { @@ -604,7 +601,7 @@ void StsAbilityContext::NativeRestoreWindowStage(ani_env *env, ani_object aniObj } ani_ref global = nullptr; if ((status = env->GlobalReference_Create(localStorage, &global)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "status : %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status : %{public}d", status); return; } STSNativeReferenceWrapper* etsNativeRef = nullptr; @@ -620,9 +617,9 @@ void StsAbilityContext::NativeRestoreWindowStage(ani_env *env, ani_object aniObj bool StsAbilityContext::NativeIsTerminating(ani_env *env, ani_object aniObj) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeIsTerminating"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeIsTerminating"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return false; } auto context = StsAbilityContext::GetAbilityContext(env, aniObj); @@ -636,9 +633,9 @@ bool StsAbilityContext::NativeIsTerminating(ani_env *env, ani_object aniObj) void StsAbilityContext::NativeMoveAbilityToBackground(ani_env *env, ani_object aniObj, ani_object callback) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeMoveAbilityToBackground"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeMoveAbilityToBackground"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return; } auto context = StsAbilityContext::GetAbilityContext(env, aniObj); @@ -659,15 +656,15 @@ void StsAbilityContext::NativeMoveAbilityToBackground(ani_env *env, ani_object a void StsAbilityContext::NativeRequestModalUIExtension(ani_env *env, ani_object aniObj, ani_string pickerWantObj, ani_object callbackObj) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeRequestModalUIExtension"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeRequestModalUIExtension"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return; } ani_object errorObject = nullptr; AAFwk::Want want; if (!AppExecFwk::UnwrapWant(env, pickerWantObj, want)) { - TAG_LOGE(AAFwkTag::UIABILITY, "parse want failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse want failed"); ThrowStsInvalidParamError(env, "Parse param want failed, want must be Want."); return; } @@ -688,41 +685,41 @@ void StsAbilityContext::NativeRequestModalUIExtension(ani_env *env, ani_object a ani_object StsAbilityContext::NativeTransferStatic(ani_env *env, ani_object, ani_object input) { - TAG_LOGD(AAFwkTag::UIABILITY, "transfer static UIAbilityContext"); + TAG_LOGD(AAFwkTag::CONTEXT, "transfer static UIAbilityContext"); void *unwrapResult = nullptr; bool success = arkts_esvalue_unwrap(env, input, &unwrapResult); if (!success) { - TAG_LOGE(AAFwkTag::UIABILITY, "failed to unwrap"); + TAG_LOGE(AAFwkTag::CONTEXT, "failed to unwrap"); ThrowStsTransferClassError(env); return nullptr; } if (unwrapResult == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null unwrapResult"); + TAG_LOGE(AAFwkTag::CONTEXT, "null unwrapResult"); ThrowStsTransferClassError(env); return nullptr; } auto context = reinterpret_cast *>(unwrapResult)->lock(); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null context"); ThrowStsTransferClassError(env); return nullptr; } auto abilityContext = Context::ConvertTo(context); if (abilityContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext"); + TAG_LOGE(AAFwkTag::CONTEXT, "null abilityContext"); ThrowStsTransferClassError(env); return nullptr; } auto &bindingObj = abilityContext->GetBindingObject(); if (bindingObj == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null bindingObj"); + TAG_LOGE(AAFwkTag::CONTEXT, "null bindingObj"); ThrowStsTransferClassError(env); return nullptr; } auto staticContext = bindingObj->Get(); if (staticContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null staticContext"); + TAG_LOGE(AAFwkTag::CONTEXT, "null staticContext"); ThrowStsTransferClassError(env); return nullptr; } @@ -731,34 +728,34 @@ ani_object StsAbilityContext::NativeTransferStatic(ani_env *env, ani_object, ani ani_object StsAbilityContext::NativeTransferDynamic(ani_env *env, ani_object, ani_object input) { - TAG_LOGD(AAFwkTag::UIABILITY, "transfer dynamic UIAbilityContext"); + TAG_LOGD(AAFwkTag::CONTEXT, "transfer dynamic UIAbilityContext"); if (!IsInstanceOf(env, input)) { - TAG_LOGE(AAFwkTag::UIABILITY, "not UIAbilityContext"); + TAG_LOGE(AAFwkTag::CONTEXT, "not UIAbilityContext"); ThrowStsTransferClassError(env); return nullptr; } auto context = GetAbilityContext(env, input); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null context"); ThrowStsTransferClassError(env); return nullptr; } auto abilityContext = Context::ConvertTo(context); if (abilityContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext"); + TAG_LOGE(AAFwkTag::CONTEXT, "null abilityContext"); ThrowStsTransferClassError(env); return nullptr; } auto &bindingObj = abilityContext->GetBindingObject(); if (bindingObj == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null bindingObj"); + TAG_LOGE(AAFwkTag::CONTEXT, "null bindingObj"); ThrowStsTransferClassError(env); return nullptr; } auto dynamicContext = bindingObj->Get(); if (dynamicContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null dynamicContext"); + TAG_LOGE(AAFwkTag::CONTEXT, "null dynamicContext"); ThrowStsTransferClassError(env); return nullptr; } @@ -771,7 +768,7 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) { ani_status status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls); if (status != ANI_OK || cls == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } std::call_once(g_bindNativeMethodsFlag, [&status, env, cls]() { @@ -822,7 +819,7 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) status = env->Class_BindNativeMethods(cls, functions.data(), functions.size()); }); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } return true; @@ -837,13 +834,13 @@ void StsAbilityContext::OpenLinkInner(ani_env *env, ani_object aniObj, ani_strin AAFwk::Want want; want.SetParam(APP_LINKING_ONLY, false); if (!AppExecFwk::GetStdString(env, aniLink, link)) { - TAG_LOGE(AAFwkTag::UIABILITY, "parse link failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse link failed"); aniObject = CreateStsInvalidParamError(env, "Parse param link failed, link must be string."); AppExecFwk::AsyncCallback(env, myCallbackobj, aniObject, nullptr); return; } if (haveOptionsParm) { - TAG_LOGD(AAFwkTag::UIABILITY, "OpenLink Have option"); + TAG_LOGD(AAFwkTag::CONTEXT, "OpenLink Have option"); StsAbilityContext::UnWrapOpenLinkOptions(env, optionsObj, openLinkOptions, want); } want.SetUri(link); @@ -854,7 +851,7 @@ void StsAbilityContext::OpenLinkInner(ani_env *env, ani_object aniObj, ani_strin ErrCode ErrCode = ERR_OK; auto context = StsAbilityContext::GetAbilityContext(env, aniObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); ErrCode = static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); aniObject = CreateStsError(env, static_cast(ErrCode)); AppExecFwk::AsyncCallback(env, myCallbackobj, aniObject, nullptr); @@ -862,7 +859,7 @@ void StsAbilityContext::OpenLinkInner(ani_env *env, ani_object aniObj, ani_strin } AddFreeInstallObserver(env, want, myCallbackobj, context, true); if (haveCallBackParm) { - TAG_LOGD(AAFwkTag::UIABILITY, "OpenLink Have Callback"); + TAG_LOGD(AAFwkTag::CONTEXT, "OpenLink Have Callback"); CreateOpenLinkTask(env, callbackobj, context, want, requestCode); } ErrCode = context->OpenLink(want, requestCode); @@ -877,7 +874,7 @@ void StsAbilityContext::OpenLinkInner(ani_env *env, ani_object aniObj, ani_strin void StsAbilityContext::UnWrapOpenLinkOptions(ani_env *env, ani_object optionsObj, AAFwk::OpenLinkOptions &openLinkOptions, AAFwk::Want &want) { - TAG_LOGD(AAFwkTag::UIABILITY, "UnWrapOpenLinkOptions"); + TAG_LOGD(AAFwkTag::CONTEXT, "UnWrapOpenLinkOptions"); ani_status status = ANI_ERROR; ani_ref ParamRef = nullptr; if ((status = env->Object_GetPropertyByName_Ref(optionsObj, "parameters", &ParamRef)) == ANI_OK) { @@ -885,7 +882,7 @@ void StsAbilityContext::UnWrapOpenLinkOptions(ani_env *env, ani_object optionsOb if (AppExecFwk::UnwrapWantParams(env, ParamRef, wantParam)) { want.SetParams(wantParam); } else { - TAG_LOGE(AAFwkTag::UIABILITY, "UnwrapWantParams failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "UnwrapWantParams failed"); } } if ((status = env->Object_GetPropertyByName_Ref(optionsObj, APP_LINKING_ONLY.c_str(), &ParamRef)) == ANI_OK) { @@ -901,7 +898,7 @@ void StsAbilityContext::UnWrapOpenLinkOptions(ani_env *env, ani_object optionsOb void StsAbilityContext::CreateOpenLinkTask(ani_env *env, const ani_object callbackobj, std::shared_ptr context, AAFwk::Want &want, int &requestCode) { - TAG_LOGD(AAFwkTag::UIABILITY, "CreateOpenLinkTask"); + TAG_LOGD(AAFwkTag::CONTEXT, "CreateOpenLinkTask"); want.SetParam(AAFwk::Want::PARAM_RESV_FOR_RESULT, true); ani_vm *etsVm = nullptr; ani_status status = ANI_ERROR; @@ -911,7 +908,7 @@ void StsAbilityContext::CreateOpenLinkTask(ani_env *env, const ani_object callba } ani_ref callbackRef = nullptr; if ((status = env->GlobalReference_Create(callbackobj, &callbackRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return; } RuntimeTask task = [etsVm, callbackRef] (int resultCode, const AAFwk::Want &want, bool isInner) { @@ -941,16 +938,16 @@ bool StsAbilityContext::IsInstanceOf(ani_env *env, ani_object aniObj) ani_class cls {}; ani_status status = ANI_ERROR; if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return false; } if ((status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } ani_boolean isInstanceOf = false; if ((status = env->Object_InstanceOf(aniObj, cls, &isInstanceOf)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } return isInstanceOf; @@ -959,7 +956,7 @@ bool StsAbilityContext::IsInstanceOf(ani_env *env, ani_object aniObj) bool SetAbilityInfo(ani_env *env, ani_class cls, ani_object contextObj, const std::shared_ptr &context) { if (env == nullptr || context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env or context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env or context"); return false; } ani_field field = nullptr; @@ -968,13 +965,13 @@ bool SetAbilityInfo(ani_env *env, ani_class cls, ani_object contextObj, const st ani_status status = env->Class_FindField(cls, "abilityInfo", &field); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } status = env->Object_SetField_Ref(contextObj, field, abilityInfoRef); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } return true; @@ -984,7 +981,7 @@ bool SetConfiguration( ani_env *env, ani_class cls, ani_object contextObj, const std::shared_ptr &context) { if (env == nullptr || context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env or context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env or context"); return false; } ani_field field = nullptr; @@ -993,13 +990,13 @@ bool SetConfiguration( ani_status status = env->Class_FindField(cls, "config", &field); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } status = env->Object_SetField_Ref(contextObj, field, configurationRef); if (status != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } return true; @@ -1009,7 +1006,7 @@ bool SetHapModuleInfo( ani_env *env, ani_class cls, ani_object contextObj, const std::shared_ptr &context) { if (env == nullptr || context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env or context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env or context"); return false; } ani_status status = ANI_OK; @@ -1032,32 +1029,32 @@ bool SetHapModuleInfo( ani_ref CreateStsAbilityContext(ani_env *env, const std::shared_ptr &context) { - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::CONTEXT, "called"); if (env == nullptr || context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env or context"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env or context"); return nullptr; } ani_class cls {}; if (!BindNativeMethods(env, cls)) { - TAG_LOGE(AAFwkTag::UIABILITY, "BindNativeMethods failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "BindNativeMethods failed"); return nullptr; } ani_object contextObj = StsAbilityContext::SetAbilityContext(env, context); if (contextObj == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null contextObj"); + TAG_LOGE(AAFwkTag::CONTEXT, "null contextObj"); return nullptr; } ContextUtil::StsCreatContext(env, cls, contextObj, context); if (!SetAbilityInfo(env, cls, contextObj, context)) { - TAG_LOGE(AAFwkTag::UIABILITY, "SetAbilityInfo failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "SetAbilityInfo failed"); return nullptr; } if (!SetConfiguration(env, cls, contextObj, context)) { - TAG_LOGE(AAFwkTag::UIABILITY, "SetConfiguration failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "SetConfiguration failed"); return nullptr; } if (!SetHapModuleInfo(env, cls, contextObj, context)) { - TAG_LOGE(AAFwkTag::UIABILITY, "SetHapModuleInfo failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "SetHapModuleInfo failed"); return nullptr; } return contextObj; diff --git a/frameworks/native/ability/native/sts_ui_extension_callback.cpp b/frameworks/native/ability/native/ets_ui_extension_callback.cpp similarity index 43% rename from frameworks/native/ability/native/sts_ui_extension_callback.cpp rename to frameworks/native/ability/native/ets_ui_extension_callback.cpp index b47deaf9b631cbd109786ca9a37236b77edee0a2..20745de21c040a39a9f837f38727a2d2aa9ab161 100644 --- a/frameworks/native/ability/native/sts_ui_extension_callback.cpp +++ b/frameworks/native/ability/native/ets_ui_extension_callback.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "sts_ui_extension_callback.h" +#include "ets_ui_extension_callback.h" #include "ability_business_error.h" #include "ani_common_ability_result.h" @@ -30,45 +30,39 @@ constexpr const char* ERROR_MSG_INNER = "Inner error."; #endif // SUPPORT_SCREEN namespace { -constexpr const char* ABILITY_START_CLASS_NAME = "Lapplication/AbilityStartCallback/AbilityStartCallback;"; +constexpr const char *ABILITY_START_CLASS_NAME = "Lapplication/AbilityStartCallback/AbilityStartCallback;"; } -StsUIExtensionCallback::StsUIExtensionCallback() : JsUIExtensionCallback(nullptr) +EtsUIExtensionCallback::~EtsUIExtensionCallback() { + ani_env *env = GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); + return; + } + if (callback_ != nullptr) { + env->GlobalReference_Delete(callback_); + callback_ = nullptr; + } } -StsUIExtensionCallback::~StsUIExtensionCallback() -{ -} - -void StsUIExtensionCallback::SetSessionId(int32_t sessionId) -{ - aniSessionId_ = sessionId; -} - -void StsUIExtensionCallback::SetUIContent(Ace::UIContent* uiContent) -{ - aniUIContent_ = uiContent; -} - -void StsUIExtensionCallback::OnError(int32_t number) +void EtsUIExtensionCallback::OnError(int32_t number) { TAG_LOGD(AAFwkTag::UI_EXT, "call"); - auto aniEnv = GetAniEnv(); - if (aniEnv == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null aniEnv"); + auto env = GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); return; } ani_status status = ANI_ERROR; ani_class clsCall = nullptr; - if ((status = aniEnv->FindClass(ABILITY_START_CLASS_NAME, &clsCall)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "find AbilityStartCallback class failed, status : %{public}d", status); + if ((status = env->FindClass(ABILITY_START_CLASS_NAME, &clsCall)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "find AbilityStartCallback class failed, status: %{public}d", status); return; } ani_method method = nullptr; - if ((status = aniEnv->Class_FindMethod(clsCall, "onError", "ILstd/core/String;Lstd/core/String;:V", - &method)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "find onError method failed, status : %{public}d", status); + if ((status = env->Class_FindMethod(clsCall, "onError", nullptr, &method)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "find onError method failed, status: %{public}d", status); return; } std::string name; @@ -81,111 +75,84 @@ void StsUIExtensionCallback::OnError(int32_t number) } #endif // SUPPORT_SCREEN ani_string aniName; - if ((status = aniEnv->String_NewUTF8(name.c_str(), name.length(), &aniName)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "String_NewUTF8 failed, status : %{public}d", status); + if ((status = env->String_NewUTF8(name.c_str(), name.length(), &aniName)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "String_NewUTF8 failed, status: %{public}d", status); return; } ani_string aniMsg; - if ((status = aniEnv->String_NewUTF8(message.c_str(), message.length(), &aniMsg)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "String_NewUTF8 failed, status : %{public}d", status); + if ((status = env->String_NewUTF8(message.c_str(), message.length(), &aniMsg)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "String_NewUTF8 failed, status: %{public}d", status); return; } - ani_int aniCode = number; - if ((status = aniEnv->Object_CallMethod_Void(reinterpret_cast(startAbilityAniCallback_), - method, aniCode, aniName, aniMsg)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "call onError method failed, status : %{public}d", status); + if ((status = env->Object_CallMethod_Void(reinterpret_cast(callback_), + method, number, aniName, aniMsg)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "call onError method failed, status: %{public}d", status); return; } CloseModalUIExtension(); } -void StsUIExtensionCallback::OnResult(int32_t resultCode, const AAFwk::Want &want) +void EtsUIExtensionCallback::OnResult(int32_t resultCode, const AAFwk::Want &want) { TAG_LOGD(AAFwkTag::UI_EXT, "call"); - auto aniEnv = GetAniEnv(); - if (aniEnv == nullptr || startAbilityAniCallback_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null aniEnv"); + auto env = GetAniEnv(); + if (env == nullptr || callback_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); return; } ani_status status = ANI_ERROR; - ani_object startCallback = reinterpret_cast(startAbilityAniCallback_); + ani_object startCallback = reinterpret_cast(callback_); ani_ref onResultRef {}; - if ((status = aniEnv->Object_GetFieldByName_Ref(startCallback, "onResult", &onResultRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "get onResult failed, status : %{public}d", status); + if ((status = env->Object_GetPropertyByName_Ref(startCallback, "onResult", &onResultRef)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "get onResult failed, status: %{public}d", status); return; } ani_fn_object onResultFn = reinterpret_cast(onResultRef); - ani_object abilityResultObj = AppExecFwk::WrapAbilityResult(aniEnv, resultCode, want); + ani_object abilityResultObj = AppExecFwk::WrapAbilityResult(env, resultCode, want); if (abilityResultObj == nullptr) { TAG_LOGE(AAFwkTag::UI_EXT, "create abilityResultObj failed"); return; } - - ani_ref abilityResultObjRef = nullptr; - if ((status = aniEnv->GlobalReference_Create(abilityResultObj, &abilityResultObjRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "GlobalReference_Create abilityResultObj failed, status : %{public}d", status); - return; - } - ani_ref argv[] = { abilityResultObjRef }; - if ((status = aniEnv->FunctionalObject_Call(onResultFn, 1, argv, nullptr)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "call onResult fn failed, status : %{public}d", status); + ani_ref argv[] = { abilityResultObj }; + ani_ref result; + if ((status = env->FunctionalObject_Call(onResultFn, 1, argv, &result)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "call onResult fn failed, status: %{public}d", status); return; } CloseModalUIExtension(); } -void StsUIExtensionCallback::OnRelease(int32_t code) +void EtsUIExtensionCallback::SetEtsCallbackObject(ani_object aniObject) { - TAG_LOGI(AAFwkTag::UI_EXT, "call, code:%{public}d", code); - CloseModalUIExtension(); -} - -void StsUIExtensionCallback::SetStsCallbackObject(ani_vm* aniVM, ani_object aniObject) -{ - TAG_LOGD(AAFwkTag::UI_EXT, "call"); - if (aniVM == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null aniVM"); + TAG_LOGD(AAFwkTag::UI_EXT, "SetEtsCallbackObject call"); + ani_env *env = GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env"); return; } - aniVM_ = aniVM; - ani_env *aniEnv = nullptr; - ani_status status = ANI_ERROR; - if ((status = aniVM_->GetEnv(ANI_VERSION_1, &aniEnv)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "GetEnv failed, status : %{public}d", status); - return; - } - - ani_ref startAbilityCallbackRef = nullptr; - if ((status = aniEnv->GlobalReference_Create(aniObject, &startAbilityCallbackRef)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "GlobalReference_Create failed, status : %{public}d", status); + ani_ref callback = nullptr; + ani_status status = env->GlobalReference_Create(aniObject, &callback); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "GlobalReference_Create failed, status: %{public}d", status); return; } - startAbilityAniCallback_ = startAbilityCallbackRef; + callback_ = callback; } -ani_env* StsUIExtensionCallback::GetAniEnv() +ani_env* EtsUIExtensionCallback::GetAniEnv() { - TAG_LOGD(AAFwkTag::UI_EXT, "call"); - if (aniVM_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null aniVM_"); + TAG_LOGD(AAFwkTag::UI_EXT, "GetAniEnv call"); + if (vm_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null vm_"); return nullptr; } - ani_env *aniEnv = nullptr; - ani_status status = ANI_ERROR; - if ((status = aniVM_->GetEnv(ANI_VERSION_1, &aniEnv)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "get env failed, status : %{public}d", status); + ani_env *env = nullptr; + ani_status status = vm_->GetEnv(ANI_VERSION_1, &env); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "get env failed, status: %{public}d", status); return nullptr; } - return aniEnv; -} - -void StsUIExtensionCallback::CloseModalUIExtension() -{ - if (aniUIContent_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null aniUIContent_"); - return; - } - aniUIContent_->CloseModalUIExtension(aniSessionId_); + return env; } } // namespace AbilityRuntime } // namespace OHOS \ No newline at end of file diff --git a/frameworks/native/ability/native/js_ui_extension_callback.cpp b/frameworks/native/ability/native/js_ui_extension_callback.cpp index 57bfed07179089a57a2bca3c5abff662abbbc20c..883c44694668b1a58fd06e0c7bc0e6125a8985a6 100644 --- a/frameworks/native/ability/native/js_ui_extension_callback.cpp +++ b/frameworks/native/ability/native/js_ui_extension_callback.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023-2024 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -69,16 +69,7 @@ JsUIExtensionCallback::~JsUIExtensionCallback() } } -void JsUIExtensionCallback::SetSessionId(int32_t sessionId) -{ - sessionId_ = sessionId; -} #ifdef SUPPORT_SCREEN -void JsUIExtensionCallback::SetUIContent(Ace::UIContent* uiContent) -{ - uiContent_ = uiContent; -} - void JsUIExtensionCallback::SetJsCallbackObject(napi_value jsCallbackObject) { napi_ref ref = nullptr; @@ -108,11 +99,7 @@ void JsUIExtensionCallback::OnError(int32_t number) std::unique_ptr execute = nullptr; NapiAsyncTask::Schedule("JsUIExtensionCallback::OnError:", env_, std::make_unique(callback, std::move(execute), std::move(complete))); - if (uiContent_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null uiContent_"); - return; - } - uiContent_->CloseModalUIExtension(sessionId_); + CloseModalUIExtension(); } void JsUIExtensionCallback::OnResult(int32_t resultCode, const AAFwk::Want &want) @@ -134,11 +121,7 @@ void JsUIExtensionCallback::OnResult(int32_t resultCode, const AAFwk::Want &want std::unique_ptr execute = nullptr; NapiAsyncTask::Schedule("JsUIExtensionCallback::OnResult:", env_, std::make_unique(callback, std::move(execute), std::move(complete))); - if (uiContent_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null uiContent_"); - return; - } - uiContent_->CloseModalUIExtension(sessionId_); + CloseModalUIExtension(); } void JsUIExtensionCallback::CallJsResult(int32_t resultCode, const AAFwk::Want &want) @@ -177,15 +160,6 @@ void JsUIExtensionCallback::CallJsResult(int32_t resultCode, const AAFwk::Want & TAG_LOGI(AAFwkTag::UI_EXT, "end"); } -void JsUIExtensionCallback::OnRelease(int32_t code) -{ - TAG_LOGI(AAFwkTag::UI_EXT, "call, code:%{public}d", code); - if (uiContent_ == nullptr) { - TAG_LOGE(AAFwkTag::UI_EXT, "null uiContent_"); - return; - } - uiContent_->CloseModalUIExtension(sessionId_); -} #endif // SUPPORT_SCREEN void JsUIExtensionCallback::CallJsError(int32_t number) { diff --git a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_content_session.cpp b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_content_session.cpp index 69d1a0d0442de4248a6e5b2ea16951e2c348bfc7..5692752f4355e0415da45723ef1a90dc92c1f787 100644 --- a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_content_session.cpp +++ b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_content_session.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023-2024 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,6 +24,7 @@ #include "js_error_utils.h" #include "js_extension_window.h" #include "js_runtime_utils.h" +#include "js_ui_extension_callback.h" #include "js_ui_extension_context.h" #include "napi_common_start_options.h" #include "napi_common_util.h" @@ -50,8 +51,6 @@ constexpr size_t ARGC_ZERO = 0; constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_THREE = 3; constexpr const char* PERMISSION_PRIVACY_WINDOW = "ohos.permission.PRIVACY_WINDOW"; -const std::string UIEXTENSION_TARGET_TYPE_KEY = "ability.want.params.uiExtensionTargetType"; -const std::string FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermissionFlag"; } // namespace #define CHECK_IS_SYSTEM_APP \ @@ -130,7 +129,7 @@ void UISessionAbilityResultListener::SaveResultCallbacks(int requestCode, Runtim JsUIExtensionContentSession::JsUIExtensionContentSession( sptr sessionInfo, sptr uiWindow, - std::weak_ptr &context, + std::weak_ptr &context, std::shared_ptr& abilityResultListeners) : sessionInfo_(sessionInfo), uiWindow_(uiWindow), context_(context) { @@ -899,47 +898,36 @@ napi_value JsUIExtensionContentSession::OnStartAbilityByType(napi_env env, NapiC TAG_LOGE(AAFwkTag::UI_EXT, "check startAbilityByCall param failed"); return CreateJsUndefined(env); } - wantParam.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type)); - AAFwk::Want want; - want.SetParams(wantParam); - if (wantParam.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) { - want.SetFlags(wantParam.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0)); - wantParam.Remove(FLAG_AUTH_READ_URI_PERMISSION); - } -#ifdef SUPPORT_SCREEN - InitDisplayId(want); -#endif - std::shared_ptr uiExtensionCallback = std::make_shared(env); - uiExtensionCallback->SetJsCallbackObject(info.argv[INDEX_TWO]); - NapiAsyncTask::CompleteCallback complete = [uiWindow = uiWindow_, type, want, uiExtensionCallback] - (napi_env env, NapiAsyncTask& task, int32_t status) { - if (uiWindow == nullptr || uiWindow->GetUIContent() == nullptr) { - task.Reject(env, CreateJsError(env, AbilityErrorCode::ERROR_CODE_INNER)); + std::shared_ptr callback = std::make_shared(env); + callback->SetJsCallbackObject(info.argv[INDEX_TWO]); + auto innerErrCode = std::make_shared(ERR_OK); + NapiAsyncTask::ExecuteCallback execute = + [weak = context_, type, wantParam, callback, innerErrCode]() mutable { + auto context = weak.lock(); + if (!context) { + TAG_LOGW(AAFwkTag::UI_EXT, "null context"); + *innerErrCode = static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); return; } #ifdef SUPPORT_SCREEN - Ace::ModalUIExtensionCallbacks callback; - callback.onError = [uiExtensionCallback](int arg, const std::string &str1, const std::string &str2) { - uiExtensionCallback->OnError(arg); - }; - callback.onRelease = [uiExtensionCallback](const auto &arg) { - uiExtensionCallback->OnRelease(arg); - }; - Ace::ModalUIExtensionConfig config; - int32_t sessionId = uiWindow->GetUIContent()->CreateModalUIExtension(want, callback, config); - if (sessionId == 0) { - task.Reject(env, CreateJsError(env, AbilityErrorCode::ERROR_CODE_INNER)); - } else { - uiExtensionCallback->SetUIContent(uiWindow->GetUIContent()); - uiExtensionCallback->SetSessionId(sessionId); + *innerErrCode = context->StartAbilityByType(type, wantParam, callback); +#endif + }; + NapiAsyncTask::CompleteCallback complete = + [innerErrCode](napi_env env, NapiAsyncTask& task, int32_t status) { + if (*innerErrCode == ERR_OK) { task.ResolveWithNoError(env, CreateJsUndefined(env)); + } else if (*innerErrCode == static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)) { + task.Reject(env, CreateJsError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT)); + } else { + task.Reject(env, CreateJsErrorByNativeErr(env, *innerErrCode)); } -#endif // SUPPORT_SCREEN }; + napi_value lastParam = (info.argc > ARGC_THREE) ? info.argv[INDEX_THREE] : nullptr; napi_value result = nullptr; NapiAsyncTask::ScheduleHighQos("JsUIExtensionContentSession::OnStartAbilityByType", - env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result)); + env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result)); return result; } @@ -971,7 +959,7 @@ bool JsUIExtensionContentSession::CheckStartAbilityByTypeParam(napi_env env, napi_value JsUIExtensionContentSession::CreateJsUIExtensionContentSession(napi_env env, sptr sessionInfo, sptr uiWindow, - std::weak_ptr context, + std::weak_ptr context, std::shared_ptr& abilityResultListeners) { TAG_LOGD(AAFwkTag::UI_EXT, "start"); diff --git a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp index 8f2740b0168953f4987fa33f10bf279748b1174d..01d59ea2535268637eb26e09477e5cac8a7c9661 100755 --- a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp @@ -15,17 +15,26 @@ #include "ui_extension_context.h" +#include "ability_business_error.h" #include "ability_manager_client.h" +#include "configuration.h" +#include "configuration_convertor.h" #include "connection_manager.h" #include "hilog_tag_wrapper.h" #include "hitrace_meter.h" -#include "configuration_convertor.h" -#include "configuration.h" +#include "string_wrapper.h" +#ifdef SUPPORT_SCREEN +#include "ui_content.h" +#endif // SUPPORT_SCREEN namespace OHOS { namespace AbilityRuntime { const size_t UIExtensionContext::CONTEXT_TYPE_ID(std::hash {} ("UIExtensionContext")); int UIExtensionContext::ILLEGAL_REQUEST_CODE(-1); +namespace { +const std::string UIEXTENSION_TARGET_TYPE_KEY = "ability.want.params.uiExtensionTargetType"; +const std::string FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermissionFlag"; +} // namespace ErrCode UIExtensionContext::StartAbility(const AAFwk::Want &want) const { @@ -298,6 +307,56 @@ Ace::UIContent* UIExtensionContext::GetUIContent() } return window_->GetUIContent(); } + +ErrCode UIExtensionContext::StartAbilityByType(const std::string &type, + AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallback) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "call"); + auto uiContent = GetUIContent(); + if (uiContent == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null uiContent"); + return static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } + wantParam.SetParam(UIEXTENSION_TARGET_TYPE_KEY, AAFwk::String::Box(type)); + AAFwk::Want want; + want.SetParams(wantParam); + if (wantParam.HasParam(FLAG_AUTH_READ_URI_PERMISSION)) { + want.SetFlags(wantParam.GetIntParam(FLAG_AUTH_READ_URI_PERMISSION, 0)); + wantParam.Remove(FLAG_AUTH_READ_URI_PERMISSION); + } + auto window = GetWindow(); + if (window == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null window"); + return static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } + TAG_LOGI(AAFwkTag::UI_EXT, "window displayId %{public}" PRIu64, window->GetDisplayId()); + want.SetParam(AAFwk::Want::PARAM_RESV_DISPLAY_ID, static_cast(window->GetDisplayId())); + + Ace::ModalUIExtensionCallbacks callback; + if (uiExtensionCallback == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null uiExtensionCallback"); + return static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } + callback.onError = [uiExtensionCallback](int32_t arg, const std::string &str1, const std::string &str2) { + uiExtensionCallback->OnError(arg); + }; + callback.onRelease = [uiExtensionCallback](int32_t arg) { + uiExtensionCallback->OnRelease(arg); + }; + callback.onResult = [uiExtensionCallback](int32_t arg1, const OHOS::AAFwk::Want arg2) { + uiExtensionCallback->OnResult(arg1, arg2); + }; + + Ace::ModalUIExtensionConfig config; + int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config); + if (sessionId == 0) { + TAG_LOGE(AAFwkTag::UI_EXT, "createModalUIExtension failed"); + return static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } + uiExtensionCallback->SetUIContent(uiContent); + uiExtensionCallback->SetSessionId(sessionId); + return ERR_OK; +} #endif // SUPPORT_SCREEN ErrCode UIExtensionContext::OpenAtomicService(AAFwk::Want& want, const AAFwk::StartOptions &options, int requestCode, RuntimeTask &&task) @@ -356,7 +415,7 @@ void UIExtensionContext::SetAbilityConfiguration(const AppExecFwk::Configuration { if (!abilityConfiguration_) { abilityConfiguration_ = std::make_shared(config); - TAG_LOGI(AAFwkTag::CONTEXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str()); + TAG_LOGI(AAFwkTag::UI_EXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str()); return; } std::vector changeKeyV; @@ -364,14 +423,14 @@ void UIExtensionContext::SetAbilityConfiguration(const AppExecFwk::Configuration if (!changeKeyV.empty()) { abilityConfiguration_->Merge(changeKeyV, config); } - TAG_LOGI(AAFwkTag::CONTEXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str()); + TAG_LOGI(AAFwkTag::UI_EXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str()); } void UIExtensionContext::SetAbilityColorMode(int32_t colorMode) { - TAG_LOGI(AAFwkTag::CONTEXT, "SetAbilityColorMode colorMode: %{public}d", colorMode); + TAG_LOGI(AAFwkTag::UI_EXT, "SetAbilityColorMode colorMode: %{public}d", colorMode); if (colorMode < -1 || colorMode > 1) { - TAG_LOGE(AAFwkTag::CONTEXT, "colorMode error"); + TAG_LOGE(AAFwkTag::UI_EXT, "colorMode error"); return; } AppExecFwk::Configuration config; @@ -380,7 +439,7 @@ void UIExtensionContext::SetAbilityColorMode(int32_t colorMode) config.AddItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP, AppExecFwk::ConfigurationInner::IS_SET_BY_APP); if (!abilityConfigUpdateCallback_) { - TAG_LOGE(AAFwkTag::CONTEXT, "abilityConfigUpdateCallback_ nullptr"); + TAG_LOGE(AAFwkTag::UI_EXT, "abilityConfigUpdateCallback_ nullptr"); return; } abilityConfigUpdateCallback_(config); diff --git a/frameworks/native/ability/native/ui_extension_callback.cpp b/frameworks/native/ability/native/ui_extension_callback.cpp new file mode 100644 index 0000000000000000000000000000000000000000..27ed2f024192ee05fd4c52f41f996aef54953b09 --- /dev/null +++ b/frameworks/native/ability/native/ui_extension_callback.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "ui_extension_callback.h" + +#include "hilog_tag_wrapper.h" +#ifdef SUPPORT_SCREEN +#include "ui_content.h" +#include "ws_common.h" +#endif // SUPPORT_SCREEN + +namespace OHOS { +namespace AbilityRuntime { +void UIExtensionCallback::SetSessionId(int32_t sessionId) +{ + sessionId_ = sessionId; +} +#ifdef SUPPORT_SCREEN +void UIExtensionCallback::SetUIContent(Ace::UIContent* uiContent) +{ + uiContent_ = uiContent; +} + +void UIExtensionCallback::OnRelease(int32_t code) +{ + TAG_LOGI(AAFwkTag::UI_EXT, "call, code:%{public}d", code); + CloseModalUIExtension(); +} + +void UIExtensionCallback::CloseModalUIExtension() +{ + if (uiContent_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null uiContent_"); + return; + } + uiContent_->CloseModalUIExtension(sessionId_); +} +#endif // SUPPORT_SCREEN +} // namespace AbilityRuntime +} // namespace OHOS diff --git a/frameworks/native/ability/native/ui_service_extension_ability/js_ui_service_extension_context.cpp b/frameworks/native/ability/native/ui_service_extension_ability/js_ui_service_extension_context.cpp index 17e0b02b9e7b1ab7c16f47aadc3c99fb6acffbba..67edc1c408ca3c1db6b4880804bb9a5d8de95fdc 100644 --- a/frameworks/native/ability/native/ui_service_extension_ability/js_ui_service_extension_context.cpp +++ b/frameworks/native/ability/native/ui_service_extension_ability/js_ui_service_extension_context.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -26,6 +26,7 @@ #include "js_data_struct_converter.h" #include "js_runtime.h" #include "js_runtime_utils.h" +#include "js_ui_extension_callback.h" #include "napi/native_api.h" #include "napi_common_ability.h" #include "napi_common_want.h" diff --git a/frameworks/native/appkit/ability_runtime/ui_service_extension_context.cpp b/frameworks/native/appkit/ability_runtime/ui_service_extension_context.cpp index 387960c65dfcf1d0ff8bb6bf47ae86ad0fa7d551..b0291d602bb236fd075ccb053611906ba69c88c4 100644 --- a/frameworks/native/appkit/ability_runtime/ui_service_extension_context.cpp +++ b/frameworks/native/appkit/ability_runtime/ui_service_extension_context.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -75,11 +75,11 @@ Ace::UIContent* UIServiceExtensionContext::GetUIContent() } ErrCode UIServiceExtensionContext::StartAbilityByType(const std::string &type, - AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallbacks) + AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallback) { TAG_LOGD(AAFwkTag::UISERVC_EXT, "StartAbilityByType begin."); - if (uiExtensionCallbacks == nullptr) { - TAG_LOGE(AAFwkTag::UISERVC_EXT, "null uiExtensionCallbacks"); + if (uiExtensionCallback == nullptr) { + TAG_LOGE(AAFwkTag::UISERVC_EXT, "null uiExtensionCallback"); return ERR_INVALID_VALUE; } auto uiContent = GetUIContent(); @@ -98,14 +98,14 @@ ErrCode UIServiceExtensionContext::StartAbilityByType(const std::string &type, OHOS::Ace::ModalUIExtensionCallbacks callback; OHOS::Ace::ModalUIExtensionConfig config; - callback.onError = [uiExtensionCallbacks](int32_t arg, const std::string &str1, const std::string &str2) { - uiExtensionCallbacks->OnError(arg); + callback.onError = [uiExtensionCallback](int32_t arg, const std::string &str1, const std::string &str2) { + uiExtensionCallback->OnError(arg); }; - callback.onRelease = [uiExtensionCallbacks](int32_t arg) { - uiExtensionCallbacks->OnRelease(arg); + callback.onRelease = [uiExtensionCallback](int32_t arg) { + uiExtensionCallback->OnRelease(arg); }; - callback.onResult = [uiExtensionCallbacks](int32_t arg1, const OHOS::AAFwk::Want arg2) { - uiExtensionCallbacks->OnResult(arg1, arg2); + callback.onResult = [uiExtensionCallback](int32_t arg1, const OHOS::AAFwk::Want arg2) { + uiExtensionCallback->OnResult(arg1, arg2); }; int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config); @@ -113,8 +113,8 @@ ErrCode UIServiceExtensionContext::StartAbilityByType(const std::string &type, TAG_LOGE(AAFwkTag::UISERVC_EXT, "sessionId zero"); return ERR_INVALID_VALUE; } - uiExtensionCallbacks->SetUIContent(uiContent); - uiExtensionCallbacks->SetSessionId(sessionId); + uiExtensionCallback->SetUIContent(uiContent); + uiExtensionCallback->SetSessionId(sessionId); return ERR_OK; } diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context.h b/interfaces/kits/native/ability/ability_runtime/ability_context.h index a274c05424e01254e5fb1e46ff3b9f63b79b234f..468368a5917e715daac5f85354ee8537e37940e8 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context.h @@ -23,7 +23,7 @@ #include "context.h" #include "free_install_observer_interface.h" #include "iability_callback.h" -#include "js_ui_extension_callback.h" +#include "ui_extension_callback.h" #include "mission_info.h" #include "native_engine/native_reference.h" #include "native_engine/native_value.h" @@ -429,7 +429,7 @@ public: */ virtual Ace::UIContent* GetUIContent() = 0; virtual ErrCode StartAbilityByType(const std::string &type, AAFwk::WantParams &wantParam, - const std::shared_ptr &uiExtensionCallbacks) = 0; + const std::shared_ptr &uiExtensionCallback) = 0; virtual ErrCode CreateModalUIExtensionWithApp(const AAFwk::Want &want) = 0; virtual void EraseUIExtension(int32_t sessionId) = 0; #endif diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h index c7be7990b6c03e235a8420976c977ed8a75b50ab..3be54e97a6993258c1e0fa2b6dac811c2cfb214f 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2021-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -232,7 +232,7 @@ public: ErrCode SetMissionContinueState(const AAFwk::ContinueState &state) override; #ifdef SUPPORT_SCREEN ErrCode StartAbilityByType(const std::string &type, - AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallbacks) override; + AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallback) override; #endif ErrCode RequestModalUIExtension(const Want &want) override; diff --git a/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h b/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h index b174b1cfa603c29dc9194e01fa78b035c52f7cbd..8b957c83c644329b6fdfb103e7ec3f430de6dd6f 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h +++ b/interfaces/kits/native/ability/native/ability_runtime/sts_ability_context.h @@ -50,8 +50,8 @@ public: static void TerminateSelfWithResult(ani_env *env, ani_object aniObj, ani_object abilityResult, ani_object callback); static void reportDrawnCompletedSync( [[maybe_unused]] ani_env *env, [[maybe_unused]] ani_object aniObj, ani_object call); - static ani_object StartAbilityByTypeSync([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object aniObj, - ani_string aniType, ani_ref aniWantParam, ani_object startCallback); + static ani_object StartAbilityByTypeSync( + ani_env *env, ani_object aniObj, ani_string aniType, ani_ref aniWantParam, ani_object startCallback); static ani_object SetAbilityContext(ani_env *env, const std::shared_ptr &context); static std::shared_ptr GetAbilityContext(ani_env *env, ani_object aniObj); diff --git a/interfaces/kits/native/ability/native/ets_ui_extension_callback.h b/interfaces/kits/native/ability/native/ets_ui_extension_callback.h new file mode 100644 index 0000000000000000000000000000000000000000..fc3a277f43d25265fa94785db47146f772f9b964 --- /dev/null +++ b/interfaces/kits/native/ability/native/ets_ui_extension_callback.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_ABILITY_RUNTIME_ETS_UI_EXTENSION_CALLBACK_H +#define OHOS_ABILITY_RUNTIME_ETS_UI_EXTENSION_CALLBACK_H + +#include "ui_extension_callback.h" +#include + +namespace OHOS { +namespace AbilityRuntime { +class EtsUIExtensionCallback : public UIExtensionCallback { +public: + explicit EtsUIExtensionCallback(ani_vm *vm) : vm_(vm) {} + ~EtsUIExtensionCallback() override; + void OnError(int32_t number) override; + void OnResult(int32_t resultCode, const AAFwk::Want &want) override; + void SetEtsCallbackObject(ani_object aniObject); + +private: + ani_env *GetAniEnv(); + + ani_vm *vm_ = nullptr; + ani_ref callback_ = nullptr; +}; +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_ETS_UI_EXTENSION_CALLBACK_H \ No newline at end of file diff --git a/interfaces/kits/native/ability/native/js_ui_extension_callback.h b/interfaces/kits/native/ability/native/js_ui_extension_callback.h index 9174601b844d6ea6b2bf76e7c6c77f2081f14091..17f7ddcb5dd7bf4bab9f563446155076741925d2 100644 --- a/interfaces/kits/native/ability/native/js_ui_extension_callback.h +++ b/interfaces/kits/native/ability/native/js_ui_extension_callback.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,32 +16,24 @@ #ifndef OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CALLBACK_H #define OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_CALLBACK_H -#include +#include "ui_extension_callback.h" #include "native_engine/native_reference.h" -#include "want.h" namespace OHOS { -namespace Ace { -class UIContent; -} namespace AbilityRuntime { -class JsUIExtensionCallback : public std::enable_shared_from_this { +class JsUIExtensionCallback : public UIExtensionCallback, + public std::enable_shared_from_this { public: explicit JsUIExtensionCallback(napi_env env) : env_(env) {} - ~JsUIExtensionCallback(); - void OnError(int32_t number); - void OnRelease(int32_t code); - void OnResult(int32_t resultCode, const AAFwk::Want &want); + ~JsUIExtensionCallback() override; + void OnError(int32_t number) override; + void OnResult(int32_t resultCode, const AAFwk::Want &want) override; void CallJsResult(int32_t resultCode, const AAFwk::Want &want); void SetJsCallbackObject(napi_value jsCallbackObject); void CallJsError(int32_t number); - void SetSessionId(int32_t sessionId); - void SetUIContent(Ace::UIContent* uiContent); private: napi_env env_ = nullptr; std::unique_ptr jsCallbackObject_ = nullptr; - int32_t sessionId_ = 0; - Ace::UIContent* uiContent_ = nullptr; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_content_session.h b/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_content_session.h index 581917295a2f0348d6df0960cd52c117e6219975..2540959491221c0b44860a0416a0ee2c31c7cf75 100644 --- a/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_content_session.h +++ b/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_content_session.h @@ -22,6 +22,7 @@ #include "js_runtime_utils.h" #include "session_info.h" #include "start_options.h" +#include "ui_extension_context.h" #include "window.h" namespace OHOS { @@ -45,7 +46,7 @@ private: class CallbackWrapper; public: JsUIExtensionContentSession(sptr sessionInfo, - sptr uiWindow, std::weak_ptr& context, + sptr uiWindow, std::weak_ptr& context, std::shared_ptr& abilityResultListeners); JsUIExtensionContentSession(sptr sessionInfo, sptr uiWindow); @@ -53,7 +54,7 @@ public: static void Finalizer(napi_env env, void* data, void* hint); static napi_value CreateJsUIExtensionContentSession(napi_env env, sptr sessionInfo, sptr uiWindow, - std::weak_ptr context, + std::weak_ptr context, std::shared_ptr& abilityResultListeners); static napi_value CreateJsUIExtensionContentSession(napi_env env, sptr sessionInfo, sptr uiWindow); @@ -109,7 +110,7 @@ protected: private: sptr sessionInfo_; sptr uiWindow_; - std::weak_ptr context_; + std::weak_ptr context_; std::shared_ptr receiveDataCallback_; bool isRegistered = false; std::shared_ptr receiveDataForResultCallback_; diff --git a/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h b/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h index 22edfab445adc06ef069a62e07f592e29feb9355..c3862fa7587522eb2560adca9f33df24e530ee94 100755 --- a/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023-2024 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -22,6 +22,7 @@ #include "extension_context.h" #include "free_install_observer_interface.h" #include "start_options.h" +#include "ui_extension_callback.h" #include "ui_holder_extension_context.h" #include "want.h" #ifdef SUPPORT_SCREEN @@ -164,6 +165,8 @@ public: sptr GetWindow(); Ace::UIContent* GetUIContent() override; + ErrCode StartAbilityByType(const std::string &type, AAFwk::WantParams &wantParam, + const std::shared_ptr &uiExtensionCallback); #endif // SUPPORT_SCREEN ErrCode OpenLink(const AAFwk::Want& want, int reuqestCode); diff --git a/interfaces/kits/native/ability/native/sts_ui_extension_callback.h b/interfaces/kits/native/ability/native/ui_extension_callback.h similarity index 49% rename from interfaces/kits/native/ability/native/sts_ui_extension_callback.h rename to interfaces/kits/native/ability/native/ui_extension_callback.h index 36d28119228f9f80ed8faa0921860cf79315803b..5f74ad3970b4bce8098637f326b81b2c5828f31a 100644 --- a/interfaces/kits/native/ability/native/sts_ui_extension_callback.h +++ b/interfaces/kits/native/ability/native/ui_extension_callback.h @@ -13,37 +13,31 @@ * limitations under the License. */ -#ifndef OHOS_ABILITY_RUNTIME_STS_UI_EXTENSION_CALLBACK_H -#define OHOS_ABILITY_RUNTIME_STS_UI_EXTENSION_CALLBACK_H +#ifndef OHOS_ABILITY_RUNTIME_UI_EXTENSION_CALLBACK_H +#define OHOS_ABILITY_RUNTIME_UI_EXTENSION_CALLBACK_H -#include "js_ui_extension_callback.h" -#include "sts_runtime.h" +#include +#include "want.h" namespace OHOS { namespace Ace { class UIContent; } namespace AbilityRuntime { -class StsUIExtensionCallback : public JsUIExtensionCallback, - public std::enable_shared_from_this { +class UIExtensionCallback { public: - StsUIExtensionCallback(); - virtual ~StsUIExtensionCallback(); - virtual void OnError(int32_t number); - virtual void OnRelease(int32_t code); - virtual void OnResult(int32_t resultCode, const AAFwk::Want &want); - virtual void SetSessionId(int32_t sessionId); - virtual void SetUIContent(Ace::UIContent* uiContent); - virtual void SetStsCallbackObject(ani_vm* aniVM, ani_object aniObject); - -private: - ani_env* GetAniEnv(); + UIExtensionCallback() = default; + virtual ~UIExtensionCallback() = default; + virtual void OnError(int32_t number) = 0; + virtual void OnResult(int32_t resultCode, const AAFwk::Want &want) = 0; + void OnRelease(int32_t code); + void SetSessionId(int32_t sessionId); + void SetUIContent(Ace::UIContent *uiContent); void CloseModalUIExtension(); - ani_vm* aniVM_ = nullptr; - ani_ref startAbilityAniCallback_ = nullptr; - int32_t aniSessionId_ = 0; - Ace::UIContent* aniUIContent_ = nullptr; +private: + int32_t sessionId_ = 0; + Ace::UIContent *uiContent_ = nullptr; }; } // namespace AbilityRuntime } // namespace OHOS -#endif // OHOS_ABILITY_RUNTIME_STS_UI_EXTENSION_CALLBACK_H \ No newline at end of file +#endif // OHOS_ABILITY_RUNTIME_UI_EXTENSION_CALLBACK_H diff --git a/interfaces/kits/native/ability/native/ui_service_extension_ability/ui_service_extension_context.h b/interfaces/kits/native/ability/native/ui_service_extension_ability/ui_service_extension_context.h index 8891e9896820735de0f32ac3d3fc8b94365225fa..ec18d6ebe799480fa7c4fc31a30caec9b3a4e9bf 100644 --- a/interfaces/kits/native/ability/native/ui_service_extension_ability/ui_service_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_service_extension_ability/ui_service_extension_context.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -69,7 +69,7 @@ public: * @return errCode ERR_OK on success, others on failure. */ ErrCode StartAbilityByType(const std::string &type, - AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallbacks); + AAFwk::WantParams &wantParam, const std::shared_ptr &uiExtensionCallback); /** * @brief Connects the current ServiceExtensionAbility to an ability using