1 /*
2  * Copyright (c) 2022-2023 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 
16 #include "core/components_ng/pattern/time_picker/timepicker_model_ng.h"
17 
18 #include <cstdint>
19 
20 #include "base/utils/utils.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/button/button_pattern.h"
24 #include "core/components_ng/pattern/stack/stack_pattern.h"
25 #include "core/components_ng/pattern/text/text_pattern.h"
26 #include "core/components_ng/pattern/time_picker/timepicker_column_pattern.h"
27 #include "core/components_ng/pattern/time_picker/timepicker_event_hub.h"
28 #include "core/components_ng/pattern/time_picker/timepicker_layout_property.h"
29 #include "core/components_ng/pattern/time_picker/timepicker_row_pattern.h"
30 #include "core/components_v2/inspector/inspector_constants.h"
31 #include "core/pipeline_ng/pipeline_context.h"
32 
33 namespace OHOS::Ace::NG {
34 namespace {
35 constexpr float PICKER_MAXFONTSCALE = 1.75f;
36 constexpr int32_t BUFFER_NODE_NUMBER = 2;
37 } // namespace
CreateTimePicker(RefPtr<PickerTheme> pickerTheme,bool hasSecond)38 void TimePickerModelNG::CreateTimePicker(RefPtr<PickerTheme> pickerTheme, bool hasSecond)
39 {
40     auto* stack = ViewStackProcessor::GetInstance();
41     auto nodeId = stack->ClaimNodeId();
42     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TIME_PICKER_ETS_TAG, nodeId);
43     auto timePickerNode = FrameNode::GetOrCreateFrameNode(
44         V2::TIME_PICKER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerRowPattern>(); });
45 
46     CHECK_NULL_VOID(pickerTheme);
47     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
48     auto timePickerRowPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
49     CHECK_NULL_VOID(timePickerRowPattern);
50     timePickerRowPattern->SetShowCount(showCount);
51     timePickerRowPattern->SetPickerTag(true);
52     auto hasHourNode = timePickerRowPattern->HasHourNode();
53     auto hasMinuteNode = timePickerRowPattern->HasMinuteNode();
54     auto hourId = timePickerRowPattern->GetHourId();
55     auto minuteId = timePickerRowPattern->GetMinuteId();
56 
57     auto hourColumnNode = FrameNode::GetOrCreateFrameNode(
58         V2::COLUMN_ETS_TAG, hourId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
59     CHECK_NULL_VOID(hourColumnNode);
60     if (!hasHourNode) {
61         for (uint32_t index = 0; index < showCount; index++) {
62             auto textNode = FrameNode::CreateFrameNode(
63                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
64             CHECK_NULL_VOID(textNode);
65             textNode->MountToParent(hourColumnNode);
66         }
67         hourColumnNode->MarkModifyDone();
68         timePickerRowPattern->SetColumn(hourColumnNode);
69     }
70 
71     auto minuteColumnNode = FrameNode::GetOrCreateFrameNode(
72         V2::COLUMN_ETS_TAG, minuteId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
73     CHECK_NULL_VOID(minuteColumnNode);
74     if (!hasMinuteNode) {
75         for (uint32_t index = 0; index < showCount; index++) {
76             auto textNode = FrameNode::CreateFrameNode(
77                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
78             CHECK_NULL_VOID(textNode);
79             textNode->MountToParent(minuteColumnNode);
80         }
81         minuteColumnNode->MarkModifyDone();
82         timePickerRowPattern->SetColumn(minuteColumnNode);
83     }
84     if (!hasHourNode) {
85         auto stackHourNode = CreateStackNode();
86         auto columnBlendNode = CreateColumnNode();
87         auto buttonYearNode = CreateButtonNode();
88         buttonYearNode->MountToParent(stackHourNode);
89         hourColumnNode->MountToParent(columnBlendNode);
90         columnBlendNode->MountToParent(stackHourNode);
91         auto layoutProperty = stackHourNode->GetLayoutProperty<LayoutProperty>();
92         layoutProperty->UpdateAlignment(Alignment::CENTER);
93         layoutProperty->UpdateLayoutWeight(1);
94         stackHourNode->MountToParent(timePickerNode);
95     }
96     if (!hasMinuteNode) {
97         auto stackMinuteNode = CreateStackNode();
98         auto columnBlendNode = CreateColumnNode();
99         auto buttonYearNode = CreateButtonNode();
100         buttonYearNode->MountToParent(stackMinuteNode);
101         minuteColumnNode->MountToParent(columnBlendNode);
102         columnBlendNode->MountToParent(stackMinuteNode);
103         auto layoutProperty = stackMinuteNode->GetLayoutProperty<LayoutProperty>();
104         layoutProperty->UpdateAlignment(Alignment::CENTER);
105         layoutProperty->UpdateLayoutWeight(1);
106         auto language = AceApplicationInfo::GetInstance().GetLanguage();
107         language == "ug" ? stackMinuteNode->MountToParent(timePickerNode, 0)
108                             : stackMinuteNode->MountToParent(timePickerNode);
109     }
110     timePickerRowPattern->SetHasSecond(hasSecond);
111     stack->Push(timePickerNode);
112 }
113 
CreateStackNode()114 RefPtr<FrameNode> TimePickerModelNG::CreateStackNode()
115 {
116     auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
117     return FrameNode::GetOrCreateFrameNode(
118         V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
119 }
120 
CreateColumnNode()121 RefPtr<FrameNode> TimePickerModelNG::CreateColumnNode()
122 {
123     auto columnId = ElementRegister::GetInstance()->MakeUniqueId();
124     return FrameNode::GetOrCreateFrameNode(
125         V2::COLUMN_ETS_TAG, columnId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
126 }
127 
CreateButtonNode()128 RefPtr<FrameNode> TimePickerModelNG::CreateButtonNode()
129 {
130     auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
131     return FrameNode::GetOrCreateFrameNode(
132         V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
133 }
134 
CreateFrameNode(int32_t nodeId)135 RefPtr<FrameNode> TimePickerModelNG::CreateFrameNode(int32_t nodeId)
136 {
137     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TIME_PICKER_ETS_TAG, nodeId);
138     auto timePickerNode = FrameNode::GetOrCreateFrameNode(
139         V2::TIME_PICKER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerRowPattern>(); });
140 
141     auto pipeline = PipelineBase::GetCurrentContextSafely();
142     CHECK_NULL_RETURN(pipeline, timePickerNode);
143     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
144     CHECK_NULL_RETURN(pickerTheme, timePickerNode);
145     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
146     auto timePickerRowPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
147     CHECK_NULL_RETURN(timePickerRowPattern, timePickerNode);
148     timePickerRowPattern->SetShowCount(showCount);
149     timePickerRowPattern->SetPickerTag(true);
150     auto hasHourNode = timePickerRowPattern->HasHourNode();
151     auto hasMinuteNode = timePickerRowPattern->HasMinuteNode();
152     auto hourId = timePickerRowPattern->GetHourId();
153     auto minuteId = timePickerRowPattern->GetMinuteId();
154     SetDefaultAttributes(timePickerNode, pickerTheme);
155 
156     auto hourColumnNode = FrameNode::GetOrCreateFrameNode(
157         V2::COLUMN_ETS_TAG, hourId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
158     CHECK_NULL_RETURN(hourColumnNode, timePickerNode);
159     if (!hasHourNode) {
160         for (uint32_t index = 0; index < showCount; index++) {
161             auto textNode = FrameNode::CreateFrameNode(
162                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
163             CHECK_NULL_RETURN(textNode, timePickerNode);
164             textNode->MountToParent(hourColumnNode);
165         }
166         hourColumnNode->MarkModifyDone();
167         timePickerRowPattern->SetColumn(hourColumnNode);
168     }
169 
170     auto minuteColumnNode = FrameNode::GetOrCreateFrameNode(
171         V2::COLUMN_ETS_TAG, minuteId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
172     CHECK_NULL_RETURN(minuteColumnNode, timePickerNode);
173     if (!hasMinuteNode) {
174         for (uint32_t index = 0; index < showCount; index++) {
175             auto textNode = FrameNode::CreateFrameNode(
176                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
177             CHECK_NULL_RETURN(textNode, timePickerNode);
178             textNode->MountToParent(minuteColumnNode);
179         }
180         minuteColumnNode->MarkModifyDone();
181         timePickerRowPattern->SetColumn(minuteColumnNode);
182     }
183     if (!hasHourNode) {
184         auto stackHourNode = CreateStackNode();
185         auto columnBlendNode = CreateColumnNode();
186         auto buttonYearNode = CreateButtonNode();
187         buttonYearNode->MountToParent(stackHourNode);
188         hourColumnNode->MountToParent(columnBlendNode);
189         columnBlendNode->MountToParent(stackHourNode);
190         auto layoutProperty = stackHourNode->GetLayoutProperty<LayoutProperty>();
191         layoutProperty->UpdateAlignment(Alignment::CENTER);
192         layoutProperty->UpdateLayoutWeight(1);
193         stackHourNode->MountToParent(timePickerNode);
194     }
195     if (!hasMinuteNode) {
196         auto stackMinuteNode = CreateStackNode();
197         auto columnBlendNode = CreateColumnNode();
198         auto buttonYearNode = CreateButtonNode();
199         buttonYearNode->MountToParent(stackMinuteNode);
200         minuteColumnNode->MountToParent(columnBlendNode);
201         columnBlendNode->MountToParent(stackMinuteNode);
202         auto layoutProperty = stackMinuteNode->GetLayoutProperty<LayoutProperty>();
203         layoutProperty->UpdateAlignment(Alignment::CENTER);
204         layoutProperty->UpdateLayoutWeight(1);
205         stackMinuteNode->MountToParent(timePickerNode);
206     }
207     timePickerRowPattern->SetHasSecond(false);
208     return timePickerNode;
209 }
210 
SetSelectedTime(const PickerTime & value)211 void TimePickerModelNG::SetSelectedTime(const PickerTime& value)
212 {
213     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
214     CHECK_NULL_VOID(frameNode);
215     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
216     timePickerRowPattern->SetSelectedTime(value);
217 }
218 
SetIsEnableHapticFeedback(bool isEnableHapticFeedback)219 void TimePickerModelNG::SetIsEnableHapticFeedback(bool isEnableHapticFeedback)
220 {
221     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
222     SetIsEnableHapticFeedback(frameNode, isEnableHapticFeedback);
223 }
224 
SetHour24(bool isUseMilitaryTime)225 void TimePickerModelNG::SetHour24(bool isUseMilitaryTime)
226 {
227     ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, IsUseMilitaryTime, isUseMilitaryTime);
228     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
229     CHECK_NULL_VOID(frameNode);
230     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
231     timePickerRowPattern->ClearOptionsHour();
232     timePickerRowPattern->SetHour24(isUseMilitaryTime);
233 }
234 
SetDateTimeOptions(ZeroPrefixType & hourType,ZeroPrefixType & minuteType,ZeroPrefixType & secondType)235 void TimePickerModelNG::SetDateTimeOptions(ZeroPrefixType& hourType,
236     ZeroPrefixType& minuteType, ZeroPrefixType& secondType)
237 {
238     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
239     CHECK_NULL_VOID(frameNode);
240     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
241     if ((timePickerRowPattern->GetPrefixHour() != hourType) ||
242         (timePickerRowPattern->GetPrefixMinute() != minuteType) ||
243         (timePickerRowPattern->GetPrefixSecond() != secondType)) {
244         timePickerRowPattern->SetDateTimeOptionUpdate(true);
245     }
246     timePickerRowPattern->SetPrefixHour(hourType);
247     ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixHour, static_cast<int32_t>(hourType));
248     ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixMinute, static_cast<int32_t>(minuteType));
249     if (timePickerRowPattern->GetHasSecond()) {
250         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixSecond, static_cast<int32_t>(secondType));
251     } else {
252         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixSecond, static_cast<int32_t>(ZeroPrefixType::OFF));
253     }
254 }
255 
SetWheelModeEnabled(bool wheelModeEnabled)256 void TimePickerModelNG::SetWheelModeEnabled(bool wheelModeEnabled)
257 {
258     ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, Loop, wheelModeEnabled);
259 }
260 
SetWheelModeEnabled(FrameNode * frameNode,bool wheelModeEnabled)261 void TimePickerModelNG::SetWheelModeEnabled(FrameNode* frameNode, bool wheelModeEnabled)
262 {
263     CHECK_NULL_VOID(frameNode);
264     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, Loop, wheelModeEnabled, frameNode);
265 }
266 
SetOnChange(TimeChangeEvent && onChange)267 void TimePickerModelNG::SetOnChange(TimeChangeEvent&& onChange)
268 {
269     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
270     CHECK_NULL_VOID(frameNode);
271     auto eventHub = frameNode->GetEventHub<TimePickerEventHub>();
272     CHECK_NULL_VOID(eventHub);
273     eventHub->SetOnChange(std::move(onChange));
274 }
275 
SetOnChange(FrameNode * frameNode,TimeChangeEvent && onChange)276 void TimePickerModelNG::SetOnChange(FrameNode* frameNode, TimeChangeEvent&& onChange)
277 {
278     CHECK_NULL_VOID(frameNode);
279     auto eventHub = frameNode->GetEventHub<TimePickerEventHub>();
280     CHECK_NULL_VOID(eventHub);
281     eventHub->SetOnChange(std::move(onChange));
282 }
283 
SetDisappearTextStyle(const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)284 void TimePickerModelNG::SetDisappearTextStyle(const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
285 {
286     CHECK_NULL_VOID(theme);
287     auto disappearStyle = theme->GetDisappearOptionStyle();
288     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
289         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, DisappearFontSize,
290             ConvertFontScaleValue(value.fontSize.value()));
291     } else {
292         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, DisappearFontSize,
293             ConvertFontScaleValue(disappearStyle.GetFontSize()));
294     }
295     ACE_UPDATE_LAYOUT_PROPERTY(
296         TimePickerLayoutProperty, DisappearColor, value.textColor.value_or(disappearStyle.GetTextColor()));
297     ACE_UPDATE_LAYOUT_PROPERTY(
298         TimePickerLayoutProperty, DisappearWeight, value.fontWeight.value_or(disappearStyle.GetFontWeight()));
299     ACE_UPDATE_LAYOUT_PROPERTY(
300         TimePickerLayoutProperty, DisappearFontFamily, value.fontFamily.value_or(disappearStyle.GetFontFamilies()));
301     ACE_UPDATE_LAYOUT_PROPERTY(
302         TimePickerLayoutProperty, DisappearFontStyle, value.fontStyle.value_or(disappearStyle.GetFontStyle()));
303 }
304 
SetNormalTextStyle(const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)305 void TimePickerModelNG::SetNormalTextStyle(const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
306 {
307     CHECK_NULL_VOID(theme);
308     auto normalStyle = theme->GetOptionStyle(false, false);
309     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
310         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontSize, ConvertFontScaleValue(value.fontSize.value()));
311     } else {
312         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontSize,
313             ConvertFontScaleValue(normalStyle.GetFontSize()));
314     }
315     ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, Color, value.textColor.value_or(normalStyle.GetTextColor()));
316     ACE_UPDATE_LAYOUT_PROPERTY(
317         TimePickerLayoutProperty, Weight, value.fontWeight.value_or(normalStyle.GetFontWeight()));
318     ACE_UPDATE_LAYOUT_PROPERTY(
319         TimePickerLayoutProperty, FontFamily, value.fontFamily.value_or(normalStyle.GetFontFamilies()));
320     ACE_UPDATE_LAYOUT_PROPERTY(
321         TimePickerLayoutProperty, FontStyle, value.fontStyle.value_or(normalStyle.GetFontStyle()));
322 }
323 
SetSelectedTextStyle(const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)324 void TimePickerModelNG::SetSelectedTextStyle(const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
325 {
326     CHECK_NULL_VOID(theme);
327     auto selectedStyle = theme->GetOptionStyle(true, false);
328     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
329         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, SelectedFontSize,
330             ConvertFontScaleValue(value.fontSize.value()));
331     } else {
332         ACE_UPDATE_LAYOUT_PROPERTY(TimePickerLayoutProperty, SelectedFontSize,
333             ConvertFontScaleValue(selectedStyle.GetFontSize()));
334     }
335     ACE_UPDATE_LAYOUT_PROPERTY(
336         TimePickerLayoutProperty, SelectedColor, value.textColor.value_or(selectedStyle.GetTextColor()));
337     ACE_UPDATE_LAYOUT_PROPERTY(
338         TimePickerLayoutProperty, SelectedWeight, value.fontWeight.value_or(selectedStyle.GetFontWeight()));
339     ACE_UPDATE_LAYOUT_PROPERTY(
340         TimePickerLayoutProperty, SelectedFontFamily, value.fontFamily.value_or(selectedStyle.GetFontFamilies()));
341     ACE_UPDATE_LAYOUT_PROPERTY(
342         TimePickerLayoutProperty, SelectedFontStyle, value.fontStyle.value_or(selectedStyle.GetFontStyle()));
343 }
344 
HasUserDefinedDisappearFontFamily(bool isUserDefined)345 void TimePickerModelNG::HasUserDefinedDisappearFontFamily(bool isUserDefined)
346 {
347     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
348     CHECK_NULL_VOID(frameNode);
349     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
350     CHECK_NULL_VOID(timePickerRowPattern);
351     timePickerRowPattern->HasUserDefinedDisappearFontFamily(isUserDefined);
352 }
353 
HasUserDefinedNormalFontFamily(bool isUserDefined)354 void TimePickerModelNG::HasUserDefinedNormalFontFamily(bool isUserDefined)
355 {
356     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
357     CHECK_NULL_VOID(frameNode);
358     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
359     CHECK_NULL_VOID(timePickerRowPattern);
360     timePickerRowPattern->HasUserDefinedNormalFontFamily(isUserDefined);
361 }
362 
HasUserDefinedSelectedFontFamily(bool isUserDefined)363 void TimePickerModelNG::HasUserDefinedSelectedFontFamily(bool isUserDefined)
364 {
365     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
366     CHECK_NULL_VOID(frameNode);
367     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
368     CHECK_NULL_VOID(timePickerRowPattern);
369     timePickerRowPattern->HasUserDefinedSelectedFontFamily(isUserDefined);
370 }
371 
SetBackgroundColor(const Color & color)372 void TimePickerModelNG::SetBackgroundColor(const Color& color)
373 {
374     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
375     CHECK_NULL_VOID(frameNode);
376     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
377     CHECK_NULL_VOID(timePickerRowPattern);
378     timePickerRowPattern->SetBackgroundColor(color);
379 }
380 
SetChangeEvent(TimeChangeEvent && onChange)381 void TimePickerModelNG::SetChangeEvent(TimeChangeEvent&& onChange)
382 {
383     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
384     CHECK_NULL_VOID(frameNode);
385     auto eventHub = frameNode->GetEventHub<TimePickerEventHub>();
386     CHECK_NULL_VOID(eventHub);
387     eventHub->SetChangeEvent(std::move(onChange));
388 }
389 
SetTimePickerDialogShow(PickerDialogInfo & pickerDialog,NG::TimePickerSettingData & settingData,std::function<void ()> && onCancel,std::function<void (const std::string &)> && onAccept,std::function<void (const std::string &)> && onChange,TimePickerDialogEvent & timePickerDialogEvent,const std::vector<ButtonInfo> & buttonInfos)390 void TimePickerDialogModelNG::SetTimePickerDialogShow(PickerDialogInfo& pickerDialog,
391     NG::TimePickerSettingData& settingData, std::function<void()>&& onCancel,
392     std::function<void(const std::string&)>&& onAccept, std::function<void(const std::string&)>&& onChange,
393     TimePickerDialogEvent& timePickerDialogEvent, const std::vector<ButtonInfo>& buttonInfos)
394 {
395     auto container = Container::Current();
396     if (!container) {
397         return;
398     }
399     auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
400     if (!pipelineContext) {
401         return;
402     }
403     auto executor = pipelineContext->GetTaskExecutor();
404     if (!executor) {
405         return;
406     }
407     auto pipeline = PipelineBase::GetCurrentContext();
408     CHECK_NULL_VOID(pipeline);
409     auto theme = pipeline->GetTheme<DialogTheme>();
410     CHECK_NULL_VOID(theme);
411     std::map<std::string, NG::DialogEvent> dialogEvent;
412     dialogEvent["changeId"] = onChange;
413     dialogEvent["acceptId"] = onAccept;
414     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent;
415     auto func = [onCancel](const GestureEvent& /* info */) {
416         if (onCancel) {
417             onCancel();
418         }
419     };
420     dialogCancelEvent["cancelId"] = func;
421     std::map<std::string, NG::DialogCancelEvent> dialogLifeCycleEvent;
422     dialogLifeCycleEvent["didAppearId"] = timePickerDialogEvent.onDidAppear;
423     dialogLifeCycleEvent["didDisappearId"] = timePickerDialogEvent.onDidDisappear;
424     dialogLifeCycleEvent["willAppearId"] = timePickerDialogEvent.onWillAppear;
425     dialogLifeCycleEvent["willDisappearId"] = timePickerDialogEvent.onWillDisappear;
426     DialogProperties properties;
427     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
428         properties.alignment = theme->GetAlignment();
429     }
430     if (pickerDialog.alignment.has_value()) {
431         properties.alignment = pickerDialog.alignment.value();
432     }
433 
434     if (pickerDialog.backgroundColor.has_value()) {
435         properties.backgroundColor = pickerDialog.backgroundColor.value();
436     }
437     if (pickerDialog.backgroundBlurStyle.has_value()) {
438         properties.backgroundBlurStyle = pickerDialog.backgroundBlurStyle.value();
439     }
440     if (pickerDialog.shadow.has_value()) {
441         properties.shadow = pickerDialog.shadow.value();
442     }
443     properties.customStyle = false;
444     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
445         properties.offset = DimensionOffset(Offset(0, -theme->GetMarginBottom().ConvertToPx()));
446     }
447     if (pickerDialog.offset.has_value()) {
448         properties.offset = pickerDialog.offset.value();
449     }
450 
451     properties.maskRect = pickerDialog.maskRect;
452     properties.enableHoverMode = pickerDialog.enableHoverMode;
453     if (pickerDialog.hoverModeArea.has_value()) {
454         properties.hoverModeArea = pickerDialog.hoverModeArea.value();
455     }
456 
457     std::map<std::string, PickerTime> timePickerProperty;
458     if (pickerDialog.isSelectedTime == true) {
459         timePickerProperty["selected"] = pickerDialog.pickerTime;
460     }
461     auto context = AccessibilityManager::DynamicCast<NG::PipelineContext>(pipelineContext);
462     auto overlayManager = context ? context->GetOverlayManager() : nullptr;
463     executor->PostTask(
464         [properties, settingData, timePickerProperty, dialogEvent, dialogCancelEvent, dialogLifeCycleEvent, buttonInfos,
465             weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
466             auto overlayManager = weak.Upgrade();
467             CHECK_NULL_VOID(overlayManager);
468             overlayManager->ShowTimeDialog(properties, settingData, timePickerProperty, dialogEvent, dialogCancelEvent,
469                 dialogLifeCycleEvent, buttonInfos);
470         },
471         TaskExecutor::TaskType::UI, "ArkUITimePickerShowTimeDialog");
472 }
473 
SetSelectedTime(FrameNode * frameNode,const PickerTime & value)474 void TimePickerModelNG::SetSelectedTime(FrameNode* frameNode, const PickerTime& value)
475 {
476     CHECK_NULL_VOID(frameNode);
477     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
478     timePickerRowPattern->SetSelectedTime(value);
479 }
480 
SetDisappearTextStyle(FrameNode * frameNode,const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)481 void TimePickerModelNG::SetDisappearTextStyle(
482     FrameNode* frameNode, const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
483 {
484     CHECK_NULL_VOID(theme);
485     auto disappearStyle = theme->GetDisappearOptionStyle();
486     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
487         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
488             TimePickerLayoutProperty, DisappearFontSize,
489             ConvertFontScaleValue(value.fontSize.value()), frameNode);
490     } else {
491         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
492             TimePickerLayoutProperty, DisappearFontSize,
493             ConvertFontScaleValue(disappearStyle.GetFontSize()), frameNode);
494     }
495     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
496         TimePickerLayoutProperty, DisappearColor,
497         value.textColor.value_or(disappearStyle.GetTextColor()), frameNode);
498     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
499         TimePickerLayoutProperty, DisappearWeight,
500         value.fontWeight.value_or(disappearStyle.GetFontWeight()), frameNode);
501     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
502         TimePickerLayoutProperty, DisappearFontFamily,
503         value.fontFamily.value_or(disappearStyle.GetFontFamilies()), frameNode);
504     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
505         TimePickerLayoutProperty, DisappearFontStyle,
506         value.fontStyle.value_or(disappearStyle.GetFontStyle()), frameNode);
507 }
SetNormalTextStyle(FrameNode * frameNode,const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)508 void TimePickerModelNG::SetNormalTextStyle(
509     FrameNode* frameNode, const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
510 {
511     CHECK_NULL_VOID(theme);
512     auto normalStyle = theme->GetOptionStyle(false, false);
513     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
514         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontSize,
515             ConvertFontScaleValue(value.fontSize.value()), frameNode);
516     } else {
517         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontSize,
518             ConvertFontScaleValue(normalStyle.GetFontSize()), frameNode);
519     }
520     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
521         TimePickerLayoutProperty, Color, value.textColor.value_or(normalStyle.GetTextColor()), frameNode);
522     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
523         TimePickerLayoutProperty, Weight, value.fontWeight.value_or(normalStyle.GetFontWeight()), frameNode);
524     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
525         TimePickerLayoutProperty, FontFamily, value.fontFamily.value_or(normalStyle.GetFontFamilies()), frameNode);
526     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
527         TimePickerLayoutProperty, FontStyle, value.fontStyle.value_or(normalStyle.GetFontStyle()), frameNode);
528 }
SetSelectedTextStyle(FrameNode * frameNode,const RefPtr<PickerTheme> & theme,const PickerTextStyle & value)529 void TimePickerModelNG::SetSelectedTextStyle(
530     FrameNode* frameNode, const RefPtr<PickerTheme>& theme, const PickerTextStyle& value)
531 {
532     CHECK_NULL_VOID(theme);
533     auto selectedStyle = theme->GetOptionStyle(true, false);
534     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
535         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
536             TimePickerLayoutProperty, SelectedFontSize,
537             ConvertFontScaleValue(value.fontSize.value()), frameNode);
538     } else {
539         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
540             TimePickerLayoutProperty, SelectedFontSize,
541             ConvertFontScaleValue(selectedStyle.GetFontSize()), frameNode);
542     }
543     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
544         TimePickerLayoutProperty, SelectedColor,
545         value.textColor.value_or(selectedStyle.GetTextColor()), frameNode);
546     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
547         TimePickerLayoutProperty, SelectedWeight,
548         value.fontWeight.value_or(selectedStyle.GetFontWeight()), frameNode);
549     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
550         TimePickerLayoutProperty, SelectedFontFamily,
551         value.fontFamily.value_or(selectedStyle.GetFontFamilies()), frameNode);
552     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
553         TimePickerLayoutProperty, SelectedFontStyle, value.fontStyle.value_or(selectedStyle.GetFontStyle()), frameNode);
554 }
555 
SetDefaultAttributes(RefPtr<FrameNode> & frameNode,const RefPtr<PickerTheme> & pickerTheme)556 void TimePickerModelNG::SetDefaultAttributes(RefPtr<FrameNode>& frameNode, const RefPtr<PickerTheme>& pickerTheme)
557 {
558     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
559     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, SelectedFontSize,
560         ConvertFontScaleValue(selectedStyle.GetFontSize()), frameNode);
561     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, SelectedColor, selectedStyle.GetTextColor(), frameNode);
562     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, SelectedWeight, selectedStyle.GetFontWeight(), frameNode);
563     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
564         TimePickerLayoutProperty, SelectedFontFamily, selectedStyle.GetFontFamilies(), frameNode);
565     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
566         TimePickerLayoutProperty, SelectedFontStyle, selectedStyle.GetFontStyle(), frameNode);
567 
568     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
569     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
570         TimePickerLayoutProperty, DisappearFontSize,
571         ConvertFontScaleValue(disappearStyle.GetFontSize()), frameNode);
572     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
573         TimePickerLayoutProperty, DisappearColor, disappearStyle.GetTextColor(), frameNode);
574     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
575         TimePickerLayoutProperty, DisappearWeight, disappearStyle.GetFontWeight(), frameNode);
576     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
577         TimePickerLayoutProperty, DisappearFontFamily, disappearStyle.GetFontFamilies(), frameNode);
578     ACE_UPDATE_NODE_LAYOUT_PROPERTY(
579         TimePickerLayoutProperty, DisappearFontStyle, disappearStyle.GetFontStyle(), frameNode);
580 
581     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
582     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontSize,
583         ConvertFontScaleValue(normalStyle.GetFontSize()), frameNode);
584     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, Color, normalStyle.GetTextColor(), frameNode);
585     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, Weight, normalStyle.GetFontWeight(), frameNode);
586     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontFamily, normalStyle.GetFontFamilies(), frameNode);
587     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, FontStyle, normalStyle.GetFontStyle(), frameNode);
588 }
589 
SetBackgroundColor(FrameNode * frameNode,const Color & color)590 void TimePickerModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& color)
591 {
592     CHECK_NULL_VOID(frameNode);
593     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
594     CHECK_NULL_VOID(timePickerRowPattern);
595     timePickerRowPattern->SetBackgroundColor(color);
596 }
597 
SetIsEnableHapticFeedback(FrameNode * frameNode,bool isEnableHapticFeedback)598 void TimePickerModelNG::SetIsEnableHapticFeedback(FrameNode* frameNode, bool isEnableHapticFeedback)
599 {
600     CHECK_NULL_VOID(frameNode);
601     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
602     CHECK_NULL_VOID(timePickerRowPattern);
603     timePickerRowPattern->SetIsEnableHaptic(isEnableHapticFeedback);
604 }
605 
SetHour24(FrameNode * frameNode,bool isUseMilitaryTime)606 void TimePickerModelNG::SetHour24(FrameNode* frameNode, bool isUseMilitaryTime)
607 {
608     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, IsUseMilitaryTime, isUseMilitaryTime, frameNode);
609     CHECK_NULL_VOID(frameNode);
610     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
611     timePickerRowPattern->ClearOptionsHour();
612     timePickerRowPattern->SetHour24(isUseMilitaryTime);
613 }
614 
SetDateTimeOptions(FrameNode * frameNode,ZeroPrefixType & hourType,ZeroPrefixType & minuteType,ZeroPrefixType & secondType)615 void TimePickerModelNG::SetDateTimeOptions(FrameNode* frameNode, ZeroPrefixType& hourType,
616     ZeroPrefixType& minuteType, ZeroPrefixType& secondType)
617 {
618     CHECK_NULL_VOID(frameNode);
619     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
620     timePickerRowPattern->SetPrefixHour(hourType);
621     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixHour, static_cast<int32_t>(hourType), frameNode);
622     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixMinute,
623         static_cast<int32_t>(minuteType), frameNode);
624     if (timePickerRowPattern->GetHasSecond()) {
625         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixSecond,
626             static_cast<int32_t>(secondType), frameNode);
627     } else {
628         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TimePickerLayoutProperty, PrefixSecond,
629             static_cast<int32_t>(ZeroPrefixType::OFF), frameNode);
630     }
631 }
632 
getDisappearTextStyle(FrameNode * frameNode)633 PickerTextStyle TimePickerModelNG::getDisappearTextStyle(FrameNode* frameNode)
634 {
635     PickerTextStyle pickerTextStyle;
636     CHECK_NULL_RETURN(frameNode, pickerTextStyle);
637     auto context = frameNode->GetContext();
638     CHECK_NULL_RETURN(context, pickerTextStyle);
639     auto theme = context->GetTheme<PickerTheme>();
640     CHECK_NULL_RETURN(theme, pickerTextStyle);
641     auto style = theme->GetDisappearOptionStyle();
642     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
643         TimePickerLayoutProperty, DisappearFontSize, pickerTextStyle.fontSize, frameNode,
644         ConvertFontScaleValue(style.GetFontSize()));
645     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
646         TimePickerLayoutProperty, DisappearColor, pickerTextStyle.textColor, frameNode, style.GetTextColor());
647     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
648         TimePickerLayoutProperty, DisappearWeight, pickerTextStyle.fontWeight, frameNode, style.GetFontWeight());
649     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, DisappearFontFamily,
650         pickerTextStyle.fontFamily, frameNode, style.GetFontFamilies());
651     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, DisappearFontStyle,
652         pickerTextStyle.fontStyle, frameNode, style.GetFontStyle());
653     return pickerTextStyle;
654 }
655 
getNormalTextStyle(FrameNode * frameNode)656 PickerTextStyle TimePickerModelNG::getNormalTextStyle(FrameNode* frameNode)
657 {
658     PickerTextStyle pickerTextStyle;
659     CHECK_NULL_RETURN(frameNode, pickerTextStyle);
660     auto context = frameNode->GetContext();
661     CHECK_NULL_RETURN(context, pickerTextStyle);
662     auto theme = context->GetTheme<PickerTheme>();
663     CHECK_NULL_RETURN(theme, pickerTextStyle);
664     auto style = theme->GetOptionStyle(false, false);
665     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
666         TimePickerLayoutProperty, FontSize, pickerTextStyle.fontSize, frameNode,
667         ConvertFontScaleValue(style.GetFontSize()));
668     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
669         TimePickerLayoutProperty, Color, pickerTextStyle.textColor, frameNode, style.GetTextColor());
670     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
671         TimePickerLayoutProperty, Weight, pickerTextStyle.fontWeight, frameNode, style.GetFontWeight());
672     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, FontFamily,
673         pickerTextStyle.fontFamily, frameNode, style.GetFontFamilies());
674     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, FontStyle,
675         pickerTextStyle.fontStyle, frameNode, style.GetFontStyle());
676     return pickerTextStyle;
677 }
678 
getSelectedTextStyle(FrameNode * frameNode)679 PickerTextStyle TimePickerModelNG::getSelectedTextStyle(FrameNode* frameNode)
680 {
681     PickerTextStyle pickerTextStyle;
682     CHECK_NULL_RETURN(frameNode, pickerTextStyle);
683     auto context = frameNode->GetContext();
684     CHECK_NULL_RETURN(context, pickerTextStyle);
685     auto theme = context->GetTheme<PickerTheme>();
686     CHECK_NULL_RETURN(theme, pickerTextStyle);
687     auto style = theme->GetOptionStyle(true, false);
688     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
689         TimePickerLayoutProperty, SelectedFontSize, pickerTextStyle.fontSize, frameNode,
690         ConvertFontScaleValue(style.GetFontSize()));
691     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
692         TimePickerLayoutProperty, SelectedColor, pickerTextStyle.textColor, frameNode, style.GetTextColor());
693     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
694         TimePickerLayoutProperty, SelectedWeight, pickerTextStyle.fontWeight, frameNode, style.GetFontWeight());
695     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, SelectedFontFamily,
696         pickerTextStyle.fontFamily, frameNode, style.GetFontFamilies());
697     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TimePickerLayoutProperty, SelectedFontStyle,
698         pickerTextStyle.fontStyle, frameNode, style.GetFontStyle());
699     return pickerTextStyle;
700 }
701 
getTimepickerSelected(FrameNode * frameNode)702 PickerTime TimePickerModelNG::getTimepickerSelected(FrameNode* frameNode)
703 {
704     PickerTime pickerTime;
705     CHECK_NULL_RETURN(frameNode, pickerTime);
706     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
707     return timePickerRowPattern->GetSelectedTime();
708 }
709 
getTimepickerBackgroundColor(FrameNode * frameNode)710 uint32_t TimePickerModelNG::getTimepickerBackgroundColor(FrameNode* frameNode)
711 {
712     CHECK_NULL_RETURN(frameNode, 0);
713     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
714     CHECK_NULL_RETURN(timePickerRowPattern, 0);
715     return timePickerRowPattern->GetBackgroundColor().GetValue();
716 }
717 
getEnableHapticFeedback(FrameNode * frameNode)718 int32_t TimePickerModelNG::getEnableHapticFeedback(FrameNode* frameNode)
719 {
720     CHECK_NULL_RETURN(frameNode, static_cast<uint32_t>(true));
721     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
722     CHECK_NULL_RETURN(timePickerRowPattern, static_cast<uint32_t>(true));
723     return static_cast<uint32_t>(timePickerRowPattern->GetIsEnableHaptic());
724 }
725 
getTimepickerUseMilitaryTime(FrameNode * frameNode)726 int32_t TimePickerModelNG::getTimepickerUseMilitaryTime(FrameNode* frameNode)
727 {
728     CHECK_NULL_RETURN(frameNode, 0);
729     return frameNode->GetLayoutProperty<TimePickerLayoutProperty>()->GetIsUseMilitaryTimeValue(false);
730 }
731 
ConvertFontScaleValue(const Dimension & fontSizeValue)732 const Dimension TimePickerModelNG::ConvertFontScaleValue(const Dimension& fontSizeValue)
733 {
734     auto pipeline = PipelineContext::GetCurrentContext();
735     CHECK_NULL_RETURN(pipeline, fontSizeValue);
736 
737     float fontScaleValue = pipeline->GetFontScale();
738     if (fontScaleValue == 0) {
739         return fontSizeValue;
740     }
741 
742     if (GreatOrEqualCustomPrecision(fontScaleValue, PICKER_MAXFONTSCALE)) {
743         if (fontSizeValue.Unit() != DimensionUnit::VP) {
744             return Dimension(fontSizeValue / fontScaleValue);
745         }
746     }
747     return fontSizeValue;
748 }
749 
HasUserDefinedOpacity()750 void TimePickerModelNG::HasUserDefinedOpacity()
751 {
752     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
753     CHECK_NULL_VOID(frameNode);
754     auto timePickerRowPattern = frameNode->GetPattern<TimePickerRowPattern>();
755     CHECK_NULL_VOID(timePickerRowPattern);
756     auto renderContext = frameNode->GetRenderContext();
757     CHECK_NULL_VOID(renderContext);
758     timePickerRowPattern->SetUserDefinedOpacity(renderContext->GetOpacityValue(1.0));
759 }
760 } // namespace OHOS::Ace::NG
761