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