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