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