/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "base/subwindow/subwindow_manager.h" #include #include #include "unistd.h" #include "base/geometry/rect.h" #include "base/log/log.h" #include "base/memory/ace_type.h" #include "core/common/ace_page.h" #include "core/common/container.h" namespace OHOS::Ace { std::mutex SubwindowManager::instanceMutex_; std::shared_ptr SubwindowManager::instance_; std::shared_ptr SubwindowManager::GetInstance() { std::lock_guard lock(instanceMutex_); if (!instance_) { instance_ = std::make_shared(); } return instance_; } void SubwindowManager::AddContainerId(uint32_t windowId, int32_t containerId) { std::lock_guard lock(mutex_); auto result = containerMap_.try_emplace(windowId, containerId); if (!result.second) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Already have container of this windowId, windowId: %{public}u", windowId); } } void SubwindowManager::RemoveContainerId(uint32_t windowId) { std::lock_guard lock(mutex_); containerMap_.erase(windowId); } int32_t SubwindowManager::GetContainerId(uint32_t windowId) { std::lock_guard lock(mutex_); auto result = containerMap_.find(windowId); if (result != containerMap_.end()) { return result->second; } else { return -1; } } void SubwindowManager::AddParentContainerId(int32_t containerId, int32_t parentContainerId) { TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Container id is %{public}d, parent id is %{public}d.", containerId, parentContainerId); std::lock_guard lock(parentMutex_); parentContainerMap_.try_emplace(containerId, parentContainerId); } void SubwindowManager::RemoveParentContainerId(int32_t containerId) { std::lock_guard lock(parentMutex_); parentContainerMap_.erase(containerId); } int32_t SubwindowManager::GetParentContainerId(int32_t containerId) { std::lock_guard lock(parentMutex_); auto result = parentContainerMap_.find(containerId); if (result != parentContainerMap_.end()) { return result->second; } else { return 0; } } void SubwindowManager::AddSubwindow(int32_t instanceId, RefPtr subwindow) { if (!subwindow) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "add subwindow failed."); return; } TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "Add subwindow into map, instanceId is %{public}d, subwindow id is %{public}d.", instanceId, subwindow->GetSubwindowId()); std::lock_guard lock(subwindowMutex_); auto result = subwindowMap_.try_emplace(instanceId, subwindow); if (!result.second) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add failed of this instance %{public}d", instanceId); return; } } void SubwindowManager::DeleteHotAreas(int32_t instanceId, int32_t overlayid) { RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->DeleteHotAreas(overlayid); } } void SubwindowManager::RemoveSubwindow(int32_t instanceId) { std::lock_guard lock(subwindowMutex_); subwindowMap_.erase(instanceId); } const RefPtr SubwindowManager::GetSubwindow(int32_t instanceId) { std::lock_guard lock(subwindowMutex_); auto result = subwindowMap_.find(instanceId); if (result != subwindowMap_.end()) { return result->second; } else { return nullptr; } } int32_t SubwindowManager::GetDialogSubwindowInstanceId(int32_t SubwindowId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get dialog subwindow instanceid enter"); std::lock_guard lock(subwindowMutex_); for (auto it = subwindowMap_.begin(); it != subwindowMap_.end(); it++) { if (it->second->GetSubwindowId() == SubwindowId) { return it->first; } } return 0; } void SubwindowManager::SetCurrentSubwindowName(const std::string& currentSubwindowName) { std::lock_guard lock(currentSubwindowMutex_); currentSubwindowName_ = currentSubwindowName; } std::string SubwindowManager::GetCurrentSubWindowName() { std::lock_guard lock(currentSubwindowMutex_); return currentSubwindowName_; } void SubwindowManager::SetCurrentSubwindow(const RefPtr& subwindow) { std::lock_guard lock(currentSubwindowMutex_); currentSubwindow_ = subwindow; } const RefPtr& SubwindowManager::GetCurrentWindow() { std::lock_guard lock(currentSubwindowMutex_); return currentSubwindow_; } Rect SubwindowManager::GetParentWindowRect() { std::lock_guard lock(currentSubwindowMutex_); Rect rect; CHECK_NULL_RETURN(currentSubwindow_, rect); return currentSubwindow_->GetParentWindowRect(); } RefPtr SubwindowManager::ShowPreviewNG() { auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } if (!subwindow->ShowPreviewNG()) { return nullptr; } return subwindow; } void SubwindowManager::ShowMenuNG( const RefPtr& menuNode, int32_t targetId, const NG::OffsetF& offset, bool isAboveApps) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show menung enter"); auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } subwindow->ShowMenuNG(menuNode, targetId, offset); } void SubwindowManager::HidePreviewNG() { auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->HidePreviewNG(); } } void SubwindowManager::HideMenuNG(const RefPtr& menu, int32_t targetId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide menu ng enter"); auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->HideMenuNG(menu, targetId); } } void SubwindowManager::HideMenuNG(bool showPreviewAnimation, bool startDrag) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide menung enter"); auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->HideMenuNG(showPreviewAnimation, startDrag); } } void SubwindowManager::UpdateHideMenuOffsetNG(const NG::OffsetF& offset) { auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->UpdateHideMenuOffsetNG(offset); } } void SubwindowManager::ClearMenuNG(int32_t instanceId, bool inWindow, bool showAnimation) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear menung enter"); RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->ClearMenuNG(inWindow, showAnimation); } } void SubwindowManager::ClearPopupInSubwindow(int32_t instanceId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear popup in subwindow enter"); RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->ClearPopupNG(); } } void SubwindowManager::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup ng enter"); auto containerId = Container::CurrentId(); auto manager = SubwindowManager::GetInstance(); CHECK_NULL_VOID(manager); auto subwindow = manager->GetSubwindow(containerId); if (!subwindow) { auto taskExecutor = Container::CurrentTaskExecutor(); CHECK_NULL_VOID(taskExecutor); taskExecutor->PostTask( [containerId, targetId, popupInfo, manager] { auto subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); manager->AddSubwindow(containerId, subwindow); subwindow->ShowPopupNG(targetId, popupInfo); }, TaskExecutor::TaskType::PLATFORM); } else { subwindow->ShowPopupNG(targetId, popupInfo); } } void SubwindowManager::HidePopupNG(int32_t targetId, int32_t instanceId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide popup ng enter"); RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->HidePopupNG(targetId); } } void SubwindowManager::ShowPopup(const RefPtr& newComponent, bool disableTouchEvent) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show popup enter"); auto containerId = Container::CurrentId(); auto taskExecutor = Container::CurrentTaskExecutor(); CHECK_NULL_VOID(taskExecutor); taskExecutor->PostTask( [containerId, newComponentWeak = WeakPtr(newComponent), disableTouchEvent] { auto manager = SubwindowManager::GetInstance(); CHECK_NULL_VOID(manager); auto subwindow = manager->GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); manager->AddSubwindow(containerId, subwindow); } auto newComponent = newComponentWeak.Upgrade(); CHECK_NULL_VOID(newComponent); subwindow->ShowPopup(newComponent, disableTouchEvent); }, TaskExecutor::TaskType::PLATFORM); } bool SubwindowManager::CancelPopup(const std::string& id) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "cancel popup enter"); auto subwindow = GetCurrentWindow(); if (subwindow) { return subwindow->CancelPopup(id); } return false; } void SubwindowManager::ShowMenu(const RefPtr& newComponent) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show menu enter"); auto containerId = Container::CurrentId(); auto taskExecutor = Container::CurrentTaskExecutor(); CHECK_NULL_VOID(taskExecutor); taskExecutor->PostTask( [containerId, weakMenu = AceType::WeakClaim(AceType::RawPtr(newComponent))] { auto manager = SubwindowManager::GetInstance(); CHECK_NULL_VOID(manager); auto menu = weakMenu.Upgrade(); CHECK_NULL_VOID(menu); auto subwindow = manager->GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); manager->AddSubwindow(containerId, subwindow); } subwindow->ShowMenu(menu); }, TaskExecutor::TaskType::PLATFORM); } void SubwindowManager::CloseMenu() { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close menu enter"); auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->CloseMenu(); } } void SubwindowManager::ClearMenu() { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear menu enter"); auto subwindow = GetCurrentWindow(); if (subwindow) { subwindow->ClearMenu(); } } void SubwindowManager::SetHotAreas(const std::vector& rects, int32_t overlayId, int32_t instanceId) { RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->SetHotAreas(rects, overlayId); } } void SubwindowManager::SetDialogHotAreas(const std::vector& rects, int32_t overlayId, int32_t instanceId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set dialog hot areas enter"); RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->SetDialogHotAreas(rects, overlayId); } } RefPtr SubwindowManager::ShowDialogNG( const DialogProperties& dialogProps, std::function&& buildFunc) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog ng enter"); auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); CHECK_NULL_RETURN(subwindow, nullptr); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } return subwindow->ShowDialogNG(dialogProps, std::move(buildFunc)); } void SubwindowManager::CloseDialogNG(const RefPtr& dialogNode) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "close dialog ng enter"); auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get subwindow failed."); return; } return subwindow->CloseDialogNG(dialogNode); } void SubwindowManager::HideDialogSubWindow(int32_t instanceId) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "hide dialog subwindow enter"); auto subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); CHECK_NULL_VOID(subwindow); auto overlay = subwindow->GetOverlayManager(); if (overlay->GetDialogMap().size() == 0) { subwindow->HideSubWindowNG(); } } void SubwindowManager::AddDialogSubwindow(int32_t instanceId, const RefPtr& subwindow) { if (!subwindow) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add dialog subwindow failed, the subwindow is null."); return; } std::lock_guard lock(dialogSubwindowMutex_); auto result = dialogSubwindowMap_.try_emplace(instanceId, subwindow); if (!result.second) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Add dialog failed of this instance %{public}d", instanceId); return; } } const RefPtr SubwindowManager::GetDialogSubwindow(int32_t instanceId) { std::lock_guard lock(dialogSubwindowMutex_); auto result = dialogSubwindowMap_.find(instanceId); if (result != dialogSubwindowMap_.end()) { return result->second; } else { return nullptr; } } void SubwindowManager::SetCurrentDialogSubwindow(const RefPtr& subwindow) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "set current dialog subwindow enter"); std::lock_guard lock(currentDialogSubwindowMutex_); currentDialogSubwindow_ = subwindow; } const RefPtr& SubwindowManager::GetCurrentDialogWindow() { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "get current dialog window enter"); std::lock_guard lock(currentDialogSubwindowMutex_); return currentDialogSubwindow_; } RefPtr SubwindowManager::GetOrCreateSubWindow() { auto containerId = Container::CurrentId(); auto subwindow = GetDialogSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); AddDialogSubwindow(containerId, subwindow); } return subwindow; } void SubwindowManager::ShowToast( const std::string& message, int32_t duration, const std::string& bottom, const NG::ToastShowMode& showMode) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show toast enter"); auto containerId = Container::CurrentId(); // for pa service if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) { auto subwindow = GetOrCreateSubWindow(); CHECK_NULL_VOID(subwindow); TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "before show toast"); subwindow->ShowToast(message, duration, bottom, showMode); } else { // for ability auto taskExecutor = Container::CurrentTaskExecutor(); CHECK_NULL_VOID(taskExecutor); taskExecutor->PostTask( [containerId, message, duration, bottom, showMode] { auto manager = SubwindowManager::GetInstance(); CHECK_NULL_VOID(manager); auto subwindow = manager->GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->SetAboveApps(showMode == NG::ToastShowMode::TOP_MOST); subwindow->InitContainer(); manager->AddSubwindow(containerId, subwindow); } TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "before show toast : %{public}d", containerId); subwindow->ShowToast(message, duration, bottom, showMode); }, TaskExecutor::TaskType::PLATFORM); } } void SubwindowManager::ClearToastInSubwindow() { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "clear toast in subwindow enter"); auto containerId = Container::CurrentId(); // Get active container when current instanceid is less than 0 if (containerId < 0) { auto container = Container::GetActive(); if (container) { containerId = container->GetInstanceId(); } } RefPtr subwindow; // The main window does not need to clear Toast if (containerId != -1 && containerId < MIN_SUBCONTAINER_ID) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(containerId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(containerId) : containerId); } if (subwindow) { subwindow->ClearToast(); } } void SubwindowManager::ShowDialog(const std::string& title, const std::string& message, const std::vector& buttons, bool autoCancel, std::function&& napiCallback, const std::set& dialogCallbacks) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog enter"); auto containerId = Container::CurrentId(); // Get active container when current instanceid is less than 0 if (containerId < 0) { auto container = Container::GetActive(); if (container) { containerId = container->GetInstanceId(); } } // for pa service if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) { auto subwindow = GetOrCreateSubWindow(); CHECK_NULL_VOID(subwindow); subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks); // for ability } else { auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } subwindow->ShowDialog(title, message, buttons, autoCancel, std::move(napiCallback), dialogCallbacks); } } void SubwindowManager::ShowDialog(const PromptDialogAttr& dialogAttr, const std::vector& buttons, std::function&& napiCallback, const std::set& dialogCallbacks) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show dialog enter"); auto containerId = Container::CurrentId(); // Get active container when current instanceid is less than 0 if (containerId < 0) { auto container = Container::GetActive(); if (container) { containerId = container->GetInstanceId(); } } // for pa service if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) { auto subWindow = GetOrCreateSubWindow(); CHECK_NULL_VOID(subWindow); subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks); // for ability } else { auto subWindow = GetSubwindow(containerId); if (!subWindow) { subWindow = Subwindow::CreateSubwindow(containerId); subWindow->InitContainer(); AddSubwindow(containerId, subWindow); } subWindow->ShowDialog(dialogAttr, buttons, std::move(napiCallback), dialogCallbacks); } } void SubwindowManager::ShowActionMenu( const std::string& title, const std::vector& button, std::function&& callback) { TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "show action menu enter"); auto containerId = Container::CurrentId(); // Get active container when current instanceid is less than 0 if (containerId < 0) { auto container = Container::GetActive(); if (container) { containerId = container->GetInstanceId(); } } // for pa service if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) { auto subwindow = GetOrCreateSubWindow(); CHECK_NULL_VOID(subwindow); subwindow->ShowActionMenu(title, button, std::move(callback)); // for ability } else { auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } subwindow->ShowActionMenu(title, button, std::move(callback)); } } void SubwindowManager::CloseDialog(int32_t instanceId) { auto subwindow = GetDialogSubwindow(instanceId); if (!subwindow) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "get dialog subwindow failed."); return; } for (auto& containerMap : parentContainerMap_) { if (containerMap.second == instanceId) { subwindow->CloseDialog(containerMap.first); } } } void SubwindowManager::OpenCustomDialog(const PromptDialogAttr &dialogAttr, std::function &&callback) { PromptDialogAttr tmpPromptAttr = dialogAttr; tmpPromptAttr.showInSubWindow = false; auto containerId = Container::CurrentId(); // for pa service if (containerId >= MIN_PA_SERVICE_ID || containerId < 0) { auto subWindow = GetOrCreateSubWindow(); CHECK_NULL_VOID(subWindow); subWindow->OpenCustomDialog(tmpPromptAttr, std::move(callback)); // for ability } else { auto subWindow = GetSubwindow(containerId); if (!subWindow) { subWindow = Subwindow::CreateSubwindow(containerId); subWindow->InitContainer(); AddSubwindow(containerId, subWindow); } subWindow->OpenCustomDialog(tmpPromptAttr, std::move(callback)); } return; } void SubwindowManager::CloseCustomDialog(const int32_t dialogId) { auto containerId = Container::CurrentId(); TAG_LOGD(AceLogTag::ACE_SUB_WINDOW, "CloseCustomDialog dialogId = %{public}d, containerId = %{public}d.", dialogId, containerId); auto subwindow = GetDialogSubwindow(containerId); if (!subwindow) { return; } subwindow->CloseCustomDialog(dialogId); return; } void SubwindowManager::HideSubWindowNG() { RefPtr subwindow; auto container = Container::Current(); CHECK_NULL_VOID(container); if (container->IsDialogContainer()) { subwindow = GetCurrentDialogWindow(); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->HideSubWindowNG(); } } void SubwindowManager::RequestFocusSubwindow(int32_t instanceId) { RefPtr subwindow; if (instanceId != -1) { // get the subwindow which overlay node in, not current subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); } else { subwindow = GetCurrentWindow(); } if (subwindow) { subwindow->RequestFocus(); } } bool SubwindowManager::GetShown() { auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { subwindow = Subwindow::CreateSubwindow(containerId); subwindow->InitContainer(); AddSubwindow(containerId, subwindow); } return subwindow->GetShown(); } void SubwindowManager::ResizeWindowForFoldStatus() { auto containerId = Container::CurrentId(); auto subwindow = GetSubwindow(containerId); if (!subwindow) { TAG_LOGW(AceLogTag::ACE_SUB_WINDOW, "Get Subwindow error, containerId = %{public}d.", containerId); return; } subwindow->ResizeWindowForFoldStatus(); } } // namespace OHOS::Ace