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