diff --git a/adapter/ohos/entrance/ace_container.h b/adapter/ohos/entrance/ace_container.h index 16864dec8c12c3df02902c184b872328503dcedc..6d9c1b1875658c8de7a8abe5619f31bdc3f7e261 100644 --- a/adapter/ohos/entrance/ace_container.h +++ b/adapter/ohos/entrance/ace_container.h @@ -776,6 +776,13 @@ public: CHECK_NULL_RETURN(uiWindow_, false); return uiWindow_->GetFreeMultiWindowModeEnabledState(); } + + bool IsWaterfallWindow() const override + { + CHECK_NULL_RETURN(uiWindow_, false); + return uiWindow_->IsWaterfallModeEnabled(); + } + Rect GetUIExtensionHostWindowRect(int32_t instanceId) override { CHECK_NULL_RETURN(IsUIExtensionWindow(), Rect()); diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 9f7b2d17a116c9ee2879ebccdbc28b89c9023afb..4591acc6e4f7b9264b49907251c9ee74436742e8 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -674,6 +674,30 @@ private: int32_t instanceId_ = -1; }; +class WaterfallModeChangeListener : public OHOS::Rosen::IWaterfallModeChangeListener { +public: + explicit WaterfallModeChangeListener(int32_t instanceId) : instanceId_(instanceId) {} + ~WaterfallModeChangeListener() = default; + + void OnWaterfallModeChange(bool enable) override + { + TAG_LOGI(AceLogTag::ACE_WINDOW, "waterfall mode is changed, waterfallMode: %{public}d", enable); + auto container = Platform::AceContainer::GetContainer(instanceId_); + CHECK_NULL_VOID(container); + auto taskExecutor = container->GetTaskExecutor(); + CHECK_NULL_VOID(taskExecutor); + ContainerScope scope(instanceId_); + taskExecutor->PostTask( + [instanceId = instanceId_, enable] { + SubwindowManager::GetInstance()->OnWaterfallModeChanged(instanceId, enable); + }, + TaskExecutor::TaskType::UI, "ArkUIWaterfallModeChanged"); + } + +private: + int32_t instanceId_ = -1; +}; + class FoldScreenListener : public OHOS::Rosen::DisplayManager::IFoldStatusListener { public: explicit FoldScreenListener(int32_t instanceId) : instanceId_(instanceId) {} @@ -2067,6 +2091,8 @@ UIContentErrorCode UIContentImpl::CommonInitialize( window_->RegisterDragListener(dragWindowListener_); occupiedAreaChangeListener_ = new OccupiedAreaChangeListener(instanceId_); window_->RegisterOccupiedAreaChangeListener(occupiedAreaChangeListener_); + waterfallModeChangeListener_ = new WaterfallModeChangeListener(instanceId_); + window_->RegisterWaterfallModeChangeListener(waterfallModeChangeListener_); foldStatusListener_ = new FoldScreenListener(instanceId_); OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(foldStatusListener_); foldDisplayModeListener_ = new FoldDisplayModeListener(instanceId_); @@ -2427,6 +2453,10 @@ void UIContentImpl::Destroy() ContainerScope::RemoveAndCheck(instanceId_); UnregisterDisplayManagerCallback(); SubwindowManager::GetInstance()->OnDestroyContainer(instanceId_); + + if (window_) { + window_->UnregisterWaterfallModeChangeListener(waterfallModeChangeListener_); + } } void UIContentImpl::UnregisterDisplayManagerCallback() @@ -3461,6 +3491,8 @@ void UIContentImpl::InitializeSubWindow(OHOS::Rosen::Window* window, bool isDial occupiedAreaChangeListener_ = new OccupiedAreaChangeListener(instanceId_); window_->RegisterOccupiedAreaChangeListener(occupiedAreaChangeListener_); foldStatusListener_ = new FoldScreenListener(instanceId_); + waterfallModeChangeListener_ = new WaterfallModeChangeListener(instanceId_); + window_->RegisterWaterfallModeChangeListener(waterfallModeChangeListener_); OHOS::Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(foldStatusListener_); foldDisplayModeListener_ = new FoldDisplayModeListener(instanceId_, isDialog); OHOS::Rosen::DisplayManager::GetInstance().RegisterDisplayModeListener(foldDisplayModeListener_); diff --git a/adapter/ohos/entrance/ui_content_impl.h b/adapter/ohos/entrance/ui_content_impl.h index d53f64c62c0e96d8650d86b9956de989035f1ccb..de82b7c6431b035f7a1a94e733ae9f437dfd22f3 100644 --- a/adapter/ohos/entrance/ui_content_impl.h +++ b/adapter/ohos/entrance/ui_content_impl.h @@ -442,6 +442,7 @@ private: OHOS::sptr dragWindowListener_ = nullptr; OHOS::sptr occupiedAreaChangeListener_ = nullptr; OHOS::sptr avoidAreaChangedListener_ = nullptr; + OHOS::sptr waterfallModeChangeListener_ = nullptr; OHOS::sptr foldStatusListener_ = nullptr; OHOS::sptr foldDisplayModeListener_ = nullptr; OHOS::sptr availableAreaChangedListener_ = nullptr; diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index 321ab60f524024358dab73575460c5ea65e1c701..fa0ae388c0d7fdd5fd3d466e47887ebbdd407934 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -189,6 +189,7 @@ public: void OnUIExtensionWindowSizeChange(int32_t instanceId, Rect windowRect, WindowSizeChangeReason reason); void OnHostWindowSizeChanged(int32_t containerId, Rect windowRect, WindowSizeChangeReason reason); + void OnWaterfallModeChanged(int32_t instanceId, bool enabled) {} void HideSheetSubWindow(int32_t containerId); void ShowBindSheetNG(bool isShow, std::function&& callback, std::function()>&& buildNodeFunc, std::function()>&& buildtitleNodeFunc, diff --git a/frameworks/core/common/container.h b/frameworks/core/common/container.h index b7399d9260ec57b3afdfd894fa3298c91974a18c..a7d8af69b58c9f0fd9e463ab8ddca2bdbf7b90fc 100755 --- a/frameworks/core/common/container.h +++ b/frameworks/core/common/container.h @@ -686,6 +686,11 @@ public: return false; } + virtual bool IsWaterfallWindow() const + { + return false; + } + virtual Rect GetUIExtensionHostWindowRect(int32_t instanceId) { return Rect(); diff --git a/frameworks/core/components_ng/pattern/dialog/dialog_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/dialog/dialog_layout_algorithm.cpp index bb1f78abc48fc2c84961bdb2fb809541977a4754..d409d4b08f11959ca4a3a6cae0ebf1a3cf5f7b17 100644 --- a/frameworks/core/components_ng/pattern/dialog/dialog_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/dialog/dialog_layout_algorithm.cpp @@ -73,6 +73,13 @@ void DialogLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) auto keyboardInsert = safeAreaManager->GetKeyboardInset(); isKeyBoardShow_ = keyboardInsert.IsValid(); isHoverMode_ = enableHoverMode ? pipeline->IsHalfFoldHoverStatus() : false; + if (dialogPattern->IsWaterfallWindowMode()) { + TAG_LOGI(AceLogTag::ACE_DIALOG, "enableHoverMode for waterfallMode, isShowInSubWindow: %{public}d", + isShowInSubWindow_); + isHoverMode_ = true; + hoverModeArea_ = HoverModeAreaType::TOP_SCREEN; + } + auto windowManager = pipeline->GetWindowManager(); CHECK_NULL_VOID(windowManager); dialogPattern->UpdateFontScale(); diff --git a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp index 45232a183b53984f83b124d770dae595f82b3765..f2c1d271f6c269a23c5163d24093f0eebbeb70de 100644 --- a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp +++ b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp @@ -2005,6 +2005,37 @@ bool DialogPattern::IsShowInFreeMultiWindow() return container->IsFreeMultiWindow(); } +bool DialogPattern::IsWaterfallWindowMode() +{ + if (!SystemProperties::IsSuperFoldDisplayDevice()) { + return false; + } + + auto host = GetHost(); + CHECK_NULL_RETURN(host, false); + auto pipeline = host->GetContextRefPtr(); + CHECK_NULL_RETURN(pipeline, false); + + auto currentId = pipeline->GetInstanceId(); + auto container = AceEngine::Get().GetContainer(currentId); + if (!container) { + TAG_LOGW(AceLogTag::ACE_DIALOG, "container is null"); + return false; + } + if (container->IsSubContainer()) { + currentId = SubwindowManager::GetInstance()->GetParentContainerId(currentId); + container = AceEngine::Get().GetContainer(currentId); + if (!container) { + TAG_LOGW(AceLogTag::ACE_DIALOG, "parent container is null"); + return false; + } + } + + auto halfFoldStatus = container->GetCurrentFoldStatus() == FoldStatus::HALF_FOLD; + auto isWaterfallWindow = container->IsWaterfallWindow(); + return halfFoldStatus && isWaterfallWindow; +} + bool DialogPattern::IsShowInFloatingWindow() { auto currentId = Container::CurrentId(); diff --git a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.h b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.h index 594172cd1b0abeab5b736906b90225437ea4f774..ad21f13516b361b4bae921e17eaddc57194078aa 100644 --- a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.h +++ b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.h @@ -312,6 +312,7 @@ public: } bool IsShowInFreeMultiWindow(); + bool IsWaterfallWindowMode(); bool IsShowInFloatingWindow(); void AddExtraMaskNode(const DialogProperties& props);