• 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         LOGW("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     LOGI("Container id is %{public}d, parent id is %{public}d.", containerId, parentContainerId);
72     std::lock_guard<std::mutex> lock(parentMutex_);
73     auto result = parentContainerMap_.try_emplace(containerId, parentContainerId);
74     if (!result.second) {
75         LOGW("Already have container of this %{public}d", containerId);
76     }
77 }
78 
RemoveParentContainerId(int32_t containerId)79 void SubwindowManager::RemoveParentContainerId(int32_t containerId)
80 {
81     std::lock_guard<std::mutex> lock(parentMutex_);
82     parentContainerMap_.erase(containerId);
83 }
84 
GetParentContainerId(int32_t containerId)85 int32_t SubwindowManager::GetParentContainerId(int32_t containerId)
86 {
87     std::lock_guard<std::mutex> lock(parentMutex_);
88     auto result = parentContainerMap_.find(containerId);
89     if (result != parentContainerMap_.end()) {
90         return result->second;
91     } else {
92         return 0;
93     }
94 }
95 
AddSubwindow(int32_t instanceId,RefPtr<Subwindow> subwindow)96 void SubwindowManager::AddSubwindow(int32_t instanceId, RefPtr<Subwindow> subwindow)
97 {
98     if (!subwindow) {
99         LOGE("Add subwindow failed, the subwindow is null.");
100         return;
101     }
102     LOGI("Add subwindow into map, instanceId is %{public}d, subwindow id is %{public}d.", instanceId,
103         subwindow->GetSubwindowId());
104     std::lock_guard<std::mutex> lock(subwindowMutex_);
105     auto result = subwindowMap_.try_emplace(instanceId, subwindow);
106     if (!result.second) {
107         LOGE("Add failed of this instance %{public}d", instanceId);
108         return;
109     }
110     LOGI("Add subwindow success of this instance %{public}d.", instanceId);
111 }
112 
RemoveSubwindow(int32_t instanceId)113 void SubwindowManager::RemoveSubwindow(int32_t instanceId)
114 {
115     LOGI("Remove subwindow of this instance %{public}d", instanceId);
116     std::lock_guard<std::mutex> lock(subwindowMutex_);
117     int res = static_cast<int>(subwindowMap_.erase(instanceId));
118     if (res == 0) {
119         LOGW("Remove subwindow of instance %{public}d failed.", instanceId);
120     }
121 }
122 
GetSubwindow(int32_t instanceId)123 const RefPtr<Subwindow> SubwindowManager::GetSubwindow(int32_t instanceId)
124 {
125     LOGI("Get subwindow of instance %{public}d.", instanceId);
126     std::lock_guard<std::mutex> lock(subwindowMutex_);
127     auto result = subwindowMap_.find(instanceId);
128     if (result != subwindowMap_.end()) {
129         return result->second;
130     } else {
131         return nullptr;
132     }
133 }
134 
SetCurrentSubwindowName(const std::string & currentSubwindowName)135 void SubwindowManager::SetCurrentSubwindowName(const std::string& currentSubwindowName)
136 {
137     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
138     currentSubwindowName_ = currentSubwindowName;
139 }
140 
GetCurrentSubWindowName()141 std::string SubwindowManager::GetCurrentSubWindowName()
142 {
143     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
144     return currentSubwindowName_;
145 }
146 
SetCurrentSubwindow(const RefPtr<Subwindow> & subwindow)147 void SubwindowManager::SetCurrentSubwindow(const RefPtr<Subwindow>& subwindow)
148 {
149     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
150     currentSubwindow_ = subwindow;
151 
152     if (onShowMenuCallback_) {
153         RegisterOnShowMenu(onShowMenuCallback_);
154     }
155     if (onHideMenuCallback_) {
156         RegisterOnHideMenu(onHideMenuCallback_);
157     }
158 }
159 
GetCurrentWindow()160 const RefPtr<Subwindow>& SubwindowManager::GetCurrentWindow()
161 {
162     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
163     return currentSubwindow_;
164 }
165 
GetParentWindowRect()166 Rect SubwindowManager::GetParentWindowRect()
167 {
168     std::lock_guard<std::mutex> lock(currentSubwindowMutex_);
169     Rect rect;
170     CHECK_NULL_RETURN(currentSubwindow_, rect);
171     return currentSubwindow_->GetParentWindowRect();
172 }
173 
ShowMenuNG(const RefPtr<NG::FrameNode> & menuNode,int32_t targetId,const NG::OffsetF & offset,bool isAboveApps)174 void SubwindowManager::ShowMenuNG(const RefPtr<NG::FrameNode>& menuNode, int32_t targetId,
175     const NG::OffsetF& offset, bool isAboveApps)
176 {
177     auto containerId = Container::CurrentId();
178     auto taskExecutor = Container::CurrentTaskExecutor();
179     CHECK_NULL_VOID(taskExecutor);
180     taskExecutor->PostTask(
181         [containerId, weakMenu = AceType::WeakClaim(AceType::RawPtr(menuNode)), targetId, offset, isAboveApps] {
182             auto manager = SubwindowManager::GetInstance();
183             CHECK_NULL_VOID(manager);
184             auto menu = weakMenu.Upgrade();
185             CHECK_NULL_VOID(menu);
186             auto subwindow = manager->GetSubwindow(containerId);
187             if (!subwindow) {
188                 LOGI("Subwindow is null, add a new one.");
189                 subwindow = Subwindow::CreateSubwindow(containerId);
190                 subwindow->SetAboveApps(isAboveApps);
191                 subwindow->InitContainer();
192                 manager->AddSubwindow(containerId, subwindow);
193             }
194             subwindow->ShowMenuNG(menu, targetId, offset);
195         },
196         TaskExecutor::TaskType::PLATFORM);
197 }
198 
HideMenuNG(const RefPtr<NG::FrameNode> & menu,int32_t targetId)199 void SubwindowManager::HideMenuNG(const RefPtr<NG::FrameNode>& menu, int32_t targetId)
200 {
201     auto subwindow = GetCurrentWindow();
202     if (subwindow) {
203         subwindow->HideMenuNG(menu, targetId);
204     }
205 }
206 
HideMenuNG()207 void SubwindowManager::HideMenuNG()
208 {
209     auto subwindow = GetCurrentWindow();
210     if (subwindow) {
211         subwindow->HideMenuNG();
212     }
213 }
214 
ClearMenuNG(int32_t instanceId,bool inWindow)215 void SubwindowManager::ClearMenuNG(int32_t instanceId, bool inWindow)
216 {
217     RefPtr<Subwindow> subwindow;
218     if (instanceId != -1) {
219         // get the subwindow which overlay node in, not current
220         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
221     } else {
222         subwindow = GetCurrentWindow();
223     }
224     if (subwindow) {
225         subwindow->ClearMenuNG(inWindow);
226     }
227 }
228 
ShowPopupNG(int32_t targetId,const NG::PopupInfo & popupInfo)229 void SubwindowManager::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo)
230 {
231     auto containerId = Container::CurrentId();
232     auto manager = SubwindowManager::GetInstance();
233     CHECK_NULL_VOID(manager);
234     auto subwindow = manager->GetSubwindow(containerId);
235     if (!subwindow) {
236         auto taskExecutor = Container::CurrentTaskExecutor();
237         CHECK_NULL_VOID(taskExecutor);
238         taskExecutor->PostTask(
239             [containerId, targetId, popupInfo, manager] {
240                 LOGI("Subwindow is null, add a new one.");
241                 auto subwindow = Subwindow::CreateSubwindow(containerId);
242                 subwindow->InitContainer();
243                 manager->AddSubwindow(containerId, subwindow);
244                 subwindow->ShowPopupNG(targetId, popupInfo);
245             },
246             TaskExecutor::TaskType::PLATFORM);
247     } else {
248         subwindow->ShowPopupNG(targetId, popupInfo);
249     }
250 }
251 
HidePopupNG(int32_t targetId,int32_t instanceId)252 void SubwindowManager::HidePopupNG(int32_t targetId, int32_t instanceId)
253 {
254     RefPtr<Subwindow> subwindow;
255     if (instanceId != -1) {
256         // get the subwindow which overlay node in, not current
257         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
258     } else {
259         subwindow = GetCurrentWindow();
260     }
261 
262     if (subwindow) {
263         subwindow->HidePopupNG(targetId);
264     }
265 }
266 
ShowPopup(const RefPtr<Component> & newComponent,bool disableTouchEvent)267 void SubwindowManager::ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent)
268 {
269     auto containerId = Container::CurrentId();
270     auto taskExecutor = Container::CurrentTaskExecutor();
271     CHECK_NULL_VOID(taskExecutor);
272     taskExecutor->PostTask(
273         [containerId, newComponentWeak = WeakPtr<Component>(newComponent), disableTouchEvent] {
274             auto manager = SubwindowManager::GetInstance();
275             CHECK_NULL_VOID(manager);
276             auto subwindow = manager->GetSubwindow(containerId);
277             if (!subwindow) {
278                 LOGI("Subwindow is null, add a new one.");
279                 subwindow = Subwindow::CreateSubwindow(containerId);
280                 subwindow->InitContainer();
281                 manager->AddSubwindow(containerId, subwindow);
282             }
283             auto newComponent = newComponentWeak.Upgrade();
284             CHECK_NULL_VOID(newComponent);
285             subwindow->ShowPopup(newComponent, disableTouchEvent);
286         },
287         TaskExecutor::TaskType::PLATFORM);
288 }
289 
CancelPopup(const std::string & id)290 bool SubwindowManager::CancelPopup(const std::string& id)
291 {
292     auto subwindow = GetCurrentWindow();
293     if (subwindow) {
294         return subwindow->CancelPopup(id);
295     }
296     return false;
297 }
298 
ShowMenu(const RefPtr<Component> & newComponent)299 void SubwindowManager::ShowMenu(const RefPtr<Component>& newComponent)
300 {
301     auto containerId = Container::CurrentId();
302     auto taskExecutor = Container::CurrentTaskExecutor();
303     CHECK_NULL_VOID(taskExecutor);
304     taskExecutor->PostTask(
305         [containerId, weakMenu = AceType::WeakClaim(AceType::RawPtr(newComponent))] {
306             auto manager = SubwindowManager::GetInstance();
307             CHECK_NULL_VOID(manager);
308             auto menu = weakMenu.Upgrade();
309             CHECK_NULL_VOID(menu);
310             auto subwindow = manager->GetSubwindow(containerId);
311             if (!subwindow) {
312                 LOGI("Subwindow is null, add a new one.");
313                 subwindow = Subwindow::CreateSubwindow(containerId);
314                 subwindow->InitContainer();
315                 manager->AddSubwindow(containerId, subwindow);
316             }
317             subwindow->ShowMenu(menu);
318         },
319         TaskExecutor::TaskType::PLATFORM);
320 }
321 
CloseMenu()322 void SubwindowManager::CloseMenu()
323 {
324     auto subwindow = GetCurrentWindow();
325     if (subwindow) {
326         subwindow->CloseMenu();
327     }
328 }
329 
ClearMenu()330 void SubwindowManager::ClearMenu()
331 {
332     auto subwindow = GetCurrentWindow();
333     if (subwindow) {
334         subwindow->ClearMenu();
335     }
336 }
337 
SetHotAreas(const std::vector<Rect> & rects,int32_t overlayId,int32_t instanceId)338 void SubwindowManager::SetHotAreas(const std::vector<Rect>& rects, int32_t overlayId, int32_t instanceId)
339 {
340     RefPtr<Subwindow> subwindow;
341     if (instanceId != -1) {
342         // get the subwindow which overlay node in, not current
343         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
344     } else {
345         subwindow = GetCurrentWindow();
346     }
347 
348     if (subwindow) {
349         subwindow->SetHotAreas(rects, overlayId);
350     }
351 }
352 
ShowDialogNG(const DialogProperties & dialogProps,std::function<void ()> && buildFunc)353 RefPtr<NG::FrameNode> SubwindowManager::ShowDialogNG(
354     const DialogProperties& dialogProps, std::function<void()>&& buildFunc)
355 {
356     auto containerId = Container::CurrentId();
357     auto subwindow = GetSubwindow(containerId);
358     if (!subwindow) {
359         LOGI("Subwindow is null, add a new one.");
360         subwindow = Subwindow::CreateSubwindow(containerId);
361         subwindow->InitContainer();
362         AddSubwindow(containerId, subwindow);
363     }
364     return subwindow->ShowDialogNG(dialogProps, std::move(buildFunc));
365 }
366 
AddDialogSubwindow(int32_t instanceId,const RefPtr<Subwindow> & subwindow)367 void SubwindowManager::AddDialogSubwindow(int32_t instanceId, const RefPtr<Subwindow>& subwindow)
368 {
369     if (!subwindow) {
370         LOGE("Add dialog subwindow failed, the subwindow is null.");
371         return;
372     }
373     LOGI("Add dialog subwindow into map, instanceId is %{public}d, subwindow id is %{public}d.", instanceId,
374         subwindow->GetSubwindowId());
375     std::lock_guard<std::mutex> lock(dialogSubwindowMutex_);
376     auto result = dialogSubwindowMap_.try_emplace(instanceId, subwindow);
377     if (!result.second) {
378         LOGE("Add dialog failed of this instance %{public}d", instanceId);
379         return;
380     }
381     LOGI("Add dialog subwindow success of this instance %{public}d.", instanceId);
382 }
383 
GetDialogSubwindow(int32_t instanceId)384 const RefPtr<Subwindow> SubwindowManager::GetDialogSubwindow(int32_t instanceId)
385 {
386     LOGI("Get dialog subwindow of instance %{public}d.", instanceId);
387     std::lock_guard<std::mutex> lock(dialogSubwindowMutex_);
388     auto result = dialogSubwindowMap_.find(instanceId);
389     if (result != dialogSubwindowMap_.end()) {
390         return result->second;
391     } else {
392         return nullptr;
393     }
394 }
395 
SetCurrentDialogSubwindow(const RefPtr<Subwindow> & subwindow)396 void SubwindowManager::SetCurrentDialogSubwindow(const RefPtr<Subwindow>& subwindow)
397 {
398     std::lock_guard<std::mutex> lock(currentDialogSubwindowMutex_);
399     currentDialogSubwindow_ = subwindow;
400 }
401 
GetCurrentDialogWindow()402 const RefPtr<Subwindow>& SubwindowManager::GetCurrentDialogWindow()
403 {
404     std::lock_guard<std::mutex> lock(currentDialogSubwindowMutex_);
405     return currentDialogSubwindow_;
406 }
407 
GetOrCreateSubWindow()408 RefPtr<Subwindow> SubwindowManager::GetOrCreateSubWindow()
409 {
410     auto containerId = Container::CurrentId();
411     LOGI("SubwindowManager::GetOrCreateSubWindow containerId = %{public}d.", containerId);
412     auto subwindow = GetDialogSubwindow(containerId);
413     if (!subwindow) {
414         LOGI("Subwindow is null, add a new one.");
415         subwindow = Subwindow::CreateSubwindow(containerId);
416         AddDialogSubwindow(containerId, subwindow);
417     }
418     return subwindow;
419 }
420 
ShowToast(const std::string & message,int32_t duration,const std::string & bottom)421 void SubwindowManager::ShowToast(const std::string& message, int32_t duration, const std::string& bottom)
422 {
423     auto containerId = Container::CurrentId();
424     // Get active container when current instanceid is less than 0
425     if (containerId < 0) {
426         auto container = Container::GetActive();
427         if (container) {
428             containerId = container->GetInstanceId();
429         }
430     }
431     // for pa service
432     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
433         auto subwindow = GetOrCreateSubWindow();
434         CHECK_NULL_VOID(subwindow);
435         subwindow->ShowToast(message, duration, bottom);
436         // for ability
437     } else {
438         auto taskExecutor = Container::CurrentTaskExecutor();
439         CHECK_NULL_VOID(taskExecutor);
440         taskExecutor->PostTask(
441             [containerId, message, duration, bottom] {
442                 auto manager = SubwindowManager::GetInstance();
443                 CHECK_NULL_VOID(manager);
444                 auto subwindow = manager->GetSubwindow(containerId);
445                 if (!subwindow) {
446                     LOGI("Subwindow is null, add a new one.");
447                     subwindow = Subwindow::CreateSubwindow(containerId);
448                     subwindow->InitContainer();
449                     manager->AddSubwindow(containerId, subwindow);
450                 }
451                 subwindow->ShowToast(message, duration, bottom);
452             },
453             TaskExecutor::TaskType::PLATFORM);
454     }
455 }
456 
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)457 void SubwindowManager::ShowDialog(const std::string& title, const std::string& message,
458     const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& napiCallback,
459     const std::set<std::string>& dialogCallbacks)
460 {
461     auto containerId = Container::CurrentId();
462     // Get active container when current instanceid is less than 0
463     if (containerId < 0) {
464         auto container = Container::GetActive();
465         if (container) {
466             containerId = container->GetInstanceId();
467         }
468     }
469     // for pa service
470     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
471         auto subwindow = GetOrCreateSubWindow();
472         CHECK_NULL_VOID(subwindow);
473         subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks);
474         // for ability
475     } else {
476         auto subwindow = GetSubwindow(containerId);
477         if (!subwindow) {
478             LOGI("Subwindow is null, add a new one.");
479             subwindow = Subwindow::CreateSubwindow(containerId);
480             subwindow->InitContainer();
481             AddSubwindow(containerId, subwindow);
482         }
483         subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks);
484     }
485 }
486 
ShowDialog(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && napiCallback,const std::set<std::string> & dialogCallbacks)487 void SubwindowManager::ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
488     std::function<void(int32_t, int32_t)>&& napiCallback, const std::set<std::string>& dialogCallbacks)
489 {
490     auto containerId = Container::CurrentId();
491     // Get active container when current instanceid is less than 0
492     if (containerId < 0) {
493         auto container = Container::GetActive();
494         if (container) {
495             containerId = container->GetInstanceId();
496         }
497     }
498     // for pa service
499     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
500         auto subWindow = GetOrCreateSubWindow();
501         CHECK_NULL_VOID(subWindow);
502         subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks);
503         // for ability
504     } else {
505         auto subWindow = GetSubwindow(containerId);
506         if (!subWindow) {
507             LOGI("SubWindow is null, add a new one.");
508             subWindow = Subwindow::CreateSubwindow(containerId);
509             subWindow->InitContainer();
510             AddSubwindow(containerId, subWindow);
511         }
512         subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks);
513     }
514 }
515 
ShowActionMenu(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)516 void SubwindowManager::ShowActionMenu(
517     const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
518 {
519     auto containerId = Container::CurrentId();
520     // Get active container when current instanceid is less than 0
521     if (containerId < 0) {
522         auto container = Container::GetActive();
523         if (container) {
524             containerId = container->GetInstanceId();
525         }
526     }
527     // for pa service
528     if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) {
529         auto subwindow = GetOrCreateSubWindow();
530         CHECK_NULL_VOID(subwindow);
531         subwindow->ShowActionMenu(title, button, std::move(callback));
532         // for ability
533     } else {
534         auto subwindow = GetSubwindow(containerId);
535         if (!subwindow) {
536             LOGI("Subwindow is null, add a new one.");
537             subwindow = Subwindow::CreateSubwindow(containerId);
538             subwindow->InitContainer();
539             AddSubwindow(containerId, subwindow);
540         }
541         subwindow->ShowActionMenu(title, button, std::move(callback));
542     }
543 }
544 
CloseDialog(int32_t instanceId)545 void SubwindowManager::CloseDialog(int32_t instanceId)
546 {
547     LOGI("SubwindowManager::CloseDialog containerId = %{public}d.", instanceId);
548     auto subwindow = GetDialogSubwindow(instanceId);
549     if (!subwindow) {
550         LOGE("SubwindowManager::CloseDialog Subwindow is null.");
551         return;
552     }
553     for (auto& containerMap : parentContainerMap_) {
554         if (containerMap.second == instanceId) {
555             subwindow->CloseDialog(containerMap.first);
556         }
557     }
558 }
559 
HideSubWindowNG()560 void SubwindowManager::HideSubWindowNG()
561 {
562     RefPtr<Subwindow> subwindow;
563     auto container = Container::Current();
564     CHECK_NULL_VOID(container);
565     if (container->IsDialogContainer()) {
566         subwindow = GetCurrentDialogWindow();
567     } else {
568         subwindow = GetCurrentWindow();
569     }
570     if (subwindow) {
571         subwindow->HideSubWindowNG();
572     }
573 }
574 
RegisterOnShowMenu(const std::function<void ()> & callback)575 void SubwindowManager::RegisterOnShowMenu(const std::function<void()>& callback)
576 {
577     onShowMenuCallback_ = callback;
578     if (currentSubwindow_) {
579         auto overlayManager = currentSubwindow_->GetOverlayManager();
580         CHECK_NULL_VOID(overlayManager);
581         overlayManager->RegisterOnShowMenu(callback);
582     }
583 }
584 
RegisterOnHideMenu(const std::function<void ()> & callback)585 void SubwindowManager::RegisterOnHideMenu(const std::function<void()>& callback)
586 {
587     onHideMenuCallback_ = callback;
588     if (currentSubwindow_) {
589         auto overlayManager = currentSubwindow_->GetOverlayManager();
590         CHECK_NULL_VOID(overlayManager);
591         overlayManager->RegisterOnHideMenu(callback);
592     }
593 }
594 
RequestFocusSubwindow(int32_t instanceId)595 void SubwindowManager::RequestFocusSubwindow(int32_t instanceId)
596 {
597     RefPtr<Subwindow> subwindow;
598     if (instanceId != -1) {
599         // get the subwindow which overlay node in, not current
600         subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId);
601     } else {
602         subwindow = GetCurrentWindow();
603     }
604     if (subwindow) {
605         subwindow->RequestFocus();
606     }
607 }
608 } // namespace OHOS::Ace
609