!48853 修复分屏时切换自由多窗子窗大小未变化问题

Merge pull request !48853 from luoying_ace/lyly
This commit is contained in:
openharmony_ci 2024-11-19 13:31:18 +00:00 committed by Gitee
commit 20ea21fd79
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
10 changed files with 73 additions and 0 deletions

View File

@ -713,6 +713,12 @@ public:
void FireUIExtensionEventCallback(uint32_t eventId);
void FireAccessibilityEventCallback(uint32_t eventId, int64_t parameter);
bool IsFloatingWindow() const override
{
CHECK_NULL_RETURN(uiWindow_, false);
return uiWindow_->GetMode() == Rosen::WindowMode::WINDOW_MODE_FLOATING;
}
private:
virtual bool MaybeRelease() override;
void InitializeFrontend();

View File

@ -414,6 +414,24 @@ NG::RectF SubwindowOhos::GetRect()
return windowRect_;
}
void SubwindowOhos::ResizeDialogSubwindow()
{
auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
CHECK_NULL_VOID(defaultDisplay);
if (!(NearEqual(defaultDisplay->GetWidth(), window_->GetRect().width_) &&
NearEqual(defaultDisplay->GetHeight(), window_->GetRect().height_))) {
auto container = Container::Current();
CHECK_NULL_VOID(container);
auto taskExecutor = container->GetTaskExecutor();
CHECK_NULL_VOID(taskExecutor);
taskExecutor->PostTask(
[this]() {
ResizeWindow();
},
TaskExecutor::TaskType::UI, "ArkUIResizeDialogSubwindow");
}
}
void SubwindowOhos::ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent)
{
TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup enter");

View File

@ -159,6 +159,8 @@ public:
bool IsToastSubWindow() override;
void DestroyWindow() override;
void ResizeDialogSubwindow() override;
private:
RefPtr<StackElement> GetStack();
void AddMenu(const RefPtr<Component>& newComponent);

View File

@ -186,6 +186,8 @@ public:
virtual bool Close() = 0;
virtual bool IsToastSubWindow() = 0;
virtual void DestroyWindow() = 0;
virtual void ResizeDialogSubwindow() = 0;
private:
int32_t subwindowId_ = 0;
int32_t uiExtensionHostWindowId_ = 0;

View File

@ -617,6 +617,12 @@ public:
{
return Rect();
}
virtual bool IsFloatingWindow() const
{
return false;
}
protected:
bool IsFontFileExistInPath(const std::string& path);
std::string GetFontFamilyName(std::string path);

View File

@ -86,6 +86,8 @@ void DialogLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper)
dialogPattern->UpdateDeviceOrientation(SystemProperties::GetDeviceOrientation());
}
UpdateSafeArea();
isShowInFloatingWindow_ = dialogPattern->IsShowInFloatingWindow();
ResizeDialogSubwindow(expandDisplay_, isShowInSubWindow_, isShowInFloatingWindow_);
const auto& layoutConstraint = dialogProp->GetLayoutConstraint();
const auto& parentIdealSize = layoutConstraint->parentIdealSize;
OptionalSizeF realSize;
@ -126,6 +128,18 @@ void DialogLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper)
}
}
void DialogLayoutAlgorithm::ResizeDialogSubwindow(
bool expandDisplay, bool isShowInSubWindow, bool isShowInFloatingWindow)
{
if (expandDisplay && isShowInSubWindow && isShowInFloatingWindow) {
auto currentId = Container::CurrentId();
auto subWindow = SubwindowManager::GetInstance()->GetSubwindow(currentId >= MIN_SUBCONTAINER_ID ?
SubwindowManager::GetInstance()->GetParentContainerId(currentId) : currentId);
CHECK_NULL_VOID(subWindow);
subWindow->ResizeDialogSubwindow();
}
}
void DialogLayoutAlgorithm::UpdateChildMaxSizeHeight(SizeT<float>& maxSize)
{
if (!isHoverMode_) {

View File

@ -96,6 +96,8 @@ private:
void UpdateChildMaxSizeHeight(SizeT<float>& maxSize);
void ParseSubwindowId(const RefPtr<DialogLayoutProperty>& dialogProp);
void ResizeDialogSubwindow(bool expandDisplay, bool isShowInSubWindow, bool isShowInFloatingWindow);
RectF touchRegion_;
OffsetF topLeftPoint_;
bool customSize_ = false;
@ -126,6 +128,8 @@ private:
KeyboardAvoidMode keyboardAvoidMode_ = KeyboardAvoidMode::DEFAULT;
bool isShowInFloatingWindow_ = false;
ACE_DISALLOW_COPY_AND_MOVE(DialogLayoutAlgorithm);
};
} // namespace OHOS::Ace::NG

View File

@ -1815,6 +1815,25 @@ bool DialogPattern::IsShowInFreeMultiWindow()
return container->IsFreeMultiWindow();
}
bool DialogPattern::IsShowInFloatingWindow()
{
auto currentId = Container::CurrentId();
auto container = Container::Current();
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;
}
}
return container->IsFloatingWindow();
}
void DialogPattern::DumpSimplifyInfo(std::unique_ptr<JsonValue>& json)
{
json->Put("Type", DialogTypeUtils::ConvertDialogTypeToString(dialogProperties_.type).c_str());

View File

@ -311,6 +311,7 @@ public:
}
bool IsShowInFreeMultiWindow();
bool IsShowInFloatingWindow();
private:
bool AvoidKeyboard() const override

View File

@ -99,6 +99,7 @@ public:
MOCK_METHOD1(SetRect, void(const NG::RectF& rect));
MOCK_METHOD0(IsToastSubWindow, bool());
MOCK_METHOD0(DestroyWindow, void());
MOCK_METHOD0(ResizeDialogSubwindow, void());
};
} // namespace OHOS::Ace
#endif // FOUNDATION_ACE_TEST_MOCK_BASE_MOCK_SUBWINDOW_H