diff --git a/frameworks/core/components_ng/pattern/form/form_pattern.cpp b/frameworks/core/components_ng/pattern/form/form_pattern.cpp index 9d38d22cdc7..9e2e65c74d0 100644 --- a/frameworks/core/components_ng/pattern/form/form_pattern.cpp +++ b/frameworks/core/components_ng/pattern/form/form_pattern.cpp @@ -61,6 +61,7 @@ namespace { constexpr double FORM_CLICK_OPEN_LIMIT_DISTANCE = 20.0; constexpr uint32_t DELAY_TIME_FOR_FORM_SUBCONTAINER_CACHE = 30000; constexpr uint32_t DELAY_TIME_FOR_FORM_SNAPSHOT_3S = 3000; +constexpr uint32_t DELAY_TIME_FOR_FORM_SNAPSHOT_EXTRA = 200; constexpr uint32_t DELAY_TIME_FOR_DELETE_IMAGE_NODE = 100; constexpr double ARC_RADIUS_TO_DIAMETER = 2.0; constexpr double NON_TRANSPARENT_VAL = 1.0; @@ -314,6 +315,28 @@ void FormPattern::TakeSurfaceCaptureForUI() needSnapshotAgain_ = true; return; } + + if (formChildrenNodeMap_.find(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE) + == formChildrenNodeMap_.end()) { + SnapshotSurfaceNode(); + return; + } + UpdateChildNodeOpacity(FormChildNodeType::FORM_SURFACE_NODE, NON_TRANSPARENT_VAL); + host->MarkDirtyNode(PROPERTY_UPDATE_LAYOUT); + auto context = host->GetContext(); + CHECK_NULL_VOID(context); + auto uiTaskExecutor = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::UI); + uiTaskExecutor.PostDelayedTask( + [weak = WeakClaim(this)] { + auto pattern = weak.Upgrade(); + CHECK_NULL_VOID(pattern); + pattern->SnapshotSurfaceNode(); + }, + DELAY_TIME_FOR_FORM_SNAPSHOT_EXTRA, "ArkUIFormDelaySnapshotSurfaceNode"); +} + +void FormPattern::SnapshotSurfaceNode() +{ auto externalContext = DynamicCast(GetExternalRenderContext()); CHECK_NULL_VOID(externalContext); auto rsNode = externalContext->GetRSNode(); @@ -402,10 +425,11 @@ void FormPattern::DeleteImageNodeAfterRecover(bool needHandleCachedClick) RemoveFormChildNode(FormChildNodeType::FORM_STATIC_IMAGE_NODE); // set frs node non transparent - auto externalRenderContext = DynamicCast(GetExternalRenderContext()); - CHECK_NULL_VOID(externalRenderContext); - externalRenderContext->SetOpacity(NON_TRANSPARENT_VAL); - TAG_LOGI(AceLogTag::ACE_FORM, "delete imageNode and setOpacity:1"); + if (formChildrenNodeMap_.find(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE) + == formChildrenNodeMap_.end()) { + UpdateChildNodeOpacity(FormChildNodeType::FORM_SURFACE_NODE, NON_TRANSPARENT_VAL); + TAG_LOGI(AceLogTag::ACE_FORM, "delete imageNode and setOpacity:1"); + } host->MarkDirtyNode(PROPERTY_UPDATE_LAYOUT); auto parent = host->GetParent(); @@ -468,7 +492,10 @@ void FormPattern::UpdateImageNode() auto externalContext = DynamicCast(imageNode->GetRenderContext()); CHECK_NULL_VOID(externalContext); externalContext->SetVisible(true); - + if (formChildrenNodeMap_.find(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE) + != formChildrenNodeMap_.end()) { + externalContext->SetOpacity(TRANSPARENT_VAL); + } imageNode->MarkModifyDone(); imageNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); } @@ -764,7 +791,8 @@ void FormPattern::UpdateTimeLimitFontCfg() Dimension fontSize(GetTimeLimitFontSize()); if (!NearEqual(textLayoutProperty->GetFontSize().value(), fontSize)) { - TAG_LOGD(AceLogTag::ACE_FORM, "UpdateFontSize:%{public}f.", fontSize.Value()); + TAG_LOGD(AceLogTag::ACE_FORM, "bundleName = %{public}s, id: %{public}" PRId64 ", UpdateFontSize:%{public}f.", + cardInfo_.bundleName.c_str(), cardInfo_.id, fontSize.Value()); textLayoutProperty->UpdateFontSize(fontSize); textNode->MarkModifyDone(); textNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); @@ -819,11 +847,18 @@ void FormPattern::LoadDisableFormStyle(const RequestFormInfo& info, bool isRefre CHECK_NULL_VOID(layoutProperty); auto visible = layoutProperty->GetVisibleType().value_or(VisibleType::VISIBLE); layoutProperty->UpdateVisibility(visible); + + UpdateChildNodeOpacity(FormChildNodeType::FORM_SURFACE_NODE, TRANSPARENT_VAL); + UpdateChildNodeOpacity(FormChildNodeType::FORM_STATIC_IMAGE_NODE, TRANSPARENT_VAL); + UpdateChildNodeOpacity(FormChildNodeType::FORM_SKELETON_NODE, TRANSPARENT_VAL); } void FormPattern::RemoveDisableFormStyle(const RequestFormInfo& info) { if (!IsMaskEnableForm(info)) { + UpdateChildNodeOpacity(FormChildNodeType::FORM_SURFACE_NODE, NON_TRANSPARENT_VAL); + UpdateChildNodeOpacity(FormChildNodeType::FORM_STATIC_IMAGE_NODE, NON_TRANSPARENT_VAL); + UpdateChildNodeOpacity(FormChildNodeType::FORM_SKELETON_NODE, CONTENT_BG_OPACITY); RemoveFormChildNode(FormChildNodeType::FORM_FORBIDDEN_TEXT_NODE); RemoveFormChildNode(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE); return; @@ -868,7 +903,9 @@ void FormPattern::LoadFormSkeleton(bool isRefresh) renderContext->UpdateBackBlurStyle(styleOption); renderContext->UpdateBackgroundColor(isDarkMode ? Color(CONTENT_BG_COLOR_DARK) : Color(CONTENT_BG_COLOR_LIGHT)); - renderContext->UpdateOpacity(CONTENT_BG_OPACITY); + double opacity = formChildrenNodeMap_.find(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE) + != formChildrenNodeMap_.end() ? TRANSPARENT_VAL : CONTENT_BG_OPACITY; + renderContext->SetOpacity(opacity); } columnNode->MarkModifyDone(); columnNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); @@ -1305,7 +1342,8 @@ void FormPattern::AttachRSNode(const std::shared_ptr& node externalRenderContext->SetBounds(cardInfo_.borderWidth, cardInfo_.borderWidth, boundWidth, boundHeight); bool isRecover = want.GetBoolParam(OHOS::AppExecFwk::Constants::FORM_IS_RECOVER_FORM, false); - if (isRecover) { + if (isRecover || formChildrenNodeMap_.find(FormChildNodeType::FORM_FORBIDDEN_ROOT_NODE) + != formChildrenNodeMap_.end()) { TAG_LOGI(AceLogTag::ACE_FORM, "surfaceNode: %{public}s setOpacity:0", std::to_string(node->GetId()).c_str()); externalRenderContext->SetOpacity(TRANSPARENT_VAL); } @@ -1813,4 +1851,22 @@ bool FormPattern::IsMaskEnableForm(const RequestFormInfo& info) static_cast(OHOS::AppExecFwk::Constants::RenderingMode::SINGLE_COLOR) || info.dimension == static_cast(OHOS::AppExecFwk::Constants::Dimension::DIMENSION_1_1); } + +void FormPattern::UpdateChildNodeOpacity(FormChildNodeType formChildNodeType, double opacity) +{ + TAG_LOGI(AceLogTag::ACE_FORM, "formChildNodeType: %{public}d, opacity: %{public}f.", + static_cast(formChildNodeType), opacity); + if (formChildNodeType == FormChildNodeType::FORM_SURFACE_NODE) { + auto externalRenderContext = DynamicCast(GetExternalRenderContext()); + CHECK_NULL_VOID(externalRenderContext); + externalRenderContext->OnOpacityUpdate(opacity); + } else if (formChildNodeType == FormChildNodeType::FORM_STATIC_IMAGE_NODE || + formChildNodeType == FormChildNodeType::FORM_SKELETON_NODE) { + auto childNode = GetFormChildNode(formChildNodeType); + CHECK_NULL_VOID(childNode); + auto renderContext = DynamicCast(childNode->GetRenderContext()); + CHECK_NULL_VOID(renderContext); + renderContext->OnOpacityUpdate(opacity); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/form/form_pattern.h b/frameworks/core/components_ng/pattern/form/form_pattern.h index 6c741291104..1d5591701be 100644 --- a/frameworks/core/components_ng/pattern/form/form_pattern.h +++ b/frameworks/core/components_ng/pattern/form/form_pattern.h @@ -203,6 +203,8 @@ private: RefPtr GetFormChildNode(FormChildNodeType formChildNodeType) const; double GetTimeLimitFontSize(); bool IsMaskEnableForm(const RequestFormInfo &info); + void UpdateChildNodeOpacity(FormChildNodeType formChildNodeType, double opacity); + void SnapshotSurfaceNode(); // used by ArkTS Card, for RSSurfaceNode from FRS, RefPtr externalRenderContext_; diff --git a/test/unittest/core/pattern/form/form_test_ng.cpp b/test/unittest/core/pattern/form/form_test_ng.cpp index 18bbd66ecbc..d52cad7b7f0 100644 --- a/test/unittest/core/pattern/form/form_test_ng.cpp +++ b/test/unittest/core/pattern/form/form_test_ng.cpp @@ -1496,4 +1496,34 @@ HWTEST_F(FormTestNg, CreateTimeLimitNode, TestSize.Level1) pattern->CreateTimeLimitNode(); ASSERT_NE(host, nullptr); } + +/** + * @tc.name: UpdateChildNodeOpacity + * @tc.desc: Test UpdateChildNodeOpacity in Form Pattern. + * @tc.type: FUNC + */ +HWTEST_F(FormTestNg, UpdateChildNodeOpacity, TestSize.Level1) +{ + RefPtr frameNode = CreateFromNode(); + auto pattern = frameNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + auto host = pattern->GetHost(); + pattern->UpdateChildNodeOpacity(FormChildNodeType::FORM_SURFACE_NODE, 0); + ASSERT_NE(host, nullptr); +} + +/** + * @tc.name: SnapshotSurfaceNode + * @tc.desc: Test SnapshotSurfaceNode in Form Pattern. + * @tc.type: FUNC + */ +HWTEST_F(FormTestNg, SnapshotSurfaceNode, TestSize.Level1) +{ + RefPtr frameNode = CreateFromNode(); + auto pattern = frameNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + auto host = pattern->GetHost(); + pattern->SnapshotSurfaceNode(); + ASSERT_NE(host, nullptr); +} } // namespace OHOS::Ace::NG