• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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_COMMON_SUBWINDOW_SUBWINDOW_MANAGER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_SUBWINDOW_SUBWINDOW_MANAGER_H
18 
19 #include <mutex>
20 #include <set>
21 #include <unordered_map>
22 #include <array>
23 #include <functional>
24 
25 #include "base/memory/referenced.h"
26 #include "base/subwindow/subwindow.h"
27 #include "base/utils/macros.h"
28 #include "base/utils/noncopyable.h"
29 #include "core/components/dialog/dialog_properties.h"
30 #include "core/components_ng/base/frame_node.h"
31 #include "core/components_ng/pattern/overlay/overlay_manager.h"
32 #include "core/common/display_info.h"
33 
34 namespace OHOS::Ace {
35 constexpr int32_t INSTANCE_ID_BIT = 24;
36 constexpr int32_t DISPLAY_ID_BIT = 16;
37 constexpr int32_t INSTANCE_ID_MIN = -2;
38 
39 struct SubwindowKey {
40     int32_t instanceId;
41     uint64_t displayId;
42     FoldStatus foldStatus;
43     SubwindowType windowType = SubwindowType::TYPE_DIALOG;
44     int32_t subwindowType;
45 
46     bool operator==(const SubwindowKey& other) const
47     {
48         return other.instanceId == instanceId && other.displayId == displayId && other.foldStatus == foldStatus &&
49             other.windowType == windowType;
50     }
51 
ToStringSubwindowKey52     std::string ToString() const
53     {
54         auto json = JsonUtil::Create(true);
55         json->Put("instanceId", instanceId);
56         json->Put("displayId", (double)displayId);
57         json->Put("windowType", subwindowType);
58         return json->ToString();
59     }
60 };
61 
62 struct SubwindowKeyHashFunc {
operatorSubwindowKeyHashFunc63     std::size_t operator()(const SubwindowKey& key) const
64     {
65         return (static_cast<std::size_t>(key.windowType) << INSTANCE_ID_BIT) |
66         (static_cast<std::size_t>(key.displayId) << DISPLAY_ID_BIT) |
67         (static_cast<std::size_t>(key.instanceId + INSTANCE_ID_MIN));
68     }
69 };
70 
71 using SubwindowMap = std::unordered_map<int32_t, RefPtr<Subwindow>>;
72 using SubwindowMixMap = std::unordered_map<SubwindowKey, RefPtr<Subwindow>, SubwindowKeyHashFunc>;
73 
74 class ACE_EXPORT SubwindowManager final : public NonCopyable {
75 public:
76     // Get the instance
77     ACE_FORCE_EXPORT static std::shared_ptr<SubwindowManager> GetInstance();
78 
79     void AddContainerId(uint32_t windowId, int32_t containerId);
80     void RemoveContainerId(uint32_t windowId);
81     int32_t GetContainerId(uint32_t windowId);
82 
83     void AddParentContainerId(int32_t containerId, int32_t parentContainerId);
84     void RemoveParentContainerId(int32_t containerId);
85     int32_t GetParentContainerId(int32_t containerId);
86     int32_t GetSubContainerId(int32_t parentContainerId);
87     const std::vector<int32_t> GetAllSubContainerId(int32_t parentContainerId);
88 
89     void AddSubwindow(int32_t instanceId, RefPtr<Subwindow>);
90     void RemoveSubwindow(int32_t instanceId, SubwindowType windowType);
91 
92     // Get the subwindow of parent instance, return the window or nullptr.
93     const RefPtr<Subwindow> GetSubwindow(int32_t instanceId);
94 
95     // Get the subwindow of subInstance, return the window or nullptr.
96     const RefPtr<Subwindow> GetSubwindowById(int32_t subinstanceId);
97 
98     void SetCurrentSubwindow(const RefPtr<Subwindow>& subwindow);
99 
100     const RefPtr<Subwindow> GetCurrentWindow();
101     Rect GetParentWindowRect();
102 
103     RefPtr<Subwindow> ShowPreviewNG(bool isStartDraggingFromSubWindow);
104     void HidePreviewNG();
105     void ShowMenu(const RefPtr<Component>& newComponent);
106     void ShowMenuNG(const RefPtr<NG::FrameNode>& menuNode, const NG::MenuParam& menuParam,
107         const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset);
108     void ShowMenuNG(std::function<void()>&& buildFunc, std::function<void()>&& previewBuildFunc,
109         const NG::MenuParam& menuParam, const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset);
110     ACE_FORCE_EXPORT void HideMenuNG(const RefPtr<NG::FrameNode>& menu, int32_t targetId);
111     ACE_FORCE_EXPORT void HideMenuNG(bool showPreviewAnimation = true, bool startDrag = false);
112     void UpdateHideMenuOffsetNG(const NG::OffsetF& offset = NG::OffsetF(0.0f, 0.0f), float menuScale = 1.0f,
113         bool isRedragStart = false, int32_t menuWrapperId = -1);
114     void ContextMenuSwitchDragPreviewAnimation(const RefPtr<NG::FrameNode>& dragPreviewNode,
115         const NG::OffsetF& offset = NG::OffsetF(0.0f, 0.0f));
116     void UpdatePreviewPosition();
117     bool GetMenuPreviewCenter(NG::OffsetF& offset);
118     void ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent = true);
119     void ShowPopupNG(const RefPtr<NG::FrameNode>& targetNode, const NG::PopupInfo& popupInfo,
120         const std::function<void(int32_t)>&& onWillDismiss = nullptr, bool interactiveDismiss = true);
121     void HidePopupNG(int32_t targetId, int32_t instanceId = -1);
122     void ShowTipsNG(const RefPtr<NG::FrameNode>& targetNode, const NG::PopupInfo& popupInfo, int32_t appearingTime,
123         int32_t appearingTimeWithContinuousOperation);
124     void HideTipsNG(int32_t targetId, int32_t disappearingTime, int32_t instanceId = -1);
125     bool CancelPopup(const std::string& id);
126     void CloseMenu();
127     void ClearMenu();
128     void ClearMenuNG(int32_t instanceId = -1, int32_t targetId = -1, bool inWindow = true, bool showAnimation = false);
129     void ClearPopupInSubwindow(int32_t instanceId = -1, bool isForceClear = false);
130     ACE_FORCE_EXPORT RefPtr<NG::FrameNode> ShowDialogNG(
131         const DialogProperties& dialogProps, std::function<void()>&& buildFunc);
132     RefPtr<NG::FrameNode> ShowDialogNGWithNode(const DialogProperties& dialogProps,
133         const RefPtr<NG::UINode>& customNode);
134     void CloseDialogNG(const RefPtr<NG::FrameNode>& dialogNode);
135     ACE_FORCE_EXPORT void OpenCustomDialogNG(
136         const DialogProperties& dialogProps, std::function<void(int32_t)>&& callback);
137     ACE_FORCE_EXPORT void CloseCustomDialogNG(int32_t dialogId);
138     ACE_FORCE_EXPORT void CloseCustomDialogNG(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)>&& callback);
139     ACE_FORCE_EXPORT void UpdateCustomDialogNG(
140         const WeakPtr<NG::UINode>& node, const PromptDialogAttr& dialogAttr, std::function<void(int32_t)>&& callback);
141     ACE_FORCE_EXPORT std::optional<double> GetTopOrder();
142     ACE_FORCE_EXPORT std::optional<double> GetBottomOrder();
143     void HideSubWindowNG();
144     void HideDialogSubWindow(int32_t instanceId);
145     void SetHotAreas(const std::vector<Rect>& rects, SubwindowType type, int32_t nodeId = -1, int32_t instanceId = -1);
146     void AddDialogSubwindow(int32_t instanceId, const RefPtr<Subwindow>& subwindow);
147     // Get the dialog subwindow of instance, return the window or nullptr.
148     int32_t GetDialogSubwindowInstanceId(int32_t SubwindowId);
149     const RefPtr<Subwindow> GetDialogSubwindow(int32_t instanceId);
150     void SetCurrentDialogSubwindow(const RefPtr<Subwindow>& subwindow);
151     const RefPtr<Subwindow>& GetCurrentDialogWindow();
152     void DeleteHotAreas(int32_t subwindowId, int32_t nodeId, SubwindowType type);
153 
154     void ClearToastInSubwindow();
155     ACE_FORCE_EXPORT void ShowToast(const NG::ToastInfo& toastInfo, std::function<void(int32_t)>&& callback);
156     void ShowToastNG(const NG::ToastInfo& toastInfo, std::function<void(int32_t)>&& callback);
157     const RefPtr<Subwindow> GetToastSubwindow(int32_t instanceId);
158     void AddToastSubwindow(int32_t instanceId, RefPtr<Subwindow> subwindow);
159     void HideToastSubWindowNG();
160     ToastWindowType GetToastWindowType(int32_t instanceId);
161     ACE_FORCE_EXPORT void CloseToast(
162         const int32_t toastId, const NG::ToastShowMode& showMode, std::function<void(int32_t)>&& callback);
163     ACE_FORCE_EXPORT void ShowDialog(const std::string& title, const std::string& message,
164         const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& napiCallback,
165         const std::set<std::string>& dialogCallbacks);
166     ACE_FORCE_EXPORT void ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
167         std::function<void(int32_t, int32_t)>&& napiCallback, const std::set<std::string>& dialogCallbacks);
168     ACE_FORCE_EXPORT void ShowActionMenu(const std::string& title, const std::vector<ButtonInfo>& button,
169         std::function<void(int32_t, int32_t)>&& callback);
170     void CloseDialog(int32_t instanceId);
171     ACE_FORCE_EXPORT void OpenCustomDialog(const PromptDialogAttr &dialogAttr, std::function<void(int32_t)> &&callback);
172     void CloseCustomDialog(const int32_t dialogId);
173     void CloseCustomDialog(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)> &&callback);
174 
175     void ResizeWindowForFoldStatus(int32_t parentContainerId);
176     void MarkDirtyDialogSafeArea();
177     void OnWindowSizeChanged(int32_t containerId, Rect windowRect, WindowSizeChangeReason reason);
178     void HideSystemTopMostWindow();
179     const RefPtr<Subwindow> GetSystemToastWindow(int32_t instanceId);
180     void AddSystemToastWindow(int32_t instanceId, RefPtr<Subwindow> subwindow);
181     void ClearToastInSystemSubwindow();
182     bool IsSubwindowExist(RefPtr<Subwindow> subwindow);
183     bool IsFreeMultiWindow(int32_t instanceId) const;
184 
185     RefPtr<NG::FrameNode> GetSubwindowDialogNodeWithExistContent(const RefPtr<NG::UINode>& node);
186 
187     void SetRect(const NG::RectF& rect, int32_t instanceId);
188     void FlushSubWindowUITasks(int32_t instanceId);
189 
190     void OnUIExtensionWindowSizeChange(int32_t instanceId, Rect windowRect, WindowSizeChangeReason reason);
191     void OnHostWindowSizeChanged(int32_t containerId, Rect windowRect, WindowSizeChangeReason reason);
192     void HideSheetSubWindow(int32_t containerId);
193     void ShowBindSheetNG(bool isShow, std::function<void(const std::string&)>&& callback,
194         std::function<RefPtr<NG::UINode>()>&& buildNodeFunc, std::function<RefPtr<NG::UINode>()>&& buildtitleNodeFunc,
195         NG::SheetStyle& sheetStyle, std::function<void()>&& onAppear, std::function<void()>&& onDisappear,
196         std::function<void()>&& shouldDismiss, std::function<void(const int32_t)>&& onWillDismiss,
197         std::function<void()>&& onWillAppear, std::function<void()>&& onWillDisappear,
198         std::function<void(const float)>&& onHeightDidChange,
199         std::function<void(const float)>&& onDetentsDidChange,
200         std::function<void(const float)>&& onWidthDidChange,
201         std::function<void(const float)>&& onTypeDidChange,
202         std::function<void()>&& sheetSpringBack, const RefPtr<NG::FrameNode>& targetNode);
203 
204     int32_t ShowSelectOverlay(const RefPtr<NG::FrameNode>& overlayNode);
205     void HideSelectOverlay(const int32_t instanceId);
206     const RefPtr<Subwindow> GetSelectOverlaySubwindow(int32_t instanceId);
207     void AddSelectOverlaySubwindow(int32_t instanceId, RefPtr<Subwindow> subwindow);
208     RefPtr<Subwindow> GetOrCreateSelectOverlayWindow(
209         int32_t containerId, const ToastWindowType& windowType, uint32_t mainWindowId);
210     RefPtr<Subwindow> GetOrCreateMenuSubWindow(int32_t instanceId);
211     void SetSelectOverlayHotAreas(const std::vector<Rect>& rects, int32_t nodeId, int32_t instanceId);
212     void DeleteSelectOverlayHotAreas(const int32_t instanceId, int32_t nodeId);
213     bool IsWindowEnableSubWindowMenu(const int32_t instanceId, const RefPtr<NG::FrameNode>& callerFrameNode);
214     void OnDestroyContainer(int32_t subInstanceId);
215     bool GetIsExpandDisplay();
216     const RefPtr<Subwindow> GetSubwindowByType(int32_t instanceId, SubwindowType windowType);
217     void AddSubwindow(int32_t instanceId, SubwindowType windowType, RefPtr<Subwindow> subwindow);
218     const std::vector<RefPtr<Subwindow>> GetSortSubwindow(int32_t instanceId);
219 
220 private:
221     RefPtr<Subwindow> GetOrCreateSubWindow(bool isDialog = false);
222     RefPtr<Subwindow> GetOrCreateSystemSubWindow(int32_t containerId);
223     RefPtr<Subwindow> GetOrCreateToastWindow(int32_t containerId, const NG::ToastShowMode& showMode);
224     RefPtr<Subwindow> GetOrCreateToastWindowNG(int32_t containerId, const ToastWindowType& windowType,
225         uint32_t mainWindowId);
226     const std::vector<RefPtr<NG::OverlayManager>> GetAllSubOverlayManager();
227     SubwindowKey GetCurrentSubwindowKey(int32_t instanceId, SubwindowType windowType);
228     void MarkSetSubwindowRect(const NG::RectF& rect, int32_t instanceId, SubwindowType type);
229     void AddInstanceSubwindowMap(int32_t subInstanceId, RefPtr<Subwindow> subwindow);
230     RefPtr<Subwindow> GetSubwindowBySearchKey(const SubwindowKey& searchKey);
231     void RemoveSubwindowBySearchKey(const SubwindowKey& searchKey);
232     void AddSubwindowBySearchKey(const SubwindowKey& searchKey, const RefPtr<Subwindow>& subwindow);
233     static std::mutex instanceMutex_;
234     static std::shared_ptr<SubwindowManager> instance_;
235 
236     std::mutex mutex_;
237     std::unordered_map<uint32_t, int32_t> containerMap_;
238 
239     std::mutex parentMutex_;
240     std::unordered_map<int32_t, int32_t> parentContainerMap_;
241 
242     // Used to save the relationship between container and subwindow, it is 1:1
243     std::mutex subwindowMutex_;
244     SubwindowMixMap subwindowMap_;
245     static thread_local RefPtr<Subwindow> currentSubwindow_;
246 
247     std::mutex instanceSubwindowMutex_;
248     SubwindowMap instanceSubwindowMap_;
249 
250     // Used to save the relationship between container and dialog subwindow, it is 1:1
251     std::mutex dialogSubwindowMutex_;
252     SubwindowMap dialogSubwindowMap_;
253     std::mutex currentDialogSubwindowMutex_;
254     RefPtr<Subwindow> currentDialogSubwindow_;
255     Rect uiExtensionWindowRect_;
256     bool isSuperFoldDisplayDevice_ = false;
257 };
258 
259 } // namespace OHOS::Ace
260 
261 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_SUBWINDOW_SUBWINDOW_MANAGER_H
262