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