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