1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci#include "window_impl.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <ability_manager_client.h> 19e0dac50fSopenharmony_ci#include <common/rs_common_def.h> 20e0dac50fSopenharmony_ci#include <filesystem> 21e0dac50fSopenharmony_ci#include <fstream> 22e0dac50fSopenharmony_ci#include <hisysevent.h> 23e0dac50fSopenharmony_ci#include <parameters.h> 24e0dac50fSopenharmony_ci#include <ipc_skeleton.h> 25e0dac50fSopenharmony_ci#include <transaction/rs_interfaces.h> 26e0dac50fSopenharmony_ci#include <transaction/rs_transaction.h> 27e0dac50fSopenharmony_ci#include <ui/rs_node.h> 28e0dac50fSopenharmony_ci 29e0dac50fSopenharmony_ci#include "permission.h" 30e0dac50fSopenharmony_ci#include "color_parser.h" 31e0dac50fSopenharmony_ci#include "display_manager.h" 32e0dac50fSopenharmony_ci#include "display_info.h" 33e0dac50fSopenharmony_ci#include "ressched_report.h" 34e0dac50fSopenharmony_ci#include "singleton_container.h" 35e0dac50fSopenharmony_ci#include "surface_capture_future.h" 36e0dac50fSopenharmony_ci#include "sys_cap_util.h" 37e0dac50fSopenharmony_ci#include "window_adapter.h" 38e0dac50fSopenharmony_ci#include "window_agent.h" 39e0dac50fSopenharmony_ci#include "window_helper.h" 40e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 41e0dac50fSopenharmony_ci#include "wm_common.h" 42e0dac50fSopenharmony_ci#include "wm_common_inner.h" 43e0dac50fSopenharmony_ci#include "wm_math.h" 44e0dac50fSopenharmony_ci#include "perform_reporter.h" 45e0dac50fSopenharmony_ci#include "hitrace_meter.h" 46e0dac50fSopenharmony_ci#include <hisysevent.h> 47e0dac50fSopenharmony_ci 48e0dac50fSopenharmony_cinamespace OHOS { 49e0dac50fSopenharmony_cinamespace Rosen { 50e0dac50fSopenharmony_cinamespace { 51e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowImpl"}; 52e0dac50fSopenharmony_ciconst std::string PARAM_DUMP_HELP = "-h"; 53e0dac50fSopenharmony_ci 54e0dac50fSopenharmony_ciAce::ContentInfoType GetAceContentInfoType(BackupAndRestoreType type) 55e0dac50fSopenharmony_ci{ 56e0dac50fSopenharmony_ci auto contentInfoType = Ace::ContentInfoType::NONE; 57e0dac50fSopenharmony_ci switch (type) { 58e0dac50fSopenharmony_ci case BackupAndRestoreType::CONTINUATION: 59e0dac50fSopenharmony_ci contentInfoType = Ace::ContentInfoType::CONTINUATION; 60e0dac50fSopenharmony_ci break; 61e0dac50fSopenharmony_ci case BackupAndRestoreType::APP_RECOVERY: 62e0dac50fSopenharmony_ci contentInfoType = Ace::ContentInfoType::APP_RECOVERY; 63e0dac50fSopenharmony_ci break; 64e0dac50fSopenharmony_ci case BackupAndRestoreType::RESOURCESCHEDULE_RECOVERY: 65e0dac50fSopenharmony_ci contentInfoType = Ace::ContentInfoType::RESOURCESCHEDULE_RECOVERY; 66e0dac50fSopenharmony_ci break; 67e0dac50fSopenharmony_ci case BackupAndRestoreType::NONE: 68e0dac50fSopenharmony_ci [[fallthrough]]; 69e0dac50fSopenharmony_ci default: 70e0dac50fSopenharmony_ci break; 71e0dac50fSopenharmony_ci } 72e0dac50fSopenharmony_ci return contentInfoType; 73e0dac50fSopenharmony_ci} 74e0dac50fSopenharmony_ci} 75e0dac50fSopenharmony_ci 76e0dac50fSopenharmony_ciWM_IMPLEMENT_SINGLE_INSTANCE(ResSchedReport); 77e0dac50fSopenharmony_ci 78e0dac50fSopenharmony_ciconst WindowImpl::ColorSpaceConvertMap WindowImpl::colorSpaceConvertMap[] = { 79e0dac50fSopenharmony_ci { ColorSpace::COLOR_SPACE_DEFAULT, GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB }, 80e0dac50fSopenharmony_ci { ColorSpace::COLOR_SPACE_WIDE_GAMUT, GraphicColorGamut::GRAPHIC_COLOR_GAMUT_DCI_P3 }, 81e0dac50fSopenharmony_ci}; 82e0dac50fSopenharmony_ci 83e0dac50fSopenharmony_cistd::map<std::string, std::pair<uint32_t, sptr<Window>>> WindowImpl::windowMap_; 84e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<WindowImpl>>> WindowImpl::subWindowMap_; 85e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<WindowImpl>>> WindowImpl::appFloatingWindowMap_; 86e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<WindowImpl>>> WindowImpl::appDialogWindowMap_; 87e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IScreenshotListener>>> WindowImpl::screenshotListeners_; 88e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<ITouchOutsideListener>>> WindowImpl::touchOutsideListeners_; 89e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IDialogTargetTouchListener>>> WindowImpl::dialogTargetTouchListeners_; 90e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IWindowLifeCycle>>> WindowImpl::lifecycleListeners_; 91e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IWindowChangeListener>>> WindowImpl::windowChangeListeners_; 92e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IAvoidAreaChangedListener>>> WindowImpl::avoidAreaChangeListeners_; 93e0dac50fSopenharmony_cistd::map<uint32_t, std::vector<sptr<IOccupiedAreaChangeListener>>> WindowImpl::occupiedAreaChangeListeners_; 94e0dac50fSopenharmony_cistd::map<uint32_t, sptr<IDialogDeathRecipientListener>> WindowImpl::dialogDeathRecipientListener_; 95e0dac50fSopenharmony_cistd::recursive_mutex WindowImpl::globalMutex_; 96e0dac50fSopenharmony_ciint g_constructorCnt = 0; 97e0dac50fSopenharmony_ciint g_deConstructorCnt = 0; 98e0dac50fSopenharmony_ciWindowImpl::WindowImpl(const sptr<WindowOption>& option) 99e0dac50fSopenharmony_ci{ 100e0dac50fSopenharmony_ci property_ = sptr<WindowProperty>::MakeSptr(); 101e0dac50fSopenharmony_ci InitWindowProperty(option); 102e0dac50fSopenharmony_ci 103e0dac50fSopenharmony_ci windowTag_ = option->GetWindowTag(); 104e0dac50fSopenharmony_ci isMainHandlerAvailable_ = option->GetMainHandlerAvailable(); 105e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(); 106e0dac50fSopenharmony_ci UpdateDecorEnable(); 107e0dac50fSopenharmony_ci auto& sysBarPropMap = option->GetSystemBarProperty(); 108e0dac50fSopenharmony_ci for (auto it : sysBarPropMap) { 109e0dac50fSopenharmony_ci property_->SetSystemBarProperty(it.first, it.second); 110e0dac50fSopenharmony_ci } 111e0dac50fSopenharmony_ci name_ = option->GetWindowName(); 112e0dac50fSopenharmony_ci 113e0dac50fSopenharmony_ci surfaceNode_ = CreateSurfaceNode(property_->GetWindowName(), option->GetWindowType()); 114e0dac50fSopenharmony_ci if (surfaceNode_ != nullptr) { 115e0dac50fSopenharmony_ci vsyncStation_ = std::make_shared<VsyncStation>(surfaceNode_->GetId()); 116e0dac50fSopenharmony_ci } 117e0dac50fSopenharmony_ci 118e0dac50fSopenharmony_ci moveDragProperty_ = new (std::nothrow) MoveDragProperty(); 119e0dac50fSopenharmony_ci if (moveDragProperty_ == nullptr) { 120e0dac50fSopenharmony_ci WLOGFE("MoveDragProperty is null"); 121e0dac50fSopenharmony_ci } 122e0dac50fSopenharmony_ci WLOGFD("g_constructorCnt: %{public}d name: %{public}s", 123e0dac50fSopenharmony_ci ++g_constructorCnt, property_->GetWindowName().c_str()); 124e0dac50fSopenharmony_ci} 125e0dac50fSopenharmony_ci 126e0dac50fSopenharmony_civoid WindowImpl::InitWindowProperty(const sptr<WindowOption>& option) 127e0dac50fSopenharmony_ci{ 128e0dac50fSopenharmony_ci if (option == nullptr) { 129e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "Init window property failed, option is nullptr."); 130e0dac50fSopenharmony_ci return; 131e0dac50fSopenharmony_ci } 132e0dac50fSopenharmony_ci property_->SetWindowName(option->GetWindowName()); 133e0dac50fSopenharmony_ci property_->SetRequestRect(option->GetWindowRect()); 134e0dac50fSopenharmony_ci property_->SetWindowType(option->GetWindowType()); 135e0dac50fSopenharmony_ci if (WindowHelper::IsAppFloatingWindow(option->GetWindowType())) { 136e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 137e0dac50fSopenharmony_ci } else { 138e0dac50fSopenharmony_ci property_->SetWindowMode(option->GetWindowMode()); 139e0dac50fSopenharmony_ci } 140e0dac50fSopenharmony_ci property_->SetFullScreen(option->GetWindowMode() == WindowMode::WINDOW_MODE_FULLSCREEN); 141e0dac50fSopenharmony_ci property_->SetFocusable(option->GetFocusable()); 142e0dac50fSopenharmony_ci property_->SetTouchable(option->GetTouchable()); 143e0dac50fSopenharmony_ci property_->SetDisplayId(option->GetDisplayId()); 144e0dac50fSopenharmony_ci property_->SetCallingWindow(option->GetCallingWindow()); 145e0dac50fSopenharmony_ci property_->SetWindowFlags(option->GetWindowFlags()); 146e0dac50fSopenharmony_ci property_->SetHitOffset(option->GetHitOffset()); 147e0dac50fSopenharmony_ci property_->SetRequestedOrientation(option->GetRequestedOrientation()); 148e0dac50fSopenharmony_ci property_->SetTurnScreenOn(option->IsTurnScreenOn()); 149e0dac50fSopenharmony_ci property_->SetKeepScreenOn(option->IsKeepScreenOn()); 150e0dac50fSopenharmony_ci property_->SetBrightness(option->GetBrightness()); 151e0dac50fSopenharmony_ci} 152e0dac50fSopenharmony_ci 153e0dac50fSopenharmony_ciRSSurfaceNode::SharedPtr WindowImpl::CreateSurfaceNode(std::string name, WindowType type) 154e0dac50fSopenharmony_ci{ 155e0dac50fSopenharmony_ci struct RSSurfaceNodeConfig rsSurfaceNodeConfig; 156e0dac50fSopenharmony_ci rsSurfaceNodeConfig.SurfaceNodeName = name; 157e0dac50fSopenharmony_ci RSSurfaceNodeType rsSurfaceNodeType = RSSurfaceNodeType::DEFAULT; 158e0dac50fSopenharmony_ci switch (type) { 159e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_BOOT_ANIMATION: 160e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_POINTER: 161e0dac50fSopenharmony_ci rsSurfaceNodeType = RSSurfaceNodeType::SELF_DRAWING_WINDOW_NODE; 162e0dac50fSopenharmony_ci break; 163e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_APP_MAIN_WINDOW: 164e0dac50fSopenharmony_ci rsSurfaceNodeType = RSSurfaceNodeType::APP_WINDOW_NODE; 165e0dac50fSopenharmony_ci break; 166e0dac50fSopenharmony_ci default: 167e0dac50fSopenharmony_ci rsSurfaceNodeType = RSSurfaceNodeType::DEFAULT; 168e0dac50fSopenharmony_ci break; 169e0dac50fSopenharmony_ci } 170e0dac50fSopenharmony_ci 171e0dac50fSopenharmony_ci if (windowSystemConfig_.IsPhoneWindow() && WindowHelper::IsWindowFollowParent(type)) { 172e0dac50fSopenharmony_ci rsSurfaceNodeType = RSSurfaceNodeType::ABILITY_COMPONENT_NODE; 173e0dac50fSopenharmony_ci } 174e0dac50fSopenharmony_ci return RSSurfaceNode::Create(rsSurfaceNodeConfig, rsSurfaceNodeType); 175e0dac50fSopenharmony_ci} 176e0dac50fSopenharmony_ci 177e0dac50fSopenharmony_ciWindowImpl::~WindowImpl() 178e0dac50fSopenharmony_ci{ 179e0dac50fSopenharmony_ci WLOGI("windowName: %{public}s, windowId: %{public}d, g_deConstructorCnt: %{public}d, surfaceNode:%{public}d", 180e0dac50fSopenharmony_ci GetWindowName().c_str(), GetWindowId(), ++g_deConstructorCnt, static_cast<uint32_t>(surfaceNode_.use_count())); 181e0dac50fSopenharmony_ci Destroy(true, false); 182e0dac50fSopenharmony_ci} 183e0dac50fSopenharmony_ci 184e0dac50fSopenharmony_cisptr<Window> WindowImpl::Find(const std::string& name) 185e0dac50fSopenharmony_ci{ 186e0dac50fSopenharmony_ci auto iter = windowMap_.find(name); 187e0dac50fSopenharmony_ci if (iter == windowMap_.end()) { 188e0dac50fSopenharmony_ci return nullptr; 189e0dac50fSopenharmony_ci } 190e0dac50fSopenharmony_ci return iter->second.second; 191e0dac50fSopenharmony_ci} 192e0dac50fSopenharmony_ci 193e0dac50fSopenharmony_ciconst std::shared_ptr<AbilityRuntime::Context> WindowImpl::GetContext() const 194e0dac50fSopenharmony_ci{ 195e0dac50fSopenharmony_ci return context_; 196e0dac50fSopenharmony_ci} 197e0dac50fSopenharmony_ci 198e0dac50fSopenharmony_cisptr<Window> WindowImpl::FindWindowById(uint32_t WinId) 199e0dac50fSopenharmony_ci{ 200e0dac50fSopenharmony_ci if (windowMap_.empty()) { 201e0dac50fSopenharmony_ci WLOGFE("Please create mainWindow First!"); 202e0dac50fSopenharmony_ci return nullptr; 203e0dac50fSopenharmony_ci } 204e0dac50fSopenharmony_ci for (auto iter = windowMap_.begin(); iter != windowMap_.end(); iter++) { 205e0dac50fSopenharmony_ci if (WinId == iter->second.first) { 206e0dac50fSopenharmony_ci WLOGI("FindWindow id: %{public}u", WinId); 207e0dac50fSopenharmony_ci return iter->second.second; 208e0dac50fSopenharmony_ci } 209e0dac50fSopenharmony_ci } 210e0dac50fSopenharmony_ci WLOGFE("Cannot find Window!"); 211e0dac50fSopenharmony_ci return nullptr; 212e0dac50fSopenharmony_ci} 213e0dac50fSopenharmony_ci 214e0dac50fSopenharmony_cisptr<Window> WindowImpl::GetTopWindowWithId(uint32_t mainWinId) 215e0dac50fSopenharmony_ci{ 216e0dac50fSopenharmony_ci uint32_t topWinId = INVALID_WINDOW_ID; 217e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetTopWindowId(mainWinId, topWinId); 218e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 219e0dac50fSopenharmony_ci WLOGFE("GetTopWindowId failed with errCode:%{public}d", static_cast<int32_t>(ret)); 220e0dac50fSopenharmony_ci return nullptr; 221e0dac50fSopenharmony_ci } 222e0dac50fSopenharmony_ci return FindWindowById(topWinId); 223e0dac50fSopenharmony_ci} 224e0dac50fSopenharmony_ci 225e0dac50fSopenharmony_cisptr<Window> WindowImpl::GetWindowWithId(uint32_t WinId) 226e0dac50fSopenharmony_ci{ 227e0dac50fSopenharmony_ci return FindWindowById(WinId); 228e0dac50fSopenharmony_ci} 229e0dac50fSopenharmony_ci 230e0dac50fSopenharmony_cisptr<Window> WindowImpl::GetTopWindowWithContext(const std::shared_ptr<AbilityRuntime::Context>& context) 231e0dac50fSopenharmony_ci{ 232e0dac50fSopenharmony_ci if (windowMap_.empty()) { 233e0dac50fSopenharmony_ci WLOGFE("Please create mainWindow First!"); 234e0dac50fSopenharmony_ci return nullptr; 235e0dac50fSopenharmony_ci } 236e0dac50fSopenharmony_ci uint32_t mainWinId = INVALID_WINDOW_ID; 237e0dac50fSopenharmony_ci for (auto iter = windowMap_.begin(); iter != windowMap_.end(); iter++) { 238e0dac50fSopenharmony_ci auto win = iter->second.second; 239e0dac50fSopenharmony_ci if (context.get() == win->GetContext().get() && WindowHelper::IsMainWindow(win->GetType())) { 240e0dac50fSopenharmony_ci mainWinId = win->GetWindowId(); 241e0dac50fSopenharmony_ci WLOGI("GetTopWindow Find MainWinId:%{public}u.", mainWinId); 242e0dac50fSopenharmony_ci break; 243e0dac50fSopenharmony_ci } 244e0dac50fSopenharmony_ci } 245e0dac50fSopenharmony_ci WLOGI("GetTopWindowfinal winId:%{public}u!", mainWinId); 246e0dac50fSopenharmony_ci if (mainWinId == INVALID_WINDOW_ID) { 247e0dac50fSopenharmony_ci WLOGFE("Cannot find topWindow!"); 248e0dac50fSopenharmony_ci return nullptr; 249e0dac50fSopenharmony_ci } 250e0dac50fSopenharmony_ci uint32_t topWinId = INVALID_WINDOW_ID; 251e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetTopWindowId(mainWinId, topWinId); 252e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 253e0dac50fSopenharmony_ci WLOGFE("GetTopWindowId failed with errCode:%{public}d", static_cast<int32_t>(ret)); 254e0dac50fSopenharmony_ci return nullptr; 255e0dac50fSopenharmony_ci } 256e0dac50fSopenharmony_ci return FindWindowById(topWinId); 257e0dac50fSopenharmony_ci} 258e0dac50fSopenharmony_ci 259e0dac50fSopenharmony_cistd::vector<sptr<Window>> WindowImpl::GetSubWindow(uint32_t parentId) 260e0dac50fSopenharmony_ci{ 261e0dac50fSopenharmony_ci if (subWindowMap_.find(parentId) == subWindowMap_.end()) { 262e0dac50fSopenharmony_ci WLOGFE("Cannot parentWindow with id: %{public}u!", parentId); 263e0dac50fSopenharmony_ci return std::vector<sptr<Window>>(); 264e0dac50fSopenharmony_ci } 265e0dac50fSopenharmony_ci return std::vector<sptr<Window>>(subWindowMap_[parentId].begin(), subWindowMap_[parentId].end()); 266e0dac50fSopenharmony_ci} 267e0dac50fSopenharmony_ci 268e0dac50fSopenharmony_civoid WindowImpl::UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 269e0dac50fSopenharmony_ci{ 270e0dac50fSopenharmony_ci for (const auto& winPair : windowMap_) { 271e0dac50fSopenharmony_ci auto window = winPair.second.second; 272e0dac50fSopenharmony_ci window->UpdateConfiguration(configuration); 273e0dac50fSopenharmony_ci } 274e0dac50fSopenharmony_ci} 275e0dac50fSopenharmony_ci 276e0dac50fSopenharmony_cistd::shared_ptr<RSSurfaceNode> WindowImpl::GetSurfaceNode() const 277e0dac50fSopenharmony_ci{ 278e0dac50fSopenharmony_ci return surfaceNode_; 279e0dac50fSopenharmony_ci} 280e0dac50fSopenharmony_ci 281e0dac50fSopenharmony_ciRect WindowImpl::GetRect() const 282e0dac50fSopenharmony_ci{ 283e0dac50fSopenharmony_ci return property_->GetWindowRect(); 284e0dac50fSopenharmony_ci} 285e0dac50fSopenharmony_ci 286e0dac50fSopenharmony_ciRect WindowImpl::GetRequestRect() const 287e0dac50fSopenharmony_ci{ 288e0dac50fSopenharmony_ci return property_->GetRequestRect(); 289e0dac50fSopenharmony_ci} 290e0dac50fSopenharmony_ci 291e0dac50fSopenharmony_ciWindowType WindowImpl::GetType() const 292e0dac50fSopenharmony_ci{ 293e0dac50fSopenharmony_ci return property_->GetWindowType(); 294e0dac50fSopenharmony_ci} 295e0dac50fSopenharmony_ci 296e0dac50fSopenharmony_ciWindowMode WindowImpl::GetMode() const 297e0dac50fSopenharmony_ci{ 298e0dac50fSopenharmony_ci return property_->GetWindowMode(); 299e0dac50fSopenharmony_ci} 300e0dac50fSopenharmony_ci 301e0dac50fSopenharmony_cifloat WindowImpl::GetAlpha() const 302e0dac50fSopenharmony_ci{ 303e0dac50fSopenharmony_ci return property_->GetAlpha(); 304e0dac50fSopenharmony_ci} 305e0dac50fSopenharmony_ci 306e0dac50fSopenharmony_ciWindowState WindowImpl::GetWindowState() const 307e0dac50fSopenharmony_ci{ 308e0dac50fSopenharmony_ci return state_; 309e0dac50fSopenharmony_ci} 310e0dac50fSopenharmony_ci 311e0dac50fSopenharmony_ciWMError WindowImpl::SetFocusable(bool isFocusable) 312e0dac50fSopenharmony_ci{ 313e0dac50fSopenharmony_ci if (!IsWindowValid()) { 314e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 315e0dac50fSopenharmony_ci } 316e0dac50fSopenharmony_ci property_->SetFocusable(isFocusable); 317e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 318e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_FOCUSABLE); 319e0dac50fSopenharmony_ci } 320e0dac50fSopenharmony_ci return WMError::WM_OK; 321e0dac50fSopenharmony_ci} 322e0dac50fSopenharmony_ci 323e0dac50fSopenharmony_cibool WindowImpl::GetFocusable() const 324e0dac50fSopenharmony_ci{ 325e0dac50fSopenharmony_ci return property_->GetFocusable(); 326e0dac50fSopenharmony_ci} 327e0dac50fSopenharmony_ci 328e0dac50fSopenharmony_ciWMError WindowImpl::SetTouchable(bool isTouchable) 329e0dac50fSopenharmony_ci{ 330e0dac50fSopenharmony_ci if (!IsWindowValid()) { 331e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 332e0dac50fSopenharmony_ci } 333e0dac50fSopenharmony_ci property_->SetTouchable(isTouchable); 334e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 335e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_TOUCHABLE); 336e0dac50fSopenharmony_ci } 337e0dac50fSopenharmony_ci return WMError::WM_OK; 338e0dac50fSopenharmony_ci} 339e0dac50fSopenharmony_ci 340e0dac50fSopenharmony_cibool WindowImpl::GetTouchable() const 341e0dac50fSopenharmony_ci{ 342e0dac50fSopenharmony_ci return property_->GetTouchable(); 343e0dac50fSopenharmony_ci} 344e0dac50fSopenharmony_ci 345e0dac50fSopenharmony_ciconst std::string& WindowImpl::GetWindowName() const 346e0dac50fSopenharmony_ci{ 347e0dac50fSopenharmony_ci return name_; 348e0dac50fSopenharmony_ci} 349e0dac50fSopenharmony_ci 350e0dac50fSopenharmony_ciuint32_t WindowImpl::GetWindowId() const 351e0dac50fSopenharmony_ci{ 352e0dac50fSopenharmony_ci return property_->GetWindowId(); 353e0dac50fSopenharmony_ci} 354e0dac50fSopenharmony_ci 355e0dac50fSopenharmony_ciuint64_t WindowImpl::GetDisplayId() const 356e0dac50fSopenharmony_ci{ 357e0dac50fSopenharmony_ci return property_->GetDisplayId(); 358e0dac50fSopenharmony_ci} 359e0dac50fSopenharmony_ci 360e0dac50fSopenharmony_ciuint32_t WindowImpl::GetWindowFlags() const 361e0dac50fSopenharmony_ci{ 362e0dac50fSopenharmony_ci return property_->GetWindowFlags(); 363e0dac50fSopenharmony_ci} 364e0dac50fSopenharmony_ci 365e0dac50fSopenharmony_ciuint32_t WindowImpl::GetRequestModeSupportInfo() const 366e0dac50fSopenharmony_ci{ 367e0dac50fSopenharmony_ci return property_->GetRequestModeSupportInfo(); 368e0dac50fSopenharmony_ci} 369e0dac50fSopenharmony_ci 370e0dac50fSopenharmony_ciuint32_t WindowImpl::GetModeSupportInfo() const 371e0dac50fSopenharmony_ci{ 372e0dac50fSopenharmony_ci return property_->GetModeSupportInfo(); 373e0dac50fSopenharmony_ci} 374e0dac50fSopenharmony_ci 375e0dac50fSopenharmony_cibool WindowImpl::IsMainHandlerAvailable() const 376e0dac50fSopenharmony_ci{ 377e0dac50fSopenharmony_ci return isMainHandlerAvailable_; 378e0dac50fSopenharmony_ci} 379e0dac50fSopenharmony_ci 380e0dac50fSopenharmony_ciSystemBarProperty WindowImpl::GetSystemBarPropertyByType(WindowType type) const 381e0dac50fSopenharmony_ci{ 382e0dac50fSopenharmony_ci auto curProperties = property_->GetSystemBarProperty(); 383e0dac50fSopenharmony_ci return curProperties[type]; 384e0dac50fSopenharmony_ci} 385e0dac50fSopenharmony_ci 386e0dac50fSopenharmony_ciWMError WindowImpl::GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea) 387e0dac50fSopenharmony_ci{ 388e0dac50fSopenharmony_ci if (!IsWindowValid()) { 389e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 390e0dac50fSopenharmony_ci } 391e0dac50fSopenharmony_ci WLOGI("GetAvoidAreaByType Search Type: %{public}u", static_cast<uint32_t>(type)); 392e0dac50fSopenharmony_ci uint32_t windowId = property_->GetWindowId(); 393e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetAvoidAreaByType(windowId, type, avoidArea); 394e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 395e0dac50fSopenharmony_ci WLOGFE("GetAvoidAreaByType errCode:%{public}d winId:%{public}u Type is :%{public}u.", 396e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId(), static_cast<uint32_t>(type)); 397e0dac50fSopenharmony_ci } 398e0dac50fSopenharmony_ci return ret; 399e0dac50fSopenharmony_ci} 400e0dac50fSopenharmony_ci 401e0dac50fSopenharmony_ciWMError WindowImpl::SetWindowType(WindowType type) 402e0dac50fSopenharmony_ci{ 403e0dac50fSopenharmony_ci WLOGFD("window id: %{public}u, type:%{public}u.", property_->GetWindowId(), static_cast<uint32_t>(type)); 404e0dac50fSopenharmony_ci if (type != WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW && !Permission::IsSystemCalling() && 405e0dac50fSopenharmony_ci !Permission::IsStartByHdcd()) { 406e0dac50fSopenharmony_ci WLOGFE("set window type permission denied!"); 407e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 408e0dac50fSopenharmony_ci } 409e0dac50fSopenharmony_ci if (!IsWindowValid()) { 410e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 411e0dac50fSopenharmony_ci } 412e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED) { 413e0dac50fSopenharmony_ci if (!(WindowHelper::IsAppWindow(type) || WindowHelper::IsSystemWindow(type))) { 414e0dac50fSopenharmony_ci WLOGFE("window type is invalid %{public}u.", type); 415e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 416e0dac50fSopenharmony_ci } 417e0dac50fSopenharmony_ci property_->SetWindowType(type); 418e0dac50fSopenharmony_ci UpdateDecorEnable(); 419e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(); 420e0dac50fSopenharmony_ci return WMError::WM_OK; 421e0dac50fSopenharmony_ci } 422e0dac50fSopenharmony_ci if (property_->GetWindowType() != type) { 423e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 424e0dac50fSopenharmony_ci } 425e0dac50fSopenharmony_ci return WMError::WM_OK; 426e0dac50fSopenharmony_ci} 427e0dac50fSopenharmony_ci 428e0dac50fSopenharmony_ciWMError WindowImpl::SetWindowMode(WindowMode mode) 429e0dac50fSopenharmony_ci{ 430e0dac50fSopenharmony_ci WLOGI("Window %{public}u mode %{public}u", property_->GetWindowId(), static_cast<uint32_t>(mode)); 431e0dac50fSopenharmony_ci if (!IsWindowValid()) { 432e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 433e0dac50fSopenharmony_ci } 434e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), mode)) { 435e0dac50fSopenharmony_ci WLOGE("window %{public}u do not support mode: %{public}u", 436e0dac50fSopenharmony_ci property_->GetWindowId(), static_cast<uint32_t>(mode)); 437e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW_MODE_OR_SIZE; 438e0dac50fSopenharmony_ci } 439e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 440e0dac50fSopenharmony_ci UpdateMode(mode); 441e0dac50fSopenharmony_ci } else if (state_ == WindowState::STATE_SHOWN) { 442e0dac50fSopenharmony_ci WindowMode lastMode = property_->GetWindowMode(); 443e0dac50fSopenharmony_ci property_->SetWindowMode(mode); 444e0dac50fSopenharmony_ci UpdateDecorEnable(); 445e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_MODE); 446e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 447e0dac50fSopenharmony_ci property_->SetWindowMode(lastMode); 448e0dac50fSopenharmony_ci return ret; 449e0dac50fSopenharmony_ci } 450e0dac50fSopenharmony_ci // set client window mode if success. 451e0dac50fSopenharmony_ci UpdateMode(mode); 452e0dac50fSopenharmony_ci } 453e0dac50fSopenharmony_ci if (property_->GetWindowMode() != mode) { 454e0dac50fSopenharmony_ci WLOGFE("set window mode filed! id: %{public}u.", property_->GetWindowId()); 455e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 456e0dac50fSopenharmony_ci } 457e0dac50fSopenharmony_ci return WMError::WM_OK; 458e0dac50fSopenharmony_ci} 459e0dac50fSopenharmony_ci 460e0dac50fSopenharmony_ciWMError WindowImpl::SetAlpha(float alpha) 461e0dac50fSopenharmony_ci{ 462e0dac50fSopenharmony_ci WLOGI("Window %{public}u alpha %{public}f", property_->GetWindowId(), alpha); 463e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 464e0dac50fSopenharmony_ci WLOGFE("set alpha permission denied!"); 465e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 466e0dac50fSopenharmony_ci } 467e0dac50fSopenharmony_ci if (!IsWindowValid()) { 468e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 469e0dac50fSopenharmony_ci } 470e0dac50fSopenharmony_ci property_->SetAlpha(alpha); 471e0dac50fSopenharmony_ci surfaceNode_->SetAlpha(alpha); 472e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 473e0dac50fSopenharmony_ci return WMError::WM_OK; 474e0dac50fSopenharmony_ci} 475e0dac50fSopenharmony_ci 476e0dac50fSopenharmony_ciWMError WindowImpl::SetTransform(const Transform& trans) 477e0dac50fSopenharmony_ci{ 478e0dac50fSopenharmony_ci WLOGI("Window %{public}u", property_->GetWindowId()); 479e0dac50fSopenharmony_ci if (!IsWindowValid()) { 480e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 481e0dac50fSopenharmony_ci } 482e0dac50fSopenharmony_ci Transform oriTrans = property_->GetTransform(); 483e0dac50fSopenharmony_ci property_->SetTransform(trans); 484e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_TRANSFORM_PROPERTY); 485e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 486e0dac50fSopenharmony_ci WLOGFE("SetTransform errCode:%{public}d winId:%{public}u", 487e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 488e0dac50fSopenharmony_ci property_->SetTransform(oriTrans); // reset to ori transform when update failed 489e0dac50fSopenharmony_ci } 490e0dac50fSopenharmony_ci if (property_->IsDisplayZoomOn()) { 491e0dac50fSopenharmony_ci TransformSurfaceNode(property_->GetZoomTransform()); 492e0dac50fSopenharmony_ci } else { 493e0dac50fSopenharmony_ci TransformSurfaceNode(trans); 494e0dac50fSopenharmony_ci } 495e0dac50fSopenharmony_ci return ret; 496e0dac50fSopenharmony_ci} 497e0dac50fSopenharmony_ci 498e0dac50fSopenharmony_ciconst Transform& WindowImpl::GetTransform() const 499e0dac50fSopenharmony_ci{ 500e0dac50fSopenharmony_ci return property_->GetTransform(); 501e0dac50fSopenharmony_ci} 502e0dac50fSopenharmony_ci 503e0dac50fSopenharmony_ciconst Transform& WindowImpl::GetZoomTransform() const 504e0dac50fSopenharmony_ci{ 505e0dac50fSopenharmony_ci return property_->GetZoomTransform(); 506e0dac50fSopenharmony_ci} 507e0dac50fSopenharmony_ci 508e0dac50fSopenharmony_ciWMError WindowImpl::AddWindowFlag(WindowFlag flag) 509e0dac50fSopenharmony_ci{ 510e0dac50fSopenharmony_ci if (!IsWindowValid()) { 511e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 512e0dac50fSopenharmony_ci } 513e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED && state_ != WindowState::STATE_CREATED) { 514e0dac50fSopenharmony_ci WLOGFE("Only support add show when locked when window create, id: %{public}u", property_->GetWindowId()); 515e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 516e0dac50fSopenharmony_ci } 517e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE && !Permission::IsSystemCalling()) { 518e0dac50fSopenharmony_ci WLOGFE("set forbid split move permission denied!"); 519e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 520e0dac50fSopenharmony_ci } 521e0dac50fSopenharmony_ci uint32_t updateFlags = property_->GetWindowFlags() | (static_cast<uint32_t>(flag)); 522e0dac50fSopenharmony_ci return SetWindowFlags(updateFlags); 523e0dac50fSopenharmony_ci} 524e0dac50fSopenharmony_ci 525e0dac50fSopenharmony_ciWMError WindowImpl::RemoveWindowFlag(WindowFlag flag) 526e0dac50fSopenharmony_ci{ 527e0dac50fSopenharmony_ci if (!IsWindowValid()) { 528e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 529e0dac50fSopenharmony_ci } 530e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED && state_ != WindowState::STATE_CREATED) { 531e0dac50fSopenharmony_ci WLOGFE("Only support remove show when locked when window create, id: %{public}u", property_->GetWindowId()); 532e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 533e0dac50fSopenharmony_ci } 534e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE && !Permission::IsSystemCalling()) { 535e0dac50fSopenharmony_ci WLOGFE("set forbid split move permission denied!"); 536e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 537e0dac50fSopenharmony_ci } 538e0dac50fSopenharmony_ci uint32_t updateFlags = property_->GetWindowFlags() & (~(static_cast<uint32_t>(flag))); 539e0dac50fSopenharmony_ci return SetWindowFlags(updateFlags); 540e0dac50fSopenharmony_ci} 541e0dac50fSopenharmony_ci 542e0dac50fSopenharmony_ciWMError WindowImpl::SetWindowFlags(uint32_t flags) 543e0dac50fSopenharmony_ci{ 544e0dac50fSopenharmony_ci WLOGI("Window %{public}u flags %{public}u", property_->GetWindowId(), flags); 545e0dac50fSopenharmony_ci if (!IsWindowValid()) { 546e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 547e0dac50fSopenharmony_ci } 548e0dac50fSopenharmony_ci if (property_->GetWindowFlags() == flags) { 549e0dac50fSopenharmony_ci return WMError::WM_OK; 550e0dac50fSopenharmony_ci } 551e0dac50fSopenharmony_ci auto oriFlags = property_->GetWindowFlags(); 552e0dac50fSopenharmony_ci property_->SetWindowFlags(flags); 553e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 554e0dac50fSopenharmony_ci return WMError::WM_OK; 555e0dac50fSopenharmony_ci } 556e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_FLAGS); 557e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 558e0dac50fSopenharmony_ci WLOGFE("SetWindowFlags errCode:%{public}d winId:%{public}u", 559e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 560e0dac50fSopenharmony_ci property_->SetWindowFlags(oriFlags); 561e0dac50fSopenharmony_ci } 562e0dac50fSopenharmony_ci return ret; 563e0dac50fSopenharmony_ci} 564e0dac50fSopenharmony_ci 565e0dac50fSopenharmony_civoid WindowImpl::OnNewWant(const AAFwk::Want& want) 566e0dac50fSopenharmony_ci{ 567e0dac50fSopenharmony_ci WLOGI("Window [name:%{public}s, id:%{public}u]", name_.c_str(), property_->GetWindowId()); 568e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 569e0dac50fSopenharmony_ci uiContent_->OnNewWant(want); 570e0dac50fSopenharmony_ci } 571e0dac50fSopenharmony_ci} 572e0dac50fSopenharmony_ci 573e0dac50fSopenharmony_ciWMError WindowImpl::NapiSetUIContent(const std::string& contentInfo, napi_env env, napi_value storage, 574e0dac50fSopenharmony_ci BackupAndRestoreType type, sptr<IRemoteObject> token, AppExecFwk::Ability* ability) 575e0dac50fSopenharmony_ci{ 576e0dac50fSopenharmony_ci return SetUIContentInner(contentInfo, env, storage, 577e0dac50fSopenharmony_ci type == BackupAndRestoreType::NONE ? WindowSetUIContentType::DEFAULT : WindowSetUIContentType::RESTORE, 578e0dac50fSopenharmony_ci type, ability); 579e0dac50fSopenharmony_ci} 580e0dac50fSopenharmony_ci 581e0dac50fSopenharmony_ciWMError WindowImpl::SetUIContentByName( 582e0dac50fSopenharmony_ci const std::string& contentInfo, napi_env env, napi_value storage, AppExecFwk::Ability* ability) 583e0dac50fSopenharmony_ci{ 584e0dac50fSopenharmony_ci return SetUIContentInner(contentInfo, env, storage, WindowSetUIContentType::BY_NAME, 585e0dac50fSopenharmony_ci BackupAndRestoreType::NONE, ability); 586e0dac50fSopenharmony_ci} 587e0dac50fSopenharmony_ci 588e0dac50fSopenharmony_ciWMError WindowImpl::SetUIContentByAbc( 589e0dac50fSopenharmony_ci const std::string& contentInfo, napi_env env, napi_value storage, AppExecFwk::Ability* ability) 590e0dac50fSopenharmony_ci{ 591e0dac50fSopenharmony_ci return SetUIContentInner(contentInfo, env, storage, WindowSetUIContentType::BY_ABC, 592e0dac50fSopenharmony_ci BackupAndRestoreType::NONE, ability); 593e0dac50fSopenharmony_ci} 594e0dac50fSopenharmony_ci 595e0dac50fSopenharmony_ciWMError WindowImpl::SetUIContentInner(const std::string& contentInfo, napi_env env, napi_value storage, 596e0dac50fSopenharmony_ci WindowSetUIContentType setUIContentType, BackupAndRestoreType restoreType, AppExecFwk::Ability* ability) 597e0dac50fSopenharmony_ci{ 598e0dac50fSopenharmony_ci HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "loadContent"); 599e0dac50fSopenharmony_ci if (!IsWindowValid()) { 600e0dac50fSopenharmony_ci WLOGFD("interrupt set uicontent because window is invalid! window state: %{public}d", state_); 601e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 602e0dac50fSopenharmony_ci } 603e0dac50fSopenharmony_ci WLOGFD("NapiSetUIContent: %{public}s", contentInfo.c_str()); 604e0dac50fSopenharmony_ci if (uiContent_) { 605e0dac50fSopenharmony_ci uiContent_->Destroy(); 606e0dac50fSopenharmony_ci } 607e0dac50fSopenharmony_ci std::unique_ptr<Ace::UIContent> uiContent; 608e0dac50fSopenharmony_ci if (ability != nullptr) { 609e0dac50fSopenharmony_ci uiContent = Ace::UIContent::Create(ability); 610e0dac50fSopenharmony_ci } else { 611e0dac50fSopenharmony_ci uiContent = Ace::UIContent::Create(context_.get(), reinterpret_cast<NativeEngine*>(env)); 612e0dac50fSopenharmony_ci } 613e0dac50fSopenharmony_ci if (uiContent == nullptr) { 614e0dac50fSopenharmony_ci WLOGFE("fail to NapiSetUIContent id: %{public}u", property_->GetWindowId()); 615e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 616e0dac50fSopenharmony_ci } 617e0dac50fSopenharmony_ci 618e0dac50fSopenharmony_ci OHOS::Ace::UIContentErrorCode aceRet = OHOS::Ace::UIContentErrorCode::NO_ERRORS; 619e0dac50fSopenharmony_ci switch (setUIContentType) { 620e0dac50fSopenharmony_ci default: 621e0dac50fSopenharmony_ci case WindowSetUIContentType::DEFAULT: { 622e0dac50fSopenharmony_ci auto routerStack = GetRestoredRouterStack(); 623e0dac50fSopenharmony_ci auto type = GetAceContentInfoType(BackupAndRestoreType::RESOURCESCHEDULE_RECOVERY); 624e0dac50fSopenharmony_ci if (!routerStack.empty() && 625e0dac50fSopenharmony_ci uiContent->Restore(this, routerStack, storage, type) == Ace::UIContentErrorCode::NO_ERRORS) { 626e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Restore router stack succeed."); 627e0dac50fSopenharmony_ci break; 628e0dac50fSopenharmony_ci } 629e0dac50fSopenharmony_ci aceRet = uiContent->Initialize(this, contentInfo, storage); 630e0dac50fSopenharmony_ci break; 631e0dac50fSopenharmony_ci } 632e0dac50fSopenharmony_ci case WindowSetUIContentType::RESTORE: 633e0dac50fSopenharmony_ci aceRet = uiContent->Restore(this, contentInfo, storage, GetAceContentInfoType(restoreType)); 634e0dac50fSopenharmony_ci break; 635e0dac50fSopenharmony_ci case WindowSetUIContentType::BY_NAME: 636e0dac50fSopenharmony_ci aceRet = uiContent->InitializeByName(this, contentInfo, storage); 637e0dac50fSopenharmony_ci break; 638e0dac50fSopenharmony_ci case WindowSetUIContentType::BY_ABC: 639e0dac50fSopenharmony_ci auto abcContent = GetAbcContent(contentInfo); 640e0dac50fSopenharmony_ci aceRet = uiContent->Initialize(this, abcContent, storage); 641e0dac50fSopenharmony_ci break; 642e0dac50fSopenharmony_ci } 643e0dac50fSopenharmony_ci // make uiContent available after Initialize/Restore 644e0dac50fSopenharmony_ci { 645e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 646e0dac50fSopenharmony_ci uiContent_ = std::move(uiContent); 647e0dac50fSopenharmony_ci } 648e0dac50fSopenharmony_ci 649e0dac50fSopenharmony_ci if (isIgnoreSafeAreaNeedNotify_) { 650e0dac50fSopenharmony_ci uiContent_->SetIgnoreViewSafeArea(isIgnoreSafeArea_); 651e0dac50fSopenharmony_ci } 652e0dac50fSopenharmony_ci UpdateDecorEnable(true); 653e0dac50fSopenharmony_ci 654e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 655e0dac50fSopenharmony_ci // UIContent may be nullptr when show window, need to notify again when window is shown 656e0dac50fSopenharmony_ci uiContent_->Foreground(); 657e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 658e0dac50fSopenharmony_ci Ace::ViewportConfig config; 659e0dac50fSopenharmony_ci Rect rect = GetRect(); 660e0dac50fSopenharmony_ci config.SetSize(rect.width_, rect.height_); 661e0dac50fSopenharmony_ci config.SetPosition(rect.posX_, rect.posY_); 662e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 663e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 664e0dac50fSopenharmony_ci if (display == nullptr) { 665e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64", window id:%{public}u", property_->GetDisplayId(), 666e0dac50fSopenharmony_ci property_->GetWindowId()); 667e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 668e0dac50fSopenharmony_ci } 669e0dac50fSopenharmony_ci float virtualPixelRatio = display->GetVirtualPixelRatio(); 670e0dac50fSopenharmony_ci config.SetDensity(virtualPixelRatio); 671e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 672e0dac50fSopenharmony_ci if (displayInfo != nullptr) { 673e0dac50fSopenharmony_ci config.SetOrientation(static_cast<int32_t>(displayInfo->GetDisplayOrientation())); 674e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "notify window orientation change end."); 675e0dac50fSopenharmony_ci } 676e0dac50fSopenharmony_ci uiContent_->UpdateViewportConfig(config, WindowSizeChangeReason::UNDEFINED, nullptr); 677e0dac50fSopenharmony_ci WLOGFD("notify uiContent window size change end"); 678e0dac50fSopenharmony_ci } 679e0dac50fSopenharmony_ci if (aceRet != OHOS::Ace::UIContentErrorCode::NO_ERRORS) { 680e0dac50fSopenharmony_ci WLOGFE("failed to init or restore uicontent with file %{public}s. errorCode: %{public}d", 681e0dac50fSopenharmony_ci contentInfo.c_str(), static_cast<uint16_t>(aceRet)); 682e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 683e0dac50fSopenharmony_ci } 684e0dac50fSopenharmony_ci return WMError::WM_OK; 685e0dac50fSopenharmony_ci} 686e0dac50fSopenharmony_ci 687e0dac50fSopenharmony_cifloat WindowImpl::GetVirtualPixelRatio() 688e0dac50fSopenharmony_ci{ 689e0dac50fSopenharmony_ci float vpr = 0.0f; // This is an abnormal value, which is used to identify abnormal scenarios. 690e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 691e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 692e0dac50fSopenharmony_ci if (display == nullptr) { 693e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "get display failed displayId:%{public}" PRIu64 ", window id:%{public}u", 694e0dac50fSopenharmony_ci property_->GetDisplayId(), property_->GetWindowId()); 695e0dac50fSopenharmony_ci return vpr; 696e0dac50fSopenharmony_ci } 697e0dac50fSopenharmony_ci return display->GetVirtualPixelRatio(); 698e0dac50fSopenharmony_ci} 699e0dac50fSopenharmony_ci 700e0dac50fSopenharmony_cistd::shared_ptr<std::vector<uint8_t>> WindowImpl::GetAbcContent(const std::string& abcPath) 701e0dac50fSopenharmony_ci{ 702e0dac50fSopenharmony_ci std::filesystem::path abcFile { abcPath }; 703e0dac50fSopenharmony_ci if (abcFile.empty() || !abcFile.is_absolute() || !std::filesystem::exists(abcFile)) { 704e0dac50fSopenharmony_ci WLOGFE("abc file path is not valid"); 705e0dac50fSopenharmony_ci return nullptr; 706e0dac50fSopenharmony_ci } 707e0dac50fSopenharmony_ci int begin, end; 708e0dac50fSopenharmony_ci std::fstream file(abcFile, std::ios::in | std::ios::binary); 709e0dac50fSopenharmony_ci if (!file) { 710e0dac50fSopenharmony_ci WLOGFE("abc file is not valid"); 711e0dac50fSopenharmony_ci return nullptr; 712e0dac50fSopenharmony_ci } 713e0dac50fSopenharmony_ci begin = file.tellg(); 714e0dac50fSopenharmony_ci file.seekg(0, std::ios::end); 715e0dac50fSopenharmony_ci end = file.tellg(); 716e0dac50fSopenharmony_ci int len = end - begin; 717e0dac50fSopenharmony_ci WLOGFD("abc file: %{public}s, size: %{public}d", abcPath.c_str(), len); 718e0dac50fSopenharmony_ci 719e0dac50fSopenharmony_ci if (len <= 0) { 720e0dac50fSopenharmony_ci WLOGFE("abc file size is 0"); 721e0dac50fSopenharmony_ci return nullptr; 722e0dac50fSopenharmony_ci } 723e0dac50fSopenharmony_ci std::vector<uint8_t> abcBytes(len); 724e0dac50fSopenharmony_ci file.seekg(0, std::ios::beg); 725e0dac50fSopenharmony_ci file.read(reinterpret_cast<char *>(abcBytes.data()), len); 726e0dac50fSopenharmony_ci return std::make_shared<std::vector<uint8_t>>(abcBytes); 727e0dac50fSopenharmony_ci} 728e0dac50fSopenharmony_ci 729e0dac50fSopenharmony_ciAce::UIContent* WindowImpl::GetUIContent() const 730e0dac50fSopenharmony_ci{ 731e0dac50fSopenharmony_ci return uiContent_.get(); 732e0dac50fSopenharmony_ci} 733e0dac50fSopenharmony_ci 734e0dac50fSopenharmony_ciAce::UIContent* WindowImpl::GetUIContentWithId(uint32_t winId) const 735e0dac50fSopenharmony_ci{ 736e0dac50fSopenharmony_ci return nullptr; 737e0dac50fSopenharmony_ci} 738e0dac50fSopenharmony_ci 739e0dac50fSopenharmony_cistd::string WindowImpl::GetContentInfo(BackupAndRestoreType type) 740e0dac50fSopenharmony_ci{ 741e0dac50fSopenharmony_ci WLOGFD("GetContentInfo"); 742e0dac50fSopenharmony_ci if (type == BackupAndRestoreType::NONE) { 743e0dac50fSopenharmony_ci return ""; 744e0dac50fSopenharmony_ci } 745e0dac50fSopenharmony_ci 746e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 747e0dac50fSopenharmony_ci WLOGFE("fail to GetContentInfo id: %{public}u", property_->GetWindowId()); 748e0dac50fSopenharmony_ci return ""; 749e0dac50fSopenharmony_ci } 750e0dac50fSopenharmony_ci return uiContent_->GetContentInfo(GetAceContentInfoType(type)); 751e0dac50fSopenharmony_ci} 752e0dac50fSopenharmony_ci 753e0dac50fSopenharmony_ciWMError WindowImpl::SetRestoredRouterStack(const std::string& routerStack) 754e0dac50fSopenharmony_ci{ 755e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "Set restored router stack."); 756e0dac50fSopenharmony_ci restoredRouterStack_ = routerStack; 757e0dac50fSopenharmony_ci return WMError::WM_OK; 758e0dac50fSopenharmony_ci} 759e0dac50fSopenharmony_ci 760e0dac50fSopenharmony_cistd::string WindowImpl::GetRestoredRouterStack() 761e0dac50fSopenharmony_ci{ 762e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "Get restored router stack."); 763e0dac50fSopenharmony_ci return std::move(restoredRouterStack_); 764e0dac50fSopenharmony_ci} 765e0dac50fSopenharmony_ci 766e0dac50fSopenharmony_ciColorSpace WindowImpl::GetColorSpaceFromSurfaceGamut(GraphicColorGamut colorGamut) 767e0dac50fSopenharmony_ci{ 768e0dac50fSopenharmony_ci for (auto item: colorSpaceConvertMap) { 769e0dac50fSopenharmony_ci if (item.surfaceColorGamut == colorGamut) { 770e0dac50fSopenharmony_ci return item.colorSpace; 771e0dac50fSopenharmony_ci } 772e0dac50fSopenharmony_ci } 773e0dac50fSopenharmony_ci return ColorSpace::COLOR_SPACE_DEFAULT; 774e0dac50fSopenharmony_ci} 775e0dac50fSopenharmony_ci 776e0dac50fSopenharmony_ciGraphicColorGamut WindowImpl::GetSurfaceGamutFromColorSpace(ColorSpace colorSpace) 777e0dac50fSopenharmony_ci{ 778e0dac50fSopenharmony_ci for (auto item: colorSpaceConvertMap) { 779e0dac50fSopenharmony_ci if (item.colorSpace == colorSpace) { 780e0dac50fSopenharmony_ci return item.surfaceColorGamut; 781e0dac50fSopenharmony_ci } 782e0dac50fSopenharmony_ci } 783e0dac50fSopenharmony_ci return GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB; 784e0dac50fSopenharmony_ci} 785e0dac50fSopenharmony_ci 786e0dac50fSopenharmony_cibool WindowImpl::IsSupportWideGamut() 787e0dac50fSopenharmony_ci{ 788e0dac50fSopenharmony_ci return true; 789e0dac50fSopenharmony_ci} 790e0dac50fSopenharmony_ci 791e0dac50fSopenharmony_civoid WindowImpl::SetColorSpace(ColorSpace colorSpace) 792e0dac50fSopenharmony_ci{ 793e0dac50fSopenharmony_ci if (!IsWindowValid()) { 794e0dac50fSopenharmony_ci return; 795e0dac50fSopenharmony_ci } 796e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 797e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "surface node is nullptr, winId: %{public}u", GetWindowId()); 798e0dac50fSopenharmony_ci return; 799e0dac50fSopenharmony_ci } 800e0dac50fSopenharmony_ci auto surfaceGamut = GetSurfaceGamutFromColorSpace(colorSpace); 801e0dac50fSopenharmony_ci surfaceNode_->SetColorSpace(surfaceGamut); 802e0dac50fSopenharmony_ci} 803e0dac50fSopenharmony_ci 804e0dac50fSopenharmony_ciColorSpace WindowImpl::GetColorSpace() 805e0dac50fSopenharmony_ci{ 806e0dac50fSopenharmony_ci if (!IsWindowValid()) { 807e0dac50fSopenharmony_ci return ColorSpace::COLOR_SPACE_DEFAULT; 808e0dac50fSopenharmony_ci } 809e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 810e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "surface node is nullptr, winId: %{public}u", GetWindowId()); 811e0dac50fSopenharmony_ci return ColorSpace::COLOR_SPACE_DEFAULT; 812e0dac50fSopenharmony_ci } 813e0dac50fSopenharmony_ci auto surfaceGamut = surfaceNode_->GetColorSpace(); 814e0dac50fSopenharmony_ci return GetColorSpaceFromSurfaceGamut(surfaceGamut); 815e0dac50fSopenharmony_ci} 816e0dac50fSopenharmony_ci 817e0dac50fSopenharmony_cistd::shared_ptr<Media::PixelMap> WindowImpl::Snapshot() 818e0dac50fSopenharmony_ci{ 819e0dac50fSopenharmony_ci if (!IsWindowValid()) { 820e0dac50fSopenharmony_ci return nullptr; 821e0dac50fSopenharmony_ci } 822e0dac50fSopenharmony_ci std::shared_ptr<SurfaceCaptureFuture> callback = std::make_shared<SurfaceCaptureFuture>(); 823e0dac50fSopenharmony_ci auto isSucceeded = RSInterfaces::GetInstance().TakeSurfaceCapture(surfaceNode_, callback); 824e0dac50fSopenharmony_ci std::shared_ptr<Media::PixelMap> pixelMap; 825e0dac50fSopenharmony_ci if (isSucceeded) { 826e0dac50fSopenharmony_ci pixelMap = callback->GetResult(2000); // wait for <= 2000ms 827e0dac50fSopenharmony_ci } else { 828e0dac50fSopenharmony_ci pixelMap = SingletonContainer::Get<WindowAdapter>().GetSnapshot(property_->GetWindowId()); 829e0dac50fSopenharmony_ci } 830e0dac50fSopenharmony_ci if (pixelMap != nullptr) { 831e0dac50fSopenharmony_ci WLOGFD("WMS-Client Save WxH = %{public}dx%{public}d", pixelMap->GetWidth(), pixelMap->GetHeight()); 832e0dac50fSopenharmony_ci } else { 833e0dac50fSopenharmony_ci WLOGFE("Failed to get pixelmap, return nullptr!"); 834e0dac50fSopenharmony_ci } 835e0dac50fSopenharmony_ci return pixelMap; 836e0dac50fSopenharmony_ci} 837e0dac50fSopenharmony_ci 838e0dac50fSopenharmony_civoid WindowImpl::DumpInfo(const std::vector<std::string>& params, std::vector<std::string>& info) 839e0dac50fSopenharmony_ci{ 840e0dac50fSopenharmony_ci if (params.size() == 1 && params[0] == PARAM_DUMP_HELP) { // 1: params num 841e0dac50fSopenharmony_ci WLOGFD("Dump ArkUI help Info"); 842e0dac50fSopenharmony_ci Ace::UIContent::ShowDumpHelp(info); 843e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyDumpInfoResult(info); 844e0dac50fSopenharmony_ci return; 845e0dac50fSopenharmony_ci } 846e0dac50fSopenharmony_ci WLOGFD("ArkUI:DumpInfo"); 847e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 848e0dac50fSopenharmony_ci uiContent_->DumpInfo(params, info); 849e0dac50fSopenharmony_ci } 850e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyDumpInfoResult(info); 851e0dac50fSopenharmony_ci} 852e0dac50fSopenharmony_ci 853e0dac50fSopenharmony_ciWMError WindowImpl::SetSystemBarProperty(WindowType type, const SystemBarProperty& property) 854e0dac50fSopenharmony_ci{ 855e0dac50fSopenharmony_ci WLOGI("Window %{public}u type %{public}u enable:%{public}u, bgColor:%{public}x, Color:%{public}x ", 856e0dac50fSopenharmony_ci property_->GetWindowId(), static_cast<uint32_t>(type), property.enable_, 857e0dac50fSopenharmony_ci property.backgroundColor_, property.contentColor_); 858e0dac50fSopenharmony_ci if (!IsWindowValid()) { 859e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 860e0dac50fSopenharmony_ci } 861e0dac50fSopenharmony_ci if (GetSystemBarPropertyByType(type) == property) { 862e0dac50fSopenharmony_ci return WMError::WM_OK; 863e0dac50fSopenharmony_ci } 864e0dac50fSopenharmony_ci property_->SetSystemBarProperty(type, property); 865e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 866e0dac50fSopenharmony_ci return WMError::WM_OK; 867e0dac50fSopenharmony_ci } 868e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_OTHER_PROPS); 869e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 870e0dac50fSopenharmony_ci WLOGFE("SetSystemBarProperty errCode:%{public}d winId:%{public}u", 871e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 872e0dac50fSopenharmony_ci } 873e0dac50fSopenharmony_ci return ret; 874e0dac50fSopenharmony_ci} 875e0dac50fSopenharmony_ci 876e0dac50fSopenharmony_ciWMError WindowImpl::SetSystemBarProperties(const std::map<WindowType, SystemBarProperty>& properties, 877e0dac50fSopenharmony_ci const std::map<WindowType, SystemBarPropertyFlag>& propertyFlags) 878e0dac50fSopenharmony_ci{ 879e0dac50fSopenharmony_ci SystemBarProperty current = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 880e0dac50fSopenharmony_ci auto flagIter = propertyFlags.find(WindowType::WINDOW_TYPE_STATUS_BAR); 881e0dac50fSopenharmony_ci auto propertyIter = properties.find(WindowType::WINDOW_TYPE_STATUS_BAR); 882e0dac50fSopenharmony_ci if ((flagIter != propertyFlags.end() && flagIter->second.contentColorFlag) && 883e0dac50fSopenharmony_ci (propertyIter != properties.end() && current.contentColor_ != propertyIter->second.contentColor_)) { 884e0dac50fSopenharmony_ci current.contentColor_ = propertyIter->second.contentColor_; 885e0dac50fSopenharmony_ci current.settingFlag_ = static_cast<SystemBarSettingFlag>( 886e0dac50fSopenharmony_ci static_cast<uint32_t>(propertyIter->second.settingFlag_) | 887e0dac50fSopenharmony_ci static_cast<uint32_t>(SystemBarSettingFlag::COLOR_SETTING)); 888e0dac50fSopenharmony_ci WLOGI("Window:%{public}u %{public}s set status bar content color %{public}u", 889e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), current.contentColor_); 890e0dac50fSopenharmony_ci return SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, current); 891e0dac50fSopenharmony_ci } 892e0dac50fSopenharmony_ci return WMError::WM_OK; 893e0dac50fSopenharmony_ci} 894e0dac50fSopenharmony_ci 895e0dac50fSopenharmony_ciWMError WindowImpl::GetSystemBarProperties(std::map<WindowType, SystemBarProperty>& properties) 896e0dac50fSopenharmony_ci{ 897e0dac50fSopenharmony_ci if (property_ != nullptr) { 898e0dac50fSopenharmony_ci WLOGI("Window:%{public}u", GetWindowId()); 899e0dac50fSopenharmony_ci properties[WindowType::WINDOW_TYPE_STATUS_BAR] = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 900e0dac50fSopenharmony_ci } else { 901e0dac50fSopenharmony_ci WLOGFE("inner property is null"); 902e0dac50fSopenharmony_ci } 903e0dac50fSopenharmony_ci return WMError::WM_OK; 904e0dac50fSopenharmony_ci} 905e0dac50fSopenharmony_ci 906e0dac50fSopenharmony_ciWMError WindowImpl::SetSpecificBarProperty(WindowType type, const SystemBarProperty& property) 907e0dac50fSopenharmony_ci{ 908e0dac50fSopenharmony_ci return WMError::WM_OK; 909e0dac50fSopenharmony_ci} 910e0dac50fSopenharmony_ci 911e0dac50fSopenharmony_ciWMError WindowImpl::UpdateSystemBarProperty(bool status) 912e0dac50fSopenharmony_ci{ 913e0dac50fSopenharmony_ci if (!IsWindowValid()) { 914e0dac50fSopenharmony_ci WLOGFE("PutSystemBarProperty errCode:%{public}d winId:%{public}u", 915e0dac50fSopenharmony_ci static_cast<int32_t>(WMError::WM_ERROR_INVALID_WINDOW), property_->GetWindowId()); 916e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 917e0dac50fSopenharmony_ci } 918e0dac50fSopenharmony_ci 919e0dac50fSopenharmony_ci SystemBarProperty statusProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 920e0dac50fSopenharmony_ci SystemBarProperty naviProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_NAVIGATION_BAR); 921e0dac50fSopenharmony_ci if (status) { 922e0dac50fSopenharmony_ci statusProperty.enable_ = false; 923e0dac50fSopenharmony_ci naviProperty.enable_ = false; 924e0dac50fSopenharmony_ci } else { 925e0dac50fSopenharmony_ci statusProperty.enable_ = true; 926e0dac50fSopenharmony_ci naviProperty.enable_ = true; 927e0dac50fSopenharmony_ci } 928e0dac50fSopenharmony_ci 929e0dac50fSopenharmony_ci if ((GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR) == statusProperty) && 930e0dac50fSopenharmony_ci (GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_NAVIGATION_BAR) == naviProperty)) { 931e0dac50fSopenharmony_ci return WMError::WM_OK; 932e0dac50fSopenharmony_ci } 933e0dac50fSopenharmony_ci if (!(GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR) == statusProperty)) { 934e0dac50fSopenharmony_ci property_->SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusProperty); 935e0dac50fSopenharmony_ci } 936e0dac50fSopenharmony_ci if (!(GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_NAVIGATION_BAR) == naviProperty)) { 937e0dac50fSopenharmony_ci property_->SetSystemBarProperty(WindowType::WINDOW_TYPE_NAVIGATION_BAR, naviProperty); 938e0dac50fSopenharmony_ci } 939e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 940e0dac50fSopenharmony_ci return WMError::WM_OK; 941e0dac50fSopenharmony_ci } 942e0dac50fSopenharmony_ci 943e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_OTHER_PROPS); 944e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 945e0dac50fSopenharmony_ci WLOGFE("SetSystemBarProperty errCode:%{public}d winId:%{public}u", 946e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 947e0dac50fSopenharmony_ci } 948e0dac50fSopenharmony_ci return ret; 949e0dac50fSopenharmony_ci} 950e0dac50fSopenharmony_ci 951e0dac50fSopenharmony_ciWMError WindowImpl::SetLayoutFullScreen(bool status) 952e0dac50fSopenharmony_ci{ 953e0dac50fSopenharmony_ci WLOGI("Window %{public}u status: %{public}u", property_->GetWindowId(), status); 954e0dac50fSopenharmony_ci if (!IsWindowValid() || 955e0dac50fSopenharmony_ci !WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 956e0dac50fSopenharmony_ci WLOGFE("invalid window or fullscreen mode is not be supported, winId:%{public}u", property_->GetWindowId()); 957e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 958e0dac50fSopenharmony_ci } 959e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 960e0dac50fSopenharmony_ci uint32_t version = 0; 961e0dac50fSopenharmony_ci if ((context_ != nullptr) && (context_->GetApplicationInfo() != nullptr)) { 962e0dac50fSopenharmony_ci version = context_->GetApplicationInfo()->apiCompatibleVersion; 963e0dac50fSopenharmony_ci } 964e0dac50fSopenharmony_ci ret = SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 965e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 966e0dac50fSopenharmony_ci WLOGFE("SetWindowMode errCode:%{public}d winId:%{public}u", 967e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 968e0dac50fSopenharmony_ci return ret; 969e0dac50fSopenharmony_ci } 970e0dac50fSopenharmony_ci isIgnoreSafeArea_ = status; 971e0dac50fSopenharmony_ci // 10 ArkUI new framework support after API10 972e0dac50fSopenharmony_ci if (version >= 10) { 973e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 974e0dac50fSopenharmony_ci uiContent_->SetIgnoreViewSafeArea(status); 975e0dac50fSopenharmony_ci } 976e0dac50fSopenharmony_ci isIgnoreSafeAreaNeedNotify_ = true; 977e0dac50fSopenharmony_ci } else { 978e0dac50fSopenharmony_ci if (status) { 979e0dac50fSopenharmony_ci ret = RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 980e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 981e0dac50fSopenharmony_ci WLOGFE("RemoveWindowFlag errCode:%{public}d winId:%{public}u", 982e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 983e0dac50fSopenharmony_ci return ret; 984e0dac50fSopenharmony_ci } 985e0dac50fSopenharmony_ci } else { 986e0dac50fSopenharmony_ci ret = AddWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 987e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 988e0dac50fSopenharmony_ci WLOGFE("AddWindowFlag errCode:%{public}d winId:%{public}u", 989e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 990e0dac50fSopenharmony_ci return ret; 991e0dac50fSopenharmony_ci } 992e0dac50fSopenharmony_ci } 993e0dac50fSopenharmony_ci } 994e0dac50fSopenharmony_ci enableImmersiveMode_ = status; 995e0dac50fSopenharmony_ci return ret; 996e0dac50fSopenharmony_ci} 997e0dac50fSopenharmony_ci 998e0dac50fSopenharmony_ciWMError WindowImpl::SetFullScreen(bool status) 999e0dac50fSopenharmony_ci{ 1000e0dac50fSopenharmony_ci WLOGI("Window %{public}u status: %{public}d", property_->GetWindowId(), status); 1001e0dac50fSopenharmony_ci if (!IsWindowValid() || 1002e0dac50fSopenharmony_ci !WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 1003e0dac50fSopenharmony_ci WLOGFE("invalid window or fullscreen mode is not be supported, winId:%{public}u", property_->GetWindowId()); 1004e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1005e0dac50fSopenharmony_ci } 1006e0dac50fSopenharmony_ci WMError ret = UpdateSystemBarProperty(status); 1007e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1008e0dac50fSopenharmony_ci WLOGFE("UpdateSystemBarProperty errCode:%{public}d winId:%{public}u", 1009e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 1010e0dac50fSopenharmony_ci } 1011e0dac50fSopenharmony_ci ret = SetLayoutFullScreen(status); 1012e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1013e0dac50fSopenharmony_ci WLOGFE("SetLayoutFullScreen errCode:%{public}d winId:%{public}u", 1014e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowId()); 1015e0dac50fSopenharmony_ci } 1016e0dac50fSopenharmony_ci return ret; 1017e0dac50fSopenharmony_ci} 1018e0dac50fSopenharmony_ci 1019e0dac50fSopenharmony_ciWMError WindowImpl::SetFloatingMaximize(bool isEnter) 1020e0dac50fSopenharmony_ci{ 1021e0dac50fSopenharmony_ci WLOGFI("id:%{public}d SetFloatingMaximize status: %{public}d", property_->GetWindowId(), isEnter); 1022e0dac50fSopenharmony_ci if (!IsWindowValid() || 1023e0dac50fSopenharmony_ci !WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 1024e0dac50fSopenharmony_ci WLOGFE("invalid window or maximize mode is not be supported, winId:%{public}u", property_->GetWindowId()); 1025e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1026e0dac50fSopenharmony_ci } 1027e0dac50fSopenharmony_ci 1028e0dac50fSopenharmony_ci if (isEnter && GetGlobalMaximizeMode() != MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 1029e0dac50fSopenharmony_ci WMError ret = SetFullScreen(true); 1030e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 1031e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_FULL_FILL); 1032e0dac50fSopenharmony_ci } 1033e0dac50fSopenharmony_ci return ret; 1034e0dac50fSopenharmony_ci } 1035e0dac50fSopenharmony_ci 1036e0dac50fSopenharmony_ci if (isEnter && GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1037e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 1038e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 1039e0dac50fSopenharmony_ci } 1040e0dac50fSopenharmony_ci } 1041e0dac50fSopenharmony_ci property_->SetMaximizeMode(isEnter ? MaximizeMode::MODE_AVOID_SYSTEM_BAR : MaximizeMode::MODE_RECOVER); 1042e0dac50fSopenharmony_ci property_->SetWindowSizeChangeReason(WindowSizeChangeReason::RESIZE); 1043e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_MAXIMIZE_STATE); 1044e0dac50fSopenharmony_ci} 1045e0dac50fSopenharmony_ci 1046e0dac50fSopenharmony_ciWMError WindowImpl::SetAspectRatio(float ratio) 1047e0dac50fSopenharmony_ci{ 1048e0dac50fSopenharmony_ci WLOGFI("windowId: %{public}u, ratio: %{public}f", GetWindowId(), ratio); 1049e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 1050e0dac50fSopenharmony_ci WLOGFE("Invalid operation, windowId: %{public}u", GetWindowId()); 1051e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1052e0dac50fSopenharmony_ci } 1053e0dac50fSopenharmony_ci if (MathHelper::NearZero(ratio) || ratio < 0.0f) { 1054e0dac50fSopenharmony_ci WLOGFE("Invalid param, ratio: %{public}f", ratio); 1055e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1056e0dac50fSopenharmony_ci } 1057e0dac50fSopenharmony_ci property_->SetAspectRatio(ratio); 1058e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1059e0dac50fSopenharmony_ci WLOGFD("window is hidden or created! id: %{public}u, ratio: %{public}f ", property_->GetWindowId(), ratio); 1060e0dac50fSopenharmony_ci return WMError::WM_OK; 1061e0dac50fSopenharmony_ci } 1062e0dac50fSopenharmony_ci auto ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_ASPECT_RATIO); 1063e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1064e0dac50fSopenharmony_ci WLOGFE("Set AspectRatio failed. errorCode: %{public}u", ret); 1065e0dac50fSopenharmony_ci } 1066e0dac50fSopenharmony_ci return ret; 1067e0dac50fSopenharmony_ci} 1068e0dac50fSopenharmony_ci 1069e0dac50fSopenharmony_ciWMError WindowImpl::ResetAspectRatio() 1070e0dac50fSopenharmony_ci{ 1071e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1072e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Window is invalid"); 1073e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1074e0dac50fSopenharmony_ci } 1075e0dac50fSopenharmony_ci 1076e0dac50fSopenharmony_ci WLOGFI("windowId: %{public}u", GetWindowId()); 1077e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 1078e0dac50fSopenharmony_ci WLOGFE("Invalid operation, windowId: %{public}u", GetWindowId()); 1079e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1080e0dac50fSopenharmony_ci } 1081e0dac50fSopenharmony_ci property_->SetAspectRatio(0.0); 1082e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1083e0dac50fSopenharmony_ci WLOGFD("window is hidden or created! id: %{public}u", property_->GetWindowId()); 1084e0dac50fSopenharmony_ci return WMError::WM_OK; 1085e0dac50fSopenharmony_ci } 1086e0dac50fSopenharmony_ci UpdateProperty(PropertyChangeAction::ACTION_UPDATE_ASPECT_RATIO); 1087e0dac50fSopenharmony_ci return WMError::WM_OK; 1088e0dac50fSopenharmony_ci} 1089e0dac50fSopenharmony_ci 1090e0dac50fSopenharmony_civoid WindowImpl::MapFloatingWindowToAppIfNeeded() 1091e0dac50fSopenharmony_ci{ 1092e0dac50fSopenharmony_ci if (!WindowHelper::IsAppFloatingWindow(GetType()) || context_.get() == nullptr) { 1093e0dac50fSopenharmony_ci return; 1094e0dac50fSopenharmony_ci } 1095e0dac50fSopenharmony_ci 1096e0dac50fSopenharmony_ci WLOGFI("In"); 1097e0dac50fSopenharmony_ci for (const auto& winPair : windowMap_) { 1098e0dac50fSopenharmony_ci auto win = winPair.second.second; 1099e0dac50fSopenharmony_ci if (win->GetType() == WindowType::WINDOW_TYPE_APP_MAIN_WINDOW && 1100e0dac50fSopenharmony_ci context_.get() == win->GetContext().get()) { 1101e0dac50fSopenharmony_ci sptr<WindowImpl> selfImpl(this); 1102e0dac50fSopenharmony_ci appFloatingWindowMap_[win->GetWindowId()].push_back(selfImpl); 1103e0dac50fSopenharmony_ci WLOGFD("Map FloatingWindow %{public}u to AppMainWindow %{public}u, type is %{public}u", 1104e0dac50fSopenharmony_ci GetWindowId(), win->GetWindowId(), GetType()); 1105e0dac50fSopenharmony_ci return; 1106e0dac50fSopenharmony_ci } 1107e0dac50fSopenharmony_ci } 1108e0dac50fSopenharmony_ci} 1109e0dac50fSopenharmony_ci 1110e0dac50fSopenharmony_civoid WindowImpl::MapDialogWindowToAppIfNeeded() 1111e0dac50fSopenharmony_ci{ 1112e0dac50fSopenharmony_ci if (GetType() != WindowType::WINDOW_TYPE_DIALOG) { 1113e0dac50fSopenharmony_ci return; 1114e0dac50fSopenharmony_ci } 1115e0dac50fSopenharmony_ci 1116e0dac50fSopenharmony_ci for (const auto& winPair : windowMap_) { 1117e0dac50fSopenharmony_ci auto win = winPair.second.second; 1118e0dac50fSopenharmony_ci if (win->GetType() == WindowType::WINDOW_TYPE_APP_MAIN_WINDOW && 1119e0dac50fSopenharmony_ci context_.get() == win->GetContext().get()) { 1120e0dac50fSopenharmony_ci sptr<WindowImpl> selfImpl(this); 1121e0dac50fSopenharmony_ci appDialogWindowMap_[win->GetWindowId()].push_back(selfImpl); 1122e0dac50fSopenharmony_ci WLOGFD("Map DialogWindow %{public}u to AppMainWindow %{public}u", GetWindowId(), win->GetWindowId()); 1123e0dac50fSopenharmony_ci return; 1124e0dac50fSopenharmony_ci } 1125e0dac50fSopenharmony_ci } 1126e0dac50fSopenharmony_ci} 1127e0dac50fSopenharmony_ci 1128e0dac50fSopenharmony_ciWMError WindowImpl::UpdateProperty(PropertyChangeAction action) 1129e0dac50fSopenharmony_ci{ 1130e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().UpdateProperty(property_, action); 1131e0dac50fSopenharmony_ci} 1132e0dac50fSopenharmony_ci 1133e0dac50fSopenharmony_civoid WindowImpl::GetConfigurationFromAbilityInfo() 1134e0dac50fSopenharmony_ci{ 1135e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 1136e0dac50fSopenharmony_ci if (abilityContext == nullptr) { 1137e0dac50fSopenharmony_ci WLOGFE("id:%{public}u is not ability Window", property_->GetWindowId()); 1138e0dac50fSopenharmony_ci return; 1139e0dac50fSopenharmony_ci } 1140e0dac50fSopenharmony_ci auto abilityInfo = abilityContext->GetAbilityInfo(); 1141e0dac50fSopenharmony_ci if (abilityInfo == nullptr) { 1142e0dac50fSopenharmony_ci WLOGFE("id:%{public}u Ability window get ability info failed", property_->GetWindowId()); 1143e0dac50fSopenharmony_ci return; 1144e0dac50fSopenharmony_ci } 1145e0dac50fSopenharmony_ci 1146e0dac50fSopenharmony_ci // get support modes configuration 1147e0dac50fSopenharmony_ci uint32_t modeSupportInfo = WindowHelper::ConvertSupportModesToSupportInfo(abilityInfo->windowModes); 1148e0dac50fSopenharmony_ci if (modeSupportInfo == 0) { 1149e0dac50fSopenharmony_ci WLOGFD("mode config param is 0, all modes is supported"); 1150e0dac50fSopenharmony_ci modeSupportInfo = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL; 1151e0dac50fSopenharmony_ci } 1152e0dac50fSopenharmony_ci WLOGFD("winId: %{public}u, modeSupportInfo: %{public}u", GetWindowId(), modeSupportInfo); 1153e0dac50fSopenharmony_ci SetRequestModeSupportInfo(modeSupportInfo); 1154e0dac50fSopenharmony_ci 1155e0dac50fSopenharmony_ci // get window size limits configuration 1156e0dac50fSopenharmony_ci WindowLimits sizeLimits; 1157e0dac50fSopenharmony_ci sizeLimits.maxWidth_ = abilityInfo->maxWindowWidth; 1158e0dac50fSopenharmony_ci sizeLimits.maxHeight_ = abilityInfo->maxWindowHeight; 1159e0dac50fSopenharmony_ci sizeLimits.minWidth_ = abilityInfo->minWindowWidth; 1160e0dac50fSopenharmony_ci sizeLimits.minHeight_ = abilityInfo->minWindowHeight; 1161e0dac50fSopenharmony_ci sizeLimits.maxRatio_ = static_cast<float>(abilityInfo->maxWindowRatio); 1162e0dac50fSopenharmony_ci sizeLimits.minRatio_ = static_cast<float>(abilityInfo->minWindowRatio); 1163e0dac50fSopenharmony_ci property_->SetSizeLimits(sizeLimits); 1164e0dac50fSopenharmony_ci 1165e0dac50fSopenharmony_ci // get orientation configuration 1166e0dac50fSopenharmony_ci OHOS::AppExecFwk::DisplayOrientation displayOrientation = 1167e0dac50fSopenharmony_ci static_cast<OHOS::AppExecFwk::DisplayOrientation>( 1168e0dac50fSopenharmony_ci static_cast<uint32_t>(abilityInfo->orientation)); 1169e0dac50fSopenharmony_ci if (ABILITY_TO_WMS_ORIENTATION_MAP.count(displayOrientation) == 0) { 1170e0dac50fSopenharmony_ci WLOGFE("id:%{public}u Do not support this Orientation type", property_->GetWindowId()); 1171e0dac50fSopenharmony_ci return; 1172e0dac50fSopenharmony_ci } 1173e0dac50fSopenharmony_ci Orientation orientation = ABILITY_TO_WMS_ORIENTATION_MAP.at(displayOrientation); 1174e0dac50fSopenharmony_ci if (orientation < Orientation::BEGIN || orientation > Orientation::END) { 1175e0dac50fSopenharmony_ci WLOGFE("Set orientation from ability failed"); 1176e0dac50fSopenharmony_ci return; 1177e0dac50fSopenharmony_ci } 1178e0dac50fSopenharmony_ci property_->SetRequestedOrientation(orientation); 1179e0dac50fSopenharmony_ci} 1180e0dac50fSopenharmony_ci 1181e0dac50fSopenharmony_civoid WindowImpl::UpdateTitleButtonVisibility() 1182e0dac50fSopenharmony_ci{ 1183e0dac50fSopenharmony_ci WLOGFD("[Client] UpdateTitleButtonVisibility"); 1184e0dac50fSopenharmony_ci if (uiContent_ == nullptr || !IsDecorEnable()) { 1185e0dac50fSopenharmony_ci return; 1186e0dac50fSopenharmony_ci } 1187e0dac50fSopenharmony_ci auto modeSupportInfo = GetModeSupportInfo(); 1188e0dac50fSopenharmony_ci bool hideSplitButton = !(modeSupportInfo & WindowModeSupport::WINDOW_MODE_SUPPORT_SPLIT_PRIMARY); 1189e0dac50fSopenharmony_ci // not support fullscreen in split and floating mode, or not support float in fullscreen mode 1190e0dac50fSopenharmony_ci bool hideMaximizeButton = (!(modeSupportInfo & WindowModeSupport::WINDOW_MODE_SUPPORT_FULLSCREEN) && 1191e0dac50fSopenharmony_ci (GetMode() == WindowMode::WINDOW_MODE_FLOATING || WindowHelper::IsSplitWindowMode(GetMode()))) || 1192e0dac50fSopenharmony_ci (!(modeSupportInfo & WindowModeSupport::WINDOW_MODE_SUPPORT_FLOATING) && 1193e0dac50fSopenharmony_ci GetMode() == WindowMode::WINDOW_MODE_FULLSCREEN); 1194e0dac50fSopenharmony_ci WLOGD("[Client] [hideSplit, hideMaximize]: [%{public}d, %{public}d]", hideSplitButton, hideMaximizeButton); 1195e0dac50fSopenharmony_ci uiContent_->HideWindowTitleButton(hideSplitButton, hideMaximizeButton, false, false); 1196e0dac50fSopenharmony_ci} 1197e0dac50fSopenharmony_ci 1198e0dac50fSopenharmony_cibool WindowImpl::IsAppMainOrSubOrFloatingWindow() 1199e0dac50fSopenharmony_ci{ 1200e0dac50fSopenharmony_ci // App main window need decor config, stretchable config and effect config 1201e0dac50fSopenharmony_ci // App sub window and float window need effect config 1202e0dac50fSopenharmony_ci if (WindowHelper::IsAppWindow(GetType())) { 1203e0dac50fSopenharmony_ci return true; 1204e0dac50fSopenharmony_ci } 1205e0dac50fSopenharmony_ci 1206e0dac50fSopenharmony_ci if (WindowHelper::IsAppFloatingWindow(GetType())) { 1207e0dac50fSopenharmony_ci for (const auto& winPair : windowMap_) { 1208e0dac50fSopenharmony_ci auto win = winPair.second.second; 1209e0dac50fSopenharmony_ci if (win != nullptr && win->GetType() == WindowType::WINDOW_TYPE_APP_MAIN_WINDOW && 1210e0dac50fSopenharmony_ci context_.get() == win->GetContext().get()) { 1211e0dac50fSopenharmony_ci isAppFloatingWindow_ = true; 1212e0dac50fSopenharmony_ci return true; 1213e0dac50fSopenharmony_ci } 1214e0dac50fSopenharmony_ci } 1215e0dac50fSopenharmony_ci } 1216e0dac50fSopenharmony_ci return false; 1217e0dac50fSopenharmony_ci} 1218e0dac50fSopenharmony_ci 1219e0dac50fSopenharmony_civoid WindowImpl::SetSystemConfig() 1220e0dac50fSopenharmony_ci{ 1221e0dac50fSopenharmony_ci if (!IsAppMainOrSubOrFloatingWindow()) { 1222e0dac50fSopenharmony_ci return; 1223e0dac50fSopenharmony_ci } 1224e0dac50fSopenharmony_ci if (SingletonContainer::Get<WindowAdapter>().GetSystemConfig(windowSystemConfig_) == WMError::WM_OK) { 1225e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 1226e0dac50fSopenharmony_ci WLOGFD("get system decor enable:%{public}d", windowSystemConfig_.isSystemDecorEnable_); 1227e0dac50fSopenharmony_ci property_->SetDecorEnable(windowSystemConfig_.isSystemDecorEnable_); 1228e0dac50fSopenharmony_ci WLOGFD("get stretchable enable:%{public}d", windowSystemConfig_.isStretchable_); 1229e0dac50fSopenharmony_ci property_->SetStretchable(windowSystemConfig_.isStretchable_); 1230e0dac50fSopenharmony_ci // if window mode is undefined, set it from configuration 1231e0dac50fSopenharmony_ci if (property_->GetWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { 1232e0dac50fSopenharmony_ci WLOGFD("get default window mode:%{public}u", windowSystemConfig_.defaultWindowMode_); 1233e0dac50fSopenharmony_ci property_->SetWindowMode(windowSystemConfig_.defaultWindowMode_); 1234e0dac50fSopenharmony_ci } 1235e0dac50fSopenharmony_ci if (property_->GetLastWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { 1236e0dac50fSopenharmony_ci property_->SetLastWindowMode(windowSystemConfig_.defaultWindowMode_); 1237e0dac50fSopenharmony_ci } 1238e0dac50fSopenharmony_ci } 1239e0dac50fSopenharmony_ci } 1240e0dac50fSopenharmony_ci} 1241e0dac50fSopenharmony_ci 1242e0dac50fSopenharmony_ciKeyboardAnimationConfig WindowImpl::GetKeyboardAnimationConfig() 1243e0dac50fSopenharmony_ci{ 1244e0dac50fSopenharmony_ci return { windowSystemConfig_.animationIn_, windowSystemConfig_.animationOut_ }; 1245e0dac50fSopenharmony_ci} 1246e0dac50fSopenharmony_ci 1247e0dac50fSopenharmony_ciWMError WindowImpl::WindowCreateCheck(uint32_t parentId) 1248e0dac50fSopenharmony_ci{ 1249e0dac50fSopenharmony_ci if (vsyncStation_ == nullptr || !vsyncStation_->IsVsyncReceiverCreated()) { 1250e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 1251e0dac50fSopenharmony_ci } 1252e0dac50fSopenharmony_ci // check window name, same window names are forbidden 1253e0dac50fSopenharmony_ci if (windowMap_.find(name_) != windowMap_.end()) { 1254e0dac50fSopenharmony_ci WLOGFE("WindowName(%{public}s) already exists.", name_.c_str()); 1255e0dac50fSopenharmony_ci return WMError::WM_ERROR_REPEAT_OPERATION; 1256e0dac50fSopenharmony_ci } 1257e0dac50fSopenharmony_ci if (CheckCameraFloatingWindowMultiCreated(property_->GetWindowType())) { 1258e0dac50fSopenharmony_ci WLOGFE("Camera Floating Window already exists."); 1259e0dac50fSopenharmony_ci return WMError::WM_ERROR_REPEAT_OPERATION; 1260e0dac50fSopenharmony_ci } 1261e0dac50fSopenharmony_ci if (parentId == INVALID_WINDOW_ID) { 1262e0dac50fSopenharmony_ci if (WindowHelper::IsSystemSubWindow(property_->GetWindowType()) || 1263e0dac50fSopenharmony_ci WindowHelper::IsSubWindow(property_->GetWindowType())) { 1264e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1265e0dac50fSopenharmony_ci } 1266e0dac50fSopenharmony_ci return WMError::WM_OK; 1267e0dac50fSopenharmony_ci } 1268e0dac50fSopenharmony_ci 1269e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_APP_COMPONENT) { 1270e0dac50fSopenharmony_ci property_->SetParentId(parentId); 1271e0dac50fSopenharmony_ci } else { 1272e0dac50fSopenharmony_ci sptr<Window> parentWindow = nullptr; 1273e0dac50fSopenharmony_ci for (const auto& winPair : windowMap_) { 1274e0dac50fSopenharmony_ci if (winPair.second.first == parentId) { 1275e0dac50fSopenharmony_ci property_->SetParentId(parentId); 1276e0dac50fSopenharmony_ci parentWindow = winPair.second.second; 1277e0dac50fSopenharmony_ci break; 1278e0dac50fSopenharmony_ci } 1279e0dac50fSopenharmony_ci } 1280e0dac50fSopenharmony_ci if (WindowHelper::IsSystemSubWindow(property_->GetWindowType())) { 1281e0dac50fSopenharmony_ci if (parentWindow == nullptr) { 1282e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1283e0dac50fSopenharmony_ci } 1284e0dac50fSopenharmony_ci if (!parentWindow->IsAllowHaveSystemSubWindow()) { 1285e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1286e0dac50fSopenharmony_ci } 1287e0dac50fSopenharmony_ci } 1288e0dac50fSopenharmony_ci } 1289e0dac50fSopenharmony_ci if (property_->GetParentId() != parentId) { 1290e0dac50fSopenharmony_ci WLOGFE("Parent Window does not exist. ParentId is %{public}u", parentId); 1291e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1292e0dac50fSopenharmony_ci } 1293e0dac50fSopenharmony_ci 1294e0dac50fSopenharmony_ci return WMError::WM_OK; 1295e0dac50fSopenharmony_ci} 1296e0dac50fSopenharmony_ci 1297e0dac50fSopenharmony_civoid WindowImpl::ChangePropertyByApiVersion() 1298e0dac50fSopenharmony_ci{ 1299e0dac50fSopenharmony_ci uint32_t version = 0; 1300e0dac50fSopenharmony_ci if ((context_ != nullptr) && (context_->GetApplicationInfo() != nullptr)) { 1301e0dac50fSopenharmony_ci version = context_->GetApplicationInfo()->apiCompatibleVersion; 1302e0dac50fSopenharmony_ci } 1303e0dac50fSopenharmony_ci // 10 ArkUI new framework support after API10 1304e0dac50fSopenharmony_ci if (version >= 10) { 1305e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 1306e0dac50fSopenharmony_ci SystemBarProperty statusSystemBarProperty(true, 0x00FFFFFF, 0xFF000000); 1307e0dac50fSopenharmony_ci SystemBarProperty navigationSystemBarProperty(true, 0x00FFFFFF, 0xFF000000); 1308e0dac50fSopenharmony_ci property_->SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusSystemBarProperty); 1309e0dac50fSopenharmony_ci property_->SetSystemBarProperty(WindowType::WINDOW_TYPE_NAVIGATION_BAR, navigationSystemBarProperty); 1310e0dac50fSopenharmony_ci } 1311e0dac50fSopenharmony_ci } 1312e0dac50fSopenharmony_ci} 1313e0dac50fSopenharmony_ci 1314e0dac50fSopenharmony_civoid WindowImpl::SetDefaultDisplayIdIfNeed() 1315e0dac50fSopenharmony_ci{ 1316e0dac50fSopenharmony_ci auto displayId = property_->GetDisplayId(); 1317e0dac50fSopenharmony_ci if (displayId == DISPLAY_ID_INVALID) { 1318e0dac50fSopenharmony_ci auto defaultDisplayId = SingletonContainer::IsDestroyed() ? DISPLAY_ID_INVALID : 1319e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDefaultDisplayId(); 1320e0dac50fSopenharmony_ci defaultDisplayId = (defaultDisplayId == DISPLAY_ID_INVALID)? 0 : defaultDisplayId; 1321e0dac50fSopenharmony_ci property_->SetDisplayId(defaultDisplayId); 1322e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Reset displayId: %{public}" PRIu64, defaultDisplayId); 1323e0dac50fSopenharmony_ci } 1324e0dac50fSopenharmony_ci} 1325e0dac50fSopenharmony_ci 1326e0dac50fSopenharmony_ciWMError WindowImpl::Create(uint32_t parentId, const std::shared_ptr<AbilityRuntime::Context>& context) 1327e0dac50fSopenharmony_ci{ 1328e0dac50fSopenharmony_ci WLOGFD("Window[%{public}s] Create", name_.c_str()); 1329e0dac50fSopenharmony_ci WMError ret = WindowCreateCheck(parentId); 1330e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1331e0dac50fSopenharmony_ci return ret; 1332e0dac50fSopenharmony_ci } 1333e0dac50fSopenharmony_ci SetDefaultDisplayIdIfNeed(); 1334e0dac50fSopenharmony_ci context_ = context; 1335e0dac50fSopenharmony_ci sptr<WindowImpl> window(this); 1336e0dac50fSopenharmony_ci sptr<IWindow> windowAgent(new WindowAgent(window)); 1337e0dac50fSopenharmony_ci static std::atomic<uint32_t> tempWindowId = 0; 1338e0dac50fSopenharmony_ci uint32_t windowId = tempWindowId++; // for test 1339e0dac50fSopenharmony_ci sptr<IRemoteObject> token = context_ ? context_->GetToken() : nullptr; 1340e0dac50fSopenharmony_ci if (token) { 1341e0dac50fSopenharmony_ci property_->SetTokenState(true); 1342e0dac50fSopenharmony_ci } 1343e0dac50fSopenharmony_ci ChangePropertyByApiVersion(); 1344e0dac50fSopenharmony_ci InitAbilityInfo(); 1345e0dac50fSopenharmony_ci SetSystemConfig(); 1346e0dac50fSopenharmony_ci 1347e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 1348e0dac50fSopenharmony_ci GetConfigurationFromAbilityInfo(); 1349e0dac50fSopenharmony_ci } else if (property_->GetWindowMode() == WindowMode::WINDOW_MODE_UNDEFINED) { 1350e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 1351e0dac50fSopenharmony_ci } 1352e0dac50fSopenharmony_ci 1353e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_VOLUME_OVERLAY && surfaceNode_) { 1354e0dac50fSopenharmony_ci surfaceNode_->SetFrameGravity(Gravity::TOP_LEFT); 1355e0dac50fSopenharmony_ci } 1356e0dac50fSopenharmony_ci 1357e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().CreateWindow(windowAgent, property_, surfaceNode_, 1358e0dac50fSopenharmony_ci windowId, token); 1359e0dac50fSopenharmony_ci RecordLifeCycleExceptionEvent(LifeCycleEvent::CREATE_EVENT, ret); 1360e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1361e0dac50fSopenharmony_ci WLOGFE("create window failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1362e0dac50fSopenharmony_ci return ret; 1363e0dac50fSopenharmony_ci } 1364e0dac50fSopenharmony_ci property_->SetWindowId(windowId); 1365e0dac50fSopenharmony_ci if (surfaceNode_) { 1366e0dac50fSopenharmony_ci surfaceNode_->SetWindowId(windowId); 1367e0dac50fSopenharmony_ci } 1368e0dac50fSopenharmony_ci sptr<Window> self(this); 1369e0dac50fSopenharmony_ci windowMap_.insert(std::make_pair(name_, std::pair<uint32_t, sptr<Window>>(windowId, self))); 1370e0dac50fSopenharmony_ci if (parentId != INVALID_WINDOW_ID) { 1371e0dac50fSopenharmony_ci subWindowMap_[property_->GetParentId()].push_back(window); 1372e0dac50fSopenharmony_ci } 1373e0dac50fSopenharmony_ci 1374e0dac50fSopenharmony_ci MapFloatingWindowToAppIfNeeded(); 1375e0dac50fSopenharmony_ci MapDialogWindowToAppIfNeeded(); 1376e0dac50fSopenharmony_ci UpdateDecorEnable(); 1377e0dac50fSopenharmony_ci 1378e0dac50fSopenharmony_ci state_ = WindowState::STATE_CREATED; 1379e0dac50fSopenharmony_ci InputTransferStation::GetInstance().AddInputWindow(self); 1380e0dac50fSopenharmony_ci needRemoveWindowInputChannel_ = true; 1381e0dac50fSopenharmony_ci return ret; 1382e0dac50fSopenharmony_ci} 1383e0dac50fSopenharmony_ci 1384e0dac50fSopenharmony_cibool WindowImpl::PreNotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) 1385e0dac50fSopenharmony_ci{ 1386e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 1387e0dac50fSopenharmony_ci return uiContent_->ProcessKeyEvent(keyEvent, true); 1388e0dac50fSopenharmony_ci } 1389e0dac50fSopenharmony_ci return false; 1390e0dac50fSopenharmony_ci} 1391e0dac50fSopenharmony_ci 1392e0dac50fSopenharmony_civoid WindowImpl::InitAbilityInfo() 1393e0dac50fSopenharmony_ci{ 1394e0dac50fSopenharmony_ci AbilityInfo info; 1395e0dac50fSopenharmony_ci info.bundleName_ = SysCapUtil::GetBundleName(); 1396e0dac50fSopenharmony_ci auto originalAbilityInfo = GetOriginalAbilityInfo(); 1397e0dac50fSopenharmony_ci if (originalAbilityInfo != nullptr) { 1398e0dac50fSopenharmony_ci info.abilityName_ = originalAbilityInfo->name; 1399e0dac50fSopenharmony_ci } else { 1400e0dac50fSopenharmony_ci WLOGFD("original ability info is null %{public}s", name_.c_str()); 1401e0dac50fSopenharmony_ci } 1402e0dac50fSopenharmony_ci property_->SetAbilityInfo(info); 1403e0dac50fSopenharmony_ci} 1404e0dac50fSopenharmony_ci 1405e0dac50fSopenharmony_cistd::shared_ptr<AppExecFwk::AbilityInfo> WindowImpl::GetOriginalAbilityInfo() const 1406e0dac50fSopenharmony_ci{ 1407e0dac50fSopenharmony_ci if (context_ == nullptr) { 1408e0dac50fSopenharmony_ci WLOGFD("context is null %{public}s", name_.c_str()); 1409e0dac50fSopenharmony_ci return nullptr; 1410e0dac50fSopenharmony_ci } 1411e0dac50fSopenharmony_ci 1412e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 1413e0dac50fSopenharmony_ci if (abilityContext == nullptr) { 1414e0dac50fSopenharmony_ci WLOGFD("abilityContext is null %{public}s", name_.c_str()); 1415e0dac50fSopenharmony_ci return nullptr; 1416e0dac50fSopenharmony_ci } 1417e0dac50fSopenharmony_ci return abilityContext->GetAbilityInfo(); 1418e0dac50fSopenharmony_ci} 1419e0dac50fSopenharmony_ci 1420e0dac50fSopenharmony_ciWMError WindowImpl::BindDialogTarget(sptr<IRemoteObject> targetToken) 1421e0dac50fSopenharmony_ci{ 1422e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1423e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1424e0dac50fSopenharmony_ci } 1425e0dac50fSopenharmony_ci uint32_t windowId = property_->GetWindowId(); 1426e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().BindDialogTarget(windowId, targetToken); 1427e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1428e0dac50fSopenharmony_ci WLOGFE("bind window failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1429e0dac50fSopenharmony_ci } 1430e0dac50fSopenharmony_ci 1431e0dac50fSopenharmony_ci return ret; 1432e0dac50fSopenharmony_ci} 1433e0dac50fSopenharmony_ci 1434e0dac50fSopenharmony_civoid WindowImpl::DestroyDialogWindow() 1435e0dac50fSopenharmony_ci{ 1436e0dac50fSopenharmony_ci // remove from appDialogWindowMap_ 1437e0dac50fSopenharmony_ci for (auto& dialogWindows: appDialogWindowMap_) { 1438e0dac50fSopenharmony_ci for (auto iter = dialogWindows.second.begin(); iter != dialogWindows.second.end(); ++iter) { 1439e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1440e0dac50fSopenharmony_ci continue; 1441e0dac50fSopenharmony_ci } 1442e0dac50fSopenharmony_ci if ((*iter)->GetWindowId() == GetWindowId()) { 1443e0dac50fSopenharmony_ci dialogWindows.second.erase(iter); 1444e0dac50fSopenharmony_ci break; 1445e0dac50fSopenharmony_ci } 1446e0dac50fSopenharmony_ci } 1447e0dac50fSopenharmony_ci } 1448e0dac50fSopenharmony_ci 1449e0dac50fSopenharmony_ci // Destroy app dialog window if exist 1450e0dac50fSopenharmony_ci if (appDialogWindowMap_.count(GetWindowId()) > 0) { 1451e0dac50fSopenharmony_ci auto& dialogWindows = appDialogWindowMap_.at(GetWindowId()); 1452e0dac50fSopenharmony_ci for (auto iter = dialogWindows.begin(); iter != dialogWindows.end(); iter = dialogWindows.begin()) { 1453e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1454e0dac50fSopenharmony_ci dialogWindows.erase(iter); 1455e0dac50fSopenharmony_ci continue; 1456e0dac50fSopenharmony_ci } 1457e0dac50fSopenharmony_ci (*iter)->Destroy(false); 1458e0dac50fSopenharmony_ci } 1459e0dac50fSopenharmony_ci appDialogWindowMap_.erase(GetWindowId()); 1460e0dac50fSopenharmony_ci } 1461e0dac50fSopenharmony_ci} 1462e0dac50fSopenharmony_ci 1463e0dac50fSopenharmony_civoid WindowImpl::DestroyFloatingWindow() 1464e0dac50fSopenharmony_ci{ 1465e0dac50fSopenharmony_ci // remove from appFloatingWindowMap_ 1466e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Remove from appFloatingWindowMap_"); 1467e0dac50fSopenharmony_ci for (auto& floatingWindows: appFloatingWindowMap_) { 1468e0dac50fSopenharmony_ci for (auto iter = floatingWindows.second.begin(); iter != floatingWindows.second.end(); ++iter) { 1469e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1470e0dac50fSopenharmony_ci continue; 1471e0dac50fSopenharmony_ci } 1472e0dac50fSopenharmony_ci if ((*iter)->GetWindowId() == GetWindowId()) { 1473e0dac50fSopenharmony_ci floatingWindows.second.erase(iter); 1474e0dac50fSopenharmony_ci break; 1475e0dac50fSopenharmony_ci } 1476e0dac50fSopenharmony_ci } 1477e0dac50fSopenharmony_ci } 1478e0dac50fSopenharmony_ci 1479e0dac50fSopenharmony_ci // Destroy app floating window if exist 1480e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Destroy app floating window if exist"); 1481e0dac50fSopenharmony_ci if (appFloatingWindowMap_.count(GetWindowId()) > 0) { 1482e0dac50fSopenharmony_ci auto& floatingWindows = appFloatingWindowMap_.at(GetWindowId()); 1483e0dac50fSopenharmony_ci for (auto iter = floatingWindows.begin(); iter != floatingWindows.end(); iter = floatingWindows.begin()) { 1484e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1485e0dac50fSopenharmony_ci floatingWindows.erase(iter); 1486e0dac50fSopenharmony_ci continue; 1487e0dac50fSopenharmony_ci } 1488e0dac50fSopenharmony_ci (*iter)->Destroy(); 1489e0dac50fSopenharmony_ci } 1490e0dac50fSopenharmony_ci appFloatingWindowMap_.erase(GetWindowId()); 1491e0dac50fSopenharmony_ci } 1492e0dac50fSopenharmony_ci} 1493e0dac50fSopenharmony_ci 1494e0dac50fSopenharmony_civoid WindowImpl::DestroySubWindow() 1495e0dac50fSopenharmony_ci{ 1496e0dac50fSopenharmony_ci if (subWindowMap_.count(property_->GetParentId()) > 0) { // remove from subWindowMap_ 1497e0dac50fSopenharmony_ci auto& subWindows = subWindowMap_.at(property_->GetParentId()); 1498e0dac50fSopenharmony_ci for (auto iter = subWindows.begin(); iter < subWindows.end(); ++iter) { 1499e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1500e0dac50fSopenharmony_ci continue; 1501e0dac50fSopenharmony_ci } 1502e0dac50fSopenharmony_ci if ((*iter)->GetWindowId() == GetWindowId()) { 1503e0dac50fSopenharmony_ci subWindows.erase(iter); 1504e0dac50fSopenharmony_ci break; 1505e0dac50fSopenharmony_ci } 1506e0dac50fSopenharmony_ci } 1507e0dac50fSopenharmony_ci } 1508e0dac50fSopenharmony_ci 1509e0dac50fSopenharmony_ci if (subWindowMap_.count(GetWindowId()) > 0) { // remove from subWindowMap_ and windowMap_ 1510e0dac50fSopenharmony_ci auto& subWindows = subWindowMap_.at(GetWindowId()); 1511e0dac50fSopenharmony_ci for (auto iter = subWindows.begin(); iter != subWindows.end(); iter = subWindows.begin()) { 1512e0dac50fSopenharmony_ci if ((*iter) == nullptr) { 1513e0dac50fSopenharmony_ci subWindows.erase(iter); 1514e0dac50fSopenharmony_ci continue; 1515e0dac50fSopenharmony_ci } 1516e0dac50fSopenharmony_ci (*iter)->Destroy(false); 1517e0dac50fSopenharmony_ci } 1518e0dac50fSopenharmony_ci subWindowMap_[GetWindowId()].clear(); 1519e0dac50fSopenharmony_ci subWindowMap_.erase(GetWindowId()); 1520e0dac50fSopenharmony_ci } 1521e0dac50fSopenharmony_ci} 1522e0dac50fSopenharmony_ci 1523e0dac50fSopenharmony_civoid WindowImpl::ClearVsyncStation() 1524e0dac50fSopenharmony_ci{ 1525e0dac50fSopenharmony_ci if (vsyncStation_ != nullptr) { 1526e0dac50fSopenharmony_ci vsyncStation_->Destroy(); 1527e0dac50fSopenharmony_ci } 1528e0dac50fSopenharmony_ci} 1529e0dac50fSopenharmony_ci 1530e0dac50fSopenharmony_ciWMError WindowImpl::Destroy() 1531e0dac50fSopenharmony_ci{ 1532e0dac50fSopenharmony_ci return Destroy(true); 1533e0dac50fSopenharmony_ci} 1534e0dac50fSopenharmony_ci 1535e0dac50fSopenharmony_ciWMError WindowImpl::Destroy(bool needNotifyServer, bool needClearListener) 1536e0dac50fSopenharmony_ci{ 1537e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1538e0dac50fSopenharmony_ci return WMError::WM_OK; 1539e0dac50fSopenharmony_ci } 1540e0dac50fSopenharmony_ci 1541e0dac50fSopenharmony_ci WLOGI("Window %{public}u Destroy", property_->GetWindowId()); 1542e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 1543e0dac50fSopenharmony_ci if (needNotifyServer) { 1544e0dac50fSopenharmony_ci NotifyBeforeDestroy(GetWindowName()); 1545e0dac50fSopenharmony_ci if (subWindowMap_.count(GetWindowId()) > 0) { 1546e0dac50fSopenharmony_ci for (auto& subWindow : subWindowMap_.at(GetWindowId())) { 1547e0dac50fSopenharmony_ci NotifyBeforeSubWindowDestroy(subWindow); 1548e0dac50fSopenharmony_ci } 1549e0dac50fSopenharmony_ci } 1550e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().DestroyWindow(property_->GetWindowId()); 1551e0dac50fSopenharmony_ci RecordLifeCycleExceptionEvent(LifeCycleEvent::DESTROY_EVENT, ret); 1552e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1553e0dac50fSopenharmony_ci WLOGFE("destroy window failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1554e0dac50fSopenharmony_ci if (GetType() != WindowType::WINDOW_TYPE_DIALOG) { 1555e0dac50fSopenharmony_ci return ret; 1556e0dac50fSopenharmony_ci } 1557e0dac50fSopenharmony_ci } 1558e0dac50fSopenharmony_ci } else { 1559e0dac50fSopenharmony_ci WLOGI("no need to destroy"); 1560e0dac50fSopenharmony_ci } 1561e0dac50fSopenharmony_ci 1562e0dac50fSopenharmony_ci if (needRemoveWindowInputChannel_) { 1563e0dac50fSopenharmony_ci InputTransferStation::GetInstance().RemoveInputWindow(property_->GetWindowId()); 1564e0dac50fSopenharmony_ci } 1565e0dac50fSopenharmony_ci windowMap_.erase(GetWindowName()); 1566e0dac50fSopenharmony_ci if (needClearListener) { 1567e0dac50fSopenharmony_ci ClearListenersById(GetWindowId()); 1568e0dac50fSopenharmony_ci } 1569e0dac50fSopenharmony_ci DestroySubWindow(); 1570e0dac50fSopenharmony_ci DestroyFloatingWindow(); 1571e0dac50fSopenharmony_ci DestroyDialogWindow(); 1572e0dac50fSopenharmony_ci ClearVsyncStation(); 1573e0dac50fSopenharmony_ci { 1574e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1575e0dac50fSopenharmony_ci state_ = WindowState::STATE_DESTROYED; 1576e0dac50fSopenharmony_ci } 1577e0dac50fSopenharmony_ci return ret; 1578e0dac50fSopenharmony_ci} 1579e0dac50fSopenharmony_ci 1580e0dac50fSopenharmony_cibool WindowImpl::NeedToStopShowing() 1581e0dac50fSopenharmony_ci{ 1582e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(property_->GetWindowType())) { 1583e0dac50fSopenharmony_ci return false; 1584e0dac50fSopenharmony_ci } 1585e0dac50fSopenharmony_ci // show failed when current mode is not support or window only supports split mode and can show when locked 1586e0dac50fSopenharmony_ci bool isShowWhenLocked = GetWindowFlags() & static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED); 1587e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), GetMode()) || 1588e0dac50fSopenharmony_ci WindowHelper::IsOnlySupportSplitAndShowWhenLocked(isShowWhenLocked, GetModeSupportInfo())) { 1589e0dac50fSopenharmony_ci WLOGFE("current mode is not supported, windowId: %{public}u, modeSupportInfo: %{public}u, winMode: %{public}u", 1590e0dac50fSopenharmony_ci property_->GetWindowId(), GetModeSupportInfo(), GetMode()); 1591e0dac50fSopenharmony_ci return true; 1592e0dac50fSopenharmony_ci } 1593e0dac50fSopenharmony_ci return false; 1594e0dac50fSopenharmony_ci} 1595e0dac50fSopenharmony_ci 1596e0dac50fSopenharmony_ciWMError WindowImpl::UpdateSurfaceNodeAfterCustomAnimation(bool isAdd) 1597e0dac50fSopenharmony_ci{ 1598e0dac50fSopenharmony_ci WLOGI("id: %{public}u UpdateRsTree, isAdd:%{public}u", 1599e0dac50fSopenharmony_ci property_->GetWindowId(), isAdd); 1600e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1601e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1602e0dac50fSopenharmony_ci } 1603e0dac50fSopenharmony_ci if (!WindowHelper::IsSystemWindow(property_->GetWindowType())) { 1604e0dac50fSopenharmony_ci WLOGFE("only system window can set"); 1605e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1606e0dac50fSopenharmony_ci } 1607e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(false); // false means update rs tree with default option 1608e0dac50fSopenharmony_ci // need time out check 1609e0dac50fSopenharmony_ci WMError ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_ANIMATION_FLAG); 1610e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1611e0dac50fSopenharmony_ci WLOGFE("UpdateProperty failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1612e0dac50fSopenharmony_ci return ret; 1613e0dac50fSopenharmony_ci } 1614e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().UpdateRsTree(property_->GetWindowId(), isAdd); 1615e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1616e0dac50fSopenharmony_ci WLOGFE("UpdateRsTree failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1617e0dac50fSopenharmony_ci return ret; 1618e0dac50fSopenharmony_ci } 1619e0dac50fSopenharmony_ci return WMError::WM_OK; 1620e0dac50fSopenharmony_ci} 1621e0dac50fSopenharmony_ci 1622e0dac50fSopenharmony_civoid WindowImpl::AdjustWindowAnimationFlag(bool withAnimation) 1623e0dac50fSopenharmony_ci{ 1624e0dac50fSopenharmony_ci // when show/hide with animation 1625e0dac50fSopenharmony_ci // use custom animation when transitionController exists; else use default animation 1626e0dac50fSopenharmony_ci WindowType winType = property_->GetWindowType(); 1627e0dac50fSopenharmony_ci bool isAppWindow = WindowHelper::IsAppWindow(winType); 1628e0dac50fSopenharmony_ci if (withAnimation && !isAppWindow && animationTransitionController_) { 1629e0dac50fSopenharmony_ci // use custom animation 1630e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::CUSTOM)); 1631e0dac50fSopenharmony_ci } else if ((isAppWindow && needDefaultAnimation_) || (withAnimation && !animationTransitionController_)) { 1632e0dac50fSopenharmony_ci // use default animation 1633e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::DEFAULT)); 1634e0dac50fSopenharmony_ci } else if (winType == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) { 1635e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::INPUTE)); 1636e0dac50fSopenharmony_ci } else { 1637e0dac50fSopenharmony_ci // with no animation 1638e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::NONE)); 1639e0dac50fSopenharmony_ci } 1640e0dac50fSopenharmony_ci} 1641e0dac50fSopenharmony_ci 1642e0dac50fSopenharmony_ciWMError WindowImpl::PreProcessShow(uint32_t reason, bool withAnimation) 1643e0dac50fSopenharmony_ci{ 1644e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_FROZEN) { 1645e0dac50fSopenharmony_ci WLOGFE("window is frozen, can not be shown, windowId: %{public}u", property_->GetWindowId()); 1646e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1647e0dac50fSopenharmony_ci } 1648e0dac50fSopenharmony_ci SetDefaultOption(); 1649e0dac50fSopenharmony_ci SetModeSupportInfo(GetRequestModeSupportInfo()); 1650e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(withAnimation); 1651e0dac50fSopenharmony_ci 1652e0dac50fSopenharmony_ci if (NeedToStopShowing()) { // true means stop showing 1653e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW_MODE_OR_SIZE; 1654e0dac50fSopenharmony_ci } 1655e0dac50fSopenharmony_ci 1656e0dac50fSopenharmony_ci // update title button visibility when show 1657e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 1658e0dac50fSopenharmony_ci return WMError::WM_OK; 1659e0dac50fSopenharmony_ci} 1660e0dac50fSopenharmony_ci 1661e0dac50fSopenharmony_ciWMError WindowImpl::Show(uint32_t reason, bool withAnimation, bool withFocus) 1662e0dac50fSopenharmony_ci{ 1663e0dac50fSopenharmony_ci HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, __PRETTY_FUNCTION__); 1664e0dac50fSopenharmony_ci WLOGFD("Window Show [name:%{public}s, id:%{public}u, mode: %{public}u], reason:%{public}u, " 1665e0dac50fSopenharmony_ci "withAnimation:%{public}d", name_.c_str(), property_->GetWindowId(), GetMode(), reason, withAnimation); 1666e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1667e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1668e0dac50fSopenharmony_ci } 1669e0dac50fSopenharmony_ci UpdateDecorEnable(true); 1670e0dac50fSopenharmony_ci if (static_cast<WindowStateChangeReason>(reason) == WindowStateChangeReason::KEYGUARD || 1671e0dac50fSopenharmony_ci static_cast<WindowStateChangeReason>(reason) == WindowStateChangeReason::TOGGLING) { 1672e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 1673e0dac50fSopenharmony_ci NotifyAfterForeground(); 1674e0dac50fSopenharmony_ci return WMError::WM_OK; 1675e0dac50fSopenharmony_ci } 1676e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1677e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_DESKTOP) { 1678e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().MinimizeAllAppWindows(property_->GetDisplayId()); 1679e0dac50fSopenharmony_ci } else { 1680e0dac50fSopenharmony_ci WLOGI("window is already shown id: %{public}u", property_->GetWindowId()); 1681e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().ProcessPointDown(property_->GetWindowId(), false); 1682e0dac50fSopenharmony_ci } 1683e0dac50fSopenharmony_ci // when show sub window, check its parent state 1684e0dac50fSopenharmony_ci sptr<Window> parent = FindWindowById(property_->GetParentId()); 1685e0dac50fSopenharmony_ci if (parent != nullptr && parent->GetWindowState() == WindowState::STATE_HIDDEN) { 1686e0dac50fSopenharmony_ci WLOGFD("sub window can not show, because main window hide"); 1687e0dac50fSopenharmony_ci return WMError::WM_OK; 1688e0dac50fSopenharmony_ci } else { 1689e0dac50fSopenharmony_ci NotifyAfterForeground(true, false); 1690e0dac50fSopenharmony_ci } 1691e0dac50fSopenharmony_ci return WMError::WM_OK; 1692e0dac50fSopenharmony_ci } 1693e0dac50fSopenharmony_ci WMError ret = PreProcessShow(reason, withAnimation); 1694e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1695e0dac50fSopenharmony_ci NotifyForegroundFailed(ret); 1696e0dac50fSopenharmony_ci return ret; 1697e0dac50fSopenharmony_ci } 1698e0dac50fSopenharmony_ci // this lock solves the multithreading problem when reading WindowState 1699e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(windowStateMutex_); 1700e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().AddWindow(property_); 1701e0dac50fSopenharmony_ci RecordLifeCycleExceptionEvent(LifeCycleEvent::SHOW_EVENT, ret); 1702e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 1703e0dac50fSopenharmony_ci UpdateWindowStateWhenShow(); 1704e0dac50fSopenharmony_ci } else { 1705e0dac50fSopenharmony_ci NotifyForegroundFailed(ret); 1706e0dac50fSopenharmony_ci WLOGFE("show window id:%{public}u errCode:%{public}d", property_->GetWindowId(), static_cast<int32_t>(ret)); 1707e0dac50fSopenharmony_ci } 1708e0dac50fSopenharmony_ci // systemui make startbar resident, when refactor immersive, this code can delete 1709e0dac50fSopenharmony_ci if (property_->GetRequestedOrientation() == Orientation::HORIZONTAL 1710e0dac50fSopenharmony_ci || property_->GetRequestedOrientation() == Orientation::REVERSE_HORIZONTAL) { 1711e0dac50fSopenharmony_ci RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 1712e0dac50fSopenharmony_ci } 1713e0dac50fSopenharmony_ci needNotifyFocusLater_ = false; 1714e0dac50fSopenharmony_ci return ret; 1715e0dac50fSopenharmony_ci} 1716e0dac50fSopenharmony_ci 1717e0dac50fSopenharmony_ciWMError WindowImpl::Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits) 1718e0dac50fSopenharmony_ci{ 1719e0dac50fSopenharmony_ci WLOGD("id:%{public}u Hide, reason:%{public}u, Animation:%{public}d", 1720e0dac50fSopenharmony_ci property_->GetWindowId(), reason, withAnimation); 1721e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1722e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1723e0dac50fSopenharmony_ci } 1724e0dac50fSopenharmony_ci WindowStateChangeReason stateChangeReason = static_cast<WindowStateChangeReason>(reason); 1725e0dac50fSopenharmony_ci if (stateChangeReason == WindowStateChangeReason::KEYGUARD || 1726e0dac50fSopenharmony_ci stateChangeReason == WindowStateChangeReason::TOGGLING) { 1727e0dac50fSopenharmony_ci state_ = stateChangeReason == WindowStateChangeReason::KEYGUARD ? 1728e0dac50fSopenharmony_ci WindowState::STATE_FROZEN : WindowState::STATE_HIDDEN; 1729e0dac50fSopenharmony_ci NotifyAfterBackground(); 1730e0dac50fSopenharmony_ci return WMError::WM_OK; 1731e0dac50fSopenharmony_ci } 1732e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1733e0dac50fSopenharmony_ci WLOGI("already hidden, id: %{public}u", property_->GetWindowId()); 1734e0dac50fSopenharmony_ci NotifyBackgroundFailed(WMError::WM_DO_NOTHING); 1735e0dac50fSopenharmony_ci return WMError::WM_OK; 1736e0dac50fSopenharmony_ci } 1737e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 1738e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(property_->GetWindowType())) { 1739e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(withAnimation); 1740e0dac50fSopenharmony_ci // when show(true) with default, hide() with None, to adjust animationFlag to disabled default animation 1741e0dac50fSopenharmony_ci ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_ANIMATION_FLAG); 1742e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1743e0dac50fSopenharmony_ci WLOGFE("UpdateProperty failed with errCode:%{public}d", static_cast<int32_t>(ret)); 1744e0dac50fSopenharmony_ci return ret; 1745e0dac50fSopenharmony_ci } 1746e0dac50fSopenharmony_ci } 1747e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().RemoveWindow(property_->GetWindowId(), isFromInnerkits); 1748e0dac50fSopenharmony_ci RecordLifeCycleExceptionEvent(LifeCycleEvent::HIDE_EVENT, ret); 1749e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1750e0dac50fSopenharmony_ci WLOGFE("hide errCode:%{public}d for winId:%{public}u", static_cast<int32_t>(ret), property_->GetWindowId()); 1751e0dac50fSopenharmony_ci return ret; 1752e0dac50fSopenharmony_ci } 1753e0dac50fSopenharmony_ci UpdateWindowStateWhenHide(); 1754e0dac50fSopenharmony_ci uint32_t animationFlag = property_->GetAnimationFlag(); 1755e0dac50fSopenharmony_ci if (animationFlag == static_cast<uint32_t>(WindowAnimation::CUSTOM)) { 1756e0dac50fSopenharmony_ci animationTransitionController_->AnimationForHidden(); 1757e0dac50fSopenharmony_ci } 1758e0dac50fSopenharmony_ci ResetMoveOrDragState(); 1759e0dac50fSopenharmony_ci escKeyEventTriggered_ = false; 1760e0dac50fSopenharmony_ci return ret; 1761e0dac50fSopenharmony_ci} 1762e0dac50fSopenharmony_ci 1763e0dac50fSopenharmony_ciWMError WindowImpl::MoveTo(int32_t x, int32_t y, bool isMoveToGlobal) 1764e0dac50fSopenharmony_ci{ 1765e0dac50fSopenharmony_ci WLOGFD("id:%{public}d MoveTo %{public}d %{public}d", 1766e0dac50fSopenharmony_ci property_->GetWindowId(), x, y); 1767e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1768e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1769e0dac50fSopenharmony_ci } 1770e0dac50fSopenharmony_ci 1771e0dac50fSopenharmony_ci Rect rect = (WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) ? 1772e0dac50fSopenharmony_ci GetRect() : property_->GetRequestRect(); 1773e0dac50fSopenharmony_ci Rect moveRect = { x, y, rect.width_, rect.height_ }; // must keep w/h, which may maintain stashed resize info 1774e0dac50fSopenharmony_ci property_->SetRequestRect(moveRect); 1775e0dac50fSopenharmony_ci { 1776e0dac50fSopenharmony_ci // this lock solves the multithreading problem when reading WindowState 1777e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(windowStateMutex_); 1778e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1779e0dac50fSopenharmony_ci WLOGFD("window is hidden or created! id: %{public}u, oriPos: [%{public}d, %{public}d, " 1780e0dac50fSopenharmony_ci "movePos: [%{public}d, %{public}d]", property_->GetWindowId(), rect.posX_, rect.posY_, x, y); 1781e0dac50fSopenharmony_ci return WMError::WM_OK; 1782e0dac50fSopenharmony_ci } 1783e0dac50fSopenharmony_ci } 1784e0dac50fSopenharmony_ci 1785e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1786e0dac50fSopenharmony_ci WLOGFE("fullscreen window could not moveto, winId: %{public}u", GetWindowId()); 1787e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1788e0dac50fSopenharmony_ci } 1789e0dac50fSopenharmony_ci property_->SetWindowSizeChangeReason(WindowSizeChangeReason::MOVE); 1790e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_RECT); 1791e0dac50fSopenharmony_ci} 1792e0dac50fSopenharmony_ci 1793e0dac50fSopenharmony_ciWMError WindowImpl::Resize(uint32_t width, uint32_t height) 1794e0dac50fSopenharmony_ci{ 1795e0dac50fSopenharmony_ci WLOGFD("id:%{public}d Resize %{public}u %{public}u", 1796e0dac50fSopenharmony_ci property_->GetWindowId(), width, height); 1797e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1798e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1799e0dac50fSopenharmony_ci } 1800e0dac50fSopenharmony_ci 1801e0dac50fSopenharmony_ci Rect rect = (WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) ? 1802e0dac50fSopenharmony_ci GetRect() : property_->GetRequestRect(); 1803e0dac50fSopenharmony_ci Rect resizeRect = { rect.posX_, rect.posY_, width, height }; 1804e0dac50fSopenharmony_ci property_->SetRequestRect(resizeRect); 1805e0dac50fSopenharmony_ci property_->SetDecoStatus(false); 1806e0dac50fSopenharmony_ci { 1807e0dac50fSopenharmony_ci // this lock solves the multithreading problem when reading WindowState 1808e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(windowStateMutex_); 1809e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1810e0dac50fSopenharmony_ci WLOGFD("window is hidden or created! id: %{public}u, oriRect: [%{public}u, %{public}u], " 1811e0dac50fSopenharmony_ci "resizeRect: [%{public}u, %{public}u]", property_->GetWindowId(), rect.width_, 1812e0dac50fSopenharmony_ci rect.height_, width, height); 1813e0dac50fSopenharmony_ci return WMError::WM_OK; 1814e0dac50fSopenharmony_ci } 1815e0dac50fSopenharmony_ci } 1816e0dac50fSopenharmony_ci 1817e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1818e0dac50fSopenharmony_ci WLOGFE("fullscreen window could not resize, winId: %{public}u", GetWindowId()); 1819e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1820e0dac50fSopenharmony_ci } 1821e0dac50fSopenharmony_ci property_->SetWindowSizeChangeReason(WindowSizeChangeReason::RESIZE); 1822e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_RECT); 1823e0dac50fSopenharmony_ci} 1824e0dac50fSopenharmony_ci 1825e0dac50fSopenharmony_ciWMError WindowImpl::SetWindowGravity(WindowGravity gravity, uint32_t percent) 1826e0dac50fSopenharmony_ci{ 1827e0dac50fSopenharmony_ci WLOGFD("id:%{public}d SetWindowGravity %{public}u %{public}u", 1828e0dac50fSopenharmony_ci property_->GetWindowId(), gravity, percent); 1829e0dac50fSopenharmony_ci 1830e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().SetWindowGravity(property_->GetWindowId(), gravity, percent); 1831e0dac50fSopenharmony_ci} 1832e0dac50fSopenharmony_ci 1833e0dac50fSopenharmony_ciWMError WindowImpl::SetKeepScreenOn(bool keepScreenOn) 1834e0dac50fSopenharmony_ci{ 1835e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1836e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1837e0dac50fSopenharmony_ci } 1838e0dac50fSopenharmony_ci property_->SetKeepScreenOn(keepScreenOn); 1839e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1840e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_KEEP_SCREEN_ON); 1841e0dac50fSopenharmony_ci } 1842e0dac50fSopenharmony_ci return WMError::WM_OK; 1843e0dac50fSopenharmony_ci} 1844e0dac50fSopenharmony_ci 1845e0dac50fSopenharmony_cibool WindowImpl::IsKeepScreenOn() const 1846e0dac50fSopenharmony_ci{ 1847e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1848e0dac50fSopenharmony_ci return false; 1849e0dac50fSopenharmony_ci } 1850e0dac50fSopenharmony_ci return property_->IsKeepScreenOn(); 1851e0dac50fSopenharmony_ci} 1852e0dac50fSopenharmony_ci 1853e0dac50fSopenharmony_ciWMError WindowImpl::SetTurnScreenOn(bool turnScreenOn) 1854e0dac50fSopenharmony_ci{ 1855e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1856e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1857e0dac50fSopenharmony_ci } 1858e0dac50fSopenharmony_ci property_->SetTurnScreenOn(turnScreenOn); 1859e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1860e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_TURN_SCREEN_ON); 1861e0dac50fSopenharmony_ci } 1862e0dac50fSopenharmony_ci return WMError::WM_OK; 1863e0dac50fSopenharmony_ci} 1864e0dac50fSopenharmony_ci 1865e0dac50fSopenharmony_cibool WindowImpl::IsTurnScreenOn() const 1866e0dac50fSopenharmony_ci{ 1867e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1868e0dac50fSopenharmony_ci return false; 1869e0dac50fSopenharmony_ci } 1870e0dac50fSopenharmony_ci return property_->IsTurnScreenOn(); 1871e0dac50fSopenharmony_ci} 1872e0dac50fSopenharmony_ci 1873e0dac50fSopenharmony_ciWMError WindowImpl::SetBackgroundColor(uint32_t color) 1874e0dac50fSopenharmony_ci{ 1875e0dac50fSopenharmony_ci // 0xff000000: ARGB style, means Opaque color. 1876e0dac50fSopenharmony_ci const bool isAlphaZero = !(color & 0xff000000); 1877e0dac50fSopenharmony_ci auto abilityInfo = property_->GetAbilityInfo(); 1878e0dac50fSopenharmony_ci if (isAlphaZero && WindowHelper::IsMainWindow(property_->GetWindowType())) { 1879e0dac50fSopenharmony_ci auto& reportInstance = SingletonContainer::Get<WindowInfoReporter>(); 1880e0dac50fSopenharmony_ci reportInstance.ReportZeroOpacityInfoImmediately(abilityInfo.bundleName_, 1881e0dac50fSopenharmony_ci abilityInfo.abilityName_); 1882e0dac50fSopenharmony_ci } 1883e0dac50fSopenharmony_ci 1884e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 1885e0dac50fSopenharmony_ci uiContent_->SetBackgroundColor(color); 1886e0dac50fSopenharmony_ci return WMError::WM_OK; 1887e0dac50fSopenharmony_ci } 1888e0dac50fSopenharmony_ci WLOGI("ace is null, Id: %{public}u", GetWindowId()); 1889e0dac50fSopenharmony_ci if (aceAbilityHandler_ != nullptr) { 1890e0dac50fSopenharmony_ci aceAbilityHandler_->SetBackgroundColor(color); 1891e0dac50fSopenharmony_ci return WMError::WM_OK; 1892e0dac50fSopenharmony_ci } 1893e0dac50fSopenharmony_ci WLOGFE("FA mode could not set bg color: %{public}u", GetWindowId()); 1894e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1895e0dac50fSopenharmony_ci} 1896e0dac50fSopenharmony_ci 1897e0dac50fSopenharmony_ciuint32_t WindowImpl::GetBackgroundColor() const 1898e0dac50fSopenharmony_ci{ 1899e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 1900e0dac50fSopenharmony_ci return uiContent_->GetBackgroundColor(); 1901e0dac50fSopenharmony_ci } 1902e0dac50fSopenharmony_ci WLOGD("uiContent is nullptr, windowId: %{public}u, use FA mode", GetWindowId()); 1903e0dac50fSopenharmony_ci if (aceAbilityHandler_ != nullptr) { 1904e0dac50fSopenharmony_ci return aceAbilityHandler_->GetBackgroundColor(); 1905e0dac50fSopenharmony_ci } 1906e0dac50fSopenharmony_ci WLOGFE("FA mode does not get bg color: %{public}u", GetWindowId()); 1907e0dac50fSopenharmony_ci return 0xffffffff; // means no background color been set, default color is white 1908e0dac50fSopenharmony_ci} 1909e0dac50fSopenharmony_ci 1910e0dac50fSopenharmony_ciWMError WindowImpl::SetBackgroundColor(const std::string& color) 1911e0dac50fSopenharmony_ci{ 1912e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1913e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1914e0dac50fSopenharmony_ci } 1915e0dac50fSopenharmony_ci uint32_t colorValue; 1916e0dac50fSopenharmony_ci if (ColorParser::Parse(color, colorValue)) { 1917e0dac50fSopenharmony_ci WLOGD("SetBackgroundColor: window: %{public}s, value: [%{public}s, %{public}u]", 1918e0dac50fSopenharmony_ci name_.c_str(), color.c_str(), colorValue); 1919e0dac50fSopenharmony_ci return SetBackgroundColor(colorValue); 1920e0dac50fSopenharmony_ci } 1921e0dac50fSopenharmony_ci WLOGFE("invalid color string: %{public}s", color.c_str()); 1922e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1923e0dac50fSopenharmony_ci} 1924e0dac50fSopenharmony_ci 1925e0dac50fSopenharmony_ciWMError WindowImpl::SetTransparent(bool isTransparent) 1926e0dac50fSopenharmony_ci{ 1927e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1928e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1929e0dac50fSopenharmony_ci } 1930e0dac50fSopenharmony_ci ColorParam backgroundColor; 1931e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 1932e0dac50fSopenharmony_ci if (isTransparent) { 1933e0dac50fSopenharmony_ci backgroundColor.argb.alpha = 0x00; // 0x00: completely transparent 1934e0dac50fSopenharmony_ci return SetBackgroundColor(backgroundColor.value); 1935e0dac50fSopenharmony_ci } else { 1936e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 1937e0dac50fSopenharmony_ci if (backgroundColor.argb.alpha == 0x00) { 1938e0dac50fSopenharmony_ci backgroundColor.argb.alpha = 0xff; // 0xff: completely opaque 1939e0dac50fSopenharmony_ci return SetBackgroundColor(backgroundColor.value); 1940e0dac50fSopenharmony_ci } 1941e0dac50fSopenharmony_ci } 1942e0dac50fSopenharmony_ci return WMError::WM_OK; 1943e0dac50fSopenharmony_ci} 1944e0dac50fSopenharmony_ci 1945e0dac50fSopenharmony_cibool WindowImpl::IsTransparent() const 1946e0dac50fSopenharmony_ci{ 1947e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1948e0dac50fSopenharmony_ci return false; 1949e0dac50fSopenharmony_ci } 1950e0dac50fSopenharmony_ci ColorParam backgroundColor; 1951e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 1952e0dac50fSopenharmony_ci WLOGFD("color: %{public}u, alpha: %{public}u", backgroundColor.value, backgroundColor.argb.alpha); 1953e0dac50fSopenharmony_ci return backgroundColor.argb.alpha == 0x00; // 0x00: completely transparent 1954e0dac50fSopenharmony_ci} 1955e0dac50fSopenharmony_ci 1956e0dac50fSopenharmony_ciWMError WindowImpl::SetBrightness(float brightness) 1957e0dac50fSopenharmony_ci{ 1958e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1959e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1960e0dac50fSopenharmony_ci } 1961e0dac50fSopenharmony_ci if ((brightness < MINIMUM_BRIGHTNESS && 1962e0dac50fSopenharmony_ci std::fabs(brightness - UNDEFINED_BRIGHTNESS) >= std::numeric_limits<float>::min()) || 1963e0dac50fSopenharmony_ci brightness > MAXIMUM_BRIGHTNESS) { 1964e0dac50fSopenharmony_ci WLOGFE("invalid brightness value: %{public}f", brightness); 1965e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1966e0dac50fSopenharmony_ci } 1967e0dac50fSopenharmony_ci if (!WindowHelper::IsAppWindow(GetType())) { 1968e0dac50fSopenharmony_ci WLOGFE("non app window does not support set brightness, type: %{public}u", GetType()); 1969e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_TYPE; 1970e0dac50fSopenharmony_ci } 1971e0dac50fSopenharmony_ci property_->SetBrightness(brightness); 1972e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1973e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_SET_BRIGHTNESS); 1974e0dac50fSopenharmony_ci } 1975e0dac50fSopenharmony_ci return WMError::WM_OK; 1976e0dac50fSopenharmony_ci} 1977e0dac50fSopenharmony_ci 1978e0dac50fSopenharmony_cifloat WindowImpl::GetBrightness() const 1979e0dac50fSopenharmony_ci{ 1980e0dac50fSopenharmony_ci return property_->GetBrightness(); 1981e0dac50fSopenharmony_ci} 1982e0dac50fSopenharmony_ci 1983e0dac50fSopenharmony_ciWMError WindowImpl::SetCallingWindow(uint32_t windowId) 1984e0dac50fSopenharmony_ci{ 1985e0dac50fSopenharmony_ci if (!IsWindowValid()) { 1986e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1987e0dac50fSopenharmony_ci } 1988e0dac50fSopenharmony_ci property_->SetCallingWindow(windowId); 1989e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_CALLING_WINDOW); 1990e0dac50fSopenharmony_ci} 1991e0dac50fSopenharmony_ci 1992e0dac50fSopenharmony_civoid WindowImpl::RecordLifeCycleExceptionEvent(LifeCycleEvent event, WMError errCode) const 1993e0dac50fSopenharmony_ci{ 1994e0dac50fSopenharmony_ci if (!(errCode > WMError::WM_ERROR_NEED_REPORT_BASE && errCode < WMError::WM_ERROR_NEED_REPORT_END)) { 1995e0dac50fSopenharmony_ci return; 1996e0dac50fSopenharmony_ci } 1997e0dac50fSopenharmony_ci std::ostringstream oss; 1998e0dac50fSopenharmony_ci oss << "life cycle is abnormal: " << "window_name: " << name_ 1999e0dac50fSopenharmony_ci << ", id:" << GetWindowId() << ", event: " << TransferLifeCycleEventToString(event) 2000e0dac50fSopenharmony_ci << ", errCode: " << static_cast<int32_t>(errCode) << ";"; 2001e0dac50fSopenharmony_ci std::string info = oss.str(); 2002e0dac50fSopenharmony_ci WLOGI("window life cycle exception: %{public}s", info.c_str()); 2003e0dac50fSopenharmony_ci int32_t ret = HiSysEventWrite( 2004e0dac50fSopenharmony_ci OHOS::HiviewDFX::HiSysEvent::Domain::WINDOW_MANAGER, 2005e0dac50fSopenharmony_ci "WINDOW_LIFE_CYCLE_EXCEPTION", 2006e0dac50fSopenharmony_ci OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, 2007e0dac50fSopenharmony_ci "PID", getpid(), 2008e0dac50fSopenharmony_ci "UID", getuid(), 2009e0dac50fSopenharmony_ci "MSG", info); 2010e0dac50fSopenharmony_ci if (ret != 0) { 2011e0dac50fSopenharmony_ci WLOGFE("Write HiSysEvent error, ret:%{public}d", ret); 2012e0dac50fSopenharmony_ci } 2013e0dac50fSopenharmony_ci} 2014e0dac50fSopenharmony_ci 2015e0dac50fSopenharmony_cistd::string WindowImpl::TransferLifeCycleEventToString(LifeCycleEvent type) const 2016e0dac50fSopenharmony_ci{ 2017e0dac50fSopenharmony_ci std::string event; 2018e0dac50fSopenharmony_ci switch (type) { 2019e0dac50fSopenharmony_ci case LifeCycleEvent::CREATE_EVENT: 2020e0dac50fSopenharmony_ci event = "CREATE"; 2021e0dac50fSopenharmony_ci break; 2022e0dac50fSopenharmony_ci case LifeCycleEvent::SHOW_EVENT: 2023e0dac50fSopenharmony_ci event = "SHOW"; 2024e0dac50fSopenharmony_ci break; 2025e0dac50fSopenharmony_ci case LifeCycleEvent::HIDE_EVENT: 2026e0dac50fSopenharmony_ci event = "HIDE"; 2027e0dac50fSopenharmony_ci break; 2028e0dac50fSopenharmony_ci case LifeCycleEvent::DESTROY_EVENT: 2029e0dac50fSopenharmony_ci event = "DESTROY"; 2030e0dac50fSopenharmony_ci break; 2031e0dac50fSopenharmony_ci default: 2032e0dac50fSopenharmony_ci event = "UNDEFINE"; 2033e0dac50fSopenharmony_ci break; 2034e0dac50fSopenharmony_ci } 2035e0dac50fSopenharmony_ci return event; 2036e0dac50fSopenharmony_ci} 2037e0dac50fSopenharmony_ci 2038e0dac50fSopenharmony_ciWMError WindowImpl::SetPrivacyMode(bool isPrivacyMode) 2039e0dac50fSopenharmony_ci{ 2040e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2041e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2042e0dac50fSopenharmony_ci } 2043e0dac50fSopenharmony_ci WLOGFD("id : %{public}u, SetPrivacyMode, %{public}u", GetWindowId(), isPrivacyMode); 2044e0dac50fSopenharmony_ci property_->SetPrivacyMode(isPrivacyMode); 2045e0dac50fSopenharmony_ci return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_PRIVACY_MODE); 2046e0dac50fSopenharmony_ci} 2047e0dac50fSopenharmony_ci 2048e0dac50fSopenharmony_cibool WindowImpl::IsPrivacyMode() const 2049e0dac50fSopenharmony_ci{ 2050e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2051e0dac50fSopenharmony_ci return false; 2052e0dac50fSopenharmony_ci } 2053e0dac50fSopenharmony_ci return property_->GetPrivacyMode(); 2054e0dac50fSopenharmony_ci} 2055e0dac50fSopenharmony_ci 2056e0dac50fSopenharmony_civoid WindowImpl::SetSystemPrivacyMode(bool isSystemPrivacyMode) 2057e0dac50fSopenharmony_ci{ 2058e0dac50fSopenharmony_ci WLOGFD("id : %{public}u, SetSystemPrivacyMode, %{public}u", GetWindowId(), isSystemPrivacyMode); 2059e0dac50fSopenharmony_ci property_->SetSystemPrivacyMode(isSystemPrivacyMode); 2060e0dac50fSopenharmony_ci UpdateProperty(PropertyChangeAction::ACTION_UPDATE_SYSTEM_PRIVACY_MODE); 2061e0dac50fSopenharmony_ci} 2062e0dac50fSopenharmony_ci 2063e0dac50fSopenharmony_ciWMError WindowImpl::SetSnapshotSkip(bool isSkip) 2064e0dac50fSopenharmony_ci{ 2065e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2066e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2067e0dac50fSopenharmony_ci } 2068e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 2069e0dac50fSopenharmony_ci WLOGFE("set snapshot skip permission denied!"); 2070e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2071e0dac50fSopenharmony_ci } 2072e0dac50fSopenharmony_ci property_->SetSnapshotSkip(isSkip); 2073e0dac50fSopenharmony_ci auto ret = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_SNAPSHOT_SKIP); 2074e0dac50fSopenharmony_ci WLOGFD("id : %{public}u, set snapshot skip end. isSkip:%{public}u, systemPrivacyMode:%{public}u, ret:%{public}u", 2075e0dac50fSopenharmony_ci GetWindowId(), isSkip, property_->GetSystemPrivacyMode(), ret); 2076e0dac50fSopenharmony_ci return WMError::WM_OK; 2077e0dac50fSopenharmony_ci} 2078e0dac50fSopenharmony_ci 2079e0dac50fSopenharmony_ci/** @note @window.hierarchy */ 2080e0dac50fSopenharmony_ciWMError WindowImpl::RaiseToAppTop() 2081e0dac50fSopenharmony_ci{ 2082e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2083e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Window is invalid"); 2084e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2085e0dac50fSopenharmony_ci } 2086e0dac50fSopenharmony_ci 2087e0dac50fSopenharmony_ci auto parentId = property_->GetParentId(); 2088e0dac50fSopenharmony_ci if (parentId == INVALID_WINDOW_ID) { 2089e0dac50fSopenharmony_ci WLOGFE("Only the children of the main window can be raised!"); 2090e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 2091e0dac50fSopenharmony_ci } 2092e0dac50fSopenharmony_ci 2093e0dac50fSopenharmony_ci if (!WindowHelper::IsSubWindow(property_->GetWindowType())) { 2094e0dac50fSopenharmony_ci WLOGFE("Must be app sub window window!"); 2095e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 2096e0dac50fSopenharmony_ci } 2097e0dac50fSopenharmony_ci 2098e0dac50fSopenharmony_ci if (state_ != WindowState::STATE_SHOWN) { 2099e0dac50fSopenharmony_ci WLOGFE("The sub window must be shown!"); 2100e0dac50fSopenharmony_ci return WMError::WM_DO_NOTHING; 2101e0dac50fSopenharmony_ci } 2102e0dac50fSopenharmony_ci 2103e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().RaiseToAppTop(GetWindowId()); 2104e0dac50fSopenharmony_ci} 2105e0dac50fSopenharmony_ci 2106e0dac50fSopenharmony_ciWMError WindowImpl::DisableAppWindowDecor() 2107e0dac50fSopenharmony_ci{ 2108e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2109e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2110e0dac50fSopenharmony_ci } 2111e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 2112e0dac50fSopenharmony_ci WLOGFE("disable app window decor permission denied!"); 2113e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2114e0dac50fSopenharmony_ci } 2115e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(property_->GetWindowType())) { 2116e0dac50fSopenharmony_ci WLOGFE("window decoration is invalid on sub window"); 2117e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2118e0dac50fSopenharmony_ci } 2119e0dac50fSopenharmony_ci WLOGI("disable app window decoration."); 2120e0dac50fSopenharmony_ci windowSystemConfig_.isSystemDecorEnable_ = false; 2121e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2122e0dac50fSopenharmony_ci return WMError::WM_OK; 2123e0dac50fSopenharmony_ci} 2124e0dac50fSopenharmony_ci 2125e0dac50fSopenharmony_cibool WindowImpl::IsDecorEnable() const 2126e0dac50fSopenharmony_ci{ 2127e0dac50fSopenharmony_ci bool enable = windowSystemConfig_.isSystemDecorEnable_ && 2128e0dac50fSopenharmony_ci WindowHelper::IsMainWindow(property_->GetWindowType()); 2129e0dac50fSopenharmony_ci WLOGFD("get decor enable %{public}d", enable); 2130e0dac50fSopenharmony_ci return enable; 2131e0dac50fSopenharmony_ci} 2132e0dac50fSopenharmony_ci 2133e0dac50fSopenharmony_ciWMError WindowImpl::Maximize() 2134e0dac50fSopenharmony_ci{ 2135e0dac50fSopenharmony_ci WLOGI("id: %{public}u Maximize", property_->GetWindowId()); 2136e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2137e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2138e0dac50fSopenharmony_ci } 2139e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2140e0dac50fSopenharmony_ci return SetFullScreen(true); 2141e0dac50fSopenharmony_ci } else { 2142e0dac50fSopenharmony_ci WLOGI("Maximize fail, not main window"); 2143e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2144e0dac50fSopenharmony_ci } 2145e0dac50fSopenharmony_ci} 2146e0dac50fSopenharmony_ci 2147e0dac50fSopenharmony_ciWMError WindowImpl::MaximizeFloating() 2148e0dac50fSopenharmony_ci{ 2149e0dac50fSopenharmony_ci WLOGI("id: %{public}u MaximizeFloating", property_->GetWindowId()); 2150e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2151e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2152e0dac50fSopenharmony_ci } 2153e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2154e0dac50fSopenharmony_ci return SetFloatingMaximize(true); 2155e0dac50fSopenharmony_ci } else { 2156e0dac50fSopenharmony_ci WLOGI("MaximizeFloating fail, not main window"); 2157e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2158e0dac50fSopenharmony_ci } 2159e0dac50fSopenharmony_ci} 2160e0dac50fSopenharmony_ci 2161e0dac50fSopenharmony_ciWMError WindowImpl::SetGlobalMaximizeMode(MaximizeMode mode) 2162e0dac50fSopenharmony_ci{ 2163e0dac50fSopenharmony_ci WLOGI("id: %{public}u SetGlobalMaximizeMode: %{public}u", property_->GetWindowId(), 2164e0dac50fSopenharmony_ci static_cast<uint32_t>(mode)); 2165e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2166e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2167e0dac50fSopenharmony_ci } 2168e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2169e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().SetMaximizeMode(mode); 2170e0dac50fSopenharmony_ci return WMError::WM_OK; 2171e0dac50fSopenharmony_ci } else { 2172e0dac50fSopenharmony_ci WLOGI("SetGlobalMaximizeMode fail, not main window"); 2173e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2174e0dac50fSopenharmony_ci } 2175e0dac50fSopenharmony_ci} 2176e0dac50fSopenharmony_ci 2177e0dac50fSopenharmony_ciMaximizeMode WindowImpl::GetGlobalMaximizeMode() const 2178e0dac50fSopenharmony_ci{ 2179e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().GetMaximizeMode(); 2180e0dac50fSopenharmony_ci} 2181e0dac50fSopenharmony_ci 2182e0dac50fSopenharmony_ciWMError WindowImpl::SetImmersiveModeEnabledState(bool enable) 2183e0dac50fSopenharmony_ci{ 2184e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "WindowImpl id: %{public}u SetImmersiveModeEnabledState: %{public}u", 2185e0dac50fSopenharmony_ci property_->GetWindowId(), static_cast<uint32_t>(enable)); 2186e0dac50fSopenharmony_ci if (!IsWindowValid() || 2187e0dac50fSopenharmony_ci !WindowHelper::IsWindowModeSupported(GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 2188e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "invalid window or fullscreen mode is not be supported, winId:%{public}u", 2189e0dac50fSopenharmony_ci property_->GetWindowId()); 2190e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2191e0dac50fSopenharmony_ci } 2192e0dac50fSopenharmony_ci const WindowType curWindowType = GetType(); 2193e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(curWindowType) && !WindowHelper::IsSubWindow(curWindowType)) { 2194e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2195e0dac50fSopenharmony_ci } 2196e0dac50fSopenharmony_ci 2197e0dac50fSopenharmony_ci enableImmersiveMode_ = enable; 2198e0dac50fSopenharmony_ci const WindowMode mode = GetMode(); 2199e0dac50fSopenharmony_ci if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) { 2200e0dac50fSopenharmony_ci return SetLayoutFullScreen(enableImmersiveMode_); 2201e0dac50fSopenharmony_ci } 2202e0dac50fSopenharmony_ci return WMError::WM_OK; 2203e0dac50fSopenharmony_ci} 2204e0dac50fSopenharmony_ci 2205e0dac50fSopenharmony_cibool WindowImpl::GetImmersiveModeEnabledState() const 2206e0dac50fSopenharmony_ci{ 2207e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2208e0dac50fSopenharmony_ci return false; 2209e0dac50fSopenharmony_ci } 2210e0dac50fSopenharmony_ci return enableImmersiveMode_; 2211e0dac50fSopenharmony_ci} 2212e0dac50fSopenharmony_ci 2213e0dac50fSopenharmony_ciWMError WindowImpl::NotifyWindowTransition(TransitionReason reason) 2214e0dac50fSopenharmony_ci{ 2215e0dac50fSopenharmony_ci sptr<WindowTransitionInfo> fromInfo = new(std::nothrow) WindowTransitionInfo(); 2216e0dac50fSopenharmony_ci sptr<WindowTransitionInfo> toInfo = new(std::nothrow) WindowTransitionInfo(); 2217e0dac50fSopenharmony_ci if (fromInfo == nullptr || toInfo == nullptr) { 2218e0dac50fSopenharmony_ci WLOGFE("new windowTransitionInfo failed"); 2219e0dac50fSopenharmony_ci return WMError::WM_ERROR_NO_MEM; 2220e0dac50fSopenharmony_ci } 2221e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 2222e0dac50fSopenharmony_ci if (abilityContext == nullptr) { 2223e0dac50fSopenharmony_ci WLOGFE("id:%{public}d is not ability Window", property_->GetWindowId()); 2224e0dac50fSopenharmony_ci return WMError::WM_ERROR_NO_MEM; 2225e0dac50fSopenharmony_ci } 2226e0dac50fSopenharmony_ci auto abilityInfo = abilityContext->GetAbilityInfo(); 2227e0dac50fSopenharmony_ci if (abilityInfo == nullptr) { 2228e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2229e0dac50fSopenharmony_ci } 2230e0dac50fSopenharmony_ci fromInfo->SetBundleName(context_->GetBundleName()); 2231e0dac50fSopenharmony_ci fromInfo->SetAbilityName(abilityInfo->name); 2232e0dac50fSopenharmony_ci fromInfo->SetWindowMode(property_->GetWindowMode()); 2233e0dac50fSopenharmony_ci fromInfo->SetWindowRect(property_->GetWindowRect()); 2234e0dac50fSopenharmony_ci fromInfo->SetAbilityToken(context_->GetToken()); 2235e0dac50fSopenharmony_ci fromInfo->SetWindowType(property_->GetWindowType()); 2236e0dac50fSopenharmony_ci fromInfo->SetDisplayId(property_->GetDisplayId()); 2237e0dac50fSopenharmony_ci fromInfo->SetTransitionReason(reason); 2238e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().NotifyWindowTransition(fromInfo, toInfo); 2239e0dac50fSopenharmony_ci} 2240e0dac50fSopenharmony_ci 2241e0dac50fSopenharmony_ciWMError WindowImpl::Minimize() 2242e0dac50fSopenharmony_ci{ 2243e0dac50fSopenharmony_ci WLOGI("id: %{public}u Minimize", property_->GetWindowId()); 2244e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2245e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2246e0dac50fSopenharmony_ci } 2247e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2248e0dac50fSopenharmony_ci if (context_ != nullptr) { 2249e0dac50fSopenharmony_ci WMError ret = NotifyWindowTransition(TransitionReason::MINIMIZE); 2250e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2251e0dac50fSopenharmony_ci WLOGI("Minimize without animation ret:%{public}u", static_cast<uint32_t>(ret)); 2252e0dac50fSopenharmony_ci AAFwk::AbilityManagerClient::GetInstance()->MinimizeAbility(context_->GetToken(), true); 2253e0dac50fSopenharmony_ci } 2254e0dac50fSopenharmony_ci } else { 2255e0dac50fSopenharmony_ci Hide(); 2256e0dac50fSopenharmony_ci } 2257e0dac50fSopenharmony_ci } 2258e0dac50fSopenharmony_ci return WMError::WM_OK; 2259e0dac50fSopenharmony_ci} 2260e0dac50fSopenharmony_ci 2261e0dac50fSopenharmony_ciWMError WindowImpl::Recover() 2262e0dac50fSopenharmony_ci{ 2263e0dac50fSopenharmony_ci WLOGI("id: %{public}u Normalize", property_->GetWindowId()); 2264e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2265e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2266e0dac50fSopenharmony_ci } 2267e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2268e0dac50fSopenharmony_ci if (property_->GetWindowMode() == WindowMode::WINDOW_MODE_FLOATING && 2269e0dac50fSopenharmony_ci property_->GetMaximizeMode() == MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 2270e0dac50fSopenharmony_ci SetFloatingMaximize(false); 2271e0dac50fSopenharmony_ci return WMError::WM_OK; 2272e0dac50fSopenharmony_ci } 2273e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 2274e0dac50fSopenharmony_ci } 2275e0dac50fSopenharmony_ci return WMError::WM_OK; 2276e0dac50fSopenharmony_ci} 2277e0dac50fSopenharmony_ci 2278e0dac50fSopenharmony_ciWMError WindowImpl::Close() 2279e0dac50fSopenharmony_ci{ 2280e0dac50fSopenharmony_ci WLOGI("id: %{public}u Close", property_->GetWindowId()); 2281e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2282e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2283e0dac50fSopenharmony_ci } 2284e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 2285e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 2286e0dac50fSopenharmony_ci if (!abilityContext) { 2287e0dac50fSopenharmony_ci return Destroy(); 2288e0dac50fSopenharmony_ci } 2289e0dac50fSopenharmony_ci sptr<AAFwk::IPrepareTerminateCallback> callback = this; 2290e0dac50fSopenharmony_ci if (AAFwk::AbilityManagerClient::GetInstance()->PrepareTerminateAbility(abilityContext->GetToken(), 2291e0dac50fSopenharmony_ci callback) != ERR_OK) { 2292e0dac50fSopenharmony_ci WLOGFW("RegisterWindowManagerServiceHandler failed, do close window"); 2293e0dac50fSopenharmony_ci PendingClose(); 2294e0dac50fSopenharmony_ci return WMError::WM_OK; 2295e0dac50fSopenharmony_ci } 2296e0dac50fSopenharmony_ci } 2297e0dac50fSopenharmony_ci return WMError::WM_OK; 2298e0dac50fSopenharmony_ci} 2299e0dac50fSopenharmony_ci 2300e0dac50fSopenharmony_civoid WindowImpl::DoPrepareTerminate() 2301e0dac50fSopenharmony_ci{ 2302e0dac50fSopenharmony_ci WLOGFI("do pending close by ability"); 2303e0dac50fSopenharmony_ci PendingClose(); 2304e0dac50fSopenharmony_ci} 2305e0dac50fSopenharmony_ci 2306e0dac50fSopenharmony_civoid WindowImpl::PendingClose() 2307e0dac50fSopenharmony_ci{ 2308e0dac50fSopenharmony_ci WLOGFD("begin"); 2309e0dac50fSopenharmony_ci WMError ret = NotifyWindowTransition(TransitionReason::CLOSE_BUTTON); 2310e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2311e0dac50fSopenharmony_ci WLOGI("Close without animation ret:%{public}u", static_cast<uint32_t>(ret)); 2312e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 2313e0dac50fSopenharmony_ci if (abilityContext != nullptr) { 2314e0dac50fSopenharmony_ci abilityContext->CloseAbility(); 2315e0dac50fSopenharmony_ci } 2316e0dac50fSopenharmony_ci } 2317e0dac50fSopenharmony_ci} 2318e0dac50fSopenharmony_ci 2319e0dac50fSopenharmony_ciWMError WindowImpl::RequestFocus() const 2320e0dac50fSopenharmony_ci{ 2321e0dac50fSopenharmony_ci if (!IsWindowValid()) { 2322e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2323e0dac50fSopenharmony_ci } 2324e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().RequestFocus(property_->GetWindowId()); 2325e0dac50fSopenharmony_ci} 2326e0dac50fSopenharmony_ci 2327e0dac50fSopenharmony_civoid WindowImpl::SetInputEventConsumer(const std::shared_ptr<IInputEventConsumer>& inputEventConsumer) 2328e0dac50fSopenharmony_ci{ 2329e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2330e0dac50fSopenharmony_ci inputEventConsumer_ = inputEventConsumer; 2331e0dac50fSopenharmony_ci} 2332e0dac50fSopenharmony_ci 2333e0dac50fSopenharmony_ciWMError WindowImpl::RegisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) 2334e0dac50fSopenharmony_ci{ 2335e0dac50fSopenharmony_ci WLOGFD("Start register"); 2336e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2337e0dac50fSopenharmony_ci return RegisterListener(lifecycleListeners_[GetWindowId()], listener); 2338e0dac50fSopenharmony_ci} 2339e0dac50fSopenharmony_ci 2340e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterLifeCycleListener(const sptr<IWindowLifeCycle>& listener) 2341e0dac50fSopenharmony_ci{ 2342e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2343e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2344e0dac50fSopenharmony_ci return UnregisterListener(lifecycleListeners_[GetWindowId()], listener); 2345e0dac50fSopenharmony_ci} 2346e0dac50fSopenharmony_ci 2347e0dac50fSopenharmony_ciWMError WindowImpl::RegisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) 2348e0dac50fSopenharmony_ci{ 2349e0dac50fSopenharmony_ci WLOGFD("Start register"); 2350e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2351e0dac50fSopenharmony_ci return RegisterListener(windowChangeListeners_[GetWindowId()], listener); 2352e0dac50fSopenharmony_ci} 2353e0dac50fSopenharmony_ci 2354e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterWindowChangeListener(const sptr<IWindowChangeListener>& listener) 2355e0dac50fSopenharmony_ci{ 2356e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2357e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2358e0dac50fSopenharmony_ci return UnregisterListener(windowChangeListeners_[GetWindowId()], listener); 2359e0dac50fSopenharmony_ci} 2360e0dac50fSopenharmony_ci 2361e0dac50fSopenharmony_ciWMError WindowImpl::RegisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) 2362e0dac50fSopenharmony_ci{ 2363e0dac50fSopenharmony_ci WLOGFD("Start register"); 2364e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2365e0dac50fSopenharmony_ci WMError ret = RegisterListener(avoidAreaChangeListeners_[GetWindowId()], listener); 2366e0dac50fSopenharmony_ci if (avoidAreaChangeListeners_[GetWindowId()].size() == 1) { 2367e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().UpdateAvoidAreaListener(property_->GetWindowId(), true); 2368e0dac50fSopenharmony_ci } 2369e0dac50fSopenharmony_ci return ret; 2370e0dac50fSopenharmony_ci} 2371e0dac50fSopenharmony_ci 2372e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterAvoidAreaChangeListener(sptr<IAvoidAreaChangedListener>& listener) 2373e0dac50fSopenharmony_ci{ 2374e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2375e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2376e0dac50fSopenharmony_ci WMError ret = UnregisterListener(avoidAreaChangeListeners_[GetWindowId()], listener); 2377e0dac50fSopenharmony_ci if (avoidAreaChangeListeners_[GetWindowId()].empty()) { 2378e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().UpdateAvoidAreaListener(property_->GetWindowId(), false); 2379e0dac50fSopenharmony_ci } 2380e0dac50fSopenharmony_ci return ret; 2381e0dac50fSopenharmony_ci} 2382e0dac50fSopenharmony_ci 2383e0dac50fSopenharmony_ciWMError WindowImpl::RegisterDragListener(const sptr<IWindowDragListener>& listener) 2384e0dac50fSopenharmony_ci{ 2385e0dac50fSopenharmony_ci WLOGFD("Start register"); 2386e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2387e0dac50fSopenharmony_ci return RegisterListener(windowDragListeners_, listener); 2388e0dac50fSopenharmony_ci} 2389e0dac50fSopenharmony_ci 2390e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterDragListener(const sptr<IWindowDragListener>& listener) 2391e0dac50fSopenharmony_ci{ 2392e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2393e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2394e0dac50fSopenharmony_ci return UnregisterListener(windowDragListeners_, listener); 2395e0dac50fSopenharmony_ci} 2396e0dac50fSopenharmony_ci 2397e0dac50fSopenharmony_ciWMError WindowImpl::RegisterDisplayMoveListener(sptr<IDisplayMoveListener>& listener) 2398e0dac50fSopenharmony_ci{ 2399e0dac50fSopenharmony_ci WLOGFD("Start register"); 2400e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2401e0dac50fSopenharmony_ci return RegisterListener(displayMoveListeners_, listener); 2402e0dac50fSopenharmony_ci} 2403e0dac50fSopenharmony_ci 2404e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterDisplayMoveListener(sptr<IDisplayMoveListener>& listener) 2405e0dac50fSopenharmony_ci{ 2406e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2407e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2408e0dac50fSopenharmony_ci return UnregisterListener(displayMoveListeners_, listener); 2409e0dac50fSopenharmony_ci} 2410e0dac50fSopenharmony_ci 2411e0dac50fSopenharmony_civoid WindowImpl::RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) 2412e0dac50fSopenharmony_ci{ 2413e0dac50fSopenharmony_ci WLOGFD("Start register"); 2414e0dac50fSopenharmony_ci notifyNativefunc_ = std::move(func); 2415e0dac50fSopenharmony_ci} 2416e0dac50fSopenharmony_ci 2417e0dac50fSopenharmony_ciWMError WindowImpl::RegisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) 2418e0dac50fSopenharmony_ci{ 2419e0dac50fSopenharmony_ci WLOGFD("Start register"); 2420e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2421e0dac50fSopenharmony_ci return RegisterListener(occupiedAreaChangeListeners_[GetWindowId()], listener); 2422e0dac50fSopenharmony_ci} 2423e0dac50fSopenharmony_ci 2424e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterOccupiedAreaChangeListener(const sptr<IOccupiedAreaChangeListener>& listener) 2425e0dac50fSopenharmony_ci{ 2426e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2427e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2428e0dac50fSopenharmony_ci return UnregisterListener(occupiedAreaChangeListeners_[GetWindowId()], listener); 2429e0dac50fSopenharmony_ci} 2430e0dac50fSopenharmony_ci 2431e0dac50fSopenharmony_ciWMError WindowImpl::RegisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) 2432e0dac50fSopenharmony_ci{ 2433e0dac50fSopenharmony_ci WLOGFD("Start register"); 2434e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2435e0dac50fSopenharmony_ci return RegisterListener(touchOutsideListeners_[GetWindowId()], listener); 2436e0dac50fSopenharmony_ci} 2437e0dac50fSopenharmony_ci 2438e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterTouchOutsideListener(const sptr<ITouchOutsideListener>& listener) 2439e0dac50fSopenharmony_ci{ 2440e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2441e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2442e0dac50fSopenharmony_ci return UnregisterListener(touchOutsideListeners_[GetWindowId()], listener); 2443e0dac50fSopenharmony_ci} 2444e0dac50fSopenharmony_ci 2445e0dac50fSopenharmony_ciWMError WindowImpl::RegisterAnimationTransitionController(const sptr<IAnimationTransitionController>& listener) 2446e0dac50fSopenharmony_ci{ 2447e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 2448e0dac50fSopenharmony_ci WLOGFE("register animation transition controller permission denied!"); 2449e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2450e0dac50fSopenharmony_ci } 2451e0dac50fSopenharmony_ci if (listener == nullptr) { 2452e0dac50fSopenharmony_ci WLOGFE("listener is nullptr"); 2453e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2454e0dac50fSopenharmony_ci } 2455e0dac50fSopenharmony_ci animationTransitionController_ = listener; 2456e0dac50fSopenharmony_ci wptr<WindowProperty> propertyToken(property_); 2457e0dac50fSopenharmony_ci wptr<IAnimationTransitionController> animationTransitionControllerToken(animationTransitionController_); 2458e0dac50fSopenharmony_ci if (uiContent_) { 2459e0dac50fSopenharmony_ci uiContent_->SetNextFrameLayoutCallback([propertyToken, animationTransitionControllerToken]() { 2460e0dac50fSopenharmony_ci auto property = propertyToken.promote(); 2461e0dac50fSopenharmony_ci auto animationTransitionController = animationTransitionControllerToken.promote(); 2462e0dac50fSopenharmony_ci if (!property || !animationTransitionController) { 2463e0dac50fSopenharmony_ci return; 2464e0dac50fSopenharmony_ci } 2465e0dac50fSopenharmony_ci uint32_t animationFlag = property->GetAnimationFlag(); 2466e0dac50fSopenharmony_ci if (animationFlag == static_cast<uint32_t>(WindowAnimation::CUSTOM)) { 2467e0dac50fSopenharmony_ci // CustomAnimation is enabled when animationTransitionController_ exists 2468e0dac50fSopenharmony_ci animationTransitionController->AnimationForShown(); 2469e0dac50fSopenharmony_ci } 2470e0dac50fSopenharmony_ci }); 2471e0dac50fSopenharmony_ci } 2472e0dac50fSopenharmony_ci return WMError::WM_OK; 2473e0dac50fSopenharmony_ci} 2474e0dac50fSopenharmony_ci 2475e0dac50fSopenharmony_ciWMError WindowImpl::RegisterScreenshotListener(const sptr<IScreenshotListener>& listener) 2476e0dac50fSopenharmony_ci{ 2477e0dac50fSopenharmony_ci WLOGFD("Start register"); 2478e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2479e0dac50fSopenharmony_ci return RegisterListener(screenshotListeners_[GetWindowId()], listener); 2480e0dac50fSopenharmony_ci} 2481e0dac50fSopenharmony_ci 2482e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterScreenshotListener(const sptr<IScreenshotListener>& listener) 2483e0dac50fSopenharmony_ci{ 2484e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2485e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2486e0dac50fSopenharmony_ci return UnregisterListener(screenshotListeners_[GetWindowId()], listener); 2487e0dac50fSopenharmony_ci} 2488e0dac50fSopenharmony_ci 2489e0dac50fSopenharmony_ciWMError WindowImpl::RegisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) 2490e0dac50fSopenharmony_ci{ 2491e0dac50fSopenharmony_ci WLOGFD("Start register"); 2492e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2493e0dac50fSopenharmony_ci return RegisterListener(dialogTargetTouchListeners_[GetWindowId()], listener); 2494e0dac50fSopenharmony_ci} 2495e0dac50fSopenharmony_ci 2496e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterDialogTargetTouchListener(const sptr<IDialogTargetTouchListener>& listener) 2497e0dac50fSopenharmony_ci{ 2498e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2499e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2500e0dac50fSopenharmony_ci return UnregisterListener(dialogTargetTouchListeners_[GetWindowId()], listener); 2501e0dac50fSopenharmony_ci} 2502e0dac50fSopenharmony_ci 2503e0dac50fSopenharmony_civoid WindowImpl::RegisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) 2504e0dac50fSopenharmony_ci{ 2505e0dac50fSopenharmony_ci WLOGFD("Start register"); 2506e0dac50fSopenharmony_ci if (listener == nullptr) { 2507e0dac50fSopenharmony_ci WLOGFE("listener is nullptr"); 2508e0dac50fSopenharmony_ci return; 2509e0dac50fSopenharmony_ci } 2510e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2511e0dac50fSopenharmony_ci dialogDeathRecipientListener_[GetWindowId()] = listener; 2512e0dac50fSopenharmony_ci} 2513e0dac50fSopenharmony_ci 2514e0dac50fSopenharmony_civoid WindowImpl::UnregisterDialogDeathRecipientListener(const sptr<IDialogDeathRecipientListener>& listener) 2515e0dac50fSopenharmony_ci{ 2516e0dac50fSopenharmony_ci WLOGFD("Start unregister"); 2517e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2518e0dac50fSopenharmony_ci dialogDeathRecipientListener_[GetWindowId()] = nullptr; 2519e0dac50fSopenharmony_ci} 2520e0dac50fSopenharmony_ci 2521e0dac50fSopenharmony_citemplate<typename T> 2522e0dac50fSopenharmony_ciWMError WindowImpl::RegisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener) 2523e0dac50fSopenharmony_ci{ 2524e0dac50fSopenharmony_ci if (listener == nullptr) { 2525e0dac50fSopenharmony_ci WLOGFE("listener is nullptr"); 2526e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2527e0dac50fSopenharmony_ci } 2528e0dac50fSopenharmony_ci if (std::find(holder.begin(), holder.end(), listener) != holder.end()) { 2529e0dac50fSopenharmony_ci WLOGFE("Listener already registered"); 2530e0dac50fSopenharmony_ci return WMError::WM_OK; 2531e0dac50fSopenharmony_ci } 2532e0dac50fSopenharmony_ci holder.emplace_back(listener); 2533e0dac50fSopenharmony_ci return WMError::WM_OK; 2534e0dac50fSopenharmony_ci} 2535e0dac50fSopenharmony_ci 2536e0dac50fSopenharmony_citemplate<typename T> 2537e0dac50fSopenharmony_ciWMError WindowImpl::UnregisterListener(std::vector<sptr<T>>& holder, const sptr<T>& listener) 2538e0dac50fSopenharmony_ci{ 2539e0dac50fSopenharmony_ci if (listener == nullptr) { 2540e0dac50fSopenharmony_ci WLOGFE("listener could not be null"); 2541e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2542e0dac50fSopenharmony_ci } 2543e0dac50fSopenharmony_ci holder.erase(std::remove_if(holder.begin(), holder.end(), 2544e0dac50fSopenharmony_ci [listener](sptr<T> registeredListener) { 2545e0dac50fSopenharmony_ci return registeredListener == listener; 2546e0dac50fSopenharmony_ci }), holder.end()); 2547e0dac50fSopenharmony_ci return WMError::WM_OK; 2548e0dac50fSopenharmony_ci} 2549e0dac50fSopenharmony_ci 2550e0dac50fSopenharmony_citemplate <typename T> 2551e0dac50fSopenharmony_ciEnableIfSame<T, IWindowLifeCycle, std::vector<sptr<IWindowLifeCycle>>> WindowImpl::GetListeners() 2552e0dac50fSopenharmony_ci{ 2553e0dac50fSopenharmony_ci std::vector<sptr<IWindowLifeCycle>> lifecycleListeners; 2554e0dac50fSopenharmony_ci { 2555e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2556e0dac50fSopenharmony_ci for (auto &listener : lifecycleListeners_[GetWindowId()]) { 2557e0dac50fSopenharmony_ci lifecycleListeners.push_back(listener); 2558e0dac50fSopenharmony_ci } 2559e0dac50fSopenharmony_ci } 2560e0dac50fSopenharmony_ci return lifecycleListeners; 2561e0dac50fSopenharmony_ci} 2562e0dac50fSopenharmony_ci 2563e0dac50fSopenharmony_citemplate <typename T> 2564e0dac50fSopenharmony_ciEnableIfSame<T, IWindowChangeListener, std::vector<sptr<IWindowChangeListener>>> WindowImpl::GetListeners() 2565e0dac50fSopenharmony_ci{ 2566e0dac50fSopenharmony_ci std::vector<sptr<IWindowChangeListener>> windowChangeListeners; 2567e0dac50fSopenharmony_ci { 2568e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2569e0dac50fSopenharmony_ci for (auto &listener : windowChangeListeners_[GetWindowId()]) { 2570e0dac50fSopenharmony_ci windowChangeListeners.push_back(listener); 2571e0dac50fSopenharmony_ci } 2572e0dac50fSopenharmony_ci } 2573e0dac50fSopenharmony_ci return windowChangeListeners; 2574e0dac50fSopenharmony_ci} 2575e0dac50fSopenharmony_ci 2576e0dac50fSopenharmony_citemplate <typename T> 2577e0dac50fSopenharmony_ciEnableIfSame<T, IAvoidAreaChangedListener, std::vector<sptr<IAvoidAreaChangedListener>>> WindowImpl::GetListeners() 2578e0dac50fSopenharmony_ci{ 2579e0dac50fSopenharmony_ci std::vector<sptr<IAvoidAreaChangedListener>> avoidAreaChangeListeners; 2580e0dac50fSopenharmony_ci { 2581e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2582e0dac50fSopenharmony_ci for (auto &listener : avoidAreaChangeListeners_[GetWindowId()]) { 2583e0dac50fSopenharmony_ci avoidAreaChangeListeners.push_back(listener); 2584e0dac50fSopenharmony_ci } 2585e0dac50fSopenharmony_ci } 2586e0dac50fSopenharmony_ci return avoidAreaChangeListeners; 2587e0dac50fSopenharmony_ci} 2588e0dac50fSopenharmony_ci 2589e0dac50fSopenharmony_citemplate <typename T> 2590e0dac50fSopenharmony_ciEnableIfSame<T, IDisplayMoveListener, std::vector<sptr<IDisplayMoveListener>>> WindowImpl::GetListeners() 2591e0dac50fSopenharmony_ci{ 2592e0dac50fSopenharmony_ci std::vector<sptr<IDisplayMoveListener>> displayMoveListeners; 2593e0dac50fSopenharmony_ci { 2594e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2595e0dac50fSopenharmony_ci for (auto &listener : displayMoveListeners_) { 2596e0dac50fSopenharmony_ci displayMoveListeners.push_back(listener); 2597e0dac50fSopenharmony_ci } 2598e0dac50fSopenharmony_ci } 2599e0dac50fSopenharmony_ci return displayMoveListeners; 2600e0dac50fSopenharmony_ci} 2601e0dac50fSopenharmony_ci 2602e0dac50fSopenharmony_citemplate <typename T> 2603e0dac50fSopenharmony_ciEnableIfSame<T, IScreenshotListener, std::vector<sptr<IScreenshotListener>>> WindowImpl::GetListeners() 2604e0dac50fSopenharmony_ci{ 2605e0dac50fSopenharmony_ci std::vector<sptr<IScreenshotListener>> screenshotListeners; 2606e0dac50fSopenharmony_ci { 2607e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2608e0dac50fSopenharmony_ci for (auto &listener : screenshotListeners_[GetWindowId()]) { 2609e0dac50fSopenharmony_ci screenshotListeners.push_back(listener); 2610e0dac50fSopenharmony_ci } 2611e0dac50fSopenharmony_ci } 2612e0dac50fSopenharmony_ci return screenshotListeners; 2613e0dac50fSopenharmony_ci} 2614e0dac50fSopenharmony_ci 2615e0dac50fSopenharmony_citemplate <typename T> 2616e0dac50fSopenharmony_ciEnableIfSame<T, ITouchOutsideListener, std::vector<sptr<ITouchOutsideListener>>> WindowImpl::GetListeners() 2617e0dac50fSopenharmony_ci{ 2618e0dac50fSopenharmony_ci std::vector<sptr<ITouchOutsideListener>> touchOutsideListeners; 2619e0dac50fSopenharmony_ci { 2620e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2621e0dac50fSopenharmony_ci for (auto &listener : touchOutsideListeners_[GetWindowId()]) { 2622e0dac50fSopenharmony_ci touchOutsideListeners.push_back(listener); 2623e0dac50fSopenharmony_ci } 2624e0dac50fSopenharmony_ci } 2625e0dac50fSopenharmony_ci return touchOutsideListeners; 2626e0dac50fSopenharmony_ci} 2627e0dac50fSopenharmony_ci 2628e0dac50fSopenharmony_citemplate <typename T> 2629e0dac50fSopenharmony_ciEnableIfSame<T, IDialogTargetTouchListener, std::vector<sptr<IDialogTargetTouchListener>>> WindowImpl::GetListeners() 2630e0dac50fSopenharmony_ci{ 2631e0dac50fSopenharmony_ci std::vector<sptr<IDialogTargetTouchListener>> dialogTargetTouchListeners; 2632e0dac50fSopenharmony_ci { 2633e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2634e0dac50fSopenharmony_ci for (auto &listener : dialogTargetTouchListeners_[GetWindowId()]) { 2635e0dac50fSopenharmony_ci dialogTargetTouchListeners.push_back(listener); 2636e0dac50fSopenharmony_ci } 2637e0dac50fSopenharmony_ci } 2638e0dac50fSopenharmony_ci return dialogTargetTouchListeners; 2639e0dac50fSopenharmony_ci} 2640e0dac50fSopenharmony_ci 2641e0dac50fSopenharmony_citemplate <typename T> 2642e0dac50fSopenharmony_ciEnableIfSame<T, IWindowDragListener, std::vector<sptr<IWindowDragListener>>> WindowImpl::GetListeners() 2643e0dac50fSopenharmony_ci{ 2644e0dac50fSopenharmony_ci std::vector<sptr<IWindowDragListener>> windowDragListeners; 2645e0dac50fSopenharmony_ci { 2646e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2647e0dac50fSopenharmony_ci for (auto &listener : windowDragListeners_) { 2648e0dac50fSopenharmony_ci windowDragListeners.push_back(listener); 2649e0dac50fSopenharmony_ci } 2650e0dac50fSopenharmony_ci } 2651e0dac50fSopenharmony_ci return windowDragListeners; 2652e0dac50fSopenharmony_ci} 2653e0dac50fSopenharmony_ci 2654e0dac50fSopenharmony_citemplate <typename T> 2655e0dac50fSopenharmony_ciEnableIfSame<T, IOccupiedAreaChangeListener, std::vector<sptr<IOccupiedAreaChangeListener>>> WindowImpl::GetListeners() 2656e0dac50fSopenharmony_ci{ 2657e0dac50fSopenharmony_ci std::vector<sptr<IOccupiedAreaChangeListener>> occupiedAreaChangeListeners; 2658e0dac50fSopenharmony_ci { 2659e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2660e0dac50fSopenharmony_ci for (auto &listener : occupiedAreaChangeListeners_[GetWindowId()]) { 2661e0dac50fSopenharmony_ci occupiedAreaChangeListeners.push_back(listener); 2662e0dac50fSopenharmony_ci } 2663e0dac50fSopenharmony_ci } 2664e0dac50fSopenharmony_ci return occupiedAreaChangeListeners; 2665e0dac50fSopenharmony_ci} 2666e0dac50fSopenharmony_ci 2667e0dac50fSopenharmony_citemplate <typename T> 2668e0dac50fSopenharmony_ciEnableIfSame<T, IDialogDeathRecipientListener, wptr<IDialogDeathRecipientListener>> WindowImpl::GetListener() 2669e0dac50fSopenharmony_ci{ 2670e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 2671e0dac50fSopenharmony_ci return dialogDeathRecipientListener_[GetWindowId()]; 2672e0dac50fSopenharmony_ci} 2673e0dac50fSopenharmony_ci 2674e0dac50fSopenharmony_civoid WindowImpl::SetAceAbilityHandler(const sptr<IAceAbilityHandler>& handler) 2675e0dac50fSopenharmony_ci{ 2676e0dac50fSopenharmony_ci if (handler == nullptr) { 2677e0dac50fSopenharmony_ci WLOGI("ace ability handler is nullptr"); 2678e0dac50fSopenharmony_ci } 2679e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2680e0dac50fSopenharmony_ci aceAbilityHandler_ = handler; 2681e0dac50fSopenharmony_ci} 2682e0dac50fSopenharmony_ci 2683e0dac50fSopenharmony_civoid WindowImpl::SetRequestModeSupportInfo(uint32_t modeSupportInfo) 2684e0dac50fSopenharmony_ci{ 2685e0dac50fSopenharmony_ci property_->SetRequestModeSupportInfo(modeSupportInfo); 2686e0dac50fSopenharmony_ci SetModeSupportInfo(modeSupportInfo); 2687e0dac50fSopenharmony_ci} 2688e0dac50fSopenharmony_ci 2689e0dac50fSopenharmony_civoid WindowImpl::SetModeSupportInfo(uint32_t modeSupportInfo) 2690e0dac50fSopenharmony_ci{ 2691e0dac50fSopenharmony_ci property_->SetModeSupportInfo(modeSupportInfo); 2692e0dac50fSopenharmony_ci} 2693e0dac50fSopenharmony_ci 2694e0dac50fSopenharmony_civoid WindowImpl::UpdateRect(const struct Rect& rect, bool decoStatus, WindowSizeChangeReason reason, 2695e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction) 2696e0dac50fSopenharmony_ci{ 2697e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_DESTROYED) { 2698e0dac50fSopenharmony_ci WLOGFW("invalid window state"); 2699e0dac50fSopenharmony_ci return; 2700e0dac50fSopenharmony_ci } 2701e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 2702e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 2703e0dac50fSopenharmony_ci if (display == nullptr) { 2704e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64", window id:%{public}u", property_->GetDisplayId(), 2705e0dac50fSopenharmony_ci property_->GetWindowId()); 2706e0dac50fSopenharmony_ci return; 2707e0dac50fSopenharmony_ci } 2708e0dac50fSopenharmony_ci Rect lastOriRect = property_->GetWindowRect(); 2709e0dac50fSopenharmony_ci 2710e0dac50fSopenharmony_ci property_->SetDecoStatus(decoStatus); 2711e0dac50fSopenharmony_ci if (reason == WindowSizeChangeReason::HIDE) { 2712e0dac50fSopenharmony_ci property_->SetRequestRect(rect); 2713e0dac50fSopenharmony_ci return; 2714e0dac50fSopenharmony_ci } 2715e0dac50fSopenharmony_ci property_->SetWindowRect(rect); 2716e0dac50fSopenharmony_ci 2717e0dac50fSopenharmony_ci // update originRect when floating window show for the first time. 2718e0dac50fSopenharmony_ci if (!isOriginRectSet_ && WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) { 2719e0dac50fSopenharmony_ci property_->SetOriginRect(rect); 2720e0dac50fSopenharmony_ci isOriginRectSet_ = true; 2721e0dac50fSopenharmony_ci } 2722e0dac50fSopenharmony_ci WLOGFD("winId:%{public}u, rect[%{public}d, %{public}d, %{public}u, %{public}u], reason:%{public}u", 2723e0dac50fSopenharmony_ci property_->GetWindowId(), rect.posX_, rect.posY_, rect.width_, rect.height_, reason); 2724e0dac50fSopenharmony_ci Rect rectToAce = rect; 2725e0dac50fSopenharmony_ci // update rectToAce for stretchable window 2726e0dac50fSopenharmony_ci if (windowSystemConfig_.isStretchable_ && WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) { 2727e0dac50fSopenharmony_ci if (IsStretchableReason(reason)) { 2728e0dac50fSopenharmony_ci rectToAce = property_->GetOriginRect(); 2729e0dac50fSopenharmony_ci } else { 2730e0dac50fSopenharmony_ci property_->SetOriginRect(rect); 2731e0dac50fSopenharmony_ci } 2732e0dac50fSopenharmony_ci } 2733e0dac50fSopenharmony_ci ScheduleUpdateRectTask(rectToAce, lastOriRect, reason, rsTransaction, display); 2734e0dac50fSopenharmony_ci} 2735e0dac50fSopenharmony_ci 2736e0dac50fSopenharmony_civoid WindowImpl::ScheduleUpdateRectTask(const Rect& rectToAce, const Rect& lastOriRect, WindowSizeChangeReason reason, 2737e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction, const sptr<class Display>& display) 2738e0dac50fSopenharmony_ci{ 2739e0dac50fSopenharmony_ci auto task = [weakThis = wptr(this), reason, rsTransaction, rectToAce, lastOriRect, display]() mutable { 2740e0dac50fSopenharmony_ci auto window = weakThis.promote(); 2741e0dac50fSopenharmony_ci if (!window) { 2742e0dac50fSopenharmony_ci TLOGNE(WmsLogTag::WMS_IMMS, "window is null"); 2743e0dac50fSopenharmony_ci return; 2744e0dac50fSopenharmony_ci } 2745e0dac50fSopenharmony_ci if (rsTransaction) { 2746e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2747e0dac50fSopenharmony_ci rsTransaction->Begin(); 2748e0dac50fSopenharmony_ci } 2749e0dac50fSopenharmony_ci RSAnimationTimingProtocol protocol; 2750e0dac50fSopenharmony_ci protocol.SetDuration(600); 2751e0dac50fSopenharmony_ci auto curve = RSAnimationTimingCurve::CreateCubicCurve(0.2, 0.0, 0.2, 1.0); 2752e0dac50fSopenharmony_ci RSNode::OpenImplicitAnimation(protocol, curve); 2753e0dac50fSopenharmony_ci if ((rectToAce != lastOriRect) || (reason != window->lastSizeChangeReason_)) { 2754e0dac50fSopenharmony_ci window->NotifySizeChange(rectToAce, reason, rsTransaction); 2755e0dac50fSopenharmony_ci window->lastSizeChangeReason_ = reason; 2756e0dac50fSopenharmony_ci } 2757e0dac50fSopenharmony_ci window->UpdateViewportConfig(rectToAce, display, reason, rsTransaction); 2758e0dac50fSopenharmony_ci RSNode::CloseImplicitAnimation(); 2759e0dac50fSopenharmony_ci if (rsTransaction) { 2760e0dac50fSopenharmony_ci rsTransaction->Commit(); 2761e0dac50fSopenharmony_ci } 2762e0dac50fSopenharmony_ci window->postTaskDone_ = true; 2763e0dac50fSopenharmony_ci }; 2764e0dac50fSopenharmony_ci ResSchedReport::GetInstance().RequestPerfIfNeed(reason, GetType(), GetMode()); 2765e0dac50fSopenharmony_ci handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner()); 2766e0dac50fSopenharmony_ci if (handler_ != nullptr && reason == WindowSizeChangeReason::ROTATION) { 2767e0dac50fSopenharmony_ci postTaskDone_ = false; 2768e0dac50fSopenharmony_ci handler_->PostTask(task, "wms:UpdateRect"); 2769e0dac50fSopenharmony_ci } else { 2770e0dac50fSopenharmony_ci if ((rectToAce != lastOriRect) || (reason != lastSizeChangeReason_) || !postTaskDone_) { 2771e0dac50fSopenharmony_ci NotifySizeChange(rectToAce, reason, rsTransaction); 2772e0dac50fSopenharmony_ci lastSizeChangeReason_ = reason; 2773e0dac50fSopenharmony_ci postTaskDone_ = true; 2774e0dac50fSopenharmony_ci } 2775e0dac50fSopenharmony_ci UpdateViewportConfig(rectToAce, display, reason, rsTransaction); 2776e0dac50fSopenharmony_ci } 2777e0dac50fSopenharmony_ci} 2778e0dac50fSopenharmony_ci 2779e0dac50fSopenharmony_civoid WindowImpl::UpdateMode(WindowMode mode) 2780e0dac50fSopenharmony_ci{ 2781e0dac50fSopenharmony_ci WLOGI("UpdateMode %{public}u", mode); 2782e0dac50fSopenharmony_ci property_->SetWindowMode(mode); 2783e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 2784e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2785e0dac50fSopenharmony_ci} 2786e0dac50fSopenharmony_ci 2787e0dac50fSopenharmony_civoid WindowImpl::UpdateModeSupportInfo(uint32_t modeSupportInfo) 2788e0dac50fSopenharmony_ci{ 2789e0dac50fSopenharmony_ci WLOGFD("modeSupportInfo: %{public}u, winId: %{public}u", modeSupportInfo, GetWindowId()); 2790e0dac50fSopenharmony_ci SetModeSupportInfo(modeSupportInfo); 2791e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 2792e0dac50fSopenharmony_ci} 2793e0dac50fSopenharmony_ci 2794e0dac50fSopenharmony_civoid WindowImpl::HandleBackKeyPressedEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) 2795e0dac50fSopenharmony_ci{ 2796e0dac50fSopenharmony_ci std::shared_ptr<IInputEventConsumer> inputEventConsumer; 2797e0dac50fSopenharmony_ci { 2798e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2799e0dac50fSopenharmony_ci inputEventConsumer = inputEventConsumer_; 2800e0dac50fSopenharmony_ci } 2801e0dac50fSopenharmony_ci SingletonContainer::Get<WindowInfoReporter>().ReportBackButtonInfoImmediately(); 2802e0dac50fSopenharmony_ci 2803e0dac50fSopenharmony_ci bool isConsumed = false; 2804e0dac50fSopenharmony_ci if (inputEventConsumer != nullptr) { 2805e0dac50fSopenharmony_ci WLOGD("Transfer back key event to inputEventConsumer"); 2806e0dac50fSopenharmony_ci isConsumed = inputEventConsumer->OnInputEvent(keyEvent); 2807e0dac50fSopenharmony_ci } else if (uiContent_ != nullptr) { 2808e0dac50fSopenharmony_ci WLOGD("Transfer back key event to uiContent"); 2809e0dac50fSopenharmony_ci isConsumed = uiContent_->ProcessBackPressed(); 2810e0dac50fSopenharmony_ci } else { 2811e0dac50fSopenharmony_ci WLOGFE("There is no back key event consumer"); 2812e0dac50fSopenharmony_ci } 2813e0dac50fSopenharmony_ci if (isConsumed) { 2814e0dac50fSopenharmony_ci WLOGD("Back key event is consumed"); 2815e0dac50fSopenharmony_ci return; 2816e0dac50fSopenharmony_ci } 2817e0dac50fSopenharmony_ci PerformBack(); 2818e0dac50fSopenharmony_ci} 2819e0dac50fSopenharmony_ci 2820e0dac50fSopenharmony_civoid WindowImpl::PerformBack() 2821e0dac50fSopenharmony_ci{ 2822e0dac50fSopenharmony_ci auto task = [weakThis = wptr(this)]() { 2823e0dac50fSopenharmony_ci auto window = weakThis.promote(); 2824e0dac50fSopenharmony_ci if (!window) { 2825e0dac50fSopenharmony_ci TLOGNE(WmsLogTag::WMS_IMMS, "window is null"); 2826e0dac50fSopenharmony_ci return; 2827e0dac50fSopenharmony_ci } 2828e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(window->property_->GetWindowType())) { 2829e0dac50fSopenharmony_ci WLOGD("it is not a main window"); 2830e0dac50fSopenharmony_ci return; 2831e0dac50fSopenharmony_ci } 2832e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(window->context_); 2833e0dac50fSopenharmony_ci if (abilityContext == nullptr) { 2834e0dac50fSopenharmony_ci WLOGFE("abilityContext is null"); 2835e0dac50fSopenharmony_ci return; 2836e0dac50fSopenharmony_ci } 2837e0dac50fSopenharmony_ci bool needMoveToBackground = false; 2838e0dac50fSopenharmony_ci int ret = abilityContext->OnBackPressedCallBack(needMoveToBackground); 2839e0dac50fSopenharmony_ci if (ret == ERR_OK && needMoveToBackground) { 2840e0dac50fSopenharmony_ci abilityContext->MoveAbilityToBackground(); 2841e0dac50fSopenharmony_ci WLOGD("id: %{public}u closed, to move Ability: %{public}u", 2842e0dac50fSopenharmony_ci window->property_->GetWindowId(), needMoveToBackground); 2843e0dac50fSopenharmony_ci return; 2844e0dac50fSopenharmony_ci } 2845e0dac50fSopenharmony_ci // TerminateAbility will invoke last ability, CloseAbility will not. 2846e0dac50fSopenharmony_ci bool shouldTerminateAbility = WindowHelper::IsFullScreenWindow(window->property_->GetWindowMode()); 2847e0dac50fSopenharmony_ci if (shouldTerminateAbility) { 2848e0dac50fSopenharmony_ci abilityContext->TerminateSelf(); 2849e0dac50fSopenharmony_ci } else { 2850e0dac50fSopenharmony_ci abilityContext->CloseAbility(); 2851e0dac50fSopenharmony_ci } 2852e0dac50fSopenharmony_ci WLOGD("id: %{public}u closed, to kill Ability: %{public}u", 2853e0dac50fSopenharmony_ci window->property_->GetWindowId(), static_cast<uint32_t>(shouldTerminateAbility)); 2854e0dac50fSopenharmony_ci }; 2855e0dac50fSopenharmony_ci handler_ = std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner()); 2856e0dac50fSopenharmony_ci handler_->PostTask(task, "WindowImpl::PerformBack"); 2857e0dac50fSopenharmony_ci} 2858e0dac50fSopenharmony_ci 2859e0dac50fSopenharmony_civoid WindowImpl::ConsumeKeyEvent(std::shared_ptr<MMI::KeyEvent>& keyEvent) 2860e0dac50fSopenharmony_ci{ 2861e0dac50fSopenharmony_ci int32_t keyCode = keyEvent->GetKeyCode(); 2862e0dac50fSopenharmony_ci int32_t keyAction = keyEvent->GetKeyAction(); 2863e0dac50fSopenharmony_ci WLOGFD("KeyCode: %{public}d, action: %{public}d", keyCode, keyAction); 2864e0dac50fSopenharmony_ci bool shouldMarkProcess = true; 2865e0dac50fSopenharmony_ci if (keyCode == MMI::KeyEvent::KEYCODE_BACK && keyAction == MMI::KeyEvent::KEY_ACTION_UP) { 2866e0dac50fSopenharmony_ci HandleBackKeyPressedEvent(keyEvent); 2867e0dac50fSopenharmony_ci } else { 2868e0dac50fSopenharmony_ci std::shared_ptr<IInputEventConsumer> inputEventConsumer; 2869e0dac50fSopenharmony_ci { 2870e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 2871e0dac50fSopenharmony_ci inputEventConsumer = inputEventConsumer_; 2872e0dac50fSopenharmony_ci } 2873e0dac50fSopenharmony_ci if (inputEventConsumer != nullptr) { 2874e0dac50fSopenharmony_ci WLOGD("Transfer key event to inputEventConsumer"); 2875e0dac50fSopenharmony_ci (void)inputEventConsumer->OnInputEvent(keyEvent); 2876e0dac50fSopenharmony_ci shouldMarkProcess = false; 2877e0dac50fSopenharmony_ci } else if (uiContent_ != nullptr) { 2878e0dac50fSopenharmony_ci WLOGD("Transfer key event to uiContent"); 2879e0dac50fSopenharmony_ci bool handled = static_cast<bool>(uiContent_->ProcessKeyEvent(keyEvent)); 2880e0dac50fSopenharmony_ci if (!handled && keyCode == MMI::KeyEvent::KEYCODE_ESCAPE && 2881e0dac50fSopenharmony_ci GetMode() == WindowMode::WINDOW_MODE_FULLSCREEN && 2882e0dac50fSopenharmony_ci property_->GetMaximizeMode() == MaximizeMode::MODE_FULL_FILL && 2883e0dac50fSopenharmony_ci keyAction == MMI::KeyEvent::KEY_ACTION_DOWN && !escKeyEventTriggered_) { 2884e0dac50fSopenharmony_ci WLOGI("recover from fullscreen cause KEYCODE_ESCAPE"); 2885e0dac50fSopenharmony_ci Recover(); 2886e0dac50fSopenharmony_ci } 2887e0dac50fSopenharmony_ci if (keyEvent->GetKeyCode() == MMI::KeyEvent::KEYCODE_ESCAPE) { 2888e0dac50fSopenharmony_ci escKeyEventTriggered_ = (keyAction == MMI::KeyEvent::KEY_ACTION_UP) ? false : true; 2889e0dac50fSopenharmony_ci } 2890e0dac50fSopenharmony_ci shouldMarkProcess = !handled; 2891e0dac50fSopenharmony_ci } else { 2892e0dac50fSopenharmony_ci WLOGFE("There is no key event consumer"); 2893e0dac50fSopenharmony_ci } 2894e0dac50fSopenharmony_ci } 2895e0dac50fSopenharmony_ci if (GetType() == WindowType::WINDOW_TYPE_APP_COMPONENT) { 2896e0dac50fSopenharmony_ci WLOGFI("DispatchKeyEvent: %{public}u", GetWindowId()); 2897e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().DispatchKeyEvent(GetWindowId(), keyEvent); 2898e0dac50fSopenharmony_ci keyEvent->MarkProcessed(); 2899e0dac50fSopenharmony_ci return; 2900e0dac50fSopenharmony_ci } 2901e0dac50fSopenharmony_ci if (shouldMarkProcess) { 2902e0dac50fSopenharmony_ci keyEvent->MarkProcessed(); 2903e0dac50fSopenharmony_ci } 2904e0dac50fSopenharmony_ci} 2905e0dac50fSopenharmony_ci 2906e0dac50fSopenharmony_civoid WindowImpl::HandleModeChangeHotZones(int32_t posX, int32_t posY) 2907e0dac50fSopenharmony_ci{ 2908e0dac50fSopenharmony_ci if (!WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) { 2909e0dac50fSopenharmony_ci return; 2910e0dac50fSopenharmony_ci } 2911e0dac50fSopenharmony_ci 2912e0dac50fSopenharmony_ci ModeChangeHotZones hotZones; 2913e0dac50fSopenharmony_ci auto res = SingletonContainer::Get<WindowAdapter>().GetModeChangeHotZones(property_->GetDisplayId(), hotZones); 2914e0dac50fSopenharmony_ci WLOGD("[HotZone] Window %{public}u, Pointer[%{public}d, %{public}d]", GetWindowId(), posX, posY); 2915e0dac50fSopenharmony_ci if (res == WMError::WM_OK) { 2916e0dac50fSopenharmony_ci WLOGD("[HotZone] Fullscreen [%{public}d, %{public}d, %{public}u, %{public}u]", hotZones.fullscreen_.posX_, 2917e0dac50fSopenharmony_ci hotZones.fullscreen_.posY_, hotZones.fullscreen_.width_, hotZones.fullscreen_.height_); 2918e0dac50fSopenharmony_ci WLOGD("[HotZone] Primary [%{public}d, %{public}d, %{public}u, %{public}u]", hotZones.primary_.posX_, 2919e0dac50fSopenharmony_ci hotZones.primary_.posY_, hotZones.primary_.width_, hotZones.primary_.height_); 2920e0dac50fSopenharmony_ci WLOGD("[HotZone] Secondary [%{public}d, %{public}d, %{public}u, %{public}u]", hotZones.secondary_.posX_, 2921e0dac50fSopenharmony_ci hotZones.secondary_.posY_, hotZones.secondary_.width_, hotZones.secondary_.height_); 2922e0dac50fSopenharmony_ci 2923e0dac50fSopenharmony_ci if (WindowHelper::IsPointInTargetRectWithBound(posX, posY, hotZones.fullscreen_)) { 2924e0dac50fSopenharmony_ci SetFullScreen(true); 2925e0dac50fSopenharmony_ci } else if (WindowHelper::IsPointInTargetRectWithBound(posX, posY, hotZones.primary_)) { 2926e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY); 2927e0dac50fSopenharmony_ci } else if (WindowHelper::IsPointInTargetRectWithBound(posX, posY, hotZones.secondary_)) { 2928e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY); 2929e0dac50fSopenharmony_ci } 2930e0dac50fSopenharmony_ci } 2931e0dac50fSopenharmony_ci} 2932e0dac50fSopenharmony_ci 2933e0dac50fSopenharmony_civoid WindowImpl::UpdatePointerEventForStretchableWindow(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 2934e0dac50fSopenharmony_ci{ 2935e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 2936e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { 2937e0dac50fSopenharmony_ci WLOGFW("Point item is invalid"); 2938e0dac50fSopenharmony_ci return; 2939e0dac50fSopenharmony_ci } 2940e0dac50fSopenharmony_ci const Rect& originRect = property_->GetOriginRect(); 2941e0dac50fSopenharmony_ci PointInfo originPos = 2942e0dac50fSopenharmony_ci WindowHelper::CalculateOriginPosition(originRect, GetRect(), 2943e0dac50fSopenharmony_ci { pointerItem.GetDisplayX(), pointerItem.GetDisplayY() }); 2944e0dac50fSopenharmony_ci pointerItem.SetDisplayX(originPos.x); 2945e0dac50fSopenharmony_ci pointerItem.SetDisplayY(originPos.y); 2946e0dac50fSopenharmony_ci pointerItem.SetWindowX(originPos.x - originRect.posX_); 2947e0dac50fSopenharmony_ci pointerItem.SetWindowY(originPos.y - originRect.posY_); 2948e0dac50fSopenharmony_ci pointerEvent->UpdatePointerItem(pointerEvent->GetPointerId(), pointerItem); 2949e0dac50fSopenharmony_ci} 2950e0dac50fSopenharmony_ci 2951e0dac50fSopenharmony_civoid WindowImpl::UpdateDragType(int32_t startPointPosX, int32_t startPointPosY) 2952e0dac50fSopenharmony_ci{ 2953e0dac50fSopenharmony_ci const auto& startRectExceptCorner = moveDragProperty_->startRectExceptCorner_; 2954e0dac50fSopenharmony_ci if (startPointPosX > startRectExceptCorner.posX_ && 2955e0dac50fSopenharmony_ci (startPointPosX < startRectExceptCorner.posX_ + 2956e0dac50fSopenharmony_ci static_cast<int32_t>(startRectExceptCorner.width_))) { 2957e0dac50fSopenharmony_ci moveDragProperty_->dragType_ = DragType::DRAG_BOTTOM_OR_TOP; 2958e0dac50fSopenharmony_ci } else if (startPointPosY > startRectExceptCorner.posY_ && 2959e0dac50fSopenharmony_ci (startPointPosY < startRectExceptCorner.posY_ + 2960e0dac50fSopenharmony_ci static_cast<int32_t>(startRectExceptCorner.height_))) { 2961e0dac50fSopenharmony_ci moveDragProperty_->dragType_ = DragType::DRAG_LEFT_OR_RIGHT; 2962e0dac50fSopenharmony_ci } else if ((startPointPosX <= startRectExceptCorner.posX_ && startPointPosY <= startRectExceptCorner.posY_) || 2963e0dac50fSopenharmony_ci (startPointPosX >= startRectExceptCorner.posX_ + static_cast<int32_t>(startRectExceptCorner.width_) && 2964e0dac50fSopenharmony_ci startPointPosY >= startRectExceptCorner.posY_ + static_cast<int32_t>(startRectExceptCorner.height_))) { 2965e0dac50fSopenharmony_ci moveDragProperty_->dragType_ = DragType::DRAG_LEFT_TOP_CORNER; 2966e0dac50fSopenharmony_ci } else { 2967e0dac50fSopenharmony_ci moveDragProperty_->dragType_ = DragType::DRAG_RIGHT_TOP_CORNER; 2968e0dac50fSopenharmony_ci } 2969e0dac50fSopenharmony_ci} 2970e0dac50fSopenharmony_ci 2971e0dac50fSopenharmony_civoid WindowImpl::CalculateStartRectExceptHotZone(float vpr) 2972e0dac50fSopenharmony_ci{ 2973e0dac50fSopenharmony_ci TransformHelper::Vector2 hotZoneScale(1, 1); 2974e0dac50fSopenharmony_ci if (property_->isNeedComputerTransform()) { 2975e0dac50fSopenharmony_ci property_->ComputeTransform(); 2976e0dac50fSopenharmony_ci hotZoneScale = WindowHelper::CalculateHotZoneScale(property_->GetTransformMat()); 2977e0dac50fSopenharmony_ci } 2978e0dac50fSopenharmony_ci 2979e0dac50fSopenharmony_ci const auto& startPointRect = GetRect(); 2980e0dac50fSopenharmony_ci auto& startRectExceptFrame = moveDragProperty_->startRectExceptFrame_; 2981e0dac50fSopenharmony_ci startRectExceptFrame.posX_ = startPointRect.posX_ + 2982e0dac50fSopenharmony_ci static_cast<int32_t>(WINDOW_FRAME_WIDTH * vpr / hotZoneScale.x_); 2983e0dac50fSopenharmony_ci startRectExceptFrame.posY_ = startPointRect.posY_ + 2984e0dac50fSopenharmony_ci static_cast<int32_t>(WINDOW_FRAME_WIDTH * vpr / hotZoneScale.y_); 2985e0dac50fSopenharmony_ci startRectExceptFrame.width_ = startPointRect.width_ - 2986e0dac50fSopenharmony_ci static_cast<uint32_t>((WINDOW_FRAME_WIDTH + WINDOW_FRAME_WIDTH) * vpr / hotZoneScale.x_); 2987e0dac50fSopenharmony_ci startRectExceptFrame.height_ = startPointRect.height_ - 2988e0dac50fSopenharmony_ci static_cast<uint32_t>((WINDOW_FRAME_WIDTH + WINDOW_FRAME_WIDTH) * vpr / hotZoneScale.y_); 2989e0dac50fSopenharmony_ci 2990e0dac50fSopenharmony_ci auto& startRectExceptCorner = moveDragProperty_->startRectExceptCorner_; 2991e0dac50fSopenharmony_ci startRectExceptCorner.posX_ = startPointRect.posX_ + 2992e0dac50fSopenharmony_ci static_cast<int32_t>(WINDOW_FRAME_CORNER_WIDTH * vpr / hotZoneScale.x_); 2993e0dac50fSopenharmony_ci startRectExceptCorner.posY_ = startPointRect.posY_ + 2994e0dac50fSopenharmony_ci static_cast<int32_t>(WINDOW_FRAME_CORNER_WIDTH * vpr / hotZoneScale.y_); 2995e0dac50fSopenharmony_ci startRectExceptCorner.width_ = startPointRect.width_ - 2996e0dac50fSopenharmony_ci static_cast<uint32_t>((WINDOW_FRAME_CORNER_WIDTH + WINDOW_FRAME_CORNER_WIDTH) * vpr / hotZoneScale.x_); 2997e0dac50fSopenharmony_ci startRectExceptCorner.height_ = startPointRect.height_ - 2998e0dac50fSopenharmony_ci static_cast<uint32_t>((WINDOW_FRAME_CORNER_WIDTH + WINDOW_FRAME_CORNER_WIDTH) * vpr / hotZoneScale.y_); 2999e0dac50fSopenharmony_ci} 3000e0dac50fSopenharmony_ci 3001e0dac50fSopenharmony_cibool WindowImpl::IsPointInDragHotZone(int32_t startPointPosX, int32_t startPointPosY, int32_t sourceType) 3002e0dac50fSopenharmony_ci{ 3003e0dac50fSopenharmony_ci // calculate rect with hotzone 3004e0dac50fSopenharmony_ci Rect rectWithHotzone; 3005e0dac50fSopenharmony_ci rectWithHotzone.posX_ = GetRect().posX_ - static_cast<int32_t>(HOTZONE_POINTER); 3006e0dac50fSopenharmony_ci rectWithHotzone.posY_ = GetRect().posY_ - static_cast<int32_t>(HOTZONE_POINTER); 3007e0dac50fSopenharmony_ci rectWithHotzone.width_ = GetRect().width_ + HOTZONE_POINTER * 2; // 2: calculate width need 3008e0dac50fSopenharmony_ci rectWithHotzone.height_ = GetRect().height_ + HOTZONE_POINTER * 2; // 2: calculate height need 3009e0dac50fSopenharmony_ci 3010e0dac50fSopenharmony_ci if (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && 3011e0dac50fSopenharmony_ci !WindowHelper::IsPointInTargetRectWithBound(startPointPosX, startPointPosY, rectWithHotzone)) { 3012e0dac50fSopenharmony_ci return false; 3013e0dac50fSopenharmony_ci } else if ((!WindowHelper::IsPointInTargetRect(startPointPosX, 3014e0dac50fSopenharmony_ci startPointPosY, moveDragProperty_->startRectExceptFrame_)) || 3015e0dac50fSopenharmony_ci (!WindowHelper::IsPointInWindowExceptCorner(startPointPosX, 3016e0dac50fSopenharmony_ci startPointPosY, moveDragProperty_->startRectExceptCorner_))) { 3017e0dac50fSopenharmony_ci return true; 3018e0dac50fSopenharmony_ci } 3019e0dac50fSopenharmony_ci return false; 3020e0dac50fSopenharmony_ci} 3021e0dac50fSopenharmony_ci 3022e0dac50fSopenharmony_civoid WindowImpl::StartMove() 3023e0dac50fSopenharmony_ci{ 3024e0dac50fSopenharmony_ci if (!WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) { 3025e0dac50fSopenharmony_ci WLOGE("[StartMove] current window can not be moved, windowId %{public}u", GetWindowId()); 3026e0dac50fSopenharmony_ci return; 3027e0dac50fSopenharmony_ci } 3028e0dac50fSopenharmony_ci if (!moveDragProperty_->pointEventStarted_ || moveDragProperty_->startDragFlag_) { 3029e0dac50fSopenharmony_ci WLOGE("[StartMove] pointerEvent has not been started, or is dragging now"); 3030e0dac50fSopenharmony_ci return; 3031e0dac50fSopenharmony_ci } 3032e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_ = true; 3033e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyServerReadyToMoveOrDrag(property_->GetWindowId(), 3034e0dac50fSopenharmony_ci property_, moveDragProperty_); 3035e0dac50fSopenharmony_ci WLOGI("[StartMove] windowId %{public}u", GetWindowId()); 3036e0dac50fSopenharmony_ci} 3037e0dac50fSopenharmony_ci 3038e0dac50fSopenharmony_civoid WindowImpl::ResetMoveOrDragState() 3039e0dac50fSopenharmony_ci{ 3040e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 3041e0dac50fSopenharmony_ci return; 3042e0dac50fSopenharmony_ci } 3043e0dac50fSopenharmony_ci moveDragProperty_->pointEventStarted_ = false; 3044e0dac50fSopenharmony_ci moveDragProperty_->startDragFlag_ = false; 3045e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_ = false; 3046e0dac50fSopenharmony_ci UpdateRect(GetRect(), property_->GetDecoStatus(), WindowSizeChangeReason::DRAG_END); 3047e0dac50fSopenharmony_ci} 3048e0dac50fSopenharmony_ci 3049e0dac50fSopenharmony_civoid WindowImpl::ReadyToMoveOrDragWindow(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 3050e0dac50fSopenharmony_ci const MMI::PointerEvent::PointerItem& pointerItem) 3051e0dac50fSopenharmony_ci{ 3052e0dac50fSopenharmony_ci if (moveDragProperty_->pointEventStarted_) { 3053e0dac50fSopenharmony_ci return; 3054e0dac50fSopenharmony_ci } 3055e0dac50fSopenharmony_ci 3056e0dac50fSopenharmony_ci moveDragProperty_->startPointRect_ = GetRect(); 3057e0dac50fSopenharmony_ci moveDragProperty_->startPointPosX_ = pointerItem.GetDisplayX(); 3058e0dac50fSopenharmony_ci moveDragProperty_->startPointPosY_ = pointerItem.GetDisplayY(); 3059e0dac50fSopenharmony_ci moveDragProperty_->startPointerId_ = pointerEvent->GetPointerId(); 3060e0dac50fSopenharmony_ci moveDragProperty_->targetDisplayId_ = pointerEvent->GetTargetDisplayId(); 3061e0dac50fSopenharmony_ci moveDragProperty_->sourceType_ = pointerEvent->GetSourceType(); 3062e0dac50fSopenharmony_ci moveDragProperty_->pointEventStarted_ = true; 3063e0dac50fSopenharmony_ci 3064e0dac50fSopenharmony_ci // calculate window inner rect except frame 3065e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3066e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(moveDragProperty_->targetDisplayId_); 3067e0dac50fSopenharmony_ci if (display == nullptr) { 3068e0dac50fSopenharmony_ci WLOGFE("get display failed moveDragProperty targetDisplayId:%{public}u, window id:%{public}u", 3069e0dac50fSopenharmony_ci moveDragProperty_->targetDisplayId_, property_->GetWindowId()); 3070e0dac50fSopenharmony_ci return; 3071e0dac50fSopenharmony_ci } 3072e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 3073e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 3074e0dac50fSopenharmony_ci WLOGFE("get display info failed moveDragProperty targetDisplayId:%{public}u, window id:%{public}u", 3075e0dac50fSopenharmony_ci moveDragProperty_->targetDisplayId_, property_->GetWindowId()); 3076e0dac50fSopenharmony_ci return; 3077e0dac50fSopenharmony_ci } 3078e0dac50fSopenharmony_ci float vpr = display->GetVirtualPixelRatio(); 3079e0dac50fSopenharmony_ci int32_t startPointPosX = moveDragProperty_->startPointPosX_ + displayInfo->GetOffsetX(); 3080e0dac50fSopenharmony_ci int32_t startPointPosY = moveDragProperty_->startPointPosY_ + displayInfo->GetOffsetY(); 3081e0dac50fSopenharmony_ci 3082e0dac50fSopenharmony_ci CalculateStartRectExceptHotZone(vpr); 3083e0dac50fSopenharmony_ci 3084e0dac50fSopenharmony_ci if (GetType() == WindowType::WINDOW_TYPE_DOCK_SLICE) { 3085e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_ = true; 3086e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyServerReadyToMoveOrDrag(property_->GetWindowId(), 3087e0dac50fSopenharmony_ci property_, moveDragProperty_); 3088e0dac50fSopenharmony_ci } else if (IsPointInDragHotZone(startPointPosX, startPointPosY, moveDragProperty_->sourceType_) 3089e0dac50fSopenharmony_ci && property_->GetMaximizeMode() != MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 3090e0dac50fSopenharmony_ci moveDragProperty_->startDragFlag_ = true; 3091e0dac50fSopenharmony_ci UpdateDragType(startPointPosX, startPointPosY); 3092e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyServerReadyToMoveOrDrag(property_->GetWindowId(), 3093e0dac50fSopenharmony_ci property_, moveDragProperty_); 3094e0dac50fSopenharmony_ci } 3095e0dac50fSopenharmony_ci return; 3096e0dac50fSopenharmony_ci} 3097e0dac50fSopenharmony_ci 3098e0dac50fSopenharmony_civoid WindowImpl::EndMoveOrDragWindow(int32_t posX, int32_t posY, int32_t pointId, int32_t sourceType) 3099e0dac50fSopenharmony_ci{ 3100e0dac50fSopenharmony_ci if (pointId != moveDragProperty_->startPointerId_ || sourceType != moveDragProperty_->sourceType_) { 3101e0dac50fSopenharmony_ci return; 3102e0dac50fSopenharmony_ci } 3103e0dac50fSopenharmony_ci 3104e0dac50fSopenharmony_ci if (moveDragProperty_->startDragFlag_) { 3105e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().ProcessPointUp(GetWindowId()); 3106e0dac50fSopenharmony_ci moveDragProperty_->startDragFlag_ = false; 3107e0dac50fSopenharmony_ci } 3108e0dac50fSopenharmony_ci 3109e0dac50fSopenharmony_ci if (moveDragProperty_->startMoveFlag_) { 3110e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().ProcessPointUp(GetWindowId()); 3111e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_ = false; 3112e0dac50fSopenharmony_ci HandleModeChangeHotZones(posX, posY); 3113e0dac50fSopenharmony_ci } 3114e0dac50fSopenharmony_ci moveDragProperty_->pointEventStarted_ = false; 3115e0dac50fSopenharmony_ci ResSchedReport::GetInstance().StopPerfIfNeed(); 3116e0dac50fSopenharmony_ci} 3117e0dac50fSopenharmony_ci 3118e0dac50fSopenharmony_civoid WindowImpl::ConsumeMoveOrDragEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 3119e0dac50fSopenharmony_ci{ 3120e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 3121e0dac50fSopenharmony_ci int32_t pointId = pointerEvent->GetPointerId(); 3122e0dac50fSopenharmony_ci int32_t sourceType = pointerEvent->GetSourceType(); 3123e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointId, pointerItem) || 3124e0dac50fSopenharmony_ci (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && 3125e0dac50fSopenharmony_ci pointerEvent->GetButtonId() != MMI::PointerEvent::MOUSE_BUTTON_LEFT)) { 3126e0dac50fSopenharmony_ci WLOGFW("invalid pointerEvent"); 3127e0dac50fSopenharmony_ci return; 3128e0dac50fSopenharmony_ci } 3129e0dac50fSopenharmony_ci int32_t pointDisplayX = pointerItem.GetDisplayX(); 3130e0dac50fSopenharmony_ci int32_t pointDisplayY = pointerItem.GetDisplayY(); 3131e0dac50fSopenharmony_ci int32_t action = pointerEvent->GetPointerAction(); 3132e0dac50fSopenharmony_ci int32_t targetDisplayId = pointerEvent->GetTargetDisplayId(); 3133e0dac50fSopenharmony_ci switch (action) { 3134e0dac50fSopenharmony_ci // Ready to move or drag 3135e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_DOWN: 3136e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: { 3137e0dac50fSopenharmony_ci const auto& rect = GetRect(); 3138e0dac50fSopenharmony_ci ReadyToMoveOrDragWindow(pointerEvent, pointerItem); 3139e0dac50fSopenharmony_ci if (IsPointerEventConsumed()) { 3140e0dac50fSopenharmony_ci ResSchedReport::GetInstance().TrigClick(); 3141e0dac50fSopenharmony_ci } 3142e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_EVENT, "windowId:%{public}u, pointId:%{public}d, sourceType:%{public}d, " 3143e0dac50fSopenharmony_ci "hasPointStarted:%{public}d, startMove:%{public}d, startDrag:%{public}d, targetDisplayId:" 3144e0dac50fSopenharmony_ci "%{public}d, pointPos:[%{private}d, %{private}d], winRect:[%{public}d, %{public}d, %{public}u, " 3145e0dac50fSopenharmony_ci "%{public}u]", GetWindowId(), pointId, sourceType, moveDragProperty_->pointEventStarted_, 3146e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_, moveDragProperty_->startDragFlag_, targetDisplayId, 3147e0dac50fSopenharmony_ci pointDisplayX, pointDisplayY, rect.posX_, rect.posY_, rect.width_, rect.height_); 3148e0dac50fSopenharmony_ci break; 3149e0dac50fSopenharmony_ci } 3150e0dac50fSopenharmony_ci // End move or drag 3151e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_UP: 3152e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_BUTTON_UP: 3153e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_CANCEL: { 3154e0dac50fSopenharmony_ci EndMoveOrDragWindow(pointDisplayX, pointDisplayY, pointId, sourceType); 3155e0dac50fSopenharmony_ci WLOGFD("[Client Point Up/Cancel]: windowId: %{public}u, action: %{public}d, sourceType: %{public}d, " 3156e0dac50fSopenharmony_ci "startMove: %{public}d, startDrag: %{public}d", GetWindowId(), action, sourceType, 3157e0dac50fSopenharmony_ci moveDragProperty_->startMoveFlag_, moveDragProperty_->startDragFlag_); 3158e0dac50fSopenharmony_ci break; 3159e0dac50fSopenharmony_ci } 3160e0dac50fSopenharmony_ci default: 3161e0dac50fSopenharmony_ci break; 3162e0dac50fSopenharmony_ci } 3163e0dac50fSopenharmony_ci} 3164e0dac50fSopenharmony_ci 3165e0dac50fSopenharmony_cibool WindowImpl::IsPointerEventConsumed() 3166e0dac50fSopenharmony_ci{ 3167e0dac50fSopenharmony_ci return moveDragProperty_->startDragFlag_ || moveDragProperty_->startMoveFlag_; 3168e0dac50fSopenharmony_ci} 3169e0dac50fSopenharmony_ci 3170e0dac50fSopenharmony_civoid WindowImpl::TransferPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 3171e0dac50fSopenharmony_ci{ 3172e0dac50fSopenharmony_ci if (pointerEvent == nullptr) { 3173e0dac50fSopenharmony_ci WLOGFE("The pointer event is nullptr"); 3174e0dac50fSopenharmony_ci return; 3175e0dac50fSopenharmony_ci } 3176e0dac50fSopenharmony_ci if (windowSystemConfig_.isStretchable_ && GetMode() == WindowMode::WINDOW_MODE_FLOATING) { 3177e0dac50fSopenharmony_ci UpdatePointerEventForStretchableWindow(pointerEvent); 3178e0dac50fSopenharmony_ci } 3179e0dac50fSopenharmony_ci std::shared_ptr<IInputEventConsumer> inputEventConsumer; 3180e0dac50fSopenharmony_ci { 3181e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 3182e0dac50fSopenharmony_ci inputEventConsumer = inputEventConsumer_; 3183e0dac50fSopenharmony_ci } 3184e0dac50fSopenharmony_ci if (inputEventConsumer != nullptr) { 3185e0dac50fSopenharmony_ci WLOGFD("Transfer pointer event to inputEventConsumer"); 3186e0dac50fSopenharmony_ci if (!(inputEventConsumer->OnInputEvent(pointerEvent))) { 3187e0dac50fSopenharmony_ci WLOGFI("The Input event consumer consumes pointer event failed."); 3188e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3189e0dac50fSopenharmony_ci } 3190e0dac50fSopenharmony_ci } else if (uiContent_ != nullptr) { 3191e0dac50fSopenharmony_ci WLOGFD("Transfer pointer event to uiContent"); 3192e0dac50fSopenharmony_ci if (!(uiContent_->ProcessPointerEvent(pointerEvent))) { 3193e0dac50fSopenharmony_ci WLOGFI("The UI content consumes pointer event failed."); 3194e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3195e0dac50fSopenharmony_ci } 3196e0dac50fSopenharmony_ci } else { 3197e0dac50fSopenharmony_ci WLOGFW("pointerEvent is not consumed, windowId: %{public}u", GetWindowId()); 3198e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3199e0dac50fSopenharmony_ci } 3200e0dac50fSopenharmony_ci} 3201e0dac50fSopenharmony_ci 3202e0dac50fSopenharmony_ciuint32_t WindowImpl::CalculatePointerDirection(int32_t pointerX, int32_t pointerY) 3203e0dac50fSopenharmony_ci{ 3204e0dac50fSopenharmony_ci UpdateDragType(pointerX, pointerY); 3205e0dac50fSopenharmony_ci return STYLEID_MAP.at(moveDragProperty_->dragType_); 3206e0dac50fSopenharmony_ci} 3207e0dac50fSopenharmony_ci 3208e0dac50fSopenharmony_civoid WindowImpl::HandlePointerStyle(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 3209e0dac50fSopenharmony_ci{ 3210e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 3211e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { 3212e0dac50fSopenharmony_ci WLOGFE("Get pointeritem failed"); 3213e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3214e0dac50fSopenharmony_ci return; 3215e0dac50fSopenharmony_ci } 3216e0dac50fSopenharmony_ci auto action = pointerEvent->GetPointerAction(); 3217e0dac50fSopenharmony_ci uint32_t windowId = static_cast<uint32_t>(pointerEvent->GetAgentWindowId()); 3218e0dac50fSopenharmony_ci int32_t mousePointX = pointerItem.GetDisplayX(); 3219e0dac50fSopenharmony_ci int32_t mousePointY = pointerItem.GetDisplayY(); 3220e0dac50fSopenharmony_ci int32_t sourceType = pointerEvent->GetSourceType(); 3221e0dac50fSopenharmony_ci uint32_t oldStyleID = mouseStyleID_; 3222e0dac50fSopenharmony_ci uint32_t newStyleID = 0; 3223e0dac50fSopenharmony_ci if (WindowHelper::IsMainFloatingWindow(GetType(), GetMode())) { 3224e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3225e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(pointerEvent->GetTargetDisplayId()); 3226e0dac50fSopenharmony_ci if (display == nullptr || display->GetDisplayInfo() == nullptr) { 3227e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64", window id:%{public}u", 3228e0dac50fSopenharmony_ci property_->GetDisplayId(), property_->GetWindowId()); 3229e0dac50fSopenharmony_ci return; 3230e0dac50fSopenharmony_ci } 3231e0dac50fSopenharmony_ci float vpr = display->GetVirtualPixelRatio(); 3232e0dac50fSopenharmony_ci CalculateStartRectExceptHotZone(vpr); 3233e0dac50fSopenharmony_ci if (IsPointInDragHotZone(mousePointX, mousePointY, sourceType) && 3234e0dac50fSopenharmony_ci property_->GetMaximizeMode() != MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 3235e0dac50fSopenharmony_ci newStyleID = CalculatePointerDirection(mousePointX, mousePointY); 3236e0dac50fSopenharmony_ci } else if (action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP) { 3237e0dac50fSopenharmony_ci newStyleID = MMI::MOUSE_ICON::DEFAULT; 3238e0dac50fSopenharmony_ci } 3239e0dac50fSopenharmony_ci } else if (GetType() == WindowType::WINDOW_TYPE_DOCK_SLICE) { 3240e0dac50fSopenharmony_ci newStyleID = (GetRect().width_ > GetRect().height_) ? 3241e0dac50fSopenharmony_ci MMI::MOUSE_ICON::NORTH_SOUTH : MMI::MOUSE_ICON::WEST_EAST; 3242e0dac50fSopenharmony_ci if (action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP) { 3243e0dac50fSopenharmony_ci newStyleID = MMI::MOUSE_ICON::DEFAULT; // when receive up event, set default style 3244e0dac50fSopenharmony_ci } 3245e0dac50fSopenharmony_ci } 3246e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_EVENT, "winId:%{public}u, Mouse posX:%{private}u, posY:%{private}u, action:%{public}u, " 3247e0dac50fSopenharmony_ci "winRect posX:%{public}u, posY:%{public}u, W:%{public}u, H:%{public}u, " 3248e0dac50fSopenharmony_ci "newStyle:%{public}u, oldStyle:%{public}u", 3249e0dac50fSopenharmony_ci windowId, mousePointX, mousePointY, action, GetRect().posX_, 3250e0dac50fSopenharmony_ci GetRect().posY_, GetRect().width_, GetRect().height_, newStyleID, oldStyleID); 3251e0dac50fSopenharmony_ci if (oldStyleID != newStyleID) { 3252e0dac50fSopenharmony_ci MMI::PointerStyle pointerStyle; 3253e0dac50fSopenharmony_ci pointerStyle.id = static_cast<int32_t>(newStyleID); 3254e0dac50fSopenharmony_ci int32_t res = MMI::InputManager::GetInstance()->SetPointerStyle(windowId, pointerStyle); 3255e0dac50fSopenharmony_ci if (res != 0) { 3256e0dac50fSopenharmony_ci WLOGFE("set pointer style failed, res is %{public}u", res); 3257e0dac50fSopenharmony_ci return; 3258e0dac50fSopenharmony_ci } 3259e0dac50fSopenharmony_ci mouseStyleID_ = newStyleID; 3260e0dac50fSopenharmony_ci } 3261e0dac50fSopenharmony_ci} 3262e0dac50fSopenharmony_ci 3263e0dac50fSopenharmony_civoid WindowImpl::PerfLauncherHotAreaIfNeed(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 3264e0dac50fSopenharmony_ci{ 3265e0dac50fSopenharmony_ci#ifdef RESOURCE_SCHEDULE_SERVICE_ENABLE 3266e0dac50fSopenharmony_ci int32_t action = pointerEvent->GetPointerAction(); 3267e0dac50fSopenharmony_ci if (action != MMI::PointerEvent::POINTER_ACTION_CANCEL) { 3268e0dac50fSopenharmony_ci return; 3269e0dac50fSopenharmony_ci } 3270e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 3271e0dac50fSopenharmony_ci int32_t pointId = pointerEvent->GetPointerId(); 3272e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointId, pointerItem)) { 3273e0dac50fSopenharmony_ci WLOGFW("invalid pointerEvent"); 3274e0dac50fSopenharmony_ci return; 3275e0dac50fSopenharmony_ci } 3276e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3277e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 3278e0dac50fSopenharmony_ci if (display == nullptr) { 3279e0dac50fSopenharmony_ci return; 3280e0dac50fSopenharmony_ci } 3281e0dac50fSopenharmony_ci auto displayHeight = display->GetHeight(); 3282e0dac50fSopenharmony_ci constexpr float HOT_RATE = 0.07; 3283e0dac50fSopenharmony_ci auto height = static_cast<int32_t>(displayHeight * HOT_RATE); 3284e0dac50fSopenharmony_ci int32_t pointDisplayY = pointerItem.GetDisplayY(); 3285e0dac50fSopenharmony_ci if (pointDisplayY > displayHeight - height) { 3286e0dac50fSopenharmony_ci ResSchedReport::GetInstance().AnimationBoost(); 3287e0dac50fSopenharmony_ci } 3288e0dac50fSopenharmony_ci#endif 3289e0dac50fSopenharmony_ci} 3290e0dac50fSopenharmony_ci 3291e0dac50fSopenharmony_civoid WindowImpl::ConsumePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 3292e0dac50fSopenharmony_ci{ 3293e0dac50fSopenharmony_ci // If windowRect transformed, transform event back to its origin position 3294e0dac50fSopenharmony_ci if (property_) { 3295e0dac50fSopenharmony_ci property_->UpdatePointerEvent(pointerEvent); 3296e0dac50fSopenharmony_ci } 3297e0dac50fSopenharmony_ci int32_t action = pointerEvent->GetPointerAction(); 3298e0dac50fSopenharmony_ci if (action == MMI::PointerEvent::POINTER_ACTION_MOVE || action == MMI::PointerEvent::POINTER_ACTION_DOWN || 3299e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN) { 3300e0dac50fSopenharmony_ci ResSchedReport::GetInstance().TrigSlide(GetType(), true); 3301e0dac50fSopenharmony_ci } 3302e0dac50fSopenharmony_ci if (action == MMI::PointerEvent::POINTER_ACTION_UP || action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP || 3303e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_CANCEL) { 3304e0dac50fSopenharmony_ci ResSchedReport::GetInstance().TrigSlide(GetType(), false); 3305e0dac50fSopenharmony_ci } 3306e0dac50fSopenharmony_ci if ((action == MMI::PointerEvent::POINTER_ACTION_MOVE || action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP) && 3307e0dac50fSopenharmony_ci pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_MOUSE) { 3308e0dac50fSopenharmony_ci HandlePointerStyle(pointerEvent); 3309e0dac50fSopenharmony_ci } 3310e0dac50fSopenharmony_ci PerfLauncherHotAreaIfNeed(pointerEvent); 3311e0dac50fSopenharmony_ci if (action == MMI::PointerEvent::POINTER_ACTION_DOWN || action == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN) { 3312e0dac50fSopenharmony_ci WLOGFD("WMS process point down, id:%{public}u, action: %{public}d", GetWindowId(), action); 3313e0dac50fSopenharmony_ci if (GetType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT) { 3314e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 3315e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { 3316e0dac50fSopenharmony_ci WLOGFW("Point item is invalid"); 3317e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3318e0dac50fSopenharmony_ci return; 3319e0dac50fSopenharmony_ci } 3320e0dac50fSopenharmony_ci if (!WindowHelper::IsPointInTargetRect(pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), GetRect())) { 3321e0dac50fSopenharmony_ci NotifyAfterUnfocused(false); 3322e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3323e0dac50fSopenharmony_ci return; 3324e0dac50fSopenharmony_ci } 3325e0dac50fSopenharmony_ci } 3326e0dac50fSopenharmony_ci if (property_ != nullptr) { 3327e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().ProcessPointDown(property_->GetWindowId()); 3328e0dac50fSopenharmony_ci } 3329e0dac50fSopenharmony_ci } 3330e0dac50fSopenharmony_ci 3331e0dac50fSopenharmony_ci // If point event type is up, should reset start move flag 3332e0dac50fSopenharmony_ci if (WindowHelper::IsMainFloatingWindow(GetType(), GetMode()) || GetType() == WindowType::WINDOW_TYPE_DOCK_SLICE || 3333e0dac50fSopenharmony_ci (action == MMI::PointerEvent::POINTER_ACTION_UP || action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP || 3334e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_CANCEL)) { 3335e0dac50fSopenharmony_ci ConsumeMoveOrDragEvent(pointerEvent); 3336e0dac50fSopenharmony_ci } 3337e0dac50fSopenharmony_ci 3338e0dac50fSopenharmony_ci if (IsPointerEventConsumed()) { 3339e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 3340e0dac50fSopenharmony_ci return; 3341e0dac50fSopenharmony_ci } 3342e0dac50fSopenharmony_ci 3343e0dac50fSopenharmony_ci TransferPointerEvent(pointerEvent); 3344e0dac50fSopenharmony_ci} 3345e0dac50fSopenharmony_ci 3346e0dac50fSopenharmony_civoid WindowImpl::RequestVsync(const std::shared_ptr<VsyncCallback>& vsyncCallback) 3347e0dac50fSopenharmony_ci{ 3348e0dac50fSopenharmony_ci if (vsyncStation_ != nullptr) { 3349e0dac50fSopenharmony_ci vsyncStation_->RequestVsync(vsyncCallback); 3350e0dac50fSopenharmony_ci } 3351e0dac50fSopenharmony_ci} 3352e0dac50fSopenharmony_ci 3353e0dac50fSopenharmony_ciint64_t WindowImpl::GetVSyncPeriod() 3354e0dac50fSopenharmony_ci{ 3355e0dac50fSopenharmony_ci if (vsyncStation_ != nullptr) { 3356e0dac50fSopenharmony_ci return vsyncStation_->GetVSyncPeriod(); 3357e0dac50fSopenharmony_ci } 3358e0dac50fSopenharmony_ci return 0; 3359e0dac50fSopenharmony_ci} 3360e0dac50fSopenharmony_ci 3361e0dac50fSopenharmony_civoid WindowImpl::UpdateFocusStatus(bool focused) 3362e0dac50fSopenharmony_ci{ 3363e0dac50fSopenharmony_ci if (!IsWindowValid()) { 3364e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Window is invalid"); 3365e0dac50fSopenharmony_ci return; 3366e0dac50fSopenharmony_ci } 3367e0dac50fSopenharmony_ci 3368e0dac50fSopenharmony_ci WLOGFD("IsFocused: %{public}d, id: %{public}u", focused, property_->GetWindowId()); 3369e0dac50fSopenharmony_ci isFocused_ = focused; 3370e0dac50fSopenharmony_ci if (focused) { 3371e0dac50fSopenharmony_ci HiSysEventWrite( 3372e0dac50fSopenharmony_ci OHOS::HiviewDFX::HiSysEvent::Domain::WINDOW_MANAGER, 3373e0dac50fSopenharmony_ci "FOCUS_WINDOW", 3374e0dac50fSopenharmony_ci OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, 3375e0dac50fSopenharmony_ci "PID", getpid(), 3376e0dac50fSopenharmony_ci "UID", getuid(), 3377e0dac50fSopenharmony_ci "BUNDLE_NAME", property_->GetAbilityInfo().bundleName_); 3378e0dac50fSopenharmony_ci if (state_ <= WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 3379e0dac50fSopenharmony_ci needNotifyFocusLater_ = true; 3380e0dac50fSopenharmony_ci return; 3381e0dac50fSopenharmony_ci } 3382e0dac50fSopenharmony_ci NotifyAfterFocused(); 3383e0dac50fSopenharmony_ci } else { 3384e0dac50fSopenharmony_ci NotifyAfterUnfocused(); 3385e0dac50fSopenharmony_ci } 3386e0dac50fSopenharmony_ci} 3387e0dac50fSopenharmony_ci 3388e0dac50fSopenharmony_cibool WindowImpl::IsFocused() const 3389e0dac50fSopenharmony_ci{ 3390e0dac50fSopenharmony_ci if (!IsWindowValid()) { 3391e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Window is invalid"); 3392e0dac50fSopenharmony_ci return false; 3393e0dac50fSopenharmony_ci } 3394e0dac50fSopenharmony_ci 3395e0dac50fSopenharmony_ci return isFocused_; 3396e0dac50fSopenharmony_ci} 3397e0dac50fSopenharmony_ci 3398e0dac50fSopenharmony_civoid WindowImpl::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 3399e0dac50fSopenharmony_ci{ 3400e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 3401e0dac50fSopenharmony_ci WLOGFD("notify ace winId:%{public}u", GetWindowId()); 3402e0dac50fSopenharmony_ci uiContent_->UpdateConfiguration(configuration); 3403e0dac50fSopenharmony_ci } 3404e0dac50fSopenharmony_ci if (subWindowMap_.count(GetWindowId()) == 0) { 3405e0dac50fSopenharmony_ci return; 3406e0dac50fSopenharmony_ci } 3407e0dac50fSopenharmony_ci for (auto& subWindow : subWindowMap_.at(GetWindowId())) { 3408e0dac50fSopenharmony_ci subWindow->UpdateConfiguration(configuration); 3409e0dac50fSopenharmony_ci } 3410e0dac50fSopenharmony_ci} 3411e0dac50fSopenharmony_ci 3412e0dac50fSopenharmony_civoid WindowImpl::UpdateAvoidArea(const sptr<AvoidArea>& avoidArea, AvoidAreaType type) 3413e0dac50fSopenharmony_ci{ 3414e0dac50fSopenharmony_ci WLOGI("Update AvoidArea, id: %{public}u", property_->GetWindowId()); 3415e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3416e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 3417e0dac50fSopenharmony_ci UpdateViewportConfig(GetRect(), display, WindowSizeChangeReason::UNDEFINED, nullptr, {{type, *avoidArea}}); 3418e0dac50fSopenharmony_ci NotifyAvoidAreaChange(avoidArea, type); 3419e0dac50fSopenharmony_ci} 3420e0dac50fSopenharmony_ci 3421e0dac50fSopenharmony_civoid WindowImpl::UpdateViewportConfig(const Rect& rect, const sptr<Display>& display, WindowSizeChangeReason reason, 3422e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction, 3423e0dac50fSopenharmony_ci const std::map<AvoidAreaType, AvoidArea>& avoidAreas) 3424e0dac50fSopenharmony_ci{ 3425e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 3426e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 3427e0dac50fSopenharmony_ci return; 3428e0dac50fSopenharmony_ci } 3429e0dac50fSopenharmony_ci Ace::ViewportConfig config; 3430e0dac50fSopenharmony_ci config.SetSize(rect.width_, rect.height_); 3431e0dac50fSopenharmony_ci config.SetPosition(rect.posX_, rect.posY_); 3432e0dac50fSopenharmony_ci if (display) { 3433e0dac50fSopenharmony_ci config.SetDensity(display->GetVirtualPixelRatio()); 3434e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 3435e0dac50fSopenharmony_ci if (displayInfo != nullptr) { 3436e0dac50fSopenharmony_ci config.SetOrientation(static_cast<int32_t>(displayInfo->GetDisplayOrientation())); 3437e0dac50fSopenharmony_ci } 3438e0dac50fSopenharmony_ci } 3439e0dac50fSopenharmony_ci uiContent_->UpdateViewportConfig(config, reason, rsTransaction, avoidAreas); 3440e0dac50fSopenharmony_ci WLOGFD("Id:%{public}u, windowRect:[%{public}d, %{public}d, %{public}u, %{public}u]", 3441e0dac50fSopenharmony_ci property_->GetWindowId(), rect.posX_, rect.posY_, rect.width_, rect.height_); 3442e0dac50fSopenharmony_ci} 3443e0dac50fSopenharmony_ci 3444e0dac50fSopenharmony_civoid WindowImpl::UpdateDecorEnable(bool needNotify) 3445e0dac50fSopenharmony_ci{ 3446e0dac50fSopenharmony_ci WLOGFD("Start"); 3447e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType())) { 3448e0dac50fSopenharmony_ci bool enable = windowSystemConfig_.isSystemDecorEnable_ && 3449e0dac50fSopenharmony_ci WindowHelper::IsWindowModeSupported(windowSystemConfig_.decorModeSupportInfo_, GetMode()); 3450e0dac50fSopenharmony_ci WLOGFD("Decor enable: %{public}d", static_cast<int32_t>(enable)); 3451e0dac50fSopenharmony_ci property_->SetDecorEnable(enable); 3452e0dac50fSopenharmony_ci } else { 3453e0dac50fSopenharmony_ci property_->SetDecorEnable(false); 3454e0dac50fSopenharmony_ci } 3455e0dac50fSopenharmony_ci if (needNotify) { 3456e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 3457e0dac50fSopenharmony_ci uiContent_->UpdateWindowMode(GetMode(), property_->GetDecorEnable()); 3458e0dac50fSopenharmony_ci WLOGFD("Notify uiContent window mode change end"); 3459e0dac50fSopenharmony_ci } 3460e0dac50fSopenharmony_ci NotifyModeChange(GetMode(), property_->GetDecorEnable()); 3461e0dac50fSopenharmony_ci } 3462e0dac50fSopenharmony_ci} 3463e0dac50fSopenharmony_ci 3464e0dac50fSopenharmony_civoid WindowImpl::UpdateWindowStateUnfrozen() 3465e0dac50fSopenharmony_ci{ 3466e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 3467e0dac50fSopenharmony_ci if (abilityContext != nullptr && windowTag_ == WindowTag::MAIN_WINDOW) { 3468e0dac50fSopenharmony_ci WLOGFD("DoAbilityForeground KEYGUARD, id: %{public}u", GetWindowId()); 3469e0dac50fSopenharmony_ci AAFwk::AbilityManagerClient::GetInstance()->DoAbilityForeground(abilityContext->GetToken(), 3470e0dac50fSopenharmony_ci static_cast<uint32_t>(WindowStateChangeReason::KEYGUARD)); 3471e0dac50fSopenharmony_ci } else if (state_ != WindowState::STATE_SHOWN) { 3472e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 3473e0dac50fSopenharmony_ci NotifyAfterForeground(); 3474e0dac50fSopenharmony_ci } 3475e0dac50fSopenharmony_ci} 3476e0dac50fSopenharmony_ci 3477e0dac50fSopenharmony_civoid WindowImpl::UpdateWindowState(WindowState state) 3478e0dac50fSopenharmony_ci{ 3479e0dac50fSopenharmony_ci WLOGFI("id: %{public}u, State to set:%{public}u", GetWindowId(), state); 3480e0dac50fSopenharmony_ci if (!IsWindowValid()) { 3481e0dac50fSopenharmony_ci return; 3482e0dac50fSopenharmony_ci } 3483e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 3484e0dac50fSopenharmony_ci switch (state) { 3485e0dac50fSopenharmony_ci case WindowState::STATE_FROZEN: { 3486e0dac50fSopenharmony_ci if (abilityContext != nullptr && windowTag_ == WindowTag::MAIN_WINDOW) { 3487e0dac50fSopenharmony_ci WLOGFD("DoAbilityBackground KEYGUARD, id: %{public}u", GetWindowId()); 3488e0dac50fSopenharmony_ci AAFwk::AbilityManagerClient::GetInstance()->DoAbilityBackground(abilityContext->GetToken(), 3489e0dac50fSopenharmony_ci static_cast<uint32_t>(WindowStateChangeReason::KEYGUARD)); 3490e0dac50fSopenharmony_ci } else { 3491e0dac50fSopenharmony_ci state_ = WindowState::STATE_FROZEN; 3492e0dac50fSopenharmony_ci NotifyAfterBackground(false, true); 3493e0dac50fSopenharmony_ci } 3494e0dac50fSopenharmony_ci break; 3495e0dac50fSopenharmony_ci } 3496e0dac50fSopenharmony_ci case WindowState::STATE_UNFROZEN: { 3497e0dac50fSopenharmony_ci UpdateWindowStateUnfrozen(); 3498e0dac50fSopenharmony_ci break; 3499e0dac50fSopenharmony_ci } 3500e0dac50fSopenharmony_ci case WindowState::STATE_SHOWN: { 3501e0dac50fSopenharmony_ci if (abilityContext != nullptr && windowTag_ == WindowTag::MAIN_WINDOW) { 3502e0dac50fSopenharmony_ci WLOGFD("WindowState::STATE_SHOWN, id: %{public}u", GetWindowId()); 3503e0dac50fSopenharmony_ci AAFwk::AbilityManagerClient::GetInstance()->DoAbilityForeground(abilityContext->GetToken(), 3504e0dac50fSopenharmony_ci static_cast<uint32_t>(WindowStateChangeReason::TOGGLING)); 3505e0dac50fSopenharmony_ci } else { 3506e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 3507e0dac50fSopenharmony_ci NotifyAfterForeground(); 3508e0dac50fSopenharmony_ci } 3509e0dac50fSopenharmony_ci break; 3510e0dac50fSopenharmony_ci } 3511e0dac50fSopenharmony_ci case WindowState::STATE_HIDDEN: { 3512e0dac50fSopenharmony_ci if (abilityContext != nullptr && windowTag_ == WindowTag::MAIN_WINDOW && 3513e0dac50fSopenharmony_ci state_ == WindowState::STATE_SHOWN) { 3514e0dac50fSopenharmony_ci WLOGFD("WindowState: STATE_SHOWN, id: %{public}u", GetWindowId()); 3515e0dac50fSopenharmony_ci AAFwk::AbilityManagerClient::GetInstance()->DoAbilityBackground(abilityContext->GetToken(), 3516e0dac50fSopenharmony_ci static_cast<uint32_t>(WindowStateChangeReason::NORMAL)); 3517e0dac50fSopenharmony_ci } else { 3518e0dac50fSopenharmony_ci Hide(static_cast<uint32_t>(WindowStateChangeReason::NORMAL), false); 3519e0dac50fSopenharmony_ci } 3520e0dac50fSopenharmony_ci break; 3521e0dac50fSopenharmony_ci } 3522e0dac50fSopenharmony_ci default: { 3523e0dac50fSopenharmony_ci WLOGFE("windowState to set is invalid"); 3524e0dac50fSopenharmony_ci break; 3525e0dac50fSopenharmony_ci } 3526e0dac50fSopenharmony_ci } 3527e0dac50fSopenharmony_ci} 3528e0dac50fSopenharmony_ci 3529e0dac50fSopenharmony_ciWmErrorCode WindowImpl::UpdateWindowStateWhenShow() 3530e0dac50fSopenharmony_ci{ 3531e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 3532e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(property_->GetWindowType()) || 3533e0dac50fSopenharmony_ci WindowHelper::IsSystemMainWindow(property_->GetWindowType())) { 3534e0dac50fSopenharmony_ci // update subwindow subWindowState_ and notify subwindow shown or not 3535e0dac50fSopenharmony_ci UpdateSubWindowStateAndNotify(GetWindowId()); 3536e0dac50fSopenharmony_ci NotifyAfterForeground(); 3537e0dac50fSopenharmony_ci } else if (GetType() == WindowType::WINDOW_TYPE_APP_COMPONENT) { 3538e0dac50fSopenharmony_ci subWindowState_ = WindowState::STATE_SHOWN; 3539e0dac50fSopenharmony_ci NotifyAfterForeground(); 3540e0dac50fSopenharmony_ci } else { 3541e0dac50fSopenharmony_ci uint32_t parentId = property_->GetParentId(); 3542e0dac50fSopenharmony_ci sptr<Window> parentWindow = FindWindowById(parentId); 3543e0dac50fSopenharmony_ci if (parentWindow == nullptr) { 3544e0dac50fSopenharmony_ci WLOGE("parent window is null"); 3545e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; 3546e0dac50fSopenharmony_ci } 3547e0dac50fSopenharmony_ci if (parentWindow->GetWindowState() == WindowState::STATE_HIDDEN) { 3548e0dac50fSopenharmony_ci // not notify user shown and update subwindowState_ 3549e0dac50fSopenharmony_ci subWindowState_ = WindowState::STATE_HIDDEN; 3550e0dac50fSopenharmony_ci } else if (parentWindow->GetWindowState() == WindowState::STATE_SHOWN) { 3551e0dac50fSopenharmony_ci NotifyAfterForeground(); 3552e0dac50fSopenharmony_ci subWindowState_ = WindowState::STATE_SHOWN; 3553e0dac50fSopenharmony_ci } 3554e0dac50fSopenharmony_ci } 3555e0dac50fSopenharmony_ci if (needNotifyFocusLater_ && isFocused_) { 3556e0dac50fSopenharmony_ci UpdateFocusStatus(true); 3557e0dac50fSopenharmony_ci } 3558e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3559e0dac50fSopenharmony_ci} 3560e0dac50fSopenharmony_ci 3561e0dac50fSopenharmony_ciWmErrorCode WindowImpl::UpdateWindowStateWhenHide() 3562e0dac50fSopenharmony_ci{ 3563e0dac50fSopenharmony_ci state_ = WindowState::STATE_HIDDEN; 3564e0dac50fSopenharmony_ci if (WindowHelper::IsSystemMainWindow(property_->GetWindowType()) || 3565e0dac50fSopenharmony_ci WindowHelper::IsMainWindow(property_->GetWindowType())) { 3566e0dac50fSopenharmony_ci // main window need to update subwindow subWindowState_ and notify subwindow shown or not 3567e0dac50fSopenharmony_ci UpdateSubWindowStateAndNotify(GetWindowId()); 3568e0dac50fSopenharmony_ci NotifyAfterBackground(); 3569e0dac50fSopenharmony_ci } else if (GetType() == WindowType::WINDOW_TYPE_APP_COMPONENT) { 3570e0dac50fSopenharmony_ci subWindowState_ = WindowState::STATE_HIDDEN; 3571e0dac50fSopenharmony_ci NotifyAfterBackground(); 3572e0dac50fSopenharmony_ci } else { 3573e0dac50fSopenharmony_ci uint32_t parentId = property_->GetParentId(); 3574e0dac50fSopenharmony_ci sptr<Window> parentWindow = FindWindowById(parentId); 3575e0dac50fSopenharmony_ci if (parentWindow == nullptr) { 3576e0dac50fSopenharmony_ci WLOGE("parent window is null"); 3577e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; 3578e0dac50fSopenharmony_ci } 3579e0dac50fSopenharmony_ci if (subWindowState_ == WindowState::STATE_SHOWN) { 3580e0dac50fSopenharmony_ci NotifyAfterBackground(); 3581e0dac50fSopenharmony_ci } 3582e0dac50fSopenharmony_ci subWindowState_ = WindowState::STATE_HIDDEN; 3583e0dac50fSopenharmony_ci } 3584e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3585e0dac50fSopenharmony_ci} 3586e0dac50fSopenharmony_ci 3587e0dac50fSopenharmony_ciWmErrorCode WindowImpl::UpdateSubWindowStateAndNotify(uint32_t parentId) 3588e0dac50fSopenharmony_ci{ 3589e0dac50fSopenharmony_ci if (subWindowMap_.find(parentId) == subWindowMap_.end()) { 3590e0dac50fSopenharmony_ci WLOGFD("main window: %{public}u has no child node", parentId); 3591e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3592e0dac50fSopenharmony_ci } 3593e0dac50fSopenharmony_ci std::vector<sptr<WindowImpl>> subWindows = subWindowMap_[parentId]; 3594e0dac50fSopenharmony_ci if (subWindows.empty()) { 3595e0dac50fSopenharmony_ci WLOGFD("main window: %{public}u, its subWindowMap is empty", parentId); 3596e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3597e0dac50fSopenharmony_ci } 3598e0dac50fSopenharmony_ci // when main window hide and subwindow whose state is shown should hide and notify user 3599e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN) { 3600e0dac50fSopenharmony_ci for (auto subwindow : subWindows) { 3601e0dac50fSopenharmony_ci if (subwindow->GetWindowState() == WindowState::STATE_SHOWN && 3602e0dac50fSopenharmony_ci subwindow->subWindowState_ == WindowState::STATE_SHOWN) { 3603e0dac50fSopenharmony_ci subwindow->NotifyAfterBackground(); 3604e0dac50fSopenharmony_ci } 3605e0dac50fSopenharmony_ci subwindow->subWindowState_ = WindowState::STATE_HIDDEN; 3606e0dac50fSopenharmony_ci } 3607e0dac50fSopenharmony_ci // when main window show and subwindow whose state is shown should show and notify user 3608e0dac50fSopenharmony_ci } else if (state_ == WindowState::STATE_SHOWN) { 3609e0dac50fSopenharmony_ci for (auto subwindow : subWindows) { 3610e0dac50fSopenharmony_ci if (subwindow->GetWindowState() == WindowState::STATE_SHOWN && 3611e0dac50fSopenharmony_ci subwindow->subWindowState_ == WindowState::STATE_HIDDEN) { 3612e0dac50fSopenharmony_ci subwindow->NotifyAfterForeground(); 3613e0dac50fSopenharmony_ci subwindow->subWindowState_ = WindowState::STATE_SHOWN; 3614e0dac50fSopenharmony_ci } else { 3615e0dac50fSopenharmony_ci subwindow->subWindowState_ = WindowState::STATE_HIDDEN; 3616e0dac50fSopenharmony_ci } 3617e0dac50fSopenharmony_ci } 3618e0dac50fSopenharmony_ci } 3619e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3620e0dac50fSopenharmony_ci} 3621e0dac50fSopenharmony_ci 3622e0dac50fSopenharmony_cisptr<WindowProperty> WindowImpl::GetWindowProperty() 3623e0dac50fSopenharmony_ci{ 3624e0dac50fSopenharmony_ci return property_; 3625e0dac50fSopenharmony_ci} 3626e0dac50fSopenharmony_ci 3627e0dac50fSopenharmony_civoid WindowImpl::RestoreSplitWindowMode(uint32_t mode) 3628e0dac50fSopenharmony_ci{ 3629e0dac50fSopenharmony_ci if (!IsWindowValid()) { 3630e0dac50fSopenharmony_ci return; 3631e0dac50fSopenharmony_ci } 3632e0dac50fSopenharmony_ci auto windowMode = static_cast<WindowMode>(mode); 3633e0dac50fSopenharmony_ci if (windowMode == WindowMode::WINDOW_MODE_SPLIT_PRIMARY || windowMode == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { 3634e0dac50fSopenharmony_ci UpdateMode(windowMode); 3635e0dac50fSopenharmony_ci } 3636e0dac50fSopenharmony_ci} 3637e0dac50fSopenharmony_ci 3638e0dac50fSopenharmony_civoid WindowImpl::UpdateDragEvent(const PointInfo& point, DragEvent event) 3639e0dac50fSopenharmony_ci{ 3640e0dac50fSopenharmony_ci NotifyDragEvent(point, event); 3641e0dac50fSopenharmony_ci} 3642e0dac50fSopenharmony_ci 3643e0dac50fSopenharmony_civoid WindowImpl::NotifyDragEvent(const PointInfo& point, DragEvent event) 3644e0dac50fSopenharmony_ci{ 3645e0dac50fSopenharmony_ci auto windowDragListeners = GetListeners<IWindowDragListener>(); 3646e0dac50fSopenharmony_ci Rect rect = GetRect(); 3647e0dac50fSopenharmony_ci for (auto& listener : windowDragListeners) { 3648e0dac50fSopenharmony_ci if (listener != nullptr) { 3649e0dac50fSopenharmony_ci listener->OnDrag(point.x - rect.posX_, point.y - rect.posY_, event); 3650e0dac50fSopenharmony_ci } 3651e0dac50fSopenharmony_ci } 3652e0dac50fSopenharmony_ci} 3653e0dac50fSopenharmony_ci 3654e0dac50fSopenharmony_civoid WindowImpl::UpdateDisplayId(DisplayId from, DisplayId to) 3655e0dac50fSopenharmony_ci{ 3656e0dac50fSopenharmony_ci WLOGFD("update displayId. win %{public}u", GetWindowId()); 3657e0dac50fSopenharmony_ci NotifyDisplayMoveChange(from, to); 3658e0dac50fSopenharmony_ci property_->SetDisplayId(to); 3659e0dac50fSopenharmony_ci} 3660e0dac50fSopenharmony_ci 3661e0dac50fSopenharmony_civoid WindowImpl::UpdateOccupiedAreaChangeInfo(const sptr<OccupiedAreaChangeInfo>& info, 3662e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction) 3663e0dac50fSopenharmony_ci{ 3664e0dac50fSopenharmony_ci WLOGFD("Update OccupiedArea, id: %{public}u", property_->GetWindowId()); 3665e0dac50fSopenharmony_ci NotifyOccupiedAreaChange(info, rsTransaction); 3666e0dac50fSopenharmony_ci} 3667e0dac50fSopenharmony_ci 3668e0dac50fSopenharmony_civoid WindowImpl::UpdateActiveStatus(bool isActive) 3669e0dac50fSopenharmony_ci{ 3670e0dac50fSopenharmony_ci WLOGFD("window active status: %{public}d, id: %{public}u", isActive, property_->GetWindowId()); 3671e0dac50fSopenharmony_ci if (isActive) { 3672e0dac50fSopenharmony_ci NotifyAfterActive(); 3673e0dac50fSopenharmony_ci } else { 3674e0dac50fSopenharmony_ci NotifyAfterInactive(); 3675e0dac50fSopenharmony_ci } 3676e0dac50fSopenharmony_ci} 3677e0dac50fSopenharmony_ci 3678e0dac50fSopenharmony_civoid WindowImpl::NotifyScreenshot() 3679e0dac50fSopenharmony_ci{ 3680e0dac50fSopenharmony_ci auto screenshotListeners = GetListeners<IScreenshotListener>(); 3681e0dac50fSopenharmony_ci for (auto& screenshotListener : screenshotListeners) { 3682e0dac50fSopenharmony_ci if (screenshotListener != nullptr) { 3683e0dac50fSopenharmony_ci screenshotListener->OnScreenshot(); 3684e0dac50fSopenharmony_ci } 3685e0dac50fSopenharmony_ci } 3686e0dac50fSopenharmony_ci} 3687e0dac50fSopenharmony_ci 3688e0dac50fSopenharmony_civoid WindowImpl::NotifyTouchOutside() 3689e0dac50fSopenharmony_ci{ 3690e0dac50fSopenharmony_ci auto touchOutsideListeners = GetListeners<ITouchOutsideListener>(); 3691e0dac50fSopenharmony_ci for (auto& touchOutsideListener : touchOutsideListeners) { 3692e0dac50fSopenharmony_ci if (touchOutsideListener != nullptr) { 3693e0dac50fSopenharmony_ci touchOutsideListener->OnTouchOutside(); 3694e0dac50fSopenharmony_ci } 3695e0dac50fSopenharmony_ci } 3696e0dac50fSopenharmony_ci} 3697e0dac50fSopenharmony_ci 3698e0dac50fSopenharmony_civoid WindowImpl::NotifyTouchDialogTarget(int32_t posX, int32_t posY) 3699e0dac50fSopenharmony_ci{ 3700e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().ProcessPointDown(property_->GetWindowId()); 3701e0dac50fSopenharmony_ci auto dialogTargetTouchListeners = GetListeners<IDialogTargetTouchListener>(); 3702e0dac50fSopenharmony_ci for (auto& dialogTargetTouchListener : dialogTargetTouchListeners) { 3703e0dac50fSopenharmony_ci if (dialogTargetTouchListener != nullptr) { 3704e0dac50fSopenharmony_ci dialogTargetTouchListener->OnDialogTargetTouch(); 3705e0dac50fSopenharmony_ci } 3706e0dac50fSopenharmony_ci } 3707e0dac50fSopenharmony_ci} 3708e0dac50fSopenharmony_ci 3709e0dac50fSopenharmony_civoid WindowImpl::NotifyDestroy() 3710e0dac50fSopenharmony_ci{ 3711e0dac50fSopenharmony_ci auto dialogDeathRecipientListener = GetListener<IDialogDeathRecipientListener>(); 3712e0dac50fSopenharmony_ci if (dialogDeathRecipientListener != nullptr) { 3713e0dac50fSopenharmony_ci dialogDeathRecipientListener->OnDialogDeathRecipient(); 3714e0dac50fSopenharmony_ci } 3715e0dac50fSopenharmony_ci} 3716e0dac50fSopenharmony_ci 3717e0dac50fSopenharmony_civoid WindowImpl::NotifyForeground() 3718e0dac50fSopenharmony_ci{ 3719e0dac50fSopenharmony_ci NotifyAfterForeground(); 3720e0dac50fSopenharmony_ci} 3721e0dac50fSopenharmony_ci 3722e0dac50fSopenharmony_civoid WindowImpl::NotifyBackground() 3723e0dac50fSopenharmony_ci{ 3724e0dac50fSopenharmony_ci NotifyAfterBackground(); 3725e0dac50fSopenharmony_ci} 3726e0dac50fSopenharmony_ci 3727e0dac50fSopenharmony_civoid WindowImpl::NotifyForegroundInteractiveStatus(bool interactive) 3728e0dac50fSopenharmony_ci{ 3729e0dac50fSopenharmony_ci WLOGFI("NotifyForegroundInteractiveStatus %{public}d", interactive); 3730e0dac50fSopenharmony_ci if (!IsWindowValid() || state_ != WindowState::STATE_SHOWN) { 3731e0dac50fSopenharmony_ci return; 3732e0dac50fSopenharmony_ci } 3733e0dac50fSopenharmony_ci if (interactive) { 3734e0dac50fSopenharmony_ci NotifyAfterResumed(); 3735e0dac50fSopenharmony_ci } else { 3736e0dac50fSopenharmony_ci NotifyAfterPaused(); 3737e0dac50fSopenharmony_ci } 3738e0dac50fSopenharmony_ci} 3739e0dac50fSopenharmony_ci 3740e0dac50fSopenharmony_civoid WindowImpl::TransformSurfaceNode(const Transform& trans) 3741e0dac50fSopenharmony_ci{ 3742e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 3743e0dac50fSopenharmony_ci return; 3744e0dac50fSopenharmony_ci } 3745e0dac50fSopenharmony_ci surfaceNode_->SetPivotX(trans.pivotX_); 3746e0dac50fSopenharmony_ci surfaceNode_->SetPivotY(trans.pivotY_); 3747e0dac50fSopenharmony_ci surfaceNode_->SetScaleX(trans.scaleX_); 3748e0dac50fSopenharmony_ci surfaceNode_->SetScaleY(trans.scaleY_); 3749e0dac50fSopenharmony_ci surfaceNode_->SetTranslateX(trans.translateX_); 3750e0dac50fSopenharmony_ci surfaceNode_->SetTranslateY(trans.translateY_); 3751e0dac50fSopenharmony_ci surfaceNode_->SetTranslateZ(trans.translateZ_); 3752e0dac50fSopenharmony_ci surfaceNode_->SetRotationX(trans.rotationX_); 3753e0dac50fSopenharmony_ci surfaceNode_->SetRotationY(trans.rotationY_); 3754e0dac50fSopenharmony_ci surfaceNode_->SetRotation(trans.rotationZ_); 3755e0dac50fSopenharmony_ci} 3756e0dac50fSopenharmony_ci 3757e0dac50fSopenharmony_civoid WindowImpl::UpdateZoomTransform(const Transform& trans, bool isDisplayZoomOn) 3758e0dac50fSopenharmony_ci{ 3759e0dac50fSopenharmony_ci WLOGFD("%{public}s zoomTrans, pivotX:%{public}f, pivotY:%{public}f, scaleX:%{public}f, scaleY:%{public}f" 3760e0dac50fSopenharmony_ci ", transX:%{public}f, transY:%{public}f, transZ:%{public}f, rotateX:%{public}f, rotateY:%{public}f " 3761e0dac50fSopenharmony_ci "rotateZ:%{public}f", property_->GetWindowName().c_str(), trans.pivotX_, trans.pivotY_, trans.scaleX_, 3762e0dac50fSopenharmony_ci trans.scaleY_, trans.translateX_, trans.translateY_, trans.translateZ_, trans.rotationX_, 3763e0dac50fSopenharmony_ci trans.rotationY_, trans.rotationZ_); 3764e0dac50fSopenharmony_ci property_->SetZoomTransform(trans); 3765e0dac50fSopenharmony_ci property_->SetDisplayZoomState(isDisplayZoomOn); 3766e0dac50fSopenharmony_ci} 3767e0dac50fSopenharmony_ci 3768e0dac50fSopenharmony_civoid WindowImpl::ClearListenersById(uint32_t winId) 3769e0dac50fSopenharmony_ci{ 3770e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(globalMutex_); 3771e0dac50fSopenharmony_ci ClearUselessListeners(screenshotListeners_, winId); 3772e0dac50fSopenharmony_ci ClearUselessListeners(touchOutsideListeners_, winId); 3773e0dac50fSopenharmony_ci ClearUselessListeners(dialogTargetTouchListeners_, winId); 3774e0dac50fSopenharmony_ci ClearUselessListeners(lifecycleListeners_, winId); 3775e0dac50fSopenharmony_ci ClearUselessListeners(windowChangeListeners_, winId); 3776e0dac50fSopenharmony_ci ClearUselessListeners(avoidAreaChangeListeners_, winId); 3777e0dac50fSopenharmony_ci ClearUselessListeners(occupiedAreaChangeListeners_, winId); 3778e0dac50fSopenharmony_ci ClearUselessListeners(dialogDeathRecipientListener_, winId); 3779e0dac50fSopenharmony_ci} 3780e0dac50fSopenharmony_ci 3781e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterForeground(bool needNotifyListeners, bool needNotifyUiContent) 3782e0dac50fSopenharmony_ci{ 3783e0dac50fSopenharmony_ci if (needNotifyListeners) { 3784e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3785e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterForeground, lifecycleListeners); 3786e0dac50fSopenharmony_ci } 3787e0dac50fSopenharmony_ci if (needNotifyUiContent) { 3788e0dac50fSopenharmony_ci CALL_UI_CONTENT(Foreground); 3789e0dac50fSopenharmony_ci } 3790e0dac50fSopenharmony_ci} 3791e0dac50fSopenharmony_ci 3792e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterBackground(bool needNotifyListeners, bool needNotifyUiContent) 3793e0dac50fSopenharmony_ci{ 3794e0dac50fSopenharmony_ci if (needNotifyListeners) { 3795e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3796e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterBackground, lifecycleListeners); 3797e0dac50fSopenharmony_ci } 3798e0dac50fSopenharmony_ci if (needNotifyUiContent) { 3799e0dac50fSopenharmony_ci CALL_UI_CONTENT(Background); 3800e0dac50fSopenharmony_ci } 3801e0dac50fSopenharmony_ci} 3802e0dac50fSopenharmony_ci 3803e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterFocused() 3804e0dac50fSopenharmony_ci{ 3805e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3806e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterFocused, lifecycleListeners); 3807e0dac50fSopenharmony_ci CALL_UI_CONTENT(Focus); 3808e0dac50fSopenharmony_ci} 3809e0dac50fSopenharmony_ci 3810e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterUnfocused(bool needNotifyUiContent) 3811e0dac50fSopenharmony_ci{ 3812e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3813e0dac50fSopenharmony_ci // use needNotifyUinContent to separate ui content callbacks 3814e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterUnfocused, lifecycleListeners); 3815e0dac50fSopenharmony_ci if (needNotifyUiContent) { 3816e0dac50fSopenharmony_ci CALL_UI_CONTENT(UnFocus); 3817e0dac50fSopenharmony_ci } 3818e0dac50fSopenharmony_ci} 3819e0dac50fSopenharmony_ci 3820e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterResumed() 3821e0dac50fSopenharmony_ci{ 3822e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3823e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterResumed, lifecycleListeners); 3824e0dac50fSopenharmony_ci} 3825e0dac50fSopenharmony_ci 3826e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterPaused() 3827e0dac50fSopenharmony_ci{ 3828e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3829e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterPaused, lifecycleListeners); 3830e0dac50fSopenharmony_ci} 3831e0dac50fSopenharmony_ci 3832e0dac50fSopenharmony_civoid WindowImpl::NotifyBeforeDestroy(std::string windowName) 3833e0dac50fSopenharmony_ci{ 3834e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 3835e0dac50fSopenharmony_ci if (uiContent_ != nullptr) { 3836e0dac50fSopenharmony_ci auto uiContent = std::move(uiContent_); 3837e0dac50fSopenharmony_ci uiContent_ = nullptr; 3838e0dac50fSopenharmony_ci uiContent->Destroy(); 3839e0dac50fSopenharmony_ci } 3840e0dac50fSopenharmony_ci if (notifyNativefunc_) { 3841e0dac50fSopenharmony_ci notifyNativefunc_(windowName); 3842e0dac50fSopenharmony_ci } 3843e0dac50fSopenharmony_ci} 3844e0dac50fSopenharmony_ci 3845e0dac50fSopenharmony_civoid WindowImpl::NotifyBeforeSubWindowDestroy(sptr<WindowImpl> window) 3846e0dac50fSopenharmony_ci{ 3847e0dac50fSopenharmony_ci auto uiContent = window->GetUIContent(); 3848e0dac50fSopenharmony_ci if (uiContent != nullptr) { 3849e0dac50fSopenharmony_ci uiContent->Destroy(); 3850e0dac50fSopenharmony_ci } 3851e0dac50fSopenharmony_ci if (window->GetNativeDestroyCallback()) { 3852e0dac50fSopenharmony_ci window->GetNativeDestroyCallback()(window->GetWindowName()); 3853e0dac50fSopenharmony_ci } 3854e0dac50fSopenharmony_ci} 3855e0dac50fSopenharmony_ci 3856e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterActive() 3857e0dac50fSopenharmony_ci{ 3858e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3859e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterActive, lifecycleListeners); 3860e0dac50fSopenharmony_ci} 3861e0dac50fSopenharmony_ci 3862e0dac50fSopenharmony_civoid WindowImpl::NotifyAfterInactive() 3863e0dac50fSopenharmony_ci{ 3864e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3865e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER(AfterInactive, lifecycleListeners); 3866e0dac50fSopenharmony_ci} 3867e0dac50fSopenharmony_ci 3868e0dac50fSopenharmony_civoid WindowImpl::NotifyForegroundFailed(WMError ret) 3869e0dac50fSopenharmony_ci{ 3870e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3871e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER_WITH_PARAM(ForegroundFailed, lifecycleListeners, static_cast<int32_t>(ret)); 3872e0dac50fSopenharmony_ci} 3873e0dac50fSopenharmony_ci 3874e0dac50fSopenharmony_civoid WindowImpl::NotifyBackgroundFailed(WMError ret) 3875e0dac50fSopenharmony_ci{ 3876e0dac50fSopenharmony_ci auto lifecycleListeners = GetListeners<IWindowLifeCycle>(); 3877e0dac50fSopenharmony_ci CALL_LIFECYCLE_LISTENER_WITH_PARAM(BackgroundFailed, lifecycleListeners, static_cast<int32_t>(ret)); 3878e0dac50fSopenharmony_ci} 3879e0dac50fSopenharmony_ci 3880e0dac50fSopenharmony_cibool WindowImpl::IsStretchableReason(WindowSizeChangeReason reason) 3881e0dac50fSopenharmony_ci{ 3882e0dac50fSopenharmony_ci return reason == WindowSizeChangeReason::DRAG || reason == WindowSizeChangeReason::DRAG_END || 3883e0dac50fSopenharmony_ci reason == WindowSizeChangeReason::DRAG_START || reason == WindowSizeChangeReason::RECOVER || 3884e0dac50fSopenharmony_ci reason == WindowSizeChangeReason::MOVE || reason == WindowSizeChangeReason::UNDEFINED; 3885e0dac50fSopenharmony_ci} 3886e0dac50fSopenharmony_ci 3887e0dac50fSopenharmony_civoid WindowImpl::NotifySizeChange(Rect rect, WindowSizeChangeReason reason, 3888e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction) 3889e0dac50fSopenharmony_ci{ 3890e0dac50fSopenharmony_ci auto windowChangeListeners = GetListeners<IWindowChangeListener>(); 3891e0dac50fSopenharmony_ci for (auto& listener : windowChangeListeners) { 3892e0dac50fSopenharmony_ci if (listener != nullptr) { 3893e0dac50fSopenharmony_ci listener->OnSizeChange(rect, reason, rsTransaction); 3894e0dac50fSopenharmony_ci } 3895e0dac50fSopenharmony_ci } 3896e0dac50fSopenharmony_ci} 3897e0dac50fSopenharmony_ci 3898e0dac50fSopenharmony_civoid WindowImpl::NotifyAvoidAreaChange(const sptr<AvoidArea>& avoidArea, AvoidAreaType type) 3899e0dac50fSopenharmony_ci{ 3900e0dac50fSopenharmony_ci auto avoidAreaChangeListeners = GetListeners<IAvoidAreaChangedListener>(); 3901e0dac50fSopenharmony_ci for (auto& listener : avoidAreaChangeListeners) { 3902e0dac50fSopenharmony_ci if (listener != nullptr) { 3903e0dac50fSopenharmony_ci listener->OnAvoidAreaChanged(*avoidArea, type); 3904e0dac50fSopenharmony_ci } 3905e0dac50fSopenharmony_ci } 3906e0dac50fSopenharmony_ci} 3907e0dac50fSopenharmony_ci 3908e0dac50fSopenharmony_civoid WindowImpl::NotifyDisplayMoveChange(DisplayId from, DisplayId to) 3909e0dac50fSopenharmony_ci{ 3910e0dac50fSopenharmony_ci auto displayMoveListeners = GetListeners<IDisplayMoveListener>(); 3911e0dac50fSopenharmony_ci for (auto& listener : displayMoveListeners) { 3912e0dac50fSopenharmony_ci if (listener != nullptr) { 3913e0dac50fSopenharmony_ci listener->OnDisplayMove(from, to); 3914e0dac50fSopenharmony_ci } 3915e0dac50fSopenharmony_ci } 3916e0dac50fSopenharmony_ci} 3917e0dac50fSopenharmony_ci 3918e0dac50fSopenharmony_civoid WindowImpl::NotifyModeChange(WindowMode mode, bool hasDeco) 3919e0dac50fSopenharmony_ci{ 3920e0dac50fSopenharmony_ci auto windowChangeListeners = GetListeners<IWindowChangeListener>(); 3921e0dac50fSopenharmony_ci for (auto& listener : windowChangeListeners) { 3922e0dac50fSopenharmony_ci if (listener != nullptr) { 3923e0dac50fSopenharmony_ci listener->OnModeChange(mode, hasDeco); 3924e0dac50fSopenharmony_ci } 3925e0dac50fSopenharmony_ci } 3926e0dac50fSopenharmony_ci} 3927e0dac50fSopenharmony_ci 3928e0dac50fSopenharmony_civoid WindowImpl::NotifyOccupiedAreaChange(const sptr<OccupiedAreaChangeInfo>& info, 3929e0dac50fSopenharmony_ci const std::shared_ptr<RSTransaction>& rsTransaction) 3930e0dac50fSopenharmony_ci{ 3931e0dac50fSopenharmony_ci auto occupiedAreaChangeListeners = GetListeners<IOccupiedAreaChangeListener>(); 3932e0dac50fSopenharmony_ci for (auto& listener : occupiedAreaChangeListeners) { 3933e0dac50fSopenharmony_ci if (listener != nullptr) { 3934e0dac50fSopenharmony_ci listener->OnSizeChange(info, rsTransaction); 3935e0dac50fSopenharmony_ci } 3936e0dac50fSopenharmony_ci } 3937e0dac50fSopenharmony_ci} 3938e0dac50fSopenharmony_ci 3939e0dac50fSopenharmony_civoid WindowImpl::SetNeedRemoveWindowInputChannel(bool needRemoveWindowInputChannel) 3940e0dac50fSopenharmony_ci{ 3941e0dac50fSopenharmony_ci needRemoveWindowInputChannel_ = needRemoveWindowInputChannel; 3942e0dac50fSopenharmony_ci} 3943e0dac50fSopenharmony_ci 3944e0dac50fSopenharmony_ciRect WindowImpl::GetSystemAlarmWindowDefaultSize(Rect defaultRect) 3945e0dac50fSopenharmony_ci{ 3946e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3947e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 3948e0dac50fSopenharmony_ci if (display == nullptr) { 3949e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64", window id:%{public}u", property_->GetDisplayId(), 3950e0dac50fSopenharmony_ci property_->GetWindowId()); 3951e0dac50fSopenharmony_ci return defaultRect; 3952e0dac50fSopenharmony_ci } 3953e0dac50fSopenharmony_ci uint32_t width = static_cast<uint32_t>(display->GetWidth()); 3954e0dac50fSopenharmony_ci uint32_t height = static_cast<uint32_t>(display->GetHeight()); 3955e0dac50fSopenharmony_ci WLOGFD("width:%{public}u, height:%{public}u, displayId:%{public}" PRIu64"", 3956e0dac50fSopenharmony_ci width, height, property_->GetDisplayId()); 3957e0dac50fSopenharmony_ci uint32_t alarmWidth = static_cast<uint32_t>((static_cast<float>(width) * 3958e0dac50fSopenharmony_ci SYSTEM_ALARM_WINDOW_WIDTH_RATIO)); 3959e0dac50fSopenharmony_ci uint32_t alarmHeight = static_cast<uint32_t>((static_cast<float>(height) * 3960e0dac50fSopenharmony_ci SYSTEM_ALARM_WINDOW_HEIGHT_RATIO)); 3961e0dac50fSopenharmony_ci 3962e0dac50fSopenharmony_ci Rect rect = { static_cast<int32_t>((width - alarmWidth) / 2), static_cast<int32_t>((height - alarmHeight) / 2), 3963e0dac50fSopenharmony_ci alarmWidth, alarmHeight }; // divided by 2 to middle the window 3964e0dac50fSopenharmony_ci return rect; 3965e0dac50fSopenharmony_ci} 3966e0dac50fSopenharmony_ci 3967e0dac50fSopenharmony_civoid WindowImpl::SetDefaultOption() 3968e0dac50fSopenharmony_ci{ 3969e0dac50fSopenharmony_ci switch (property_->GetWindowType()) { 3970e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_STATUS_BAR: 3971e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_NAVIGATION_BAR: 3972e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_VOLUME_OVERLAY: 3973e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT: 3974e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_INPUT_METHOD_STATUS_BAR: { 3975e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 3976e0dac50fSopenharmony_ci property_->SetFocusable(false); 3977e0dac50fSopenharmony_ci break; 3978e0dac50fSopenharmony_ci } 3979e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW: { 3980e0dac50fSopenharmony_ci property_->SetRequestRect(GetSystemAlarmWindowDefaultSize(property_->GetRequestRect())); 3981e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 3982e0dac50fSopenharmony_ci break; 3983e0dac50fSopenharmony_ci } 3984e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_KEYGUARD: { 3985e0dac50fSopenharmony_ci RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 3986e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 3987e0dac50fSopenharmony_ci break; 3988e0dac50fSopenharmony_ci } 3989e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_DRAGGING_EFFECT: { 3990e0dac50fSopenharmony_ci property_->SetWindowFlags(0); 3991e0dac50fSopenharmony_ci break; 3992e0dac50fSopenharmony_ci } 3993e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_APP_COMPONENT: { 3994e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 3995e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::NONE)); 3996e0dac50fSopenharmony_ci break; 3997e0dac50fSopenharmony_ci } 3998e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_TOAST: 3999e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_FLOAT: 4000e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_FLOAT: 4001e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_FLOAT_CAMERA: 4002e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_VOICE_INTERACTION: 4003e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_LAUNCHER_DOCK: 4004e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SEARCHING_BAR: 4005e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SCREENSHOT: 4006e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_GLOBAL_SEARCH: 4007e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_DIALOG: { 4008e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 4009e0dac50fSopenharmony_ci break; 4010e0dac50fSopenharmony_ci } 4011e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_BOOT_ANIMATION: 4012e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_POINTER: { 4013e0dac50fSopenharmony_ci property_->SetFocusable(false); 4014e0dac50fSopenharmony_ci break; 4015e0dac50fSopenharmony_ci } 4016e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_DOCK_SLICE: { 4017e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 4018e0dac50fSopenharmony_ci property_->SetFocusable(false); 4019e0dac50fSopenharmony_ci break; 4020e0dac50fSopenharmony_ci } 4021e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_TOAST: { 4022e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 4023e0dac50fSopenharmony_ci property_->SetTouchable(false); 4024e0dac50fSopenharmony_ci property_->SetFocusable(false); 4025e0dac50fSopenharmony_ci break; 4026e0dac50fSopenharmony_ci } 4027e0dac50fSopenharmony_ci default: 4028e0dac50fSopenharmony_ci break; 4029e0dac50fSopenharmony_ci } 4030e0dac50fSopenharmony_ci} 4031e0dac50fSopenharmony_ci 4032e0dac50fSopenharmony_cibool WindowImpl::IsWindowValid() const 4033e0dac50fSopenharmony_ci{ 4034e0dac50fSopenharmony_ci bool res = ((state_ > WindowState::STATE_INITIAL) && (state_ < WindowState::STATE_BOTTOM)); 4035e0dac50fSopenharmony_ci if (!res) { 4036e0dac50fSopenharmony_ci WLOGW("already destroyed or not created! id: %{public}u", GetWindowId()); 4037e0dac50fSopenharmony_ci } 4038e0dac50fSopenharmony_ci return res; 4039e0dac50fSopenharmony_ci} 4040e0dac50fSopenharmony_ci 4041e0dac50fSopenharmony_cibool WindowImpl::IsLayoutFullScreen() const 4042e0dac50fSopenharmony_ci{ 4043e0dac50fSopenharmony_ci if (!IsWindowValid()) { 4044e0dac50fSopenharmony_ci return false; 4045e0dac50fSopenharmony_ci } 4046e0dac50fSopenharmony_ci auto mode = GetMode(); 4047e0dac50fSopenharmony_ci return (mode == WindowMode::WINDOW_MODE_FULLSCREEN && isIgnoreSafeArea_); 4048e0dac50fSopenharmony_ci} 4049e0dac50fSopenharmony_ci 4050e0dac50fSopenharmony_cibool WindowImpl::IsFullScreen() const 4051e0dac50fSopenharmony_ci{ 4052e0dac50fSopenharmony_ci if (!IsWindowValid()) { 4053e0dac50fSopenharmony_ci return false; 4054e0dac50fSopenharmony_ci } 4055e0dac50fSopenharmony_ci auto statusProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 4056e0dac50fSopenharmony_ci auto naviProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_NAVIGATION_BAR); 4057e0dac50fSopenharmony_ci return (IsLayoutFullScreen() && !statusProperty.enable_ && !naviProperty.enable_); 4058e0dac50fSopenharmony_ci} 4059e0dac50fSopenharmony_ci 4060e0dac50fSopenharmony_civoid WindowImpl::SetRequestedOrientation(Orientation orientation) 4061e0dac50fSopenharmony_ci{ 4062e0dac50fSopenharmony_ci if (!IsWindowValid()) { 4063e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window is invalid"); 4064e0dac50fSopenharmony_ci return; 4065e0dac50fSopenharmony_ci } 4066e0dac50fSopenharmony_ci if (property_->GetRequestedOrientation() == orientation) { 4067e0dac50fSopenharmony_ci return; 4068e0dac50fSopenharmony_ci } 4069e0dac50fSopenharmony_ci property_->SetRequestedOrientation(orientation); 4070e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 4071e0dac50fSopenharmony_ci UpdateProperty(PropertyChangeAction::ACTION_UPDATE_ORIENTATION); 4072e0dac50fSopenharmony_ci } 4073e0dac50fSopenharmony_ci} 4074e0dac50fSopenharmony_ci 4075e0dac50fSopenharmony_ciOrientation WindowImpl::GetRequestedOrientation() 4076e0dac50fSopenharmony_ci{ 4077e0dac50fSopenharmony_ci if (!IsWindowValid()) { 4078e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window is invalid"); 4079e0dac50fSopenharmony_ci return Orientation::UNSPECIFIED; 4080e0dac50fSopenharmony_ci } 4081e0dac50fSopenharmony_ci return property_->GetRequestedOrientation(); 4082e0dac50fSopenharmony_ci} 4083e0dac50fSopenharmony_ci 4084e0dac50fSopenharmony_ciWMError WindowImpl::SetTouchHotAreas(const std::vector<Rect>& rects) 4085e0dac50fSopenharmony_ci{ 4086e0dac50fSopenharmony_ci std::vector<Rect> lastTouchHotAreas; 4087e0dac50fSopenharmony_ci property_->GetTouchHotAreas(lastTouchHotAreas); 4088e0dac50fSopenharmony_ci 4089e0dac50fSopenharmony_ci property_->SetTouchHotAreas(rects); 4090e0dac50fSopenharmony_ci WMError result = UpdateProperty(PropertyChangeAction::ACTION_UPDATE_TOUCH_HOT_AREA); 4091e0dac50fSopenharmony_ci if (result != WMError::WM_OK) { 4092e0dac50fSopenharmony_ci property_->SetTouchHotAreas(lastTouchHotAreas); 4093e0dac50fSopenharmony_ci } 4094e0dac50fSopenharmony_ci return result; 4095e0dac50fSopenharmony_ci} 4096e0dac50fSopenharmony_ci 4097e0dac50fSopenharmony_civoid WindowImpl::GetRequestedTouchHotAreas(std::vector<Rect>& rects) const 4098e0dac50fSopenharmony_ci{ 4099e0dac50fSopenharmony_ci property_->GetTouchHotAreas(rects); 4100e0dac50fSopenharmony_ci} 4101e0dac50fSopenharmony_ci 4102e0dac50fSopenharmony_ciWMError WindowImpl::SetAPPWindowLabel(const std::string& label) 4103e0dac50fSopenharmony_ci{ 4104e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 4105e0dac50fSopenharmony_ci WLOGFE("uicontent is empty"); 4106e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 4107e0dac50fSopenharmony_ci } 4108e0dac50fSopenharmony_ci uiContent_->SetAppWindowTitle(label); 4109e0dac50fSopenharmony_ci WLOGI("Set app window label success, label : %{public}s", label.c_str()); 4110e0dac50fSopenharmony_ci return WMError::WM_OK; 4111e0dac50fSopenharmony_ci} 4112e0dac50fSopenharmony_ci 4113e0dac50fSopenharmony_ciWMError WindowImpl::SetAPPWindowIcon(const std::shared_ptr<Media::PixelMap>& icon) 4114e0dac50fSopenharmony_ci{ 4115e0dac50fSopenharmony_ci if (icon == nullptr) { 4116e0dac50fSopenharmony_ci WLOGFE("window icon is empty"); 4117e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 4118e0dac50fSopenharmony_ci } 4119e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 4120e0dac50fSopenharmony_ci WLOGFE("uicontent is empty"); 4121e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 4122e0dac50fSopenharmony_ci } 4123e0dac50fSopenharmony_ci uiContent_->SetAppWindowIcon(icon); 4124e0dac50fSopenharmony_ci WLOGI("Set app window icon success"); 4125e0dac50fSopenharmony_ci return WMError::WM_OK; 4126e0dac50fSopenharmony_ci} 4127e0dac50fSopenharmony_ci 4128e0dac50fSopenharmony_cibool WindowImpl::CheckCameraFloatingWindowMultiCreated(WindowType type) 4129e0dac50fSopenharmony_ci{ 4130e0dac50fSopenharmony_ci if (type != WindowType::WINDOW_TYPE_FLOAT_CAMERA) { 4131e0dac50fSopenharmony_ci return false; 4132e0dac50fSopenharmony_ci } 4133e0dac50fSopenharmony_ci 4134e0dac50fSopenharmony_ci for (auto& winPair : windowMap_) { 4135e0dac50fSopenharmony_ci if (winPair.second.second->GetType() == WindowType::WINDOW_TYPE_FLOAT_CAMERA) { 4136e0dac50fSopenharmony_ci return true; 4137e0dac50fSopenharmony_ci } 4138e0dac50fSopenharmony_ci } 4139e0dac50fSopenharmony_ci uint32_t accessTokenId = static_cast<uint32_t>(IPCSkeleton::GetCallingTokenID()); 4140e0dac50fSopenharmony_ci property_->SetAccessTokenId(accessTokenId); 4141e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Create camera float window, TokenId = %{private}u", accessTokenId); 4142e0dac50fSopenharmony_ci return false; 4143e0dac50fSopenharmony_ci} 4144e0dac50fSopenharmony_ci 4145e0dac50fSopenharmony_ciWMError WindowImpl::SetCornerRadius(float cornerRadius) 4146e0dac50fSopenharmony_ci{ 4147e0dac50fSopenharmony_ci WLOGI("Window %{public}s set corner radius %{public}f", name_.c_str(), cornerRadius); 4148e0dac50fSopenharmony_ci surfaceNode_->SetCornerRadius(cornerRadius); 4149e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4150e0dac50fSopenharmony_ci return WMError::WM_OK; 4151e0dac50fSopenharmony_ci} 4152e0dac50fSopenharmony_ci 4153e0dac50fSopenharmony_ciWMError WindowImpl::SetShadowRadius(float radius) 4154e0dac50fSopenharmony_ci{ 4155e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4156e0dac50fSopenharmony_ci WLOGFE("set shadow radius permission denied!"); 4157e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4158e0dac50fSopenharmony_ci } 4159e0dac50fSopenharmony_ci WLOGI("Window %{public}s set shadow radius %{public}f", name_.c_str(), radius); 4160e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 4161e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4162e0dac50fSopenharmony_ci } 4163e0dac50fSopenharmony_ci surfaceNode_->SetShadowRadius(radius); 4164e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4165e0dac50fSopenharmony_ci return WMError::WM_OK; 4166e0dac50fSopenharmony_ci} 4167e0dac50fSopenharmony_ci 4168e0dac50fSopenharmony_ciWMError WindowImpl::SetShadowColor(std::string color) 4169e0dac50fSopenharmony_ci{ 4170e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4171e0dac50fSopenharmony_ci WLOGFE("set shadow color permission denied!"); 4172e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4173e0dac50fSopenharmony_ci } 4174e0dac50fSopenharmony_ci WLOGI("Window %{public}s set shadow color %{public}s", name_.c_str(), color.c_str()); 4175e0dac50fSopenharmony_ci uint32_t colorValue; 4176e0dac50fSopenharmony_ci if (!ColorParser::Parse(color, colorValue)) { 4177e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4178e0dac50fSopenharmony_ci } 4179e0dac50fSopenharmony_ci surfaceNode_->SetShadowColor(colorValue); 4180e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4181e0dac50fSopenharmony_ci return WMError::WM_OK; 4182e0dac50fSopenharmony_ci} 4183e0dac50fSopenharmony_ci 4184e0dac50fSopenharmony_ciWMError WindowImpl::SetShadowOffsetX(float offsetX) 4185e0dac50fSopenharmony_ci{ 4186e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4187e0dac50fSopenharmony_ci WLOGFE("set shadow offset x permission denied!"); 4188e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4189e0dac50fSopenharmony_ci } 4190e0dac50fSopenharmony_ci WLOGI("Window %{public}s set shadow offsetX %{public}f", name_.c_str(), offsetX); 4191e0dac50fSopenharmony_ci surfaceNode_->SetShadowOffsetX(offsetX); 4192e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4193e0dac50fSopenharmony_ci return WMError::WM_OK; 4194e0dac50fSopenharmony_ci} 4195e0dac50fSopenharmony_ci 4196e0dac50fSopenharmony_ciWMError WindowImpl::SetShadowOffsetY(float offsetY) 4197e0dac50fSopenharmony_ci{ 4198e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4199e0dac50fSopenharmony_ci WLOGFE("set shadow offset y permission denied!"); 4200e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4201e0dac50fSopenharmony_ci } 4202e0dac50fSopenharmony_ci WLOGI("Window %{public}s set shadow offsetY %{public}f", name_.c_str(), offsetY); 4203e0dac50fSopenharmony_ci surfaceNode_->SetShadowOffsetY(offsetY); 4204e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4205e0dac50fSopenharmony_ci return WMError::WM_OK; 4206e0dac50fSopenharmony_ci} 4207e0dac50fSopenharmony_ci 4208e0dac50fSopenharmony_ciWMError WindowImpl::SetBlur(float radius) 4209e0dac50fSopenharmony_ci{ 4210e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4211e0dac50fSopenharmony_ci WLOGFE("set blur permission denied!"); 4212e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4213e0dac50fSopenharmony_ci } 4214e0dac50fSopenharmony_ci WLOGI("Window %{public}s set blur radius %{public}f", name_.c_str(), radius); 4215e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 4216e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4217e0dac50fSopenharmony_ci } 4218e0dac50fSopenharmony_ci radius = ConvertRadiusToSigma(radius); 4219e0dac50fSopenharmony_ci WLOGFI("[Client] Window %{public}s set blur radius after conversion %{public}f", name_.c_str(), radius); 4220e0dac50fSopenharmony_ci surfaceNode_->SetFilter(RSFilter::CreateBlurFilter(radius, radius)); 4221e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4222e0dac50fSopenharmony_ci return WMError::WM_OK; 4223e0dac50fSopenharmony_ci} 4224e0dac50fSopenharmony_ci 4225e0dac50fSopenharmony_ciWMError WindowImpl::SetBackdropBlur(float radius) 4226e0dac50fSopenharmony_ci{ 4227e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4228e0dac50fSopenharmony_ci WLOGFE("set backdrop blur permission denied!"); 4229e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4230e0dac50fSopenharmony_ci } 4231e0dac50fSopenharmony_ci WLOGI("Window %{public}s set backdrop blur radius %{public}f", name_.c_str(), radius); 4232e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 4233e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4234e0dac50fSopenharmony_ci } 4235e0dac50fSopenharmony_ci radius = ConvertRadiusToSigma(radius); 4236e0dac50fSopenharmony_ci WLOGFI("[Client] Window %{public}s set backdrop blur radius after conversion %{public}f", name_.c_str(), radius); 4237e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(RSFilter::CreateBlurFilter(radius, radius)); 4238e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4239e0dac50fSopenharmony_ci return WMError::WM_OK; 4240e0dac50fSopenharmony_ci} 4241e0dac50fSopenharmony_ci 4242e0dac50fSopenharmony_ciWMError WindowImpl::SetBackdropBlurStyle(WindowBlurStyle blurStyle) 4243e0dac50fSopenharmony_ci{ 4244e0dac50fSopenharmony_ci if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) { 4245e0dac50fSopenharmony_ci WLOGFE("set backdrop blur style permission denied!"); 4246e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 4247e0dac50fSopenharmony_ci } 4248e0dac50fSopenharmony_ci WLOGI("Window %{public}s set backdrop blur style %{public}u", name_.c_str(), blurStyle); 4249e0dac50fSopenharmony_ci if (blurStyle < WindowBlurStyle::WINDOW_BLUR_OFF || blurStyle > WindowBlurStyle::WINDOW_BLUR_THICK) { 4250e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4251e0dac50fSopenharmony_ci } 4252e0dac50fSopenharmony_ci 4253e0dac50fSopenharmony_ci if (blurStyle == WindowBlurStyle::WINDOW_BLUR_OFF) { 4254e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(nullptr); 4255e0dac50fSopenharmony_ci } else { 4256e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 4257e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 4258e0dac50fSopenharmony_ci if (display == nullptr) { 4259e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64", window id:%{public}u", property_->GetDisplayId(), 4260e0dac50fSopenharmony_ci property_->GetWindowId()); 4261e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4262e0dac50fSopenharmony_ci } 4263e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(RSFilter::CreateMaterialFilter(static_cast<int>(blurStyle), 4264e0dac50fSopenharmony_ci display->GetVirtualPixelRatio())); 4265e0dac50fSopenharmony_ci } 4266e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 4267e0dac50fSopenharmony_ci return WMError::WM_OK; 4268e0dac50fSopenharmony_ci} 4269e0dac50fSopenharmony_ci 4270e0dac50fSopenharmony_ciWMError WindowImpl::NotifyMemoryLevel(int32_t level) 4271e0dac50fSopenharmony_ci{ 4272e0dac50fSopenharmony_ci WLOGFD("id: %{public}u, notify memory level: %{public}d", property_->GetWindowId(), level); 4273e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 4274e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 4275e0dac50fSopenharmony_ci WLOGFE("Window %{public}s notify memory level failed, ace is null.", name_.c_str()); 4276e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 4277e0dac50fSopenharmony_ci } 4278e0dac50fSopenharmony_ci // notify memory level 4279e0dac50fSopenharmony_ci uiContent_->NotifyMemoryLevel(level); 4280e0dac50fSopenharmony_ci return WMError::WM_OK; 4281e0dac50fSopenharmony_ci} 4282e0dac50fSopenharmony_ci 4283e0dac50fSopenharmony_cibool WindowImpl::IsAllowHaveSystemSubWindow() 4284e0dac50fSopenharmony_ci{ 4285e0dac50fSopenharmony_ci auto windowType = property_->GetWindowType(); 4286e0dac50fSopenharmony_ci if (WindowHelper::IsSystemSubWindow(windowType) || 4287e0dac50fSopenharmony_ci WindowHelper::IsSubWindow(windowType) || 4288e0dac50fSopenharmony_ci windowType == WindowType::WINDOW_TYPE_DIALOG) { 4289e0dac50fSopenharmony_ci WLOGI("type %{public}u not allowed to add subwindow", windowType); 4290e0dac50fSopenharmony_ci return false; 4291e0dac50fSopenharmony_ci } 4292e0dac50fSopenharmony_ci return true; 4293e0dac50fSopenharmony_ci} 4294e0dac50fSopenharmony_ci 4295e0dac50fSopenharmony_civoid WindowImpl::SetNeedDefaultAnimation(bool needDefaultAnimation) 4296e0dac50fSopenharmony_ci{ 4297e0dac50fSopenharmony_ci needDefaultAnimation_= needDefaultAnimation; 4298e0dac50fSopenharmony_ci} 4299e0dac50fSopenharmony_ci 4300e0dac50fSopenharmony_ciWMError WindowImpl::SetTextFieldAvoidInfo(double textFieldPositionY, double textFieldHeight) 4301e0dac50fSopenharmony_ci{ 4302e0dac50fSopenharmony_ci property_->SetTextFieldPositionY(textFieldPositionY); 4303e0dac50fSopenharmony_ci property_->SetTextFieldHeight(textFieldHeight); 4304e0dac50fSopenharmony_ci UpdateProperty(PropertyChangeAction::ACTION_UPDATE_TEXTFIELD_AVOID_INFO); 4305e0dac50fSopenharmony_ci return WMError::WM_OK; 4306e0dac50fSopenharmony_ci} 4307e0dac50fSopenharmony_ci} // namespace Rosen 4308e0dac50fSopenharmony_ci} // namespace OHOS 4309