1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "core/common/agingadapation/aging_adapation_dialog_util.h"
16
17 #include "core/common/agingadapation/aging_adapation_dialog_theme.h"
18 #include "core/components_ng/pattern/text/text_pattern.h"
19 namespace OHOS::Ace::NG {
20
ShowLongPressDialog(const std::string & message,ImageSourceInfo & imageSourceInfo)21 RefPtr<FrameNode> AgingAdapationDialogUtil::ShowLongPressDialog(
22 const std::string& message, ImageSourceInfo& imageSourceInfo)
23 {
24 RefPtr<FrameNode> columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
25 ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(true));
26
27 if (imageSourceInfo.IsValid()) {
28 auto context = PipelineBase::GetCurrentContext();
29 CHECK_NULL_RETURN(context, nullptr);
30 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
31 CHECK_NULL_RETURN(dialogTheme, nullptr);
32 auto color = dialogTheme->GetDialogIconColor();
33 imageSourceInfo.SetFillColor(Color(color.GetValue()));
34 auto imageNode = FrameNode::CreateFrameNode(
35 V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
36 auto imageLayoutProperty = imageNode->GetLayoutProperty<ImageLayoutProperty>();
37 CHECK_NULL_RETURN(imageLayoutProperty, nullptr);
38 imageLayoutProperty->UpdateUserDefinedIdealSize(
39 CalcSize(CalcLength(dialogTheme->GetIdealSize()), CalcLength(dialogTheme->GetIdealSize())));
40 imageLayoutProperty->UpdateImageFit(ImageFit::FILL);
41 imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
42 MarginProperty imageMargin;
43 Dimension dialogHeight;
44 if (message.empty()) {
45 float scale = context->GetFontScale();
46 if (NearEqual(scale, dialogTheme->GetBigFontSizeScale()) ||
47 NearEqual(scale, dialogTheme->GetLargeFontSizeScale())) {
48 dialogHeight = Dimension(dialogTheme->GetBigDialogWidth(), DimensionUnit::VP);
49 } else if (NearEqual(scale, dialogTheme->GetMaxFontSizeScale())) {
50 dialogHeight = Dimension(dialogTheme->GetMaxDialogWidth(), DimensionUnit::VP);
51 }
52 auto marginSize = (dialogHeight - dialogTheme->GetIdealSize()).ConvertToPx() / 2;
53 imageMargin.top = CalcLength(Dimension(marginSize, DimensionUnit::PX));
54 imageMargin.bottom = CalcLength(Dimension(marginSize, DimensionUnit::PX));
55 imageLayoutProperty->UpdateMargin(imageMargin);
56 imageNode->MountToParent(columnNode);
57 imageNode->MarkModifyDone();
58 return CreateCustomDialog(columnNode);
59 }
60 imageMargin.top = CalcLength(dialogTheme->GetDialogPropertyTop());
61 imageMargin.bottom = CalcLength(dialogTheme->GetDialogPropertyBottom());
62 imageLayoutProperty->UpdateMargin(imageMargin);
63 imageNode->MountToParent(columnNode);
64 imageNode->MarkModifyDone();
65 }
66 CreateDialogTextNode(columnNode, message);
67 return CreateCustomDialog(columnNode);
68 }
69
ShowLongPressDialog(const std::string & message,const RefPtr<FrameNode> & iconNode)70 RefPtr<FrameNode> AgingAdapationDialogUtil::ShowLongPressDialog(
71 const std::string& message, const RefPtr<FrameNode>& iconNode)
72 {
73 auto context = PipelineBase::GetCurrentContext();
74 CHECK_NULL_RETURN(context, nullptr);
75 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
76 CHECK_NULL_RETURN(dialogTheme, nullptr);
77 auto srcLayoutProperty = iconNode->GetLayoutProperty<TextLayoutProperty>();
78 CHECK_NULL_RETURN(srcLayoutProperty, nullptr);
79 RefPtr<FrameNode> columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
80 ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(true));
81 auto symbolNode = FrameNode::GetOrCreateFrameNode(V2::SYMBOL_ETS_TAG,
82 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<TextPattern>(); });
83 auto symbolProperty = symbolNode->GetLayoutProperty<TextLayoutProperty>();
84 CHECK_NULL_RETURN(symbolProperty, nullptr);
85 symbolProperty->UpdateFontSize(dialogTheme->GetIdealSize());
86 symbolProperty->UpdateSymbolSourceInfo(srcLayoutProperty->GetSymbolSourceInfoValue());
87 auto symbolColorList = srcLayoutProperty->GetSymbolColorListValue({});
88 symbolColorList.empty() ? symbolProperty->UpdateSymbolColorList({ dialogTheme->GetDialogIconColor() })
89 : symbolProperty->UpdateSymbolColorList(symbolColorList);
90 auto fontWeight = srcLayoutProperty->GetFontWeightValue(FontWeight::NORMAL);
91 symbolProperty->UpdateFontWeight(fontWeight);
92 auto renderStrategy = srcLayoutProperty->GetSymbolRenderingStrategyValue(0);
93 symbolProperty->UpdateSymbolRenderingStrategy(renderStrategy);
94 MarginProperty symbolMargin;
95 Dimension dialogHeight;
96 if (message.empty()) {
97 float scale = context->GetFontScale();
98 if (NearEqual(scale, dialogTheme->GetBigFontSizeScale()) ||
99 NearEqual(scale, dialogTheme->GetLargeFontSizeScale())) {
100 dialogHeight = Dimension(dialogTheme->GetBigDialogWidth(), DimensionUnit::VP);
101 } else if (NearEqual(scale, dialogTheme->GetMaxFontSizeScale())) {
102 dialogHeight = Dimension(dialogTheme->GetMaxDialogWidth(), DimensionUnit::VP);
103 }
104 auto marginSize = (dialogHeight - dialogTheme->GetIdealSize()).ConvertToPx() / 2;
105 symbolMargin.top = CalcLength(Dimension(marginSize, DimensionUnit::PX));
106 symbolMargin.bottom = CalcLength(Dimension(marginSize, DimensionUnit::PX));
107 symbolProperty->UpdateMargin(symbolMargin);
108 symbolNode->MountToParent(columnNode);
109 symbolNode->MarkModifyDone();
110 return CreateCustomDialog(columnNode);
111 }
112 symbolMargin.top = CalcLength(dialogTheme->GetDialogPropertyTop());
113 symbolMargin.bottom = CalcLength(dialogTheme->GetDialogPropertyBottom());
114 symbolProperty->UpdateMargin(symbolMargin);
115 symbolNode->MountToParent(columnNode);
116 symbolNode->MarkModifyDone();
117 CreateDialogTextNode(columnNode, message);
118 return CreateCustomDialog(columnNode);
119 }
120
CreateCustomDialog(const RefPtr<FrameNode> & columnNode)121 RefPtr<FrameNode> AgingAdapationDialogUtil::CreateCustomDialog(const RefPtr<FrameNode>& columnNode)
122 {
123 CHECK_NULL_RETURN(columnNode, nullptr);
124 auto context = PipelineBase::GetCurrentContext();
125 CHECK_NULL_RETURN(context, nullptr);
126 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
127 CHECK_NULL_RETURN(dialogTheme, nullptr);
128 DialogProperties dialogProperties;
129 dialogProperties.alignment = DialogAlignment::CENTER;
130 dialogProperties.gridCount = dialogTheme->GetGridCount();
131 dialogProperties.isModal = false;
132 dialogProperties.backgroundColor = Color::TRANSPARENT;
133 dialogProperties.shadow = Shadow::CreateShadow(ShadowStyle::OuterDefaultLG);
134 dialogProperties.borderRadius = BorderRadiusProperty(dialogTheme->GetDialogCornerRadius());
135 CalcSize columnMinSize;
136 float scale = context->GetFontScale();
137 if (NearEqual(scale, dialogTheme->GetBigFontSizeScale()) ||
138 NearEqual(scale, dialogTheme->GetLargeFontSizeScale())) {
139 dialogProperties.width = CalcDimension(dialogTheme->GetBigDialogWidth(), DimensionUnit::VP);
140 columnMinSize.SetHeight(CalcLength(dialogTheme->GetBigDialogWidth(), DimensionUnit::VP));
141 } else if (NearEqual(scale, dialogTheme->GetMaxFontSizeScale())) {
142 dialogProperties.width = CalcDimension(dialogTheme->GetMaxDialogWidth(), DimensionUnit::VP);
143 columnMinSize.SetHeight(CalcLength(dialogTheme->GetMaxDialogWidth(), DimensionUnit::VP));
144 }
145 auto layoutProperty = columnNode->GetLayoutProperty();
146 CHECK_NULL_RETURN(layoutProperty, nullptr);
147 layoutProperty->UpdateCalcMinSize(columnMinSize);
148 layoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_CROSS_AXIS);
149 bool isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
150 auto pipelineContext = PipelineContext::GetCurrentContext();
151 CHECK_NULL_RETURN(pipelineContext, nullptr);
152 auto overlayManager = pipelineContext->GetOverlayManager();
153 CHECK_NULL_RETURN(overlayManager, nullptr);
154 return overlayManager->ShowDialogWithNode(dialogProperties, columnNode, isRightToLeft);
155 }
156
CreateDialogTextNode(const RefPtr<FrameNode> & columnNode,const std::string & message)157 void AgingAdapationDialogUtil::CreateDialogTextNode(const RefPtr<FrameNode>& columnNode, const std::string& message)
158 {
159 CHECK_NULL_VOID(columnNode);
160 auto context = PipelineBase::GetCurrentContext();
161 CHECK_NULL_VOID(context);
162 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
163 CHECK_NULL_VOID(dialogTheme);
164 auto textNode = FrameNode::CreateFrameNode(
165 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
166 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
167 CHECK_NULL_VOID(textLayoutProperty);
168 textLayoutProperty->UpdateContent(message);
169 textLayoutProperty->UpdateFontSize(dialogTheme->GetDialogFontSize());
170 textLayoutProperty->UpdateTextOverflow(TextOverflow::ELLIPSIS);
171 textLayoutProperty->UpdateMaxLines(dialogTheme->GetMaxLines());
172 MarginProperty margin;
173 margin.left = CalcLength(dialogTheme->GetTextPropertyLeft());
174 margin.right = CalcLength(dialogTheme->GetTextPropertyRight());
175 margin.bottom = CalcLength(dialogTheme->GetTextPropertyBottom());
176 if (columnNode->GetFirstChild() == nullptr) {
177 margin.top = CalcLength(dialogTheme->GetTextPropertyBottom());
178 CalcSize textMinSize;
179 Dimension textMinHeight;
180 float scale = context->GetFontScale();
181 if (NearEqual(scale, dialogTheme->GetBigFontSizeScale()) ||
182 NearEqual(scale, dialogTheme->GetLargeFontSizeScale())) {
183 textMinHeight = Dimension(dialogTheme->GetBigDialogWidth(), DimensionUnit::VP) -
184 dialogTheme->GetTextPropertyBottom() - dialogTheme->GetTextPropertyBottom();
185 } else if (NearEqual(scale, dialogTheme->GetMaxFontSizeScale())) {
186 textMinHeight = Dimension(dialogTheme->GetMaxDialogWidth(), DimensionUnit::VP) -
187 dialogTheme->GetTextPropertyBottom() - dialogTheme->GetTextPropertyBottom();
188 }
189 textMinSize.SetHeight(CalcLength(textMinHeight));
190 textLayoutProperty->UpdateCalcMinSize(textMinSize);
191 }
192 textLayoutProperty->UpdateMargin(margin);
193 auto color = dialogTheme->GetDialogFontColor();
194 textLayoutProperty->UpdateTextColor(Color(color.GetValue()));
195 textNode->MountToParent(columnNode);
196 }
197
GetDialogBigFontSizeScale()198 float AgingAdapationDialogUtil::GetDialogBigFontSizeScale()
199 {
200 auto context = PipelineBase::GetCurrentContext();
201 CHECK_NULL_RETURN(context, 0.0);
202 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
203 CHECK_NULL_RETURN(dialogTheme, 0.0);
204 return dialogTheme->GetBigFontSizeScale();
205 }
206
GetDialogLargeFontSizeScale()207 float AgingAdapationDialogUtil::GetDialogLargeFontSizeScale()
208 {
209 auto context = PipelineBase::GetCurrentContextSafely();
210 CHECK_NULL_RETURN(context, 0.0);
211 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
212 CHECK_NULL_RETURN(dialogTheme, 0.0);
213 return dialogTheme->GetLargeFontSizeScale();
214 }
215
GetDialogMaxFontSizeScale()216 float AgingAdapationDialogUtil::GetDialogMaxFontSizeScale()
217 {
218 auto context = PipelineBase::GetCurrentContextSafely();
219 CHECK_NULL_RETURN(context, 0.0);
220 auto dialogTheme = context->GetTheme<AgingAdapationDialogTheme>();
221 CHECK_NULL_RETURN(dialogTheme, 0.0);
222 return dialogTheme->GetMaxFontSizeScale();
223 }
224 } // namespace OHOS::Ace::NG