From 3cb90657518a2a3deb7d0de96bc9b229b91d954c Mon Sep 17 00:00:00 2001 From: wangkailong Date: Fri, 26 Jan 2024 11:07:04 +0800 Subject: [PATCH] half Signed-off-by: wangkailong Change-Id: Ia60f1fbdd3f86330d1d5cadffbedf26d847d1eae --- .../ability_runtime/ability_context_impl.cpp | 16 -- .../js_embeddable_ui_ability_context.cpp | 170 +++++++++--------- .../ui_extension_ability/js_ui_extension.cpp | 64 ++++--- .../js_ui_extension_context.cpp | 5 - .../ui_extension_ability/js_ui_extension.h | 4 + .../src/ability_manager_service.cpp | 5 +- 6 files changed, 135 insertions(+), 129 deletions(-) diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index 0c0693c65bf..2cdefe66a85 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -145,22 +145,6 @@ ErrCode AbilityContextImpl::StartAbility(const AAFwk::Want& want, int requestCod { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); HILOG_DEBUG("StartAbility"); - int32_t screenMode = want.GetIntParam(AAFwk::SCREEN_MODE_KEY, AAFwk::IDLE_SCREEN_MODE); - if (screenMode == AAFwk::HALF_SCREEN_MODE) { - auto uiContent = GetUIContent(); - if (uiContent == nullptr) { - HILOG_ERROR("uiContent is nullptr"); - return ERR_INVALID_VALUE; - } - Ace::ModalUIExtensionCallbacks callback; - Ace::ModalUIExtensionConfig config; - int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config); - if (sessionId == 0) { - HILOG_ERROR("CreateModalUIExtension failed"); - return ERR_INVALID_VALUE; - } - return ERR_OK; - } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode); if (err != ERR_OK) { HILOG_ERROR("StartAbility. ret=%{public}d", err); diff --git a/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp b/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp index 2549901dc57..62060c97e5b 100644 --- a/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_embeddable_ui_ability_context.cpp @@ -36,14 +36,14 @@ namespace OHOS { namespace AbilityRuntime { -#define CHECK_POINTER_RETURN(object) \ +#define CHECK_POINTER_RETURN(env, object) \ if (!(object)) { \ HILOG_ERROR("Context is nullptr"); \ - return nullptr; \ + return CreateJsUndefined(env); \ } namespace { -const std::string ERR_MSG_NOT_SUPPORT = "Not support the interface in half screen mode of atomic service."; +const std::string ERR_MSG_NOT_SUPPORT = "Not support the interface in embedded screen mode of atomic service."; } JsEmbeddableUIAbilityContext::JsEmbeddableUIAbilityContext(const std::shared_ptr& uiAbiContext, @@ -172,243 +172,243 @@ napi_value JsEmbeddableUIAbilityContext::StartAbilityByType(napi_env env, napi_c napi_value JsEmbeddableUIAbilityContext::OnStartAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability in half screen mode."); - CHECK_POINTER_RETURN(jsUIExtensionContext_); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("Start ability in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); return jsUIExtensionContext_->OnStartAbility(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability for result in half screen mode."); - CHECK_POINTER_RETURN(jsUIExtensionContext_); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("Start ability for result in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); return jsUIExtensionContext_->OnStartAbilityForResult(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityForResult(env, info); } napi_value JsEmbeddableUIAbilityContext::OnConnectAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Connect ability in half screen mode."); - CHECK_POINTER_RETURN(jsUIExtensionContext_); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("Connect ability in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); return jsUIExtensionContext_->OnConnectAbility(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnConnectAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Disconnect ability in half screen mode."); - CHECK_POINTER_RETURN(jsUIExtensionContext_); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("Disconnect ability in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); return jsUIExtensionContext_->OnDisconnectAbility(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnDisconnectAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnTerminateSelf(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Terminate self in half screen mode."); - ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); - return CreateJsUndefined(env); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("TerminateSelf in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); + return jsUIExtensionContext_->OnTerminateSelf(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnTerminateSelf(env, info); } napi_value JsEmbeddableUIAbilityContext::OnTerminateSelfWithResult(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Terminate self with result in half screen mode."); - ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); - return CreateJsUndefined(env); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_INFO("TerminateSelfWithResult ability in embedded screen mode."); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); + return jsUIExtensionContext_->OnTerminateSelfWithResult(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnTerminateSelfWithResult(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityAsCaller(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability as caller in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start ability as caller in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityAsCaller(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityWithAccount(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability with account in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start ability with account in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityWithAccount(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityByCall(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability by caller in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start ability by caller in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityByCall(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityForResultWithAccount(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability for result in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start ability for result in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityForResultWithAccount(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartExtensionAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start extension in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start extension in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartExtensionAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartExtensionAbilityWithAccount(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start extensionin with account in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start extensionin with account in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartExtensionAbilityWithAccount(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStopExtensionAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Stop extensionin in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Stop extensionin in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStopExtensionAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStopExtensionAbilityWithAccount(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Stop extensionin with account in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Stop extensionin with account in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStopExtensionAbilityWithAccount(env, info); } napi_value JsEmbeddableUIAbilityContext::OnConnectAbilityWithAccount(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Connect ability with account in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Connect ability with account in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnConnectAbilityWithAccount(env, info); } napi_value JsEmbeddableUIAbilityContext::OnRestoreWindowStage(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Restore window stage with account in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Restore window stage with account in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnRestoreWindowStage(env, info); } napi_value JsEmbeddableUIAbilityContext::OnIsTerminating(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Get terminating state in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Get terminating state in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnIsTerminating(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartRecentAbility(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start recent ability in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start recent ability in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartRecentAbility(env, info); } napi_value JsEmbeddableUIAbilityContext::OnRequestDialogService(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Request dialog service in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Request dialog service in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnRequestDialogService(env, info); } napi_value JsEmbeddableUIAbilityContext::OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { HILOG_INFO("Report Drawn Completed in half screen mode."); - CHECK_POINTER_RETURN(jsUIExtensionContext_); + CHECK_POINTER_RETURN(env, jsUIExtensionContext_); return jsUIExtensionContext_->OnReportDrawnCompleted(env, info); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnReportDrawnCompleted(env, info); } napi_value JsEmbeddableUIAbilityContext::OnSetMissionContinueState(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Set mission continue state in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Set mission continue state in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnSetMissionContinueState(env, info); } napi_value JsEmbeddableUIAbilityContext::OnStartAbilityByType(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Start ability by type in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Start ability by type in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnStartAbilityByType(env, info); } @@ -427,23 +427,23 @@ napi_value JsEmbeddableUIAbilityContext::SetMissionIcon(napi_env env, napi_callb napi_value JsEmbeddableUIAbilityContext::OnSetMissionLabel(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Set mission label in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Set mission label in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnSetMissionLabel(env, info); } napi_value JsEmbeddableUIAbilityContext::OnSetMissionIcon(napi_env env, NapiCallbackInfo& info) { - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { - HILOG_INFO("Set mission icon in half screen mode."); + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + HILOG_ERROR("Set mission icon in embedded screen mode."); ThrowError(env, static_cast(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT); return CreateJsUndefined(env); } - CHECK_POINTER_RETURN(jsAbilityContext_); + CHECK_POINTER_RETURN(env, jsAbilityContext_); return jsAbilityContext_->OnSetMissionIcon(env, info); } #endif @@ -499,9 +499,9 @@ napi_value JsEmbeddableUIAbilityContext::CreateJsEmbeddableUIAbilityContext(napi { HILOG_DEBUG("Create JS embeddable UIAbility context begin."); napi_value objValue = nullptr; - if (screenMode == AAFwk::FULL_SCREEN_MODE) { + if (screenMode == AAFwk::JUMP_SCREEN_MODE) { WrapJsUIAbilityContext(env, uiAbiContext, objValue, screenMode); - } else if (screenMode == AAFwk::HALF_SCREEN_MODE) { + } else if (screenMode == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { WrapJsUIExtensionContext(env, uiExtContext, objValue, screenMode); } diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index c48efb55681..2cdfd5645b3 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -28,6 +28,7 @@ #include "insight_intent_executor_mgr.h" #include "int_wrapper.h" #include "js_embeddable_ui_ability_context.h" +#include "js_embeddable_window_stage.h" #include "js_extension_common.h" #include "js_extension_context.h" #include "js_runtime.h" @@ -653,19 +654,10 @@ bool JsUIExtension::HandleSessionCreate(const AAFwk::Want &want, const sptruiExtensionComponentId, want.GetElement().GetURI().c_str()); - auto componentId = sessionInfo->uiExtensionComponentId; - if (uiWindowMap_.find(componentId) == uiWindowMap_.end()) { - sptr option = new Rosen::WindowOption(); + auto compId = sessionInfo->uiExtensionComponentId; + if (uiWindowMap_.find(compId) == uiWindowMap_.end()) { auto context = GetContext(); - if (context == nullptr || context->GetAbilityInfo() == nullptr) { - HILOG_ERROR("Failed to get context"); - return false; - } - option->SetWindowName(context->GetBundleName() + context->GetAbilityInfo()->name); - option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION); - option->SetWindowSessionType(Rosen::WindowSessionType::EXTENSION_SESSION); - option->SetParentId(sessionInfo->hostWindowId); - auto uiWindow = Rosen::Window::Create(option, GetContext(), sessionInfo->sessionToken); + auto uiWindow = CreateUIWindow(context, sessionInfo); if (uiWindow == nullptr) { HILOG_ERROR("create ui window error."); return false; @@ -674,21 +666,25 @@ bool JsUIExtension::HandleSessionCreate(const AAFwk::Want &want, const sptr(reinterpret_cast(ref))); + contentSessions_.emplace(compId, std::shared_ptr(reinterpret_cast(ref))); int32_t screenMode = want.GetIntParam(AAFwk::SCREEN_MODE_KEY, AAFwk::IDLE_SCREEN_MODE); - if (screenMode == AAFwk::HALF_SCREEN_MODE) { - screenMode_ = AAFwk::HALF_SCREEN_MODE; - napi_value argv[] = {nullptr}; + if (screenMode == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { + screenMode_ = AAFwk::EMBEDDED_FULL_SCREEN_MODE; + auto jsAppWindowStage = CreateAppWindowStage(uiWindow, sessionInfo); + if (jsAppWindowStage == nullptr) { + HILOG_ERROR("JsAppWindowStage is nullptr."); + return false; + } + napi_value argv[] = {jsAppWindowStage->GetNapiValue()}; CallObjectMethod("onWindowStageCreate", argv, ARGC_ONE); } else { napi_value argv[] = {napiWant, nativeContentSession}; CallObjectMethod("onSessionCreate", argv, ARGC_TWO); } - uiWindowMap_[componentId] = uiWindow; + uiWindowMap_[compId] = uiWindow; if (context->GetWindow() == nullptr) { context->SetWindow(uiWindow); } @@ -696,6 +692,34 @@ bool JsUIExtension::HandleSessionCreate(const AAFwk::Want &want, const sptr JsUIExtension::CreateUIWindow(const std::shared_ptr context, + const sptr &sessionInfo) +{ + sptr option = new (std::nothrow) Rosen::WindowOption(); + if (context == nullptr || context->GetAbilityInfo() == nullptr) { + HILOG_ERROR("Failed to get context"); + return nullptr; + } + option->SetWindowName(context->GetBundleName() + context->GetAbilityInfo()->name); + option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION); + option->SetWindowSessionType(Rosen::WindowSessionType::EXTENSION_SESSION); + option->SetParentId(sessionInfo->hostWindowId); + return Rosen::Window::Create(option, GetContext(), sessionInfo->sessionToken); +} + +std::unique_ptr JsUIExtension::CreateAppWindowStage(sptr uiWindow, + sptr sessionInfo) +{ + auto env = jsRuntime_.GetNapiEnv(); + napi_value jsWindowStage = Rosen::JsEmbeddableWindowStage::CreateJsEmbeddableWindowStage( + env, uiWindow, sessionInfo); + if (jsWindowStage == nullptr) { + HILOG_ERROR("Failed to create jsWindowSatge object"); + return nullptr; + } + return JsRuntime::LoadSystemModuleByEngine(env, "application.extensionWindow", &jsWindowStage, 1); +} + void JsUIExtension::ForegroundWindow(const AAFwk::Want &want, const sptr &sessionInfo) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); @@ -751,7 +775,7 @@ void JsUIExtension::DestroyWindow(const sptr &sessionInfo) } if (contentSessions_.find(componentId) != contentSessions_.end() && contentSessions_[componentId] != nullptr) { HandleScope handleScope(jsRuntime_); - if (screenMode_ == AAFwk::HALF_SCREEN_MODE) { + if (screenMode_ == AAFwk::EMBEDDED_FULL_SCREEN_MODE) { screenMode_ = AAFwk::IDLE_SCREEN_MODE; CallObjectMethod("onWindowStageDestroy"); } else { diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp index 39b7bf88211..a5b511e6470 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_context.cpp @@ -166,11 +166,6 @@ napi_value JsUIExtensionContext::OnStartAbility(napi_env env, NapiCallbackInfo& return CreateJsUndefined(env); } - if (want.GetIntParam(AAFwk::SCREEN_MODE_KEY, AAFwk::IDLE_SCREEN_MODE) == AAFwk::HALF_SCREEN_MODE) { - HILOG_ERROR("Not support half screen pulling up half screen"); - return CreateJsUndefined(env); - } - NapiAsyncTask::CompleteCallback complete = [weak = context_, want, startOptions, unwrapArgc](napi_env env, NapiAsyncTask& task, int32_t status) { HILOG_DEBUG("startAbility begin"); diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h index 2286f900230..97f21207ff8 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h @@ -207,6 +207,10 @@ private: const AppExecFwk::InsightIntentExecuteResult &result) override; void PostInsightIntentExecuted(const sptr &sessionInfo, const AppExecFwk::InsightIntentExecuteResult &result, bool needForeground); + std::unique_ptr CreateAppWindowStage(sptr uiWindow, + sptr sessionInfo); + sptr CreateUIWindow(const std::shared_ptr context, + const sptr &sessionInfo); JsRuntime& jsRuntime_; std::unique_ptr jsObj_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index d90f80999e3..93dfe5f691a 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -1684,7 +1684,7 @@ int32_t AbilityManagerService::OpenAtomicService(AAFwk::Want& want, sptr