1 /*
2 * Copyright (c) 2022-2023 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 "adapter/ohos/entrance/subwindow/subwindow_ohos.h"
17
18 #include "dm/display_manager.h"
19 #include "interfaces/inner_api/ace/viewport_config.h"
20 #include "render_service_client/core/ui/rs_surface_node.h"
21 #include "window.h"
22
23 #include "adapter/ohos/entrance/ace_application_info.h"
24 #include "base/geometry/rect.h"
25 #include "base/log/log_wrapper.h"
26 #include "core/components/root/root_element.h"
27 #include "core/components_ng/base/frame_node.h"
28 #include "core/components_ng/base/ui_node.h"
29 #include "core/components_ng/property/property.h"
30 #include "core/components_v2/inspector/inspector_constants.h"
31 #include "core/pipeline_ng/pipeline_context.h"
32 #if defined(ENABLE_ROSEN_BACKEND) and !defined(UPLOAD_GPU_DISABLED)
33 #include "adapter/ohos/entrance/ace_rosen_sync_task.h"
34 #endif
35
36 #include "adapter/ohos/entrance/ace_container.h"
37 #include "adapter/ohos/entrance/ace_view_ohos.h"
38 #include "adapter/ohos/entrance/dialog_container.h"
39 #include "adapter/ohos/entrance/ui_content_impl.h"
40 #include "adapter/ohos/entrance/utils.h"
41 #include "base/log/frame_report.h"
42 #include "base/utils/system_properties.h"
43 #include "base/utils/utils.h"
44 #include "bundlemgr/bundle_mgr_interface.h"
45 #include "core/common/connect_server_manager.h"
46 #include "core/common/container_scope.h"
47 #include "core/common/frontend.h"
48 #include "core/common/hdc_register.h"
49 #include "core/common/text_field_manager.h"
50 #include "core/components/bubble/bubble_component.h"
51 #include "core/components/popup/popup_component.h"
52 #include "core/components_ng/pattern/menu/menu_view.h"
53 #include "core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h"
54 #include "core/components_ng/pattern/overlay/overlay_manager.h"
55 #include "core/components_ng/render/adapter/rosen_render_context.h"
56 #include "core/components_ng/render/adapter/rosen_window.h"
57 #include "frameworks/bridge/common/utils/engine_helper.h"
58 #include "frameworks/bridge/declarative_frontend/declarative_frontend.h"
59 #include "iservice_registry.h"
60 #ifdef OS_ACCOUNT_EXISTS
61 #include "os_account_manager.h"
62 #endif
63 #include "system_ability_definition.h"
64
65 namespace OHOS::Ace {
66 namespace {
67 const Rect MIN_WINDOW_HOT_AREA = Rect(0.0f, 0.0f, 1.0f, 1.0f);
68 #ifndef NG_BUILD
69 constexpr int32_t PLATFORM_VERSION_TEN = 10;
70 #endif
71 } // namespace
72
73 int32_t SubwindowOhos::id_ = 0;
74 static std::atomic<int32_t> gToastDialogId = 0;
75
76 class SwitchFreeMultiWindowListener : public OHOS::Rosen::ISwitchFreeMultiWindowListener {
77 public:
SwitchFreeMultiWindowListener(int32_t instanceId)78 explicit SwitchFreeMultiWindowListener(int32_t instanceId) : instanceId_(instanceId) {}
79 ~SwitchFreeMultiWindowListener() = default;
80
OnSwitchFreeMultiWindow(bool enable)81 void OnSwitchFreeMultiWindow(bool enable)
82 {
83 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Window status changes, freeMultiWindow is %{public}d", enable);
84 auto container = Platform::AceContainer::GetContainer(instanceId_);
85 CHECK_NULL_VOID(container);
86 auto parentContainerId = SubwindowManager::GetInstance()->GetParentContainerId(instanceId_);
87 auto subWindow = SubwindowManager::GetInstance()->GetSubwindow(parentContainerId);
88 CHECK_NULL_VOID(subWindow);
89
90 auto taskExecutor = container->GetTaskExecutor();
91 CHECK_NULL_VOID(taskExecutor);
92 ContainerScope scope(instanceId_);
93 taskExecutor->PostTask(
94 [subWindow, enable]() {
95 CHECK_NULL_VOID(subWindow);
96 subWindow->OnFreeMultiWindowSwitch(enable);
97 },
98 TaskExecutor::TaskType::UI, "ArkUIFreeMultiWindowSwitch");
99 }
100
101 private:
102 int32_t instanceId_ = -1;
103 };
104
CreateSubwindow(int32_t instanceId)105 RefPtr<Subwindow> Subwindow::CreateSubwindow(int32_t instanceId)
106 {
107 return AceType::MakeRefPtr<SubwindowOhos>(instanceId);
108 }
109
SubwindowOhos(int32_t instanceId)110 SubwindowOhos::SubwindowOhos(int32_t instanceId) : windowId_(id_), parentContainerId_(instanceId)
111 {
112 SetSubwindowId(windowId_);
113 id_++;
114 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Create Subwindow, subwindow id %{public}d, container id %{public}d", windowId_,
115 instanceId);
116 }
117
GetToastRosenType(bool IsSceneBoardEnabled)118 Rosen::WindowType SubwindowOhos::GetToastRosenType(bool IsSceneBoardEnabled)
119 {
120 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW,
121 "SubwindowOhos::GetToastRosenType, windowType: %{public}d, IsSceneBoardEnabled: %{public}d",
122 GetToastWindowType(), IsSceneBoardEnabled);
123 if (GetToastWindowType() == ToastWindowType::TOAST_IN_TYPE_APP_SUB_WINDOW) {
124 if (!IsSceneBoardEnabled) {
125 return Rosen::WindowType::WINDOW_TYPE_TOAST;
126 }
127 return Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW;
128 } else if (GetToastWindowType() == ToastWindowType::TOAST_IN_TYPE_SYSTEM_SUB_WINDOW) {
129 return Rosen::WindowType::WINDOW_TYPE_TOAST;
130 } else if (GetToastWindowType() == ToastWindowType::TOAST_IN_TYPE_SYSTEM_FLOAT) {
131 return Rosen::WindowType::WINDOW_TYPE_SYSTEM_FLOAT;
132 }
133 return Rosen::WindowType::WINDOW_TYPE_TOAST;
134 }
135
SetToastWindowOption(RefPtr<Platform::AceContainer> & parentContainer,OHOS::sptr<OHOS::Rosen::WindowOption> & windowOption,const Rosen::WindowType & toastWindowType,uint32_t mainWindowId)136 void SetToastWindowOption(RefPtr<Platform::AceContainer>& parentContainer,
137 OHOS::sptr<OHOS::Rosen::WindowOption>& windowOption,
138 const Rosen::WindowType& toastWindowType, uint32_t mainWindowId)
139 {
140 if (toastWindowType == Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW) {
141 windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
142 windowOption->AddWindowFlag(Rosen::WindowFlag::WINDOW_FLAG_IS_TOAST);
143 }
144 windowOption->SetWindowType(toastWindowType);
145 if (parentContainer->IsUIExtensionWindow()) {
146 auto parentPipeline = parentContainer->GetPipelineContext();
147 CHECK_NULL_VOID(parentPipeline);
148 auto hostWindowId = parentPipeline->GetFocusWindowId();
149 windowOption->SetIsUIExtensionSubWindowFlag(true);
150 windowOption->SetParentId(hostWindowId);
151 } else {
152 windowOption->SetParentId(mainWindowId);
153 }
154 }
155
SetUIExtensionSubwindowFlag(OHOS::sptr<OHOS::Rosen::WindowOption> & windowOption,bool isAppSubwindow,sptr<OHOS::Rosen::Window> & parentWindow)156 void SetUIExtensionSubwindowFlag(OHOS::sptr<OHOS::Rosen::WindowOption>& windowOption,
157 bool isAppSubwindow, sptr<OHOS::Rosen::Window>& parentWindow)
158 {
159 if (isAppSubwindow && (parentWindow->GetIsUIExtensionFlag() ||
160 parentWindow->GetIsUIExtensionSubWindowFlag())) {
161 windowOption->SetIsUIExtensionSubWindowFlag(true);
162 }
163 }
164
InitContainer()165 void SubwindowOhos::InitContainer()
166 {
167 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
168 CHECK_NULL_VOID(parentContainer);
169 auto parentPipeline = parentContainer->GetPipelineContext();
170 CHECK_NULL_VOID(parentPipeline);
171 if (!window_) {
172 OHOS::sptr<OHOS::Rosen::WindowOption> windowOption = new OHOS::Rosen::WindowOption();
173 auto parentWindowName = parentContainer->GetWindowName();
174 auto parentWindowId = parentContainer->GetWindowId();
175 sptr<OHOS::Rosen::Window> parentWindow = parentContainer->GetUIWindow(parentContainerId_);
176 CHECK_NULL_VOID(parentWindow);
177 parentWindow_ = parentWindow;
178 auto windowType = parentWindow->GetType();
179 std::string windowTag = "";
180 bool isAppSubwindow = false;
181 if (IsSystemTopMost()) {
182 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_SYSTEM_TOAST);
183 } else if (GetAboveApps()) {
184 auto toastWindowType = GetToastRosenType(parentContainer->IsSceneBoardEnabled());
185 isAppSubwindow = toastWindowType == Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW;
186 auto mainWindowId = GetMainWindowId();
187 SetToastWindowOption(parentContainer, windowOption, toastWindowType, mainWindowId);
188 windowTag = "TOPMOST_TOAST_";
189 } else if (parentContainer->IsScenceBoardWindow() || windowType == Rosen::WindowType::WINDOW_TYPE_DESKTOP) {
190 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_SYSTEM_FLOAT);
191 } else if (windowType == Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION) {
192 auto hostWindowId = parentPipeline->GetFocusWindowId();
193 windowOption->SetExtensionTag(true);
194 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
195 windowOption->SetParentId(hostWindowId);
196 SetUIExtensionHostWindowId(hostWindowId);
197 isAppSubwindow = true;
198 } else if (windowType >= Rosen::WindowType::SYSTEM_WINDOW_BASE) {
199 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW);
200 windowOption->SetParentId(parentWindowId);
201 } else {
202 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
203 windowOption->SetParentId(parentWindowId);
204 isAppSubwindow = true;
205 }
206 auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
207 if (!defaultDisplay) {
208 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "DisplayManager GetDefaultDisplay failed");
209 }
210 CHECK_NULL_VOID(defaultDisplay);
211 windowOption->SetWindowRect({ 0, 0, defaultDisplay->GetWidth(), defaultDisplay->GetHeight() });
212 windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
213 SetUIExtensionSubwindowFlag(windowOption, isAppSubwindow, parentWindow);
214 window_ = OHOS::Rosen::Window::Create("ARK_APP_SUBWINDOW_" + windowTag + parentWindowName +
215 std::to_string(windowId_), windowOption, parentWindow->GetContext());
216 if (!window_) {
217 SetIsRosenWindowCreate(false);
218 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Window create failed");
219 }
220 CHECK_NULL_VOID(window_);
221 }
222 std::string url = "";
223 auto subSurface = window_->GetSurfaceNode();
224 CHECK_NULL_VOID(subSurface);
225 subSurface->SetShadowElevation(0.0f);
226 window_->NapiSetUIContent(url, nullptr, nullptr, Rosen::BackupAndRestoreType::NONE);
227 childContainerId_ = SubwindowManager::GetInstance()->GetContainerId(window_->GetWindowId());
228 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "Window child containerId : %{public}d", childContainerId_);
229 SubwindowManager::GetInstance()->AddParentContainerId(childContainerId_, parentContainerId_);
230
231 auto container = Platform::AceContainer::GetContainer(childContainerId_);
232 if (!container) {
233 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Window get ace container failed");
234 }
235 CHECK_NULL_VOID(container);
236
237 auto parentToken = parentContainer->GetToken();
238 container->SetToken(parentToken);
239 container->SetWindowId(window_->GetWindowId());
240 container->SetParentId(parentContainerId_);
241 container->GetSettings().SetUsingSharedRuntime(true);
242 container->SetSharedRuntime(parentContainer->GetSharedRuntime());
243 container->Initialize();
244 container->SetAssetManager(parentContainer->GetAssetManager());
245 container->SetResourceConfiguration(parentContainer->GetResourceConfiguration());
246 container->SetPackagePathStr(parentContainer->GetPackagePathStr());
247 container->SetHapPath(parentContainer->GetHapPath());
248 container->SetIsSubContainer(true);
249 container->InitializeSubContainer(parentContainerId_);
250 SetIsRosenWindowCreate(true);
251 ViewportConfig config;
252 // create ace_view
253 auto aceView =
254 Platform::AceViewOhos::CreateView(childContainerId_, false, container->GetSettings().usePlatformAsUIThread);
255 Platform::AceViewOhos::SurfaceCreated(aceView, window_);
256
257 int32_t width = static_cast<int32_t>(window_->GetRequestRect().width_);
258 int32_t height = static_cast<int32_t>(window_->GetRequestRect().height_);
259 auto density = parentPipeline->GetDensity();
260 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
261 "UIContent Initialize: width: %{public}d, height: %{public}d, density: %{public}lf", width, height, density);
262
263 Ace::Platform::UIEnvCallback callback = nullptr;
264 // set view
265 Platform::AceContainer::SetView(aceView, density, width, height, window_, callback);
266 Platform::AceViewOhos::SurfaceChanged(aceView, width, height, config.Orientation());
267
268 auto uiContentImpl = reinterpret_cast<UIContentImpl*>(window_->GetUIContent());
269 CHECK_NULL_VOID(uiContentImpl);
270 uiContentImpl->SetFontScaleAndWeightScale(container, childContainerId_);
271 freeMultiWindowListener_ = new SwitchFreeMultiWindowListener(childContainerId_);
272 window_->RegisterSwitchFreeMultiWindowListener(freeMultiWindowListener_);
273
274 #ifndef NG_BUILD
275 #ifdef ENABLE_ROSEN_BACKEND
276 if (SystemProperties::GetRosenBackendEnabled()) {
277 rsUiDirector = OHOS::Rosen::RSUIDirector::Create();
278 if (rsUiDirector != nullptr) {
279 rsUiDirector->SetRSSurfaceNode(window_->GetSurfaceNode());
280 auto context = DynamicCast<PipelineContext>(container->GetPipelineContext());
281 if (context != nullptr) {
282 context->SetRSUIDirector(rsUiDirector);
283 }
284 rsUiDirector->Init();
285 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "UIContent Init Rosen Backend");
286 }
287 }
288 #endif
289 #endif
290 #ifdef NG_BUILD
291 auto subPipelineContextNG = AceType::DynamicCast<NG::PipelineContext>(
292 Platform::AceContainer::GetContainer(childContainerId_)->GetPipelineContext());
293 CHECK_NULL_VOID(subPipelineContextNG);
294 subPipelineContextNG->SetParentPipeline(parentContainer->GetPipelineContext());
295 subPipelineContextNG->SetupSubRootElement();
296 subPipelineContextNG->SetMinPlatformVersion(parentPipeline->GetMinPlatformVersion());
297 subPipelineContextNG->SetDragNodeGrayscale(parentPipeline->GetDragNodeGrayscale());
298 subPipelineContextNG->SetMaxAppFontScale(parentPipeline->GetMaxAppFontScale());
299 subPipelineContextNG->SetFollowSystem(parentPipeline->IsFollowSystem());
300 subPipelineContextNG->SetFontScale(parentPipeline->GetFontScale());
301 #else
302 if (container->IsCurrentUseNewPipeline()) {
303 auto subPipelineContextNG = AceType::DynamicCast<NG::PipelineContext>(
304 Platform::AceContainer::GetContainer(childContainerId_)->GetPipelineContext());
305 CHECK_NULL_VOID(subPipelineContextNG);
306 subPipelineContextNG->SetParentPipeline(parentContainer->GetPipelineContext());
307 subPipelineContextNG->SetupSubRootElement();
308 subPipelineContextNG->SetMinPlatformVersion(parentPipeline->GetMinPlatformVersion());
309 subPipelineContextNG->SetKeyboardAnimationConfig(parentPipeline->GetKeyboardAnimationConfig());
310 subPipelineContextNG->SetDragNodeGrayscale(parentPipeline->GetDragNodeGrayscale());
311 subPipelineContextNG->SetMaxAppFontScale(parentPipeline->GetMaxAppFontScale());
312 subPipelineContextNG->SetFollowSystem(parentPipeline->IsFollowSystem());
313 subPipelineContextNG->SetFontScale(parentPipeline->GetFontScale());
314 return;
315 }
316 auto subPipelineContext =
317 DynamicCast<PipelineContext>(Platform::AceContainer::GetContainer(childContainerId_)->GetPipelineContext());
318 CHECK_NULL_VOID(subPipelineContext);
319 subPipelineContext->SetParentPipeline(parentContainer->GetPipelineContext());
320 subPipelineContext->SetupSubRootElement();
321 subPipelineContext->SetMinPlatformVersion(parentPipeline->GetMinPlatformVersion());
322 subPipelineContext->SetKeyboardAnimationConfig(parentPipeline->GetKeyboardAnimationConfig());
323 subPipelineContext->SetDragNodeGrayscale(parentPipeline->GetDragNodeGrayscale());
324 subPipelineContext->SetMaxAppFontScale(parentPipeline->GetMaxAppFontScale());
325 subPipelineContext->SetFollowSystem(parentPipeline->IsFollowSystem());
326 subPipelineContext->SetFontScale(parentPipeline->GetFontScale());
327 #endif
328 }
329
GetChildPipelineContext() const330 RefPtr<PipelineBase> SubwindowOhos::GetChildPipelineContext() const
331 {
332 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
333 CHECK_NULL_RETURN(aceContainer, nullptr);
334 return aceContainer->GetPipelineContext();
335 }
336
GetInitToastDelayTask(const NG::ToastInfo & toastInfo)337 std::function<void()> SubwindowOhos::GetInitToastDelayTask(const NG::ToastInfo& toastInfo)
338 {
339 return [toastInfo]() {
340 int32_t posX = 0;
341 int32_t posY = 0;
342 int32_t width = 0;
343 int32_t height = 0;
344 float density = 1.0f;
345 auto subwindowOhos =
346 AceType::DynamicCast<SubwindowOhos>(SubwindowManager::GetInstance()->GetCurrentDialogWindow());
347 CHECK_NULL_VOID(subwindowOhos);
348 subwindowOhos->GetToastDialogWindowProperty(width, height, posX, posY, density);
349 auto childContainerId = subwindowOhos->GetChildContainerId();
350 auto window = Platform::DialogContainer::GetUIWindow(childContainerId);
351 auto dialogWindow = subwindowOhos->GetDialogWindow();
352 if (!dialogWindow || !window || !subwindowOhos->IsToastWindow()) {
353 bool ret = subwindowOhos->InitToastDialogWindow(width, height, posX, posY, true);
354 if (!ret) {
355 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog window failed");
356 return;
357 }
358 ret = subwindowOhos->InitToastDialogView(width, height, density);
359 if (!ret) {
360 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog view failed");
361 return;
362 }
363 subwindowOhos->SetIsToastWindow(true);
364 }
365 childContainerId = subwindowOhos->GetChildContainerId();
366 ContainerScope scope(childContainerId);
367 subwindowOhos->UpdateAceView(width, height, density, childContainerId);
368 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW,
369 "update ace view width : %{public}d, height : %{public}d, density : %{public}f,childContainerId : "
370 "%{public}d",
371 width, height, density, childContainerId);
372 auto container = Platform::DialogContainer::GetContainer(childContainerId);
373 CHECK_NULL_VOID(container);
374 container->SetFontScaleAndWeightScale(childContainerId);
375 auto ret = subwindowOhos->InitToastServiceConfig();
376 if (!ret) {
377 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast service conf failed");
378 }
379 Platform::DialogContainer::ShowToastDialogWindow(childContainerId, posX, posY, width, height, true);
380 Platform::DialogContainer::ShowToast(childContainerId, toastInfo.message, toastInfo.duration, toastInfo.bottom);
381 };
382 }
383
ResizeWindow()384 void SubwindowOhos::ResizeWindow()
385 {
386 auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
387 CHECK_NULL_VOID(defaultDisplay);
388 CHECK_NULL_VOID(window_);
389 auto ret = window_->Resize(defaultDisplay->GetWidth(), defaultDisplay->GetHeight());
390 if (ret != Rosen::WMError::WM_OK) {
391 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Resize window by default display failed with errCode: %{public}d",
392 static_cast<int32_t>(ret));
393 return;
394 }
395 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
396 "SubwindowOhos window rect is resized to x: %{public}d, y: %{public}d, width: %{public}u, height: %{public}u",
397 window_->GetRect().posX_, window_->GetRect().posY_, window_->GetRect().width_, window_->GetRect().height_);
398 }
399
GetRect()400 NG::RectF SubwindowOhos::GetRect()
401 {
402 NG::RectF rect;
403 CHECK_NULL_RETURN(window_, rect);
404 rect.SetRect(
405 window_->GetRect().posX_, window_->GetRect().posY_, window_->GetRect().width_, window_->GetRect().height_);
406 return rect;
407 }
408
ShowPopup(const RefPtr<Component> & newComponent,bool disableTouchEvent)409 void SubwindowOhos::ShowPopup(const RefPtr<Component>& newComponent, bool disableTouchEvent)
410 {
411 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup enter");
412 #ifndef NG_BUILD
413 ShowWindow();
414 auto stack = GetStack();
415 CHECK_NULL_VOID(stack);
416 auto popup = AceType::DynamicCast<TweenComponent>(newComponent);
417 CHECK_NULL_VOID(popup);
418 stack->PopPopup(popup->GetId());
419 stack->PushComponent(newComponent, disableTouchEvent);
420 auto bubble = AceType::DynamicCast<BubbleComponent>(popup->GetChild());
421 if (bubble) {
422 bubble->SetWeakStack(WeakClaim(RawPtr(stack)));
423 }
424 #endif
425 }
426
CancelPopup(const std::string & id)427 bool SubwindowOhos::CancelPopup(const std::string& id)
428 {
429 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "cancel popup enter");
430 #ifndef NG_BUILD
431 auto stack = GetStack();
432 CHECK_NULL_RETURN(stack, false);
433 stack->PopPopup(id);
434 auto context = stack->GetContext().Upgrade();
435 CHECK_NULL_RETURN(context, false);
436 context->FlushPipelineImmediately();
437 HideWindow();
438 #endif
439 return true;
440 }
441
ShowPopupNG(int32_t targetId,const NG::PopupInfo & popupInfo,const std::function<void (int32_t)> && onWillDismiss,bool interactiveDismiss)442 void SubwindowOhos::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo,
443 const std::function<void(int32_t)>&& onWillDismiss, bool interactiveDismiss)
444 {
445 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show popup ng enter, subwindowId: %{public}d", window_->GetWindowId());
446 popupTargetId_ = targetId;
447 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
448 CHECK_NULL_VOID(aceContainer);
449 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
450 CHECK_NULL_VOID(context);
451 auto overlayManager = context->GetOverlayManager();
452 CHECK_NULL_VOID(overlayManager);
453 ResizeWindow();
454 ShowWindow(popupInfo.focusable);
455 CHECK_NULL_VOID(window_);
456 window_->SetTouchable(true);
457 ContainerScope scope(childContainerId_);
458 overlayManager->ShowPopup(targetId, popupInfo, std::move(onWillDismiss), interactiveDismiss);
459 window_->SetFocusable(true);
460 }
461
HidePopupNG(int32_t targetId)462 void SubwindowOhos::HidePopupNG(int32_t targetId)
463 {
464 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
465 "hide popup ng enter, subwindowId: %{public}d, subwindowName: %{public}s",
466 window_->GetWindowId(), window_->GetWindowName().c_str());
467 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
468 CHECK_NULL_VOID(aceContainer);
469 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
470 CHECK_NULL_VOID(context);
471 auto overlayManager = context->GetOverlayManager();
472 CHECK_NULL_VOID(overlayManager);
473 auto popupInfo = overlayManager->GetPopupInfo(targetId == -1 ? popupTargetId_ : targetId);
474 popupInfo.markNeedUpdate = true;
475 ContainerScope scope(childContainerId_);
476 overlayManager->HidePopup(targetId == -1 ? popupTargetId_ : targetId, popupInfo);
477 context->FlushPipelineImmediately();
478 HideEventColumn();
479 HidePixelMap();
480 HideFilter(false);
481 }
482
GetPopupInfoNG(int32_t targetId,NG::PopupInfo & popupInfo)483 void SubwindowOhos::GetPopupInfoNG(int32_t targetId, NG::PopupInfo& popupInfo)
484 {
485 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get popup info ng enter");
486 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
487 CHECK_NULL_VOID(aceContainer);
488 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
489 CHECK_NULL_VOID(context);
490 auto overlayManager = context->GetOverlayManager();
491 CHECK_NULL_VOID(overlayManager);
492 popupInfo = overlayManager->GetPopupInfo(targetId);
493 }
494
GetOverlayManager()495 const RefPtr<NG::OverlayManager> SubwindowOhos::GetOverlayManager()
496 {
497 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
498 CHECK_NULL_RETURN(aceContainer, nullptr);
499 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
500 CHECK_NULL_RETURN(context, nullptr);
501 return context->GetOverlayManager();
502 }
503
ShowWindow(bool needFocus)504 void SubwindowOhos::ShowWindow(bool needFocus)
505 {
506 CHECK_NULL_VOID(window_);
507 if (isShowed_) {
508 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "subwindow id:%{public}u is on display", window_->GetWindowId());
509 if (needFocus) {
510 window_->SetFocusable(needFocus);
511 RequestFocus();
512 }
513 return;
514 }
515 // Set min window hot area so that sub window can transparent event.
516 std::vector<Rosen::Rect> hotAreas;
517 Rosen::Rect rosenRect {};
518 RectConverter(MIN_WINDOW_HOT_AREA, rosenRect);
519 hotAreas.emplace_back(rosenRect);
520 window_->SetTouchHotAreas(hotAreas);
521
522 window_->SetNeedDefaultAnimation(false);
523 auto ret = window_->SetFocusable(needFocus);
524 if (ret != OHOS::Rosen::WMError::WM_OK) {
525 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW,
526 "subwindow id:%{public}u set focusable %{public}d failed with WMError: %{public}d", window_->GetWindowId(),
527 needFocus, static_cast<int32_t>(ret));
528 }
529 ret = window_->Show(0, false, needFocus);
530 if (ret != OHOS::Rosen::WMError::WM_OK) {
531 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "Show subwindow id:%{public}u failed with WMError: %{public}d",
532 window_->GetWindowId(), static_cast<int32_t>(ret));
533 return;
534 }
535 if (needFocus) {
536 RequestFocus();
537 }
538
539 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
540 CHECK_NULL_VOID(aceContainer);
541 auto context = aceContainer->GetPipelineContext();
542 CHECK_NULL_VOID(context);
543 AccessibilityEvent event;
544 event.type = AccessibilityEventType::PAGE_CHANGE;
545 event.windowId = context->GetWindowId();
546 event.windowChangeTypes = WINDOW_UPDATE_ADDED;
547 context->SendEventToAccessibility(event);
548 isShowed_ = true;
549 SubwindowManager::GetInstance()->SetCurrentSubwindow(AceType::Claim(this));
550 }
551
HideWindow()552 void SubwindowOhos::HideWindow()
553 {
554 CHECK_NULL_VOID(window_);
555 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Hide the subwindow %{public}s", window_->GetWindowName().c_str());
556
557 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
558 CHECK_NULL_VOID(aceContainer);
559
560 #ifdef NG_BUILD
561 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
562 CHECK_NULL_VOID(context);
563 auto rootNode = context->GetRootElement();
564 CHECK_NULL_VOID(rootNode);
565 if (!rootNode->GetChildren().empty() &&
566 !(rootNode->GetChildren().size() == 1 && rootNode->GetLastChild()->GetTag() == V2::KEYBOARD_ETS_TAG)) {
567 auto lastChildId = rootNode->GetLastChild()->GetId();
568 auto iter = hotAreasMap_.find(lastChildId);
569 if (iter != hotAreasMap_.end()) {
570 auto hotAreaRect = iter->second;
571 OHOS::Rosen::WMError ret = window_->SetTouchHotAreas(hotAreaRect);
572 if (ret != OHOS::Rosen::WMError::WM_OK) {
573 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Set hot areas failed with errCode: %{public}d",
574 static_cast<int32_t>(ret));
575 }
576 }
577 return;
578 }
579 auto focusHub = rootNode->GetFocusHub();
580 CHECK_NULL_VOID(focusHub);
581 focusHub->SetIsDefaultHasFocused(false);
582 context->SetIsFocusActive(false);
583 #else
584 if (Container::IsCurrentUseNewPipeline()) {
585 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
586 CHECK_NULL_VOID(context);
587 auto rootNode = context->GetRootElement();
588 CHECK_NULL_VOID(rootNode);
589 if (!rootNode->GetChildren().empty() &&
590 !(rootNode->GetChildren().size() == 1 && rootNode->GetLastChild()->GetTag() == V2::KEYBOARD_ETS_TAG)) {
591 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Subwindow has other node, the last child is %{public}s",
592 rootNode->GetLastChild()->GetTag().c_str());
593 return;
594 }
595 auto focusHub = rootNode->GetFocusHub();
596 CHECK_NULL_VOID(focusHub);
597 focusHub->SetIsDefaultHasFocused(false);
598 context->SetIsFocusActive(false);
599 } else {
600 auto context = DynamicCast<PipelineContext>(aceContainer->GetPipelineContext());
601 CHECK_NULL_VOID(context);
602 auto rootNode = context->GetRootElement();
603 CHECK_NULL_VOID(rootNode);
604 rootNode->SetIsDefaultHasFocused(false);
605 }
606 #endif
607
608 if (!window_->IsFocused()) {
609 ContainerModalUnFocus();
610 }
611
612 OHOS::Rosen::WMError ret = window_->Hide();
613 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
614 CHECK_NULL_VOID(parentContainer);
615 if (parentContainer->IsScenceBoardWindow()) {
616 window_->SetTouchable(true);
617 }
618
619 if (ret != OHOS::Rosen::WMError::WM_OK) {
620 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "Hide window failed with errCode: %{public}d", static_cast<int32_t>(ret));
621 return;
622 }
623 isShowed_ = false;
624 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Hide the subwindow successfully.");
625 #ifndef NG_BUILD
626 auto context = aceContainer->GetPipelineContext();
627 CHECK_NULL_VOID(context);
628 #endif
629 AccessibilityEvent event;
630 event.type = AccessibilityEventType::PAGE_CHANGE;
631 event.windowId = context->GetWindowId();
632 event.windowChangeTypes = WINDOW_UPDATE_REMOVED;
633 context->SendEventToAccessibility(event);
634 }
635
ContainerModalUnFocus()636 void SubwindowOhos::ContainerModalUnFocus()
637 {
638 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
639 CHECK_NULL_VOID(parentContainer);
640 auto parentWindowName = parentContainer->GetWindowName();
641 sptr<OHOS::Rosen::Window> parentWindow = OHOS::Rosen::Window::Find(parentWindowName);
642 CHECK_NULL_VOID(parentWindow);
643 if (parentWindow->GetFocusable() && !parentWindow->IsFocused()) {
644 auto pipelineContext = parentContainer->GetPipelineContext();
645 CHECK_NULL_VOID(pipelineContext);
646 pipelineContext->ContainerModalUnFocus();
647 }
648 }
649
AddMenu(const RefPtr<Component> & newComponent)650 void SubwindowOhos::AddMenu(const RefPtr<Component>& newComponent)
651 {
652 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "add menu enter");
653 #ifndef NG_BUILD
654 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Subwindow push new component start.");
655 auto stack = GetStack();
656 CHECK_NULL_VOID(stack);
657 // Push the component
658 stack->PopMenu();
659 stack->PushComponent(newComponent);
660 popup_ = AceType::DynamicCast<SelectPopupComponent>(newComponent);
661 #endif
662 }
663
ClearMenu()664 void SubwindowOhos::ClearMenu()
665 {
666 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear menu enter");
667 if (haveDialog_) {
668 return;
669 }
670 #ifndef NG_BUILD
671 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Subwindow Clear menu start.");
672 auto stack = GetStack();
673 CHECK_NULL_VOID(stack);
674 // Pop the component
675 stack->PopMenu();
676 auto context = stack->GetContext().Upgrade();
677 CHECK_NULL_VOID(context);
678 context->FlushPipelineImmediately();
679 HideWindow();
680 #endif
681 }
682
ShowPreviewNG(bool isStartDraggingFromSubWindow)683 bool SubwindowOhos::ShowPreviewNG(bool isStartDraggingFromSubWindow)
684 {
685 CHECK_NULL_RETURN(window_, false);
686 ShowWindow(false);
687 ResizeWindow();
688 if (!isStartDraggingFromSubWindow) {
689 window_->SetTouchable(false);
690 }
691 return true;
692 }
693
HidePreviewNG()694 void SubwindowOhos::HidePreviewNG()
695 {
696 auto overlayManager = GetOverlayManager();
697 CHECK_NULL_VOID(overlayManager);
698 overlayManager->RemovePixelMap();
699 overlayManager->RemovePreviewBadgeNode();
700 overlayManager->RemoveGatherNode();
701 overlayManager->RemoveEventColumn();
702 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
703 CHECK_NULL_VOID(aceContainer);
704 auto pipeline = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
705 CHECK_NULL_VOID(pipeline);
706 pipeline->FlushPipelineImmediately();
707 HideSubWindowNG();
708 }
709
ShowMenuNG(const RefPtr<NG::FrameNode> customNode,const NG::MenuParam & menuParam,const RefPtr<NG::FrameNode> & targetNode,const NG::OffsetF & offset)710 void SubwindowOhos::ShowMenuNG(const RefPtr<NG::FrameNode> customNode, const NG::MenuParam& menuParam,
711 const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset)
712 {
713 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show menu ng enter");
714 CHECK_NULL_VOID(customNode);
715 CHECK_NULL_VOID(targetNode);
716 ContainerScope scope(childContainerId_);
717 auto container = Container::Current();
718 CHECK_NULL_VOID(container);
719 auto context = DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
720 CHECK_NULL_VOID(context);
721 auto overlay = context->GetOverlayManager();
722 CHECK_NULL_VOID(overlay);
723 auto menuNode = customNode;
724 if (customNode->GetTag() != V2::MENU_WRAPPER_ETS_TAG) {
725 menuNode = NG::MenuView::Create(customNode, targetNode->GetId(), targetNode->GetTag(), menuParam, true);
726 auto menuWrapperPattern = menuNode->GetPattern<NG::MenuWrapperPattern>();
727 CHECK_NULL_VOID(menuWrapperPattern);
728 menuWrapperPattern->RegisterMenuCallback(menuNode, menuParam);
729 menuWrapperPattern->SetMenuTransitionEffect(menuNode, menuParam);
730 }
731 ShowWindow();
732 ResizeWindow();
733 CHECK_NULL_VOID(window_);
734 window_->SetTouchable(true);
735 overlay->ShowMenuInSubWindow(targetNode->GetId(), offset, menuNode);
736 }
737
ShowMenuNG(std::function<void ()> && buildFunc,std::function<void ()> && previewBuildFunc,const NG::MenuParam & menuParam,const RefPtr<NG::FrameNode> & targetNode,const NG::OffsetF & offset)738 void SubwindowOhos::ShowMenuNG(std::function<void()>&& buildFunc, std::function<void()>&& previewBuildFunc,
739 const NG::MenuParam& menuParam, const RefPtr<NG::FrameNode>& targetNode, const NG::OffsetF& offset)
740 {
741 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show menu ng enter");
742 ContainerScope scope(childContainerId_);
743 auto container = Container::Current();
744 CHECK_NULL_VOID(container);
745 auto context = DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
746 CHECK_NULL_VOID(context);
747 auto overlay = context->GetOverlayManager();
748 CHECK_NULL_VOID(overlay);
749 ShowWindow();
750 ResizeWindow();
751 CHECK_NULL_VOID(window_);
752 window_->SetTouchable(true);
753 NG::ScopedViewStackProcessor builderViewStackProcessor;
754 buildFunc();
755 auto customNode = NG::ViewStackProcessor::GetInstance()->Finish();
756 RefPtr<NG::UINode> previewCustomNode;
757 if (previewBuildFunc && menuParam.previewMode == MenuPreviewMode::CUSTOM) {
758 previewBuildFunc();
759 previewCustomNode = NG::ViewStackProcessor::GetInstance()->Finish();
760 }
761 auto menuNode =
762 NG::MenuView::Create(customNode, targetNode->GetId(), targetNode->GetTag(), menuParam, true, previewCustomNode);
763 auto menuWrapperPattern = menuNode->GetPattern<NG::MenuWrapperPattern>();
764 CHECK_NULL_VOID(menuWrapperPattern);
765 menuWrapperPattern->RegisterMenuCallback(menuNode, menuParam);
766 menuWrapperPattern->SetMenuTransitionEffect(menuNode, menuParam);
767 overlay->ShowMenuInSubWindow(targetNode->GetId(), offset, menuNode);
768 }
769
HideMenuNG(bool showPreviewAnimation,bool startDrag)770 void SubwindowOhos::HideMenuNG(bool showPreviewAnimation, bool startDrag)
771 {
772 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "hide menu ng enter");
773 if (!isShowed_) {
774 return;
775 }
776 ContainerScope scope(childContainerId_);
777 auto container = Container::Current();
778 CHECK_NULL_VOID(container);
779 auto context = DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
780 CHECK_NULL_VOID(context);
781 auto overlay = context->GetOverlayManager();
782 CHECK_NULL_VOID(overlay);
783 overlay->HideMenuInSubWindow(showPreviewAnimation, startDrag);
784 HideEventColumn();
785 HidePixelMap(startDrag, 0, 0, false);
786 HideFilter(false);
787 HideFilter(true);
788 }
789
HideMenuNG(const RefPtr<NG::FrameNode> & menu,int32_t targetId)790 void SubwindowOhos::HideMenuNG(const RefPtr<NG::FrameNode>& menu, int32_t targetId)
791 {
792 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "hide menu ng enter");
793 if (!isShowed_) {
794 return;
795 }
796 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Subwindow hide menu for target id %{public}d", targetId);
797 targetId_ = targetId;
798 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
799 CHECK_NULL_VOID(aceContainer);
800 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
801 CHECK_NULL_VOID(context);
802 auto overlay = context->GetOverlayManager();
803 CHECK_NULL_VOID(overlay);
804 overlay->HideMenuInSubWindow(menu, targetId_);
805 HideEventColumn();
806 HidePixelMap(false, 0, 0, false);
807 HideFilter(false);
808 HideFilter(true);
809 }
810
UpdatePreviewPosition()811 void SubwindowOhos::UpdatePreviewPosition()
812 {
813 ContainerScope scope(childContainerId_);
814 auto pipelineContext = NG::PipelineContext::GetCurrentContext();
815 CHECK_NULL_VOID(pipelineContext);
816 auto overlay = pipelineContext->GetOverlayManager();
817 CHECK_NULL_VOID(overlay);
818 if (overlay->GetHasPixelMap()) {
819 return;
820 }
821 overlay->UpdatePixelMapPosition(true);
822 }
823
GetMenuPreviewCenter(NG::OffsetF & offset)824 bool SubwindowOhos::GetMenuPreviewCenter(NG::OffsetF& offset)
825 {
826 ContainerScope scope(childContainerId_);
827 auto pipelineContext = NG::PipelineContext::GetCurrentContext();
828 CHECK_NULL_RETURN(pipelineContext, false);
829 auto overlay = pipelineContext->GetOverlayManager();
830 CHECK_NULL_RETURN(overlay, false);
831 return overlay->GetMenuPreviewCenter(offset);
832 }
833
UpdateHideMenuOffsetNG(const NG::OffsetF & offset,float menuScale,bool isRedragStart,int32_t menuWrapperId)834 void SubwindowOhos::UpdateHideMenuOffsetNG(
835 const NG::OffsetF& offset, float menuScale, bool isRedragStart, int32_t menuWrapperId)
836 {
837 ContainerScope scope(childContainerId_);
838 auto pipelineContext = NG::PipelineContext::GetCurrentContext();
839 CHECK_NULL_VOID(pipelineContext);
840 auto overlay = pipelineContext->GetOverlayManager();
841 CHECK_NULL_VOID(overlay);
842 if (overlay->IsContextMenuDragHideFinished()) {
843 return;
844 }
845 overlay->UpdateContextMenuDisappearPosition(offset, menuScale, isRedragStart, menuWrapperId);
846 }
847
ContextMenuSwitchDragPreviewAnimationtNG(const RefPtr<NG::FrameNode> & dragPreviewNode,const NG::OffsetF & offset)848 void SubwindowOhos::ContextMenuSwitchDragPreviewAnimationtNG(const RefPtr<NG::FrameNode>& dragPreviewNode,
849 const NG::OffsetF& offset)
850 {
851 CHECK_NULL_VOID(dragPreviewNode);
852 ContainerScope scope(childContainerId_);
853 auto pipelineContext = NG::PipelineContext::GetCurrentContext();
854 CHECK_NULL_VOID(pipelineContext);
855 auto overlay = pipelineContext->GetOverlayManager();
856 CHECK_NULL_VOID(overlay);
857 overlay->ContextMenuSwitchDragPreviewAnimation(dragPreviewNode, offset);
858 }
859
ClearMenuNG(int32_t targetId,bool inWindow,bool showAnimation)860 void SubwindowOhos::ClearMenuNG(int32_t targetId, bool inWindow, bool showAnimation)
861 {
862 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "clear menu ng enter");
863 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
864 CHECK_NULL_VOID(aceContainer);
865 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
866 CHECK_NULL_VOID(context);
867 auto overlay = context->GetOverlayManager();
868 CHECK_NULL_VOID(overlay);
869 if (showAnimation) {
870 overlay->CleanMenuInSubWindowWithAnimation();
871 HideFilter(true);
872 } else {
873 overlay->CleanMenuInSubWindow(targetId);
874 overlay->RemoveFilter();
875 }
876 overlay->EraseMenuInfo(targetId);
877 HideWindow();
878 context->FlushPipelineImmediately();
879 if (inWindow) {
880 HideEventColumn();
881 }
882 HidePixelMap(false, 0, 0, false);
883 HideFilter(false);
884 }
885
ClearPopupNG()886 void SubwindowOhos::ClearPopupNG()
887 {
888 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear popup ng enter");
889 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
890 CHECK_NULL_VOID(aceContainer);
891 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
892 CHECK_NULL_VOID(context);
893 auto overlay = context->GetOverlayManager();
894 CHECK_NULL_VOID(overlay);
895 overlay->CleanPopupInSubWindow();
896 HideWindow();
897 context->FlushPipelineImmediately();
898 }
899
ShowMenu(const RefPtr<Component> & newComponent)900 void SubwindowOhos::ShowMenu(const RefPtr<Component>& newComponent)
901 {
902 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show menu enter");
903 ShowWindow();
904 AddMenu(newComponent);
905 }
906
CloseMenu()907 void SubwindowOhos::CloseMenu()
908 {
909 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "close menu enter");
910 #ifndef NG_BUILD
911 if (!isShowed_) {
912 return;
913 }
914 if (popup_) {
915 popup_->CloseContextMenu();
916 }
917 #endif
918 }
919
GetStack()920 RefPtr<StackElement> SubwindowOhos::GetStack()
921 {
922 #ifndef NG_BUILD
923 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
924 CHECK_NULL_RETURN(aceContainer, nullptr);
925
926 auto context = DynamicCast<PipelineContext>(aceContainer->GetPipelineContext());
927 CHECK_NULL_RETURN(context, nullptr);
928 return context->GetLastStack();
929 #else
930 return nullptr;
931 #endif
932 }
933
DeleteHotAreas(int32_t nodeId)934 void SubwindowOhos::DeleteHotAreas(int32_t nodeId)
935 {
936 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "delete hot area %{public}d", nodeId);
937 hotAreasMap_.erase(nodeId);
938
939 std::vector<Rosen::Rect> hotAreas;
940 for (auto it = hotAreasMap_.begin(); it != hotAreasMap_.end(); it++) {
941 hotAreas.insert(hotAreas.end(), it->second.begin(), it->second.end());
942 }
943 CHECK_NULL_VOID(window_);
944 window_->SetTouchHotAreas(hotAreas);
945 }
946
SetHotAreas(const std::vector<Rect> & rects,int32_t nodeId)947 void SubwindowOhos::SetHotAreas(const std::vector<Rect>& rects, int32_t nodeId)
948 {
949 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set hot areas enter");
950 CHECK_NULL_VOID(window_);
951
952 std::vector<Rosen::Rect> hotAreas;
953 Rosen::Rect rosenRect {};
954
955 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "set hot area %{public}d", nodeId);
956 for (const auto& rect : rects) {
957 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set hot area rect %{public}s", rect.ToString().c_str());
958 RectConverter(rect, rosenRect);
959 hotAreas.emplace_back(rosenRect);
960 }
961 if (nodeId >= 0) {
962 hotAreasMap_[nodeId] = hotAreas;
963 }
964
965 std::vector<Rosen::Rect> hotAreasNow;
966 for (auto it = hotAreasMap_.begin(); it != hotAreasMap_.end(); it++) {
967 hotAreasNow.insert(hotAreasNow.end(), it->second.begin(), it->second.end());
968 }
969 window_->SetTouchHotAreas(hotAreasNow);
970 }
971
RectConverter(const Rect & rect,Rosen::Rect & rosenRect)972 void SubwindowOhos::RectConverter(const Rect& rect, Rosen::Rect& rosenRect)
973 {
974 rosenRect.posX_ = static_cast<int>(rect.GetOffset().GetX());
975 rosenRect.posY_ = static_cast<int>(rect.GetOffset().GetY());
976 rosenRect.width_ = static_cast<uint32_t>(rect.GetSize().Width());
977 rosenRect.height_ = static_cast<uint32_t>(rect.GetSize().Height());
978 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
979 "Convert rect to rosenRect, x is %{public}d, y is %{public}d, width is %{public}d, height is %{public}d",
980 rosenRect.posX_, rosenRect.posY_, rosenRect.width_, rosenRect.height_);
981 }
982
ShowDialogNG(const DialogProperties & dialogProps,std::function<void ()> && buildFunc)983 RefPtr<NG::FrameNode> SubwindowOhos::ShowDialogNG(
984 const DialogProperties& dialogProps, std::function<void()>&& buildFunc)
985 {
986 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog ng enter");
987 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
988 CHECK_NULL_RETURN(aceContainer, nullptr);
989 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
990 CHECK_NULL_RETURN(context, nullptr);
991 auto overlay = context->GetOverlayManager();
992 CHECK_NULL_RETURN(overlay, nullptr);
993 std::map<int32_t, RefPtr<NG::FrameNode>> DialogMap(overlay->GetDialogMap().begin(), overlay->GetDialogMap().end());
994 int dialogMapSize = static_cast<int>(DialogMap.size());
995 if (dialogMapSize == 0) {
996 auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
997 CHECK_NULL_RETURN(parentAceContainer, nullptr);
998 auto parentcontext = DynamicCast<NG::PipelineContext>(parentAceContainer->GetPipelineContext());
999 CHECK_NULL_RETURN(parentcontext, nullptr);
1000 auto parentOverlay = parentcontext->GetOverlayManager();
1001 CHECK_NULL_RETURN(parentOverlay, nullptr);
1002 parentOverlay->SetSubWindowId(SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1003 }
1004 SubwindowManager::GetInstance()->SetDialogSubWindowId(
1005 SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1006 ShowWindow();
1007 CHECK_NULL_RETURN(window_, nullptr);
1008 window_->SetFullScreen(true);
1009 window_->SetTouchable(true);
1010 ResizeWindow();
1011 ContainerScope scope(childContainerId_);
1012 auto dialog = overlay->ShowDialog(dialogProps, std::move(buildFunc));
1013 CHECK_NULL_RETURN(dialog, nullptr);
1014 haveDialog_ = true;
1015 return dialog;
1016 }
1017
ShowDialogNGWithNode(const DialogProperties & dialogProps,const RefPtr<NG::UINode> & customNode)1018 RefPtr<NG::FrameNode> SubwindowOhos::ShowDialogNGWithNode(
1019 const DialogProperties& dialogProps, const RefPtr<NG::UINode>& customNode)
1020 {
1021 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog ng enter");
1022 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1023 CHECK_NULL_RETURN(aceContainer, nullptr);
1024 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1025 CHECK_NULL_RETURN(context, nullptr);
1026 auto overlay = context->GetOverlayManager();
1027 CHECK_NULL_RETURN(overlay, nullptr);
1028 std::map<int32_t, RefPtr<NG::FrameNode>> DialogMap(overlay->GetDialogMap().begin(), overlay->GetDialogMap().end());
1029 int dialogMapSize = static_cast<int>(DialogMap.size());
1030 if (dialogMapSize == 0) {
1031 auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1032 CHECK_NULL_RETURN(parentAceContainer, nullptr);
1033 auto parentcontext = DynamicCast<NG::PipelineContext>(parentAceContainer->GetPipelineContext());
1034 CHECK_NULL_RETURN(parentcontext, nullptr);
1035 auto parentOverlay = parentcontext->GetOverlayManager();
1036 CHECK_NULL_RETURN(parentOverlay, nullptr);
1037 parentOverlay->SetSubWindowId(SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1038 }
1039 SubwindowManager::GetInstance()->SetDialogSubWindowId(
1040 SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1041 ShowWindow();
1042 CHECK_NULL_RETURN(window_, nullptr);
1043 window_->SetFullScreen(true);
1044 window_->SetTouchable(true);
1045 ResizeWindow();
1046 ContainerScope scope(childContainerId_);
1047 auto dialog = overlay->ShowDialogWithNode(dialogProps, customNode);
1048 CHECK_NULL_RETURN(dialog, nullptr);
1049 haveDialog_ = true;
1050 return dialog;
1051 }
1052
CloseDialogNG(const RefPtr<NG::FrameNode> & dialogNode)1053 void SubwindowOhos::CloseDialogNG(const RefPtr<NG::FrameNode>& dialogNode)
1054 {
1055 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close dialog ng enter");
1056 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1057 CHECK_NULL_VOID(aceContainer);
1058 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1059 CHECK_NULL_VOID(context);
1060 auto overlay = context->GetOverlayManager();
1061 CHECK_NULL_VOID(overlay);
1062 ContainerScope scope(childContainerId_);
1063 return overlay->CloseDialog(dialogNode);
1064 }
1065
OpenCustomDialogNG(const DialogProperties & dialogProps,std::function<void (int32_t)> && callback)1066 void SubwindowOhos::OpenCustomDialogNG(const DialogProperties& dialogProps, std::function<void(int32_t)>&& callback)
1067 {
1068 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "open customDialog ng subwindow enter");
1069 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1070 CHECK_NULL_VOID(aceContainer);
1071 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1072 CHECK_NULL_VOID(context);
1073 auto overlay = context->GetOverlayManager();
1074 CHECK_NULL_VOID(overlay);
1075 std::map<int32_t, RefPtr<NG::FrameNode>> DialogMap(overlay->GetDialogMap().begin(), overlay->GetDialogMap().end());
1076 int dialogMapSize = static_cast<int>(DialogMap.size());
1077 if (dialogMapSize == 0) {
1078 auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1079 CHECK_NULL_VOID(parentAceContainer);
1080 auto parentcontext = DynamicCast<NG::PipelineContext>(parentAceContainer->GetPipelineContext());
1081 CHECK_NULL_VOID(parentcontext);
1082 auto parentOverlay = parentcontext->GetOverlayManager();
1083 CHECK_NULL_VOID(parentOverlay);
1084 parentOverlay->SetSubWindowId(SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1085 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "overlay in parent container %{public}d, SetSubWindowId %{public}d",
1086 parentContainerId_, GetSubwindowId());
1087 }
1088 SubwindowManager::GetInstance()->SetDialogSubWindowId(
1089 SubwindowManager::GetInstance()->GetDialogSubwindowInstanceId(GetSubwindowId()));
1090 ShowWindow();
1091 CHECK_NULL_VOID(window_);
1092 window_->SetFullScreen(true);
1093 window_->SetTouchable(true);
1094 ResizeWindow();
1095 ContainerScope scope(childContainerId_);
1096 overlay->OpenCustomDialog(dialogProps, std::move(callback));
1097 haveDialog_ = true;
1098 }
1099
CloseCustomDialogNG(int32_t dialogId)1100 void SubwindowOhos::CloseCustomDialogNG(int32_t dialogId)
1101 {
1102 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close customDialog ng subwindow enter, child container id %{public}d",
1103 childContainerId_);
1104 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1105 CHECK_NULL_VOID(aceContainer);
1106 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1107 CHECK_NULL_VOID(context);
1108 auto overlay = context->GetOverlayManager();
1109 CHECK_NULL_VOID(overlay);
1110 ContainerScope scope(childContainerId_);
1111 return overlay->CloseCustomDialog(dialogId);
1112 }
1113
CloseCustomDialogNG(const WeakPtr<NG::UINode> & node,std::function<void (int32_t)> && callback)1114 void SubwindowOhos::CloseCustomDialogNG(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)>&& callback)
1115 {
1116 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close customDialog ng subwindow enter, child container id %{public}d",
1117 childContainerId_);
1118 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1119 CHECK_NULL_VOID(aceContainer);
1120 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1121 CHECK_NULL_VOID(context);
1122 auto overlay = context->GetOverlayManager();
1123 CHECK_NULL_VOID(overlay);
1124 ContainerScope scope(childContainerId_);
1125 return overlay->CloseCustomDialog(node, std::move(callback));
1126 }
1127
UpdateCustomDialogNG(const WeakPtr<NG::UINode> & node,const DialogProperties & dialogProps,std::function<void (int32_t)> && callback)1128 void SubwindowOhos::UpdateCustomDialogNG(
1129 const WeakPtr<NG::UINode>& node, const DialogProperties& dialogProps, std::function<void(int32_t)>&& callback)
1130 {
1131 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "update customDialog ng subwindow enter");
1132 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1133 CHECK_NULL_VOID(aceContainer);
1134 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1135 CHECK_NULL_VOID(context);
1136 auto overlay = context->GetOverlayManager();
1137 CHECK_NULL_VOID(overlay);
1138 ContainerScope scope(childContainerId_);
1139 return overlay->UpdateCustomDialog(node, dialogProps, std::move(callback));
1140 }
1141
HideSubWindowNG()1142 void SubwindowOhos::HideSubWindowNG()
1143 {
1144 ContainerScope scope(childContainerId_);
1145 auto container = Container::Current();
1146 CHECK_NULL_VOID(container);
1147 if (container->IsDialogContainer()) {
1148 if (IsToastWindow()) {
1149 Platform::DialogContainer::HideWindow(Container::CurrentId());
1150 } else {
1151 Platform::DialogContainer::CloseWindow(Container::CurrentId());
1152 Platform::DialogContainer::DestroyContainer(Container::CurrentId());
1153 }
1154 } else {
1155 HideWindow();
1156 }
1157 }
1158
GetToastDialogWindowProperty(int32_t & width,int32_t & height,int32_t & posX,int32_t & posY,float & density) const1159 void SubwindowOhos::GetToastDialogWindowProperty(
1160 int32_t& width, int32_t& height, int32_t& posX, int32_t& posY, float& density) const
1161 {
1162 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get toast dialog window property enter");
1163 auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
1164 if (defaultDisplay) {
1165 posX = 0;
1166 posY = 0;
1167 width = defaultDisplay->GetWidth();
1168 height = defaultDisplay->GetHeight();
1169 density = defaultDisplay->GetVirtualPixelRatio();
1170 }
1171 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
1172 "Toast posX: %{public}d, posY: %{public}d, width: %{public}d, height: %{public}d, density: %{public}f", posX,
1173 posY, width, height, density);
1174 }
1175
InitToastDialogWindow(int32_t width,int32_t height,int32_t posX,int32_t posY,bool isToast)1176 bool SubwindowOhos::InitToastDialogWindow(int32_t width, int32_t height, int32_t posX, int32_t posY, bool isToast)
1177 {
1178 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "init toast dialog window enter");
1179 OHOS::sptr<OHOS::Rosen::WindowOption> windowOption = new OHOS::Rosen::WindowOption();
1180 if (isToast) {
1181 auto windowType =
1182 IsSystemTopMost() ? Rosen::WindowType::WINDOW_TYPE_SYSTEM_TOAST : Rosen::WindowType::WINDOW_TYPE_TOAST;
1183 windowOption->SetWindowType(windowType);
1184 } else {
1185 windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
1186 }
1187 windowOption->SetWindowRect({ posX, posY, width, height });
1188 windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FULLSCREEN);
1189 windowOption->SetFocusable(!isToast);
1190 int32_t dialogId = gToastDialogId.fetch_add(1, std::memory_order_relaxed);
1191 std::string windowName = "ARK_APP_SUBWINDOW_TOAST_DIALOG_" + std::to_string(dialogId);
1192 if (isToast) {
1193 auto context = OHOS::AbilityRuntime::Context::GetApplicationContext();
1194 dialogWindow_ = OHOS::Rosen::Window::Create(windowName, windowOption, context);
1195 } else {
1196 dialogWindow_ = OHOS::Rosen::Window::Create(windowName, windowOption);
1197 }
1198 CHECK_NULL_RETURN(dialogWindow_, false);
1199 dialogWindow_->SetLayoutFullScreen(true);
1200 return true;
1201 }
1202
InitToastDialogView(int32_t width,int32_t height,float density)1203 bool SubwindowOhos::InitToastDialogView(int32_t width, int32_t height, float density)
1204 {
1205 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "init toast dialog view enter");
1206 #ifndef NG_BUILD
1207 dialogWindow_->NapiSetUIContent("", nullptr, nullptr, Rosen::BackupAndRestoreType::NONE);
1208 childContainerId_ = SubwindowManager::GetInstance()->GetContainerId(dialogWindow_->GetWindowId());
1209 SubwindowManager::GetInstance()->AddParentContainerId(childContainerId_, parentContainerId_);
1210 ContainerScope scope(childContainerId_);
1211
1212 auto container = Platform::DialogContainer::GetContainer(childContainerId_);
1213 CHECK_NULL_RETURN(container, false);
1214 // create ace_view
1215 auto aceView = Platform::AceViewOhos::CreateView(childContainerId_, true, true);
1216 Platform::AceViewOhos::SurfaceCreated(aceView, dialogWindow_);
1217 // set view
1218 Platform::DialogContainer::SetView(aceView, density, width, height, dialogWindow_);
1219 Ace::Platform::DialogContainer::SetUIWindow(childContainerId_, dialogWindow_);
1220 ViewportConfig config(width, height, density);
1221 Platform::AceViewOhos::SetViewportMetrics(aceView, config);
1222 Platform::AceViewOhos::SurfaceChanged(aceView, width, height, 0);
1223
1224 #ifdef ENABLE_ROSEN_BACKEND
1225 if (SystemProperties::GetRosenBackendEnabled()) {
1226 rsUiDirector = OHOS::Rosen::RSUIDirector::Create();
1227 if (rsUiDirector != nullptr) {
1228 rsUiDirector->SetRSSurfaceNode(dialogWindow_->GetSurfaceNode());
1229 auto context = DynamicCast<PipelineContext>(container->GetPipelineContext());
1230 if (context != nullptr) {
1231 context->SetRSUIDirector(rsUiDirector);
1232 }
1233 rsUiDirector->Init();
1234 }
1235 }
1236 #endif
1237
1238 auto pipelineContext = container->GetPipelineContext();
1239 CHECK_NULL_RETURN(pipelineContext, false);
1240 pipelineContext->SetupRootElement();
1241 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1242 if (parentContainer) {
1243 auto parentPipeline = parentContainer->GetPipelineContext();
1244 CHECK_NULL_RETURN(parentPipeline, false);
1245 pipelineContext->SetMinPlatformVersion(parentPipeline->GetMinPlatformVersion());
1246 } else {
1247 pipelineContext->SetMinPlatformVersion(PLATFORM_VERSION_TEN);
1248 }
1249 return true;
1250 #else
1251 return true;
1252 #endif
1253 }
1254
InitToastServiceConfig()1255 bool SubwindowOhos::InitToastServiceConfig()
1256 {
1257 auto context = OHOS::AbilityRuntime::Context::GetApplicationContext();
1258 CHECK_NULL_RETURN(context, false);
1259 auto config = context->GetConfiguration();
1260 CHECK_NULL_RETURN(config, false);
1261 auto maxAppFontScale = config->GetItem(OHOS::AAFwk::GlobalConfigurationKey::APP_FONT_MAX_SCALE);
1262 auto followSystem = config->GetItem(OHOS::AAFwk::GlobalConfigurationKey::APP_FONT_SIZE_SCALE);
1263 auto container = Platform::DialogContainer::GetContainer(childContainerId_);
1264 CHECK_NULL_RETURN(container, false);
1265 auto pipelineContext = container->GetPipelineContext();
1266 CHECK_NULL_RETURN(pipelineContext, false);
1267 auto isFollowSystem = followSystem == "followSystem";
1268 if (!followSystem.empty()) {
1269 pipelineContext->SetFollowSystem(isFollowSystem);
1270 }
1271 if (!maxAppFontScale.empty()) {
1272 pipelineContext->SetMaxAppFontScale(StringUtils::StringToFloat(maxAppFontScale));
1273 }
1274 if (!isFollowSystem) {
1275 pipelineContext->SetFontScale(1.0f);
1276 }
1277 auto fontScale = config->GetItem(OHOS::AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE);
1278 if (!fontScale.empty()) {
1279 pipelineContext->SetFontScale(StringUtils::StringToFloat(fontScale));
1280 }
1281
1282 return true;
1283 }
1284
CreateEventRunner()1285 bool SubwindowOhos::CreateEventRunner()
1286 {
1287 if (!eventLoop_) {
1288 eventLoop_ = AppExecFwk::EventRunner::Create("Subwindow_Toast_Dialog");
1289 CHECK_NULL_RETURN(eventLoop_, false);
1290 handler_ = std::make_shared<AppExecFwk::EventHandler>(eventLoop_);
1291 CHECK_NULL_RETURN(handler_, false);
1292 }
1293 return true;
1294 }
1295
ClearToast()1296 void SubwindowOhos::ClearToast()
1297 {
1298 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear toast enter");
1299 if (!IsToastWindow()) {
1300 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "default toast needs not to be clear");
1301 return;
1302 }
1303 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1304 CHECK_NULL_VOID(aceContainer);
1305 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1306 CHECK_NULL_VOID(context);
1307 auto overlayManager = context->GetOverlayManager();
1308 CHECK_NULL_VOID(overlayManager);
1309 ContainerScope scope(childContainerId_);
1310 overlayManager->ClearToast();
1311 context->FlushPipelineImmediately();
1312 HideWindow();
1313 }
1314
ShowToastForAbility(const NG::ToastInfo & toastInfo)1315 void SubwindowOhos::ShowToastForAbility(const NG::ToastInfo& toastInfo)
1316 {
1317 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show toast for ability enter, containerId : %{public}d", childContainerId_);
1318 SetIsToastWindow(
1319 toastInfo.showMode == NG::ToastShowMode::TOP_MOST || toastInfo.showMode == NG::ToastShowMode::SYSTEM_TOP_MOST);
1320 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1321 if (!aceContainer) {
1322 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "get container failed, child containerId : %{public}d", childContainerId_);
1323 return;
1324 }
1325
1326 auto engine = EngineHelper::GetEngine(aceContainer->GetInstanceId());
1327 RefPtr<Framework::FrontendDelegate> delegate;
1328 if (!engine) {
1329 auto frontend = AceType::DynamicCast<DeclarativeFrontend>(aceContainer->GetFrontend());
1330 CHECK_NULL_VOID(frontend);
1331 delegate = frontend->GetDelegate();
1332 if (!delegate) {
1333 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "get engine failed, containerId : %{public}d",
1334 aceContainer->GetInstanceId());
1335 return;
1336 }
1337 } else {
1338 delegate = engine->GetFrontend();
1339 if (!delegate) {
1340 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "get frontend failed, child containerId : %{public}d",
1341 childContainerId_);
1342 return;
1343 }
1344 }
1345 ContainerScope scope(childContainerId_);
1346 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1347 CHECK_NULL_VOID(parentContainer);
1348 if (parentContainer->IsScenceBoardWindow() || toastInfo.showMode == NG::ToastShowMode::TOP_MOST ||
1349 toastInfo.showMode == NG::ToastShowMode::SYSTEM_TOP_MOST) {
1350 ResizeWindow();
1351 // Recover current subwindow in subwindow manager to ensure popup/menu can close the right subwindow
1352 auto currentWindow = SubwindowManager::GetInstance()->GetCurrentWindow();
1353 ShowWindow(false);
1354 SubwindowManager::GetInstance()->SetCurrentSubwindow(currentWindow);
1355 CHECK_NULL_VOID(window_);
1356 window_->SetTouchable(false);
1357 }
1358 delegate->ShowToast(toastInfo);
1359 }
1360
ShowToastForService(const NG::ToastInfo & toastInfo)1361 void SubwindowOhos::ShowToastForService(const NG::ToastInfo& toastInfo)
1362 {
1363 bool ret = CreateEventRunner();
1364 if (!ret) {
1365 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create event runner failed");
1366 return;
1367 }
1368
1369 SubwindowManager::GetInstance()->SetCurrentDialogSubwindow(AceType::Claim(this));
1370 if (!handler_->PostTask(GetInitToastDelayTask(toastInfo))) {
1371 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create show dialog callback failed");
1372 return;
1373 }
1374 }
1375
ShowToast(const NG::ToastInfo & toastInfo)1376 void SubwindowOhos::ShowToast(const NG::ToastInfo& toastInfo)
1377 {
1378 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show toast, window parent id is %{public}d", parentContainerId_);
1379 bool isTopMost = toastInfo.showMode == NG::ToastShowMode::TOP_MOST;
1380 // for pa service
1381 if ((isTopMost && parentContainerId_ >= MIN_PA_SERVICE_ID && parentContainerId_ < MIN_SUBCONTAINER_ID) ||
1382 (!isTopMost && parentContainerId_ >= MIN_PA_SERVICE_ID) || parentContainerId_ < 0) {
1383 ShowToastForService(toastInfo);
1384 } else {
1385 ShowToastForAbility(toastInfo);
1386 }
1387 }
1388
ShowDialogForAbility(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1389 void SubwindowOhos::ShowDialogForAbility(const std::string& title, const std::string& message,
1390 const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& callback,
1391 const std::set<std::string>& callbacks)
1392 {
1393 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog for ability enter");
1394 SubwindowManager::GetInstance()->SetCurrentSubwindow(AceType::Claim(this));
1395
1396 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1397 if (!aceContainer) {
1398 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get container failed, child containerId : %{public}d", childContainerId_);
1399 return;
1400 }
1401
1402 auto engine = EngineHelper::GetEngine(aceContainer->GetInstanceId());
1403 auto delegate = engine->GetFrontend();
1404 if (!delegate) {
1405 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get frontend failed, child containerId : %{public}d", childContainerId_);
1406 return;
1407 }
1408 delegate->ShowDialog(title, message, buttons, autoCancel, std::move(callback), callbacks);
1409 }
1410
ShowDialogForService(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1411 void SubwindowOhos::ShowDialogForService(const std::string& title, const std::string& message,
1412 const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& callback,
1413 const std::set<std::string>& callbacks)
1414 {
1415 bool ret = CreateEventRunner();
1416 if (!ret) {
1417 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create event runner failed");
1418 return;
1419 }
1420
1421 SubwindowManager::GetInstance()->SetCurrentDialogSubwindow(AceType::Claim(this));
1422 auto showDialogCallback = [title, message, &buttons, autoCancel, callbackParam = std::move(callback),
1423 &callbacks]() {
1424 int32_t posX = 0;
1425 int32_t posY = 0;
1426 int32_t width = 0;
1427 int32_t height = 0;
1428 float density = 1.0f;
1429 auto subwindowOhos =
1430 AceType::DynamicCast<SubwindowOhos>(SubwindowManager::GetInstance()->GetCurrentDialogWindow());
1431 CHECK_NULL_VOID(subwindowOhos);
1432 subwindowOhos->GetToastDialogWindowProperty(width, height, posX, posY, density);
1433 bool ret = subwindowOhos->InitToastDialogWindow(width, height, posX, posY);
1434 if (!ret) {
1435 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog window failed");
1436 return;
1437 }
1438 ret = subwindowOhos->InitToastDialogView(width, height, density);
1439 if (!ret) {
1440 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog view failed");
1441 return;
1442 }
1443 auto childContainerId = subwindowOhos->GetChildContainerId();
1444 ContainerScope scope(childContainerId);
1445 auto container = Platform::DialogContainer::GetContainer(childContainerId);
1446 CHECK_NULL_VOID(container);
1447 container->SetFontScaleAndWeightScale(childContainerId);
1448 Platform::DialogContainer::ShowToastDialogWindow(childContainerId, posX, posY, width, height);
1449 Platform::DialogContainer::ShowDialog(childContainerId, title, message, buttons, autoCancel,
1450 std::move(const_cast<std::function<void(int32_t, int32_t)>&&>(callbackParam)), callbacks);
1451 };
1452 isToastWindow_ = false;
1453 if (!handler_->PostTask(showDialogCallback)) {
1454 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create show dialog callback failed");
1455 return;
1456 }
1457 }
1458
ShowDialogForAbility(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1459 void SubwindowOhos::ShowDialogForAbility(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
1460 std::function<void(int32_t, int32_t)>&& callback, const std::set<std::string>& callbacks)
1461 {
1462 SubwindowManager::GetInstance()->SetCurrentSubwindow(AceType::Claim(this));
1463
1464 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1465 if (!aceContainer) {
1466 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get ace container failed");
1467 return;
1468 }
1469
1470 auto engine = EngineHelper::GetEngine(aceContainer->GetInstanceId());
1471 auto delegate = engine->GetFrontend();
1472 if (!delegate) {
1473 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get frontend failed");
1474 return;
1475 }
1476 delegate->ShowDialog(dialogAttr, buttons, std::move(callback), callbacks);
1477 }
1478
ShowDialogForService(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1479 void SubwindowOhos::ShowDialogForService(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
1480 std::function<void(int32_t, int32_t)>&& callback, const std::set<std::string>& callbacks)
1481 {
1482 bool ret = CreateEventRunner();
1483 if (!ret) {
1484 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create event runner failed");
1485 return;
1486 }
1487
1488 SubwindowManager::GetInstance()->SetCurrentDialogSubwindow(AceType::Claim(this));
1489 auto showDialogCallback = [dialogAttr, &buttons, callbackParam = std::move(callback), &callbacks]() {
1490 int32_t posX = 0;
1491 int32_t posY = 0;
1492 int32_t width = 0;
1493 int32_t height = 0;
1494 float density = 1.0f;
1495 auto subwindowOhos =
1496 AceType::DynamicCast<SubwindowOhos>(SubwindowManager::GetInstance()->GetCurrentDialogWindow());
1497 CHECK_NULL_VOID(subwindowOhos);
1498 subwindowOhos->GetToastDialogWindowProperty(width, height, posX, posY, density);
1499 bool ret = subwindowOhos->InitToastDialogWindow(width, height, posX, posY);
1500 if (!ret) {
1501 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog window failed");
1502 return;
1503 }
1504 ret = subwindowOhos->InitToastDialogView(width, height, density);
1505 if (!ret) {
1506 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog view failed");
1507 return;
1508 }
1509 auto childContainerId = subwindowOhos->GetChildContainerId();
1510 ContainerScope scope(childContainerId);
1511 Platform::DialogContainer::ShowToastDialogWindow(childContainerId, posX, posY, width, height);
1512 Platform::DialogContainer::ShowDialog(childContainerId, dialogAttr, buttons,
1513 std::move(const_cast<std::function<void(int32_t, int32_t)>&&>(callbackParam)), callbacks);
1514 };
1515 isToastWindow_ = false;
1516 if (!handler_->PostTask(showDialogCallback)) {
1517 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create show dialog callback failed");
1518 return;
1519 }
1520 }
1521
ShowDialog(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1522 void SubwindowOhos::ShowDialog(const std::string& title, const std::string& message,
1523 const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& callback,
1524 const std::set<std::string>& callbacks)
1525 {
1526 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show dialog, window parent id is %{public}d", parentContainerId_);
1527 if (parentContainerId_ >= MIN_PA_SERVICE_ID || parentContainerId_ < 0) {
1528 ShowDialogForService(title, message, buttons, autoCancel, std::move(callback), callbacks);
1529 } else {
1530 ShowDialogForAbility(title, message, buttons, autoCancel, std::move(callback), callbacks);
1531 }
1532 }
1533
ShowDialog(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)1534 void SubwindowOhos::ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector<ButtonInfo>& buttons,
1535 std::function<void(int32_t, int32_t)>&& callback, const std::set<std::string>& callbacks)
1536 {
1537 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show dialog with attr, window parent id is %{public}d", parentContainerId_);
1538 if (parentContainerId_ >= MIN_PA_SERVICE_ID || parentContainerId_ < 0) {
1539 ShowDialogForService(dialogAttr, buttons, std::move(callback), callbacks);
1540 } else {
1541 ShowDialogForAbility(dialogAttr, buttons, std::move(callback), callbacks);
1542 }
1543 }
1544
OpenCustomDialogForAbility(const PromptDialogAttr & dialogAttr,std::function<void (int32_t)> && callback)1545 void SubwindowOhos::OpenCustomDialogForAbility(
1546 const PromptDialogAttr& dialogAttr, std::function<void(int32_t)>&& callback)
1547 {
1548 SubwindowManager::GetInstance()->SetCurrentSubwindow(AceType::Claim(this));
1549
1550 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1551 if (!aceContainer) {
1552 TAG_LOGW(
1553 AceLogTag::ACE_SUB_WINDOW, "open dialog fail, the container %{public}d can not find", childContainerId_);
1554 return;
1555 }
1556
1557 auto engine = EngineHelper::GetEngine(aceContainer->GetInstanceId());
1558 auto delegate = engine->GetFrontend();
1559 if (!delegate) {
1560 return;
1561 }
1562 delegate->OpenCustomDialog(dialogAttr, std::move(callback));
1563 }
1564
OpenCustomDialogForService(const PromptDialogAttr & dialogAttr,std::function<void (int32_t)> && callback)1565 void SubwindowOhos::OpenCustomDialogForService(
1566 const PromptDialogAttr& dialogAttr, std::function<void(int32_t)>&& callback)
1567 {
1568 // temporary not support
1569 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "temporary not support for service by promptAction with CustomBuilder");
1570 }
1571
OpenCustomDialog(const PromptDialogAttr & dialogAttr,std::function<void (int32_t)> && callback)1572 void SubwindowOhos::OpenCustomDialog(const PromptDialogAttr& dialogAttr, std::function<void(int32_t)>&& callback)
1573 {
1574 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "open custom dialog, window parent id is %{public}d", parentContainerId_);
1575 if (parentContainerId_ >= MIN_PA_SERVICE_ID || parentContainerId_ < 0) {
1576 OpenCustomDialogForService(dialogAttr, std::move(callback));
1577 } else {
1578 OpenCustomDialogForAbility(dialogAttr, std::move(callback));
1579 }
1580 }
1581
CloseCustomDialog(const int32_t dialogId)1582 void SubwindowOhos::CloseCustomDialog(const int32_t dialogId)
1583 {
1584 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "close custom dialog with id, childContainerId_ is %{public}d",
1585 childContainerId_);
1586 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1587 CHECK_NULL_VOID(aceContainer);
1588 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1589 CHECK_NULL_VOID(context);
1590 auto overlay = context->GetOverlayManager();
1591 CHECK_NULL_VOID(overlay);
1592 ContainerScope scope(childContainerId_);
1593 return overlay->CloseCustomDialog(dialogId);
1594 }
1595
CloseCustomDialog(const WeakPtr<NG::UINode> & node,std::function<void (int32_t)> && callback)1596 void SubwindowOhos::CloseCustomDialog(const WeakPtr<NG::UINode>& node, std::function<void(int32_t)>&& callback)
1597 {
1598 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "close custom dialog with node, childContainerId_ is %{public}d",
1599 childContainerId_);
1600 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1601 CHECK_NULL_VOID(aceContainer);
1602 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1603 CHECK_NULL_VOID(context);
1604 auto overlay = context->GetOverlayManager();
1605 CHECK_NULL_VOID(overlay);
1606 ContainerScope scope(childContainerId_);
1607 return overlay->CloseCustomDialog(node, std::move(callback));
1608 }
1609
ShowActionMenuForAbility(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)1610 void SubwindowOhos::ShowActionMenuForAbility(
1611 const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
1612 {
1613 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show action menu for ability enter");
1614 SubwindowManager::GetInstance()->SetCurrentSubwindow(AceType::Claim(this));
1615
1616 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1617 if (!aceContainer) {
1618 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get container failed");
1619 return;
1620 }
1621
1622 auto engine = EngineHelper::GetEngine(aceContainer->GetInstanceId());
1623 auto delegate = engine->GetFrontend();
1624 if (!delegate) {
1625 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get frontend failed");
1626 return;
1627 }
1628 delegate->ShowActionMenu(title, button, std::move(callback));
1629 }
1630
ShowActionMenuForService(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)1631 void SubwindowOhos::ShowActionMenuForService(
1632 const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
1633 {
1634 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show action menu for service enter");
1635 bool ret = CreateEventRunner();
1636 if (!ret) {
1637 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create event runner failed");
1638 return;
1639 }
1640
1641 SubwindowManager::GetInstance()->SetCurrentDialogSubwindow(AceType::Claim(this));
1642 auto showDialogCallback = [title, &button, callbackParam = std::move(callback)]() {
1643 int32_t posX = 0;
1644 int32_t posY = 0;
1645 int32_t width = 0;
1646 int32_t height = 0;
1647 float density = 1.0f;
1648 auto subwindowOhos =
1649 AceType::DynamicCast<SubwindowOhos>(SubwindowManager::GetInstance()->GetCurrentDialogWindow());
1650 CHECK_NULL_VOID(subwindowOhos);
1651 subwindowOhos->GetToastDialogWindowProperty(width, height, posX, posY, density);
1652 bool ret = subwindowOhos->InitToastDialogWindow(width, height, posX, posY);
1653 if (!ret) {
1654 return;
1655 }
1656 ret = subwindowOhos->InitToastDialogView(width, height, density);
1657 if (!ret) {
1658 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "init toast dialog view failed");
1659 return;
1660 }
1661 auto childContainerId = subwindowOhos->GetChildContainerId();
1662 ContainerScope scope(childContainerId);
1663 auto container = Platform::DialogContainer::GetContainer(childContainerId);
1664 CHECK_NULL_VOID(container);
1665 container->SetFontScaleAndWeightScale(childContainerId);
1666 Platform::DialogContainer::ShowToastDialogWindow(childContainerId, posX, posY, width, height);
1667 Platform::DialogContainer::ShowActionMenu(childContainerId, title, button,
1668 std::move(const_cast<std::function<void(int32_t, int32_t)>&&>(callbackParam)));
1669 };
1670 isToastWindow_ = false;
1671 if (!handler_->PostTask(showDialogCallback)) {
1672 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "create show dialog callback failed");
1673 return;
1674 }
1675 }
1676
CloseDialog(int32_t instanceId)1677 void SubwindowOhos::CloseDialog(int32_t instanceId)
1678 {
1679 TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close dialog enter");
1680 Platform::DialogContainer::CloseWindow(instanceId);
1681 }
1682
UpdateAceView(int32_t width,int32_t height,float density,int32_t containerId)1683 void SubwindowOhos::UpdateAceView(int32_t width, int32_t height, float density, int32_t containerId)
1684 {
1685 auto container = Platform::DialogContainer::GetContainer(containerId);
1686 CHECK_NULL_VOID(container);
1687 auto aceView = AceType::DynamicCast<Platform::AceViewOhos>(container->GetAceView());
1688 CHECK_NULL_VOID(aceView);
1689 if (aceView->GetWidth() != width || aceView->GetHeight() != height) {
1690 ViewportConfig config(width, height, density);
1691 Platform::AceViewOhos::SetViewportMetrics(aceView, config);
1692 Platform::AceViewOhos::SurfaceChanged(aceView, width, height, 0);
1693 }
1694 }
1695
ShowActionMenu(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)1696 void SubwindowOhos::ShowActionMenu(
1697 const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
1698 {
1699 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "show custom dialog, window parent id is %{public}d", parentContainerId_);
1700 if (parentContainerId_ >= MIN_PA_SERVICE_ID || parentContainerId_ < 0) {
1701 ShowActionMenuForService(title, button, std::move(callback));
1702 } else {
1703 ShowActionMenuForAbility(title, button, std::move(callback));
1704 }
1705 }
1706
GetParentWindowRect() const1707 Rect SubwindowOhos::GetParentWindowRect() const
1708 {
1709 Rect rect;
1710 CHECK_NULL_RETURN(parentWindow_, rect);
1711 auto parentWindowRect = parentWindow_->GetRect();
1712 return Rect(parentWindowRect.posX_, parentWindowRect.posY_, parentWindowRect.width_, parentWindowRect.height_);
1713 }
1714
GetUIExtensionHostWindowRect() const1715 Rect SubwindowOhos::GetUIExtensionHostWindowRect() const
1716 {
1717 Rect rect;
1718 CHECK_NULL_RETURN(parentWindow_, rect);
1719 auto id = GetUIExtensionHostWindowId();
1720 auto hostWindowRect = parentWindow_->GetHostWindowRect(id);
1721 return Rect(hostWindowRect.posX_, hostWindowRect.posY_, hostWindowRect.width_, hostWindowRect.height_);
1722 }
1723
RequestFocus()1724 void SubwindowOhos::RequestFocus()
1725 {
1726 CHECK_NULL_VOID(window_);
1727 if (window_->IsFocused()) {
1728 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "subwindow id:%{public}u already focused", window_->GetWindowId());
1729 // already focused, no need to focus
1730 return;
1731 }
1732 OHOS::Rosen::WMError ret = window_->RequestFocus();
1733 if (ret != OHOS::Rosen::WMError::WM_OK) {
1734 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "subindow id:%{public}u request focus failed with WMError: %{public}d",
1735 window_->GetWindowId(), static_cast<int32_t>(ret));
1736 return;
1737 }
1738 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "subwindow id:%{public}u request focus successfully.", window_->GetWindowId());
1739 }
1740
IsFocused()1741 bool SubwindowOhos::IsFocused()
1742 {
1743 CHECK_NULL_RETURN(window_, false);
1744 return window_->IsFocused();
1745 }
1746
HideFilter(bool isInSubWindow)1747 void SubwindowOhos::HideFilter(bool isInSubWindow)
1748 {
1749 RefPtr<Container> aceContainer = nullptr;
1750 if (isInSubWindow) {
1751 aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1752 } else {
1753 aceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1754 }
1755
1756 CHECK_NULL_VOID(aceContainer);
1757 auto pipelineContext = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1758 CHECK_NULL_VOID(pipelineContext);
1759 auto overlayManager = pipelineContext->GetOverlayManager();
1760 CHECK_NULL_VOID(overlayManager);
1761
1762 auto containerId = isInSubWindow ? childContainerId_ : parentContainerId_;
1763 ContainerScope scope(containerId);
1764 overlayManager->RemoveFilterAnimation();
1765 }
1766
HidePixelMap(bool startDrag,double x,double y,bool showAnimation)1767 void SubwindowOhos::HidePixelMap(bool startDrag, double x, double y, bool showAnimation)
1768 {
1769 auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1770 CHECK_NULL_VOID(parentAceContainer);
1771 auto parentPipeline = DynamicCast<NG::PipelineContext>(parentAceContainer->GetPipelineContext());
1772 CHECK_NULL_VOID(parentPipeline);
1773 auto manager = parentPipeline->GetOverlayManager();
1774 CHECK_NULL_VOID(manager);
1775 ContainerScope scope(parentContainerId_);
1776 if (!startDrag) {
1777 manager->RemovePreviewBadgeNode();
1778 manager->RemoveGatherNodeWithAnimation();
1779 }
1780 if (showAnimation) {
1781 manager->RemovePixelMapAnimation(startDrag, x, y, true);
1782 } else {
1783 manager->RemovePixelMap();
1784 }
1785 }
1786
HideEventColumn()1787 void SubwindowOhos::HideEventColumn()
1788 {
1789 auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1790 CHECK_NULL_VOID(parentAceContainer);
1791 auto parentPipeline = DynamicCast<NG::PipelineContext>(parentAceContainer->GetPipelineContext());
1792 CHECK_NULL_VOID(parentPipeline);
1793 auto manager = parentPipeline->GetOverlayManager();
1794 CHECK_NULL_VOID(manager);
1795 ContainerScope scope(parentContainerId_);
1796 manager->RemoveEventColumn();
1797 }
1798
ResizeWindowForFoldStatus(int32_t parentContainerId)1799 void SubwindowOhos::ResizeWindowForFoldStatus(int32_t parentContainerId)
1800 {
1801 auto callback = []() {
1802 auto subwindowOhos =
1803 AceType::DynamicCast<SubwindowOhos>(SubwindowManager::GetInstance()->GetCurrentDialogWindow());
1804 CHECK_NULL_VOID(subwindowOhos);
1805 auto childContainerId = subwindowOhos->GetChildContainerId();
1806 ContainerScope scope(childContainerId);
1807 auto window = Platform::DialogContainer::GetUIWindow(childContainerId);
1808 CHECK_NULL_VOID(window);
1809 auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
1810 CHECK_NULL_VOID(defaultDisplay);
1811 auto ret = window->Resize(defaultDisplay->GetWidth(), defaultDisplay->GetHeight());
1812 if (ret != Rosen::WMError::WM_OK) {
1813 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Resize window by default display failed with errCode: %{public}d",
1814 static_cast<int32_t>(ret));
1815 return;
1816 }
1817 auto container = Platform::DialogContainer::GetContainer(childContainerId);
1818 CHECK_NULL_VOID(container);
1819 // get ace_view
1820 auto aceView = AceType::DynamicCast<Platform::AceViewOhos>(container->GetAceView());
1821 CHECK_NULL_VOID(aceView);
1822 Platform::AceViewOhos::SurfaceChanged(aceView, defaultDisplay->GetWidth(), defaultDisplay->GetHeight(), 0);
1823 };
1824 if (parentContainerId > 0) {
1825 ResizeWindowForFoldStatus();
1826 return;
1827 }
1828 if (!handler_->PostTask(callback)) {
1829 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Resize Toast Window failed");
1830 }
1831 }
1832
ResizeWindowForFoldStatus()1833 void SubwindowOhos::ResizeWindowForFoldStatus()
1834 {
1835 auto defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
1836 CHECK_NULL_VOID(defaultDisplay);
1837 CHECK_NULL_VOID(window_);
1838 auto ret = window_->Resize(defaultDisplay->GetWidth(), defaultDisplay->GetHeight());
1839 if (ret != Rosen::WMError::WM_OK) {
1840 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Resize window by default display failed with errCode: %{public}d",
1841 static_cast<int32_t>(ret));
1842 return;
1843 }
1844 TAG_LOGI(AceLogTag::ACE_SUB_WINDOW,
1845 "SubwindowOhos window rect is resized to x: %{public}d, y: %{public}d, width: %{public}u, height: %{public}u",
1846 window_->GetRect().posX_, window_->GetRect().posY_, window_->GetRect().width_, window_->GetRect().height_);
1847 }
1848
MarkDirtyDialogSafeArea()1849 void SubwindowOhos::MarkDirtyDialogSafeArea()
1850 {
1851 auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_);
1852 CHECK_NULL_VOID(aceContainer);
1853 auto context = DynamicCast<NG::PipelineContext>(aceContainer->GetPipelineContext());
1854 CHECK_NULL_VOID(context);
1855 auto rootNode = context->GetRootElement();
1856 CHECK_NULL_VOID(rootNode);
1857 auto lastChild = rootNode->GetLastChild();
1858 CHECK_NULL_VOID(lastChild);
1859 lastChild->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE);
1860 }
1861
CheckHostWindowStatus() const1862 bool SubwindowOhos::CheckHostWindowStatus() const
1863 {
1864 auto parentContainer = Platform::AceContainer::GetContainer(parentContainerId_);
1865 CHECK_NULL_RETURN(parentContainer, false);
1866 sptr<OHOS::Rosen::Window> parentWindow = parentContainer->GetUIWindow(parentContainerId_);
1867 CHECK_NULL_RETURN(parentWindow, false);
1868 if (parentWindow->GetType() == Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION) {
1869 auto parentPipeline = parentContainer->GetPipelineContext();
1870 CHECK_NULL_RETURN(parentPipeline, false);
1871 auto hostWindowId = parentPipeline->GetFocusWindowId();
1872 auto hostWindowRect = parentWindow->GetHostWindowRect(hostWindowId);
1873 auto isValid = GreatNotEqual(hostWindowRect.width_, 0) && GreatNotEqual(hostWindowRect.height_, 0);
1874 if (!isValid) {
1875 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW,
1876 "UIExtension Window failed to obtain host window information. Please check if permissions are enabled");
1877 return false;
1878 }
1879 }
1880 return true;
1881 }
1882
Close()1883 bool SubwindowOhos::Close()
1884 {
1885 CHECK_NULL_RETURN(window_, false);
1886 window_->UnregisterSwitchFreeMultiWindowListener(freeMultiWindowListener_);
1887 OHOS::Rosen::WMError ret = window_->Close();
1888 if (ret != OHOS::Rosen::WMError::WM_OK) {
1889 TAG_LOGE(AceLogTag::ACE_SUB_WINDOW, "SubwindowOhos failed to close the dialog subwindow.");
1890 return false;
1891 }
1892 sptr<OHOS::Rosen::Window> uiWindow = nullptr;
1893 Ace::Platform::DialogContainer::SetUIWindow(childContainerId_, uiWindow);
1894 return true;
1895 }
1896
IsFreeMultiWindow() const1897 bool SubwindowOhos::IsFreeMultiWindow() const
1898 {
1899 if (!parentWindow_) {
1900 TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Window is null, failed to get freeMultiWindow status");
1901 return false;
1902 }
1903
1904 return parentWindow_->GetFreeMultiWindowModeEnabledState();
1905 }
1906
OnFreeMultiWindowSwitch(bool enable)1907 void SubwindowOhos::OnFreeMultiWindowSwitch(bool enable)
1908 {
1909 for (auto&& [id, callback] : freeMultiWindowSwitchCallbackMap_) {
1910 if (callback) {
1911 callback(enable);
1912 }
1913 }
1914 }
1915
RegisterFreeMultiWindowSwitchCallback(std::function<void (bool)> && callback)1916 int32_t SubwindowOhos::RegisterFreeMultiWindowSwitchCallback(std::function<void(bool)>&& callback)
1917 {
1918 if (callback) {
1919 freeMultiWindowSwitchCallbackMap_.emplace(++callbackId_, std::move(callback));
1920 return callbackId_;
1921 }
1922 return 0;
1923 }
1924
UnRegisterFreeMultiWindowSwitchCallback(int32_t callbackId)1925 void SubwindowOhos::UnRegisterFreeMultiWindowSwitchCallback(int32_t callbackId)
1926 {
1927 freeMultiWindowSwitchCallbackMap_.erase(callbackId);
1928 }
1929 } // namespace OHOS::Ace
1930