• 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 #include "base/subwindow/subwindow_manager.h"
17 
18 #include <memory>
19 #include <mutex>
20 
21 #include "unistd.h"
22 
23 #include "base/geometry/rect.h"
24 #include "base/log/log.h"
25 #include "base/memory/ace_type.h"
26 #include "core/common/ace_page.h"
27 #include "core/common/container.h"
28 
29 namespace OHOS::Ace {
30 
31 std::mutex SubwindowManager::instanceMutex_;
32 std::shared_ptr<SubwindowManager> SubwindowManager::instance_;
33 
GetInstance()34 std::shared_ptr<SubwindowManager> SubwindowManager::GetInstance()
35 {
36     std::lock_guard<std::mutex> lock(instanceMutex_);
37     if (!instance_) {
38         instance_ = std::make_shared<SubwindowManager>();
39     }
40     return instance_;
41 }
42 
AddContainerId(uint32_t windowId,int32_t containerId)43 void SubwindowManager::AddContainerId(uint32_t windowId, int32_t containerId)
44 {
45     std::lock_guard<std::mutex> lock(mutex_);
46     auto result = containerMap_.try_emplace(windowId, containerId);
47     if (!result.second) {
48         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Already have container of this windowId, windowId: %{public}u", windowId);
49     }
50 }
51 
RemoveContainerId(uint32_t windowId)52 void SubwindowManager::RemoveContainerId(uint32_t windowId)
53 {
54     std::lock_guard<std::mutex> lock(mutex_);
55     containerMap_.erase(windowId);
56 }
57 
GetContainerId(uint32_t windowId)58 int32_t SubwindowManager::GetContainerId(uint32_t windowId)
59 {
60     std::lock_guard<std::mutex> lock(mutex_);
61     auto result = containerMap_.find(windowId);
62     if (result != containerMap_.end()) {
63         return result->second;
64     } else {
65         return -1;
66     }
67 }
68 
AddParentContainerId(int32_t containerId,int32_t parentContainerId)69 void SubwindowManager::AddParentContainerId(int32_t containerId, int32_t parentContainerId)
70 {
71     TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Container id is %{public}d, parent id is %{public}d.", containerId,
72         parentContainerId);
73     std::lock_guard<std::mutex> lock(parentMutex_);
74     parentContainerMap_.try_emplace(containerId, parentContainerId);
75 }
76 
RemoveParentContainerId(int32_t containerId)77 void SubwindowManager::RemoveParentContainerId(int32_t containerId)
78 {
79     std::lock_guard<std::mutex> lock(parentMutex_);
80     parentContainerMap_.erase(containerId);
81 }
82 
GetParentContainerId(int32_t containerId)83 int32_t SubwindowManager::GetParentContainerId(int32_t containerId)
84 {
85     std::lock_guard<std::mutex> lock(parentMutex_);
86     auto result = parentContainerMap_.find(containerId);
87     if (result != parentContainerMap_.end()) {
88         return result->second;
89     } else {
90         return 0;
91     }
92 }
93 
AddSubwindow(int32_t instanceId,RefPtr<Subwindow> subwindow)94 void SubwindowManager::AddSubwindow(int32_t instanceId, RefPtr<Subwindow> subwindow)
95 {
96     if (!subwindow) {
97         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "add subwindow failed.");
98         return;
99     }
100     TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Add subwindow into map, instanceId is %{public}d, subwindow id is %{public}d.",
101         instanceId, subwindow->GetSubwindowId());
102     std::lock_guard<std::mutex> lock(subwindowMutex_);
103     auto result = subwindowMap_.try_emplace(instanceId, subwindow);
104     if (!result.second) {
105         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add failed of this instance %{public}d", instanceId);
106         return;
107     }
108 }
DeleteHotAreas(int32_t instanceId,int32_t overlayid)109 void SubwindowManager::DeleteHotAreas(int32_t instanceId, int32_t overlayid)
110 {
111     RefPtr<Subwindow> subwindow;
112     if (instanceId != -1) {
113         // get the subwindow which overlay node in, not current
114         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
115     } else {
116         subwindow = GetCurrentWindow();
117     }
118     if (subwindow) {
119         subwindow->DeleteHotAreas(overlayid);
120     }
121 }
RemoveSubwindow(int32_t instanceId)122 void SubwindowManager::RemoveSubwindow(int32_t instanceId)
123 {
124     std::lock_guard<std::mutex> lock(subwindowMutex_);
125     subwindowMap_.erase(instanceId);
126 }
127 
GetSubwindow(int32_t instanceId)128 const RefPtr<Subwindow> SubwindowManager::GetSubwindow(int32_t instanceId)
129 {
130     std::lock_guard<std::mutex> lock(subwindowMutex_);
131     auto result = subwindowMap_.find(instanceId);
132     if (result != subwindowMap_.end()) {
133         return result->second;
134     } else {
135         return nullptr;
136     }
137 }
138 
GetDialogSubwindowInstanceId(int32_t SubwindowId)139 int32_t SubwindowManager::GetDialogSubwindowInstanceId(int32_t SubwindowId)
140 {
141     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get dialog subwindow instanceid enter");
142     std::lock_guard<std::mutex> lock(subwindowMutex_);
143     for (auto it = subwindowMap_.begin(); it != subwindowMap_.end(); it++) {
144         if (it->second->GetSubwindowId() == SubwindowId) {
145             return it->first;
146         }
147     }
148     return 0;
149 }
150 
SetCurrentSubwindowName(const std::string & currentSubwindowName)151 void SubwindowManager::SetCurrentSubwindowName(const std::string& currentSubwindowName)
152 {
153     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
154     currentSubwindowName_ = currentSubwindowName;
155 }
156 
GetCurrentSubWindowName()157 std::string SubwindowManager::GetCurrentSubWindowName()
158 {
159     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
160     return currentSubwindowName_;
161 }
162 
SetCurrentSubwindow(const RefPtr<Subwindow> & subwindow)163 void SubwindowManager::SetCurrentSubwindow(const RefPtr<Subwindow>& subwindow)
164 {
165     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
166     currentSubwindow_ = subwindow;
167 }
168 
GetCurrentWindow()169 const RefPtr<Subwindow>& SubwindowManager::GetCurrentWindow()
170 {
171     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
172     return currentSubwindow_;
173 }
174 
GetParentWindowRect()175 Rect SubwindowManager::GetParentWindowRect()
176 {
177     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
178     Rect rect;
179     CHECK_NULL_RETURN(currentSubwindow_, rect);
180     return currentSubwindow_->GetParentWindowRect();
181 }
182 
ShowPreviewNG()183 RefPtr<Subwindow> SubwindowManager::ShowPreviewNG()
184 {
185     auto containerId = Container::CurrentId();
186     auto subwindow = GetSubwindow(containerId);
187     if (!subwindow) {
188         subwindow = Subwindow::CreateSubwindow(containerId);
189         subwindow->InitContainer();
190         AddSubwindow(containerId, subwindow);
191     }
192     if (!subwindow->ShowPreviewNG()) {
193         return nullptr;
194     }
195     return subwindow;
196 }
197 
ShowMenuNG(const RefPtr<NG::FrameNode> & menuNode,int32_t targetId,const NG::OffsetF & offset,bool isAboveApps)198 void SubwindowManager::ShowMenuNG(
199     const RefPtr<NG::FrameNode>& menuNode, int32_t targetId, const NG::OffsetF& offset, bool isAboveApps)
200 {
201     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show menung enter");
202     auto containerId = Container::CurrentId();
203     auto subwindow = GetSubwindow(containerId);
204     if (!subwindow) {
205         subwindow = Subwindow::CreateSubwindow(containerId);
206         subwindow->InitContainer();
207         AddSubwindow(containerId, subwindow);
208     }
209     subwindow->ShowMenuNG(menuNode, targetId, offset);
210 }
211 
HidePreviewNG()212 void SubwindowManager::HidePreviewNG()
213 {
214     auto subwindow = GetCurrentWindow();
215     if (subwindow) {
216         subwindow->HidePreviewNG();
217     }
218 }
219 
HideMenuNG(const RefPtr<NG::FrameNode> & menu,int32_t targetId)220 void SubwindowManager::HideMenuNG(const RefPtr<NG::FrameNode>& menu, int32_t targetId)
221 {
222     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide menu ng enter");
223     auto subwindow = GetCurrentWindow();
224     if (subwindow) {
225         subwindow->HideMenuNG(menu, targetId);
226     }
227 }
228 
HideMenuNG(bool showPreviewAnimation,bool startDrag)229 void SubwindowManager::HideMenuNG(bool showPreviewAnimation, bool startDrag)
230 {
231     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide menung enter");
232     auto subwindow = GetCurrentWindow();
233     if (subwindow) {
234         subwindow->HideMenuNG(showPreviewAnimation, startDrag);
235     }
236 }
237 
UpdateHideMenuOffsetNG(const NG::OffsetF & offset)238 void SubwindowManager::UpdateHideMenuOffsetNG(const NG::OffsetF& offset)
239 {
240     auto subwindow = GetCurrentWindow();
241     if (subwindow) {
242         subwindow->UpdateHideMenuOffsetNG(offset);
243     }
244 }
245 
ClearMenuNG(int32_t instanceId,bool inWindow,bool showAnimation)246 void SubwindowManager::ClearMenuNG(int32_t instanceId, bool inWindow, bool showAnimation)
247 {
248     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear menung enter");
249     RefPtr<Subwindow> subwindow;
250     if (instanceId != -1) {
251         // get the subwindow which overlay node in, not current
252         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
253     } else {
254         subwindow = GetCurrentWindow();
255     }
256     if (subwindow) {
257         subwindow->ClearMenuNG(inWindow, showAnimation);
258     }
259 }
260 
ClearPopupInSubwindow(int32_t instanceId)261 void SubwindowManager::ClearPopupInSubwindow(int32_t instanceId)
262 {
263     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear popup in subwindow enter");
264     RefPtr<Subwindow> subwindow;
265     if (instanceId != -1) {
266         // get the subwindow which overlay node in, not current
267         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
268     } else {
269         subwindow = GetCurrentWindow();
270     }
271     if (subwindow) {
272         subwindow->ClearPopupNG();
273     }
274 }
275 
ShowPopupNG(int32_t targetId,const NG::PopupInfo & popupInfo)276 void SubwindowManager::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo)
277 {
278     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup ng enter");
279     auto containerId = Container::CurrentId();
280     auto manager = SubwindowManager::GetInstance();
281     CHECK_NULL_VOID(manager);
282     auto subwindow = manager->GetSubwindow(containerId);
283     if (!subwindow) {
284         auto taskExecutor = Container::CurrentTaskExecutor();
285         CHECK_NULL_VOID(taskExecutor);
286         taskExecutor->PostTask(
287             [containerId, targetId, popupInfo, manager] {
288                 auto subwindow = Subwindow::CreateSubwindow(containerId);
289                 subwindow->InitContainer();
290                 manager->AddSubwindow(containerId, subwindow);
291                 subwindow->ShowPopupNG(targetId, popupInfo);
292             },
293             TaskExecutor::TaskType::PLATFORM);
294     } else {
295         subwindow->ShowPopupNG(targetId, popupInfo);
296     }
297 }
298 
HidePopupNG(int32_t targetId,int32_t instanceId)299 void SubwindowManager::HidePopupNG(int32_t targetId, int32_t instanceId)
300 {
301     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide popup ng enter");
302     RefPtr<Subwindow> subwindow;
303     if (instanceId != -1) {
304         // get the subwindow which overlay node in, not current
305         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
306     } else {
307         subwindow = GetCurrentWindow();
308     }
309 
310     if (subwindow) {
311         subwindow->HidePopupNG(targetId);
312     }
313 }
314 
ShowPopup(const RefPtr<Component> & newComponent,bool disableTouchEvent)315 void SubwindowManager::ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent)
316 {
317     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup enter");
318     auto containerId = Container::CurrentId();
319     auto taskExecutor = Container::CurrentTaskExecutor();
320     CHECK_NULL_VOID(taskExecutor);
321     taskExecutor->PostTask(
322         [containerId, newComponentWeak = WeakPtr<Component>(newComponent), disableTouchEvent] {
323             auto manager = SubwindowManager::GetInstance();
324             CHECK_NULL_VOID(manager);
325             auto subwindow = manager->GetSubwindow(containerId);
326             if (!subwindow) {
327                 subwindow = Subwindow::CreateSubwindow(containerId);
328                 subwindow->InitContainer();
329                 manager->AddSubwindow(containerId, subwindow);
330             }
331             auto newComponent = newComponentWeak.Upgrade();
332             CHECK_NULL_VOID(newComponent);
333             subwindow->ShowPopup(newComponent, disableTouchEvent);
334         },
335         TaskExecutor::TaskType::PLATFORM);
336 }
337 
CancelPopup(const std::string & id)338 bool SubwindowManager::CancelPopup(const std::string& id)
339 {
340     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "cancel popup enter");
341     auto subwindow = GetCurrentWindow();
342     if (subwindow) {
343         return subwindow->CancelPopup(id);
344     }
345     return false;
346 }
347 
ShowMenu(const RefPtr<Component> & newComponent)348 void SubwindowManager::ShowMenu(const RefPtr<Component>& newComponent)
349 {
350     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show menu enter");
351     auto containerId = Container::CurrentId();
352     auto taskExecutor = Container::CurrentTaskExecutor();
353     CHECK_NULL_VOID(taskExecutor);
354     taskExecutor->PostTask(
355         [containerId, weakMenu = AceType::WeakClaim(AceType::RawPtr(newComponent))] {
356             auto manager = SubwindowManager::GetInstance();
357             CHECK_NULL_VOID(manager);
358             auto menu = weakMenu.Upgrade();
359             CHECK_NULL_VOID(menu);
360             auto subwindow = manager->GetSubwindow(containerId);
361             if (!subwindow) {
362                 subwindow = Subwindow::CreateSubwindow(containerId);
363                 subwindow->InitContainer();
364                 manager->AddSubwindow(containerId, subwindow);
365             }
366             subwindow->ShowMenu(menu);
367         },
368         TaskExecutor::TaskType::PLATFORM);
369 }
370 
CloseMenu()371 void SubwindowManager::CloseMenu()
372 {
373     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close menu enter");
374     auto subwindow = GetCurrentWindow();
375     if (subwindow) {
376         subwindow->CloseMenu();
377     }
378 }
379 
ClearMenu()380 void SubwindowManager::ClearMenu()
381 {
382     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear menu enter");
383     auto subwindow = GetCurrentWindow();
384     if (subwindow) {
385         subwindow->ClearMenu();
386     }
387 }
388 
SetHotAreas(const std::vector<Rect> & rects,int32_t overlayId,int32_t instanceId)389 void SubwindowManager::SetHotAreas(const std::vector<Rect>& rects, int32_t overlayId, int32_t instanceId)
390 {
391     RefPtr<Subwindow> subwindow;
392     if (instanceId != -1) {
393         // get the subwindow which overlay node in, not current
394         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
395     } else {
396         subwindow = GetCurrentWindow();
397     }
398 
399     if (subwindow) {
400         subwindow->SetHotAreas(rects, overlayId);
401     }
402 }
SetDialogHotAreas(const std::vector<Rect> & rects,int32_t overlayId,int32_t instanceId)403 void SubwindowManager::SetDialogHotAreas(const std::vector<Rect>& rects, int32_t overlayId, int32_t instanceId)
404 {
405     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set dialog hot areas enter");
406     RefPtr<Subwindow> subwindow;
407     if (instanceId != -1) {
408         // get the subwindow which overlay node in, not current
409         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
410     } else {
411         subwindow = GetCurrentWindow();
412     }
413     if (subwindow) {
414         subwindow->SetDialogHotAreas(rects, overlayId);
415     }
416 }
ShowDialogNG(const DialogProperties & dialogProps,std::function<void ()> && buildFunc)417 RefPtr<NG::FrameNode> SubwindowManager::ShowDialogNG(
418     const DialogProperties& dialogProps, std::function<void()>&& buildFunc)
419 {
420     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog ng enter");
421     auto containerId = Container::CurrentId();
422     auto subwindow = GetSubwindow(containerId);
423     if (!subwindow) {
424         subwindow = Subwindow::CreateSubwindow(containerId);
425         CHECK_NULL_RETURN(subwindow, nullptr);
426         subwindow->InitContainer();
427         AddSubwindow(containerId, subwindow);
428     }
429     return subwindow->ShowDialogNG(dialogProps, std::move(buildFunc));
430 }
431 
CloseDialogNG(const RefPtr<NG::FrameNode> & dialogNode)432 void SubwindowManager::CloseDialogNG(const RefPtr<NG::FrameNode>& dialogNode)
433 {
434     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close dialog ng enter");
435     auto containerId = Container::CurrentId();
436     auto subwindow = GetSubwindow(containerId);
437     if (!subwindow) {
438         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get subwindow failed.");
439         return;
440     }
441     return subwindow->CloseDialogNG(dialogNode);
442 }
443 
HideDialogSubWindow(int32_t instanceId)444 void SubwindowManager::HideDialogSubWindow(int32_t instanceId)
445 {
446     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide dialog subwindow enter");
447     auto subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
448     CHECK_NULL_VOID(subwindow);
449     auto overlay = subwindow->GetOverlayManager();
450     if (overlay->GetDialogMap().size() == 0) {
451         subwindow->HideSubWindowNG();
452     }
453 }
454 
AddDialogSubwindow(int32_t instanceId,const RefPtr<Subwindow> & subwindow)455 void SubwindowManager::AddDialogSubwindow(int32_t instanceId, const RefPtr<Subwindow>& subwindow)
456 {
457     if (!subwindow) {
458         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add dialog subwindow failed, the subwindow is null.");
459         return;
460     }
461     std::lock_guard<std::mutex> lock(dialogSubwindowMutex_);
462     auto result = dialogSubwindowMap_.try_emplace(instanceId, subwindow);
463     if (!result.second) {
464         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add dialog failed of this instance %{public}d", instanceId);
465         return;
466     }
467 }
468 
GetDialogSubwindow(int32_t instanceId)469 const RefPtr<Subwindow> SubwindowManager::GetDialogSubwindow(int32_t instanceId)
470 {
471     std::lock_guard<std::mutex> lock(dialogSubwindowMutex_);
472     auto result = dialogSubwindowMap_.find(instanceId);
473     if (result != dialogSubwindowMap_.end()) {
474         return result->second;
475     } else {
476         return nullptr;
477     }
478 }
479 
SetCurrentDialogSubwindow(const RefPtr<Subwindow> & subwindow)480 void SubwindowManager::SetCurrentDialogSubwindow(const RefPtr<Subwindow>& subwindow)
481 {
482     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set current dialog subwindow enter");
483     std::lock_guard<std::mutex> lock(currentDialogSubwindowMutex_);
484     currentDialogSubwindow_ = subwindow;
485 }
486 
GetCurrentDialogWindow()487 const RefPtr<Subwindow>& SubwindowManager::GetCurrentDialogWindow()
488 {
489     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get current dialog window enter");
490     std::lock_guard<std::mutex> lock(currentDialogSubwindowMutex_);
491     return currentDialogSubwindow_;
492 }
493 
GetOrCreateSubWindow()494 RefPtr<Subwindow> SubwindowManager::GetOrCreateSubWindow()
495 {
496     auto containerId = Container::CurrentId();
497     auto subwindow = GetDialogSubwindow(containerId);
498     if (!subwindow) {
499         subwindow = Subwindow::CreateSubwindow(containerId);
500         AddDialogSubwindow(containerId, subwindow);
501     }
502     return subwindow;
503 }
504 
ShowToast(const std::string & message,int32_t duration,const std::string & bottom,const NG::ToastShowMode & showMode)505 void SubwindowManager::ShowToast(
506     const std::string& message, int32_t duration, const std::string& bottom, const NG::ToastShowMode& showMode)
507 {
508     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show toast enter");
509     auto containerId = Container::CurrentId();
510     // for pa service
511     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
512         auto subwindow = GetOrCreateSubWindow();
513         CHECK_NULL_VOID(subwindow);
514         TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "before show toast");
515         subwindow->ShowToast(message, duration, bottom, showMode);
516     } else {
517         // for ability
518         auto taskExecutor = Container::CurrentTaskExecutor();
519         CHECK_NULL_VOID(taskExecutor);
520         taskExecutor->PostTask(
521             [containerId, message, duration, bottom, showMode] {
522                 auto manager = SubwindowManager::GetInstance();
523                 CHECK_NULL_VOID(manager);
524                 auto subwindow = manager->GetSubwindow(containerId);
525                 if (!subwindow) {
526                     subwindow = Subwindow::CreateSubwindow(containerId);
527                     subwindow->SetAboveApps(showMode == NG::ToastShowMode::TOP_MOST);
528                     subwindow->InitContainer();
529                     manager->AddSubwindow(containerId, subwindow);
530                 }
531                 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "before show toast : %{public}d", containerId);
532                 subwindow->ShowToast(message, duration, bottom, showMode);
533             },
534             TaskExecutor::TaskType::PLATFORM);
535     }
536 }
537 
ClearToastInSubwindow()538 void SubwindowManager::ClearToastInSubwindow()
539 {
540     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear toast in subwindow enter");
541     auto containerId = Container::CurrentId();
542     // Get active container when current instanceid is less than 0
543     if (containerId < 0) {
544         auto container = Container::GetActive();
545         if (container) {
546             containerId = container->GetInstanceId();
547         }
548     }
549     RefPtr<Subwindow> subwindow;
550     // The main window does not need to clear Toast
551     if (containerId != -1 && containerId < MIN_SUBCONTAINER_ID) {
552         // get the subwindow which overlay node in, not current
553         subwindow = GetSubwindow(containerId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(containerId) : containerId);
554     }
555     if (subwindow) {
556         subwindow->ClearToast();
557     }
558 }
559 
ShowDialog(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && napiCallback,const std::set<std::string> & dialogCallbacks)560 void SubwindowManager::ShowDialog(const std::string& title, const std::string& message,
561     const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& napiCallback,
562     const std::set<std::string>& dialogCallbacks)
563 {
564     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog enter");
565     auto containerId = Container::CurrentId();
566     // Get active container when current instanceid is less than 0
567     if (containerId < 0) {
568         auto container = Container::GetActive();
569         if (container) {
570             containerId = container->GetInstanceId();
571         }
572     }
573     // for pa service
574     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
575         auto subwindow = GetOrCreateSubWindow();
576         CHECK_NULL_VOID(subwindow);
577         subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks);
578         // for ability
579     } else {
580         auto subwindow = GetSubwindow(containerId);
581         if (!subwindow) {
582             subwindow = Subwindow::CreateSubwindow(containerId);
583             subwindow->InitContainer();
584             AddSubwindow(containerId, subwindow);
585         }
586         subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks);
587     }
588 }
589 
ShowDialog(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && napiCallback,const std::set<std::string> & dialogCallbacks)590 void SubwindowManager::ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
591     std::function<void(int32_t, int32_t)>&& napiCallback, const std::set<std::string>& dialogCallbacks)
592 {
593     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog enter");
594     auto containerId = Container::CurrentId();
595     // Get active container when current instanceid is less than 0
596     if (containerId < 0) {
597         auto container = Container::GetActive();
598         if (container) {
599             containerId = container->GetInstanceId();
600         }
601     }
602     // for pa service
603     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
604         auto subWindow = GetOrCreateSubWindow();
605         CHECK_NULL_VOID(subWindow);
606         subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks);
607         // for ability
608     } else {
609         auto subWindow = GetSubwindow(containerId);
610         if (!subWindow) {
611             subWindow = Subwindow::CreateSubwindow(containerId);
612             subWindow->InitContainer();
613             AddSubwindow(containerId, subWindow);
614         }
615         subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks);
616     }
617 }
618 
ShowActionMenu(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)619 void SubwindowManager::ShowActionMenu(
620     const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
621 {
622     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show action menu enter");
623     auto containerId = Container::CurrentId();
624     // Get active container when current instanceid is less than 0
625     if (containerId < 0) {
626         auto container = Container::GetActive();
627         if (container) {
628             containerId = container->GetInstanceId();
629         }
630     }
631     // for pa service
632     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
633         auto subwindow = GetOrCreateSubWindow();
634         CHECK_NULL_VOID(subwindow);
635         subwindow->ShowActionMenu(title, button, std::move(callback));
636         // for ability
637     } else {
638         auto subwindow = GetSubwindow(containerId);
639         if (!subwindow) {
640             subwindow = Subwindow::CreateSubwindow(containerId);
641             subwindow->InitContainer();
642             AddSubwindow(containerId, subwindow);
643         }
644         subwindow->ShowActionMenu(title, button, std::move(callback));
645     }
646 }
647 
CloseDialog(int32_t instanceId)648 void SubwindowManager::CloseDialog(int32_t instanceId)
649 {
650     auto subwindow = GetDialogSubwindow(instanceId);
651     if (!subwindow) {
652         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get dialog subwindow failed.");
653         return;
654     }
655     for (auto& containerMap : parentContainerMap_) {
656         if (containerMap.second == instanceId) {
657             subwindow->CloseDialog(containerMap.first);
658         }
659     }
660 }
661 
OpenCustomDialog(const PromptDialogAttr & dialogAttr,std::function<void (int32_t)> && callback)662 void SubwindowManager::OpenCustomDialog(const PromptDialogAttr &dialogAttr, std::function<void(int32_t)> &&callback)
663 {
664     PromptDialogAttr tmpPromptAttr = dialogAttr;
665     tmpPromptAttr.showInSubWindow = false;
666     auto containerId = Container::CurrentId();
667     // for pa service
668     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
669         auto subWindow = GetOrCreateSubWindow();
670         CHECK_NULL_VOID(subWindow);
671         subWindow->OpenCustomDialog(tmpPromptAttr, std::move(callback));
672         // for ability
673     } else {
674         auto subWindow = GetSubwindow(containerId);
675         if (!subWindow) {
676             subWindow = Subwindow::CreateSubwindow(containerId);
677             subWindow->InitContainer();
678             AddSubwindow(containerId, subWindow);
679         }
680         subWindow->OpenCustomDialog(tmpPromptAttr, std::move(callback));
681     }
682     return;
683 }
684 
CloseCustomDialog(const int32_t dialogId)685 void SubwindowManager::CloseCustomDialog(const int32_t dialogId)
686 {
687     auto containerId = Container::CurrentId();
688     TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "CloseCustomDialog dialogId = %{public}d, containerId = %{public}d.",
689         dialogId, containerId);
690     auto subwindow = GetDialogSubwindow(containerId);
691     if (!subwindow) {
692         return;
693     }
694     subwindow->CloseCustomDialog(dialogId);
695     return;
696 }
697 
HideSubWindowNG()698 void SubwindowManager::HideSubWindowNG()
699 {
700     RefPtr<Subwindow> subwindow;
701     auto container = Container::Current();
702     CHECK_NULL_VOID(container);
703     if (container->IsDialogContainer()) {
704         subwindow = GetCurrentDialogWindow();
705     } else {
706         subwindow = GetCurrentWindow();
707     }
708     if (subwindow) {
709         subwindow->HideSubWindowNG();
710     }
711 }
712 
RequestFocusSubwindow(int32_t instanceId)713 void SubwindowManager::RequestFocusSubwindow(int32_t instanceId)
714 {
715     RefPtr<Subwindow> subwindow;
716     if (instanceId != -1) {
717         // get the subwindow which overlay node in, not current
718         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
719     } else {
720         subwindow = GetCurrentWindow();
721     }
722     if (subwindow) {
723         subwindow->RequestFocus();
724     }
725 }
726 
GetShown()727 bool SubwindowManager::GetShown()
728 {
729     auto containerId = Container::CurrentId();
730     auto subwindow = GetSubwindow(containerId);
731     if (!subwindow) {
732         subwindow = Subwindow::CreateSubwindow(containerId);
733         subwindow->InitContainer();
734         AddSubwindow(containerId, subwindow);
735     }
736     return subwindow->GetShown();
737 }
738 
ResizeWindowForFoldStatus()739 void SubwindowManager::ResizeWindowForFoldStatus()
740 {
741     auto containerId = Container::CurrentId();
742     auto subwindow = GetSubwindow(containerId);
743     if (!subwindow) {
744         TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Get Subwindow error, containerId = %{public}d.", containerId);
745         return;
746     }
747     subwindow->ResizeWindowForFoldStatus();
748 }
749 } // namespace OHOS::Ace
750