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 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H
18 
19 #include <vector>
20 #include <optional>
21 #include <unordered_map>
22 
23 #include "base/memory/ace_type.h"
24 #include "base/memory/referenced.h"
25 #include "core/components_ng/manager/focus/focus_view.h"
26 #include "core/components_ng/pattern/navigation/nav_bar_layout_property.h"
27 #include "core/components_ng/pattern/navigation/nav_bar_node.h"
28 #include "core/components_ng/pattern/navigation/navdestination_layout_property_base.h"
29 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
30 #include "core/components_ng/pattern/navigation/navigation_options.h"
31 #include "core/components_ng/pattern/navigation/tool_bar_node.h"
32 #include "core/components_ng/pattern/pattern.h"
33 #include "core/pipeline/base/element_register.h"
34 
35 namespace OHOS::Ace::NG {
36 
37 class NavDestinationPatternBase : public Pattern, public FocusView {
38     DECLARE_ACE_TYPE(NavDestinationPatternBase, Pattern, FocusView);
39 public:
40     NavDestinationPatternBase() = default;
41     ~NavDestinationPatternBase() override = default;
42 
43     void SetTitleBarStyle(const std::optional<BarStyle>& barStyle);
44 
GetTitleBarStyle()45     std::optional<BarStyle> GetTitleBarStyle() const
46     {
47         return titleBarStyle_;
48     }
49 
50     void SetToolBarStyle(const std::optional<BarStyle>& barStyle);
51 
GetToolBarStyle()52     std::optional<BarStyle> GetToolBarStyle() const
53     {
54         return toolBarStyle_;
55     }
56 
IsAtomicNode()57     bool IsAtomicNode() const override
58     {
59         return false;
60     }
61 
CheckCustomAvoidKeyboard()62     bool CheckCustomAvoidKeyboard() const override
63     {
64         return !NearZero(avoidKeyboardOffset_);
65     }
SetAvoidKeyboardOffset(float avoidKeyboardOffset)66     void SetAvoidKeyboardOffset(float avoidKeyboardOffset)
67     {
68         avoidKeyboardOffset_ = avoidKeyboardOffset;
69     }
GetAvoidKeyboardOffset()70     float GetAvoidKeyboardOffset()
71     {
72         return avoidKeyboardOffset_;
73     }
74 
GetFocusPattern()75     FocusPattern GetFocusPattern() const override
76     {
77         return { FocusType::SCOPE, true };
78     }
79 
GetRouteOfFirstScope()80     std::list<int32_t> GetRouteOfFirstScope() override
81     {
82         return {};
83     }
84 
IsEntryFocusView()85     bool IsEntryFocusView() override
86     {
87         return false;
88     }
89 
SetTitleBarMenuItems(const std::vector<BarItem> & menuItems)90     void SetTitleBarMenuItems(const std::vector<BarItem>& menuItems)
91     {
92         titleBarMenuItems_ = menuItems;
93     }
94 
GetTitleBarMenuItems()95     const std::vector<BarItem>& GetTitleBarMenuItems() const
96     {
97         return titleBarMenuItems_;
98     }
99 
SetToolBarMenuItems(const std::vector<BarItem> & menuItems)100     void SetToolBarMenuItems(const std::vector<BarItem>& menuItems)
101     {
102         toolBarMenuItems_ = menuItems;
103     }
104 
GetToolBarMenuItems()105     const std::vector<BarItem>& GetToolBarMenuItems() const
106     {
107         return toolBarMenuItems_;
108     }
109 
GetMenuNodeId()110     int32_t GetMenuNodeId() const
111     {
112         return menuNodeId_.value();
113     }
114 
GetLandscapeMenuNodeId()115     int32_t GetLandscapeMenuNodeId()
116     {
117         if (!landscapeMenuNodeId_.has_value()) {
118             landscapeMenuNodeId_ = ElementRegister::GetInstance()->MakeUniqueId();
119         }
120         return landscapeMenuNodeId_.value();
121     }
122 
SetMenuNodeId(const int32_t menuNodeId)123     void SetMenuNodeId(const int32_t menuNodeId)
124     {
125         menuNodeId_ = menuNodeId;
126     }
127 
SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId)128     void SetLandscapeMenuNodeId(const int32_t landscapeMenuNodeId)
129     {
130         landscapeMenuNodeId_ = landscapeMenuNodeId;
131     }
132 
HasMenuNodeId()133     bool HasMenuNodeId() const
134     {
135         return menuNodeId_.has_value();
136     }
137 
HasLandscapeMenuNodeId()138     bool HasLandscapeMenuNodeId() const
139     {
140         return landscapeMenuNodeId_.has_value();
141     }
142 
GetToolbarHideStatus()143     bool GetToolbarHideStatus()
144     {
145         return isHideToolbar_;
146     }
147 
GetMaxMenuNum()148     int32_t GetMaxMenuNum() const
149     {
150         return maxMenuNums_;
151     }
152 
SetMaxMenuNum(int32_t maxMenu)153     void SetMaxMenuNum(int32_t maxMenu)
154     {
155         maxMenuNums_ = maxMenu;
156     }
157 
GetTitleBarHeight()158     float GetTitleBarHeight() const
159     {
160         return titleBarHeight_;
161     }
SetTitleBarHeight(float height)162     void SetTitleBarHeight(float height)
163     {
164         titleBarHeight_ = height;
165     }
166 
GetToolBarHeight()167     float GetToolBarHeight() const
168     {
169         return toolBarHeight_;
170     }
SetToolBarHeight(float height)171     void SetToolBarHeight(float height)
172     {
173         toolBarHeight_ = height;
174     }
175 
GetToolBarDividerHeight()176     float GetToolBarDividerHeight() const
177     {
178         return toolBarDividerHeight_;
179     }
SetToolBarDividerHeight(float height)180     void SetToolBarDividerHeight(float height)
181     {
182         toolBarDividerHeight_ = height;
183     }
184 
GetTitleBarAnimationCount()185     int32_t GetTitleBarAnimationCount() const
186     {
187         return titleBarAnimationCount_;
188     }
OnTitleBarAnimationStart()189     void OnTitleBarAnimationStart()
190     {
191         titleBarAnimationCount_++;
192     }
193 
GetToolBarAnimationCount()194     int32_t GetToolBarAnimationCount() const
195     {
196         return toolBarAnimationCount_;
197     }
OnToolBarAnimationStart()198     void OnToolBarAnimationStart()
199     {
200         toolBarAnimationCount_++;
201     }
202 
SetCurrHideToolBar(bool currHideToolBar)203     void SetCurrHideToolBar(bool currHideToolBar)
204     {
205         currHideToolBar_ = currHideToolBar;
206     }
207 
GetCurrHideToolBar()208     std::optional<bool> GetCurrHideToolBar()
209     {
210         return currHideToolBar_;
211     }
212     void HideOrShowToolBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide);
213     void OnToolBarAnimationFinish();
214     void OnTitleBarAnimationFinish();
215     void UpdateToolBarAndDividerProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide,
216         const RefPtr<NavDestinationNodeBase>& hostNode);
217     void UpdateToolBarAndDividerTranslateAndOpacity(bool hide, const RefPtr<NavToolbarNode>& toolBarNode,
218         float toolBarHeight, const RefPtr<FrameNode>& toolbarDividerNode, float toolBarDividerHeight);
219     void UpdateTitleBarProperty(const RefPtr<LayoutProperty>& navBarLayoutProperty, bool hide,
220         const RefPtr<NavDestinationNodeBase>& hostNode);
221     void UpdateTitleBarTranslateAndOpacity(bool hide, const RefPtr<TitleBarNode>& titleBarNode, float titleBarHeight);
222     void HideOrShowTitleBarImmediately(const RefPtr<NavDestinationNodeBase>& hostNode, bool hide);
223     void HandleTitleBarAndToolBarAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase,
224         bool needRunTitleBarAnimation, bool needRunToolBarAnimation);
225     void StartAnimation(bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool);
226 
IsNeedHideToolBarForNavWidth()227     bool IsNeedHideToolBarForNavWidth() const
228     {
229         return needHideToolBarForNavWidth_;
230     }
231 
SetIsNeedHideToolBarForNavWidth(bool hide)232     void SetIsNeedHideToolBarForNavWidth(bool hide)
233     {
234         needHideToolBarForNavWidth_ = hide;
235     }
236 
UpdateSafeAreaPaddingChanged(bool changed)237     void UpdateSafeAreaPaddingChanged(bool changed)
238     {
239         safeAreaPaddingChanged_ = changed;
240     }
241 
IsSafeAreaPaddingChanged()242     bool IsSafeAreaPaddingChanged() const
243     {
244         return safeAreaPaddingChanged_;
245     }
246 
GetTitleBarOffsetY()247     float GetTitleBarOffsetY() const
248     {
249         return titleBarOffsetY_;
250     }
251 
SetTitleBarOffsetY(float titleBarOffsetY)252     void SetTitleBarOffsetY(float titleBarOffsetY)
253     {
254         titleBarOffsetY_ = titleBarOffsetY;
255     }
256 
257     void MarkSafeAreaPaddingChangedWithCheckTitleBar(float titleBarHeight);
258 protected:
259     void AbortBarAnimation();
260     void UpdateHideBarProperty();
261     void ExpandContentSafeAreaIfNeeded();
262     void RemoveAnimation(int32_t id);
263     void BarAnimationPropertyCallback(
264         bool needRunTitleBarAnimation, bool hideTitle, bool needRunToolBarAnimation, bool hideTool);
265     void BarAnimationFinishCallback(bool needRunTitleBarAnimation, bool needRunToolBarAnimation, int32_t animationId);
266     void UpdateLayoutPropertyBeforeAnimation(const RefPtr<NavDestinationNodeBase>& navNodeBase,
267         bool needRunTitleBarAnimation, bool needRunToolBarAnimation, bool hideTitleBar, bool hideToolBar);
268 
269     bool isHideToolbar_ = false;
270     bool isHideTitlebar_ = false;
271     std::optional<BarStyle> titleBarStyle_;
272     std::optional<BarStyle> toolBarStyle_;
273     bool safeAreaPaddingChanged_ = false;
274     float avoidKeyboardOffset_ = 0.0f;
275     std::vector<BarItem> titleBarMenuItems_;
276     std::vector<BarItem> toolBarMenuItems_;
277     std::optional<int32_t> menuNodeId_;
278     std::optional<int32_t> landscapeMenuNodeId_;
279     int32_t maxMenuNums_ = -1;
280     float titleBarHeight_ = 0.0f;
281     float titleBarOffsetY_ = 0.0f;
282     float toolBarHeight_ = 0.0f;
283     float toolBarDividerHeight_ = 0.0f;
284     int32_t titleBarAnimationCount_ = 0;
285     int32_t toolBarAnimationCount_ = 0;
286     std::optional<bool> currHideTitleBar_;
287     std::optional<bool> currHideToolBar_;
288     bool needHideToolBarForNavWidth_ = false;
289     int32_t nextBarAnimationId_ = 0;
290     std::unordered_map<int32_t, std::shared_ptr<AnimationUtils::Animation>> barAnimations_;
291     std::optional<int32_t> preWidth_;
292 };
293 } // namespace OHOS::Ace::NG
294 
295 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_NAVDESTINATION_PATTERN_BASE_H