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