diff --git a/frameworks/base/geometry/ng/rect_t.h b/frameworks/base/geometry/ng/rect_t.h index d53aaf8b4c0b07359b56c9d3412b1a25552b0ed6..95f3be682ac9971b84ac0cde94338229e8963b48 100644 --- a/frameworks/base/geometry/ng/rect_t.h +++ b/frameworks/base/geometry/ng/rect_t.h @@ -237,6 +237,24 @@ public: return *this; } + RectT& operator+=(const RectT& rect) + { + x_ += rect.x_; + y_ += rect.y_; + width_ += rect.Width(); + height_ += rect.Height(); + return *this; + } + + RectT& operator-=(const RectT& rect) + { + x_ -= rect.x_; + y_ -= rect.y_; + width_ -= rect.Width(); + height_ -= rect.Height(); + return *this; + } + RectT& operator-=(const SizeT& size) { width_ -= size.Width(); @@ -259,6 +277,16 @@ public: return RectT(x_, y_, width_ + size.Width(), height_ + size.Height()); } + RectT operator+(const RectT& rect) const + { + return RectT(x_ + rect.x_, y_ + rect.y_, width_ + rect.Width(), height_ + rect.Height()); + } + + RectT operator-(const RectT& rect) const + { + return RectT(x_ - rect.x_, y_ - rect.y_, width_ - rect.Width(), height_ - rect.Height()); + } + RectT operator-(const SizeT& size) const { return RectT(x_, y_, width_ - size.Width(), height_ - size.Height()); diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index 76c9583796cbf00edd782d814ff20f8f018afe04..261d89154b8b34a84de38a78e92e6925a16a4000 100644 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -567,9 +567,9 @@ void FrameNode::DumpSafeAreaInfo() void FrameNode::DumpCommonInfo() { - if (!geometryNode_->GetFrameRect().ToString().compare(renderContext_->GetPaintRectWithoutTransform().ToString())) { - DumpLog::GetInstance().AddDesc(std::string("FrameRect: ").append(geometryNode_->GetFrameRect().ToString())); - } + DumpLog::GetInstance().AddDesc(std::string("FrameRect: ").append(geometryNode_->GetFrameRect().ToString())); + DumpLog::GetInstance().AddDesc( + std::string("PaintRect without transform: ").append(renderContext_->GetPaintRectWithoutTransform().ToString())); if (renderContext_->GetBackgroundColor()->ColorToString().compare("#00000000") != 0) { DumpLog::GetInstance().AddDesc( std::string("BackgroundColor: ").append(renderContext_->GetBackgroundColor()->ColorToString())); @@ -1175,7 +1175,10 @@ void FrameNode::SetJSFrameNodeOnSizeChangeCallback(OnSizeChangedFunc&& callback) RectF FrameNode::GetRectWithRender() { - auto currFrameRect = geometryNode_->GetFrameRect(); + RectF currFrameRect; + if (renderContext_) { + currFrameRect = renderContext_->GetPaintRectWithoutTransform(); + } if (renderContext_ && renderContext_->GetPositionProperty()) { if (renderContext_->GetPositionProperty()->HasPosition()) { auto renderPosition = ContextPositionConvertToPX( @@ -1668,7 +1671,7 @@ void FrameNode::FlushUpdateAndMarkDirty() MarkDirtyNode(); } -void FrameNode::MarkDirtyNode(PropertyChangeFlag extraFlag, bool childExpansiveAndMark) +void FrameNode::MarkDirtyNode(PropertyChangeFlag extraFlag) { if (CheckNeedMakePropertyDiff(extraFlag)) { if (isPropertyDiffMarked_) { @@ -1680,7 +1683,7 @@ void FrameNode::MarkDirtyNode(PropertyChangeFlag extraFlag, bool childExpansiveA isPropertyDiffMarked_ = true; return; } - MarkDirtyNode(IsMeasureBoundary(), IsRenderBoundary(), extraFlag, childExpansiveAndMark); + MarkDirtyNode(IsMeasureBoundary(), IsRenderBoundary(), extraFlag); } RefPtr FrameNode::GetAncestorNodeOfFrame(bool checkBoundary) const @@ -1762,16 +1765,15 @@ void FrameNode::MarkNeedRender(bool isRenderBoundary) } } -bool FrameNode::RequestParentDirty(bool childExpansiveAndMark) +bool FrameNode::RequestParentDirty() { auto parent = GetAncestorNodeOfFrame(); CHECK_NULL_RETURN(parent, false); - parent->MarkDirtyNode(PROPERTY_UPDATE_BY_CHILD_REQUEST, childExpansiveAndMark); + parent->MarkDirtyNode(PROPERTY_UPDATE_BY_CHILD_REQUEST); return true; } -void FrameNode::MarkDirtyNode( - bool isMeasureBoundary, bool isRenderBoundary, PropertyChangeFlag extraFlag, bool childExpansiveAndMark) +void FrameNode::MarkDirtyNode(bool isMeasureBoundary, bool isRenderBoundary, PropertyChangeFlag extraFlag) { if (CheckNeedRender(extraFlag)) { paintProperty_->UpdatePropertyChangeFlag(extraFlag); @@ -1787,21 +1789,8 @@ void FrameNode::MarkDirtyNode( CHECK_NULL_VOID(context); if (CheckNeedRequestMeasureAndLayout(layoutFlag)) { - auto&& opts = GetLayoutProperty()->GetSafeAreaExpandOpts(); - auto selfExpansiveToMark = opts && opts->ExpansiveToMark(); - if ((!isMeasureBoundary && IsNeedRequestParentMeasure()) || selfExpansiveToMark) { - bool parentStopMark = false; - auto parent = GetAncestorNodeOfFrame(); - if (parent) { - auto parentPattern = parent->GetPattern(); - parentStopMark = parentPattern && parentPattern->StopExpandMark(); - } - // case 1: child not expand and mark, but self expand, need to check if parent stop expand mark - // case 2: child and self not expand, regular mark parent - // case 3: child expand and mark, need to check parent stop expand - bool needMarkParent = - !childExpansiveAndMark || ((childExpansiveAndMark || selfExpansiveToMark) && !parentStopMark); - if (needMarkParent && RequestParentDirty(selfExpansiveToMark)) { + if ((!isMeasureBoundary && IsNeedRequestParentMeasure())) { + if (RequestParentDirty()) { return; } } @@ -2394,8 +2383,9 @@ OffsetF FrameNode::GetOffsetRelativeToWindow() const continue; } } - - offset += parent->geometryNode_->GetFrameOffset(); + if (parentRenderContext) { + offset += parentRenderContext->GetPaintRectWithoutTransform().GetOffset(); + } parent = parent->GetAncestorNodeOfFrame(true); } @@ -3032,11 +3022,6 @@ void FrameNode::Measure(const std::optional& parentConstraint ACE_LAYOUT_TRACE_BEGIN("Measure[%s][self:%d][parent:%d][key:%s]", GetTag().c_str(), GetId(), GetAncestorNodeOfFrame() ? GetAncestorNodeOfFrame()->GetId() : 0, GetInspectorIdValue("").c_str()); ArkUIPerfMonitor::GetInstance().RecordLayoutNode(); - - if (SelfOrParentExpansive() && needRestoreSafeArea_) { - RestoreGeoState(); - needRestoreSafeArea_ = false; - } isLayoutComplete_ = false; if (!oldGeometryNode_) { oldGeometryNode_ = geometryNode_->Clone(); @@ -3146,16 +3131,6 @@ void FrameNode::Layout() if (layoutProperty_->GetLayoutRect()) { GetGeometryNode()->SetFrameOffset(layoutProperty_->GetLayoutRect().value().GetOffset()); } - if (SelfOrParentExpansive()) { - if (IsRootMeasureNode() && !needRestoreSafeArea_ && SelfExpansive()) { - GetGeometryNode()->RestoreCache(); - } else if (needRestoreSafeArea_) { - // if safeArea not restored in measure because of constraint not changed and so on, - // restore this node - RestoreGeoState(); - needRestoreSafeArea_ = false; - } - } int64_t time = GetSysTimestamp(); OffsetNodeToSafeArea(); const auto& geometryTransition = layoutProperty_->GetGeometryTransition(); @@ -3203,10 +3178,10 @@ void FrameNode::Layout() auto pipeline = GetContext(); CHECK_NULL_VOID_LAYOUT_TRACE_END(pipeline); bool isFocusOnPage = pipeline->CheckPageFocus(); - AvoidKeyboard(isFocusOnPage); bool needSyncRsNode = false; DirtySwapConfig config; bool willSyncGeoProperties = OnLayoutFinish(needSyncRsNode, config); + needSyncRsNode |= AvoidKeyboard(isFocusOnPage); // skip wrapping task if node will not sync CHECK_NULL_VOID_LAYOUT_TRACE_END(willSyncGeoProperties || GetIsGeometryTransitionIn()); auto task = [weak = WeakClaim(this), needSync = needSyncRsNode, dirtyConfig = config]() { @@ -3215,13 +3190,6 @@ void FrameNode::Layout() frameNode->SyncGeometryNode(needSync, dirtyConfig); }; pipeline->AddSyncGeometryNodeTask(task); - if (IsRootMeasureNode()) { - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID_LAYOUT_TRACE_END(pipeline); - auto safeAreaManager = pipeline->GetSafeAreaManager(); - CHECK_NULL_VOID_LAYOUT_TRACE_END(safeAreaManager); - safeAreaManager->SetRootMeasureNodeId(GetId()); - } if (SelfOrParentExpansive()) { auto pipeline = GetContext(); CHECK_NULL_VOID_LAYOUT_TRACE_END(pipeline); diff --git a/frameworks/core/components_ng/base/frame_node.h b/frameworks/core/components_ng/base/frame_node.h index f4d5e7e588936b579039d4eb7039b7d29323babb..89090ce911ffaa4e89f36c08fe55e4c08bf83ec8 100644 --- a/frameworks/core/components_ng/base/frame_node.h +++ b/frameworks/core/components_ng/base/frame_node.h @@ -143,11 +143,10 @@ public: virtual void MarkModifyDone(); - void MarkDirtyNode( - PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL, bool childExpansiveAndMark = false) override; + void MarkDirtyNode(PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL) override; - void MarkDirtyNode(bool isMeasureBoundary, bool isRenderBoundary, - PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL, bool childExpansiveAndMark = false); + void MarkDirtyNode( + bool isMeasureBoundary, bool isRenderBoundary, PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL); void ProcessPropertyDiff() { @@ -702,14 +701,6 @@ public: bool SelfOrParentExpansive(); bool SelfExpansive(); bool ParentExpansive(); - void SetNeedRestoreSafeArea(bool needRestore) - { - needRestoreSafeArea_ = needRestore; - } - bool NeedRestoreSafeArea() - { - return needRestoreSafeArea_; - } bool IsActive() const override { @@ -734,8 +725,8 @@ public: int32_t cacheCount = 0, const std::optional& itemConstraint = std::nullopt) override; void SyncGeometryNode(bool needSyncRsNode, const DirtySwapConfig& config); - RefPtr GetFrameChildByIndex(uint32_t index, bool needBuild, bool isCache = false, - bool addToRenderTree = false) override; + RefPtr GetFrameChildByIndex( + uint32_t index, bool needBuild, bool isCache = false, bool addToRenderTree = false) override; bool CheckNeedForceMeasureAndLayout() override; bool SetParentLayoutConstraint(const SizeF& size) const override; @@ -877,7 +868,7 @@ private: * * @return true if Parent is successfully marked dirty. */ - virtual bool RequestParentDirty(bool childExpansiveAndMark = false); + virtual bool RequestParentDirty(); void UpdateChildrenLayoutWrapper(const RefPtr& self, bool forceMeasure, bool forceLayout); void AdjustLayoutWrapperTree(const RefPtr& parent, bool forceMeasure, bool forceLayout) override; @@ -1024,7 +1015,6 @@ private: bool isRestoreInfoUsed_ = false; bool checkboxFlag_ = false; - bool needRestoreSafeArea_ = true; bool isDisallowDropForcedly_ = false; RefPtr overlayNode_; diff --git a/frameworks/core/components_ng/base/geometry_node.cpp b/frameworks/core/components_ng/base/geometry_node.cpp index a10a73c84ccecc0586b25cafa73178e16c97e6ab..f4229f8ac39ea07d87d4fd80b7f3e96256a8ff4d 100644 --- a/frameworks/core/components_ng/base/geometry_node.cpp +++ b/frameworks/core/components_ng/base/geometry_node.cpp @@ -32,7 +32,6 @@ void GeometryNode::Reset() parentGlobalOffset_.Reset(); parentAbsoluteOffset_.Reset(); parentLayoutConstraint_.reset(); - previousState_.reset(); } RefPtr GeometryNode::Clone() const @@ -50,7 +49,6 @@ RefPtr GeometryNode::Clone() const } node->parentGlobalOffset_ = parentGlobalOffset_; node->parentLayoutConstraint_ = parentLayoutConstraint_; - node->previousState_ = previousState_ ? std::make_unique(*previousState_) : nullptr; node->parentAbsoluteOffset_ = parentAbsoluteOffset_; return node; } @@ -69,25 +67,33 @@ void GeometryNode::ToJsonValue(std::unique_ptr& json, const Inspector #endif } -void GeometryNode::Restore() +RectF GeometryNode::GetParentAdjust() const { - CHECK_NULL_VOID(previousState_); - restoreCache_ = std::make_unique(frame_.rect_); - frame_.rect_ = *previousState_; - previousState_ = nullptr; + return parentAdjust_; } -bool GeometryNode::RestoreCache() +void GeometryNode::SetParentAdjust(RectF parentAdjust) { - CHECK_NULL_RETURN(restoreCache_, false); - frame_.rect_ = *restoreCache_; - restoreCache_ = nullptr; - return true; + parentAdjust_ = parentAdjust; } -void GeometryNode::Save() +RectF GeometryNode::GetSelfAdjust() const { - // INVARIANT: previousState_ is null when Save() is called (only allow 1 layer of save/restore) - previousState_ = std::make_unique(frame_.rect_); + return selfAdjust_; +} + +void GeometryNode::SetSelfAdjust(RectF selfAdjust) +{ + selfAdjust_ = selfAdjust; +} + +RectF GeometryNode::GetFrameRectWithoutSafeArea() const +{ + return frame_.rect_; +} + +RectF GeometryNode::GetFrameRectWithSafeArea() const +{ + return selfAdjust_ + parentAdjust_ + frame_.rect_; } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/base/geometry_node.h b/frameworks/core/components_ng/base/geometry_node.h index fe05f31af9ee1206cf1386b36127c762c4491be7..47771af064dce67b81466e8ff1e3a6cf68acad24 100644 --- a/frameworks/core/components_ng/base/geometry_node.h +++ b/frameworks/core/components_ng/base/geometry_node.h @@ -302,6 +302,11 @@ public: return pixelGridRoundSize_; } + RectF GetPixelGridRoundRect() const + { + return RectF(pixelGridRoundOffset_, pixelGridRoundSize_); + } + void SetPixelGridRoundSize(const SizeF& pixelGridRoundSize) { pixelGridRoundSize_ = pixelGridRoundSize; @@ -342,13 +347,12 @@ public: return baselineDistance_.value_or(frame_.rect_.GetY()); } - const std::unique_ptr& GetPreviousState() const - { - return previousState_; - } - void Restore(); - bool RestoreCache(); - void Save(); + RectF GetParentAdjust() const; + void SetParentAdjust(RectF parentAdjust); + RectF GetSelfAdjust() const; + void SetSelfAdjust(RectF selfAdjust); + RectF GetFrameRectWithoutSafeArea() const; + RectF GetFrameRectWithSafeArea() const; void ToJsonValue(std::unique_ptr& json, const InspectorFilter& filter) const; @@ -367,9 +371,8 @@ private: // the size of content rect in current node local coordinate. std::unique_ptr content_; - // save node's state before SafeArea expansion - std::unique_ptr previousState_; - std::unique_ptr restoreCache_; + RectF parentAdjust_; + RectF selfAdjust_; OffsetF parentGlobalOffset_; OffsetF parentAbsoluteOffset_; diff --git a/frameworks/core/components_ng/base/ui_node.cpp b/frameworks/core/components_ng/base/ui_node.cpp index 9f790fd9da71adaf4c355fb6ce91a7510f6fe21f..3dcad546cfc8821370a6db7dad2cd7c86ddaeeb1 100644 --- a/frameworks/core/components_ng/base/ui_node.cpp +++ b/frameworks/core/components_ng/base/ui_node.cpp @@ -538,10 +538,10 @@ void UINode::AdjustParentLayoutFlag(PropertyChangeFlag& flag) } } -void UINode::MarkDirtyNode(PropertyChangeFlag extraFlag, bool childExpansiveAndMark) +void UINode::MarkDirtyNode(PropertyChangeFlag extraFlag) { for (const auto& child : GetChildren()) { - child->MarkDirtyNode(extraFlag, childExpansiveAndMark); + child->MarkDirtyNode(extraFlag); } } diff --git a/frameworks/core/components_ng/base/ui_node.h b/frameworks/core/components_ng/base/ui_node.h index d61591d0ada3934df3751373a62656815525d3d4..8beed62cb53b723a078f4440766f4998f33e57c8 100644 --- a/frameworks/core/components_ng/base/ui_node.h +++ b/frameworks/core/components_ng/base/ui_node.h @@ -291,8 +291,7 @@ public: virtual void AdjustParentLayoutFlag(PropertyChangeFlag& flag); - virtual void MarkDirtyNode( - PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL, bool childExpansiveAndMark = false); + virtual void MarkDirtyNode(PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL); virtual void MarkNeedFrameFlushDirty(PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL); diff --git a/frameworks/core/components_ng/layout/layout_wrapper.cpp b/frameworks/core/components_ng/layout/layout_wrapper.cpp index 30590bfed97832f75259ea7e9ff1070564b62731..1b7124d16804f834bff505d76d45412495b4db46 100644 --- a/frameworks/core/components_ng/layout/layout_wrapper.cpp +++ b/frameworks/core/components_ng/layout/layout_wrapper.cpp @@ -79,13 +79,6 @@ void LayoutWrapper::OffsetNodeToSafeArea() geometryNode->SetMarginFrameOffset(offset); } -void LayoutWrapper::RestoreGeoState() -{ - if (GetGeometryNode()) { - GetGeometryNode()->Restore(); - } -} - bool LayoutWrapper::CheckPageNeedAvoidKeyboard() const { // page will not avoid keyboard when lastChild is sheet @@ -96,37 +89,33 @@ bool LayoutWrapper::CheckPageNeedAvoidKeyboard() const return overlay->CheckPageNeedAvoidKeyboard(); } -void LayoutWrapper::AvoidKeyboard(bool isFocusOnPage) +bool LayoutWrapper::AvoidKeyboard(bool isFocusOnPage) { auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); + CHECK_NULL_RETURN(pipeline, false); bool isFocusOnOverlay = pipeline->CheckOverlayFocus(); // apply keyboard avoidance on Page or Overlay if ((GetHostTag() == V2::PAGE_ETS_TAG && CheckPageNeedAvoidKeyboard() && !isFocusOnOverlay) || GetHostTag() == V2::OVERLAY_ETS_TAG) { auto manager = pipeline->GetSafeAreaManager(); if (!(isFocusOnPage || isFocusOnOverlay) && LessNotEqual(manager->GetKeyboardOffset(), 0.0)) { - return; + return false; } + auto renderContext = GetHostNode()->GetRenderContext(); + CHECK_NULL_RETURN(renderContext, false); auto safeArea = manager->GetSafeArea(); auto x = GetGeometryNode()->GetFrameOffset().GetX(); if (manager->IsAtomicService()) { - GetGeometryNode()->SetFrameOffset(OffsetF(x, manager->GetKeyboardOffset())); - return; + auto usingRect = RectF(OffsetF(x, manager->GetKeyboardOffset()), GetGeometryNode()->GetFrameSize()); + renderContext->UpdatePaintRect(usingRect); + return true; } - GetGeometryNode()->SetFrameOffset(OffsetF(x, safeArea.top_.Length() + manager->GetKeyboardOffset())); + auto usingRect = + RectF(OffsetF(x, safeArea.top_.Length() + manager->GetKeyboardOffset()), GetGeometryNode()->GetFrameSize()); + renderContext->UpdatePaintRect(usingRect); + return true; } -} - -void LayoutWrapper::SaveGeoState() -{ - // save geometry state before SafeArea expansion / keyboard avoidance. - GetGeometryNode()->Save(); - // record nodes whose geometry states need to be restored, to speed up RestoreGeoState - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); - auto manager = pipeline->GetSafeAreaManager(); - manager->AddGeoRestoreNode(GetHostNode()); + return false; } bool LayoutWrapper::CheckValidSafeArea() @@ -153,50 +142,62 @@ bool LayoutWrapper::CheckValidSafeArea() return safeArea.IsValid(); } -void LayoutWrapper::ExpandSafeArea(bool isFocusOnPage) +OffsetF LayoutWrapper::GetParentGlobalPaintRectOffset() const { + OffsetF offset {}; auto host = GetHostNode(); - CHECK_NULL_VOID(host); + CHECK_NULL_RETURN(host, offset); auto parent = host->GetAncestorNodeOfFrame(); - if (parent && parent->GetPattern()) { - return; + while (parent) { + auto parentRenderContext = parent->GetRenderContext(); + if (!parentRenderContext) { + break; + } + offset += parentRenderContext->GetPaintRectWithoutTransform().GetOffset(); + parent = parent->GetAncestorNodeOfFrame(); } + return offset; +} + +void LayoutWrapper::ExpandSafeArea(bool isFocusOnPage) +{ + auto host = GetHostNode(); + CHECK_NULL_VOID(host); + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto safeAreaManager = pipeline->GetSafeAreaManager(); + CHECK_NULL_VOID(safeAreaManager); auto&& opts = GetLayoutProperty()->GetSafeAreaExpandOpts(); auto selfExpansive = host->SelfExpansive(); - if (!selfExpansive && !host->NeedRestoreSafeArea()) { - // if safeArea switch from valid to not valid, keep node restored and return - // otherwise if node restored, meaning expansive parent did not adjust child or so on, restore cache - const auto& geometryTransition = GetLayoutProperty()->GetGeometryTransition(); - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); - auto safeAreaManager = pipeline->GetSafeAreaManager(); - CHECK_NULL_VOID(safeAreaManager); - if (!(host->GetId() == safeAreaManager->GetRootMeasureNodeId() && geometryTransition != nullptr) && - CheckValidSafeArea()) { - ACE_LAYOUT_TRACE_BEGIN("ExpandSafeArea[%s][self:%d] save cache success res %s", host->GetTag().c_str(), - host->GetId(), GetGeometryNode()->GetFrameRect().ToString().c_str()); - auto syncCasheSuccess = GetGeometryNode()->RestoreCache(); - auto renderContext = host->GetRenderContext(); - CHECK_NULL_VOID_LAYOUT_TRACE_END(renderContext); - if (syncCasheSuccess) { - renderContext->SavePaintRect(); - } - ACE_LAYOUT_TRACE_END() + if (!selfExpansive) { + auto parent = host->GetAncestorNodeOfFrame(); + auto renderContext = host->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + auto geometryNode = GetGeometryNode(); + CHECK_NULL_VOID(geometryNode); + auto adjustedRect = geometryNode->GetPixelGridRoundRect(); + if (safeAreaManager->IsSafeAreaValid()) { + adjustedRect += geometryNode->GetParentAdjust(); } + renderContext->UpdatePaintRect(adjustedRect); return; } CHECK_NULL_VOID(selfExpansive); - + OffsetF keyboardAdjust; if ((opts->edges & SAFE_AREA_EDGE_BOTTOM) && (opts->type & SAFE_AREA_TYPE_KEYBOARD) && isFocusOnPage) { - ExpandIntoKeyboard(); + keyboardAdjust = ExpandIntoKeyboard(); } // get frame in global offset - auto parentGlobalOffset = host->GetParentGlobalOffsetDuringLayout(); + auto parentGlobalOffset = GetParentGlobalPaintRectOffset(); auto geometryNode = GetGeometryNode(); - auto frame = geometryNode->GetFrameRect() + parentGlobalOffset; - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); + auto parentAdjust = geometryNode->GetParentAdjust(); + if (!safeAreaManager->IsSafeAreaValid()) { + parentAdjust = RectF(); + } + auto frame = geometryNode->GetPixelGridRoundRect() + parentGlobalOffset + keyboardAdjust + parentAdjust.GetOffset(); + auto originGlobal = frame; + auto safeArea = pipeline->GetSafeAreaManager()->GetCombinedSafeArea(*opts); if ((opts->edges & SAFE_AREA_EDGE_START) && safeArea.left_.IsOverlapped(frame.Left())) { frame.SetWidth(frame.Width() + frame.Left() - safeArea.left_.start); @@ -226,20 +227,21 @@ void LayoutWrapper::ExpandSafeArea(bool isFocusOnPage) frame.SetHeight(frame.Width() / layoutProperty->GetAspectRatio()); } // restore to local offset + auto diff = originGlobal.GetOffset() - frame.GetOffset(); frame -= parentGlobalOffset; - auto diff = geometryNode->GetFrameOffset() - frame.GetOffset(); if (!diff.NonOffset()) { // children's position should remain the same. AdjustChildren(diff); - } else { - RestoreExpansiveChildren(); } - geometryNode->SetFrameOffset(frame.GetOffset()); - geometryNode->SetFrameSize(frame.GetSize()); - host->SetNeedRestoreSafeArea(true); + auto selfAdjust = frame - geometryNode->GetFrameRect(); + geometryNode->SetSelfAdjust(selfAdjust); + auto parent = host->GetAncestorNodeOfFrame(); + if (parent && parent->GetPattern()) { + return; + } auto renderContext = host->GetRenderContext(); CHECK_NULL_VOID(renderContext); - renderContext->SavePaintRect(); + renderContext->UpdatePaintRect(frame); } void LayoutWrapper::AdjustChildren(const OffsetF& offset) @@ -261,71 +263,25 @@ void LayoutWrapper::AdjustChild(RefPtr childUI, const OffsetF& offset) } return; } - if (child->NeedRestoreSafeArea()) { - return; - } - auto childGeo = child->GetGeometryNode(); - child->SaveGeoState(); - childGeo->SetFrameOffset(childGeo->GetFrameOffset() + offset); - child->SetNeedRestoreSafeArea(true); - auto host = GetHostNode(); - ACE_SCOPED_TRACE("AdjustChild[%s][self:%d] adjust child %s %d", host->GetTag().c_str(), host->GetId(), - child->GetTag().c_str(), child->GetId()); - auto renderContext = child->GetRenderContext(); - CHECK_NULL_VOID(renderContext); - renderContext->SavePaintRect(); -} - -void LayoutWrapper::RestoreExpansiveChildren() -{ - for (const auto& childUI : GetHostNode()->GetChildren()) { - RestoreExpansiveChild(childUI); - } -} - -void LayoutWrapper::RestoreExpansiveChild(const RefPtr& childUI) -{ - auto child = DynamicCast(childUI); - if (!child) { - if (!IsSyntaxNode(childUI->GetTag())) { - return; - } - for (const auto& syntaxChild : childUI->GetChildren()) { - RestoreExpansiveChild(syntaxChild); - } - return; - } - if (!child->SelfExpansive() || !child->NeedRestoreSafeArea()) { - return; - } auto childGeo = child->GetGeometryNode(); - childGeo->Restore(); - auto host = GetHostNode(); - ACE_SCOPED_TRACE("RestoreExpansiveChild[%s][self:%d] RestoreExpansiveChild %s %d", host->GetTag().c_str(), - host->GetId(), child->GetTag().c_str(), child->GetId()); - child->SetNeedRestoreSafeArea(false); - auto renderContext = child->GetRenderContext(); - CHECK_NULL_VOID(renderContext); - renderContext->SavePaintRect(); + childGeo->SetParentAdjust(RectF(offset, SizeF())); } -void LayoutWrapper::ExpandIntoKeyboard() +OffsetF LayoutWrapper::ExpandIntoKeyboard() { // if parent already expanded into keyboard, offset shouldn't be applied again auto parent = GetHostNode()->GetAncestorNodeOfFrame(); while (parent) { auto&& opts = parent->GetLayoutProperty()->GetSafeAreaExpandOpts(); if (opts && (opts->edges & SAFE_AREA_EDGE_BOTTOM) && opts->type & SAFE_AREA_TYPE_KEYBOARD) { - return; + return OffsetF(); } parent = parent->GetAncestorNodeOfFrame(); } auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); - auto geometryNode = GetGeometryNode(); - geometryNode->SetFrameOffset( - geometryNode->GetFrameOffset() - OffsetF(0, pipeline->GetSafeAreaManager()->GetKeyboardOffset())); + CHECK_NULL_RETURN(pipeline, OffsetF()); + return OffsetF(0.0f, -pipeline->GetSafeAreaManager()->GetKeyboardOffset()); } void LayoutWrapper::ApplyConstraint(LayoutConstraintF constraint) diff --git a/frameworks/core/components_ng/layout/layout_wrapper.h b/frameworks/core/components_ng/layout/layout_wrapper.h index 5224fe50022e888f29cdb93585010128e654090b..a65ca5b219d791b17cc25509ee88b2ffbb366ecb 100644 --- a/frameworks/core/components_ng/layout/layout_wrapper.h +++ b/frameworks/core/components_ng/layout/layout_wrapper.h @@ -119,6 +119,8 @@ public: return false; } + OffsetF GetParentGlobalPaintRectOffset() const; + virtual bool SkipMeasureContent() const; virtual void SetCacheCount( @@ -164,15 +166,10 @@ public: // check if the page node needs to be avoid keyboard bool CheckPageNeedAvoidKeyboard() const; // apply keyboard avoidance on content rootNodes - void AvoidKeyboard(bool isFocusOnPage = true); + bool AvoidKeyboard(bool isFocusOnPage = true); // expand the SafeArea of expansive nodes, which are previously recorded during Layout traversal void ExpandSafeArea(bool isFocusOnPage = true); - // save geometry states before SafeArea expansion / keyboard avoidance - void SaveGeoState(); - // restore to the geometry state after last Layout and before SafeArea expansion and keyboard avoidance - void RestoreGeoState(); - bool SkipSyncGeometryNode() const { return needSkipSyncGeometryNode_; @@ -189,9 +186,7 @@ protected: void OffsetNodeToSafeArea(); // keyboard avoidance is done by offsetting, to expand into keyboard area, reverse the offset. - void ExpandIntoKeyboard(); - void RestoreExpansiveChildren(); - void RestoreExpansiveChild(const RefPtr& node); + OffsetF ExpandIntoKeyboard(); bool CheckValidSafeArea(); WeakPtr hostNode_; diff --git a/frameworks/core/components_ng/manager/safe_area/safe_area_manager.cpp b/frameworks/core/components_ng/manager/safe_area/safe_area_manager.cpp index 41e74bf95d7fd6df23c3bcc2d131f1d23a48f077..b58c8fbc4f1af23bee0aea443902188f25a7c183 100644 --- a/frameworks/core/components_ng/manager/safe_area/safe_area_manager.cpp +++ b/frameworks/core/components_ng/manager/safe_area/safe_area_manager.cpp @@ -78,6 +78,11 @@ SafeAreaInsets SafeAreaManager::GetCombinedSafeArea(const SafeAreaExpandOpts& op return res; } +bool SafeAreaManager::IsSafeAreaValid() const +{ + return !(ignoreSafeArea_ || (!isFullScreen_ && !isNeedAvoidWindow_)); +} + bool SafeAreaManager::SetIsFullScreen(bool value) { if (isFullScreen_ == value) { @@ -182,12 +187,13 @@ void SafeAreaManager::ExpandSafeArea() ACE_LAYOUT_SCOPED_TRACE("ExpandSafeArea node count %zu", needExpandNodes_.size()); auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); + auto manager = pipeline->GetSafeAreaManager(); bool isFocusOnPage = pipeline->CheckPageFocus(); auto iter = needExpandNodes_.begin(); while (iter != needExpandNodes_.end()) { auto frameNode = (*iter).Upgrade(); if (frameNode) { - frameNode->SaveGeoState(); + manager->AddGeoRestoreNode(frameNode); frameNode->ExpandSafeArea(isFocusOnPage); } ++iter; diff --git a/frameworks/core/components_ng/manager/safe_area/safe_area_manager.h b/frameworks/core/components_ng/manager/safe_area/safe_area_manager.h index 9af3eb1433d6f0add9ae39a27724142044930f27..0a29bbdaf27168f6d8c0279994068cb2f9aed8b1 100644 --- a/frameworks/core/components_ng/manager/safe_area/safe_area_manager.h +++ b/frameworks/core/components_ng/manager/safe_area/safe_area_manager.h @@ -168,16 +168,6 @@ public: bool SetIsAtomicService(bool value); bool IsAtomicService() const; - void SetRootMeasureNodeId(const int32_t rootMeasureNodeId) - { - rootMeasureNodeId_ = rootMeasureNodeId; - } - - int32_t GetRootMeasureNodeId() - { - return rootMeasureNodeId_; - } - float GetSafeHeight() const { Dimension safeDistance = 16.0_vp; @@ -194,6 +184,8 @@ public: return lastKeyboardY_; } + bool IsSafeAreaValid() const; + private: bool isAtomicService_ = false; @@ -253,8 +245,6 @@ private: float lastKeyboardY_ = 0.0f; - int32_t rootMeasureNodeId_ = 0; - static constexpr float SAFE_AREA_VELOCITY = 0.0f; static constexpr float SAFE_AREA_MASS = 1.0f; static constexpr float SAFE_AREA_STIFFNESS = 228.0f; diff --git a/frameworks/core/components_ng/pattern/list/list_paint_method.cpp b/frameworks/core/components_ng/pattern/list/list_paint_method.cpp index 525443f72f73dd3dd4b24db673dadbdfa20ed92b..3160a7c6fd63e85fa861f2af3299024c4194123a 100644 --- a/frameworks/core/components_ng/pattern/list/list_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/list/list_paint_method.cpp @@ -54,9 +54,14 @@ void ListPaintMethod::UpdateContentModifier(PaintWrapper* paintWrapper) { CHECK_NULL_VOID(listContentModifier_); const auto& geometryNode = paintWrapper->GetGeometryNode(); - auto frameSize = geometryNode->GetPaddingSize(); OffsetF paddingOffset = geometryNode->GetPaddingOffset() - geometryNode->GetFrameOffset(); auto renderContext = paintWrapper->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + auto frameSize = renderContext->GetPaintRectWithoutTransform().GetSize(); + auto& padding = geometryNode->GetPadding(); + if (padding) { + frameSize.MinusPadding(*padding->left, *padding->right, *padding->top, *padding->bottom); + } UpdateFadingGradient(renderContext); bool clip = !renderContext || renderContext->GetClipEdge().value_or(true); listContentModifier_->SetClipOffset(paddingOffset); diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.cpp b/frameworks/core/components_ng/pattern/list/list_pattern.cpp index c0a83b6acb6ff8beef03df31e378f91b54036ae2..756fbc05ffda6f2bb72ce101239408f3ecc9a73e 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.cpp +++ b/frameworks/core/components_ng/pattern/list/list_pattern.cpp @@ -387,8 +387,14 @@ RefPtr ListPattern::CreateNodePaintMethod() if (!listContentModifier_) { auto host = GetHost(); CHECK_NULL_RETURN(host, paint); + auto renderContext = host->GetRenderContext(); + CHECK_NULL_RETURN(renderContext, paint); const auto& geometryNode = host->GetGeometryNode(); - auto size = geometryNode->GetPaddingSize(); + auto size = renderContext->GetPaintRectWithoutTransform().GetSize(); + auto& padding = geometryNode->GetPadding(); + if (padding) { + size.MinusPadding(*padding->left, *padding->right, *padding->top, *padding->bottom); + } OffsetF offset = geometryNode->GetPaddingOffset() - geometryNode->GetFrameOffset(); listContentModifier_ = AceType::MakeRefPtr(offset, size); } @@ -978,7 +984,14 @@ SizeF ListPattern::GetContentSize() const CHECK_NULL_RETURN(host, SizeF()); auto geometryNode = host->GetGeometryNode(); CHECK_NULL_RETURN(geometryNode, SizeF()); - return geometryNode->GetPaddingSize(); + auto renderContext = host->GetRenderContext(); + CHECK_NULL_RETURN(renderContext, SizeF()); + auto size = renderContext->GetPaintRectWithoutTransform().GetSize(); + auto& padding = geometryNode->GetPadding(); + if (padding) { + size.MinusPadding(*padding->left, *padding->right, *padding->top, *padding->bottom); + } + return size; } bool ListPattern::IsOutOfBoundary(bool useCurrentDelta) 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 da68683fefcfd38fd03858cf216032c1cdaa5473..4662cdbef11032b4784024b1b7216867d853e818 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 @@ -615,7 +615,9 @@ void UIExtensionPattern::DispatchDisplayArea(bool isForce) auto [displayOffset, err] = host->GetPaintRectGlobalOffsetWithTranslate(); auto geometryNode = host->GetGeometryNode(); CHECK_NULL_VOID(geometryNode); - auto displaySize = geometryNode->GetFrameSize(); + auto renderContext = host->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + auto displaySize = renderContext->GetPaintRectWithoutTransform().GetSize(); auto displayArea = RectF(displayOffset, displaySize); if (displayArea_ != displayArea || isForce) { displayArea_ = displayArea; diff --git a/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.cpp b/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.cpp index 447d373bd2ec60b3de5d082335e4c3b59a93d8fe..4f774b02f419a838a908eb791a6653d8de3ae8c8 100644 --- a/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.cpp +++ b/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.cpp @@ -33,7 +33,7 @@ RefPtr WaterFlowItemNode::GetOrCreateFlowItem( return node; } -bool WaterFlowItemNode::RequestParentDirty(bool /* childExpansiveAndMark */) +bool WaterFlowItemNode::RequestParentDirty() { auto parent = GetAncestorNodeOfFrame(); CHECK_NULL_RETURN(parent, false); diff --git a/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.h b/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.h index a73f5ad6e9f2a35746ad252bf0ea862246f9422c..5f89f04a136a54244698ad1435317841d58284bb 100644 --- a/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.h +++ b/frameworks/core/components_ng/pattern/waterflow/water_flow_item_node.h @@ -37,7 +37,7 @@ private: * * @return true if Parent is marked dirty successfully */ - bool RequestParentDirty(bool childExpansiveAndMark = false) override; + bool RequestParentDirty() override; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_WATERFLOW_WATER_FLOW_ITEM_NODE_H diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp index 89a6b06b44a57990a1838d66ff61446a2fbff8a5..3a0138719cd539f3433a162431aade555f38c000 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.cpp @@ -5854,6 +5854,11 @@ void RosenRenderContext::SavePaintRect(bool isRound, uint8_t flag) } } +void RosenRenderContext::UpdatePaintRect(const RectF& paintRect) +{ + paintRect_ = paintRect; +} + void RosenRenderContext::SyncPartialRsProperties() { if (propTransform_ && propTransform_->HasTransformCenter()) { diff --git a/frameworks/core/components_ng/render/adapter/rosen_render_context.h b/frameworks/core/components_ng/render/adapter/rosen_render_context.h index d38ba6b51efe51d66c4db6a55f6d180945feec8c..39cb3e851738dc84aaf317e31239870a981cc920 100755 --- a/frameworks/core/components_ng/render/adapter/rosen_render_context.h +++ b/frameworks/core/components_ng/render/adapter/rosen_render_context.h @@ -374,6 +374,7 @@ public: void UpdateRenderGroup(bool isRenderGroup, bool isForced, bool includeProperty) override; void SavePaintRect(bool isRound = true, uint8_t flag = 0) override; void SyncPartialRsProperties() override; + void UpdatePaintRect(const RectF& paintRect) override; private: void OnBackgroundImageUpdate(const ImageSourceInfo& src) override; diff --git a/frameworks/core/components_ng/render/render_context.h b/frameworks/core/components_ng/render/render_context.h index 53681b9907f8cbbf4033a81d087a43ee61d0b519..8310aeed59caf50d818ea48cd921475b9415f317 100644 --- a/frameworks/core/components_ng/render/render_context.h +++ b/frameworks/core/components_ng/render/render_context.h @@ -307,6 +307,7 @@ public: virtual void SavePaintRect(bool isRound = true, uint8_t flag = 0) {} virtual void SyncPartialRsProperties() {} + virtual void UpdatePaintRect(const RectF& paintRect) {} virtual std::pair GetPaintRectWithTranslate() { diff --git a/frameworks/core/pipeline_ng/ui_task_scheduler.cpp b/frameworks/core/pipeline_ng/ui_task_scheduler.cpp index da869572cc0a069f5675d7954ffc90c4315c620a..c62e778ea4593d9b87d3795be0e914a42d739f17 100644 --- a/frameworks/core/pipeline_ng/ui_task_scheduler.cpp +++ b/frameworks/core/pipeline_ng/ui_task_scheduler.cpp @@ -66,23 +66,6 @@ void UITaskScheduler::AddDirtyRenderNode(const RefPtr& dirty) } } -void UITaskScheduler::RestoreGeoState() -{ - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); - auto safeAreaManager = pipeline->GetSafeAreaManager(); - CHECK_NULL_VOID(safeAreaManager); - if (safeAreaManager) { - std::set> geoRestoreNodes = safeAreaManager->GetGeoRestoreNodes(); - for (auto& node : geoRestoreNodes) { - auto frameNode = node.Upgrade(); - if (frameNode && frameNode->GetTag() != V2::PAGE_ETS_TAG) { - frameNode->RestoreGeoState(); - } - } - } -} - void UITaskScheduler::ExpandSafeArea() { auto pipeline = PipelineContext::GetCurrentContext(); diff --git a/frameworks/core/pipeline_ng/ui_task_scheduler.h b/frameworks/core/pipeline_ng/ui_task_scheduler.h index 98837a0a9f6b35fbb5f10c5711f8844a6732e7fa..366b1c9887c9a6b7c8712b25ecf7de7fd692265a 100755 --- a/frameworks/core/pipeline_ng/ui_task_scheduler.h +++ b/frameworks/core/pipeline_ng/ui_task_scheduler.h @@ -88,7 +88,6 @@ public: void FlushAfterLayoutTask(); void FlushAfterRenderTask(); void FlushPersistAfterLayoutTask(); - void RestoreGeoState(); void ExpandSafeArea(); void FlushDelayJsActive(); diff --git a/test/mock/core/render/mock_render_context.h b/test/mock/core/render/mock_render_context.h index 0e7606339532f467bb90917baeb030eb90df9819..188b5081aafde4ada9862755e9695a14e9552959 100644 --- a/test/mock/core/render/mock_render_context.h +++ b/test/mock/core/render/mock_render_context.h @@ -20,6 +20,7 @@ #include "base/geometry/ng/point_t.h" #include "base/geometry/ng/rect_t.h" +#include "core/components_ng/base/frame_node.h" #include "core/components_ng/render/render_context.h" namespace OHOS::Ace::NG { @@ -57,6 +58,20 @@ public: return transInfo_; } + void UpdatePaintRect(const RectF& rect) override + { + paintRect_ = rect; + } + + void SavePaintRect(bool isRound = true, uint8_t flag = 0) override + { + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto geometryNode = host->GetGeometryNode(); + CHECK_NULL_VOID(geometryNode); + paintRect_ = geometryNode->GetFrameRect(); + } + RectF GetPaintRectWithTransform() override { return rect_; diff --git a/test/unittest/core/layout/layout_wrapper_test_ng.cpp b/test/unittest/core/layout/layout_wrapper_test_ng.cpp index c5c6576ae0ee03406d1324b72341fa8e1ffcd766..a0f26dffcf7a622015879529e16ceb44e2815ab1 100755 --- a/test/unittest/core/layout/layout_wrapper_test_ng.cpp +++ b/test/unittest/core/layout/layout_wrapper_test_ng.cpp @@ -1503,151 +1503,6 @@ HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest039, TestSize.Level1) EXPECT_NE(popup->layoutProperty_->layoutConstraint_, constraint); } -/** - * @tc.name: LayoutWrapperTest040 - * @tc.desc: Test SaveGeoState and RestoreGeoState. - * @tc.type: FUNC - */ -HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest040, TestSize.Level1) -{ - auto pipeline = PipelineContext::GetCurrentContext(); - EXPECT_TRUE(pipeline); - auto [host, wrapper] = CreateNodeAndWrapper(V2::ROOT_ETS_TAG, 0); - host->GetLayoutProperty()->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_ALL }); - - auto manager = pipeline->GetSafeAreaManager(); - - wrapper->SaveGeoState(); - EXPECT_EQ(wrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 0)); - EXPECT_EQ(manager->GetGeoRestoreNodes().size(), 1UL); - EXPECT_TRUE(wrapper->geometryNode_->previousState_); - - // change frame offset after save - wrapper->geometryNode_->SetFrameOffset({ RK356_WIDTH, RK356_HEIGHT }); - - // recreate wrapper to simulate next layout - auto wrapper2 = AceType::MakeRefPtr(host, wrapper->geometryNode_, host->GetLayoutProperty()); - wrapper2->RestoreGeoState(); - EXPECT_EQ(manager->GetGeoRestoreNodes().size(), 1UL); - EXPECT_FALSE(wrapper2->geometryNode_->previousState_); - EXPECT_EQ(wrapper2->geometryNode_->GetFrameOffset(), OffsetF(0, 0)); -} - -/** - * @tc.name: LayoutWrapperTest041 - * @tc.desc: Test ExpandSafeArea. - * @tc.type: FUNC - */ -HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest041, TestSize.Level1) -{ - auto safeAreaManager = PipelineContext::GetCurrentContext()->safeAreaManager_; - safeAreaManager->systemSafeArea_ = SafeAreaInsets({}, { 0, 1 }, {}, {}); - /** - * @tc.steps: step1. call CreateLayoutWrapper create a layoutwrapper and setup properties. - */ - auto [node, layoutWrapper] = CreateNodeAndWrapper(ROW_FRAME_NODE, NODE_ID_0); - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 1 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_ALL }); - /** - * @tc.steps: step2. call ExpandSafeArea on a frame that overlaps with SafeAreaInset {top = (0, 1)}. - * @tc.expected: frame is expanded. - */ - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 1)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step3. call ExpandSafeArea on a frame that does not overlap with SafeAreaInset. - * @tc.expected: frame is not expanded. - */ - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 5 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 5)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step5. call ExpandSafeArea on a frame that completely covers SafeAreaInset. - * @tc.expected: frame is not expanded. - */ - layoutWrapper->geometryNode_->SetFrameOffset({ 0, -1 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT + 2 }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, -1)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT + 2)); - - /** - * @tc.steps: step6. call ExpandSafeArea on a frame that has user defined size. - * @tc.expected: frame is moved but size remains the same. - */ - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 1 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateUserDefinedIdealSize({ CalcLength(RK356_WIDTH), CalcLength(RK356_HEIGHT) }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 1)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step7. call ExpandSafeArea on a frame with SafeAreaExpandOpts SAFE_AREA_TYPE_NONE. - * @tc.expected: frame is not expanded. - */ - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 1 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_NONE, SAFE_AREA_EDGE_NONE }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 1)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step8. call ExpandSafeArea on a frame with SafeAreaExpandOpts SAFE_AREA_EDGE_START. - * @tc.expected: frame is not expanded. - */ - safeAreaManager->systemSafeArea_ = SafeAreaInsets({ 0, 1 }, { 0, 1 }, {}, {}); - layoutWrapper->geometryNode_->SetFrameOffset({ 1, 0 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_START }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(1, 0)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step9. call ExpandSafeArea on a frame with SafeAreaExpandOpts SAFE_AREA_TYPE_NONE. - * @tc.expected: frame is not expanded. - */ - safeAreaManager->systemSafeArea_ = SafeAreaInsets({}, {}, { 0, RK356_WIDTH + 3 }, {}); - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 0 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_END }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 0)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step10. call ExpandSafeArea on a frame with SafeAreaExpandOpts SAFE_AREA_EDGE_BOTTOM. - * @tc.expected: frame is not expanded. - */ - safeAreaManager->systemSafeArea_ = SafeAreaInsets({}, {}, {}, { 0, RK356_HEIGHT + 3 }); - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 0 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_BOTTOM }); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameOffset(), OffsetF(0, 0)); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_HEIGHT)); - - /** - * @tc.steps: step11. call ExpandSafeArea on a frame with SafeAreaExpandOpts SAFE_AREA_EDGE_BOTTOM. - * @tc.expected: frame is not expanded. - */ - safeAreaManager->systemSafeArea_ = SafeAreaInsets({}, {}, {}, {}); - layoutWrapper->geometryNode_->SetFrameOffset({ 0, 0 }); - layoutWrapper->geometryNode_->SetFrameSize({ RK356_WIDTH, RK356_HEIGHT }); - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_ALL }); - layoutWrapper->layoutProperty_->UpdateAspectRatio(1.0); - layoutWrapper->ExpandSafeArea(); - EXPECT_EQ(layoutWrapper->geometryNode_->GetFrameSize(), SizeF(RK356_WIDTH, RK356_WIDTH)); -} - /** * @tc.name: LayoutWrapperTest042 * @tc.desc: Test OffsetNodeToSafeArea. @@ -1703,16 +1558,15 @@ HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest043, TestSize.Level1) auto safeAreaManager = PipelineContext::GetCurrentContext()->safeAreaManager_; safeAreaManager->UpdateKeyboardOffset(50.0f); - parent->ExpandIntoKeyboard(); - EXPECT_EQ(parent->GetGeometryNode()->GetFrameOffset(), OffsetF(0, -50.0f)); + EXPECT_EQ(parent->ExpandIntoKeyboard(), OffsetF(0, -50.0f)); // parent already expanded child->ExpandIntoKeyboard(); - EXPECT_EQ(child->GetGeometryNode()->GetFrameOffset(), OffsetF(0, 0)); + EXPECT_EQ(child->ExpandIntoKeyboard(), OffsetF(0, 0)); layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_NONE, SAFE_AREA_EDGE_ALL }); child->ExpandIntoKeyboard(); - EXPECT_EQ(child->GetGeometryNode()->GetFrameOffset(), OffsetF(0, -50.0f)); + EXPECT_EQ(child->ExpandIntoKeyboard(), OffsetF(0, -50.0f)); } /** @@ -1786,73 +1640,6 @@ HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest046, TestSize.Level1) EXPECT_EQ(child->GetFlexLayouts(), 0); } -/** - * @tc.name: LayoutWrapperTest047 - * @tc.desc: Test SaveGeoState. - * @tc.type: FUNC - */ -HWTEST_F(LayoutWrapperTestNg, LayoutWrapperTest047, TestSize.Level1) -{ - /** - * @tc.steps: step1. create LayoutWrapper. - */ - auto rowFrameNode = FrameNode::CreateFrameNode( - OHOS::Ace::V2::FLEX_ETS_TAG, NODE_ID_0, AceType::MakeRefPtr(false)); - - RefPtr geometryNode = AceType::MakeRefPtr(); - geometryNode->frame_.rect_.x_ = 1.0f; - geometryNode->frame_.rect_.y_ = 1.0f; - RefPtr layoutWrapper = - AceType::MakeRefPtr(rowFrameNode, geometryNode, rowFrameNode->GetLayoutProperty()); - - /** - * @tc.steps: step2. set expandOpts and tag = V2::PAGE_ETS_TAG. - * @tc.expected: Save success. - */ - layoutWrapper->geometryNode_->previousState_ = nullptr; - layoutWrapper->layoutProperty_->safeAreaExpandOpts_ = nullptr; - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_ALL }); - layoutWrapper->hostNode_.Upgrade()->tag_ = V2::PAGE_ETS_TAG; - layoutWrapper->SaveGeoState(); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->x_, 1.0f); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->y_, 1.0f); - - /** - * @tc.steps: step3. set expandOpts and tag = V2::PAGE_ETS_TAG. - * @tc.expected: Save success. - */ - layoutWrapper->geometryNode_->previousState_ = nullptr; - layoutWrapper->layoutProperty_->safeAreaExpandOpts_ = nullptr; - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_ALL, SAFE_AREA_EDGE_ALL }); - layoutWrapper->hostNode_.Upgrade()->tag_ = V2::STAGE_ETS_TAG; - layoutWrapper->SaveGeoState(); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->x_, 1.0f); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->y_, 1.0f); - - /** - * @tc.steps: step4. set expandOpts and tag = V2::PAGE_ETS_TAG. - * @tc.expected: Save success. - */ - layoutWrapper->geometryNode_->previousState_ = nullptr; - layoutWrapper->layoutProperty_->safeAreaExpandOpts_ = nullptr; - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_NONE, SAFE_AREA_EDGE_NONE }); - layoutWrapper->hostNode_.Upgrade()->tag_ = V2::PAGE_ETS_TAG; - layoutWrapper->SaveGeoState(); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->x_, 1.0f); - EXPECT_EQ(layoutWrapper->GetGeometryNode()->previousState_->y_, 1.0f); - - /** - * @tc.steps: step4. set expandOpts and tag = V2::PAGE_ETS_TAG. - * @tc.expected: Save fail. - */ - layoutWrapper->geometryNode_->previousState_ = nullptr; - layoutWrapper->layoutProperty_->safeAreaExpandOpts_ = nullptr; - layoutWrapper->layoutProperty_->UpdateSafeAreaExpandOpts({ SAFE_AREA_TYPE_NONE, SAFE_AREA_EDGE_NONE }); - layoutWrapper->hostNode_.Upgrade()->tag_ = V2::STAGE_ETS_TAG; - layoutWrapper->SaveGeoState(); - EXPECT_TRUE(layoutWrapper->GetGeometryNode()->previousState_); -} - /** * @tc.name: LayoutWrapperTest048 * @tc.desc: Test AdjustChildren. diff --git a/test/unittest/core/pattern/list/list_layout_test_ng.cpp b/test/unittest/core/pattern/list/list_layout_test_ng.cpp index 1a1526020a700006023365ecce7ff1fbbb13f61b..dede62a379e217ee2a1cc145ec81fc7d68961e3d 100644 --- a/test/unittest/core/pattern/list/list_layout_test_ng.cpp +++ b/test/unittest/core/pattern/list/list_layout_test_ng.cpp @@ -843,6 +843,8 @@ HWTEST_F(ListLayoutTestNg, PaintMethod001, TestSize.Level1) model.SetDivider(itemDivider); CreateListItems(TOTAL_ITEM_NUMBER); CreateDone(); + auto renderContext = frameNode_->GetRenderContext(); + renderContext->UpdatePaintRect(frameNode_->GetGeometryNode()->GetFrameRect()); UpdateContentModifier(); dividerList_ = pattern_->listContentModifier_->dividerList_->Get(); lda = AceType::DynamicCast(dividerList_); @@ -862,6 +864,8 @@ HWTEST_F(ListLayoutTestNg, PaintMethod001, TestSize.Level1) model.SetDivider(itemDivider); CreateListItems(TOTAL_ITEM_NUMBER); CreateDone(); + renderContext = frameNode_->GetRenderContext(); + renderContext->UpdatePaintRect(frameNode_->GetGeometryNode()->GetFrameRect()); UpdateContentModifier(); dividerList_ = pattern_->listContentModifier_->dividerList_->Get(); lda = AceType::DynamicCast(dividerList_); @@ -1107,6 +1111,8 @@ HWTEST_F(ListLayoutTestNg, PaintMethod006, TestSize.Level1) model.SetDivider(itemDivider); CreateListItems(TOTAL_ITEM_NUMBER); CreateDone(); + auto renderContext = frameNode_->GetRenderContext(); + renderContext->UpdatePaintRect(frameNode_->GetGeometryNode()->GetFrameRect()); UpdateDividerMap(); auto dividerList = pattern_->listContentModifier_->dividerList_->Get(); auto dividerMap = AceType::DynamicCast(dividerList)->GetDividerMap(); @@ -1128,6 +1134,8 @@ HWTEST_F(ListLayoutTestNg, PaintMethod006, TestSize.Level1) for (auto itemDivider : dividerArray) { layoutProperty_->UpdateDivider(itemDivider); FlushLayoutTask(frameNode_); + auto renderContext = frameNode_->GetRenderContext(); + renderContext->UpdatePaintRect(frameNode_->GetGeometryNode()->GetFrameRect()); UpdateDividerMap(); dividerList = pattern_->listContentModifier_->dividerList_->Get(); dividerMap = AceType::DynamicCast(dividerList)->GetDividerMap(); @@ -1700,6 +1708,8 @@ HWTEST_F(ListLayoutTestNg, PostListItemPressStyleTask001, TestSize.Level1) child.second.id += cur; cur++; } + auto renderContext = frameNode_->GetRenderContext(); + renderContext->UpdatePaintRect(frameNode_->GetGeometryNode()->GetFrameRect()); UpdateContentModifier(); auto dividerList_ = pattern_->listContentModifier_->dividerList_->Get(); auto lda = AceType::DynamicCast(dividerList_);