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
24#include "base/memory/referenced.h"
25#include "base/subwindow/subwindow.h"
26#include "base/utils/macros.h"
27#include "base/utils/noncopyable.h"
28#include "core/components/dialog/dialog_properties.h"
29#include "core/components_ng/base/frame_node.h"
30#include "core/components_ng/pattern/overlay/overlay_manager.h"
31
32namespace OHOS::Ace {
33
34using SubwindowMap = std::unordered_map<int32_t, RefPtr<Subwindow>>;
35
36class ACE_EXPORT SubwindowManager final : public NonCopyable {
37public:
38    // Get the instance
39    ACE_FORCE_EXPORT static std::shared_ptr<SubwindowManager> GetInstance();
40
41    void AddContainerId(uint32_t windowId, int32_t containerId);
42    void RemoveContainerId(uint32_t windowId);
43    int32_t GetContainerId(uint32_t windowId);
44
45    void AddParentContainerId(int32_t containerId, int32_t parentContainerId);
46    void RemoveParentContainerId(int32_t containerId);
47    int32_t GetParentContainerId(int32_t containerId);
48    int32_t GetSubContainerId(int32_t parentContainerId);
49
50    void AddSubwindow(int32_t instanceId, RefPtr<Subwindow>);
51    void RemoveSubwindow(int32_t instanceId);
52
53    // Get the subwindow of instance, return the window or nullptr.
54    const RefPtr<Subwindow> GetSubwindow(int32_t instanceId);
55    const RefPtr<Subwindow> GetOrCreateSubwindow(int32_t instanceId);
56
57    void SetCurrentSubwindow(const RefPtr<Subwindow>& subwindow);
58
59    const RefPtr<Subwindow>& GetCurrentWindow();
60    Rect GetParentWindowRect();
61
62    RefPtr<Subwindow> ShowPreviewNG(bool isStartDraggingFromSubWindow);
63    void HidePreviewNG();
64    void ShowMenu(const RefPtr<Component>& newComponent);
65    void ShowMenuNG(const RefPtr<NG::FrameNode>& menuNode, const NG::MenuParam& menuParam,
66        const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset);
67    void ShowMenuNG(std::function<void()>&& buildFunc, std::function<void()>&& previewBuildFunc,
68        const NG::MenuParam& menuParam, const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset);
69    ACE_FORCE_EXPORT void HideMenuNG(const RefPtr<NG::FrameNode>& menu, int32_t targetId);
70    ACE_FORCE_EXPORT void HideMenuNG(bool showPreviewAnimation = true, bool startDrag = false);
71    void UpdateHideMenuOffsetNG(const NG::OffsetF& offset = NG::OffsetF(0.0f, 0.0f), float menuScale = 1.0f,
72        bool isRedragStart = false, int32_t menuWrapperId = -1);
73    void ContextMenuSwitchDragPreviewAnimation(const RefPtr<NG::FrameNode>& dragPreviewNode,
74        const NG::OffsetF& offset = NG::OffsetF(0.0f, 0.0f));
75    void UpdatePreviewPosition();
76    bool GetMenuPreviewCenter(NG::OffsetF& offset);
77    void ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent = true);
78    void ShowPopupNG(const RefPtr<NG::FrameNode>& targetNode, const NG::PopupInfo& popupInfo,
79        const std::function<void(int32_t)>&& onWillDismiss = nullptr, bool interactiveDismiss = true);
80    void HidePopupNG(int32_t targetId, int32_t instanceId = -1);
81    bool CancelPopup(const std::string& id);
82    void CloseMenu();
83    void ClearMenu();
84    void ClearMenuNG(int32_t instanceId = -1, int32_t targetId = -1, bool inWindow = true, bool showAnimation = false);
85    void ClearPopupInSubwindow(int32_t instanceId = -1);
86    ACE_FORCE_EXPORT RefPtr<NG::FrameNode> ShowDialogNG(
87        const DialogProperties& dialogProps, std::function<void()>&& buildFunc);
88    RefPtr<NG::FrameNode> ShowDialogNGWithNode(const DialogProperties& dialogProps,
89        const RefPtr<NG::UINode>& customNode);
90    void CloseDialogNG(const RefPtr<NG::FrameNode>& dialogNode);
91    ACE_FORCE_EXPORT void OpenCustomDialogNG(
92        const DialogProperties& dialogProps, std::function<void(int32_t)>&& callback);
93    ACE_FORCE_EXPORT void CloseCustomDialogNG(int32_t dialogId);
94    ACE_FORCE_EXPORT void CloseCustomDialogNG(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)>&& callback);
95    ACE_FORCE_EXPORT void UpdateCustomDialogNG(
96        const WeakPtr<NG::UINode>& node, const PromptDialogAttr& dialogAttr, std::function<void(int32_t)>&& callback);
97    void HideSubWindowNG();
98    void HideDialogSubWindow(int32_t instanceId);
99    void SetHotAreas(const std::vector<Rect>& rects, int32_t nodeId = -1, int32_t instanceId = -1);
100    void AddDialogSubwindow(int32_t instanceId, const RefPtr<Subwindow>& subwindow);
101    // Get the dialog subwindow of instance, return the window or nullptr.
102    int32_t GetDialogSubwindowInstanceId(int32_t SubwindowId);
103    const RefPtr<Subwindow> GetDialogSubwindow(int32_t instanceId);
104    void SetCurrentDialogSubwindow(const RefPtr<Subwindow>& subwindow);
105    const RefPtr<Subwindow>& GetCurrentDialogWindow();
106    void DeleteHotAreas(int32_t subwindowId, int32_t nodeId);
107
108    void ClearToastInSubwindow();
109    ACE_FORCE_EXPORT void ShowToast(const NG::ToastInfo& toastInfo, std::function<void(int32_t)>&& callback);
110    void ShowToastNG(const NG::ToastInfo& toastInfo, std::function<void(int32_t)>&& callback);
111    const RefPtr<Subwindow> GetToastSubwindow(int32_t instanceId);
112    void AddToastSubwindow(int32_t instanceId, RefPtr<Subwindow> subwindow);
113    void HideToastSubWindowNG();
114    ToastWindowType GetToastWindowType(int32_t instanceId);
115    ACE_FORCE_EXPORT void CloseToast(
116        const int32_t toastId, const NG::ToastShowMode& showMode, std::function<void(int32_t)>&& callback);
117    ACE_FORCE_EXPORT void ShowDialog(const std::string& title, const std::string& message,
118        const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& napiCallback,
119        const std::set<std::string>& dialogCallbacks);
120    ACE_FORCE_EXPORT void ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
121        std::function<void(int32_t, int32_t)>&& napiCallback, const std::set<std::string>& dialogCallbacks);
122    ACE_FORCE_EXPORT void ShowActionMenu(const std::string& title, const std::vector<ButtonInfo>& button,
123        std::function<void(int32_t, int32_t)>&& callback);
124    void CloseDialog(int32_t instanceId);
125    void RequestFocusSubwindow(int32_t instanceId);
126    ACE_FORCE_EXPORT void OpenCustomDialog(const PromptDialogAttr &dialogAttr, std::function<void(int32_t)> &&callback);
127    void CloseCustomDialog(const int32_t dialogId);
128    void CloseCustomDialog(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)> &&callback);
129
130    bool GetShown();
131    void ResizeWindowForFoldStatus(int32_t parentContainerId);
132    void MarkDirtyDialogSafeArea();
133    void HideSystemTopMostWindow();
134    const RefPtr<Subwindow> GetSystemToastWindow(int32_t instanceId);
135    void AddSystemToastWindow(int32_t instanceId, RefPtr<Subwindow> subwindow);
136    void ClearToastInSystemSubwindow();
137    void OnWindowSizeChanged(int32_t instanceId, Rect windowRect, WindowSizeChangeReason reason);
138    bool IsFreeMultiWindow(int32_t instanceId) const;
139
140    RefPtr<NG::FrameNode> GetSubwindowDialogNodeWithExistContent(const RefPtr<NG::UINode>& node);
141
142    void SetRect(const NG::RectF& rect, int32_t instanceId);
143
144private:
145    RefPtr<Subwindow> GetOrCreateSubWindow();
146    RefPtr<Subwindow> GetOrCreateSystemSubWindow(int32_t containerId);
147    RefPtr<Subwindow> GetOrCreateToastWindow(int32_t containerId, const NG::ToastShowMode& showMode);
148    RefPtr<Subwindow> GetOrCreateToastWindowNG(int32_t containerId, const ToastWindowType& windowType,
149        uint32_t mainWindowId);
150    const std::vector<RefPtr<NG::OverlayManager>> GetAllSubOverlayManager();
151    static std::mutex instanceMutex_;
152    static std::shared_ptr<SubwindowManager> instance_;
153
154    std::mutex mutex_;
155    std::unordered_map<uint32_t, int32_t> containerMap_;
156
157    std::mutex parentMutex_;
158    std::unordered_map<int32_t, int32_t> parentContainerMap_;
159
160    // Used to save the relationship between container and subwindow, it is 1:1
161    std::mutex subwindowMutex_;
162    SubwindowMap subwindowMap_;
163    static thread_local RefPtr<Subwindow> currentSubwindow_;
164
165    std::mutex toastMutex_;
166    SubwindowMap toastWindowMap_;
167    // Used to save the relationship between container and dialog subwindow, it is 1:1
168    std::mutex dialogSubwindowMutex_;
169    SubwindowMap dialogSubwindowMap_;
170    std::mutex currentDialogSubwindowMutex_;
171    RefPtr<Subwindow> currentDialogSubwindow_;
172    std::mutex systemToastMutex_;
173    SubwindowMap systemToastWindowMap_;
174    Rect uiExtensionWindowRect_;
175};
176
177} // namespace OHOS::Ace
178
179#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_SUBWINDOW_SUBWINDOW_MANAGER_H
180