diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index abd0a400e57779e337c4fff5121b47092ad75504..d42e5bc95684cb2a8e4986c88540f30efd8b9868 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -72,6 +72,7 @@ #include "core/components_ng/pattern/text_field/text_field_manager.h" #include "core/components_ng/render/adapter/form_render_window.h" #include "core/components_ng/render/adapter/rosen_window.h" +#include "core/pipeline/pipeline_base.h" #include "core/pipeline/pipeline_context.h" #include "core/pipeline_ng/pipeline_context.h" @@ -1761,6 +1762,17 @@ NG::SafeAreaInsets AceContainer::GetKeyboardSafeArea() return {}; } +Rosen::AvoidArea AceContainer::GetAvoidAreaByType(Rosen::AvoidAreaType type) +{ + CHECK_NULL_RETURN(uiWindow_, {}); + Rosen::AvoidArea avoidArea; + Rosen::WMError ret = uiWindow_->GetAvoidAreaByType(type, avoidArea); + if (ret == Rosen::WMError::WM_OK) { + return avoidArea; + } + return {}; +} + std::shared_ptr AceContainer::GetAbilityContextByModule( const std::string& bundle, const std::string& module) { diff --git a/adapter/ohos/entrance/ace_container.h b/adapter/ohos/entrance/ace_container.h index 71bcf48b7bccbedcc6e5233e2ac88622eaebb06f..4b14558b979ec024566bb26cbf64fb54c67478e0 100644 --- a/adapter/ohos/entrance/ace_container.h +++ b/adapter/ohos/entrance/ace_container.h @@ -72,11 +72,10 @@ class ACE_FORCE_EXPORT AceContainer : public Container, public JsMessageDispatch DECLARE_ACE_TYPE(AceContainer, Container, JsMessageDispatcher); public: - AceContainer(int32_t instanceId, FrontendType type, - std::shared_ptr aceAbility, std::unique_ptr callback, - bool useCurrentEventRunner = false, bool useNewPipeline = false); - AceContainer(int32_t instanceId, FrontendType type, - std::weak_ptr runtimeContext, + AceContainer(int32_t instanceId, FrontendType type, std::shared_ptr aceAbility, + std::unique_ptr callback, bool useCurrentEventRunner = false, + bool useNewPipeline = false); + AceContainer(int32_t instanceId, FrontendType type, std::weak_ptr runtimeContext, std::weak_ptr abilityInfo, std::unique_ptr callback, bool useCurrentEventRunner = false, bool isSubContainer = false, bool useNewPipeline = false); @@ -458,13 +457,13 @@ public: void InitializeSubContainer(int32_t parentContainerId); static void SetDialogCallback(int32_t instanceId, FrontendDialogCallback callback); - std::shared_ptr GetAbilityContextByModule(const std::string& bundle, - const std::string& module); + std::shared_ptr GetAbilityContextByModule( + const std::string& bundle, const std::string& module); void UpdateConfiguration(const ParsedConfig& parsedConfig, const std::string& configuration); void NotifyConfigurationChange( - bool needReloadTransition, const OnConfigurationChange& configurationChange = {false, false}) override; + bool needReloadTransition, const OnConfigurationChange& configurationChange = { false, false }) override; void HotReload() override; bool IsUseStageModel() const override @@ -491,6 +490,8 @@ public: NG::SafeAreaInsets GetKeyboardSafeArea() override; + Rosen::AvoidArea GetAvoidAreaByType(Rosen::AvoidAreaType type); + // ArkTSCard void UpdateFormData(const std::string& data); void UpdateFormSharedImage(const std::map>& imageDataMap); @@ -514,25 +515,20 @@ public: bool RequestAutoSave(const RefPtr& node) override; std::shared_ptr GetNavigationController(const std::string& navigationId) override; - void SearchElementInfoByAccessibilityIdNG( - int32_t elementId, int32_t mode, int32_t baseParent, + void SearchElementInfoByAccessibilityIdNG(int32_t elementId, int32_t mode, int32_t baseParent, std::list& output); - void SearchElementInfosByTextNG( - int32_t elementId, const std::string& text, int32_t baseParent, + void SearchElementInfosByTextNG(int32_t elementId, const std::string& text, int32_t baseParent, std::list& output); void FindFocusedElementInfoNG( - int32_t elementId, int32_t focusType, int32_t baseParent, - Accessibility::AccessibilityElementInfo& output); + int32_t elementId, int32_t focusType, int32_t baseParent, Accessibility::AccessibilityElementInfo& output); void FocusMoveSearchNG( - int32_t elementId, int32_t direction, int32_t baseParent, - Accessibility::AccessibilityElementInfo& output); + int32_t elementId, int32_t direction, int32_t baseParent, Accessibility::AccessibilityElementInfo& output); bool NotifyExecuteAction( - int32_t elementId, const std::map& actionArguments, - int32_t action, int32_t offset); + int32_t elementId, const std::map& actionArguments, int32_t action, int32_t offset); private: virtual bool MaybeRelease() override; diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 5a928e9e86e3feb75bb413a782faa06076339d25..779e3f4ef2ab928ad462c6af330a425665386498 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -71,7 +71,10 @@ #include "core/common/modal_ui_extension.h" #include "core/common/recorder/event_recorder.h" #include "core/common/resource/resource_manager.h" +#include "core/components_ng/base/inspector.h" +#include "core/components_ng/base/view_abstract.h" #include "core/image/image_file_cache.h" +#include "core/pipeline_ng/pipeline_context.h" #ifdef FORM_SUPPORTED #include "core/common/form_manager.h" #endif @@ -79,9 +82,6 @@ #ifdef PLUGIN_COMPONENT_SUPPORTED #include "core/common/plugin_manager.h" #endif -#include "core/components_ng/base/inspector.h" -#include "core/components_ng/base/view_abstract.h" -#include "core/pipeline_ng/pipeline_context.h" #ifdef NG_BUILD #include "frameworks/bridge/declarative_frontend/ng/declarative_frontend_ng.h" #endif @@ -251,12 +251,14 @@ public: auto navSafeArea = navigationBar_; ContainerScope scope(instanceId_); taskExecutor->PostTask( - [pipeline, safeArea, navSafeArea, type] { + [pipeline, safeArea, navSafeArea, type, avoidArea] { if (type == Rosen::AvoidAreaType::TYPE_SYSTEM) { pipeline->UpdateSystemSafeArea(safeArea); } else { pipeline->UpdateNavSafeArea(navSafeArea); } + // for ui extension component + pipeline->UpdateOriginAvoidArea(avoidArea, static_cast(type)); }, TaskExecutor::TaskType::UI); } @@ -1569,10 +1571,9 @@ bool UIContentImpl::ProcessPointerEvent(const std::shared_ptrGetId(), container->GetWindowName().c_str(), container->GetWindowId(), - container->GetViewWidth(), container->GetViewHeight(), container->GetViewPosX(), - container->GetViewPosY()); + container->GetViewWidth(), container->GetViewHeight(), container->GetViewPosX(), container->GetViewPosY()); } - auto aceView = static_cast(container->GetView()); + auto* aceView = static_cast(container->GetView()); Platform::AceViewOhos::DispatchTouchEvent(aceView, pointerEvent); return true; } @@ -1586,7 +1587,7 @@ bool UIContentImpl::ProcessKeyEvent(const std::shared_ptr& touchEvent->GetId(), touchEvent->GetKeyCode(), touchEvent->GetKeyAction(), touchEvent->GetActionTime()); auto container = AceEngine::Get().GetContainer(instanceId_); CHECK_NULL_RETURN(container, false); - auto aceView = static_cast(container->GetView()); + auto* aceView = static_cast(container->GetView()); return Platform::AceViewOhos::DispatchKeyEvent(aceView, touchEvent); } @@ -1644,11 +1645,12 @@ void UIContentImpl::UpdateViewportConfig(const ViewportConfig& config, OHOS::Ros if (rsWindow) { pipelineContext->SetIsLayoutFullScreen( rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_FULLSCREEN); - auto isNeedAvoidWindowMode = (rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_FLOATING || - rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_SPLIT_PRIMARY || - rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_SPLIT_SECONDARY) && - (SystemProperties::GetDeviceType() == DeviceType::PHONE || - SystemProperties::GetDeviceType() == DeviceType::TABLET); + auto isNeedAvoidWindowMode = + (rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_FLOATING || + rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_SPLIT_PRIMARY || + rsWindow->GetMode() == Rosen::WindowMode::WINDOW_MODE_SPLIT_SECONDARY) && + (SystemProperties::GetDeviceType() == DeviceType::PHONE || + SystemProperties::GetDeviceType() == DeviceType::TABLET); pipelineContext->SetIsNeedAvoidWindow(isNeedAvoidWindowMode); } if (reason == OHOS::Rosen::WindowSizeChangeReason::ROTATION) { @@ -2216,16 +2218,14 @@ void UIContentImpl::ProcessFormVisibleChange(bool isVisible) } void UIContentImpl::SearchElementInfoByAccessibilityId( - int32_t elementId, int32_t mode, - int32_t baseParent, std::list& output) + int32_t elementId, int32_t mode, int32_t baseParent, std::list& output) { auto container = Platform::AceContainer::GetContainer(instanceId_); CHECK_NULL_VOID(container); container->SearchElementInfoByAccessibilityIdNG(elementId, mode, baseParent, output); } -void UIContentImpl::SearchElementInfosByText( - int32_t elementId, const std::string& text, int32_t baseParent, +void UIContentImpl::SearchElementInfosByText(int32_t elementId, const std::string& text, int32_t baseParent, std::list& output) { auto container = Platform::AceContainer::GetContainer(instanceId_); @@ -2234,8 +2234,7 @@ void UIContentImpl::SearchElementInfosByText( } void UIContentImpl::FindFocusedElementInfo( - int32_t elementId, int32_t focusType, - int32_t baseParent, Accessibility::AccessibilityElementInfo& output) + int32_t elementId, int32_t focusType, int32_t baseParent, Accessibility::AccessibilityElementInfo& output) { auto container = Platform::AceContainer::GetContainer(instanceId_); CHECK_NULL_VOID(container); @@ -2243,8 +2242,7 @@ void UIContentImpl::FindFocusedElementInfo( } void UIContentImpl::FocusMoveSearch( - int32_t elementId, int32_t direction, - int32_t baseParent, Accessibility::AccessibilityElementInfo& output) + int32_t elementId, int32_t direction, int32_t baseParent, Accessibility::AccessibilityElementInfo& output) { auto container = Platform::AceContainer::GetContainer(instanceId_); CHECK_NULL_VOID(container); @@ -2288,30 +2286,29 @@ void UIContentImpl::RemoveOldPopInfoIfExsited(bool isShowInSubWindow, int32_t no CHECK_NULL_VOID(subwindow); overlayManager = subwindow->GetOverlayManager(); } - + CHECK_NULL_VOID(overlayManager); if (overlayManager->HasPopupInfo(nodeId)) { LOGD("Target node id=%{public}d has old popup info, erase it", nodeId); overlayManager->ErasePopupInfo(nodeId); } } - -RefPtr UIContentImpl::CreateCustomPopupParam( - bool isShow, const CustomPopupUIExtensionConfig& config) + +RefPtr UIContentImpl::CreateCustomPopupParam(bool isShow, const CustomPopupUIExtensionConfig& config) { auto popupParam = AceType::MakeRefPtr(); popupParam->SetIsShow(isShow); popupParam->SetUseCustomComponent(true); popupParam->SetShowInSubWindow(config.isShowInSubWindow); - + if (config.isAutoCancel.has_value()) { popupParam->SetHasAction(!config.isAutoCancel.value()); } - + if (config.isEnableArrow.has_value()) { popupParam->SetEnableArrow(config.isEnableArrow.value()); } - + if (config.targetOffset.has_value()) { PopupOffset targetOffset = config.targetOffset.value(); DimensionUnit unit = static_cast(targetOffset.unit); @@ -2321,61 +2318,58 @@ RefPtr UIContentImpl::CreateCustomPopupParam( popupParam->SetTargetOffset(Offset(dx.ConvertToPx(), dy.ConvertToPx())); } } - + if (config.targetSpace.has_value()) { PopupLength targetSpace = config.targetSpace.value(); DimensionUnit unit = static_cast(targetSpace.unit); popupParam->SetTargetSpace(CalcDimension(targetSpace.length, unit)); } - + if (config.arrowOffset.has_value()) { PopupLength arrowOffset = config.arrowOffset.value(); DimensionUnit unit = static_cast(arrowOffset.unit); popupParam->SetArrowOffset(CalcDimension(arrowOffset.length, unit)); } - + if (config.placement.has_value()) { popupParam->SetPlacement(static_cast(config.placement.value())); } - + if (config.backgroundColor.has_value()) { popupParam->SetBackgroundColor(Color(config.backgroundColor.value())); } - + if (config.maskColor.has_value()) { popupParam->SetMaskColor(Color(config.maskColor.value())); } return popupParam; } - -void UIContentImpl::OnPopupStateChange(const std::string& event, - const CustomPopupUIExtensionConfig& config, int32_t nodeId) + +void UIContentImpl::OnPopupStateChange( + const std::string& event, const CustomPopupUIExtensionConfig& config, int32_t nodeId) { if (config.onStateChange) { config.onStateChange(event); } - + auto visible = JsonUtil::ParseJsonString(event); CHECK_NULL_VOID(visible); bool isVisible = visible->GetBool("isVisible"); if (isVisible) { return; } - + LOGD("Created custom popup is invisible"); ContainerScope scope(instanceId_); auto taskExecutor = Container::CurrentTaskExecutor(); CHECK_NULL_VOID(taskExecutor); - taskExecutor->PostDelayedTask( - [config, nodeId]() { - RemoveOldPopInfoIfExsited(config.isShowInSubWindow, nodeId); - }, + taskExecutor->PostDelayedTask([config, nodeId]() { RemoveOldPopInfoIfExsited(config.isShowInSubWindow, nodeId); }, TaskExecutor::TaskType::UI, 100); // delay 100ms customPopupConfigMap_.erase(nodeId); } - -int32_t UIContentImpl::CreateCustomPopupUIExtension(const AAFwk::Want& want, - const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config) + +int32_t UIContentImpl::CreateCustomPopupUIExtension( + const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config) { ContainerScope scope(instanceId_); auto taskExecutor = Container::CurrentTaskExecutor(); @@ -2392,7 +2386,7 @@ int32_t UIContentImpl::CreateCustomPopupUIExtension(const AAFwk::Want& want, LOGW("Nodeid=%{public}d has unclosed popup, cannot create new", targetNode->GetId()); return; } - + auto popupParam = CreateCustomPopupParam(true, config); auto uiExtNode = ModalUIExtension::Create(want, callbacks); if (config.targetSize.has_value()) { @@ -2406,10 +2400,9 @@ int32_t UIContentImpl::CreateCustomPopupUIExtension(const AAFwk::Want& want, } uiExtNode->MarkModifyDone(); nodeId = targetNode->GetId(); - popupParam->SetOnStateChange([config, nodeId, this](const std::string& event) { - this->OnPopupStateChange(event, config, nodeId); - }); - + popupParam->SetOnStateChange( + [config, nodeId, this](const std::string& event) { this->OnPopupStateChange(event, config, nodeId); }); + NG::ViewAbstract::BindPopup(popupParam, targetNode, AceType::DynamicCast(uiExtNode)); customPopupConfigMap_[nodeId] = config; }, @@ -2417,7 +2410,7 @@ int32_t UIContentImpl::CreateCustomPopupUIExtension(const AAFwk::Want& want, LOGI("Create custom popup with UIExtension end, nodeId=%{public}d", nodeId); return nodeId; } - + void UIContentImpl::DestroyCustomPopupUIExtension(int32_t nodeId) { LOGI("Destroy custom popup start, nodeId=%{public}d", nodeId); @@ -2434,8 +2427,8 @@ void UIContentImpl::DestroyCustomPopupUIExtension(int32_t nodeId) auto config = popupConfig->second; taskExecutor->PostTask( [container, nodeId, config, this]() { - auto targetNode = AceType::DynamicCast( - ElementRegister::GetInstance()->GetUINodeById(nodeId)); + auto targetNode = + AceType::DynamicCast(ElementRegister::GetInstance()->GetUINodeById(nodeId)); CHECK_NULL_VOID(targetNode); auto popupParam = CreateCustomPopupParam(false, config); NG::ViewAbstract::BindPopup(popupParam, targetNode, nullptr); diff --git a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper.h b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper.h index d1cdc6b69dbf9223a2d0511dd35d8928178ce935..47a32191714bcc6db13913f0c874985a941e1af1 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper.h +++ b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper.h @@ -33,6 +33,7 @@ class AxisEvent; namespace Rosen { class RSSurfaceNode; +class AvoidArea; } // namespace Rosen namespace AAFwk { @@ -103,6 +104,9 @@ public: // The interface to send the data for ArkTS virtual void SendDataAsync(const AAFwk::WantParams& params) const = 0; virtual int32_t SendDataSync(const AAFwk::WantParams& wantParams, AAFwk::WantParams& reWantParams) const = 0; + + // The interface to control the avoid area + virtual void NotifyOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) const = 0; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_SESSION_WRAPPER_H diff --git a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.cpp b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.cpp index c8f773bf4b72fa178ff75f54fa4f4c396aaf4202..34c1799585f49f3527131b2863a02e973f9d5958 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.cpp +++ b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.cpp @@ -18,8 +18,10 @@ #include #include "accessibility_event_info.h" +#include "refbase.h" #include "session_manager/include/extension_session_manager.h" #include "ui/rs_surface_node.h" +#include "wm/wm_common.h" #include "adapter/ohos/entrance/ace_container.h" #include "adapter/ohos/osal/want_wrap_ohos.h" @@ -86,8 +88,7 @@ public: TaskExecutor::TaskType::UI); } - void OnAccessibilityEvent( - const Accessibility::AccessibilityEventInfo& info, int32_t uiExtensionOffset) override + void OnAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, int32_t uiExtensionOffset) override { ContainerScope scope(instanceId_); auto pipeline = PipelineBase::GetCurrentContext(); @@ -212,6 +213,21 @@ void SessionWrapperImpl::InitAllCallback() }, TaskExecutor::TaskType::UI); }; + sessionCallbacks->notifyGetAvoidAreaByTypeFunc_ = [weak = hostPattern_, taskExecutor]( + Rosen::AvoidAreaType type) -> Rosen::AvoidArea { + Rosen::AvoidArea avoidArea; + taskExecutor->PostSyncTask( + [weak, &avoidArea, type]() { + auto pattern = weak.Upgrade(); + CHECK_NULL_VOID(pattern); + auto instanceId = pattern->GetInstanceId(); + auto container = Platform::AceContainer::GetContainer(instanceId); + CHECK_NULL_VOID(container); + avoidArea = container->GetAvoidAreaByType(type); + }, + TaskExecutor::TaskType::UI); + return avoidArea; + }; } /************************************************ End: Initialization *************************************************/ @@ -440,4 +456,12 @@ int32_t SessionWrapperImpl::SendDataSync(const AAFwk::WantParams& wantParams, AA } /************************************************ End: The interface to send the data for ArkTS ***********************/ +/************************************************ Begin: The interface to control the avoid area **********************/ +void SessionWrapperImpl::NotifyOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) const +{ + TAG_LOGI(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "AvoidArea: session = %{public}s", session_ ? "non-null" : "null"); + CHECK_NULL_VOID(session_); + session_->UpdateAvoidArea(sptr::MakeSptr(avoidArea), static_cast(type)); +} +/************************************************ End: The interface to control the avoid area ************************/ } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.h b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.h index e267ba0c462c95228a7968fcd46632796470cb3a..a5787bd27743b6b32948f513e60e878ac3d97579 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.h +++ b/frameworks/core/components_ng/pattern/ui_extension/session_wrapper_impl.h @@ -83,6 +83,9 @@ public: void SendDataAsync(const AAFwk::WantParams& params) const override; int32_t SendDataSync(const AAFwk::WantParams& wantParams, AAFwk::WantParams& reWantParams) const override; + // The interface to control the avoid area + void NotifyOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) const override; + private: void InitAllCallback(); sptr session_; diff --git a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.cpp b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.cpp index 36d5c96850d7cb906ff34c87797275f30b042a4d..8f39acc0ff01bd6393e3ad33f70bbebb1896acce 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.cpp +++ b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.cpp @@ -105,4 +105,27 @@ void UIExtensionManager::RecycleExtensionId(int32_t id) CHECK_NULL_VOID(extensionIdUtility_); extensionIdUtility_->RecycleExtensionId(id); } + +void UIExtensionManager::AddAliveUIExtension(int32_t nodeId, const WeakPtr& uiExtension) +{ + aliveUIExtensions_.try_emplace(nodeId, uiExtension); +} + +void UIExtensionManager::TransferOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) +{ + for (const auto& it : aliveUIExtensions_) { + auto uiExtension = it.second.Upgrade(); + if (uiExtension) { + uiExtension->DispatchOriginAvoidArea(avoidArea, type); + } + } +} + +void UIExtensionManager::RemoveDestroyedUIExtension(int32_t nodeId) +{ + auto it = aliveUIExtensions_.find(nodeId); + if (it != aliveUIExtensions_.end()) { + aliveUIExtensions_.erase(nodeId); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h index 84b1bfb77af255b429efeea0d3a193894f27e75d..37a45d65ba7c4ca06fe76dba59e37ddca4caf273 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h +++ b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_manager.h @@ -26,8 +26,9 @@ #include "core/common/container.h" namespace OHOS::Rosen { +class AvoidArea; enum class WSError; -} +} // namespace OHOS::Rosen namespace OHOS::Ace::NG { namespace { @@ -54,12 +55,34 @@ public: const RefPtr GetFocusUiExtensionNode(); bool IsWrapExtensionAbilityId(int32_t elementId); bool IsWindowTypeUIExtension(const RefPtr& pipeline); - bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo, - int32_t uiExtensionOffset, const RefPtr& pipeline); + bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo, int32_t uiExtensionOffset, + const RefPtr& pipeline); std::pair UnWrapExtensionAbilityId(int32_t extensionOffset, int32_t elementId); int32_t ApplyExtensionId(); void RecycleExtensionId(int32_t id); + /** + * @brief Create a UIExtensionComponent object on the page and save it in the UIExtension management object + * + * @param uiExtension The UIExtensionComponent pattern object + */ + void AddAliveUIExtension(int32_t nodeId, const WeakPtr& uiExtension); + + /** + * @brief Clear the UIExtensionComponent to be destroyed + * + * @param nodeId The UIExtensionComponent Id + */ + void RemoveDestroyedUIExtension(int32_t nodeId); + + /** + * @brief Transfer the original avoid area and avoid area type to the UIExtensionAbility + * + * @param avoidArea The original avoid area + * @param type The original aovid areatype + */ + void TransferOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type); + private: class UIExtensionIdUtility { public: @@ -77,6 +100,7 @@ private: }; WeakPtr uiExtensionFocused_; + std::map> aliveUIExtensions_; std::unique_ptr extensionIdUtility_ = std::make_unique(); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.cpp b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.cpp index b41911d211c2b25cd7864fbea5917a5953691f34..1e31e828a10511e37241e0e77c6564938eb47f9a 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.cpp +++ b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.cpp @@ -40,6 +40,7 @@ #include "core/event/ace_events.h" #include "core/event/mouse_event.h" #include "core/event/touch_event.h" +#include "core/pipeline/pipeline_context.h" #include "core/pipeline_ng/pipeline_context.h" namespace OHOS::Ace::NG { @@ -48,11 +49,9 @@ UIExtensionPattern::UIExtensionPattern(bool isTransferringCaller, bool isModal) { sessionWrapper_ = SessionWrapperFactory::CreateSessionWrapper( SessionTye::UI_EXTENSION_ABILITY, AceType::WeakClaim(this), instanceId_, isTransferringCaller_); - auto pipeline = PipelineBase::GetCurrentContext(); + auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); - auto ngPipeline = AceType::DynamicCast(pipeline); - CHECK_NULL_VOID(ngPipeline); - auto uiExtensionManager = ngPipeline->GetUIExtensionManager(); + auto uiExtensionManager = pipeline->GetUIExtensionManager(); CHECK_NULL_VOID(uiExtensionManager); uiExtensionId_ = uiExtensionManager->ApplyExtensionId(); TAG_LOGI(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "Id = %{public}d, TransferrCaller = %{public}d, isModal = %{public}d", @@ -66,13 +65,12 @@ UIExtensionPattern::~UIExtensionPattern() CHECK_NULL_VOID(sessionWrapper_); sessionWrapper_->DestroySession(); FireModalOnDestroy(); - auto pipeline = PipelineBase::GetCurrentContext(); + auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); - auto ngPipeline = AceType::DynamicCast(pipeline); - CHECK_NULL_VOID(ngPipeline); - auto uiExtensionManager = ngPipeline->GetUIExtensionManager(); + auto uiExtensionManager = pipeline->GetUIExtensionManager(); CHECK_NULL_VOID(uiExtensionManager); uiExtensionManager->RecycleExtensionId(uiExtensionId_); + uiExtensionManager->RemoveDestroyedUIExtension(GetNodeId()); } RefPtr UIExtensionPattern::CreateLayoutAlgorithm() @@ -85,15 +83,14 @@ FocusPattern UIExtensionPattern::GetFocusPattern() const return { FocusType::NODE, true, FocusStyleType::NONE }; } -void UIExtensionPattern::InitializeDynamicComponent(const std::string& hapPath, const std::string& abcPath, - const std::string& entryPoint, void* runtime) +void UIExtensionPattern::InitializeDynamicComponent( + const std::string& hapPath, const std::string& abcPath, const std::string& entryPoint, void* runtime) { componentType_ = ComponentType::DYNAMIC; if (!dynamicComponentRenderer_) { ContainerScope scope(instanceId_); - dynamicComponentRenderer_ = - DynamicComponentRenderer::Create(GetHost(), hapPath, abcPath, entryPoint, runtime); + dynamicComponentRenderer_ = DynamicComponentRenderer::Create(GetHost(), hapPath, abcPath, entryPoint, runtime); CHECK_NULL_VOID(dynamicComponentRenderer_); dynamicComponentRenderer_->CreateContent(); } @@ -159,10 +156,11 @@ void UIExtensionPattern::OnConnect() bool isFocused = IsCurrentFocus(); RegisterVisibleAreaChange(); DispatchFocusState(isFocused); + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto uiExtensionManager = pipeline->GetUIExtensionManager(); + uiExtensionManager->AddAliveUIExtension(host->GetId(), WeakClaim(this)); if (isFocused || isModal_) { - auto pipeline = AceType::DynamicCast(PipelineBase::GetCurrentContext()); - CHECK_NULL_VOID(pipeline); - auto uiExtensionManager = pipeline->GetUIExtensionManager(); uiExtensionManager->RegisterUIExtensionInFocus(WeakClaim(this)); } TAG_LOGI(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "The UIExtensionComponent is connected."); @@ -778,6 +776,23 @@ int32_t UIExtensionPattern::GetUiExtensionId() return uiExtensionId_; } +int32_t UIExtensionPattern::GetNodeId() +{ + auto host = GetHost(); + return host ? host->GetId() : -1; +} + +int32_t UIExtensionPattern::GetInstanceId() +{ + return instanceId_; +} + +void UIExtensionPattern::DispatchOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) +{ + CHECK_NULL_VOID(sessionWrapper_); + sessionWrapper_->NotifyOriginAvoidArea(avoidArea, type); +} + int32_t UIExtensionPattern::WrapExtensionAbilityId(int32_t extensionOffset, int32_t abilityId) { return uiExtensionId_ * extensionOffset + abilityId; diff --git a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.h b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.h index fab56a7dbc3b6858ae5f0623cad73029cff30861..fae2c0f14c0a76e51c05123af414cbbb97345932 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.h +++ b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_pattern.h @@ -47,6 +47,10 @@ namespace OHOS::Ace { class ModalUIExtensionProxy; } // namespace OHOS::Ace +namespace OHOS::Rosen { +class AvoidArea; +} // namespace OHOS::Rosen + namespace OHOS::Ace::NG { class UIExtensionProxy; class UIExtensionPattern : public Pattern { @@ -101,22 +105,24 @@ public: void NotifyForeground(); void NotifyBackground(); void NotifyDestroy(); + int32_t GetInstanceId(); int32_t GetSessionId(); + int32_t GetNodeId(); int32_t GetUiExtensionId() override; int32_t WrapExtensionAbilityId(int32_t extensionOffset, int32_t abilityId) override; + void DispatchOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type); - virtual void SearchExtensionElementInfoByAccessibilityId(int32_t elementId, int32_t mode, int32_t baseParent, + void SearchExtensionElementInfoByAccessibilityId(int32_t elementId, int32_t mode, int32_t baseParent, std::list& output) override; - virtual void SearchElementInfosByText(int32_t elementId, const std::string& text, int32_t baseParent, + void SearchElementInfosByText(int32_t elementId, const std::string& text, int32_t baseParent, std::list& output) override; - virtual void FindFocusedElementInfo(int32_t elementId, int32_t focusType, int32_t baseParent, + void FindFocusedElementInfo(int32_t elementId, int32_t focusType, int32_t baseParent, Accessibility::AccessibilityElementInfo& output) override; - virtual void FocusMoveSearch(int32_t elementId, int32_t direction, int32_t baseParent, + void FocusMoveSearch(int32_t elementId, int32_t direction, int32_t baseParent, Accessibility::AccessibilityElementInfo& output) override; - virtual bool TransferExecuteAction(int32_t elementId, const std::map& actionArguments, + bool TransferExecuteAction(int32_t elementId, const std::map& actionArguments, int32_t action, int32_t offset) override; - void OnAccessibilityEvent( - const Accessibility::AccessibilityEventInfo& info, int32_t uiExtensionOffset); + void OnAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, int32_t uiExtensionOffset); private: enum class ReleaseCode { diff --git a/frameworks/core/pipeline/pipeline_base.h b/frameworks/core/pipeline/pipeline_base.h index 6b9d7a4da95064a3201126266a92442bab403be3..5bf4254910384c6a9dce0e0ea5a8a646e5b3bb77 100644 --- a/frameworks/core/pipeline/pipeline_base.h +++ b/frameworks/core/pipeline/pipeline_base.h @@ -58,12 +58,13 @@ namespace OHOS::Rosen { class RSTransaction; -} +class AvoidArea; +} // namespace OHOS::Rosen namespace OHOS::Ace { namespace NG { class FrameNode; -} +} // namespace NG struct KeyboardAnimationConfig { std::string curveType_; @@ -844,6 +845,8 @@ public: virtual void UpdateNavSafeArea(const SafeAreaInsets& navSafeArea) {} + virtual void UpdateOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) {} + virtual void SetEnableKeyBoardAvoidMode(bool value) {} virtual bool IsEnableKeyBoardAvoidMode() { diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 2d48de7df2e688c26f6da477ccbf00b5c130f34f..31a888bf7f7ebdcf961bec25b9f17fafdf16eb31 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -67,11 +67,10 @@ #include "core/components_ng/pattern/stage/page_pattern.h" #include "core/components_ng/pattern/stage/stage_pattern.h" #include "core/components_ng/pattern/text_field/text_field_manager.h" -#include "core/components_ng/pattern/ui_extension/ui_extension_pattern.h" +#include "core/components_ng/pattern/window_scene/helper/window_scene_helper.h" #include "core/components_ng/property/calc_length.h" #include "core/components_ng/property/measure_property.h" #include "core/components_ng/property/safe_area_insets.h" -#include "core/components_ng/pattern/window_scene/helper/window_scene_helper.h" #include "core/components_v2/inspector/inspector_constants.h" #include "core/event/ace_events.h" #include "core/event/touch_event.h" @@ -839,6 +838,9 @@ void PipelineContext::SetupRootElement() } } } +#endif +#ifdef WINDOW_SCENE_SUPPORTED + uiExtensionManager_ = MakeRefPtr(); #endif stageManager_ = MakeRefPtr(stageNode); overlayManager_ = MakeRefPtr( @@ -1147,6 +1149,14 @@ void PipelineContext::UpdateNavSafeArea(const SafeAreaInsets& navSafeArea) } } +void PipelineContext::UpdateOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) +{ +#ifdef WINDOW_SCENE_SUPPORTED + CHECK_NULL_VOID(uiExtensionManager_); + uiExtensionManager_->TransferOriginAvoidArea(avoidArea, type); +#endif +} + void PipelineContext::SetEnableKeyBoardAvoidMode(bool value) { safeAreaManager_->SetKeyBoardAvoidMode(value); @@ -2411,6 +2421,9 @@ void PipelineContext::Destroy() dirtyFocusScope_.Reset(); needRenderNode_.clear(); dirtyDefaultFocusNode_.Reset(); +#ifdef WINDOW_SCENE_SUPPORTED + uiExtensionManager_.Reset(); +#endif PipelineBase::Destroy(); } @@ -2819,8 +2832,7 @@ void PipelineContext::RemoveIsFocusActiveUpdateEvent(const RefPtr& no } } -std::shared_ptr PipelineContext::GetNavigationController( - const std::string& id) +std::shared_ptr PipelineContext::GetNavigationController(const std::string& id) { std::lock_guard lock(navigationMutex_); auto iter = navigationNodes_.find(id); @@ -2836,8 +2848,7 @@ std::shared_ptr PipelineContext::GetNavigationController( return navigationPattern->GetNavigationController(); } -void PipelineContext::AddOrReplaceNavigationNode( - const std::string& id, const WeakPtr& node) +void PipelineContext::AddOrReplaceNavigationNode(const std::string& id, const WeakPtr& node) { std::lock_guard lock(navigationMutex_); auto frameNode = node.Upgrade(); diff --git a/frameworks/core/pipeline_ng/pipeline_context.h b/frameworks/core/pipeline_ng/pipeline_context.h index b2bbe698229af6911ab9cf992f9136a50fd0797e..4c9ff49887dc6c5b6b093d111a7775bd1e75c716 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.h +++ b/frameworks/core/pipeline_ng/pipeline_context.h @@ -28,8 +28,8 @@ #include "base/memory/referenced.h" #include "base/view_data/view_data_wrap.h" #include "core/common/frontend.h" -#include "core/components_ng/base/frame_node.h" #include "core/components/common/layout/constants.h" +#include "core/components_ng/base/frame_node.h" #include "core/components_ng/gestures/recognizers/gesture_recognizer.h" #include "core/components_ng/manager/drag_drop/drag_drop_manager.h" #include "core/components_ng/manager/frame_rate/frame_rate_manager.h" @@ -39,14 +39,14 @@ #include "core/components_ng/manager/select_overlay/select_overlay_manager.h" #include "core/components_ng/manager/shared_overlay/shared_overlay_manager.h" #include "core/components_ng/pattern/custom/custom_node.h" +#ifdef WINDOW_SCENE_SUPPORTED +#include "core/components_ng/pattern/ui_extension/ui_extension_manager.h" +#endif #include "core/components_ng/pattern/overlay/overlay_manager.h" #include "core/components_ng/pattern/stage/stage_manager.h" #include "core/components_ng/property/safe_area_insets.h" #include "core/event/touch_event.h" #include "core/pipeline/pipeline_base.h" -#ifdef WINDOW_SCENE_SUPPORTED -#include "core/components_ng/pattern/ui_extension/ui_extension_manager.h" -#endif namespace OHOS::Ace::NG { class ACE_EXPORT PipelineContext : public PipelineBase { @@ -259,6 +259,7 @@ public: void UpdateSystemSafeArea(const SafeAreaInsets& systemSafeArea) override; void UpdateCutoutSafeArea(const SafeAreaInsets& cutoutSafeArea) override; void UpdateNavSafeArea(const SafeAreaInsets& navSafeArea) override; + void UpdateOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) override; void UpdateDisplayAvailableRect(const Rect& displayAvailableRect) { @@ -690,12 +691,12 @@ private: RefPtr selectOverlayManager_; RefPtr dragDropManager_; RefPtr sharedTransitionManager_; +#ifdef WINDOW_SCENE_SUPPORTED + RefPtr uiExtensionManager_; +#endif RefPtr safeAreaManager_ = MakeRefPtr(); RefPtr frameRateManager_ = MakeRefPtr(); Rect displayAvailableRect_; -#ifdef WINDOW_SCENE_SUPPORTED - RefPtr uiExtensionManager_ = MakeRefPtr(); -#endif WeakPtr dirtyFocusNode_; WeakPtr dirtyFocusScope_; WeakPtr dirtyDefaultFocusNode_; diff --git a/test/mock/adapter/mock_ace_container.cpp b/test/mock/adapter/mock_ace_container.cpp index f73bae48b06632975152db61e88ac83f40527761..bd03112b950228921284cb710d1af77ad1bfda4b 100644 --- a/test/mock/adapter/mock_ace_container.cpp +++ b/test/mock/adapter/mock_ace_container.cpp @@ -36,4 +36,14 @@ sptr AceContainer::GetUIWindow(int32_t instanceId) { return nullptr; } + +Rosen::AvoidArea AceContainer::GetAvoidAreaByType(Rosen::AvoidAreaType type) +{ + return {}; +} + +RefPtr AceContainer::GetContainer(int32_t instanceId) +{ + return nullptr; +} } // namespace OHOS::Ace::Platform diff --git a/test/mock/core/pipeline/mock_pipeline_context.cpp b/test/mock/core/pipeline/mock_pipeline_context.cpp index 3968e5a0824593f08358ef1574d26b77390da2ad..3678fd7e94566680d4ca964f895d3ae5b7dbbcb5 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.cpp +++ b/test/mock/core/pipeline/mock_pipeline_context.cpp @@ -457,6 +457,8 @@ bool PipelineContext::IsDragging() const void PipelineContext::SetIsDragging(bool isDragging) {} void PipelineContext::ResetDragging() {} + +void PipelineContext::UpdateOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type) {} } // namespace OHOS::Ace::NG // pipeline_context ============================================================ @@ -590,6 +592,5 @@ bool PipelineBase::HasFloatTitle() const { return true; } - } // namespace OHOS::Ace // pipeline_base =============================================================== diff --git a/test/mock/core/pipeline/mock_pipeline_context.h b/test/mock/core/pipeline/mock_pipeline_context.h index d4dde8f8934bea4b228f712e84b8674954d0afa5..53b4b0e0dc87c52f73f0be30c3a5394893a73cfc 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.h +++ b/test/mock/core/pipeline/mock_pipeline_context.h @@ -123,6 +123,7 @@ public: MOCK_METHOD1(SetIsDragging, void(bool isDragging)); MOCK_METHOD0(ResetDragging, void()); MOCK_CONST_METHOD0(HasFloatTitle, bool()); + MOCK_METHOD2(UpdateOriginAvoidArea, void(const Rosen::AvoidArea& avoidArea, uint32_t type)); static RefPtr pipeline_;