1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 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_scene_session_impl.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <chrono> 19e0dac50fSopenharmony_ci#include <limits> 20e0dac50fSopenharmony_ci#include <ability_manager_client.h> 21e0dac50fSopenharmony_ci#include <parameters.h> 22e0dac50fSopenharmony_ci#include <transaction/rs_transaction.h> 23e0dac50fSopenharmony_ci 24e0dac50fSopenharmony_ci#include <application_context.h> 25e0dac50fSopenharmony_ci#include "anr_handler.h" 26e0dac50fSopenharmony_ci#include "color_parser.h" 27e0dac50fSopenharmony_ci#include "singleton_container.h" 28e0dac50fSopenharmony_ci#include "display_manager.h" 29e0dac50fSopenharmony_ci#include "display_manager_adapter.h" 30e0dac50fSopenharmony_ci#include "input_transfer_station.h" 31e0dac50fSopenharmony_ci#include "perform_reporter.h" 32e0dac50fSopenharmony_ci#include "session_helper.h" 33e0dac50fSopenharmony_ci#include "session_permission.h" 34e0dac50fSopenharmony_ci#include "session/container/include/window_event_channel.h" 35e0dac50fSopenharmony_ci#include "session_manager/include/session_manager.h" 36e0dac50fSopenharmony_ci#include "window_adapter.h" 37e0dac50fSopenharmony_ci#include "window_helper.h" 38e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 39e0dac50fSopenharmony_ci#include "window_prepare_terminate.h" 40e0dac50fSopenharmony_ci#include "wm_common.h" 41e0dac50fSopenharmony_ci#include "wm_common_inner.h" 42e0dac50fSopenharmony_ci#include "wm_math.h" 43e0dac50fSopenharmony_ci#include "session_manager_agent_controller.h" 44e0dac50fSopenharmony_ci#include <transaction/rs_interfaces.h> 45e0dac50fSopenharmony_ci#include "surface_capture_future.h" 46e0dac50fSopenharmony_ci#include "pattern_detach_callback.h" 47e0dac50fSopenharmony_ci#include "picture_in_picture_manager.h" 48e0dac50fSopenharmony_ci#include "window_session_impl.h" 49e0dac50fSopenharmony_ci#include "sys_cap_util.h" 50e0dac50fSopenharmony_ci 51e0dac50fSopenharmony_cinamespace OHOS { 52e0dac50fSopenharmony_cinamespace Rosen { 53e0dac50fSopenharmony_ciunion WSColorParam { 54e0dac50fSopenharmony_ci#if defined(BIG_ENDIANNESS) && BIG_ENDIANNESS 55e0dac50fSopenharmony_ci struct { 56e0dac50fSopenharmony_ci uint8_t alpha; 57e0dac50fSopenharmony_ci uint8_t red; 58e0dac50fSopenharmony_ci uint8_t green; 59e0dac50fSopenharmony_ci uint8_t blue; 60e0dac50fSopenharmony_ci } argb; 61e0dac50fSopenharmony_ci#else 62e0dac50fSopenharmony_ci struct { 63e0dac50fSopenharmony_ci uint8_t blue; 64e0dac50fSopenharmony_ci uint8_t green; 65e0dac50fSopenharmony_ci uint8_t red; 66e0dac50fSopenharmony_ci uint8_t alpha; 67e0dac50fSopenharmony_ci } argb; 68e0dac50fSopenharmony_ci#endif 69e0dac50fSopenharmony_ci uint32_t value; 70e0dac50fSopenharmony_ci}; 71e0dac50fSopenharmony_ci 72e0dac50fSopenharmony_ci#define CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession) \ 73e0dac50fSopenharmony_ci do { \ 74e0dac50fSopenharmony_ci if ((hostSession) == nullptr) { \ 75e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "hostSession is null"); \ 76e0dac50fSopenharmony_ci return; \ 77e0dac50fSopenharmony_ci } \ 78e0dac50fSopenharmony_ci } while (false) 79e0dac50fSopenharmony_ci 80e0dac50fSopenharmony_ci#define CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, ret) \ 81e0dac50fSopenharmony_ci do { \ 82e0dac50fSopenharmony_ci if ((hostSession) == nullptr) { \ 83e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "hostSession is null"); \ 84e0dac50fSopenharmony_ci return ret; \ 85e0dac50fSopenharmony_ci } \ 86e0dac50fSopenharmony_ci } while (false) 87e0dac50fSopenharmony_ci 88e0dac50fSopenharmony_cinamespace { 89e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowSceneSessionImpl"}; 90e0dac50fSopenharmony_ciconstexpr int32_t WINDOW_DETACH_TIMEOUT = 300; 91e0dac50fSopenharmony_ciconstexpr int32_t WINDOW_LAYOUT_TIMEOUT = 30; 92e0dac50fSopenharmony_ciconst std::string PARAM_DUMP_HELP = "-h"; 93e0dac50fSopenharmony_ciconstexpr float MIN_GRAY_SCALE = 0.0f; 94e0dac50fSopenharmony_ciconstexpr float MAX_GRAY_SCALE = 1.0f; 95e0dac50fSopenharmony_ciconstexpr int32_t MAX_POINTERS = 16; 96e0dac50fSopenharmony_ciconstexpr int32_t TOUCH_SLOP_RATIO = 25; 97e0dac50fSopenharmony_ciconst std::unordered_set<WindowType> INVALID_SYSTEM_WINDOW_TYPE = { 98e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_NEGATIVE_SCREEN, 99e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_THEME_EDITOR, 100e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR, 101e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_SCENE_BOARD, 102e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_KEYBOARD_PANEL, 103e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_APP_LAUNCHING, 104e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_INCOMING_CALL, 105e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_BOOT_ANIMATION, 106e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_FREEZE_DISPLAY, 107e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_PLACEHOLDER 108e0dac50fSopenharmony_ci}; 109e0dac50fSopenharmony_ciconst std::unordered_set<WindowType> INVALID_SCB_WINDOW_TYPE = { 110e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_WALLPAPER, 111e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_DESKTOP, 112e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_DOCK_SLICE, 113e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_STATUS_BAR, 114e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_KEYGUARD, 115e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_NAVIGATION_BAR, 116e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_LAUNCHER_RECENT, 117e0dac50fSopenharmony_ci WindowType::WINDOW_TYPE_LAUNCHER_DOCK 118e0dac50fSopenharmony_ci}; 119e0dac50fSopenharmony_ciconstexpr uint32_t MAX_SUB_WINDOW_LEVEL = 4; 120e0dac50fSopenharmony_ci} 121e0dac50fSopenharmony_ciuint32_t WindowSceneSessionImpl::maxFloatingWindowSize_ = 1920; 122e0dac50fSopenharmony_cistd::mutex WindowSceneSessionImpl::keyboardPanelInfoChangeListenerMutex_; 123e0dac50fSopenharmony_ciusing WindowSessionImplMap = std::map<std::string, std::pair<int32_t, sptr<WindowSessionImpl>>>; 124e0dac50fSopenharmony_ci 125e0dac50fSopenharmony_ciWindowSceneSessionImpl::WindowSceneSessionImpl(const sptr<WindowOption>& option) : WindowSessionImpl(option) 126e0dac50fSopenharmony_ci{ 127e0dac50fSopenharmony_ci WLOGFI("[WMSCom] Constructor %{public}s", GetWindowName().c_str()); 128e0dac50fSopenharmony_ci} 129e0dac50fSopenharmony_ci 130e0dac50fSopenharmony_ciWindowSceneSessionImpl::~WindowSceneSessionImpl() 131e0dac50fSopenharmony_ci{ 132e0dac50fSopenharmony_ci WLOGFI("[WMSCom] Destructor %{public}d, %{public}s", GetPersistentId(), GetWindowName().c_str()); 133e0dac50fSopenharmony_ci} 134e0dac50fSopenharmony_ci 135e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsValidSystemWindowType(const WindowType& type) 136e0dac50fSopenharmony_ci{ 137e0dac50fSopenharmony_ci if (INVALID_SYSTEM_WINDOW_TYPE.find(type) != INVALID_SYSTEM_WINDOW_TYPE.end()) { 138e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "Invalid type: %{public}u", type); 139e0dac50fSopenharmony_ci return false; 140e0dac50fSopenharmony_ci } 141e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "Valid type: %{public}u", type); 142e0dac50fSopenharmony_ci return true; 143e0dac50fSopenharmony_ci} 144e0dac50fSopenharmony_ci 145e0dac50fSopenharmony_cisptr<WindowSessionImpl> WindowSceneSessionImpl::FindParentSessionByParentId(uint32_t parentId) 146e0dac50fSopenharmony_ci{ 147e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 148e0dac50fSopenharmony_ci for (const auto& [_, pair] : windowSessionMap_) { 149e0dac50fSopenharmony_ci auto& window = pair.second; 150e0dac50fSopenharmony_ci if (window && window->GetWindowId() == parentId) { 151e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(window->GetType()) || WindowHelper::IsSystemWindow(window->GetType())) { 152e0dac50fSopenharmony_ci WLOGFD("Find parent, [parentName: %{public}s, parentId:%{public}u, selfPersistentId: %{public}d]", 153e0dac50fSopenharmony_ci window->GetProperty()->GetWindowName().c_str(), parentId, 154e0dac50fSopenharmony_ci window->GetProperty()->GetPersistentId()); 155e0dac50fSopenharmony_ci return window; 156e0dac50fSopenharmony_ci } else if (WindowHelper::IsSubWindow(window->GetType()) && 157e0dac50fSopenharmony_ci (IsSessionMainWindow(window->GetParentId()) || window->GetProperty()->GetIsUIExtFirstSubWindow() || 158e0dac50fSopenharmony_ci VerifySubWindowLevel(window->GetParentId()))) { 159e0dac50fSopenharmony_ci // subwindow's grandparent is mainwindow or subwindow's parent is an extension subwindow 160e0dac50fSopenharmony_ci return window; 161e0dac50fSopenharmony_ci } 162e0dac50fSopenharmony_ci } 163e0dac50fSopenharmony_ci } 164e0dac50fSopenharmony_ci WLOGFD("[WMSCom] Can not find parent window, id: %{public}d", parentId); 165e0dac50fSopenharmony_ci return nullptr; 166e0dac50fSopenharmony_ci} 167e0dac50fSopenharmony_ci 168e0dac50fSopenharmony_cisptr<WindowSessionImpl> WindowSceneSessionImpl::FindParentMainSession(uint32_t parentId, const SessionMap& sessionMap) 169e0dac50fSopenharmony_ci{ 170e0dac50fSopenharmony_ci if (parentId == INVALID_SESSION_ID) { 171e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SUB, "invalid parent id"); 172e0dac50fSopenharmony_ci return nullptr; 173e0dac50fSopenharmony_ci } 174e0dac50fSopenharmony_ci for (const auto& [_, pair] : sessionMap) { 175e0dac50fSopenharmony_ci auto& window = pair.second; 176e0dac50fSopenharmony_ci if (window && window->GetWindowId() == parentId) { 177e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(window->GetType()) || 178e0dac50fSopenharmony_ci (WindowHelper::IsSystemWindow(window->GetType()) && window->GetParentId() == INVALID_SESSION_ID)) { 179e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_SUB, "find main session, id:%{public}u", window->GetWindowId()); 180e0dac50fSopenharmony_ci return window; 181e0dac50fSopenharmony_ci } 182e0dac50fSopenharmony_ci return FindParentMainSession(window->GetParentId(), sessionMap); 183e0dac50fSopenharmony_ci } 184e0dac50fSopenharmony_ci } 185e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SUB, "don't find main session, parentId:%{public}u", parentId); 186e0dac50fSopenharmony_ci return nullptr; 187e0dac50fSopenharmony_ci} 188e0dac50fSopenharmony_ci 189e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsSessionMainWindow(uint32_t parentId) 190e0dac50fSopenharmony_ci{ 191e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 192e0dac50fSopenharmony_ci for (const auto& [_, pair] : windowSessionMap_) { 193e0dac50fSopenharmony_ci auto& window = pair.second; 194e0dac50fSopenharmony_ci if (window && window->GetWindowId() == parentId && WindowHelper::IsMainWindow(window->GetType())) { 195e0dac50fSopenharmony_ci return true; 196e0dac50fSopenharmony_ci } 197e0dac50fSopenharmony_ci } 198e0dac50fSopenharmony_ci return false; 199e0dac50fSopenharmony_ci} 200e0dac50fSopenharmony_ci 201e0dac50fSopenharmony_cibool WindowSceneSessionImpl::VerifySubWindowLevel(uint32_t parentId) 202e0dac50fSopenharmony_ci{ 203e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 204e0dac50fSopenharmony_ci for (const auto& [_, pair] : windowSessionMap_) { 205e0dac50fSopenharmony_ci auto& window = pair.second; 206e0dac50fSopenharmony_ci if (window && window->GetWindowId() == parentId && 207e0dac50fSopenharmony_ci window->GetProperty()->GetSubWindowLevel() < MAX_SUB_WINDOW_LEVEL) { 208e0dac50fSopenharmony_ci return true; 209e0dac50fSopenharmony_ci } 210e0dac50fSopenharmony_ci } 211e0dac50fSopenharmony_ci return false; 212e0dac50fSopenharmony_ci} 213e0dac50fSopenharmony_ci 214e0dac50fSopenharmony_cistatic sptr<WindowSessionImpl> FindMainWindowOrExtensionSubWindow(uint32_t parentId, 215e0dac50fSopenharmony_ci const WindowSessionImplMap& sessionMap) 216e0dac50fSopenharmony_ci{ 217e0dac50fSopenharmony_ci if (parentId == INVALID_SESSION_ID) { 218e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SUB, "invalid parent id"); 219e0dac50fSopenharmony_ci return nullptr; 220e0dac50fSopenharmony_ci } 221e0dac50fSopenharmony_ci for (const auto& [_, pair] : sessionMap) { 222e0dac50fSopenharmony_ci auto& window = pair.second; 223e0dac50fSopenharmony_ci if (window && window->GetWindowId() == parentId) { 224e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(window->GetType()) || 225e0dac50fSopenharmony_ci (WindowHelper::IsSubWindow(window->GetType()) && window->GetProperty()->GetIsUIExtFirstSubWindow())) { 226e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_SUB, "find main session, id:%{public}u", window->GetWindowId()); 227e0dac50fSopenharmony_ci return window; 228e0dac50fSopenharmony_ci } 229e0dac50fSopenharmony_ci return FindMainWindowOrExtensionSubWindow(window->GetParentId(), sessionMap); 230e0dac50fSopenharmony_ci } 231e0dac50fSopenharmony_ci } 232e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SUB, "don't find main session, parentId:%{public}u", parentId); 233e0dac50fSopenharmony_ci return nullptr; 234e0dac50fSopenharmony_ci} 235e0dac50fSopenharmony_ci 236e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsPcOrPadCapabilityEnabled() const 237e0dac50fSopenharmony_ci{ 238e0dac50fSopenharmony_ci if (!windowSystemConfig_.IsPadWindow()) { 239e0dac50fSopenharmony_ci return windowSystemConfig_.IsPcWindow(); 240e0dac50fSopenharmony_ci } 241e0dac50fSopenharmony_ci bool isUiExtSubWindow = WindowHelper::IsSubWindow(GetType()) && property_->GetIsUIExtFirstSubWindow(); 242e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType()) || isUiExtSubWindow) { 243e0dac50fSopenharmony_ci return WindowSessionImpl::IsPcOrPadCapabilityEnabled(); 244e0dac50fSopenharmony_ci } 245e0dac50fSopenharmony_ci sptr<WindowSessionImpl> parentWindow = nullptr; 246e0dac50fSopenharmony_ci { 247e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 248e0dac50fSopenharmony_ci parentWindow = FindMainWindowOrExtensionSubWindow(property_->GetParentId(), windowSessionMap_); 249e0dac50fSopenharmony_ci } 250e0dac50fSopenharmony_ci if (parentWindow == nullptr) { 251e0dac50fSopenharmony_ci return false; 252e0dac50fSopenharmony_ci } 253e0dac50fSopenharmony_ci return parentWindow->WindowSessionImpl::IsPcOrPadCapabilityEnabled(); 254e0dac50fSopenharmony_ci} 255e0dac50fSopenharmony_ci 256e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsPcOrPadFreeMultiWindowMode() const 257e0dac50fSopenharmony_ci{ 258e0dac50fSopenharmony_ci if (!windowSystemConfig_.IsPadWindow()) { 259e0dac50fSopenharmony_ci return windowSystemConfig_.IsPcWindow(); 260e0dac50fSopenharmony_ci } 261e0dac50fSopenharmony_ci bool isUiExtSubWindow = WindowHelper::IsSubWindow(GetType()) && property_->GetIsUIExtFirstSubWindow(); 262e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType()) || isUiExtSubWindow) { 263e0dac50fSopenharmony_ci return IsFreeMultiWindowMode(); 264e0dac50fSopenharmony_ci } 265e0dac50fSopenharmony_ci sptr<WindowSessionImpl> parentWindow = nullptr; 266e0dac50fSopenharmony_ci { 267e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 268e0dac50fSopenharmony_ci parentWindow = FindMainWindowOrExtensionSubWindow(property_->GetParentId(), windowSessionMap_); 269e0dac50fSopenharmony_ci } 270e0dac50fSopenharmony_ci if (parentWindow == nullptr) { 271e0dac50fSopenharmony_ci return false; 272e0dac50fSopenharmony_ci } 273e0dac50fSopenharmony_ci return parentWindow->WindowSessionImpl::IsPcOrPadFreeMultiWindowMode(); 274e0dac50fSopenharmony_ci} 275e0dac50fSopenharmony_ci 276e0dac50fSopenharmony_civoid WindowSceneSessionImpl::AddSubWindowMapForExtensionWindow() 277e0dac50fSopenharmony_ci{ 278e0dac50fSopenharmony_ci // update subWindowSessionMap_ 279e0dac50fSopenharmony_ci auto extensionWindow = FindExtensionWindowWithContext(); 280e0dac50fSopenharmony_ci if (extensionWindow != nullptr) { 281e0dac50fSopenharmony_ci subWindowSessionMap_[extensionWindow->GetPersistentId()].push_back(this); 282e0dac50fSopenharmony_ci } else { 283e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SUB, "name: %{public}s not found parent extension window", 284e0dac50fSopenharmony_ci property_->GetWindowName().c_str()); 285e0dac50fSopenharmony_ci } 286e0dac50fSopenharmony_ci} 287e0dac50fSopenharmony_ci 288e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::GetParentSessionAndVerify(bool isToast, sptr<WindowSessionImpl>& parentSession) 289e0dac50fSopenharmony_ci{ 290e0dac50fSopenharmony_ci if (isToast) { 291e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 292e0dac50fSopenharmony_ci parentSession = FindParentMainSession(property_->GetParentId(), windowSessionMap_); 293e0dac50fSopenharmony_ci } else { 294e0dac50fSopenharmony_ci parentSession = FindParentSessionByParentId(property_->GetParentId()); 295e0dac50fSopenharmony_ci } 296e0dac50fSopenharmony_ci if (parentSession == nullptr) { 297e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "parent of sub window is nullptr, name: %{public}s, type: %{public}d", 298e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetType()); 299e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 300e0dac50fSopenharmony_ci } 301e0dac50fSopenharmony_ci if (!isToast && parentSession->GetProperty()->GetSubWindowLevel() > 1 && 302e0dac50fSopenharmony_ci !parentSession->IsPcOrPadCapabilityEnabled()) { 303e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SUB, "device not support"); 304e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 305e0dac50fSopenharmony_ci } 306e0dac50fSopenharmony_ci return WMError::WM_OK; 307e0dac50fSopenharmony_ci} 308e0dac50fSopenharmony_ci 309e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::CreateAndConnectSpecificSession() 310e0dac50fSopenharmony_ci{ 311e0dac50fSopenharmony_ci sptr<ISessionStage> iSessionStage(this); 312e0dac50fSopenharmony_ci sptr<IWindowEventChannel> eventChannel = sptr<WindowEventChannel>::MakeSptr(iSessionStage); 313e0dac50fSopenharmony_ci auto persistentId = INVALID_SESSION_ID; 314e0dac50fSopenharmony_ci sptr<Rosen::ISession> session; 315e0dac50fSopenharmony_ci sptr<IRemoteObject> token = context_ ? context_->GetToken() : nullptr; 316e0dac50fSopenharmony_ci if (token) { 317e0dac50fSopenharmony_ci property_->SetTokenState(true); 318e0dac50fSopenharmony_ci } 319e0dac50fSopenharmony_ci const WindowType& type = GetType(); 320e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 321e0dac50fSopenharmony_ci auto info = property_->GetSessionInfo(); 322e0dac50fSopenharmony_ci if (abilityContext && abilityContext->GetAbilityInfo()) { 323e0dac50fSopenharmony_ci info.abilityName_ = abilityContext->GetAbilityInfo()->name; 324e0dac50fSopenharmony_ci info.moduleName_ = context_->GetHapModuleInfo() ? context_->GetHapModuleInfo()->moduleName : ""; 325e0dac50fSopenharmony_ci info.bundleName_ = abilityContext->GetAbilityInfo()->bundleName; 326e0dac50fSopenharmony_ci } else if (context_) { 327e0dac50fSopenharmony_ci info.moduleName_ = context_->GetHapModuleInfo() ? context_->GetHapModuleInfo()->moduleName : ""; 328e0dac50fSopenharmony_ci info.bundleName_ = context_->GetBundleName(); 329e0dac50fSopenharmony_ci } 330e0dac50fSopenharmony_ci property_->SetSessionInfo(info); 331e0dac50fSopenharmony_ci 332e0dac50fSopenharmony_ci bool isToastFlag = property_->GetWindowFlags() & static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_IS_TOAST); 333e0dac50fSopenharmony_ci bool isUiExtSubWindowFlag = property_->GetIsUIExtAnySubWindow(); 334e0dac50fSopenharmony_ci 335e0dac50fSopenharmony_ci bool isNormalAppSubWindow = WindowHelper::IsSubWindow(type) && 336e0dac50fSopenharmony_ci !property_->GetIsUIExtFirstSubWindow() && !isUiExtSubWindowFlag; 337e0dac50fSopenharmony_ci bool isArkSubSubWindow = WindowHelper::IsSubWindow(type) && 338e0dac50fSopenharmony_ci !property_->GetIsUIExtFirstSubWindow() && isUiExtSubWindowFlag && !isToastFlag; 339e0dac50fSopenharmony_ci bool isUiExtSubWindowToast = WindowHelper::IsSubWindow(type) && isUiExtSubWindowFlag && isToastFlag; 340e0dac50fSopenharmony_ci bool isUiExtSubWindow = WindowHelper::IsSubWindow(type) && property_->GetIsUIExtFirstSubWindow(); 341e0dac50fSopenharmony_ci 342e0dac50fSopenharmony_ci if (isNormalAppSubWindow || isArkSubSubWindow) { // sub window 343e0dac50fSopenharmony_ci sptr<WindowSessionImpl> parentSession = nullptr; 344e0dac50fSopenharmony_ci auto ret = GetParentSessionAndVerify(isToastFlag, parentSession); 345e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 346e0dac50fSopenharmony_ci return ret; 347e0dac50fSopenharmony_ci } 348e0dac50fSopenharmony_ci // set parent persistentId 349e0dac50fSopenharmony_ci property_->SetDisplayId(parentSession->GetDisplayId()); 350e0dac50fSopenharmony_ci property_->SetParentPersistentId(parentSession->GetPersistentId()); 351e0dac50fSopenharmony_ci property_->SetIsPcAppInPad(parentSession->GetProperty()->GetIsPcAppInPad()); 352e0dac50fSopenharmony_ci property_->SetSubWindowLevel(parentSession->GetProperty()->GetSubWindowLevel() + 1); 353e0dac50fSopenharmony_ci // creat sub session by parent session 354e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().CreateAndConnectSpecificSession(iSessionStage, eventChannel, 355e0dac50fSopenharmony_ci surfaceNode_, property_, persistentId, session, windowSystemConfig_, token); 356e0dac50fSopenharmony_ci // update subWindowSessionMap_ 357e0dac50fSopenharmony_ci subWindowSessionMap_[parentSession->GetPersistentId()].push_back(this); 358e0dac50fSopenharmony_ci } else if (isUiExtSubWindow || isUiExtSubWindowToast) { 359e0dac50fSopenharmony_ci property_->SetParentPersistentId(property_->GetParentId()); 360e0dac50fSopenharmony_ci int32_t displayId = 0; 361e0dac50fSopenharmony_ci WMError errCode = SingletonContainer::Get<WindowAdapter>().GetDisplayIdByPersistentId(property_->GetParentId(), 362e0dac50fSopenharmony_ci displayId); 363e0dac50fSopenharmony_ci if (errCode == WMError::WM_OK) { 364e0dac50fSopenharmony_ci property_->SetDisplayId(displayId); 365e0dac50fSopenharmony_ci } else { 366e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "parent displayId get failed name: %{public}s, reason : %{public}d", 367e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), errCode); 368e0dac50fSopenharmony_ci SetDefaultDisplayIdIfNeed(); 369e0dac50fSopenharmony_ci } 370e0dac50fSopenharmony_ci property_->SetIsUIExtensionAbilityProcess(isUIExtensionAbilityProcess_); 371e0dac50fSopenharmony_ci // creat sub session by parent session 372e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().CreateAndConnectSpecificSession(iSessionStage, eventChannel, 373e0dac50fSopenharmony_ci surfaceNode_, property_, persistentId, session, windowSystemConfig_, token); 374e0dac50fSopenharmony_ci AddSubWindowMapForExtensionWindow(); 375e0dac50fSopenharmony_ci } else { // system window 376e0dac50fSopenharmony_ci WMError createSystemWindowRet = CreateSystemWindow(type); 377e0dac50fSopenharmony_ci if (createSystemWindowRet != WMError::WM_OK) { 378e0dac50fSopenharmony_ci return createSystemWindowRet; 379e0dac50fSopenharmony_ci } 380e0dac50fSopenharmony_ci WMError ret = SetSystemWindowDisplayId(type); 381e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 382e0dac50fSopenharmony_ci return ret; 383e0dac50fSopenharmony_ci } 384e0dac50fSopenharmony_ci PreProcessCreate(); 385e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().CreateAndConnectSpecificSession(iSessionStage, eventChannel, 386e0dac50fSopenharmony_ci surfaceNode_, property_, persistentId, session, windowSystemConfig_, token); 387e0dac50fSopenharmony_ci if (windowSystemConfig_.maxFloatingWindowSize_ != UINT32_MAX) { 388e0dac50fSopenharmony_ci maxFloatingWindowSize_ = windowSystemConfig_.maxFloatingWindowSize_; 389e0dac50fSopenharmony_ci } 390e0dac50fSopenharmony_ci } 391e0dac50fSopenharmony_ci property_->SetPersistentId(persistentId); 392e0dac50fSopenharmony_ci if (session == nullptr) { 393e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "create specific failed, session is nullptr, name: %{public}s", 394e0dac50fSopenharmony_ci property_->GetWindowName().c_str()); 395e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 396e0dac50fSopenharmony_ci } 397e0dac50fSopenharmony_ci { 398e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lock(hostSessionMutex_); 399e0dac50fSopenharmony_ci hostSession_ = session; 400e0dac50fSopenharmony_ci } 401e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "name:%{public}s,id:%{public}d,parentId:%{public}d,type:%{public}u," 402e0dac50fSopenharmony_ci "touchable:%{public}d", property_->GetWindowName().c_str(), property_->GetPersistentId(), 403e0dac50fSopenharmony_ci property_->GetParentPersistentId(), GetType(), property_->GetTouchable()); 404e0dac50fSopenharmony_ci return WMError::WM_OK; 405e0dac50fSopenharmony_ci} 406e0dac50fSopenharmony_ci 407e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetSystemWindowDisplayId(WindowType type) 408e0dac50fSopenharmony_ci{ 409e0dac50fSopenharmony_ci if (type == WindowType::WINDOW_TYPE_DIALOG || type == WindowType::WINDOW_TYPE_FLOAT || 410e0dac50fSopenharmony_ci (property_->GetWindowFlags() & static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_IS_TOAST))) { 411e0dac50fSopenharmony_ci sptr<WindowSessionImpl> parentSession = nullptr; 412e0dac50fSopenharmony_ci if (property_->GetWindowFlags() & static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_IS_TOAST)) { 413e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 414e0dac50fSopenharmony_ci parentSession = FindParentMainSession(property_->GetParentPersistentId(), windowSessionMap_); 415e0dac50fSopenharmony_ci } else { 416e0dac50fSopenharmony_ci parentSession = FindParentSessionByParentId(property_->GetParentPersistentId()); 417e0dac50fSopenharmony_ci } 418e0dac50fSopenharmony_ci if (parentSession == nullptr || parentSession->GetHostSession() == nullptr) { 419e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, 420e0dac50fSopenharmony_ci "parent of system window is nullptr, name: %{public}s, type: %{public}d", 421e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), 422e0dac50fSopenharmony_ci type); 423e0dac50fSopenharmony_ci SetDefaultDisplayIdIfNeed(); 424e0dac50fSopenharmony_ci } else if (property_->GetDisplayId() == DISPLAY_ID_INVALID || 425e0dac50fSopenharmony_ci property_->GetDisplayId() == parentSession->GetDisplayId()) { 426e0dac50fSopenharmony_ci property_->SetDisplayId(parentSession->GetDisplayId()); 427e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "defaultDisplay Is Set"); 428e0dac50fSopenharmony_ci } else { 429e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, 430e0dac50fSopenharmony_ci "window displayId is not same with parent, windowName: %{public}s," 431e0dac50fSopenharmony_ci "displayId: %{public}d, parent displayId: %{public}d", 432e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), 433e0dac50fSopenharmony_ci static_cast<int>(property_->GetDisplayId()), 434e0dac50fSopenharmony_ci static_cast<int>(parentSession->GetDisplayId())); 435e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_DISPLAY; 436e0dac50fSopenharmony_ci } 437e0dac50fSopenharmony_ci } else { 438e0dac50fSopenharmony_ci SetDefaultDisplayIdIfNeed(); 439e0dac50fSopenharmony_ci } 440e0dac50fSopenharmony_ci return WMError::WM_OK; 441e0dac50fSopenharmony_ci} 442e0dac50fSopenharmony_ci 443e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::CreateSystemWindow(WindowType type) 444e0dac50fSopenharmony_ci{ 445e0dac50fSopenharmony_ci if (WindowHelper::IsAppFloatingWindow(type) || WindowHelper::IsPipWindow(type) || 446e0dac50fSopenharmony_ci type == WindowType::WINDOW_TYPE_TOAST) { 447e0dac50fSopenharmony_ci property_->SetParentPersistentId(GetFloatingWindowParentId()); 448e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "parentId: %{public}d, type: %{public}d", 449e0dac50fSopenharmony_ci property_->GetParentPersistentId(), type); 450e0dac50fSopenharmony_ci auto mainWindow = FindMainWindowWithContext(); 451e0dac50fSopenharmony_ci property_->SetFloatingWindowAppType(mainWindow != nullptr ? true : false); 452e0dac50fSopenharmony_ci if (mainWindow != nullptr) { 453e0dac50fSopenharmony_ci property_->SetSubWindowLevel(mainWindow->GetProperty()->GetSubWindowLevel() + 1); 454e0dac50fSopenharmony_ci } 455e0dac50fSopenharmony_ci } else if (type == WindowType::WINDOW_TYPE_DIALOG) { 456e0dac50fSopenharmony_ci if (auto mainWindow = FindMainWindowWithContext()) { 457e0dac50fSopenharmony_ci property_->SetParentPersistentId(mainWindow->GetPersistentId()); 458e0dac50fSopenharmony_ci property_->SetSubWindowLevel(mainWindow->GetProperty()->GetSubWindowLevel() + 1); 459e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_DIALOG, "The parentId: %{public}d", mainWindow->GetPersistentId()); 460e0dac50fSopenharmony_ci } 461e0dac50fSopenharmony_ci } else if (WindowHelper::IsSystemSubWindow(type)) { 462e0dac50fSopenharmony_ci auto parentSession = FindParentSessionByParentId(property_->GetParentId()); 463e0dac50fSopenharmony_ci if (parentSession == nullptr || parentSession->GetHostSession() == nullptr) { 464e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "parent of system sub window, name: %{public}s, type: %{public}d", 465e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), type); 466e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 467e0dac50fSopenharmony_ci } 468e0dac50fSopenharmony_ci if (WindowHelper::IsSystemSubWindow(parentSession->GetType())) { 469e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "parent is system sub window, name: %{public}s, type: %{public}d", 470e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), type); 471e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_TYPE; 472e0dac50fSopenharmony_ci } 473e0dac50fSopenharmony_ci // set parent persistentId 474e0dac50fSopenharmony_ci property_->SetParentPersistentId(parentSession->GetPersistentId()); 475e0dac50fSopenharmony_ci property_->SetSubWindowLevel(parentSession->GetProperty()->GetSubWindowLevel() + 1); 476e0dac50fSopenharmony_ci } 477e0dac50fSopenharmony_ci return WMError::WM_OK; 478e0dac50fSopenharmony_ci} 479e0dac50fSopenharmony_ci 480e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RecoverAndConnectSpecificSession() 481e0dac50fSopenharmony_ci{ 482e0dac50fSopenharmony_ci auto persistentId = property_->GetPersistentId(); 483e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, "windowName = %{public}s, windowMode = %{public}u, " 484e0dac50fSopenharmony_ci "windowType = %{public}u, persistentId = %{public}d, windowState = %{public}d", GetWindowName().c_str(), 485e0dac50fSopenharmony_ci property_->GetWindowMode(), property_->GetWindowType(), persistentId, state_); 486e0dac50fSopenharmony_ci 487e0dac50fSopenharmony_ci property_->SetWindowState(state_); 488e0dac50fSopenharmony_ci 489e0dac50fSopenharmony_ci sptr<ISessionStage> iSessionStage(this); 490e0dac50fSopenharmony_ci sptr<IWindowEventChannel> eventChannel = sptr<WindowEventChannel>::MakeSptr(iSessionStage); 491e0dac50fSopenharmony_ci sptr<Rosen::ISession> session = nullptr; 492e0dac50fSopenharmony_ci sptr<IRemoteObject> token = context_ ? context_->GetToken() : nullptr; 493e0dac50fSopenharmony_ci if (token) { 494e0dac50fSopenharmony_ci property_->SetTokenState(true); 495e0dac50fSopenharmony_ci } 496e0dac50fSopenharmony_ci const WindowType type = GetType(); 497e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(type) && !property_->GetIsUIExtFirstSubWindow()) { // sub window 498e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_RECOVER, "SubWindow"); 499e0dac50fSopenharmony_ci auto parentSession = FindParentSessionByParentId(property_->GetParentId()); 500e0dac50fSopenharmony_ci if (parentSession == nullptr || parentSession->GetHostSession() == nullptr) { 501e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_RECOVER, "parentSession is null"); 502e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 503e0dac50fSopenharmony_ci } 504e0dac50fSopenharmony_ci } 505e0dac50fSopenharmony_ci if (WindowHelper::IsPipWindow(type)) { 506e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, "pipWindow"); 507e0dac50fSopenharmony_ci PictureInPictureManager::DoClose(true, true); 508e0dac50fSopenharmony_ci return WMError::WM_OK; 509e0dac50fSopenharmony_ci } 510e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().RecoverAndConnectSpecificSession( 511e0dac50fSopenharmony_ci iSessionStage, eventChannel, surfaceNode_, property_, session, token); 512e0dac50fSopenharmony_ci 513e0dac50fSopenharmony_ci if (session == nullptr) { 514e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_RECOVER, "Recover failed, session is nullptr"); 515e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 516e0dac50fSopenharmony_ci } 517e0dac50fSopenharmony_ci { 518e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lock(hostSessionMutex_); 519e0dac50fSopenharmony_ci hostSession_ = session; 520e0dac50fSopenharmony_ci } 521e0dac50fSopenharmony_ci RecoverSessionListener(); 522e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, 523e0dac50fSopenharmony_ci "over, windowName = %{public}s, persistentId = %{public}d", 524e0dac50fSopenharmony_ci GetWindowName().c_str(), GetPersistentId()); 525e0dac50fSopenharmony_ci return WMError::WM_OK; 526e0dac50fSopenharmony_ci} 527e0dac50fSopenharmony_ci 528e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RecoverAndReconnectSceneSession() 529e0dac50fSopenharmony_ci{ 530e0dac50fSopenharmony_ci if (isFocused_) { 531e0dac50fSopenharmony_ci UpdateFocus(false); 532e0dac50fSopenharmony_ci } 533e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 534e0dac50fSopenharmony_ci if (context_ && context_->GetHapModuleInfo() && abilityContext && abilityContext->GetAbilityInfo()) { 535e0dac50fSopenharmony_ci property_->EditSessionInfo().abilityName_ = abilityContext->GetAbilityInfo()->name; 536e0dac50fSopenharmony_ci property_->EditSessionInfo().moduleName_ = context_->GetHapModuleInfo()->moduleName; 537e0dac50fSopenharmony_ci } else { 538e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_RECOVER, "context_ or abilityContext is null, recovered session failed"); 539e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 540e0dac50fSopenharmony_ci } 541e0dac50fSopenharmony_ci auto& info = property_->EditSessionInfo(); 542e0dac50fSopenharmony_ci if (auto want = abilityContext->GetWant()) { 543e0dac50fSopenharmony_ci info.want = want; 544e0dac50fSopenharmony_ci } else { 545e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_RECOVER, "want is nullptr!"); 546e0dac50fSopenharmony_ci } 547e0dac50fSopenharmony_ci property_->SetWindowState(state_); 548e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, 549e0dac50fSopenharmony_ci "bundle=%{public}s, module=%{public}s, ability=%{public}s, appIndex=%{public}d, type=%{public}u, " 550e0dac50fSopenharmony_ci "Id=%{public}d, windowState=%{public}d", 551e0dac50fSopenharmony_ci info.bundleName_.c_str(), info.moduleName_.c_str(), info.abilityName_.c_str(), info.appIndex_, info.windowType_, 552e0dac50fSopenharmony_ci GetPersistentId(), state_); 553e0dac50fSopenharmony_ci sptr<ISessionStage> iSessionStage(this); 554e0dac50fSopenharmony_ci sptr<IWindowEventChannel> iWindowEventChannel = sptr<WindowEventChannel>::MakeSptr(iSessionStage); 555e0dac50fSopenharmony_ci sptr<IRemoteObject> token = context_ ? context_->GetToken() : nullptr; 556e0dac50fSopenharmony_ci sptr<Rosen::ISession> session = nullptr; 557e0dac50fSopenharmony_ci auto ret = SingletonContainer::Get<WindowAdapter>().RecoverAndReconnectSceneSession( 558e0dac50fSopenharmony_ci iSessionStage, iWindowEventChannel, surfaceNode_, session, property_, token); 559e0dac50fSopenharmony_ci if (session == nullptr) { 560e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_RECOVER, "session is null, recovered session failed"); 561e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 562e0dac50fSopenharmony_ci } 563e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, "Recover and reconnect sceneSession successful"); 564e0dac50fSopenharmony_ci { 565e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lock(hostSessionMutex_); 566e0dac50fSopenharmony_ci hostSession_ = session; 567e0dac50fSopenharmony_ci } 568e0dac50fSopenharmony_ci RecoverSessionListener(); 569e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 570e0dac50fSopenharmony_ci} 571e0dac50fSopenharmony_ci 572e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateWindowState() 573e0dac50fSopenharmony_ci{ 574e0dac50fSopenharmony_ci { 575e0dac50fSopenharmony_ci std::unique_lock<std::shared_mutex> lock(windowSessionMutex_); 576e0dac50fSopenharmony_ci windowSessionMap_.insert(std::make_pair(property_->GetWindowName(), 577e0dac50fSopenharmony_ci std::pair<uint64_t, sptr<WindowSessionImpl>>(property_->GetPersistentId(), this))); 578e0dac50fSopenharmony_ci } 579e0dac50fSopenharmony_ci state_ = WindowState::STATE_CREATED; 580e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_CREATED; 581e0dac50fSopenharmony_ci WindowType windowType = GetType(); 582e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(windowType)) { 583e0dac50fSopenharmony_ci if (windowSystemConfig_.maxFloatingWindowSize_ != UINT32_MAX) { 584e0dac50fSopenharmony_ci maxFloatingWindowSize_ = windowSystemConfig_.maxFloatingWindowSize_; 585e0dac50fSopenharmony_ci } 586e0dac50fSopenharmony_ci if (property_->GetIsNeedUpdateWindowMode()) { 587e0dac50fSopenharmony_ci WLOGFI("UpdateWindowMode %{public}u mode %{public}u", 588e0dac50fSopenharmony_ci GetWindowId(), static_cast<uint32_t>(property_->GetWindowMode())); 589e0dac50fSopenharmony_ci UpdateWindowModeImmediately(property_->GetWindowMode()); 590e0dac50fSopenharmony_ci property_->SetIsNeedUpdateWindowMode(false); 591e0dac50fSopenharmony_ci } else { 592e0dac50fSopenharmony_ci SetWindowMode(windowSystemConfig_.defaultWindowMode_); 593e0dac50fSopenharmony_ci } 594e0dac50fSopenharmony_ci NotifyWindowNeedAvoid( 595e0dac50fSopenharmony_ci (property_->GetWindowFlags()) & (static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_NEED_AVOID))); 596e0dac50fSopenharmony_ci GetConfigurationFromAbilityInfo(); 597e0dac50fSopenharmony_ci } else { 598e0dac50fSopenharmony_ci bool isSubWindow = WindowHelper::IsSubWindow(windowType); 599e0dac50fSopenharmony_ci bool isDialogWindow = WindowHelper::IsDialogWindow(windowType); 600e0dac50fSopenharmony_ci bool isSysytemWindow = WindowHelper::IsSystemWindow(windowType); 601e0dac50fSopenharmony_ci UpdateWindowSizeLimits(); 602e0dac50fSopenharmony_ci if ((isSubWindow || isDialogWindow || isSysytemWindow) && property_->GetDragEnabled()) { 603e0dac50fSopenharmony_ci WLOGFD("sync window limits to server side to make size limits work while resizing"); 604e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_WINDOW_LIMITS); 605e0dac50fSopenharmony_ci } 606e0dac50fSopenharmony_ci } 607e0dac50fSopenharmony_ci} 608e0dac50fSopenharmony_ci 609e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Create(const std::shared_ptr<AbilityRuntime::Context>& context, 610e0dac50fSopenharmony_ci const sptr<Rosen::ISession>& iSession, const std::string& identityToken) 611e0dac50fSopenharmony_ci{ 612e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window Create name:%{public}s, state:%{public}u, mode:%{public}u", 613e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), state_, GetMode()); 614e0dac50fSopenharmony_ci // allow iSession is nullptr when create window by innerkits 615e0dac50fSopenharmony_ci if (!context) { 616e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LIFE, "context is nullptr"); 617e0dac50fSopenharmony_ci } 618e0dac50fSopenharmony_ci WMError ret = WindowSessionCreateCheck(); 619e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 620e0dac50fSopenharmony_ci return ret; 621e0dac50fSopenharmony_ci } 622e0dac50fSopenharmony_ci // Since here is init of this window, no other threads will rw it. 623e0dac50fSopenharmony_ci hostSession_ = iSession; 624e0dac50fSopenharmony_ci context_ = context; 625e0dac50fSopenharmony_ci identityToken_ = identityToken; 626e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(); 627e0dac50fSopenharmony_ci if (context && context->GetApplicationInfo() && 628e0dac50fSopenharmony_ci context->GetApplicationInfo()->apiCompatibleVersion >= 9 && // 9: api version 629e0dac50fSopenharmony_ci !SessionPermission::IsSystemCalling()) { 630e0dac50fSopenharmony_ci WLOGI("Remove window flag WINDOW_FLAG_SHOW_WHEN_LOCKED"); 631e0dac50fSopenharmony_ci property_->SetWindowFlags(property_->GetWindowFlags() & 632e0dac50fSopenharmony_ci (~(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED)))); 633e0dac50fSopenharmony_ci } 634e0dac50fSopenharmony_ci 635e0dac50fSopenharmony_ci bool isSpecificSession = false; 636e0dac50fSopenharmony_ci if (GetHostSession()) { // main window 637e0dac50fSopenharmony_ci SetDefaultDisplayIdIfNeed(); 638e0dac50fSopenharmony_ci ret = Connect(); 639e0dac50fSopenharmony_ci } else { // system or sub window 640e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Create system or sub window with type = %{public}d", GetType()); 641e0dac50fSopenharmony_ci isSpecificSession = true; 642e0dac50fSopenharmony_ci const auto& type = GetType(); 643e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(type)) { 644e0dac50fSopenharmony_ci // Not valid system window type for session should return WMError::WM_OK; 645e0dac50fSopenharmony_ci if (!IsValidSystemWindowType(type)) { 646e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 647e0dac50fSopenharmony_ci } 648e0dac50fSopenharmony_ci if (INVALID_SCB_WINDOW_TYPE.find(type) != INVALID_SCB_WINDOW_TYPE.end()) { 649e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "Invalid SCB type: %{public}u", type); 650e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 651e0dac50fSopenharmony_ci } 652e0dac50fSopenharmony_ci InitSystemSessionDragEnable(); 653e0dac50fSopenharmony_ci } else if (!WindowHelper::IsSubWindow(type)) { 654e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "create failed not system or sub type, type: %{public}d", type); 655e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 656e0dac50fSopenharmony_ci } 657e0dac50fSopenharmony_ci ret = CreateAndConnectSpecificSession(); 658e0dac50fSopenharmony_ci } 659e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 660e0dac50fSopenharmony_ci MakeSubOrDialogWindowDragableAndMoveble(); 661e0dac50fSopenharmony_ci UpdateWindowState(); 662e0dac50fSopenharmony_ci RegisterSessionRecoverListener(isSpecificSession); 663e0dac50fSopenharmony_ci UpdateDefaultStatusBarColor(); 664e0dac50fSopenharmony_ci 665e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 666e0dac50fSopenharmony_ci AddSetUIContentTimeoutCheck(); 667e0dac50fSopenharmony_ci } 668e0dac50fSopenharmony_ci InputTransferStation::GetInstance().AddInputWindow(this); 669e0dac50fSopenharmony_ci } 670e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "Window Create success [name:%{public}s, " 671e0dac50fSopenharmony_ci "id:%{public}d], state:%{public}u, mode:%{public}u", 672e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), property_->GetPersistentId(), state_, GetMode()); 673e0dac50fSopenharmony_ci return ret; 674e0dac50fSopenharmony_ci} 675e0dac50fSopenharmony_ci 676e0dac50fSopenharmony_civoid WindowSceneSessionImpl::InitSystemSessionDragEnable() 677e0dac50fSopenharmony_ci{ 678e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "windId: %{public}d init dragEnable false", 679e0dac50fSopenharmony_ci property_->GetPersistentId()); 680e0dac50fSopenharmony_ci property_->SetDragEnabled(false); 681e0dac50fSopenharmony_ci} 682e0dac50fSopenharmony_ci 683e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateDefaultStatusBarColor() 684e0dac50fSopenharmony_ci{ 685e0dac50fSopenharmony_ci SystemBarProperty statusBarProp = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 686e0dac50fSopenharmony_ci if (static_cast<SystemBarSettingFlag>(static_cast<uint32_t>(statusBarProp.settingFlag_) & 687e0dac50fSopenharmony_ci static_cast<uint32_t>(SystemBarSettingFlag::COLOR_SETTING)) == SystemBarSettingFlag::COLOR_SETTING) { 688e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "user has set color"); 689e0dac50fSopenharmony_ci return; 690e0dac50fSopenharmony_ci } 691e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 692e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "not main window"); 693e0dac50fSopenharmony_ci return; 694e0dac50fSopenharmony_ci } 695e0dac50fSopenharmony_ci std::shared_ptr<AbilityRuntime::ApplicationContext> appContext = AbilityRuntime::Context::GetApplicationContext(); 696e0dac50fSopenharmony_ci if (appContext == nullptr) { 697e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "app context is nullptr"); 698e0dac50fSopenharmony_ci return; 699e0dac50fSopenharmony_ci } 700e0dac50fSopenharmony_ci std::shared_ptr<AppExecFwk::Configuration> config = appContext->GetConfiguration(); 701e0dac50fSopenharmony_ci bool isColorModeSetByApp = !config->GetItem(AAFwk::GlobalConfigurationKey::COLORMODE_IS_SET_BY_APP).empty(); 702e0dac50fSopenharmony_ci std::string colorMode = config->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); 703e0dac50fSopenharmony_ci uint32_t contentColor; 704e0dac50fSopenharmony_ci constexpr uint32_t BLACK = 0xFF000000; 705e0dac50fSopenharmony_ci constexpr uint32_t WHITE = 0xFFFFFFFF; 706e0dac50fSopenharmony_ci if (isColorModeSetByApp) { 707e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "winId: %{public}u, type: %{public}u, colorMode: %{public}s", 708e0dac50fSopenharmony_ci GetPersistentId(), GetType(), colorMode.c_str()); 709e0dac50fSopenharmony_ci contentColor = colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT ? BLACK : WHITE; 710e0dac50fSopenharmony_ci } else { 711e0dac50fSopenharmony_ci bool hasDarkRes = false; 712e0dac50fSopenharmony_ci appContext->AppHasDarkRes(hasDarkRes); 713e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "winId: %{public}u, type: %{public}u, hasDarkRes: %{public}u, colorMode: %{public}s", 714e0dac50fSopenharmony_ci GetPersistentId(), GetType(), hasDarkRes, colorMode.c_str()); 715e0dac50fSopenharmony_ci contentColor = colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_LIGHT ? BLACK : 716e0dac50fSopenharmony_ci (hasDarkRes ? WHITE : BLACK); 717e0dac50fSopenharmony_ci } 718e0dac50fSopenharmony_ci 719e0dac50fSopenharmony_ci statusBarProp.contentColor_ = contentColor; 720e0dac50fSopenharmony_ci statusBarProp.settingFlag_ = static_cast<SystemBarSettingFlag>( 721e0dac50fSopenharmony_ci static_cast<uint32_t>(statusBarProp.settingFlag_) | 722e0dac50fSopenharmony_ci static_cast<uint32_t>(SystemBarSettingFlag::FOLLOW_SETTING)); 723e0dac50fSopenharmony_ci SetSpecificBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusBarProp); 724e0dac50fSopenharmony_ci} 725e0dac50fSopenharmony_ci 726e0dac50fSopenharmony_civoid WindowSceneSessionImpl::RegisterSessionRecoverListener(bool isSpecificSession) 727e0dac50fSopenharmony_ci{ 728e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_RECOVER, "Id = %{public}d, isSpecificSession = %{public}s", 729e0dac50fSopenharmony_ci GetPersistentId(), isSpecificSession ? "true" : "false"); 730e0dac50fSopenharmony_ci 731e0dac50fSopenharmony_ci if (GetType() == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) { 732e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, "input method window does not need to recover"); 733e0dac50fSopenharmony_ci return; 734e0dac50fSopenharmony_ci } 735e0dac50fSopenharmony_ci if (property_->GetCollaboratorType() != CollaboratorType::DEFAULT_TYPE) { 736e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_RECOVER, "collaboratorType is %{public}" PRId32 ", not need to recover", 737e0dac50fSopenharmony_ci property_->GetCollaboratorType()); 738e0dac50fSopenharmony_ci return; 739e0dac50fSopenharmony_ci } 740e0dac50fSopenharmony_ci 741e0dac50fSopenharmony_ci wptr<WindowSceneSessionImpl> weakThis = this; 742e0dac50fSopenharmony_ci auto callbackFunc = [weakThis, isSpecificSession] { 743e0dac50fSopenharmony_ci auto promoteThis = weakThis.promote(); 744e0dac50fSopenharmony_ci if (promoteThis == nullptr) { 745e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_RECOVER, "promoteThis is nullptr"); 746e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 747e0dac50fSopenharmony_ci } 748e0dac50fSopenharmony_ci if (promoteThis->state_ == WindowState::STATE_DESTROYED) { 749e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_RECOVER, "windowState is STATE_DESTROYED, no need to recover"); 750e0dac50fSopenharmony_ci return WMError::WM_ERROR_DESTROYED_OBJECT; 751e0dac50fSopenharmony_ci } 752e0dac50fSopenharmony_ci 753e0dac50fSopenharmony_ci auto ret = isSpecificSession ? promoteThis->RecoverAndConnectSpecificSession() : 754e0dac50fSopenharmony_ci promoteThis->RecoverAndReconnectSceneSession(); 755e0dac50fSopenharmony_ci 756e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_RECOVER, "Recover session over, ret = %{public}d", ret); 757e0dac50fSopenharmony_ci return ret; 758e0dac50fSopenharmony_ci }; 759e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().RegisterSessionRecoverCallbackFunc(GetPersistentId(), callbackFunc); 760e0dac50fSopenharmony_ci} 761e0dac50fSopenharmony_ci 762e0dac50fSopenharmony_cibool WindowSceneSessionImpl::HandlePointDownEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 763e0dac50fSopenharmony_ci const MMI::PointerEvent::PointerItem& pointerItem, int32_t sourceType, float vpr, const WSRect& rect) 764e0dac50fSopenharmony_ci{ 765e0dac50fSopenharmony_ci bool needNotifyEvent = true; 766e0dac50fSopenharmony_ci int32_t winX = pointerItem.GetWindowX(); 767e0dac50fSopenharmony_ci int32_t winY = pointerItem.GetWindowY(); 768e0dac50fSopenharmony_ci int32_t titleBarHeight = 0; 769e0dac50fSopenharmony_ci WMError ret = GetDecorHeight(titleBarHeight); 770e0dac50fSopenharmony_ci if (ret != WMError::WM_OK || titleBarHeight <= 0) { 771e0dac50fSopenharmony_ci titleBarHeight = static_cast<int32_t>(WINDOW_TITLE_BAR_HEIGHT * vpr); 772e0dac50fSopenharmony_ci } else { 773e0dac50fSopenharmony_ci titleBarHeight = static_cast<int32_t>(titleBarHeight * vpr); 774e0dac50fSopenharmony_ci } 775e0dac50fSopenharmony_ci bool isMoveArea = (0 <= winX && winX <= static_cast<int32_t>(rect.width_)) && 776e0dac50fSopenharmony_ci (0 <= winY && winY <= titleBarHeight); 777e0dac50fSopenharmony_ci int outside = (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) ? static_cast<int>(HOTZONE_POINTER * vpr) : 778e0dac50fSopenharmony_ci static_cast<int>(HOTZONE_TOUCH * vpr); 779e0dac50fSopenharmony_ci AreaType dragType = AreaType::UNDEFINED; 780e0dac50fSopenharmony_ci WindowType windowType = property_->GetWindowType(); 781e0dac50fSopenharmony_ci bool isSystemDragEnabledType = WindowHelper::IsSystemWindow(windowType) && property_->GetDragEnabled(); 782e0dac50fSopenharmony_ci if (property_->GetWindowMode() == Rosen::WindowMode::WINDOW_MODE_FLOATING || isSystemDragEnabledType) { 783e0dac50fSopenharmony_ci dragType = SessionHelper::GetAreaType(winX, winY, sourceType, outside, vpr, rect); 784e0dac50fSopenharmony_ci } 785e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_EVENT, "dragType: %{public}d", dragType); 786e0dac50fSopenharmony_ci bool isDecorDialog = windowType == WindowType::WINDOW_TYPE_DIALOG && property_->IsDecorEnable(); 787e0dac50fSopenharmony_ci bool isFixedSubWin = WindowHelper::IsSubWindow(windowType) && !property_->GetDragEnabled(); 788e0dac50fSopenharmony_ci bool isFixedSystemWin = WindowHelper::IsSystemWindow(windowType) && !property_->GetDragEnabled(); 789e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 790e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, needNotifyEvent); 791e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_EVENT, "isFixedSystemWin %{public}d, isFixedSubWin %{public}d, isDecorDialog %{public}d", 792e0dac50fSopenharmony_ci isFixedSystemWin, isFixedSubWin, isDecorDialog); 793e0dac50fSopenharmony_ci if ((isFixedSystemWin || isFixedSubWin) && !isDecorDialog) { 794e0dac50fSopenharmony_ci if (!isFixedSubWin && !(windowType == WindowType::WINDOW_TYPE_DIALOG)) { 795e0dac50fSopenharmony_ci hostSession->SendPointEventForMoveDrag(pointerEvent); 796e0dac50fSopenharmony_ci } else { 797e0dac50fSopenharmony_ci hostSession->ProcessPointDownSession(pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); 798e0dac50fSopenharmony_ci } 799e0dac50fSopenharmony_ci } else { 800e0dac50fSopenharmony_ci if (dragType != AreaType::UNDEFINED) { 801e0dac50fSopenharmony_ci hostSession->SendPointEventForMoveDrag(pointerEvent); 802e0dac50fSopenharmony_ci needNotifyEvent = false; 803e0dac50fSopenharmony_ci } else if (isMoveArea || (WindowHelper::IsSystemWindow(windowType) && 804e0dac50fSopenharmony_ci !(windowType == WindowType::WINDOW_TYPE_DIALOG))) { 805e0dac50fSopenharmony_ci hostSession->SendPointEventForMoveDrag(pointerEvent); 806e0dac50fSopenharmony_ci } else { 807e0dac50fSopenharmony_ci hostSession->ProcessPointDownSession(pointerItem.GetDisplayX(), pointerItem.GetDisplayY()); 808e0dac50fSopenharmony_ci } 809e0dac50fSopenharmony_ci } 810e0dac50fSopenharmony_ci return needNotifyEvent; 811e0dac50fSopenharmony_ci} 812e0dac50fSopenharmony_ci 813e0dac50fSopenharmony_civoid WindowSceneSessionImpl::ConsumePointerEventInner(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 814e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem) 815e0dac50fSopenharmony_ci{ 816e0dac50fSopenharmony_ci const int32_t& action = pointerEvent->GetPointerAction(); 817e0dac50fSopenharmony_ci const auto& sourceType = pointerEvent->GetSourceType(); 818e0dac50fSopenharmony_ci const auto& rect = SessionHelper::TransferToWSRect(GetRect()); 819e0dac50fSopenharmony_ci bool isPointDown = (action == MMI::PointerEvent::POINTER_ACTION_DOWN || 820e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN); 821e0dac50fSopenharmony_ci bool needNotifyEvent = true; 822e0dac50fSopenharmony_ci if (property_->GetCompatibleModeEnableInPad()) { 823e0dac50fSopenharmony_ci HandleEventForCompatibleMode(pointerEvent, pointerItem); 824e0dac50fSopenharmony_ci } 825e0dac50fSopenharmony_ci if (isPointDown) { 826e0dac50fSopenharmony_ci auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayInfo(property_->GetDisplayId()); 827e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 828e0dac50fSopenharmony_ci WLOGFE("display info is nullptr"); 829e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 830e0dac50fSopenharmony_ci return; 831e0dac50fSopenharmony_ci } 832e0dac50fSopenharmony_ci float vpr = GetVirtualPixelRatio(displayInfo); 833e0dac50fSopenharmony_ci if (MathHelper::NearZero(vpr)) { 834e0dac50fSopenharmony_ci WLOGFW("vpr is zero"); 835e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 836e0dac50fSopenharmony_ci return; 837e0dac50fSopenharmony_ci } 838e0dac50fSopenharmony_ci needNotifyEvent = HandlePointDownEvent(pointerEvent, pointerItem, sourceType, vpr, rect); 839e0dac50fSopenharmony_ci RefreshNoInteractionTimeoutMonitor(); 840e0dac50fSopenharmony_ci } 841e0dac50fSopenharmony_ci bool isPointUp = (action == MMI::PointerEvent::POINTER_ACTION_UP || 842e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP || 843e0dac50fSopenharmony_ci action == MMI::PointerEvent::POINTER_ACTION_CANCEL); 844e0dac50fSopenharmony_ci if (isPointUp) { 845e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 846e0dac50fSopenharmony_ci hostSession->SendPointEventForMoveDrag(pointerEvent); 847e0dac50fSopenharmony_ci } 848e0dac50fSopenharmony_ci } 849e0dac50fSopenharmony_ci 850e0dac50fSopenharmony_ci if (needNotifyEvent) { 851e0dac50fSopenharmony_ci NotifyPointerEvent(pointerEvent); 852e0dac50fSopenharmony_ci } else { 853e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 854e0dac50fSopenharmony_ci } 855e0dac50fSopenharmony_ci if (isPointDown || isPointUp) { 856e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_INPUT_KEY_FLOW, "InputId:%{public}d,wid:%{public}u,pointId:%{public}d" 857e0dac50fSopenharmony_ci ",sourceType:%{public}d,winRect:[%{public}d,%{public}d,%{public}u,%{public}u]" 858e0dac50fSopenharmony_ci ",needNotifyEvent:%{public}d", 859e0dac50fSopenharmony_ci pointerEvent->GetId(), GetWindowId(), pointerEvent->GetPointerId(), 860e0dac50fSopenharmony_ci sourceType, rect.posX_, rect.posY_, rect.width_, rect.height_, 861e0dac50fSopenharmony_ci needNotifyEvent); 862e0dac50fSopenharmony_ci } 863e0dac50fSopenharmony_ci} 864e0dac50fSopenharmony_ci 865e0dac50fSopenharmony_civoid WindowSceneSessionImpl::ConsumePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 866e0dac50fSopenharmony_ci{ 867e0dac50fSopenharmony_ci if (pointerEvent == nullptr) { 868e0dac50fSopenharmony_ci WLOGFE("PointerEvent is nullptr, windowId: %{public}d", GetWindowId()); 869e0dac50fSopenharmony_ci return; 870e0dac50fSopenharmony_ci } 871e0dac50fSopenharmony_ci 872e0dac50fSopenharmony_ci if (GetHostSession() == nullptr) { 873e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "hostSession is nullptr, windowId: %{public}d", GetWindowId()); 874e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 875e0dac50fSopenharmony_ci return; 876e0dac50fSopenharmony_ci } 877e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 878e0dac50fSopenharmony_ci if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { 879e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_INPUT_KEY_FLOW, "invalid pointerEvent, windowId: %{public}d", GetWindowId()); 880e0dac50fSopenharmony_ci pointerEvent->MarkProcessed(); 881e0dac50fSopenharmony_ci return; 882e0dac50fSopenharmony_ci } 883e0dac50fSopenharmony_ci 884e0dac50fSopenharmony_ci ConsumePointerEventInner(pointerEvent, pointerItem); 885e0dac50fSopenharmony_ci} 886e0dac50fSopenharmony_ci 887e0dac50fSopenharmony_cibool WindowSceneSessionImpl::PreNotifyKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) 888e0dac50fSopenharmony_ci{ 889e0dac50fSopenharmony_ci bool ret = false; 890e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 891e0dac50fSopenharmony_ci ret = uiContent->ProcessKeyEvent(keyEvent, true); 892e0dac50fSopenharmony_ci } 893e0dac50fSopenharmony_ci RefreshNoInteractionTimeoutMonitor(); 894e0dac50fSopenharmony_ci return ret; 895e0dac50fSopenharmony_ci} 896e0dac50fSopenharmony_ci 897e0dac50fSopenharmony_civoid WindowSceneSessionImpl::GetConfigurationFromAbilityInfo() 898e0dac50fSopenharmony_ci{ 899e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 900e0dac50fSopenharmony_ci if (abilityContext == nullptr) { 901e0dac50fSopenharmony_ci WLOGFE("abilityContext is nullptr"); 902e0dac50fSopenharmony_ci return; 903e0dac50fSopenharmony_ci } 904e0dac50fSopenharmony_ci auto abilityInfo = abilityContext->GetAbilityInfo(); 905e0dac50fSopenharmony_ci if (abilityInfo != nullptr) { 906e0dac50fSopenharmony_ci property_->SetConfigWindowLimitsVP({ 907e0dac50fSopenharmony_ci abilityInfo->maxWindowWidth, abilityInfo->maxWindowHeight, 908e0dac50fSopenharmony_ci abilityInfo->minWindowWidth, abilityInfo->minWindowHeight, 909e0dac50fSopenharmony_ci static_cast<float>(abilityInfo->maxWindowRatio), static_cast<float>(abilityInfo->minWindowRatio) 910e0dac50fSopenharmony_ci }); 911e0dac50fSopenharmony_ci UpdateWindowSizeLimits(); 912e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_WINDOW_LIMITS); 913e0dac50fSopenharmony_ci // get support modes configuration 914e0dac50fSopenharmony_ci uint32_t modeSupportInfo = WindowHelper::ConvertSupportModesToSupportInfo(abilityInfo->windowModes); 915e0dac50fSopenharmony_ci if (modeSupportInfo == 0) { 916e0dac50fSopenharmony_ci WLOGFI("mode config param is 0, all modes is supported"); 917e0dac50fSopenharmony_ci modeSupportInfo = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL; 918e0dac50fSopenharmony_ci } 919e0dac50fSopenharmony_ci WLOGFI("winId: %{public}u, modeSupportInfo: %{public}u", GetWindowId(), modeSupportInfo); 920e0dac50fSopenharmony_ci property_->SetModeSupportInfo(modeSupportInfo); 921e0dac50fSopenharmony_ci // update modeSupportInfo to server 922e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_MODE_SUPPORT_INFO); 923e0dac50fSopenharmony_ci bool onlySupportFullScreen = (modeSupportInfo == WindowModeSupport::WINDOW_MODE_SUPPORT_FULLSCREEN) && 924e0dac50fSopenharmony_ci ((!windowSystemConfig_.IsPhoneWindow() && !windowSystemConfig_.IsPadWindow()) || IsFreeMultiWindowMode()); 925e0dac50fSopenharmony_ci if (onlySupportFullScreen || property_->GetFullScreenStart()) { 926e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "onlySupportFullScreen:%{public}d fullScreenStart:%{public}d", 927e0dac50fSopenharmony_ci onlySupportFullScreen, property_->GetFullScreenStart()); 928e0dac50fSopenharmony_ci Maximize(MaximizePresentation::ENTER_IMMERSIVE); 929e0dac50fSopenharmony_ci } 930e0dac50fSopenharmony_ci } 931e0dac50fSopenharmony_ci} 932e0dac50fSopenharmony_ci 933e0dac50fSopenharmony_ciuint32_t WindowSceneSessionImpl::UpdateConfigVal(uint32_t minVal, uint32_t maxVal, uint32_t configVal, 934e0dac50fSopenharmony_ci uint32_t defaultVal, float vpr) 935e0dac50fSopenharmony_ci{ 936e0dac50fSopenharmony_ci bool validConfig = minVal < (configVal * vpr) && (configVal * vpr) < maxVal; 937e0dac50fSopenharmony_ci return validConfig ? static_cast<uint32_t>(configVal * vpr) : static_cast<uint32_t>(defaultVal * vpr); 938e0dac50fSopenharmony_ci} 939e0dac50fSopenharmony_ci 940e0dac50fSopenharmony_ciWindowLimits WindowSceneSessionImpl::GetSystemSizeLimits(uint32_t displayWidth, 941e0dac50fSopenharmony_ci uint32_t displayHeight, float vpr) 942e0dac50fSopenharmony_ci{ 943e0dac50fSopenharmony_ci WindowLimits systemLimits; 944e0dac50fSopenharmony_ci systemLimits.maxWidth_ = static_cast<uint32_t>(maxFloatingWindowSize_ * vpr); 945e0dac50fSopenharmony_ci systemLimits.maxHeight_ = static_cast<uint32_t>(maxFloatingWindowSize_ * vpr); 946e0dac50fSopenharmony_ci 947e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 948e0dac50fSopenharmony_ci systemLimits.minWidth_ = UpdateConfigVal(0, displayWidth, windowSystemConfig_.miniWidthOfMainWindow_, 949e0dac50fSopenharmony_ci MIN_FLOATING_WIDTH, vpr); 950e0dac50fSopenharmony_ci systemLimits.minHeight_ = UpdateConfigVal(0, displayHeight, windowSystemConfig_.miniHeightOfMainWindow_, 951e0dac50fSopenharmony_ci MIN_FLOATING_HEIGHT, vpr); 952e0dac50fSopenharmony_ci } else if (WindowHelper::IsSubWindow(GetType())) { 953e0dac50fSopenharmony_ci systemLimits.minWidth_ = UpdateConfigVal(0, displayWidth, windowSystemConfig_.miniWidthOfSubWindow_, 954e0dac50fSopenharmony_ci MIN_FLOATING_WIDTH, vpr); 955e0dac50fSopenharmony_ci systemLimits.minHeight_ = UpdateConfigVal(0, displayHeight, windowSystemConfig_.miniHeightOfSubWindow_, 956e0dac50fSopenharmony_ci MIN_FLOATING_HEIGHT, vpr); 957e0dac50fSopenharmony_ci } else if (WindowHelper::IsSystemWindow(GetType()) && GetType() != WindowType::WINDOW_TYPE_DIALOG) { 958e0dac50fSopenharmony_ci systemLimits.minWidth_ = 0; 959e0dac50fSopenharmony_ci systemLimits.minHeight_ = 0; 960e0dac50fSopenharmony_ci } else { 961e0dac50fSopenharmony_ci systemLimits.minWidth_ = static_cast<uint32_t>(MIN_FLOATING_WIDTH * vpr); 962e0dac50fSopenharmony_ci systemLimits.minHeight_ = static_cast<uint32_t>(MIN_FLOATING_HEIGHT * vpr); 963e0dac50fSopenharmony_ci } 964e0dac50fSopenharmony_ci WLOGFI("[System SizeLimits] [maxWidth: %{public}u, minWidth: %{public}u, maxHeight: %{public}u, " 965e0dac50fSopenharmony_ci "minHeight: %{public}u]", systemLimits.maxWidth_, systemLimits.minWidth_, 966e0dac50fSopenharmony_ci systemLimits.maxHeight_, systemLimits.minHeight_); 967e0dac50fSopenharmony_ci return systemLimits; 968e0dac50fSopenharmony_ci} 969e0dac50fSopenharmony_ci 970e0dac50fSopenharmony_ci/** @note @window.layout */ 971e0dac50fSopenharmony_civoid WindowSceneSessionImpl::CalculateNewLimitsByLimits( 972e0dac50fSopenharmony_ci WindowLimits& newLimits, WindowLimits& customizedLimits, float& virtualPixelRatio) 973e0dac50fSopenharmony_ci{ 974e0dac50fSopenharmony_ci auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 975e0dac50fSopenharmony_ci if (display == nullptr) { 976e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "display is null"); 977e0dac50fSopenharmony_ci return; 978e0dac50fSopenharmony_ci } 979e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 980e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 981e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "displayInfo is null"); 982e0dac50fSopenharmony_ci return; 983e0dac50fSopenharmony_ci } 984e0dac50fSopenharmony_ci uint32_t displayWidth = static_cast<uint32_t>(display->GetWidth()); 985e0dac50fSopenharmony_ci uint32_t displayHeight = static_cast<uint32_t>(display->GetHeight()); 986e0dac50fSopenharmony_ci if (displayWidth == 0 || displayHeight == 0) { 987e0dac50fSopenharmony_ci return; 988e0dac50fSopenharmony_ci } 989e0dac50fSopenharmony_ci 990e0dac50fSopenharmony_ci virtualPixelRatio = GetVirtualPixelRatio(displayInfo); 991e0dac50fSopenharmony_ci const auto& systemLimits = GetSystemSizeLimits(displayWidth, displayHeight, virtualPixelRatio); 992e0dac50fSopenharmony_ci 993e0dac50fSopenharmony_ci if (userLimitsSet_) { 994e0dac50fSopenharmony_ci customizedLimits = property_->GetUserWindowLimits(); 995e0dac50fSopenharmony_ci } else { 996e0dac50fSopenharmony_ci customizedLimits = property_->GetConfigWindowLimitsVP(); 997e0dac50fSopenharmony_ci customizedLimits.maxWidth_ = static_cast<uint32_t>(customizedLimits.maxWidth_ * virtualPixelRatio); 998e0dac50fSopenharmony_ci customizedLimits.maxHeight_ = static_cast<uint32_t>(customizedLimits.maxHeight_ * virtualPixelRatio); 999e0dac50fSopenharmony_ci customizedLimits.minWidth_ = static_cast<uint32_t>(customizedLimits.minWidth_ * virtualPixelRatio); 1000e0dac50fSopenharmony_ci customizedLimits.minHeight_ = static_cast<uint32_t>(customizedLimits.minHeight_ * virtualPixelRatio); 1001e0dac50fSopenharmony_ci } 1002e0dac50fSopenharmony_ci newLimits = systemLimits; 1003e0dac50fSopenharmony_ci 1004e0dac50fSopenharmony_ci // calculate new limit size 1005e0dac50fSopenharmony_ci if (systemLimits.minWidth_ <= customizedLimits.maxWidth_ && 1006e0dac50fSopenharmony_ci customizedLimits.maxWidth_ <= systemLimits.maxWidth_) { 1007e0dac50fSopenharmony_ci newLimits.maxWidth_ = customizedLimits.maxWidth_; 1008e0dac50fSopenharmony_ci } 1009e0dac50fSopenharmony_ci if (systemLimits.minHeight_ <= customizedLimits.maxHeight_ && 1010e0dac50fSopenharmony_ci customizedLimits.maxHeight_ <= systemLimits.maxHeight_) { 1011e0dac50fSopenharmony_ci newLimits.maxHeight_ = customizedLimits.maxHeight_; 1012e0dac50fSopenharmony_ci } 1013e0dac50fSopenharmony_ci if (systemLimits.minWidth_ <= customizedLimits.minWidth_ && 1014e0dac50fSopenharmony_ci customizedLimits.minWidth_ <= newLimits.maxWidth_) { 1015e0dac50fSopenharmony_ci newLimits.minWidth_ = customizedLimits.minWidth_; 1016e0dac50fSopenharmony_ci } 1017e0dac50fSopenharmony_ci if (systemLimits.minHeight_ <= customizedLimits.minHeight_ && 1018e0dac50fSopenharmony_ci customizedLimits.minHeight_ <= newLimits.maxHeight_) { 1019e0dac50fSopenharmony_ci newLimits.minHeight_ = customizedLimits.minHeight_; 1020e0dac50fSopenharmony_ci } 1021e0dac50fSopenharmony_ci} 1022e0dac50fSopenharmony_ci 1023e0dac50fSopenharmony_ci/** @note @window.layout */ 1024e0dac50fSopenharmony_civoid WindowSceneSessionImpl::CalculateNewLimitsByRatio(WindowLimits& newLimits, WindowLimits& customizedLimits) 1025e0dac50fSopenharmony_ci{ 1026e0dac50fSopenharmony_ci newLimits.maxRatio_ = customizedLimits.maxRatio_; 1027e0dac50fSopenharmony_ci newLimits.minRatio_ = customizedLimits.minRatio_; 1028e0dac50fSopenharmony_ci 1029e0dac50fSopenharmony_ci // calculate new limit ratio 1030e0dac50fSopenharmony_ci double maxRatio = FLT_MAX; 1031e0dac50fSopenharmony_ci double minRatio = 0.0f; 1032e0dac50fSopenharmony_ci if (newLimits.minHeight_ != 0) { 1033e0dac50fSopenharmony_ci maxRatio = static_cast<double>(newLimits.maxWidth_) / static_cast<double>(newLimits.minHeight_); 1034e0dac50fSopenharmony_ci } 1035e0dac50fSopenharmony_ci if (newLimits.maxHeight_ != 0) { 1036e0dac50fSopenharmony_ci minRatio = static_cast<double>(newLimits.minWidth_) / static_cast<double>(newLimits.maxHeight_); 1037e0dac50fSopenharmony_ci } 1038e0dac50fSopenharmony_ci if (!MathHelper::GreatNotEqual(minRatio, customizedLimits.maxRatio_) && 1039e0dac50fSopenharmony_ci !MathHelper::GreatNotEqual(customizedLimits.maxRatio_, maxRatio)) { 1040e0dac50fSopenharmony_ci maxRatio = customizedLimits.maxRatio_; 1041e0dac50fSopenharmony_ci } 1042e0dac50fSopenharmony_ci if (!MathHelper::GreatNotEqual(minRatio, customizedLimits.minRatio_) && 1043e0dac50fSopenharmony_ci !MathHelper::GreatNotEqual(customizedLimits.minRatio_, maxRatio)) { 1044e0dac50fSopenharmony_ci minRatio = customizedLimits.minRatio_; 1045e0dac50fSopenharmony_ci } 1046e0dac50fSopenharmony_ci 1047e0dac50fSopenharmony_ci // recalculate limit size by new ratio 1048e0dac50fSopenharmony_ci double newMaxWidthFloat = static_cast<double>(newLimits.maxHeight_) * maxRatio; 1049e0dac50fSopenharmony_ci uint32_t newMaxWidth = (newMaxWidthFloat > static_cast<double>(UINT32_MAX)) ? UINT32_MAX : 1050e0dac50fSopenharmony_ci std::round(newMaxWidthFloat); 1051e0dac50fSopenharmony_ci newLimits.maxWidth_ = std::min(newMaxWidth, newLimits.maxWidth_); 1052e0dac50fSopenharmony_ci 1053e0dac50fSopenharmony_ci double newMinWidthFloat = static_cast<double>(newLimits.minHeight_) * minRatio; 1054e0dac50fSopenharmony_ci uint32_t newMinWidth = (newMinWidthFloat > static_cast<double>(UINT32_MAX)) ? UINT32_MAX : 1055e0dac50fSopenharmony_ci std::round(newMinWidthFloat); 1056e0dac50fSopenharmony_ci newLimits.minWidth_ = std::max(newMinWidth, newLimits.minWidth_); 1057e0dac50fSopenharmony_ci 1058e0dac50fSopenharmony_ci double newMaxHeightFloat = MathHelper::NearZero(minRatio) ? UINT32_MAX : 1059e0dac50fSopenharmony_ci static_cast<double>(newLimits.maxWidth_) / minRatio; 1060e0dac50fSopenharmony_ci uint32_t newMaxHeight = (newMaxHeightFloat > static_cast<double>(UINT32_MAX)) ? UINT32_MAX : 1061e0dac50fSopenharmony_ci std::round(newMaxHeightFloat); 1062e0dac50fSopenharmony_ci newLimits.maxHeight_ = std::min(newMaxHeight, newLimits.maxHeight_); 1063e0dac50fSopenharmony_ci 1064e0dac50fSopenharmony_ci double newMinHeightFloat = MathHelper::NearZero(maxRatio) ? UINT32_MAX : 1065e0dac50fSopenharmony_ci static_cast<double>(newLimits.minWidth_) / maxRatio; 1066e0dac50fSopenharmony_ci uint32_t newMinHeight = (newMinHeightFloat > static_cast<double>(UINT32_MAX)) ? UINT32_MAX : 1067e0dac50fSopenharmony_ci std::round(newMinHeightFloat); 1068e0dac50fSopenharmony_ci newLimits.minHeight_ = std::max(newMinHeight, newLimits.minHeight_); 1069e0dac50fSopenharmony_ci} 1070e0dac50fSopenharmony_ci 1071e0dac50fSopenharmony_ci/** @note @window.layout */ 1072e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateWindowSizeLimits() 1073e0dac50fSopenharmony_ci{ 1074e0dac50fSopenharmony_ci WindowLimits customizedLimits; 1075e0dac50fSopenharmony_ci WindowLimits newLimits; 1076e0dac50fSopenharmony_ci float virtualPixelRatio = 0.0f; 1077e0dac50fSopenharmony_ci 1078e0dac50fSopenharmony_ci CalculateNewLimitsByLimits(newLimits, customizedLimits, virtualPixelRatio); 1079e0dac50fSopenharmony_ci if (MathHelper::NearZero(virtualPixelRatio)) { 1080e0dac50fSopenharmony_ci return; 1081e0dac50fSopenharmony_ci } 1082e0dac50fSopenharmony_ci newLimits.vpRatio_ = virtualPixelRatio; 1083e0dac50fSopenharmony_ci CalculateNewLimitsByRatio(newLimits, customizedLimits); 1084e0dac50fSopenharmony_ci 1085e0dac50fSopenharmony_ci property_->SetWindowLimits(newLimits); 1086e0dac50fSopenharmony_ci property_->SetLastLimitsVpr(virtualPixelRatio); 1087e0dac50fSopenharmony_ci} 1088e0dac50fSopenharmony_ci 1089e0dac50fSopenharmony_civoid WindowSceneSessionImpl::PreLayoutOnShow(WindowType type, const sptr<DisplayInfo>& info) 1090e0dac50fSopenharmony_ci{ 1091e0dac50fSopenharmony_ci std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr(); 1092e0dac50fSopenharmony_ci if (uiContent == nullptr) { 1093e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LIFE, "uiContent is null"); 1094e0dac50fSopenharmony_ci return; 1095e0dac50fSopenharmony_ci } 1096e0dac50fSopenharmony_ci const auto& requestRect = GetRequestRect(); 1097e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "name: %{public}s, id: %{public}d, type: %{public}u, requestRect:%{public}s", 1098e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId(), type, requestRect.ToString().c_str()); 1099e0dac50fSopenharmony_ci if (requestRect.width_ != 0 && requestRect.height_ != 0) { 1100e0dac50fSopenharmony_ci UpdateViewportConfig(requestRect, WindowSizeChangeReason::RESIZE, nullptr, info); 1101e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1102e0dac50fSopenharmony_ci if (hostSession) { 1103e0dac50fSopenharmony_ci WSRect wsRect = { requestRect.posX_, requestRect.posY_, requestRect.width_, requestRect.height_ }; 1104e0dac50fSopenharmony_ci hostSession->UpdateClientRect(wsRect); 1105e0dac50fSopenharmony_ci } else { 1106e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "hostSession is null"); 1107e0dac50fSopenharmony_ci } 1108e0dac50fSopenharmony_ci } 1109e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 1110e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_SHOWN; 1111e0dac50fSopenharmony_ci uiContent->Foreground(); 1112e0dac50fSopenharmony_ci uiContent->PreLayout(); 1113e0dac50fSopenharmony_ci} 1114e0dac50fSopenharmony_ci 1115e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Show(uint32_t reason, bool withAnimation, bool withFocus) 1116e0dac50fSopenharmony_ci{ 1117e0dac50fSopenharmony_ci if (reason == static_cast<uint32_t>(WindowStateChangeReason::USER_SWITCH)) { 1118e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "Switch to current user, NotifyAfterForeground"); 1119e0dac50fSopenharmony_ci NotifyAfterForeground(true, false); 1120e0dac50fSopenharmony_ci return WMError::WM_OK; 1121e0dac50fSopenharmony_ci } 1122e0dac50fSopenharmony_ci const auto type = GetType(); 1123e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1124e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window show failed, session is invalid, name: %{public}s, id: %{public}d", 1125e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId()); 1126e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1127e0dac50fSopenharmony_ci } 1128e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1129e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 1130e0dac50fSopenharmony_ci 1131e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window show [name: %{public}s, id: %{public}d, type: %{public}u], reason: %{public}u," 1132e0dac50fSopenharmony_ci " state:%{public}u, requestState:%{public}u", property_->GetWindowName().c_str(), 1133e0dac50fSopenharmony_ci property_->GetPersistentId(), type, reason, state_, requestState_); 1134e0dac50fSopenharmony_ci auto isDecorEnable = IsDecorEnable(); 1135e0dac50fSopenharmony_ci UpdateDecorEnableToAce(isDecorEnable); 1136e0dac50fSopenharmony_ci property_->SetDecorEnable(isDecorEnable); 1137e0dac50fSopenharmony_ci 1138e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1139e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "window is already shown [name:%{public}s, id:%{public}d, type: %{public}u]", 1140e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), property_->GetPersistentId(), type); 1141e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(type)) { 1142e0dac50fSopenharmony_ci hostSession->RaiseAppMainWindowToTop(); 1143e0dac50fSopenharmony_ci } 1144e0dac50fSopenharmony_ci NotifyAfterForeground(true, false); 1145e0dac50fSopenharmony_ci RefreshNoInteractionTimeoutMonitor(); 1146e0dac50fSopenharmony_ci return WMError::WM_OK; 1147e0dac50fSopenharmony_ci } 1148e0dac50fSopenharmony_ci auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 1149e0dac50fSopenharmony_ci if (display == nullptr) { 1150e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "Window show failed, display is null, name: %{public}s, id: %{public}d", 1151e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId()); 1152e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 1153e0dac50fSopenharmony_ci } 1154e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 1155e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 1156e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "Window show failed, displayInfo is null, name: %{public}s, id: %{public}d", 1157e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId()); 1158e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 1159e0dac50fSopenharmony_ci } 1160e0dac50fSopenharmony_ci float density = GetVirtualPixelRatio(displayInfo); 1161e0dac50fSopenharmony_ci if (!MathHelper::NearZero(virtualPixelRatio_ - density) || 1162e0dac50fSopenharmony_ci !MathHelper::NearZero(property_->GetLastLimitsVpr() - density)) { 1163e0dac50fSopenharmony_ci UpdateDensityInner(displayInfo); 1164e0dac50fSopenharmony_ci } 1165e0dac50fSopenharmony_ci 1166e0dac50fSopenharmony_ci WMError ret = UpdateAnimationFlagProperty(withAnimation); 1167e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1168e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "Window show failed, UpdateProperty failed, ret: %{public}d, name: %{public}s" 1169e0dac50fSopenharmony_ci ", id: %{public}d", static_cast<int32_t>(ret), property_->GetWindowName().c_str(), GetPersistentId()); 1170e0dac50fSopenharmony_ci return ret; 1171e0dac50fSopenharmony_ci } 1172e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 1173e0dac50fSopenharmony_ci UpdateFocusableOnShow(withFocus); 1174e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(type)) { 1175e0dac50fSopenharmony_ci ret = static_cast<WMError>(hostSession->Foreground(property_, true, identityToken_)); 1176e0dac50fSopenharmony_ci } else if (WindowHelper::IsSubWindow(type) || WindowHelper::IsSystemWindow(type)) { 1177e0dac50fSopenharmony_ci PreLayoutOnShow(type, displayInfo); 1178e0dac50fSopenharmony_ci // Add maintenance logs before the IPC process. 1179e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "Show session [name: %{public}s, id: %{public}d]", 1180e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId()); 1181e0dac50fSopenharmony_ci ret = static_cast<WMError>(hostSession->Show(property_)); 1182e0dac50fSopenharmony_ci } else { 1183e0dac50fSopenharmony_ci ret = WMError::WM_ERROR_INVALID_WINDOW; 1184e0dac50fSopenharmony_ci } 1185e0dac50fSopenharmony_ci if (ret == WMError::WM_OK) { 1186e0dac50fSopenharmony_ci // update sub window state 1187e0dac50fSopenharmony_ci UpdateSubWindowStateAndNotify(GetPersistentId(), WindowState::STATE_SHOWN); 1188e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 1189e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_SHOWN; 1190e0dac50fSopenharmony_ci NotifyAfterForeground(true, WindowHelper::IsMainWindow(type)); 1191e0dac50fSopenharmony_ci RefreshNoInteractionTimeoutMonitor(); 1192e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window show success [name:%{public}s, id:%{public}d, type:%{public}u]", 1193e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId(), type); 1194e0dac50fSopenharmony_ci } else { 1195e0dac50fSopenharmony_ci NotifyForegroundFailed(ret); 1196e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window show failed with errcode: %{public}d, name:%{public}s, id:%{public}d", 1197e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowName().c_str(), GetPersistentId()); 1198e0dac50fSopenharmony_ci } 1199e0dac50fSopenharmony_ci NotifyWindowStatusChange(GetMode()); 1200e0dac50fSopenharmony_ci NotifyDisplayInfoChange(displayInfo); 1201e0dac50fSopenharmony_ci return ret; 1202e0dac50fSopenharmony_ci} 1203e0dac50fSopenharmony_ci 1204e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Hide(uint32_t reason, bool withAnimation, bool isFromInnerkits) 1205e0dac50fSopenharmony_ci{ 1206e0dac50fSopenharmony_ci if (reason == static_cast<uint32_t>(WindowStateChangeReason::USER_SWITCH)) { 1207e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MULTI_USER, "Switch to another user, NotifyAfterBackground"); 1208e0dac50fSopenharmony_ci NotifyAfterBackground(true, false); 1209e0dac50fSopenharmony_ci return WMError::WM_OK; 1210e0dac50fSopenharmony_ci } 1211e0dac50fSopenharmony_ci 1212e0dac50fSopenharmony_ci const auto type = GetType(); 1213e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window hide [id:%{public}d, type: %{public}d, reason:%{public}u, state:%{public}u, " 1214e0dac50fSopenharmony_ci "requestState:%{public}u", GetPersistentId(), type, reason, state_, requestState_); 1215e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1216e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "session is invalid, id:%{public}d", GetPersistentId()); 1217e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1218e0dac50fSopenharmony_ci } 1219e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1220e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1221e0dac50fSopenharmony_ci 1222e0dac50fSopenharmony_ci WindowState validState = WindowHelper::IsSubWindow(type) ? requestState_ : state_; 1223e0dac50fSopenharmony_ci if (validState == WindowState::STATE_HIDDEN || state_ == WindowState::STATE_CREATED) { 1224e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LIFE, "window is alreay hidden, id:%{public}d", property_->GetPersistentId()); 1225e0dac50fSopenharmony_ci NotifyBackgroundFailed(WMError::WM_DO_NOTHING); 1226e0dac50fSopenharmony_ci return WMError::WM_OK; 1227e0dac50fSopenharmony_ci } 1228e0dac50fSopenharmony_ci 1229e0dac50fSopenharmony_ci WMError res = UpdateAnimationFlagProperty(withAnimation); 1230e0dac50fSopenharmony_ci if (res != WMError::WM_OK) { 1231e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "UpdateProperty failed with errCode:%{public}d", static_cast<int32_t>(res)); 1232e0dac50fSopenharmony_ci return res; 1233e0dac50fSopenharmony_ci } 1234e0dac50fSopenharmony_ci 1235e0dac50fSopenharmony_ci /* 1236e0dac50fSopenharmony_ci * main window no need to notify host, since host knows hide first 1237e0dac50fSopenharmony_ci * main window notify host temporarily, since host background may failed 1238e0dac50fSopenharmony_ci * need to SetActive(false) for host session before background 1239e0dac50fSopenharmony_ci */ 1240e0dac50fSopenharmony_ci 1241e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(type)) { 1242e0dac50fSopenharmony_ci res = static_cast<WMError>(SetActive(false)); 1243e0dac50fSopenharmony_ci if (res != WMError::WM_OK) { 1244e0dac50fSopenharmony_ci return res; 1245e0dac50fSopenharmony_ci } 1246e0dac50fSopenharmony_ci res = static_cast<WMError>(hostSession->Background(true, identityToken_)); 1247e0dac50fSopenharmony_ci } else if (WindowHelper::IsSubWindow(type) || WindowHelper::IsSystemWindow(type)) { 1248e0dac50fSopenharmony_ci res = static_cast<WMError>(hostSession->Hide()); 1249e0dac50fSopenharmony_ci } else { 1250e0dac50fSopenharmony_ci res = WMError::WM_ERROR_INVALID_WINDOW; 1251e0dac50fSopenharmony_ci } 1252e0dac50fSopenharmony_ci 1253e0dac50fSopenharmony_ci if (res == WMError::WM_OK) { 1254e0dac50fSopenharmony_ci // update sub window state if this is main window 1255e0dac50fSopenharmony_ci UpdateSubWindowState(type); 1256e0dac50fSopenharmony_ci state_ = WindowState::STATE_HIDDEN; 1257e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_HIDDEN; 1258e0dac50fSopenharmony_ci if (!interactive_) { 1259e0dac50fSopenharmony_ci hasFirstNotifyInteractive_ = false; 1260e0dac50fSopenharmony_ci } 1261e0dac50fSopenharmony_ci } 1262e0dac50fSopenharmony_ci uint32_t animationFlag = property_->GetAnimationFlag(); 1263e0dac50fSopenharmony_ci if (animationFlag == static_cast<uint32_t>(WindowAnimation::CUSTOM)) { 1264e0dac50fSopenharmony_ci animationTransitionController_->AnimationForHidden(); 1265e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 1266e0dac50fSopenharmony_ci } 1267e0dac50fSopenharmony_ci NotifyWindowStatusChange(GetMode()); 1268e0dac50fSopenharmony_ci escKeyEventTriggered_ = false; 1269e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Window hide success [id:%{public}d, type: %{public}d", 1270e0dac50fSopenharmony_ci property_->GetPersistentId(), type); 1271e0dac50fSopenharmony_ci return res; 1272e0dac50fSopenharmony_ci} 1273e0dac50fSopenharmony_ci 1274e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifyDrawingCompleted() 1275e0dac50fSopenharmony_ci{ 1276e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1277e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "session is invalid, id:%{public}d", GetPersistentId()); 1278e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1279e0dac50fSopenharmony_ci } 1280e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1281e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 1282e0dac50fSopenharmony_ci WMError res = WindowHelper::IsMainWindow(GetType()) ? 1283e0dac50fSopenharmony_ci static_cast<WMError>(hostSession->DrawingCompleted()) : 1284e0dac50fSopenharmony_ci WMError::WM_ERROR_INVALID_WINDOW; 1285e0dac50fSopenharmony_ci if (res == WMError::WM_OK) { 1286e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "success id:%{public}d", GetPersistentId()); 1287e0dac50fSopenharmony_ci } 1288e0dac50fSopenharmony_ci return res; 1289e0dac50fSopenharmony_ci} 1290e0dac50fSopenharmony_ci 1291e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateSubWindowState(const WindowType& type) 1292e0dac50fSopenharmony_ci{ 1293e0dac50fSopenharmony_ci UpdateSubWindowStateAndNotify(GetPersistentId(), WindowState::STATE_HIDDEN); 1294e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(type)) { 1295e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1296e0dac50fSopenharmony_ci NotifyAfterBackground(); 1297e0dac50fSopenharmony_ci } 1298e0dac50fSopenharmony_ci } else { 1299e0dac50fSopenharmony_ci NotifyAfterBackground(); 1300e0dac50fSopenharmony_ci } 1301e0dac50fSopenharmony_ci} 1302e0dac50fSopenharmony_ci 1303e0dac50fSopenharmony_civoid WindowSceneSessionImpl::PreProcessCreate() 1304e0dac50fSopenharmony_ci{ 1305e0dac50fSopenharmony_ci SetDefaultProperty(); 1306e0dac50fSopenharmony_ci} 1307e0dac50fSopenharmony_ci 1308e0dac50fSopenharmony_civoid WindowSceneSessionImpl::SetDefaultProperty() 1309e0dac50fSopenharmony_ci{ 1310e0dac50fSopenharmony_ci switch (property_->GetWindowType()) { 1311e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_TOAST: 1312e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_FLOAT: 1313e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_FLOAT: 1314e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_FLOAT_CAMERA: 1315e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_VOICE_INTERACTION: 1316e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SEARCHING_BAR: 1317e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SCREENSHOT: 1318e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_GLOBAL_SEARCH: 1319e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_DIALOG: 1320e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW: 1321e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_PANEL: 1322e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_LAUNCHER_DOCK: { 1323e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 1324e0dac50fSopenharmony_ci break; 1325e0dac50fSopenharmony_ci } 1326e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_VOLUME_OVERLAY: 1327e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT: 1328e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_INPUT_METHOD_STATUS_BAR: 1329e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_DOCK_SLICE: 1330e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_STATUS_BAR: 1331e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_NAVIGATION_BAR: { 1332e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 1333e0dac50fSopenharmony_ci property_->SetFocusable(false); 1334e0dac50fSopenharmony_ci break; 1335e0dac50fSopenharmony_ci } 1336e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_SYSTEM_TOAST: { 1337e0dac50fSopenharmony_ci property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 1338e0dac50fSopenharmony_ci property_->SetTouchable(false); 1339e0dac50fSopenharmony_ci property_->SetFocusable(false); 1340e0dac50fSopenharmony_ci break; 1341e0dac50fSopenharmony_ci } 1342e0dac50fSopenharmony_ci case WindowType::WINDOW_TYPE_POINTER: { 1343e0dac50fSopenharmony_ci property_->SetFocusable(false); 1344e0dac50fSopenharmony_ci break; 1345e0dac50fSopenharmony_ci } 1346e0dac50fSopenharmony_ci default: 1347e0dac50fSopenharmony_ci break; 1348e0dac50fSopenharmony_ci } 1349e0dac50fSopenharmony_ci} 1350e0dac50fSopenharmony_ci 1351e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::DestroyInner(bool needNotifyServer) 1352e0dac50fSopenharmony_ci{ 1353e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 1354e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType()) && needNotifyServer) { 1355e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(GetType())) { 1356e0dac50fSopenharmony_ci // main window no need to notify host, since host knows hide first 1357e0dac50fSopenharmony_ci ret = SyncDestroyAndDisconnectSpecificSession(property_->GetPersistentId()); 1358e0dac50fSopenharmony_ci } else if (WindowHelper::IsSubWindow(GetType()) && property_->GetIsUIExtFirstSubWindow()) { 1359e0dac50fSopenharmony_ci auto parentSession = FindParentSessionByParentId(GetParentId()); 1360e0dac50fSopenharmony_ci if (parentSession == nullptr || parentSession->GetHostSession() == nullptr) { 1361e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 1362e0dac50fSopenharmony_ci } 1363e0dac50fSopenharmony_ci ret = SyncDestroyAndDisconnectSpecificSession(property_->GetPersistentId()); 1364e0dac50fSopenharmony_ci } else if (property_->GetIsUIExtFirstSubWindow()) { 1365e0dac50fSopenharmony_ci ret = SyncDestroyAndDisconnectSpecificSession(property_->GetPersistentId()); 1366e0dac50fSopenharmony_ci } 1367e0dac50fSopenharmony_ci } 1368e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1369e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "DestroyInner fail, ret:%{public}d", ret); 1370e0dac50fSopenharmony_ci return ret; 1371e0dac50fSopenharmony_ci } 1372e0dac50fSopenharmony_ci 1373e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 1374e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 1375e0dac50fSopenharmony_ci ret = static_cast<WMError>(hostSession->Disconnect(true, identityToken_)); 1376e0dac50fSopenharmony_ci } 1377e0dac50fSopenharmony_ci } 1378e0dac50fSopenharmony_ci return ret; 1379e0dac50fSopenharmony_ci} 1380e0dac50fSopenharmony_ci 1381e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SyncDestroyAndDisconnectSpecificSession(int32_t persistentId) 1382e0dac50fSopenharmony_ci{ 1383e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 1384e0dac50fSopenharmony_ci if (SysCapUtil::GetBundleName() == AppExecFwk::Constants::SCENE_BOARD_BUNDLE_NAME) { 1385e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Destroy window is scb window"); 1386e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().DestroyAndDisconnectSpecificSession(persistentId); 1387e0dac50fSopenharmony_ci return ret; 1388e0dac50fSopenharmony_ci } 1389e0dac50fSopenharmony_ci sptr<PatternDetachCallback> callback = sptr<PatternDetachCallback>::MakeSptr(); 1390e0dac50fSopenharmony_ci ret = SingletonContainer::Get<WindowAdapter>().DestroyAndDisconnectSpecificSessionWithDetachCallback(persistentId, 1391e0dac50fSopenharmony_ci callback->AsObject()); 1392e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1393e0dac50fSopenharmony_ci return ret; 1394e0dac50fSopenharmony_ci } 1395e0dac50fSopenharmony_ci auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1396e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1397e0dac50fSopenharmony_ci callback->GetResult(WINDOW_DETACH_TIMEOUT); 1398e0dac50fSopenharmony_ci auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1399e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1400e0dac50fSopenharmony_ci auto waitTime = endTime - startTime; 1401e0dac50fSopenharmony_ci if (waitTime >= WINDOW_DETACH_TIMEOUT) { 1402e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LIFE, "Destroy window timeout, persistentId:%{public}d", persistentId); 1403e0dac50fSopenharmony_ci callback->GetResult(std::numeric_limits<int>::max()); 1404e0dac50fSopenharmony_ci } 1405e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Destroy window persistentId:%{public}d waitTime:%{public}lld", persistentId, waitTime); 1406e0dac50fSopenharmony_ci return ret; 1407e0dac50fSopenharmony_ci} 1408e0dac50fSopenharmony_ci 1409e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Destroy(bool needNotifyServer, bool needClearListener) 1410e0dac50fSopenharmony_ci{ 1411e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Destroy start, id:%{public}d, state:%{public}u, needNotifyServer:%{public}d, " 1412e0dac50fSopenharmony_ci "needClearListener:%{public}d", GetPersistentId(), state_, needNotifyServer, needClearListener); 1413e0dac50fSopenharmony_ci InputTransferStation::GetInstance().RemoveInputWindow(GetPersistentId()); 1414e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1415e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "session invalid, id: %{public}d", GetPersistentId()); 1416e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1417e0dac50fSopenharmony_ci } 1418e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().UnregisterSessionRecoverCallbackFunc(property_->GetPersistentId()); 1419e0dac50fSopenharmony_ci 1420e0dac50fSopenharmony_ci auto ret = DestroyInner(needNotifyServer); 1421e0dac50fSopenharmony_ci if (ret != WMError::WM_OK && ret != WMError::WM_ERROR_NULLPTR) { // nullptr means no session in server 1422e0dac50fSopenharmony_ci WLOGFW("Destroy window failed, id: %{public}d", GetPersistentId()); 1423e0dac50fSopenharmony_ci return ret; 1424e0dac50fSopenharmony_ci } 1425e0dac50fSopenharmony_ci 1426e0dac50fSopenharmony_ci // delete after replace WSError with WMError 1427e0dac50fSopenharmony_ci NotifyBeforeDestroy(GetWindowName()); 1428e0dac50fSopenharmony_ci { 1429e0dac50fSopenharmony_ci std::lock_guard<std::recursive_mutex> lock(mutex_); 1430e0dac50fSopenharmony_ci state_ = WindowState::STATE_DESTROYED; 1431e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_DESTROYED; 1432e0dac50fSopenharmony_ci } 1433e0dac50fSopenharmony_ci 1434e0dac50fSopenharmony_ci DestroySubWindow(); 1435e0dac50fSopenharmony_ci { 1436e0dac50fSopenharmony_ci std::unique_lock<std::shared_mutex> lock(windowSessionMutex_); 1437e0dac50fSopenharmony_ci windowSessionMap_.erase(property_->GetWindowName()); 1438e0dac50fSopenharmony_ci } 1439e0dac50fSopenharmony_ci { 1440e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lock(hostSessionMutex_); 1441e0dac50fSopenharmony_ci hostSession_ = nullptr; 1442e0dac50fSopenharmony_ci } 1443e0dac50fSopenharmony_ci NotifyAfterDestroy(); 1444e0dac50fSopenharmony_ci if (needClearListener) { 1445e0dac50fSopenharmony_ci ClearListenersById(GetPersistentId()); 1446e0dac50fSopenharmony_ci } 1447e0dac50fSopenharmony_ci if (context_) { 1448e0dac50fSopenharmony_ci context_.reset(); 1449e0dac50fSopenharmony_ci } 1450e0dac50fSopenharmony_ci ClearVsyncStation(); 1451e0dac50fSopenharmony_ci 1452e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 1453e0dac50fSopenharmony_ci SetUIContentComplete(); 1454e0dac50fSopenharmony_ci } 1455e0dac50fSopenharmony_ci 1456e0dac50fSopenharmony_ci surfaceNode_ = nullptr; 1457e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "Destroy success, id: %{public}d", property_->GetPersistentId()); 1458e0dac50fSopenharmony_ci return WMError::WM_OK; 1459e0dac50fSopenharmony_ci} 1460e0dac50fSopenharmony_ci 1461e0dac50fSopenharmony_ci/** @note @window.layout */ 1462e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::MoveTo(int32_t x, int32_t y, bool isMoveToGlobal) 1463e0dac50fSopenharmony_ci{ 1464e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id:%{public}d MoveTo %{public}d %{public}d", property_->GetPersistentId(), x, y); 1465e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1466e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1467e0dac50fSopenharmony_ci } 1468e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_PIP) { 1469e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Unsupported operation for pip window"); 1470e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1471e0dac50fSopenharmony_ci } 1472e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 1473e0dac50fSopenharmony_ci const auto& requestRect = GetRequestRect(); 1474e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(GetType())) { 1475e0dac50fSopenharmony_ci auto mainWindow = FindMainWindowWithContext(); 1476e0dac50fSopenharmony_ci if (mainWindow != nullptr && (mainWindow->GetMode() == WindowMode::WINDOW_MODE_SPLIT_SECONDARY || 1477e0dac50fSopenharmony_ci mainWindow->GetMode() == WindowMode::WINDOW_MODE_SPLIT_PRIMARY)) { 1478e0dac50fSopenharmony_ci if (requestRect.posX_ == x && requestRect.posY_ == y) { 1479e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Request same position in multiWindow will not update"); 1480e0dac50fSopenharmony_ci return WMError::WM_OK; 1481e0dac50fSopenharmony_ci } 1482e0dac50fSopenharmony_ci } 1483e0dac50fSopenharmony_ci } 1484e0dac50fSopenharmony_ci Rect newRect = { x, y, requestRect.width_, requestRect.height_ }; // must keep x/y 1485e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id:%{public}d, state: %{public}d, type: %{public}d, mode: %{public}d, requestRect: " 1486e0dac50fSopenharmony_ci "[%{public}d, %{public}d, %{public}d, %{public}d], windowRect: [%{public}d, %{public}d, " 1487e0dac50fSopenharmony_ci "%{public}d, %{public}d], newRect: [%{public}d, %{public}d, %{public}d, %{public}d]", 1488e0dac50fSopenharmony_ci property_->GetPersistentId(), state_, GetType(), GetMode(), requestRect.posX_, requestRect.posY_, 1489e0dac50fSopenharmony_ci requestRect.width_, requestRect.height_, windowRect.posX_, windowRect.posY_, 1490e0dac50fSopenharmony_ci windowRect.width_, windowRect.height_, newRect.posX_, newRect.posY_, 1491e0dac50fSopenharmony_ci newRect.width_, newRect.height_); 1492e0dac50fSopenharmony_ci 1493e0dac50fSopenharmony_ci property_->SetRequestRect(newRect); 1494e0dac50fSopenharmony_ci 1495e0dac50fSopenharmony_ci WSRect wsRect = { newRect.posX_, newRect.posY_, newRect.width_, newRect.height_ }; 1496e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1497e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 1498e0dac50fSopenharmony_ci auto ret = hostSession->UpdateSessionRect(wsRect, SizeChangeReason::MOVE, isMoveToGlobal); 1499e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1500e0dac50fSopenharmony_ci} 1501e0dac50fSopenharmony_ci 1502e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::MoveToAsync(int32_t x, int32_t y) 1503e0dac50fSopenharmony_ci{ 1504e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1505e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 1506e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1507e0dac50fSopenharmony_ci } 1508e0dac50fSopenharmony_ci 1509e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1510e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "FullScreen window should not move, winId:%{public}u, mode:%{public}u", 1511e0dac50fSopenharmony_ci GetWindowId(), GetMode()); 1512e0dac50fSopenharmony_ci return WMError::WM_ERROR_OPER_FULLSCREEN_FAILED; 1513e0dac50fSopenharmony_ci } 1514e0dac50fSopenharmony_ci auto ret = MoveTo(x, y); 1515e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1516e0dac50fSopenharmony_ci layoutCallback_->ResetLock(); 1517e0dac50fSopenharmony_ci auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1518e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1519e0dac50fSopenharmony_ci layoutCallback_->GetResult(WINDOW_LAYOUT_TIMEOUT); 1520e0dac50fSopenharmony_ci auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1521e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1522e0dac50fSopenharmony_ci auto waitTime = endTime - startTime; 1523e0dac50fSopenharmony_ci if (waitTime >= WINDOW_LAYOUT_TIMEOUT) { 1524e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Layout timeout, Id:%{public}d", property_->GetPersistentId()); 1525e0dac50fSopenharmony_ci layoutCallback_->GetResult(WINDOW_LAYOUT_TIMEOUT); 1526e0dac50fSopenharmony_ci } 1527e0dac50fSopenharmony_ci } 1528e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1529e0dac50fSopenharmony_ci} 1530e0dac50fSopenharmony_ci 1531e0dac50fSopenharmony_civoid WindowSceneSessionImpl::LimitCameraFloatWindowMininumSize(uint32_t& width, uint32_t& height, float& vpr) 1532e0dac50fSopenharmony_ci{ 1533e0dac50fSopenharmony_ci // Float camera window has a special limit: 1534e0dac50fSopenharmony_ci // if display sw <= 600dp, portrait: min width = display sw * 30%, landscape: min width = sw * 50% 1535e0dac50fSopenharmony_ci // if display sw > 600dp, portrait: min width = display sw * 12%, landscape: min width = sw * 30% 1536e0dac50fSopenharmony_ci if (GetType() != WindowType::WINDOW_TYPE_FLOAT_CAMERA) { 1537e0dac50fSopenharmony_ci return; 1538e0dac50fSopenharmony_ci } 1539e0dac50fSopenharmony_ci 1540e0dac50fSopenharmony_ci auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 1541e0dac50fSopenharmony_ci if (display == nullptr) { 1542e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64, property_->GetDisplayId()); 1543e0dac50fSopenharmony_ci return; 1544e0dac50fSopenharmony_ci } 1545e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 1546e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 1547e0dac50fSopenharmony_ci WLOGFE("get displayInfo failed displayId:%{public}" PRIu64, property_->GetDisplayId()); 1548e0dac50fSopenharmony_ci return; 1549e0dac50fSopenharmony_ci } 1550e0dac50fSopenharmony_ci uint32_t displayWidth = static_cast<uint32_t>(display->GetWidth()); 1551e0dac50fSopenharmony_ci uint32_t displayHeight = static_cast<uint32_t>(display->GetHeight()); 1552e0dac50fSopenharmony_ci if (displayWidth == 0 || displayHeight == 0) { 1553e0dac50fSopenharmony_ci return; 1554e0dac50fSopenharmony_ci } 1555e0dac50fSopenharmony_ci vpr = GetVirtualPixelRatio(displayInfo); 1556e0dac50fSopenharmony_ci uint32_t smallWidth = displayHeight <= displayWidth ? displayHeight : displayWidth; 1557e0dac50fSopenharmony_ci float hwRatio = static_cast<float>(displayHeight) / static_cast<float>(displayWidth); 1558e0dac50fSopenharmony_ci uint32_t minWidth; 1559e0dac50fSopenharmony_ci if (smallWidth <= static_cast<uint32_t>(600 * vpr)) { // sw <= 600dp 1560e0dac50fSopenharmony_ci if (displayWidth <= displayHeight) { 1561e0dac50fSopenharmony_ci minWidth = static_cast<uint32_t>(smallWidth * 0.3); // ratio : 0.3 1562e0dac50fSopenharmony_ci } else { 1563e0dac50fSopenharmony_ci minWidth = static_cast<uint32_t>(smallWidth * 0.5); // ratio : 0.5 1564e0dac50fSopenharmony_ci } 1565e0dac50fSopenharmony_ci } else { 1566e0dac50fSopenharmony_ci if (displayWidth <= displayHeight) { 1567e0dac50fSopenharmony_ci minWidth = static_cast<uint32_t>(smallWidth * 0.12); // ratio : 0.12 1568e0dac50fSopenharmony_ci } else { 1569e0dac50fSopenharmony_ci minWidth = static_cast<uint32_t>(smallWidth * 0.3); // ratio : 0.3 1570e0dac50fSopenharmony_ci } 1571e0dac50fSopenharmony_ci } 1572e0dac50fSopenharmony_ci width = (width < minWidth) ? minWidth : width; 1573e0dac50fSopenharmony_ci height = static_cast<uint32_t>(width * hwRatio); 1574e0dac50fSopenharmony_ci} 1575e0dac50fSopenharmony_ci 1576e0dac50fSopenharmony_ci/** @note @window.layout */ 1577e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateFloatingWindowSizeBySizeLimits(uint32_t& width, uint32_t& height) const 1578e0dac50fSopenharmony_ci{ 1579e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_FLOAT_CAMERA) { 1580e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LAYOUT, "float camera type window"); 1581e0dac50fSopenharmony_ci return; 1582e0dac50fSopenharmony_ci } 1583e0dac50fSopenharmony_ci // get new limit config with the settings of system and app 1584e0dac50fSopenharmony_ci const auto& sizeLimits = property_->GetWindowLimits(); 1585e0dac50fSopenharmony_ci // limit minimum size of floating (not system type) window 1586e0dac50fSopenharmony_ci if (!WindowHelper::IsSystemWindow(property_->GetWindowType()) || 1587e0dac50fSopenharmony_ci property_->GetWindowType() == WindowType::WINDOW_TYPE_DIALOG) { 1588e0dac50fSopenharmony_ci width = std::max(sizeLimits.minWidth_, width); 1589e0dac50fSopenharmony_ci height = std::max(sizeLimits.minHeight_, height); 1590e0dac50fSopenharmony_ci } 1591e0dac50fSopenharmony_ci width = std::min(sizeLimits.maxWidth_, width); 1592e0dac50fSopenharmony_ci height = std::min(sizeLimits.maxHeight_, height); 1593e0dac50fSopenharmony_ci if (height == 0) { 1594e0dac50fSopenharmony_ci return; 1595e0dac50fSopenharmony_ci } 1596e0dac50fSopenharmony_ci float curRatio = static_cast<float>(width) / static_cast<float>(height); 1597e0dac50fSopenharmony_ci // there is no need to fix size by ratio if this is not main floating window 1598e0dac50fSopenharmony_ci if (!WindowHelper::IsMainFloatingWindow(property_->GetWindowType(), GetMode()) || 1599e0dac50fSopenharmony_ci (!MathHelper::GreatNotEqual(sizeLimits.minRatio_, curRatio) && 1600e0dac50fSopenharmony_ci !MathHelper::GreatNotEqual(curRatio, sizeLimits.maxRatio_))) { 1601e0dac50fSopenharmony_ci return; 1602e0dac50fSopenharmony_ci } 1603e0dac50fSopenharmony_ci 1604e0dac50fSopenharmony_ci float newRatio = curRatio < sizeLimits.minRatio_ ? sizeLimits.minRatio_ : sizeLimits.maxRatio_; 1605e0dac50fSopenharmony_ci if (MathHelper::NearZero(newRatio)) { 1606e0dac50fSopenharmony_ci return; 1607e0dac50fSopenharmony_ci } 1608e0dac50fSopenharmony_ci if (sizeLimits.maxWidth_ == sizeLimits.minWidth_) { 1609e0dac50fSopenharmony_ci height = static_cast<uint32_t>(static_cast<float>(width) / newRatio); 1610e0dac50fSopenharmony_ci return; 1611e0dac50fSopenharmony_ci } 1612e0dac50fSopenharmony_ci if (sizeLimits.maxHeight_ == sizeLimits.minHeight_) { 1613e0dac50fSopenharmony_ci width = static_cast<uint32_t>(static_cast<float>(height) * newRatio); 1614e0dac50fSopenharmony_ci return; 1615e0dac50fSopenharmony_ci } 1616e0dac50fSopenharmony_ci WLOGFD("After limit by customize config: %{public}u %{public}u", width, height); 1617e0dac50fSopenharmony_ci} 1618e0dac50fSopenharmony_ci 1619e0dac50fSopenharmony_ci/** @note @window.layout */ 1620e0dac50fSopenharmony_civoid WindowSceneSessionImpl::LimitWindowSize(uint32_t& width, uint32_t& height) 1621e0dac50fSopenharmony_ci{ 1622e0dac50fSopenharmony_ci float vpr = 0.0f; 1623e0dac50fSopenharmony_ci 1624e0dac50fSopenharmony_ci // Float camera window has special limits 1625e0dac50fSopenharmony_ci LimitCameraFloatWindowMininumSize(width, height, vpr); 1626e0dac50fSopenharmony_ci 1627e0dac50fSopenharmony_ci if (!MathHelper::NearZero(vpr) || !MathHelper::NearZero(property_->GetLastLimitsVpr() - vpr)) { 1628e0dac50fSopenharmony_ci UpdateWindowSizeLimits(); 1629e0dac50fSopenharmony_ci } 1630e0dac50fSopenharmony_ci UpdateFloatingWindowSizeBySizeLimits(width, height); 1631e0dac50fSopenharmony_ci} 1632e0dac50fSopenharmony_ci 1633e0dac50fSopenharmony_ci/** @note @window.layout */ 1634e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Resize(uint32_t width, uint32_t height) 1635e0dac50fSopenharmony_ci{ 1636e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id:%{public}d resize %{public}u %{public}u", 1637e0dac50fSopenharmony_ci property_->GetPersistentId(), width, height); 1638e0dac50fSopenharmony_ci if (width == 0 || height == 0) { 1639e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "width or height should greater than 0!"); 1640e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1641e0dac50fSopenharmony_ci } 1642e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1643e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1644e0dac50fSopenharmony_ci } 1645e0dac50fSopenharmony_ci if (property_->GetWindowType() == WindowType::WINDOW_TYPE_PIP) { 1646e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Unsupported operation for pip window"); 1647e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1648e0dac50fSopenharmony_ci } 1649e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1650e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Fullscreen window could not resize, winId: %{public}u", GetWindowId()); 1651e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 1652e0dac50fSopenharmony_ci } 1653e0dac50fSopenharmony_ci 1654e0dac50fSopenharmony_ci LimitWindowSize(width, height); 1655e0dac50fSopenharmony_ci 1656e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 1657e0dac50fSopenharmony_ci const auto& requestRect = GetRequestRect(); 1658e0dac50fSopenharmony_ci 1659e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(GetType())) { 1660e0dac50fSopenharmony_ci auto mainWindow = FindMainWindowWithContext(); 1661e0dac50fSopenharmony_ci if (mainWindow != nullptr && (mainWindow->GetMode() == WindowMode::WINDOW_MODE_SPLIT_SECONDARY || 1662e0dac50fSopenharmony_ci mainWindow->GetMode() == WindowMode::WINDOW_MODE_SPLIT_PRIMARY)) { 1663e0dac50fSopenharmony_ci if (width == requestRect.width_ && height == requestRect.height_) { 1664e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Request same size in multiWindow will not update, return"); 1665e0dac50fSopenharmony_ci return WMError::WM_OK; 1666e0dac50fSopenharmony_ci } 1667e0dac50fSopenharmony_ci } 1668e0dac50fSopenharmony_ci } 1669e0dac50fSopenharmony_ci 1670e0dac50fSopenharmony_ci Rect newRect = { requestRect.posX_, requestRect.posY_, width, height }; // must keep w/h 1671e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id:%{public}d, state: %{public}d, type: %{public}d, mode: %{public}d, requestRect: " 1672e0dac50fSopenharmony_ci "[%{public}d, %{public}d, %{public}d, %{public}d], windowRect: [%{public}d, %{public}d, " 1673e0dac50fSopenharmony_ci "%{public}d, %{public}d], newRect: [%{public}d, %{public}d, %{public}d, %{public}d]", 1674e0dac50fSopenharmony_ci property_->GetPersistentId(), state_, GetType(), GetMode(), requestRect.posX_, requestRect.posY_, 1675e0dac50fSopenharmony_ci requestRect.width_, requestRect.height_, windowRect.posX_, windowRect.posY_, 1676e0dac50fSopenharmony_ci windowRect.width_, windowRect.height_, newRect.posX_, newRect.posY_, 1677e0dac50fSopenharmony_ci newRect.width_, newRect.height_); 1678e0dac50fSopenharmony_ci 1679e0dac50fSopenharmony_ci property_->SetRequestRect(newRect); 1680e0dac50fSopenharmony_ci 1681e0dac50fSopenharmony_ci WSRect wsRect = { newRect.posX_, newRect.posY_, newRect.width_, newRect.height_ }; 1682e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1683e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 1684e0dac50fSopenharmony_ci auto ret = hostSession->UpdateSessionRect(wsRect, SizeChangeReason::RESIZE); 1685e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1686e0dac50fSopenharmony_ci} 1687e0dac50fSopenharmony_ci 1688e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::ResizeAsync(uint32_t width, uint32_t height) 1689e0dac50fSopenharmony_ci{ 1690e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1691e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 1692e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1693e0dac50fSopenharmony_ci } 1694e0dac50fSopenharmony_ci 1695e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 1696e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Fullscreen window should not resize, winId:%{public}u, mode:%{public}u", 1697e0dac50fSopenharmony_ci GetWindowId(), GetMode()); 1698e0dac50fSopenharmony_ci return WMError::WM_ERROR_OPER_FULLSCREEN_FAILED; 1699e0dac50fSopenharmony_ci } 1700e0dac50fSopenharmony_ci auto ret = Resize(width, height); 1701e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 1702e0dac50fSopenharmony_ci layoutCallback_->ResetLock(); 1703e0dac50fSopenharmony_ci auto startTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1704e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1705e0dac50fSopenharmony_ci layoutCallback_->GetResult(WINDOW_LAYOUT_TIMEOUT); 1706e0dac50fSopenharmony_ci auto endTime = std::chrono::duration_cast<std::chrono::milliseconds>( 1707e0dac50fSopenharmony_ci std::chrono::system_clock::now().time_since_epoch()).count(); 1708e0dac50fSopenharmony_ci auto waitTime = endTime - startTime; 1709e0dac50fSopenharmony_ci if (waitTime >= WINDOW_LAYOUT_TIMEOUT) { 1710e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "Layout timeout, Id:%{public}d", property_->GetPersistentId()); 1711e0dac50fSopenharmony_ci layoutCallback_->GetResult(WINDOW_LAYOUT_TIMEOUT); 1712e0dac50fSopenharmony_ci } 1713e0dac50fSopenharmony_ci } 1714e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1715e0dac50fSopenharmony_ci} 1716e0dac50fSopenharmony_ci 1717e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetAspectRatio(float ratio) 1718e0dac50fSopenharmony_ci{ 1719e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1720e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 1721e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1722e0dac50fSopenharmony_ci } 1723e0dac50fSopenharmony_ci 1724e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1725e0dac50fSopenharmony_ci if (hostSession == nullptr) { 1726e0dac50fSopenharmony_ci WLOGFE("failed, because of nullptr"); 1727e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 1728e0dac50fSopenharmony_ci } 1729e0dac50fSopenharmony_ci if (ratio == MathHelper::INF || ratio == MathHelper::NAG_INF || std::isnan(ratio) || MathHelper::NearZero(ratio)) { 1730e0dac50fSopenharmony_ci WLOGFE("failed, because of wrong value: %{public}f", ratio); 1731e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1732e0dac50fSopenharmony_ci } 1733e0dac50fSopenharmony_ci if (hostSession->SetAspectRatio(ratio) != WSError::WS_OK) { 1734e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1735e0dac50fSopenharmony_ci } 1736e0dac50fSopenharmony_ci return WMError::WM_OK; 1737e0dac50fSopenharmony_ci} 1738e0dac50fSopenharmony_ci 1739e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::ResetAspectRatio() 1740e0dac50fSopenharmony_ci{ 1741e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1742e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1743e0dac50fSopenharmony_ci return static_cast<WMError>(hostSession->SetAspectRatio(0.0f)); 1744e0dac50fSopenharmony_ci} 1745e0dac50fSopenharmony_ci 1746e0dac50fSopenharmony_ci/** @note @window.hierarchy */ 1747e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RaiseToAppTop() 1748e0dac50fSopenharmony_ci{ 1749e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1750e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 1751e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1752e0dac50fSopenharmony_ci } 1753e0dac50fSopenharmony_ci 1754e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 1755e0dac50fSopenharmony_ci auto parentId = GetParentId(); 1756e0dac50fSopenharmony_ci if (parentId == INVALID_SESSION_ID) { 1757e0dac50fSopenharmony_ci WLOGFE("Only the children of the main window can be raised!"); 1758e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1759e0dac50fSopenharmony_ci } 1760e0dac50fSopenharmony_ci 1761e0dac50fSopenharmony_ci if (!WindowHelper::IsSubWindow(GetType())) { 1762e0dac50fSopenharmony_ci WLOGFE("Must be app sub window window!"); 1763e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 1764e0dac50fSopenharmony_ci } 1765e0dac50fSopenharmony_ci 1766e0dac50fSopenharmony_ci if (state_ != WindowState::STATE_SHOWN) { 1767e0dac50fSopenharmony_ci WLOGFE("The sub window must be shown!"); 1768e0dac50fSopenharmony_ci return WMError::WM_DO_NOTHING; 1769e0dac50fSopenharmony_ci } 1770e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1771e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1772e0dac50fSopenharmony_ci WSError ret = hostSession->RaiseToAppTop(); 1773e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1774e0dac50fSopenharmony_ci} 1775e0dac50fSopenharmony_ci 1776e0dac50fSopenharmony_ci/** @note @window.hierarchy */ 1777e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RaiseAboveTarget(int32_t subWindowId) 1778e0dac50fSopenharmony_ci{ 1779e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1780e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 1781e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1782e0dac50fSopenharmony_ci } 1783e0dac50fSopenharmony_ci 1784e0dac50fSopenharmony_ci auto parentId = GetParentId(); 1785e0dac50fSopenharmony_ci auto currentWindowId = GetWindowId(); 1786e0dac50fSopenharmony_ci 1787e0dac50fSopenharmony_ci if (parentId == INVALID_SESSION_ID) { 1788e0dac50fSopenharmony_ci WLOGFE("Only the children of the main window can be raised!"); 1789e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 1790e0dac50fSopenharmony_ci } 1791e0dac50fSopenharmony_ci 1792e0dac50fSopenharmony_ci auto subWindows = Window::GetSubWindow(parentId); 1793e0dac50fSopenharmony_ci auto targetWindow = find_if(subWindows.begin(), subWindows.end(), [subWindowId](sptr<Window>& window) { 1794e0dac50fSopenharmony_ci return static_cast<uint32_t>(subWindowId) == window->GetWindowId(); 1795e0dac50fSopenharmony_ci }); 1796e0dac50fSopenharmony_ci if (targetWindow == subWindows.end()) { 1797e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 1798e0dac50fSopenharmony_ci } 1799e0dac50fSopenharmony_ci 1800e0dac50fSopenharmony_ci if (!WindowHelper::IsSubWindow(GetType())) { 1801e0dac50fSopenharmony_ci WLOGFE("Must be app sub window window!"); 1802e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 1803e0dac50fSopenharmony_ci } 1804e0dac50fSopenharmony_ci 1805e0dac50fSopenharmony_ci if ((state_ != WindowState::STATE_SHOWN) || 1806e0dac50fSopenharmony_ci ((*targetWindow)->GetWindowState() != WindowState::STATE_SHOWN)) { 1807e0dac50fSopenharmony_ci WLOGFE("The sub window must be shown!"); 1808e0dac50fSopenharmony_ci return WMError::WM_DO_NOTHING; 1809e0dac50fSopenharmony_ci } 1810e0dac50fSopenharmony_ci if (currentWindowId == static_cast<uint32_t>(subWindowId)) { 1811e0dac50fSopenharmony_ci return WMError::WM_OK; 1812e0dac50fSopenharmony_ci } 1813e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1814e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1815e0dac50fSopenharmony_ci WSError ret = hostSession->RaiseAboveTarget(subWindowId); 1816e0dac50fSopenharmony_ci return static_cast<WMError>(ret); 1817e0dac50fSopenharmony_ci} 1818e0dac50fSopenharmony_ci 1819e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::GetAvoidAreaByType(AvoidAreaType type, AvoidArea& avoidArea) 1820e0dac50fSopenharmony_ci{ 1821e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1822e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1823e0dac50fSopenharmony_ci } 1824e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1825e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1826e0dac50fSopenharmony_ci avoidArea = hostSession->GetAvoidAreaByType(type); 1827e0dac50fSopenharmony_ci getAvoidAreaCnt_++; 1828e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "Window [%{public}u, %{public}s] type %{public}d times %{public}u area %{public}s", 1829e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), type, getAvoidAreaCnt_.load(), avoidArea.ToString().c_str()); 1830e0dac50fSopenharmony_ci return WMError::WM_OK; 1831e0dac50fSopenharmony_ci} 1832e0dac50fSopenharmony_ci 1833e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifyWindowNeedAvoid(bool status) 1834e0dac50fSopenharmony_ci{ 1835e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "windowId:%{public}u status:%{public}d", 1836e0dac50fSopenharmony_ci GetWindowId(), static_cast<int32_t>(status)); 1837e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1838e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "session is invalid"); 1839e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1840e0dac50fSopenharmony_ci } 1841e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1842e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1843e0dac50fSopenharmony_ci hostSession->OnNeedAvoid(status); 1844e0dac50fSopenharmony_ci return WMError::WM_OK; 1845e0dac50fSopenharmony_ci} 1846e0dac50fSopenharmony_ci 1847e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetLayoutFullScreenByApiVersion(bool status) 1848e0dac50fSopenharmony_ci{ 1849e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1850e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "session is invalid"); 1851e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1852e0dac50fSopenharmony_ci } 1853e0dac50fSopenharmony_ci uint32_t version = 0; 1854e0dac50fSopenharmony_ci if ((context_ != nullptr) && (context_->GetApplicationInfo() != nullptr)) { 1855e0dac50fSopenharmony_ci version = context_->GetApplicationInfo()->apiCompatibleVersion; 1856e0dac50fSopenharmony_ci } 1857e0dac50fSopenharmony_ci isIgnoreSafeArea_ = status; 1858e0dac50fSopenharmony_ci isIgnoreSafeAreaNeedNotify_ = true; 1859e0dac50fSopenharmony_ci // 10 ArkUI new framework support after API10 1860e0dac50fSopenharmony_ci if (version >= 10) { 1861e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "SetIgnoreViewSafeArea winId:%{public}u status:%{public}d", 1862e0dac50fSopenharmony_ci GetWindowId(), static_cast<int32_t>(status)); 1863e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 1864e0dac50fSopenharmony_ci uiContent->SetIgnoreViewSafeArea(status); 1865e0dac50fSopenharmony_ci } 1866e0dac50fSopenharmony_ci } else { 1867e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "SetWindowNeedAvoidFlag winId:%{public}u status:%{public}d", 1868e0dac50fSopenharmony_ci GetWindowId(), static_cast<int32_t>(status)); 1869e0dac50fSopenharmony_ci WMError ret = WMError::WM_OK; 1870e0dac50fSopenharmony_ci if (status) { 1871e0dac50fSopenharmony_ci ret = RemoveWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 1872e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1873e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "RemoveWindowFlag errCode:%{public}d winId:%{public}u", 1874e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 1875e0dac50fSopenharmony_ci return ret; 1876e0dac50fSopenharmony_ci } 1877e0dac50fSopenharmony_ci } else { 1878e0dac50fSopenharmony_ci ret = AddWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 1879e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1880e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "RemoveWindowFlag errCode:%{public}d winId:%{public}u", 1881e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 1882e0dac50fSopenharmony_ci return ret; 1883e0dac50fSopenharmony_ci } 1884e0dac50fSopenharmony_ci } 1885e0dac50fSopenharmony_ci ret = NotifyWindowNeedAvoid(!status); 1886e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1887e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "NotifyWindowNeedAvoid errCode:%{public}d winId:%{public}u", 1888e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 1889e0dac50fSopenharmony_ci return ret; 1890e0dac50fSopenharmony_ci } 1891e0dac50fSopenharmony_ci } 1892e0dac50fSopenharmony_ci return WMError::WM_OK; 1893e0dac50fSopenharmony_ci} 1894e0dac50fSopenharmony_ci 1895e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetLayoutFullScreen(bool status) 1896e0dac50fSopenharmony_ci{ 1897e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "winId:%{public}u %{public}s status:%{public}d", 1898e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), static_cast<int32_t>(status)); 1899e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1900e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1901e0dac50fSopenharmony_ci } 1902e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(GetType())) { 1903e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "system window is not supported"); 1904e0dac50fSopenharmony_ci return WMError::WM_OK; 1905e0dac50fSopenharmony_ci } 1906e0dac50fSopenharmony_ci 1907e0dac50fSopenharmony_ci if ((windowSystemConfig_.IsPcWindow() || IsFreeMultiWindowMode()) && property_->GetCompatibleModeInPc()) { 1908e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "isCompatibleModeInPc, can not LayoutFullScreen"); 1909e0dac50fSopenharmony_ci return WMError::WM_OK; 1910e0dac50fSopenharmony_ci } 1911e0dac50fSopenharmony_ci 1912e0dac50fSopenharmony_ci bool preStatus = property_->IsLayoutFullScreen(); 1913e0dac50fSopenharmony_ci property_->SetIsLayoutFullScreen(status); 1914e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1915e0dac50fSopenharmony_ci if (hostSession != nullptr) { 1916e0dac50fSopenharmony_ci hostSession->OnLayoutFullScreenChange(status); 1917e0dac50fSopenharmony_ci } 1918e0dac50fSopenharmony_ci 1919e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType()) && !windowSystemConfig_.IsPhoneWindow() && 1920e0dac50fSopenharmony_ci !windowSystemConfig_.IsPadWindow()) { 1921e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 1922e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "fullscreen window mode is not supported"); 1923e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1924e0dac50fSopenharmony_ci } 1925e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 1926e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MAXIMIZE); 1927e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 1928e0dac50fSopenharmony_ci } 1929e0dac50fSopenharmony_ci 1930e0dac50fSopenharmony_ci WMError ret = SetLayoutFullScreenByApiVersion(status); 1931e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 1932e0dac50fSopenharmony_ci property_->SetIsLayoutFullScreen(preStatus); 1933e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "SetLayoutFullScreenByApiVersion errCode:%{public}d winId:%{public}u", 1934e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 1935e0dac50fSopenharmony_ci } 1936e0dac50fSopenharmony_ci enableImmersiveMode_ = status; 1937e0dac50fSopenharmony_ci return ret; 1938e0dac50fSopenharmony_ci} 1939e0dac50fSopenharmony_ci 1940e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTitleAndDockHoverShown( 1941e0dac50fSopenharmony_ci bool isTitleHoverShown, bool isDockHoverShown) 1942e0dac50fSopenharmony_ci{ 1943e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1944e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1945e0dac50fSopenharmony_ci } 1946e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "winId:%{public}u %{public}s isTitleHoverShown:%{public}d, " 1947e0dac50fSopenharmony_ci "isDockHoverShown:%{public}d", GetWindowId(), GetWindowName().c_str(), 1948e0dac50fSopenharmony_ci static_cast<int32_t>(isTitleHoverShown), static_cast<int32_t>(isDockHoverShown)); 1949e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(GetType())) { 1950e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "system window is not supported"); 1951e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 1952e0dac50fSopenharmony_ci } 1953e0dac50fSopenharmony_ci 1954e0dac50fSopenharmony_ci auto isPC = windowSystemConfig_.IsPcWindow(); 1955e0dac50fSopenharmony_ci if (!(isPC || IsFreeMultiWindowMode())) { 1956e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "The device is not supported"); 1957e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 1958e0dac50fSopenharmony_ci } 1959e0dac50fSopenharmony_ci WindowType winType = property_->GetWindowType(); 1960e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(winType)) { 1961e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "window is not main window"); 1962e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 1963e0dac50fSopenharmony_ci } 1964e0dac50fSopenharmony_ci titleHoverShowEnabled_ = isTitleHoverShown; 1965e0dac50fSopenharmony_ci dockHoverShowEnabled_ = isDockHoverShown; 1966e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 1967e0dac50fSopenharmony_ci if (hostSession != nullptr) { 1968e0dac50fSopenharmony_ci hostSession->OnTitleAndDockHoverShowChange(titleHoverShowEnabled_, dockHoverShowEnabled_); 1969e0dac50fSopenharmony_ci } 1970e0dac50fSopenharmony_ci return WMError::WM_OK; 1971e0dac50fSopenharmony_ci} 1972e0dac50fSopenharmony_ci 1973e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsLayoutFullScreen() const 1974e0dac50fSopenharmony_ci{ 1975e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1976e0dac50fSopenharmony_ci return false; 1977e0dac50fSopenharmony_ci } 1978e0dac50fSopenharmony_ci WindowType winType = property_->GetWindowType(); 1979e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(winType)) { 1980e0dac50fSopenharmony_ci return (GetMode() == WindowMode::WINDOW_MODE_FULLSCREEN && isIgnoreSafeArea_); 1981e0dac50fSopenharmony_ci } 1982e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(winType)) { 1983e0dac50fSopenharmony_ci return (isIgnoreSafeAreaNeedNotify_ && isIgnoreSafeArea_); 1984e0dac50fSopenharmony_ci } 1985e0dac50fSopenharmony_ci return false; 1986e0dac50fSopenharmony_ci} 1987e0dac50fSopenharmony_ci 1988e0dac50fSopenharmony_ciSystemBarProperty WindowSceneSessionImpl::GetSystemBarPropertyByType(WindowType type) const 1989e0dac50fSopenharmony_ci{ 1990e0dac50fSopenharmony_ci auto curProperties = property_->GetSystemBarProperty(); 1991e0dac50fSopenharmony_ci return curProperties[type]; 1992e0dac50fSopenharmony_ci} 1993e0dac50fSopenharmony_ci 1994e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifyWindowSessionProperty() 1995e0dac50fSopenharmony_ci{ 1996e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "windowId:%{public}u", GetWindowId()); 1997e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 1998e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "session is invalid"); 1999e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2000e0dac50fSopenharmony_ci } 2001e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_OTHER_PROPS); 2002e0dac50fSopenharmony_ci return WMError::WM_OK; 2003e0dac50fSopenharmony_ci} 2004e0dac50fSopenharmony_ci 2005e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifySpecificWindowSessionProperty(WindowType type, const SystemBarProperty& property) 2006e0dac50fSopenharmony_ci{ 2007e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "windowId:%{public}u", GetWindowId()); 2008e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2009e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "session is invalid"); 2010e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2011e0dac50fSopenharmony_ci } 2012e0dac50fSopenharmony_ci if (type == WindowType::WINDOW_TYPE_STATUS_BAR) { 2013e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_STATUS_PROPS); 2014e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 2015e0dac50fSopenharmony_ci uiContent->SetStatusBarItemColor(property.contentColor_); 2016e0dac50fSopenharmony_ci } 2017e0dac50fSopenharmony_ci } else if (type == WindowType::WINDOW_TYPE_NAVIGATION_BAR) { 2018e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_NAVIGATION_PROPS); 2019e0dac50fSopenharmony_ci } else if (type == WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR) { 2020e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_NAVIGATION_INDICATOR_PROPS); 2021e0dac50fSopenharmony_ci } 2022e0dac50fSopenharmony_ci return WMError::WM_OK; 2023e0dac50fSopenharmony_ci} 2024e0dac50fSopenharmony_ci 2025e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetSpecificBarProperty(WindowType type, const SystemBarProperty& property) 2026e0dac50fSopenharmony_ci{ 2027e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2028e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2029e0dac50fSopenharmony_ci } 2030e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 2031e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "only main window support"); 2032e0dac50fSopenharmony_ci return WMError::WM_OK; 2033e0dac50fSopenharmony_ci } 2034e0dac50fSopenharmony_ci if (!((state_ > WindowState::STATE_INITIAL) && (state_ < WindowState::STATE_BOTTOM))) { 2035e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "Id: %{public}u state is invalid", GetWindowId()); 2036e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2037e0dac50fSopenharmony_ci } else if (GetSystemBarPropertyByType(type) == property && 2038e0dac50fSopenharmony_ci property.settingFlag_ == SystemBarSettingFlag::DEFAULT_SETTING) { 2039e0dac50fSopenharmony_ci setSameSystembarPropertyCnt_++; 2040e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "Id:%{public}u %{public}s set same property %{public}u times, " 2041e0dac50fSopenharmony_ci "type:%{public}u, enable:%{public}u bgColor:%{public}x Color:%{public}x enableAnim:%{public}u", 2042e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), setSameSystembarPropertyCnt_, 2043e0dac50fSopenharmony_ci static_cast<uint32_t>(type), property.enable_, property.backgroundColor_, property.contentColor_, 2044e0dac50fSopenharmony_ci property.enableAnimation_); 2045e0dac50fSopenharmony_ci return WMError::WM_OK; 2046e0dac50fSopenharmony_ci } 2047e0dac50fSopenharmony_ci setSameSystembarPropertyCnt_ = 0; 2048e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "Id:%{public}u %{public}s type:%{public}u, " 2049e0dac50fSopenharmony_ci "%{public}u %{public}x %{public}x %{public}u %{public}u", 2050e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), static_cast<uint32_t>(type), property.enable_, 2051e0dac50fSopenharmony_ci property.backgroundColor_, property.contentColor_, property.enableAnimation_, property.settingFlag_); 2052e0dac50fSopenharmony_ci 2053e0dac50fSopenharmony_ci isSystembarPropertiesSet_ = true; 2054e0dac50fSopenharmony_ci property_->SetSystemBarProperty(type, property); 2055e0dac50fSopenharmony_ci WMError ret = NotifySpecificWindowSessionProperty(type, property); 2056e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2057e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "Id:%{public}u, errCode:%{public}d", 2058e0dac50fSopenharmony_ci GetWindowId(), static_cast<int32_t>(ret)); 2059e0dac50fSopenharmony_ci } 2060e0dac50fSopenharmony_ci return ret; 2061e0dac50fSopenharmony_ci} 2062e0dac50fSopenharmony_ci 2063e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetSystemBarProperty(WindowType type, const SystemBarProperty& property) 2064e0dac50fSopenharmony_ci{ 2065e0dac50fSopenharmony_ci return SetSpecificBarProperty(type, property); 2066e0dac50fSopenharmony_ci} 2067e0dac50fSopenharmony_ci 2068e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetSystemBarProperties(const std::map<WindowType, SystemBarProperty>& properties, 2069e0dac50fSopenharmony_ci const std::map<WindowType, SystemBarPropertyFlag>& propertyFlags) 2070e0dac50fSopenharmony_ci{ 2071e0dac50fSopenharmony_ci SystemBarProperty current = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 2072e0dac50fSopenharmony_ci auto flagIter = propertyFlags.find(WindowType::WINDOW_TYPE_STATUS_BAR); 2073e0dac50fSopenharmony_ci auto propertyIter = properties.find(WindowType::WINDOW_TYPE_STATUS_BAR); 2074e0dac50fSopenharmony_ci if ((flagIter != propertyFlags.end() && flagIter->second.contentColorFlag) && 2075e0dac50fSopenharmony_ci (propertyIter != properties.end() && current.contentColor_ != propertyIter->second.contentColor_)) { 2076e0dac50fSopenharmony_ci current.contentColor_ = propertyIter->second.contentColor_; 2077e0dac50fSopenharmony_ci current.settingFlag_ = static_cast<SystemBarSettingFlag>( 2078e0dac50fSopenharmony_ci static_cast<uint32_t>(propertyIter->second.settingFlag_) | 2079e0dac50fSopenharmony_ci static_cast<uint32_t>(SystemBarSettingFlag::COLOR_SETTING)); 2080e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, 2081e0dac50fSopenharmony_ci "windowId:%{public}u %{public}s set status bar content color %{public}u", 2082e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), current.contentColor_); 2083e0dac50fSopenharmony_ci return SetSpecificBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, current); 2084e0dac50fSopenharmony_ci } 2085e0dac50fSopenharmony_ci return WMError::WM_OK; 2086e0dac50fSopenharmony_ci} 2087e0dac50fSopenharmony_ci 2088e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::GetSystemBarProperties(std::map<WindowType, SystemBarProperty>& properties) 2089e0dac50fSopenharmony_ci{ 2090e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "Id:%{public}u", GetWindowId()); 2091e0dac50fSopenharmony_ci auto currProperties = property_->GetSystemBarProperty(); 2092e0dac50fSopenharmony_ci properties[WindowType::WINDOW_TYPE_STATUS_BAR] = currProperties[WindowType::WINDOW_TYPE_STATUS_BAR]; 2093e0dac50fSopenharmony_ci return WMError::WM_OK; 2094e0dac50fSopenharmony_ci} 2095e0dac50fSopenharmony_ci 2096e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetFullScreen(bool status) 2097e0dac50fSopenharmony_ci{ 2098e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, 2099e0dac50fSopenharmony_ci "winId:%{public}u %{public}s status:%{public}d", 2100e0dac50fSopenharmony_ci GetWindowId(), GetWindowName().c_str(), static_cast<int32_t>(status)); 2101e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2102e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2103e0dac50fSopenharmony_ci } 2104e0dac50fSopenharmony_ci if (WindowHelper::IsSystemWindow(GetType())) { 2105e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "system window is not supported"); 2106e0dac50fSopenharmony_ci return WMError::WM_OK; 2107e0dac50fSopenharmony_ci } 2108e0dac50fSopenharmony_ci 2109e0dac50fSopenharmony_ci if (IsFreeMultiWindowMode() || 2110e0dac50fSopenharmony_ci (WindowHelper::IsMainWindow(GetType()) && !windowSystemConfig_.IsPhoneWindow() && 2111e0dac50fSopenharmony_ci !windowSystemConfig_.IsPadWindow())) { 2112e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 2113e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "fullscreen window mode is not supported"); 2114e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2115e0dac50fSopenharmony_ci } 2116e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2117e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 2118e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MAXIMIZE); 2119e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 2120e0dac50fSopenharmony_ci }; 2121e0dac50fSopenharmony_ci 2122e0dac50fSopenharmony_ci WMError ret = SetLayoutFullScreenByApiVersion(status); 2123e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2124e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "SetLayoutFullScreenByApiVersion errCode:%{public}d winId:%{public}u", 2125e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 2126e0dac50fSopenharmony_ci } 2127e0dac50fSopenharmony_ci 2128e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2129e0dac50fSopenharmony_ci SystemBarProperty statusProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 2130e0dac50fSopenharmony_ci statusProperty.enable_ = !status; 2131e0dac50fSopenharmony_ci ret = SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusProperty); 2132e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2133e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "SetSystemBarProperty errCode:%{public}d winId:%{public}u", 2134e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 2135e0dac50fSopenharmony_ci } 2136e0dac50fSopenharmony_ci 2137e0dac50fSopenharmony_ci return ret; 2138e0dac50fSopenharmony_ci} 2139e0dac50fSopenharmony_ci 2140e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsFullScreen() const 2141e0dac50fSopenharmony_ci{ 2142e0dac50fSopenharmony_ci SystemBarProperty statusProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 2143e0dac50fSopenharmony_ci return (IsLayoutFullScreen() && !statusProperty.enable_); 2144e0dac50fSopenharmony_ci} 2145e0dac50fSopenharmony_ci 2146e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsDecorEnable() const 2147e0dac50fSopenharmony_ci{ 2148e0dac50fSopenharmony_ci WindowType windowType = GetType(); 2149e0dac50fSopenharmony_ci bool isMainWindow = WindowHelper::IsMainWindow(windowType); 2150e0dac50fSopenharmony_ci bool isSubWindow = WindowHelper::IsSubWindow(windowType); 2151e0dac50fSopenharmony_ci bool isDialogWindow = WindowHelper::IsDialogWindow(windowType); 2152e0dac50fSopenharmony_ci bool isValidWindow = isMainWindow || 2153e0dac50fSopenharmony_ci ((isSubWindow || isDialogWindow) && property_->IsDecorEnable()); 2154e0dac50fSopenharmony_ci bool isWindowModeSupported = WindowHelper::IsWindowModeSupported( 2155e0dac50fSopenharmony_ci windowSystemConfig_.decorModeSupportInfo_, GetMode()); 2156e0dac50fSopenharmony_ci if (windowSystemConfig_.freeMultiWindowSupport_) { 2157e0dac50fSopenharmony_ci return isValidWindow && windowSystemConfig_.isSystemDecorEnable_; 2158e0dac50fSopenharmony_ci } 2159e0dac50fSopenharmony_ci bool enable = isValidWindow && windowSystemConfig_.isSystemDecorEnable_ && 2160e0dac50fSopenharmony_ci isWindowModeSupported; 2161e0dac50fSopenharmony_ci bool isCompatibleModeInPc = property_->GetCompatibleModeInPc(); 2162e0dac50fSopenharmony_ci if (isCompatibleModeInPc && GetMode() == WindowMode::WINDOW_MODE_FULLSCREEN) { 2163e0dac50fSopenharmony_ci enable = false; 2164e0dac50fSopenharmony_ci } 2165e0dac50fSopenharmony_ci if ((isSubWindow || isDialogWindow) && property_->GetIsPcAppInPad() && property_->IsDecorEnable()) { 2166e0dac50fSopenharmony_ci enable = true; 2167e0dac50fSopenharmony_ci } 2168e0dac50fSopenharmony_ci WLOGFD("get decor enable %{public}d", enable); 2169e0dac50fSopenharmony_ci return enable; 2170e0dac50fSopenharmony_ci} 2171e0dac50fSopenharmony_ci 2172e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Minimize() 2173e0dac50fSopenharmony_ci{ 2174e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2175e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2176e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2177e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2178e0dac50fSopenharmony_ci } 2179e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2180e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2181e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 2182e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MINIMIZE); 2183e0dac50fSopenharmony_ci } else { 2184e0dac50fSopenharmony_ci WLOGFE("This window state is abnormal."); 2185e0dac50fSopenharmony_ci return WMError::WM_DO_NOTHING; 2186e0dac50fSopenharmony_ci } 2187e0dac50fSopenharmony_ci return WMError::WM_OK; 2188e0dac50fSopenharmony_ci} 2189e0dac50fSopenharmony_ci 2190e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Maximize() 2191e0dac50fSopenharmony_ci{ 2192e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2193e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2194e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2195e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2196e0dac50fSopenharmony_ci } 2197e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 2198e0dac50fSopenharmony_ci SetLayoutFullScreen(enableImmersiveMode_); 2199e0dac50fSopenharmony_ci } 2200e0dac50fSopenharmony_ci return WMError::WM_OK; 2201e0dac50fSopenharmony_ci} 2202e0dac50fSopenharmony_ci 2203e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Maximize(MaximizePresentation presentation) 2204e0dac50fSopenharmony_ci{ 2205e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2206e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2207e0dac50fSopenharmony_ci } 2208e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 2209e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "maximize fail, not main window"); 2210e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 2211e0dac50fSopenharmony_ci } 2212e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 2213e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2214e0dac50fSopenharmony_ci } 2215e0dac50fSopenharmony_ci // The device is not supported 2216e0dac50fSopenharmony_ci if (!windowSystemConfig_.IsPcWindow() && !IsFreeMultiWindowMode()) { 2217e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "The device is not supported"); 2218e0dac50fSopenharmony_ci return WMError::WM_OK; 2219e0dac50fSopenharmony_ci } 2220e0dac50fSopenharmony_ci if (property_->GetCompatibleModeInPc()) { 2221e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "isCompatibleModeInPc, can not Maximize"); 2222e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2223e0dac50fSopenharmony_ci } 2224e0dac50fSopenharmony_ci titleHoverShowEnabled_ = true; 2225e0dac50fSopenharmony_ci dockHoverShowEnabled_ = true; 2226e0dac50fSopenharmony_ci switch (presentation) { 2227e0dac50fSopenharmony_ci case MaximizePresentation::ENTER_IMMERSIVE: 2228e0dac50fSopenharmony_ci enableImmersiveMode_ = true; 2229e0dac50fSopenharmony_ci break; 2230e0dac50fSopenharmony_ci case MaximizePresentation::EXIT_IMMERSIVE: 2231e0dac50fSopenharmony_ci enableImmersiveMode_ = false; 2232e0dac50fSopenharmony_ci break; 2233e0dac50fSopenharmony_ci case MaximizePresentation::ENTER_IMMERSIVE_DISABLE_TITLE_AND_DOCK_HOVER: 2234e0dac50fSopenharmony_ci enableImmersiveMode_ = true; 2235e0dac50fSopenharmony_ci titleHoverShowEnabled_ = false; 2236e0dac50fSopenharmony_ci dockHoverShowEnabled_ = false; 2237e0dac50fSopenharmony_ci break; 2238e0dac50fSopenharmony_ci case MaximizePresentation::FOLLOW_APP_IMMERSIVE_SETTING: 2239e0dac50fSopenharmony_ci break; 2240e0dac50fSopenharmony_ci } 2241e0dac50fSopenharmony_ci property_->SetIsLayoutFullScreen(enableImmersiveMode_); 2242e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2243e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 2244e0dac50fSopenharmony_ci hostSession->OnLayoutFullScreenChange(enableImmersiveMode_); 2245e0dac50fSopenharmony_ci hostSession->OnTitleAndDockHoverShowChange(titleHoverShowEnabled_, dockHoverShowEnabled_); 2246e0dac50fSopenharmony_ci SetLayoutFullScreenByApiVersion(enableImmersiveMode_); 2247e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "present: %{public}d, enableImmersiveMode_:%{public}d!", 2248e0dac50fSopenharmony_ci presentation, enableImmersiveMode_); 2249e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MAXIMIZE); 2250e0dac50fSopenharmony_ci return SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 2251e0dac50fSopenharmony_ci} 2252e0dac50fSopenharmony_ci 2253e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::MaximizeFloating() 2254e0dac50fSopenharmony_ci{ 2255e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2256e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2257e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2258e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2259e0dac50fSopenharmony_ci } 2260e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2261e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2262e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(property_->GetWindowType())) { 2263e0dac50fSopenharmony_ci WLOGFW("SetGlobalMaximizeMode fail, not main window"); 2264e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2265e0dac50fSopenharmony_ci } 2266e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), 2267e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_FULLSCREEN)) { 2268e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2269e0dac50fSopenharmony_ci } 2270e0dac50fSopenharmony_ci if (GetGlobalMaximizeMode() != MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 2271e0dac50fSopenharmony_ci if (surfaceNode_ != nullptr && 2272e0dac50fSopenharmony_ci (windowSystemConfig_.IsPcWindow() || GetFreeMultiWindowModeEnabledState())) { 2273e0dac50fSopenharmony_ci surfaceNode_->SetFrameGravity(Gravity::RESIZE); 2274e0dac50fSopenharmony_ci } 2275e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MAXIMIZE); 2276e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN); 2277e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2278e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_FULL_FILL); 2279e0dac50fSopenharmony_ci } else { 2280e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_MAXIMIZE_FLOATING); 2281e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 2282e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_AVOID_SYSTEM_BAR); 2283e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2284e0dac50fSopenharmony_ci NotifyWindowStatusChange(GetMode()); 2285e0dac50fSopenharmony_ci } 2286e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_MAXIMIZE_STATE); 2287e0dac50fSopenharmony_ci 2288e0dac50fSopenharmony_ci return WMError::WM_OK; 2289e0dac50fSopenharmony_ci} 2290e0dac50fSopenharmony_ci 2291e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Recover() 2292e0dac50fSopenharmony_ci{ 2293e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2294e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2295e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2296e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2297e0dac50fSopenharmony_ci } 2298e0dac50fSopenharmony_ci if (!(WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FLOATING) || 2299e0dac50fSopenharmony_ci property_->GetCompatibleModeInPc())) { 2300e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "not support floating, can not Recover"); 2301e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2302e0dac50fSopenharmony_ci } 2303e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2304e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2305e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 2306e0dac50fSopenharmony_ci if (property_->GetMaximizeMode() == MaximizeMode::MODE_RECOVER && 2307e0dac50fSopenharmony_ci property_->GetWindowMode() == WindowMode::WINDOW_MODE_FLOATING) { 2308e0dac50fSopenharmony_ci WLOGFW("Recover fail, already MODE_RECOVER"); 2309e0dac50fSopenharmony_ci return WMError::WM_ERROR_REPEAT_OPERATION; 2310e0dac50fSopenharmony_ci } 2311e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_RECOVER); 2312e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 2313e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_RECOVER); 2314e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2315e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_MAXIMIZE_STATE); 2316e0dac50fSopenharmony_ci NotifyWindowStatusChange(GetMode()); 2317e0dac50fSopenharmony_ci } else { 2318e0dac50fSopenharmony_ci WLOGFE("recovery is invalid on sub window"); 2319e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2320e0dac50fSopenharmony_ci } 2321e0dac50fSopenharmony_ci return WMError::WM_OK; 2322e0dac50fSopenharmony_ci} 2323e0dac50fSopenharmony_ci 2324e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Restore() 2325e0dac50fSopenharmony_ci{ 2326e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LIFE, "id: %{public}d", GetPersistentId()); 2327e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2328e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "session is invalid"); 2329e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2330e0dac50fSopenharmony_ci } 2331e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 2332e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "Restore fail, not main window"); 2333e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 2334e0dac50fSopenharmony_ci } 2335e0dac50fSopenharmony_ci if (!(windowSystemConfig_.IsPcWindow() || property_->GetIsPcAppInPad())) { 2336e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "This is not PC or PcAppInPad,The device is not supported"); 2337e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 2338e0dac50fSopenharmony_ci } 2339e0dac50fSopenharmony_ci if (property_->GetIsAppSupportPhoneInPc()) { 2340e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "This is PhoneAppSupportOnPc,The device is not supported"); 2341e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 2342e0dac50fSopenharmony_ci } 2343e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2344e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_SYSTEM_ABNORMALLY); 2345e0dac50fSopenharmony_ci hostSession->OnRestoreMainWindow(); 2346e0dac50fSopenharmony_ci return WMError::WM_OK; 2347e0dac50fSopenharmony_ci} 2348e0dac50fSopenharmony_ci 2349e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Recover(uint32_t reason) 2350e0dac50fSopenharmony_ci{ 2351e0dac50fSopenharmony_ci WLOGFI("id: %{public}d, reason: %{public}u", GetPersistentId(), reason); 2352e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2353e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2354e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2355e0dac50fSopenharmony_ci } 2356e0dac50fSopenharmony_ci if (!(windowSystemConfig_.IsPcWindow() || IsFreeMultiWindowMode())) { 2357e0dac50fSopenharmony_ci WLOGFE("The device is not supported"); 2358e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 2359e0dac50fSopenharmony_ci } 2360e0dac50fSopenharmony_ci if (!(WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FLOATING) || 2361e0dac50fSopenharmony_ci property_->GetCompatibleModeInPc())) { 2362e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "not support floating, can not Recover"); 2363e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2364e0dac50fSopenharmony_ci } 2365e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2366e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2367e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 2368e0dac50fSopenharmony_ci if (property_->GetMaximizeMode() == MaximizeMode::MODE_RECOVER && 2369e0dac50fSopenharmony_ci property_->GetWindowMode() == WindowMode::WINDOW_MODE_FLOATING) { 2370e0dac50fSopenharmony_ci WLOGFW("Recover fail, already MODE_RECOVER"); 2371e0dac50fSopenharmony_ci return WMError::WM_ERROR_REPEAT_OPERATION; 2372e0dac50fSopenharmony_ci } 2373e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_RECOVER); 2374e0dac50fSopenharmony_ci // need notify arkui maximize mode change 2375e0dac50fSopenharmony_ci if (reason == 1 && property_->GetMaximizeMode() == MaximizeMode::MODE_AVOID_SYSTEM_BAR) { 2376e0dac50fSopenharmony_ci UpdateMaximizeMode(MaximizeMode::MODE_RECOVER); 2377e0dac50fSopenharmony_ci } 2378e0dac50fSopenharmony_ci SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); 2379e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_RECOVER); 2380e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2381e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_MAXIMIZE_STATE); 2382e0dac50fSopenharmony_ci NotifyWindowStatusChange(GetMode()); 2383e0dac50fSopenharmony_ci } else { 2384e0dac50fSopenharmony_ci WLOGFE("recovery is invalid on sub window"); 2385e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2386e0dac50fSopenharmony_ci } 2387e0dac50fSopenharmony_ci return WMError::WM_OK; 2388e0dac50fSopenharmony_ci} 2389e0dac50fSopenharmony_ci 2390e0dac50fSopenharmony_civoid WindowSceneSessionImpl::StartMove() 2391e0dac50fSopenharmony_ci{ 2392e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2393e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2394e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2395e0dac50fSopenharmony_ci return; 2396e0dac50fSopenharmony_ci } 2397e0dac50fSopenharmony_ci WindowType windowType = GetType(); 2398e0dac50fSopenharmony_ci bool isMainWindow = WindowHelper::IsMainWindow(windowType); 2399e0dac50fSopenharmony_ci bool isSubWindow = WindowHelper::IsSubWindow(windowType); 2400e0dac50fSopenharmony_ci bool isDialogWindow = WindowHelper::IsDialogWindow(windowType); 2401e0dac50fSopenharmony_ci bool isDecorDialog = isDialogWindow && property_->IsDecorEnable(); 2402e0dac50fSopenharmony_ci bool isValidWindow = isMainWindow || (IsPcOrPadCapabilityEnabled() && (isSubWindow || isDecorDialog)); 2403e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2404e0dac50fSopenharmony_ci if (isValidWindow && hostSession) { 2405e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_START_MOVE); 2406e0dac50fSopenharmony_ci } 2407e0dac50fSopenharmony_ci} 2408e0dac50fSopenharmony_ci 2409e0dac50fSopenharmony_ciWmErrorCode WindowSceneSessionImpl::StartMoveSystemWindow() 2410e0dac50fSopenharmony_ci{ 2411e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 2412e0dac50fSopenharmony_ci WSError errorCode = hostSession->OnSystemSessionEvent(SessionEvent::EVENT_START_MOVE); 2413e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_SYSTEM, "id: %{public}d , errorCode: %{public}d", 2414e0dac50fSopenharmony_ci GetPersistentId(), static_cast<int>(errorCode)); 2415e0dac50fSopenharmony_ci switch (errorCode) { 2416e0dac50fSopenharmony_ci case WSError::WS_ERROR_REPEAT_OPERATION: { 2417e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_REPEAT_OPERATION; 2418e0dac50fSopenharmony_ci } 2419e0dac50fSopenharmony_ci case WSError::WS_ERROR_NOT_SYSTEM_APP: { 2420e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_NOT_SYSTEM_APP; 2421e0dac50fSopenharmony_ci } 2422e0dac50fSopenharmony_ci case WSError::WS_ERROR_NULLPTR: { 2423e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; 2424e0dac50fSopenharmony_ci } 2425e0dac50fSopenharmony_ci default: { 2426e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 2427e0dac50fSopenharmony_ci } 2428e0dac50fSopenharmony_ci } 2429e0dac50fSopenharmony_ci } else { 2430e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "hostSession is nullptr"); 2431e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY; 2432e0dac50fSopenharmony_ci } 2433e0dac50fSopenharmony_ci} 2434e0dac50fSopenharmony_ci 2435e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetStartMoveFlag() 2436e0dac50fSopenharmony_ci{ 2437e0dac50fSopenharmony_ci bool isMoving = false; 2438e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 2439e0dac50fSopenharmony_ci hostSession->GetStartMoveFlag(isMoving); 2440e0dac50fSopenharmony_ci } 2441e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "id: %{public}d, isMoving: %{public}d", GetPersistentId(), isMoving); 2442e0dac50fSopenharmony_ci return isMoving; 2443e0dac50fSopenharmony_ci} 2444e0dac50fSopenharmony_ci 2445e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::MainWindowCloseInner() 2446e0dac50fSopenharmony_ci{ 2447e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2448e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2449e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 2450e0dac50fSopenharmony_ci if (!abilityContext) { 2451e0dac50fSopenharmony_ci return Destroy(true); 2452e0dac50fSopenharmony_ci } 2453e0dac50fSopenharmony_ci bool terminateCloseProcess = false; 2454e0dac50fSopenharmony_ci WMError res = NotifyMainWindowClose(terminateCloseProcess); 2455e0dac50fSopenharmony_ci if (res == WMError::WM_OK) { 2456e0dac50fSopenharmony_ci if (!terminateCloseProcess) { 2457e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_CLOSE); 2458e0dac50fSopenharmony_ci } 2459e0dac50fSopenharmony_ci return res; 2460e0dac50fSopenharmony_ci } 2461e0dac50fSopenharmony_ci WindowPrepareTerminateHandler* handler = sptr<WindowPrepareTerminateHandler>::MakeSptr(); 2462e0dac50fSopenharmony_ci PrepareTerminateFunc func = [hostSessionWptr = wptr<ISession>(hostSession)] { 2463e0dac50fSopenharmony_ci auto weakSession = hostSessionWptr.promote(); 2464e0dac50fSopenharmony_ci if (weakSession == nullptr) { 2465e0dac50fSopenharmony_ci TLOGNE(WmsLogTag::WMS_LIFE, "this session is nullptr"); 2466e0dac50fSopenharmony_ci return; 2467e0dac50fSopenharmony_ci } 2468e0dac50fSopenharmony_ci weakSession->OnSessionEvent(SessionEvent::EVENT_CLOSE); 2469e0dac50fSopenharmony_ci }; 2470e0dac50fSopenharmony_ci handler->SetPrepareTerminateFun(func); 2471e0dac50fSopenharmony_ci if (AAFwk::AbilityManagerClient::GetInstance()->PrepareTerminateAbility(abilityContext->GetToken(), 2472e0dac50fSopenharmony_ci handler) != ERR_OK) { 2473e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LIFE, "PrepareTerminateAbility failed, do close window"); 2474e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_CLOSE); 2475e0dac50fSopenharmony_ci } 2476e0dac50fSopenharmony_ci return WMError::WM_OK; 2477e0dac50fSopenharmony_ci} 2478e0dac50fSopenharmony_ci 2479e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::Close() 2480e0dac50fSopenharmony_ci{ 2481e0dac50fSopenharmony_ci WLOGFI("id: %{public}d", GetPersistentId()); 2482e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2483e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2484e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2485e0dac50fSopenharmony_ci } 2486e0dac50fSopenharmony_ci WindowType windowType = GetType(); 2487e0dac50fSopenharmony_ci bool isSubWindow = WindowHelper::IsSubWindow(windowType); 2488e0dac50fSopenharmony_ci bool isSystemSubWindow = WindowHelper::IsSystemSubWindow(windowType); 2489e0dac50fSopenharmony_ci bool isDialogWindow = WindowHelper::IsDialogWindow(windowType); 2490e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(windowType)) { 2491e0dac50fSopenharmony_ci return MainWindowCloseInner(); 2492e0dac50fSopenharmony_ci } else if (isSubWindow || isSystemSubWindow || isDialogWindow) { 2493e0dac50fSopenharmony_ci WLOGFI("Close subwindow or dialog"); 2494e0dac50fSopenharmony_ci bool terminateCloseProcess = false; 2495e0dac50fSopenharmony_ci NotifySubWindowClose(terminateCloseProcess); 2496e0dac50fSopenharmony_ci if (!terminateCloseProcess || isDialogWindow) { 2497e0dac50fSopenharmony_ci return Destroy(true); 2498e0dac50fSopenharmony_ci } 2499e0dac50fSopenharmony_ci } 2500e0dac50fSopenharmony_ci return WMError::WM_OK; 2501e0dac50fSopenharmony_ci} 2502e0dac50fSopenharmony_ci 2503e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::DisableAppWindowDecor() 2504e0dac50fSopenharmony_ci{ 2505e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2506e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2507e0dac50fSopenharmony_ci } 2508e0dac50fSopenharmony_ci if (!SessionPermission::IsSystemCalling() && !SessionPermission::IsStartByHdcd()) { 2509e0dac50fSopenharmony_ci WLOGFE("disable app window decor permission denied!"); 2510e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2511e0dac50fSopenharmony_ci } 2512e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 2513e0dac50fSopenharmony_ci WLOGFE("window decoration is invalid on sub window"); 2514e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 2515e0dac50fSopenharmony_ci } 2516e0dac50fSopenharmony_ci WLOGI("disable app window decoration."); 2517e0dac50fSopenharmony_ci windowSystemConfig_.isSystemDecorEnable_ = false; 2518e0dac50fSopenharmony_ci UpdateDecorEnable(true); 2519e0dac50fSopenharmony_ci return WMError::WM_OK; 2520e0dac50fSopenharmony_ci} 2521e0dac50fSopenharmony_ci 2522e0dac50fSopenharmony_civoid WindowSceneSessionImpl::PerformBack() 2523e0dac50fSopenharmony_ci{ 2524e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 2525e0dac50fSopenharmony_ci WLOGFI("PerformBack is not MainWindow, return"); 2526e0dac50fSopenharmony_ci return; 2527e0dac50fSopenharmony_ci } 2528e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 2529e0dac50fSopenharmony_ci bool needMoveToBackground = false; 2530e0dac50fSopenharmony_ci auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(context_); 2531e0dac50fSopenharmony_ci if (abilityContext != nullptr) { 2532e0dac50fSopenharmony_ci abilityContext->OnBackPressedCallBack(needMoveToBackground); 2533e0dac50fSopenharmony_ci } 2534e0dac50fSopenharmony_ci WLOGFI("back to host, needMoveToBackground %{public}d", needMoveToBackground); 2535e0dac50fSopenharmony_ci hostSession->RequestSessionBack(needMoveToBackground); 2536e0dac50fSopenharmony_ci } 2537e0dac50fSopenharmony_ci} 2538e0dac50fSopenharmony_ci 2539e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetGlobalMaximizeMode(MaximizeMode mode) 2540e0dac50fSopenharmony_ci{ 2541e0dac50fSopenharmony_ci WLOGFI("mode %{public}u", static_cast<uint32_t>(mode)); 2542e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2543e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2544e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2545e0dac50fSopenharmony_ci } 2546e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2547e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2548e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 2549e0dac50fSopenharmony_ci hostSession->SetGlobalMaximizeMode(mode); 2550e0dac50fSopenharmony_ci return WMError::WM_OK; 2551e0dac50fSopenharmony_ci } else { 2552e0dac50fSopenharmony_ci WLOGFW("SetGlobalMaximizeMode fail, not main window"); 2553e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2554e0dac50fSopenharmony_ci } 2555e0dac50fSopenharmony_ci} 2556e0dac50fSopenharmony_ci 2557e0dac50fSopenharmony_ciMaximizeMode WindowSceneSessionImpl::GetGlobalMaximizeMode() const 2558e0dac50fSopenharmony_ci{ 2559e0dac50fSopenharmony_ci WLOGFD("in"); 2560e0dac50fSopenharmony_ci MaximizeMode mode = MaximizeMode::MODE_RECOVER; 2561e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 2562e0dac50fSopenharmony_ci hostSession->GetGlobalMaximizeMode(mode); 2563e0dac50fSopenharmony_ci } 2564e0dac50fSopenharmony_ci return mode; 2565e0dac50fSopenharmony_ci} 2566e0dac50fSopenharmony_ci 2567e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetWindowMode(WindowMode mode) 2568e0dac50fSopenharmony_ci{ 2569e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "%{public}u mode %{public}u", GetWindowId(), static_cast<uint32_t>(mode)); 2570e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2571e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 2572e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2573e0dac50fSopenharmony_ci } 2574e0dac50fSopenharmony_ci bool isCompatibleModeInPcSetFloatingWindowMode = 2575e0dac50fSopenharmony_ci property_->GetCompatibleModeInPc() && (mode == WindowMode::WINDOW_MODE_FLOATING); 2576e0dac50fSopenharmony_ci if (!(WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), mode) || 2577e0dac50fSopenharmony_ci isCompatibleModeInPcSetFloatingWindowMode)) { 2578e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window %{public}u do not support mode: %{public}u", 2579e0dac50fSopenharmony_ci GetWindowId(), static_cast<uint32_t>(mode)); 2580e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW_MODE_OR_SIZE; 2581e0dac50fSopenharmony_ci } 2582e0dac50fSopenharmony_ci WMError ret = UpdateWindowModeImmediately(mode); 2583e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2584e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Update window mode fail, ret:%{public}u", ret); 2585e0dac50fSopenharmony_ci return ret; 2586e0dac50fSopenharmony_ci } 2587e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2588e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 2589e0dac50fSopenharmony_ci if (mode == WindowMode::WINDOW_MODE_SPLIT_PRIMARY) { 2590e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_SPLIT_PRIMARY); 2591e0dac50fSopenharmony_ci } else if (mode == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { 2592e0dac50fSopenharmony_ci hostSession->OnSessionEvent(SessionEvent::EVENT_SPLIT_SECONDARY); 2593e0dac50fSopenharmony_ci } 2594e0dac50fSopenharmony_ci return WMError::WM_OK; 2595e0dac50fSopenharmony_ci} 2596e0dac50fSopenharmony_ci 2597e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetGrayScale(float grayScale) 2598e0dac50fSopenharmony_ci{ 2599e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2600e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2601e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2602e0dac50fSopenharmony_ci } 2603e0dac50fSopenharmony_ci constexpr float eps = 1e-6f; 2604e0dac50fSopenharmony_ci if (grayScale < (MIN_GRAY_SCALE - eps) || grayScale > (MAX_GRAY_SCALE + eps)) { 2605e0dac50fSopenharmony_ci WLOGFE("invalid grayScale value: %{public}f", grayScale); 2606e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2607e0dac50fSopenharmony_ci } 2608e0dac50fSopenharmony_ci std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr(); 2609e0dac50fSopenharmony_ci if (uiContent == nullptr) { 2610e0dac50fSopenharmony_ci WLOGFE("uicontent is empty"); 2611e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2612e0dac50fSopenharmony_ci } 2613e0dac50fSopenharmony_ci uiContent->SetContentNodeGrayScale(grayScale); 2614e0dac50fSopenharmony_ci WLOGI("Set window gray scale success, grayScale: %{public}f", grayScale); 2615e0dac50fSopenharmony_ci return WMError::WM_OK; 2616e0dac50fSopenharmony_ci} 2617e0dac50fSopenharmony_ci 2618e0dac50fSopenharmony_ciWindowMode WindowSceneSessionImpl::GetMode() const 2619e0dac50fSopenharmony_ci{ 2620e0dac50fSopenharmony_ci return property_->GetWindowMode(); 2621e0dac50fSopenharmony_ci} 2622e0dac50fSopenharmony_ci 2623e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsTransparent() const 2624e0dac50fSopenharmony_ci{ 2625e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2626e0dac50fSopenharmony_ci return false; 2627e0dac50fSopenharmony_ci } 2628e0dac50fSopenharmony_ci WSColorParam backgroundColor; 2629e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 2630e0dac50fSopenharmony_ci WLOGFD("color: %{public}u, alpha: %{public}u", backgroundColor.value, backgroundColor.argb.alpha); 2631e0dac50fSopenharmony_ci return backgroundColor.argb.alpha == 0x00; // 0x00: completely transparent 2632e0dac50fSopenharmony_ci} 2633e0dac50fSopenharmony_ci 2634e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTransparent(bool isTransparent) 2635e0dac50fSopenharmony_ci{ 2636e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2637e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 2638e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2639e0dac50fSopenharmony_ci } 2640e0dac50fSopenharmony_ci WSColorParam backgroundColor; 2641e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 2642e0dac50fSopenharmony_ci if (isTransparent) { 2643e0dac50fSopenharmony_ci backgroundColor.argb.alpha = 0x00; // 0x00: completely transparent 2644e0dac50fSopenharmony_ci return SetBackgroundColor(backgroundColor.value); 2645e0dac50fSopenharmony_ci } else { 2646e0dac50fSopenharmony_ci backgroundColor.value = GetBackgroundColor(); 2647e0dac50fSopenharmony_ci if (backgroundColor.argb.alpha == 0x00) { 2648e0dac50fSopenharmony_ci backgroundColor.argb.alpha = 0xff; // 0xff: completely opaque 2649e0dac50fSopenharmony_ci return SetBackgroundColor(backgroundColor.value); 2650e0dac50fSopenharmony_ci } 2651e0dac50fSopenharmony_ci } 2652e0dac50fSopenharmony_ci return WMError::WM_OK; 2653e0dac50fSopenharmony_ci} 2654e0dac50fSopenharmony_ci 2655e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::AddWindowFlag(WindowFlag flag) 2656e0dac50fSopenharmony_ci{ 2657e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2658e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2659e0dac50fSopenharmony_ci } 2660e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED && context_ && context_->GetApplicationInfo() && 2661e0dac50fSopenharmony_ci context_->GetApplicationInfo()->apiCompatibleVersion >= 9 && // 9: api version 2662e0dac50fSopenharmony_ci !SessionPermission::IsSystemCalling()) { 2663e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Can not set show when locked, PersistentId: %{public}u", GetPersistentId()); 2664e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PERMISSION; 2665e0dac50fSopenharmony_ci } 2666e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_HANDWRITING && !SessionPermission::IsSystemCalling()) { 2667e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Can not set handwritting, PersistentId: %{public}u", GetPersistentId()); 2668e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2669e0dac50fSopenharmony_ci } 2670e0dac50fSopenharmony_ci if (flag == WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE && !SessionPermission::IsSystemCalling()) { 2671e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Can not set forbid split move, PersistentId: %{public}u", GetPersistentId()); 2672e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2673e0dac50fSopenharmony_ci } 2674e0dac50fSopenharmony_ci uint32_t updateFlags = property_->GetWindowFlags() | (static_cast<uint32_t>(flag)); 2675e0dac50fSopenharmony_ci return SetWindowFlags(updateFlags); 2676e0dac50fSopenharmony_ci} 2677e0dac50fSopenharmony_ci 2678e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RemoveWindowFlag(WindowFlag flag) 2679e0dac50fSopenharmony_ci{ 2680e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2681e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2682e0dac50fSopenharmony_ci } 2683e0dac50fSopenharmony_ci uint32_t updateFlags = property_->GetWindowFlags() & (~(static_cast<uint32_t>(flag))); 2684e0dac50fSopenharmony_ci return SetWindowFlags(updateFlags); 2685e0dac50fSopenharmony_ci} 2686e0dac50fSopenharmony_ci 2687e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetWindowFlags(uint32_t flags) 2688e0dac50fSopenharmony_ci{ 2689e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Session %{public}u flags %{public}u", GetWindowId(), flags); 2690e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 2691e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 2692e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 2693e0dac50fSopenharmony_ci } 2694e0dac50fSopenharmony_ci if (property_->GetWindowFlags() == flags) { 2695e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Session %{public}u set same flags %{public}u", GetWindowId(), flags); 2696e0dac50fSopenharmony_ci return WMError::WM_OK; 2697e0dac50fSopenharmony_ci } 2698e0dac50fSopenharmony_ci auto oriFlags = property_->GetWindowFlags(); 2699e0dac50fSopenharmony_ci property_->SetWindowFlags(flags); 2700e0dac50fSopenharmony_ci WMError ret = UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_FLAGS); 2701e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2702e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "SetWindowFlags errCode:%{public}d winId:%{public}u", 2703e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 2704e0dac50fSopenharmony_ci property_->SetWindowFlags(oriFlags); 2705e0dac50fSopenharmony_ci } 2706e0dac50fSopenharmony_ci return ret; 2707e0dac50fSopenharmony_ci} 2708e0dac50fSopenharmony_ci 2709e0dac50fSopenharmony_ciuint32_t WindowSceneSessionImpl::GetWindowFlags() const 2710e0dac50fSopenharmony_ci{ 2711e0dac50fSopenharmony_ci return property_->GetWindowFlags(); 2712e0dac50fSopenharmony_ci} 2713e0dac50fSopenharmony_ci 2714e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 2715e0dac50fSopenharmony_ci{ 2716e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 2717e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "notify ace winId:%{public}u", GetWindowId()); 2718e0dac50fSopenharmony_ci uiContent->UpdateConfiguration(configuration); 2719e0dac50fSopenharmony_ci } 2720e0dac50fSopenharmony_ci UpdateDefaultStatusBarColor(); 2721e0dac50fSopenharmony_ci if (subWindowSessionMap_.count(GetPersistentId()) == 0) { 2722e0dac50fSopenharmony_ci return; 2723e0dac50fSopenharmony_ci } 2724e0dac50fSopenharmony_ci for (auto& subWindowSession : subWindowSessionMap_.at(GetPersistentId())) { 2725e0dac50fSopenharmony_ci subWindowSession->UpdateConfiguration(configuration); 2726e0dac50fSopenharmony_ci } 2727e0dac50fSopenharmony_ci} 2728e0dac50fSopenharmony_ci 2729e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 2730e0dac50fSopenharmony_ci{ 2731e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "in"); 2732e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2733e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 2734e0dac50fSopenharmony_ci auto window = winPair.second.second; 2735e0dac50fSopenharmony_ci window->UpdateConfiguration(configuration); 2736e0dac50fSopenharmony_ci } 2737e0dac50fSopenharmony_ci} 2738e0dac50fSopenharmony_ci 2739e0dac50fSopenharmony_ci/** @note @window.hierarchy */ 2740e0dac50fSopenharmony_cisptr<Window> WindowSceneSessionImpl::GetTopWindowWithContext(const std::shared_ptr<AbilityRuntime::Context>& context) 2741e0dac50fSopenharmony_ci{ 2742e0dac50fSopenharmony_ci uint32_t mainWinId = INVALID_WINDOW_ID; 2743e0dac50fSopenharmony_ci { 2744e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2745e0dac50fSopenharmony_ci if (windowSessionMap_.empty()) { 2746e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "[GetTopWin] Please create mainWindow First!"); 2747e0dac50fSopenharmony_ci return nullptr; 2748e0dac50fSopenharmony_ci } 2749e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 2750e0dac50fSopenharmony_ci auto win = winPair.second.second; 2751e0dac50fSopenharmony_ci if (win && WindowHelper::IsMainWindow(win->GetType()) && context.get() == win->GetContext().get()) { 2752e0dac50fSopenharmony_ci mainWinId = win->GetWindowId(); 2753e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "[GetTopWin] Find MainWinId:%{public}u.", mainWinId); 2754e0dac50fSopenharmony_ci break; 2755e0dac50fSopenharmony_ci } 2756e0dac50fSopenharmony_ci } 2757e0dac50fSopenharmony_ci } 2758e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "mainId:%{public}u!", mainWinId); 2759e0dac50fSopenharmony_ci if (mainWinId == INVALID_WINDOW_ID) { 2760e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "[GetTopWin] Cannot find topWindow!"); 2761e0dac50fSopenharmony_ci return nullptr; 2762e0dac50fSopenharmony_ci } 2763e0dac50fSopenharmony_ci uint32_t topWinId = INVALID_WINDOW_ID; 2764e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetTopWindowId(mainWinId, topWinId); 2765e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2766e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "[GetTopWin] failed with errCode:%{public}d", static_cast<int32_t>(ret)); 2767e0dac50fSopenharmony_ci return nullptr; 2768e0dac50fSopenharmony_ci } 2769e0dac50fSopenharmony_ci return FindWindowById(topWinId); 2770e0dac50fSopenharmony_ci} 2771e0dac50fSopenharmony_ci 2772e0dac50fSopenharmony_ci/** @note @window.hierarchy */ 2773e0dac50fSopenharmony_cisptr<Window> WindowSceneSessionImpl::GetTopWindowWithId(uint32_t mainWinId) 2774e0dac50fSopenharmony_ci{ 2775e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "mainId:%{public}u", mainWinId); 2776e0dac50fSopenharmony_ci uint32_t topWinId = INVALID_WINDOW_ID; 2777e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetTopWindowId(mainWinId, topWinId); 2778e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2779e0dac50fSopenharmony_ci WLOGFE("[GetTopWin] failed with errCode:%{public}d", static_cast<int32_t>(ret)); 2780e0dac50fSopenharmony_ci return nullptr; 2781e0dac50fSopenharmony_ci } 2782e0dac50fSopenharmony_ci return FindWindowById(topWinId); 2783e0dac50fSopenharmony_ci} 2784e0dac50fSopenharmony_ci 2785e0dac50fSopenharmony_cisptr<Window> WindowSceneSessionImpl::GetMainWindowWithContext(const std::shared_ptr<AbilityRuntime::Context>& context) 2786e0dac50fSopenharmony_ci{ 2787e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2788e0dac50fSopenharmony_ci if (windowSessionMap_.empty()) { 2789e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "Please create mainWindow First!"); 2790e0dac50fSopenharmony_ci return nullptr; 2791e0dac50fSopenharmony_ci } 2792e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 2793e0dac50fSopenharmony_ci auto win = winPair.second.second; 2794e0dac50fSopenharmony_ci if (win && WindowHelper::IsMainWindow(win->GetType()) && context.get() == win->GetContext().get()) { 2795e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_MAIN, "Find MainWinId:%{public}u.", win->GetWindowId()); 2796e0dac50fSopenharmony_ci return win; 2797e0dac50fSopenharmony_ci } 2798e0dac50fSopenharmony_ci } 2799e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_MAIN, "Cannot find Window!"); 2800e0dac50fSopenharmony_ci return nullptr; 2801e0dac50fSopenharmony_ci} 2802e0dac50fSopenharmony_ci 2803e0dac50fSopenharmony_cisptr<WindowSessionImpl> WindowSceneSessionImpl::GetMainWindowWithId(uint32_t mainWinId) 2804e0dac50fSopenharmony_ci{ 2805e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2806e0dac50fSopenharmony_ci if (windowSessionMap_.empty()) { 2807e0dac50fSopenharmony_ci WLOGFE("Please create mainWindow First!"); 2808e0dac50fSopenharmony_ci return nullptr; 2809e0dac50fSopenharmony_ci } 2810e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 2811e0dac50fSopenharmony_ci auto win = winPair.second.second; 2812e0dac50fSopenharmony_ci if (win && WindowHelper::IsMainWindow(win->GetType()) && mainWinId == win->GetWindowId()) { 2813e0dac50fSopenharmony_ci WLOGI("GetTopWindow Find MainWinId:%{public}u.", mainWinId); 2814e0dac50fSopenharmony_ci return win; 2815e0dac50fSopenharmony_ci } 2816e0dac50fSopenharmony_ci } 2817e0dac50fSopenharmony_ci WLOGFE("Cannot find Window!"); 2818e0dac50fSopenharmony_ci return nullptr; 2819e0dac50fSopenharmony_ci} 2820e0dac50fSopenharmony_ci 2821e0dac50fSopenharmony_ci 2822e0dac50fSopenharmony_cisptr<WindowSessionImpl> WindowSceneSessionImpl::GetWindowWithId(uint32_t winId) 2823e0dac50fSopenharmony_ci{ 2824e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2825e0dac50fSopenharmony_ci if (windowSessionMap_.empty()) { 2826e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "Please create mainWindow First!"); 2827e0dac50fSopenharmony_ci return nullptr; 2828e0dac50fSopenharmony_ci } 2829e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 2830e0dac50fSopenharmony_ci auto win = winPair.second.second; 2831e0dac50fSopenharmony_ci if (win && winId == win->GetWindowId()) { 2832e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "find window %{public}s, id %{public}d", win->GetWindowName().c_str(), winId); 2833e0dac50fSopenharmony_ci return win; 2834e0dac50fSopenharmony_ci } 2835e0dac50fSopenharmony_ci } 2836e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "Cannot find Window!"); 2837e0dac50fSopenharmony_ci return nullptr; 2838e0dac50fSopenharmony_ci} 2839e0dac50fSopenharmony_ci 2840e0dac50fSopenharmony_cistatic WMError GetParentMainWindowIdInner(WindowSessionImplMap& sessionMap, int32_t windowId, int32_t& mainWindowId) 2841e0dac50fSopenharmony_ci{ 2842e0dac50fSopenharmony_ci for (const auto& [_, pair] : sessionMap) { 2843e0dac50fSopenharmony_ci const auto& window = pair.second; 2844e0dac50fSopenharmony_ci if (window == nullptr) { 2845e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2846e0dac50fSopenharmony_ci } 2847e0dac50fSopenharmony_ci if (window->GetPersistentId() != windowId) { 2848e0dac50fSopenharmony_ci continue; 2849e0dac50fSopenharmony_ci } 2850e0dac50fSopenharmony_ci 2851e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(window->GetType())) { 2852e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SUB, "find main window, id:%{public}u", window->GetPersistentId()); 2853e0dac50fSopenharmony_ci mainWindowId = window->GetPersistentId(); 2854e0dac50fSopenharmony_ci return WMError::WM_OK; 2855e0dac50fSopenharmony_ci } 2856e0dac50fSopenharmony_ci if (WindowHelper::IsSubWindow(window->GetType()) || WindowHelper::IsDialogWindow(window->GetType())) { 2857e0dac50fSopenharmony_ci return GetParentMainWindowIdInner(sessionMap, window->GetParentId(), mainWindowId); 2858e0dac50fSopenharmony_ci } 2859e0dac50fSopenharmony_ci // not main window, sub window, dialog, set invalid id 2860e0dac50fSopenharmony_ci mainWindowId = INVALID_SESSION_ID; 2861e0dac50fSopenharmony_ci return WMError::WM_OK; 2862e0dac50fSopenharmony_ci } 2863e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARENT; 2864e0dac50fSopenharmony_ci} 2865e0dac50fSopenharmony_ci 2866e0dac50fSopenharmony_ciint32_t WindowSceneSessionImpl::GetParentMainWindowId(int32_t windowId) 2867e0dac50fSopenharmony_ci{ 2868e0dac50fSopenharmony_ci if (windowId == INVALID_SESSION_ID) { 2869e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_SUB, "invalid windowId id"); 2870e0dac50fSopenharmony_ci return INVALID_SESSION_ID; 2871e0dac50fSopenharmony_ci } 2872e0dac50fSopenharmony_ci int32_t mainWindowId = INVALID_SESSION_ID; 2873e0dac50fSopenharmony_ci { 2874e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 2875e0dac50fSopenharmony_ci WMError findRet = GetParentMainWindowIdInner(windowSessionMap_, windowId, mainWindowId); 2876e0dac50fSopenharmony_ci if (findRet == WMError::WM_OK) { 2877e0dac50fSopenharmony_ci return mainWindowId; 2878e0dac50fSopenharmony_ci } 2879e0dac50fSopenharmony_ci } 2880e0dac50fSopenharmony_ci // can't find in client, need to find in server find 2881e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().GetParentMainWindowId(windowId, mainWindowId); 2882e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2883e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SUB, "cant't find main window id, err:%{public}d", static_cast<uint32_t>(ret)); 2884e0dac50fSopenharmony_ci return INVALID_SESSION_ID; 2885e0dac50fSopenharmony_ci } 2886e0dac50fSopenharmony_ci return mainWindowId; 2887e0dac50fSopenharmony_ci} 2888e0dac50fSopenharmony_ci 2889e0dac50fSopenharmony_civoid WindowSceneSessionImpl::SetNeedDefaultAnimation(bool needDefaultAnimation) 2890e0dac50fSopenharmony_ci{ 2891e0dac50fSopenharmony_ci enableDefaultAnimation_= needDefaultAnimation; 2892e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 2893e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_IF_NULL(hostSession); 2894e0dac50fSopenharmony_ci hostSession->UpdateWindowAnimationFlag(needDefaultAnimation); 2895e0dac50fSopenharmony_ci} 2896e0dac50fSopenharmony_ci 2897e0dac50fSopenharmony_cistatic float ConvertRadiusToSigma(float radius) 2898e0dac50fSopenharmony_ci{ 2899e0dac50fSopenharmony_ci return radius > 0.0f ? 0.57735f * radius + SK_ScalarHalf : 0.0f; // 0.57735f is blur sigma scale 2900e0dac50fSopenharmony_ci} 2901e0dac50fSopenharmony_ci 2902e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::CheckParmAndPermission() 2903e0dac50fSopenharmony_ci{ 2904e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 2905e0dac50fSopenharmony_ci WLOGFE("RSSurface node is null"); 2906e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2907e0dac50fSopenharmony_ci } 2908e0dac50fSopenharmony_ci 2909e0dac50fSopenharmony_ci if (!SessionPermission::IsSystemCalling() && !SessionPermission::IsStartByHdcd()) { 2910e0dac50fSopenharmony_ci WLOGFE("Check failed, permission denied"); 2911e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 2912e0dac50fSopenharmony_ci } 2913e0dac50fSopenharmony_ci 2914e0dac50fSopenharmony_ci return WMError::WM_OK; 2915e0dac50fSopenharmony_ci} 2916e0dac50fSopenharmony_ci 2917e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetCornerRadius(float cornerRadius) 2918e0dac50fSopenharmony_ci{ 2919e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 2920e0dac50fSopenharmony_ci WLOGFE("RSSurface node is null"); 2921e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 2922e0dac50fSopenharmony_ci } 2923e0dac50fSopenharmony_ci 2924e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s corner radius %{public}f", GetWindowName().c_str(), cornerRadius); 2925e0dac50fSopenharmony_ci surfaceNode_->SetCornerRadius(cornerRadius); 2926e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2927e0dac50fSopenharmony_ci return WMError::WM_OK; 2928e0dac50fSopenharmony_ci} 2929e0dac50fSopenharmony_ci 2930e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetShadowRadius(float radius) 2931e0dac50fSopenharmony_ci{ 2932e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 2933e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2934e0dac50fSopenharmony_ci return ret; 2935e0dac50fSopenharmony_ci } 2936e0dac50fSopenharmony_ci 2937e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s shadow radius %{public}f", GetWindowName().c_str(), radius); 2938e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 2939e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2940e0dac50fSopenharmony_ci } 2941e0dac50fSopenharmony_ci 2942e0dac50fSopenharmony_ci surfaceNode_->SetShadowRadius(radius); 2943e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2944e0dac50fSopenharmony_ci return WMError::WM_OK; 2945e0dac50fSopenharmony_ci} 2946e0dac50fSopenharmony_ci 2947e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetShadowColor(std::string color) 2948e0dac50fSopenharmony_ci{ 2949e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 2950e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2951e0dac50fSopenharmony_ci return ret; 2952e0dac50fSopenharmony_ci } 2953e0dac50fSopenharmony_ci 2954e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s shadow color %{public}s", GetWindowName().c_str(), color.c_str()); 2955e0dac50fSopenharmony_ci uint32_t colorValue = 0; 2956e0dac50fSopenharmony_ci if (!ColorParser::Parse(color, colorValue)) { 2957e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 2958e0dac50fSopenharmony_ci } 2959e0dac50fSopenharmony_ci 2960e0dac50fSopenharmony_ci surfaceNode_->SetShadowColor(colorValue); 2961e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2962e0dac50fSopenharmony_ci return WMError::WM_OK; 2963e0dac50fSopenharmony_ci} 2964e0dac50fSopenharmony_ci 2965e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetShadowOffsetX(float offsetX) 2966e0dac50fSopenharmony_ci{ 2967e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 2968e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2969e0dac50fSopenharmony_ci return ret; 2970e0dac50fSopenharmony_ci } 2971e0dac50fSopenharmony_ci 2972e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s shadow offsetX %{public}f", GetWindowName().c_str(), offsetX); 2973e0dac50fSopenharmony_ci surfaceNode_->SetShadowOffsetX(offsetX); 2974e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2975e0dac50fSopenharmony_ci return WMError::WM_OK; 2976e0dac50fSopenharmony_ci} 2977e0dac50fSopenharmony_ci 2978e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetShadowOffsetY(float offsetY) 2979e0dac50fSopenharmony_ci{ 2980e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 2981e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2982e0dac50fSopenharmony_ci return ret; 2983e0dac50fSopenharmony_ci } 2984e0dac50fSopenharmony_ci 2985e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s shadow offsetY %{public}f", GetWindowName().c_str(), offsetY); 2986e0dac50fSopenharmony_ci surfaceNode_->SetShadowOffsetY(offsetY); 2987e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 2988e0dac50fSopenharmony_ci return WMError::WM_OK; 2989e0dac50fSopenharmony_ci} 2990e0dac50fSopenharmony_ci 2991e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetBlur(float radius) 2992e0dac50fSopenharmony_ci{ 2993e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 2994e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 2995e0dac50fSopenharmony_ci return ret; 2996e0dac50fSopenharmony_ci } 2997e0dac50fSopenharmony_ci 2998e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s blur radius %{public}f", GetWindowName().c_str(), radius); 2999e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 3000e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 3001e0dac50fSopenharmony_ci } 3002e0dac50fSopenharmony_ci 3003e0dac50fSopenharmony_ci radius = ConvertRadiusToSigma(radius); 3004e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s blur radius after conversion %{public}f", GetWindowName().c_str(), radius); 3005e0dac50fSopenharmony_ci surfaceNode_->SetFilter(RSFilter::CreateBlurFilter(radius, radius)); 3006e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3007e0dac50fSopenharmony_ci return WMError::WM_OK; 3008e0dac50fSopenharmony_ci} 3009e0dac50fSopenharmony_ci 3010e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetBackdropBlur(float radius) 3011e0dac50fSopenharmony_ci{ 3012e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 3013e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3014e0dac50fSopenharmony_ci return ret; 3015e0dac50fSopenharmony_ci } 3016e0dac50fSopenharmony_ci 3017e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s backdrop blur radius %{public}f", GetWindowName().c_str(), radius); 3018e0dac50fSopenharmony_ci if (MathHelper::LessNotEqual(radius, 0.0)) { 3019e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 3020e0dac50fSopenharmony_ci } 3021e0dac50fSopenharmony_ci 3022e0dac50fSopenharmony_ci radius = ConvertRadiusToSigma(radius); 3023e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s backdrop blur radius after conversion %{public}f", GetWindowName().c_str(), radius); 3024e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(RSFilter::CreateBlurFilter(radius, radius)); 3025e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3026e0dac50fSopenharmony_ci return WMError::WM_OK; 3027e0dac50fSopenharmony_ci} 3028e0dac50fSopenharmony_ci 3029e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetBackdropBlurStyle(WindowBlurStyle blurStyle) 3030e0dac50fSopenharmony_ci{ 3031e0dac50fSopenharmony_ci WMError ret = CheckParmAndPermission(); 3032e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3033e0dac50fSopenharmony_ci return ret; 3034e0dac50fSopenharmony_ci } 3035e0dac50fSopenharmony_ci 3036e0dac50fSopenharmony_ci WLOGFI("Set window %{public}s backdrop blur style %{public}u", GetWindowName().c_str(), blurStyle); 3037e0dac50fSopenharmony_ci if (blurStyle < WindowBlurStyle::WINDOW_BLUR_OFF || blurStyle > WindowBlurStyle::WINDOW_BLUR_THICK) { 3038e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 3039e0dac50fSopenharmony_ci } 3040e0dac50fSopenharmony_ci 3041e0dac50fSopenharmony_ci if (blurStyle == WindowBlurStyle::WINDOW_BLUR_OFF) { 3042e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(nullptr); 3043e0dac50fSopenharmony_ci } else { 3044e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 3045e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 3046e0dac50fSopenharmony_ci if (display == nullptr) { 3047e0dac50fSopenharmony_ci WLOGFE("get display failed displayId:%{public}" PRIu64, property_->GetDisplayId()); 3048e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 3049e0dac50fSopenharmony_ci } 3050e0dac50fSopenharmony_ci auto displayInfo = display->GetDisplayInfo(); 3051e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 3052e0dac50fSopenharmony_ci WLOGFE("get displayInfo failed displayId:%{public}" PRIu64, property_->GetDisplayId()); 3053e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 3054e0dac50fSopenharmony_ci } 3055e0dac50fSopenharmony_ci surfaceNode_->SetBackgroundFilter(RSFilter::CreateMaterialFilter( 3056e0dac50fSopenharmony_ci static_cast<int>(blurStyle), GetVirtualPixelRatio(displayInfo))); 3057e0dac50fSopenharmony_ci } 3058e0dac50fSopenharmony_ci 3059e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3060e0dac50fSopenharmony_ci return WMError::WM_OK; 3061e0dac50fSopenharmony_ci} 3062e0dac50fSopenharmony_ci 3063e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetPrivacyMode(bool isPrivacyMode) 3064e0dac50fSopenharmony_ci{ 3065e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3066e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3067e0dac50fSopenharmony_ci } 3068e0dac50fSopenharmony_ci WLOGFD("id : %{public}u, %{public}u", GetWindowId(), isPrivacyMode); 3069e0dac50fSopenharmony_ci property_->SetPrivacyMode(isPrivacyMode); 3070e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_PRIVACY_MODE); 3071e0dac50fSopenharmony_ci} 3072e0dac50fSopenharmony_ci 3073e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsPrivacyMode() const 3074e0dac50fSopenharmony_ci{ 3075e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3076e0dac50fSopenharmony_ci return false; 3077e0dac50fSopenharmony_ci } 3078e0dac50fSopenharmony_ci return property_->GetPrivacyMode(); 3079e0dac50fSopenharmony_ci} 3080e0dac50fSopenharmony_ci 3081e0dac50fSopenharmony_civoid WindowSceneSessionImpl::SetSystemPrivacyMode(bool isSystemPrivacyMode) 3082e0dac50fSopenharmony_ci{ 3083e0dac50fSopenharmony_ci WLOGFD("id : %{public}u, %{public}u", GetWindowId(), isSystemPrivacyMode); 3084e0dac50fSopenharmony_ci property_->SetSystemPrivacyMode(isSystemPrivacyMode); 3085e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_SYSTEM_PRIVACY_MODE); 3086e0dac50fSopenharmony_ci} 3087e0dac50fSopenharmony_ci 3088e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetSnapshotSkip(bool isSkip) 3089e0dac50fSopenharmony_ci{ 3090e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3091e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3092e0dac50fSopenharmony_ci } 3093e0dac50fSopenharmony_ci if (!SessionPermission::IsSystemCalling() && !SessionPermission::IsStartByHdcd()) { 3094e0dac50fSopenharmony_ci WLOGFE("permission denied!"); 3095e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 3096e0dac50fSopenharmony_ci } 3097e0dac50fSopenharmony_ci property_->SetSnapshotSkip(isSkip); 3098e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_SNAPSHOT_SKIP); 3099e0dac50fSopenharmony_ci} 3100e0dac50fSopenharmony_ci 3101e0dac50fSopenharmony_cistd::shared_ptr<Media::PixelMap> WindowSceneSessionImpl::Snapshot() 3102e0dac50fSopenharmony_ci{ 3103e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3104e0dac50fSopenharmony_ci return nullptr; 3105e0dac50fSopenharmony_ci } 3106e0dac50fSopenharmony_ci std::shared_ptr<SurfaceCaptureFuture> callback = std::make_shared<SurfaceCaptureFuture>(); 3107e0dac50fSopenharmony_ci auto isSucceeded = RSInterfaces::GetInstance().TakeSurfaceCapture(surfaceNode_, callback); 3108e0dac50fSopenharmony_ci if (!isSucceeded) { 3109e0dac50fSopenharmony_ci WLOGFE("Failed to TakeSurfaceCapture!"); 3110e0dac50fSopenharmony_ci return nullptr; 3111e0dac50fSopenharmony_ci } 3112e0dac50fSopenharmony_ci std::shared_ptr<Media::PixelMap> pixelMap = callback->GetResult(2000); // wait for <= 2000ms 3113e0dac50fSopenharmony_ci if (pixelMap != nullptr) { 3114e0dac50fSopenharmony_ci WLOGFD("Snapshot succeed, save WxH = %{public}dx%{public}d", pixelMap->GetWidth(), pixelMap->GetHeight()); 3115e0dac50fSopenharmony_ci } else { 3116e0dac50fSopenharmony_ci WLOGFE("Failed to get pixelmap, return nullptr!"); 3117e0dac50fSopenharmony_ci } 3118e0dac50fSopenharmony_ci return pixelMap; 3119e0dac50fSopenharmony_ci} 3120e0dac50fSopenharmony_ci 3121e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifyMemoryLevel(int32_t level) 3122e0dac50fSopenharmony_ci{ 3123e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "id: %{public}u, level: %{public}d", GetWindowId(), level); 3124e0dac50fSopenharmony_ci std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr(); 3125e0dac50fSopenharmony_ci if (uiContent == nullptr) { 3126e0dac50fSopenharmony_ci WLOGFE("Window %{public}s notify failed, uiContent is null.", GetWindowName().c_str()); 3127e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 3128e0dac50fSopenharmony_ci } 3129e0dac50fSopenharmony_ci // notify memory level 3130e0dac50fSopenharmony_ci uiContent->NotifyMemoryLevel(level); 3131e0dac50fSopenharmony_ci WLOGFD("End!"); 3132e0dac50fSopenharmony_ci return WMError::WM_OK; 3133e0dac50fSopenharmony_ci} 3134e0dac50fSopenharmony_ci 3135e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTurnScreenOn(bool turnScreenOn) 3136e0dac50fSopenharmony_ci{ 3137e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3138e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3139e0dac50fSopenharmony_ci } 3140e0dac50fSopenharmony_ci property_->SetTurnScreenOn(turnScreenOn); 3141e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_TURN_SCREEN_ON); 3142e0dac50fSopenharmony_ci} 3143e0dac50fSopenharmony_ci 3144e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsTurnScreenOn() const 3145e0dac50fSopenharmony_ci{ 3146e0dac50fSopenharmony_ci return property_->IsTurnScreenOn(); 3147e0dac50fSopenharmony_ci} 3148e0dac50fSopenharmony_ci 3149e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetKeepScreenOn(bool keepScreenOn) 3150e0dac50fSopenharmony_ci{ 3151e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3152e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 3153e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3154e0dac50fSopenharmony_ci } 3155e0dac50fSopenharmony_ci property_->SetKeepScreenOn(keepScreenOn); 3156e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_KEEP_SCREEN_ON); 3157e0dac50fSopenharmony_ci} 3158e0dac50fSopenharmony_ci 3159e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsKeepScreenOn() const 3160e0dac50fSopenharmony_ci{ 3161e0dac50fSopenharmony_ci return property_->IsKeepScreenOn(); 3162e0dac50fSopenharmony_ci} 3163e0dac50fSopenharmony_ci 3164e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTransform(const Transform& trans) 3165e0dac50fSopenharmony_ci{ 3166e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "Id: %{public}d", property_->GetPersistentId()); 3167e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3168e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "Session is invalid"); 3169e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3170e0dac50fSopenharmony_ci } 3171e0dac50fSopenharmony_ci Transform oriTrans = property_->GetTransform(); 3172e0dac50fSopenharmony_ci property_->SetTransform(trans); 3173e0dac50fSopenharmony_ci TransformSurfaceNode(trans); 3174e0dac50fSopenharmony_ci return WMError::WM_OK; 3175e0dac50fSopenharmony_ci} 3176e0dac50fSopenharmony_ci 3177e0dac50fSopenharmony_ciconst Transform& WindowSceneSessionImpl::GetTransform() const 3178e0dac50fSopenharmony_ci{ 3179e0dac50fSopenharmony_ci return property_->GetTransform(); 3180e0dac50fSopenharmony_ci} 3181e0dac50fSopenharmony_ci 3182e0dac50fSopenharmony_civoid WindowSceneSessionImpl::TransformSurfaceNode(const Transform& trans) 3183e0dac50fSopenharmony_ci{ 3184e0dac50fSopenharmony_ci if (surfaceNode_ == nullptr) { 3185e0dac50fSopenharmony_ci return; 3186e0dac50fSopenharmony_ci } 3187e0dac50fSopenharmony_ci surfaceNode_->SetPivotX(trans.pivotX_); 3188e0dac50fSopenharmony_ci surfaceNode_->SetPivotY(trans.pivotY_); 3189e0dac50fSopenharmony_ci surfaceNode_->SetScaleX(trans.scaleX_); 3190e0dac50fSopenharmony_ci surfaceNode_->SetScaleY(trans.scaleY_); 3191e0dac50fSopenharmony_ci surfaceNode_->SetTranslateX(trans.translateX_); 3192e0dac50fSopenharmony_ci surfaceNode_->SetTranslateY(trans.translateY_); 3193e0dac50fSopenharmony_ci surfaceNode_->SetTranslateZ(trans.translateZ_); 3194e0dac50fSopenharmony_ci surfaceNode_->SetRotationX(trans.rotationX_); 3195e0dac50fSopenharmony_ci surfaceNode_->SetRotationY(trans.rotationY_); 3196e0dac50fSopenharmony_ci surfaceNode_->SetRotation(trans.rotationZ_); 3197e0dac50fSopenharmony_ci uint32_t animationFlag = property_->GetAnimationFlag(); 3198e0dac50fSopenharmony_ci if (animationFlag != static_cast<uint32_t>(WindowAnimation::CUSTOM)) { 3199e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3200e0dac50fSopenharmony_ci } 3201e0dac50fSopenharmony_ci} 3202e0dac50fSopenharmony_ci 3203e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RegisterAnimationTransitionController( 3204e0dac50fSopenharmony_ci const sptr<IAnimationTransitionController>& listener) 3205e0dac50fSopenharmony_ci{ 3206e0dac50fSopenharmony_ci if (!SessionPermission::IsSystemCalling() && !SessionPermission::IsStartByHdcd()) { 3207e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "permission denied!"); 3208e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 3209e0dac50fSopenharmony_ci } 3210e0dac50fSopenharmony_ci if (listener == nullptr) { 3211e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "listener is nullptr"); 3212e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 3213e0dac50fSopenharmony_ci } 3214e0dac50fSopenharmony_ci animationTransitionController_ = listener; 3215e0dac50fSopenharmony_ci wptr<WindowSessionProperty> propertyWeak(property_); 3216e0dac50fSopenharmony_ci wptr<IAnimationTransitionController> animationTransitionControllerWeak(animationTransitionController_); 3217e0dac50fSopenharmony_ci 3218e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 3219e0dac50fSopenharmony_ci uiContent->SetNextFrameLayoutCallback([propertyWeak, animationTransitionControllerWeak]() { 3220e0dac50fSopenharmony_ci auto property = propertyWeak.promote(); 3221e0dac50fSopenharmony_ci auto animationTransitionController = animationTransitionControllerWeak.promote(); 3222e0dac50fSopenharmony_ci if (!property || !animationTransitionController) { 3223e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "property or animation transition controller is nullptr"); 3224e0dac50fSopenharmony_ci return; 3225e0dac50fSopenharmony_ci } 3226e0dac50fSopenharmony_ci uint32_t animationFlag = property->GetAnimationFlag(); 3227e0dac50fSopenharmony_ci if (animationFlag == static_cast<uint32_t>(WindowAnimation::CUSTOM)) { 3228e0dac50fSopenharmony_ci // CustomAnimation is enabled when animationTransitionController_ exists 3229e0dac50fSopenharmony_ci animationTransitionController->AnimationForShown(); 3230e0dac50fSopenharmony_ci } 3231e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "AnimationForShown excute sucess %{public}d!", property->GetPersistentId()); 3232e0dac50fSopenharmony_ci }); 3233e0dac50fSopenharmony_ci } 3234e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "%{public}d!", property_->GetPersistentId()); 3235e0dac50fSopenharmony_ci return WMError::WM_OK; 3236e0dac50fSopenharmony_ci} 3237e0dac50fSopenharmony_ci 3238e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::UpdateSurfaceNodeAfterCustomAnimation(bool isAdd) 3239e0dac50fSopenharmony_ci{ 3240e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_SYSTEM, "id:%{public}d, isAdd:%{public}u", property_->GetPersistentId(), isAdd); 3241e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3242e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3243e0dac50fSopenharmony_ci } 3244e0dac50fSopenharmony_ci if (!WindowHelper::IsSystemWindow(property_->GetWindowType())) { 3245e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "only system window can set"); 3246e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 3247e0dac50fSopenharmony_ci } 3248e0dac50fSopenharmony_ci // set no custom after customAnimation 3249e0dac50fSopenharmony_ci WMError ret = UpdateAnimationFlagProperty(false); 3250e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3251e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_SYSTEM, "UpdateAnimationFlagProperty failed!"); 3252e0dac50fSopenharmony_ci return ret; 3253e0dac50fSopenharmony_ci } 3254e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 3255e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 3256e0dac50fSopenharmony_ci ret = static_cast<WMError>(hostSession->UpdateWindowSceneAfterCustomAnimation(isAdd)); 3257e0dac50fSopenharmony_ci return ret; 3258e0dac50fSopenharmony_ci} 3259e0dac50fSopenharmony_ci 3260e0dac50fSopenharmony_civoid WindowSceneSessionImpl::AdjustWindowAnimationFlag(bool withAnimation) 3261e0dac50fSopenharmony_ci{ 3262e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3263e0dac50fSopenharmony_ci WLOGFW("session invalid!"); 3264e0dac50fSopenharmony_ci return; 3265e0dac50fSopenharmony_ci } 3266e0dac50fSopenharmony_ci // when show/hide with animation 3267e0dac50fSopenharmony_ci // use custom animation when transitionController exists; else use default animation 3268e0dac50fSopenharmony_ci WindowType winType = property_->GetWindowType(); 3269e0dac50fSopenharmony_ci bool isAppWindow = WindowHelper::IsAppWindow(winType); 3270e0dac50fSopenharmony_ci if (withAnimation && !isAppWindow && animationTransitionController_) { 3271e0dac50fSopenharmony_ci // use custom animation 3272e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::CUSTOM)); 3273e0dac50fSopenharmony_ci } else if ((isAppWindow && enableDefaultAnimation_) || (withAnimation && !animationTransitionController_)) { 3274e0dac50fSopenharmony_ci // use default animation 3275e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::DEFAULT)); 3276e0dac50fSopenharmony_ci } else { 3277e0dac50fSopenharmony_ci // with no animation 3278e0dac50fSopenharmony_ci property_->SetAnimationFlag(static_cast<uint32_t>(WindowAnimation::NONE)); 3279e0dac50fSopenharmony_ci } 3280e0dac50fSopenharmony_ci} 3281e0dac50fSopenharmony_ci 3282e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::UpdateAnimationFlagProperty(bool withAnimation) 3283e0dac50fSopenharmony_ci{ 3284e0dac50fSopenharmony_ci if (!WindowHelper::IsSystemWindow(GetType())) { 3285e0dac50fSopenharmony_ci return WMError::WM_OK; 3286e0dac50fSopenharmony_ci } 3287e0dac50fSopenharmony_ci AdjustWindowAnimationFlag(withAnimation); 3288e0dac50fSopenharmony_ci // when show(true) with default, hide() with None, to adjust animationFlag to disabled default animation 3289e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_ANIMATION_FLAG); 3290e0dac50fSopenharmony_ci} 3291e0dac50fSopenharmony_ci 3292e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateFocusableOnShow(bool withFocus) 3293e0dac50fSopenharmony_ci{ 3294e0dac50fSopenharmony_ci if (withFocus) { 3295e0dac50fSopenharmony_ci return; // default value of focusableOnShow 3296e0dac50fSopenharmony_ci } 3297e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 3298e0dac50fSopenharmony_ci auto ret = hostSession->SetFocusableOnShow(withFocus); 3299e0dac50fSopenharmony_ci if (ret != WSError::WS_OK) { 3300e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_FOCUS, "SetFocusableOnShow failed, ret: %{public}d, name: %{public}s, id: %{public}d", 3301e0dac50fSopenharmony_ci static_cast<int32_t>(ret), property_->GetWindowName().c_str(), GetPersistentId()); 3302e0dac50fSopenharmony_ci } 3303e0dac50fSopenharmony_ci } else { 3304e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_FOCUS, "failed because of nullptr"); 3305e0dac50fSopenharmony_ci } 3306e0dac50fSopenharmony_ci} 3307e0dac50fSopenharmony_ci 3308e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetAlpha(float alpha) 3309e0dac50fSopenharmony_ci{ 3310e0dac50fSopenharmony_ci WLOGFI("%{public}d alpha %{public}f", property_->GetPersistentId(), alpha); 3311e0dac50fSopenharmony_ci if (!SessionPermission::IsSystemCalling() && !SessionPermission::IsStartByHdcd()) { 3312e0dac50fSopenharmony_ci WLOGFE("permission denied!"); 3313e0dac50fSopenharmony_ci return WMError::WM_ERROR_NOT_SYSTEM_APP; 3314e0dac50fSopenharmony_ci } 3315e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3316e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3317e0dac50fSopenharmony_ci } 3318e0dac50fSopenharmony_ci surfaceNode_->SetAlpha(alpha); 3319e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3320e0dac50fSopenharmony_ci return WMError::WM_OK; 3321e0dac50fSopenharmony_ci} 3322e0dac50fSopenharmony_ci 3323e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::BindDialogTarget(sptr<IRemoteObject> targetToken) 3324e0dac50fSopenharmony_ci{ 3325e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3326e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "session is invalid"); 3327e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3328e0dac50fSopenharmony_ci } 3329e0dac50fSopenharmony_ci auto persistentId = property_->GetPersistentId(); 3330e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_DIALOG, "id: %{public}d", persistentId); 3331e0dac50fSopenharmony_ci WMError ret = SingletonContainer::Get<WindowAdapter>().BindDialogSessionTarget(persistentId, targetToken); 3332e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3333e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "bind window failed with errCode:%{public}d", static_cast<int32_t>(ret)); 3334e0dac50fSopenharmony_ci } 3335e0dac50fSopenharmony_ci return ret; 3336e0dac50fSopenharmony_ci} 3337e0dac50fSopenharmony_ci 3338e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetDialogBackGestureEnabled(bool isEnabled) 3339e0dac50fSopenharmony_ci{ 3340e0dac50fSopenharmony_ci WindowType windowType = GetType(); 3341e0dac50fSopenharmony_ci if (windowType != WindowType::WINDOW_TYPE_DIALOG) { 3342e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "windowType not support. WinId:%{public}u, WindowType:%{public}u", 3343e0dac50fSopenharmony_ci GetWindowId(), static_cast<uint32_t>(windowType)); 3344e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 3345e0dac50fSopenharmony_ci } 3346e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 3347e0dac50fSopenharmony_ci if (hostSession == nullptr) { 3348e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "set window failed because of nullptr"); 3349e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 3350e0dac50fSopenharmony_ci } 3351e0dac50fSopenharmony_ci WMError ret = static_cast<WMError>(hostSession->SetDialogSessionBackGestureEnabled(isEnabled)); 3352e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3353e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "set window failed with errCode:%{public}d", static_cast<int32_t>(ret)); 3354e0dac50fSopenharmony_ci } 3355e0dac50fSopenharmony_ci return ret; 3356e0dac50fSopenharmony_ci} 3357e0dac50fSopenharmony_ci 3358e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTouchHotAreas(const std::vector<Rect>& rects) 3359e0dac50fSopenharmony_ci{ 3360e0dac50fSopenharmony_ci std::vector<Rect> lastTouchHotAreas; 3361e0dac50fSopenharmony_ci property_->GetTouchHotAreas(lastTouchHotAreas); 3362e0dac50fSopenharmony_ci property_->SetTouchHotAreas(rects); 3363e0dac50fSopenharmony_ci WMError result = UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_TOUCH_HOT_AREA); 3364e0dac50fSopenharmony_ci if (result != WMError::WM_OK) { 3365e0dac50fSopenharmony_ci property_->SetTouchHotAreas(lastTouchHotAreas); 3366e0dac50fSopenharmony_ci WLOGFE("errCode:%{public}d", static_cast<int32_t>(result)); 3367e0dac50fSopenharmony_ci return result; 3368e0dac50fSopenharmony_ci } 3369e0dac50fSopenharmony_ci for (uint32_t i = 0; i < rects.size(); i++) { 3370e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_EVENT, "id:%{public}u xywh:[%{public}d %{public}d %{public}u %{public}u]", 3371e0dac50fSopenharmony_ci i, rects[i].posX_, rects[i].posY_, rects[i].width_, rects[i].height_); 3372e0dac50fSopenharmony_ci } 3373e0dac50fSopenharmony_ci return result; 3374e0dac50fSopenharmony_ci} 3375e0dac50fSopenharmony_ci 3376e0dac50fSopenharmony_ciWmErrorCode WindowSceneSessionImpl::KeepKeyboardOnFocus(bool keepKeyboardFlag) 3377e0dac50fSopenharmony_ci{ 3378e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3379e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_KEYBOARD, "session is invalid"); 3380e0dac50fSopenharmony_ci return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; 3381e0dac50fSopenharmony_ci } 3382e0dac50fSopenharmony_ci property_->KeepKeyboardOnFocus(keepKeyboardFlag); 3383e0dac50fSopenharmony_ci return WmErrorCode::WM_OK; 3384e0dac50fSopenharmony_ci} 3385e0dac50fSopenharmony_ci 3386e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetCallingWindow(uint32_t callingSessionId) 3387e0dac50fSopenharmony_ci{ 3388e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3389e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_KEYBOARD, "session is invalid!"); 3390e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3391e0dac50fSopenharmony_ci } 3392e0dac50fSopenharmony_ci if (callingSessionId != property_->GetCallingSessionId()) { 3393e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "from %{public}d to: %{public}d", 3394e0dac50fSopenharmony_ci property_->GetCallingSessionId(), callingSessionId); 3395e0dac50fSopenharmony_ci } 3396e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 3397e0dac50fSopenharmony_ci hostSession->SetCallingSessionId(callingSessionId); 3398e0dac50fSopenharmony_ci } 3399e0dac50fSopenharmony_ci property_->SetCallingSessionId(callingSessionId); 3400e0dac50fSopenharmony_ci return WMError::WM_OK; 3401e0dac50fSopenharmony_ci} 3402e0dac50fSopenharmony_ci 3403e0dac50fSopenharmony_civoid WindowSceneSessionImpl::DumpSessionElementInfo(const std::vector<std::string>& params) 3404e0dac50fSopenharmony_ci{ 3405e0dac50fSopenharmony_ci WLOGFD("in"); 3406e0dac50fSopenharmony_ci std::vector<std::string> info; 3407e0dac50fSopenharmony_ci if (params.size() == 1 && params[0] == PARAM_DUMP_HELP) { // 1: params num 3408e0dac50fSopenharmony_ci WLOGFD("Dump ArkUI help Info"); 3409e0dac50fSopenharmony_ci Ace::UIContent::ShowDumpHelp(info); 3410e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyDumpInfoResult(info); 3411e0dac50fSopenharmony_ci return; 3412e0dac50fSopenharmony_ci } 3413e0dac50fSopenharmony_ci 3414e0dac50fSopenharmony_ci WLOGFD("ArkUI:DumpInfo"); 3415e0dac50fSopenharmony_ci if (auto uiContent = GetUIContentSharedPtr()) { 3416e0dac50fSopenharmony_ci uiContent->DumpInfo(params, info); 3417e0dac50fSopenharmony_ci } 3418e0dac50fSopenharmony_ci 3419e0dac50fSopenharmony_ci for (auto iter = info.begin(); iter != info.end();) { 3420e0dac50fSopenharmony_ci if ((*iter).size() == 0) { 3421e0dac50fSopenharmony_ci iter = info.erase(iter); 3422e0dac50fSopenharmony_ci continue; 3423e0dac50fSopenharmony_ci } 3424e0dac50fSopenharmony_ci WLOGFD("ElementInfo size: %{public}u", static_cast<uint32_t>((*iter).size())); 3425e0dac50fSopenharmony_ci iter++; 3426e0dac50fSopenharmony_ci } 3427e0dac50fSopenharmony_ci if (info.size() == 0) { 3428e0dac50fSopenharmony_ci WLOGFD("ElementInfo is empty"); 3429e0dac50fSopenharmony_ci return; 3430e0dac50fSopenharmony_ci } 3431e0dac50fSopenharmony_ci SingletonContainer::Get<WindowAdapter>().NotifyDumpInfoResult(info); 3432e0dac50fSopenharmony_ci} 3433e0dac50fSopenharmony_ci 3434e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::UpdateWindowMode(WindowMode mode) 3435e0dac50fSopenharmony_ci{ 3436e0dac50fSopenharmony_ci WLOGFI("%{public}u mode %{public}u", GetWindowId(), static_cast<uint32_t>(mode)); 3437e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3438e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3439e0dac50fSopenharmony_ci } 3440e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), mode)) { 3441e0dac50fSopenharmony_ci WLOGFE("%{public}u do not support mode: %{public}u", 3442e0dac50fSopenharmony_ci GetWindowId(), static_cast<uint32_t>(mode)); 3443e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW_MODE_OR_SIZE; 3444e0dac50fSopenharmony_ci } 3445e0dac50fSopenharmony_ci WMError ret = UpdateWindowModeImmediately(mode); 3446e0dac50fSopenharmony_ci 3447e0dac50fSopenharmony_ci if (windowSystemConfig_.IsPcWindow()) { 3448e0dac50fSopenharmony_ci if (mode == WindowMode::WINDOW_MODE_SPLIT_PRIMARY) { 3449e0dac50fSopenharmony_ci surfaceNode_->SetFrameGravity(Gravity::LEFT); 3450e0dac50fSopenharmony_ci } else if (mode == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { 3451e0dac50fSopenharmony_ci surfaceNode_->SetFrameGravity(Gravity::RIGHT); 3452e0dac50fSopenharmony_ci } else if (mode == WindowMode::WINDOW_MODE_FLOATING) { 3453e0dac50fSopenharmony_ci surfaceNode_->SetFrameGravity(Gravity::TOP_LEFT); 3454e0dac50fSopenharmony_ci } else if (mode == WindowMode::WINDOW_MODE_FULLSCREEN) { 3455e0dac50fSopenharmony_ci ret = SetLayoutFullScreenByApiVersion(true); 3456e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3457e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "SetLayoutFullScreenByApiVersion errCode:%{public}d winId:%{public}u", 3458e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 3459e0dac50fSopenharmony_ci } 3460e0dac50fSopenharmony_ci SystemBarProperty statusProperty = GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR); 3461e0dac50fSopenharmony_ci statusProperty.enable_ = false; 3462e0dac50fSopenharmony_ci ret = SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, statusProperty); 3463e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3464e0dac50fSopenharmony_ci WLOGFE("SetSystemBarProperty errCode:%{public}d winId:%{public}u", 3465e0dac50fSopenharmony_ci static_cast<int32_t>(ret), GetWindowId()); 3466e0dac50fSopenharmony_ci } 3467e0dac50fSopenharmony_ci } 3468e0dac50fSopenharmony_ci } 3469e0dac50fSopenharmony_ci return static_cast<WSError>(ret); 3470e0dac50fSopenharmony_ci} 3471e0dac50fSopenharmony_ci 3472e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::UpdateWindowModeImmediately(WindowMode mode) 3473e0dac50fSopenharmony_ci{ 3474e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { 3475e0dac50fSopenharmony_ci property_->SetWindowMode(mode); 3476e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 3477e0dac50fSopenharmony_ci UpdateDecorEnable(true); 3478e0dac50fSopenharmony_ci } else if (state_ == WindowState::STATE_SHOWN) { 3479e0dac50fSopenharmony_ci WMError ret = UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_MODE); 3480e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3481e0dac50fSopenharmony_ci WLOGFE("update filed! id: %{public}u, mode: %{public}u.", GetWindowId(), 3482e0dac50fSopenharmony_ci static_cast<uint32_t>(mode)); 3483e0dac50fSopenharmony_ci return ret; 3484e0dac50fSopenharmony_ci } 3485e0dac50fSopenharmony_ci // set client window mode if success. 3486e0dac50fSopenharmony_ci property_->SetWindowMode(mode); 3487e0dac50fSopenharmony_ci UpdateTitleButtonVisibility(); 3488e0dac50fSopenharmony_ci UpdateDecorEnable(true, mode); 3489e0dac50fSopenharmony_ci if (mode == WindowMode::WINDOW_MODE_SPLIT_PRIMARY || mode == WindowMode::WINDOW_MODE_SPLIT_SECONDARY) { 3490e0dac50fSopenharmony_ci property_->SetMaximizeMode(MaximizeMode::MODE_RECOVER); 3491e0dac50fSopenharmony_ci } 3492e0dac50fSopenharmony_ci } 3493e0dac50fSopenharmony_ci NotifyWindowStatusChange(mode); 3494e0dac50fSopenharmony_ci return WMError::WM_OK; 3495e0dac50fSopenharmony_ci} 3496e0dac50fSopenharmony_ci 3497e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::UpdateMaximizeMode(MaximizeMode mode) 3498e0dac50fSopenharmony_ci{ 3499e0dac50fSopenharmony_ci WLOGFI("%{public}u mode %{public}u", GetWindowId(), static_cast<uint32_t>(mode)); 3500e0dac50fSopenharmony_ci std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr(); 3501e0dac50fSopenharmony_ci if (uiContent == nullptr) { 3502e0dac50fSopenharmony_ci WLOGFE("uiContent is null"); 3503e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_PARAM; 3504e0dac50fSopenharmony_ci } 3505e0dac50fSopenharmony_ci uiContent->UpdateMaximizeMode(mode); 3506e0dac50fSopenharmony_ci property_->SetMaximizeMode(mode); 3507e0dac50fSopenharmony_ci return WSError::WS_OK; 3508e0dac50fSopenharmony_ci} 3509e0dac50fSopenharmony_ci 3510e0dac50fSopenharmony_civoid WindowSceneSessionImpl::NotifySessionFullScreen(bool fullScreen) 3511e0dac50fSopenharmony_ci{ 3512e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "winId: %{public}u", GetWindowId()); 3513e0dac50fSopenharmony_ci Maximize(fullScreen ? MaximizePresentation::ENTER_IMMERSIVE : MaximizePresentation::EXIT_IMMERSIVE); 3514e0dac50fSopenharmony_ci} 3515e0dac50fSopenharmony_ci 3516e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::UpdateTitleInTargetPos(bool isShow, int32_t height) 3517e0dac50fSopenharmony_ci{ 3518e0dac50fSopenharmony_ci WLOGFI("%{public}u isShow %{public}u, height %{public}u", GetWindowId(), isShow, height); 3519e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3520e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3521e0dac50fSopenharmony_ci } 3522e0dac50fSopenharmony_ci std::shared_ptr<Ace::UIContent> uiContent = GetUIContentSharedPtr(); 3523e0dac50fSopenharmony_ci if (uiContent == nullptr) { 3524e0dac50fSopenharmony_ci WLOGFE("uiContent is null"); 3525e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_PARAM; 3526e0dac50fSopenharmony_ci } 3527e0dac50fSopenharmony_ci uiContent->UpdateTitleInTargetPos(isShow, height); 3528e0dac50fSopenharmony_ci return WSError::WS_OK; 3529e0dac50fSopenharmony_ci} 3530e0dac50fSopenharmony_ci 3531e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::SwitchFreeMultiWindow(bool enable) 3532e0dac50fSopenharmony_ci{ 3533e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3534e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3535e0dac50fSopenharmony_ci } 3536e0dac50fSopenharmony_ci if (windowSystemConfig_.freeMultiWindowEnable_ == enable) { 3537e0dac50fSopenharmony_ci return WSError::WS_ERROR_REPEAT_OPERATION; 3538e0dac50fSopenharmony_ci } 3539e0dac50fSopenharmony_ci NotifySwitchFreeMultiWindow(enable); 3540e0dac50fSopenharmony_ci //Switch process finish, update system config 3541e0dac50fSopenharmony_ci windowSystemConfig_.freeMultiWindowEnable_ = enable; 3542e0dac50fSopenharmony_ci return WSError::WS_OK; 3543e0dac50fSopenharmony_ci} 3544e0dac50fSopenharmony_ci 3545e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetFreeMultiWindowModeEnabledState() 3546e0dac50fSopenharmony_ci{ 3547e0dac50fSopenharmony_ci return windowSystemConfig_.freeMultiWindowEnable_ && 3548e0dac50fSopenharmony_ci windowSystemConfig_.freeMultiWindowSupport_; 3549e0dac50fSopenharmony_ci} 3550e0dac50fSopenharmony_ci 3551e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::CompatibleFullScreenRecover() 3552e0dac50fSopenharmony_ci{ 3553e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3554e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window invalid!"); 3555e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3556e0dac50fSopenharmony_ci } 3557e0dac50fSopenharmony_ci if (!property_->GetCompatibleModeInPc()) { 3558e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "is not CompatibleModeInPc, can not Recover"); 3559e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3560e0dac50fSopenharmony_ci } 3561e0dac50fSopenharmony_ci Recover(); 3562e0dac50fSopenharmony_ci return WSError::WS_OK; 3563e0dac50fSopenharmony_ci} 3564e0dac50fSopenharmony_ci 3565e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::CompatibleFullScreenMinimize() 3566e0dac50fSopenharmony_ci{ 3567e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3568e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window session invalid!"); 3569e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3570e0dac50fSopenharmony_ci } 3571e0dac50fSopenharmony_ci if (!property_->GetCompatibleModeInPc()) { 3572e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "is not CompatibleModeInPc, can not Minimize"); 3573e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3574e0dac50fSopenharmony_ci } 3575e0dac50fSopenharmony_ci Minimize(); 3576e0dac50fSopenharmony_ci return WSError::WS_OK; 3577e0dac50fSopenharmony_ci} 3578e0dac50fSopenharmony_ci 3579e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::CompatibleFullScreenClose() 3580e0dac50fSopenharmony_ci{ 3581e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3582e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window session invalid!"); 3583e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3584e0dac50fSopenharmony_ci } 3585e0dac50fSopenharmony_ci if (!property_->GetCompatibleModeInPc()) { 3586e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "is not CompatibleModeInPc, can not Close"); 3587e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3588e0dac50fSopenharmony_ci } 3589e0dac50fSopenharmony_ci Close(); 3590e0dac50fSopenharmony_ci return WSError::WS_OK; 3591e0dac50fSopenharmony_ci} 3592e0dac50fSopenharmony_ci 3593e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::NotifyCompatibleModeEnableInPad(bool enable) 3594e0dac50fSopenharmony_ci{ 3595e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "id: %{public}d, enable: %{public}d", GetPersistentId(), enable); 3596e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3597e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "window session invalid!"); 3598e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3599e0dac50fSopenharmony_ci } 3600e0dac50fSopenharmony_ci property_->SetCompatibleModeEnableInPad(enable); 3601e0dac50fSopenharmony_ci return WSError::WS_OK; 3602e0dac50fSopenharmony_ci} 3603e0dac50fSopenharmony_ci 3604e0dac50fSopenharmony_civoid WindowSceneSessionImpl::NotifySessionForeground(uint32_t reason, bool withAnimation) 3605e0dac50fSopenharmony_ci{ 3606e0dac50fSopenharmony_ci WLOGFI("in"); 3607e0dac50fSopenharmony_ci Show(reason, withAnimation); 3608e0dac50fSopenharmony_ci} 3609e0dac50fSopenharmony_ci 3610e0dac50fSopenharmony_civoid WindowSceneSessionImpl::NotifySessionBackground(uint32_t reason, bool withAnimation, bool isFromInnerkits) 3611e0dac50fSopenharmony_ci{ 3612e0dac50fSopenharmony_ci WLOGFI("in"); 3613e0dac50fSopenharmony_ci Hide(reason, withAnimation, isFromInnerkits); 3614e0dac50fSopenharmony_ci} 3615e0dac50fSopenharmony_ci 3616e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::NotifyPrepareClosePiPWindow() 3617e0dac50fSopenharmony_ci{ 3618e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_PIP, "type: %{public}u", GetType()); 3619e0dac50fSopenharmony_ci if (!WindowHelper::IsPipWindow(GetType())) { 3620e0dac50fSopenharmony_ci return WMError::WM_DO_NOTHING; 3621e0dac50fSopenharmony_ci } 3622e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 3623e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_INVALID_WINDOW); 3624e0dac50fSopenharmony_ci hostSession->NotifyPiPWindowPrepareClose(); 3625e0dac50fSopenharmony_ci return WMError::WM_OK; 3626e0dac50fSopenharmony_ci} 3627e0dac50fSopenharmony_ci 3628e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::GetWindowLimits(WindowLimits& windowLimits) 3629e0dac50fSopenharmony_ci{ 3630e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3631e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 3632e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3633e0dac50fSopenharmony_ci } 3634e0dac50fSopenharmony_ci const auto& customizedLimits = property_->GetWindowLimits(); 3635e0dac50fSopenharmony_ci windowLimits.minWidth_ = customizedLimits.minWidth_; 3636e0dac50fSopenharmony_ci windowLimits.minHeight_ = customizedLimits.minHeight_; 3637e0dac50fSopenharmony_ci windowLimits.maxWidth_ = customizedLimits.maxWidth_; 3638e0dac50fSopenharmony_ci windowLimits.maxHeight_ = customizedLimits.maxHeight_; 3639e0dac50fSopenharmony_ci windowLimits.vpRatio_ = customizedLimits.vpRatio_; 3640e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id:%{public}u, minWidth:%{public}u, minHeight:%{public}u, " 3641e0dac50fSopenharmony_ci "maxWidth:%{public}u, maxHeight:%{public}u, vpRatio:%{public}f", GetWindowId(), windowLimits.minWidth_, 3642e0dac50fSopenharmony_ci windowLimits.minHeight_, windowLimits.maxWidth_, windowLimits.maxHeight_, windowLimits.vpRatio_); 3643e0dac50fSopenharmony_ci return WMError::WM_OK; 3644e0dac50fSopenharmony_ci} 3645e0dac50fSopenharmony_ci 3646e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateNewSize() 3647e0dac50fSopenharmony_ci{ 3648e0dac50fSopenharmony_ci if (GetMode() != WindowMode::WINDOW_MODE_FLOATING) { 3649e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Fullscreen couldnot update new size, Id: %{public}u", GetWindowId()); 3650e0dac50fSopenharmony_ci return; 3651e0dac50fSopenharmony_ci } 3652e0dac50fSopenharmony_ci bool needResize = false; 3653e0dac50fSopenharmony_ci Rect windowRect = GetRequestRect(); 3654e0dac50fSopenharmony_ci if (windowRect.IsUninitializedRect()) { 3655e0dac50fSopenharmony_ci windowRect = GetRect(); 3656e0dac50fSopenharmony_ci if (windowRect.IsUninitializedRect()) { 3657e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_LAYOUT, "The requestRect and rect are uninitialized. winId: %{public}u", 3658e0dac50fSopenharmony_ci GetWindowId()); 3659e0dac50fSopenharmony_ci return; 3660e0dac50fSopenharmony_ci } 3661e0dac50fSopenharmony_ci } 3662e0dac50fSopenharmony_ci 3663e0dac50fSopenharmony_ci uint32_t width = windowRect.width_; 3664e0dac50fSopenharmony_ci uint32_t height = windowRect.height_; 3665e0dac50fSopenharmony_ci const auto& newLimits = property_->GetWindowLimits(); 3666e0dac50fSopenharmony_ci if (width < newLimits.minWidth_) { 3667e0dac50fSopenharmony_ci width = newLimits.minWidth_; 3668e0dac50fSopenharmony_ci needResize = true; 3669e0dac50fSopenharmony_ci } 3670e0dac50fSopenharmony_ci if (height < newLimits.minHeight_) { 3671e0dac50fSopenharmony_ci height = newLimits.minHeight_; 3672e0dac50fSopenharmony_ci needResize = true; 3673e0dac50fSopenharmony_ci } 3674e0dac50fSopenharmony_ci if (width > newLimits.maxWidth_) { 3675e0dac50fSopenharmony_ci width = newLimits.maxWidth_; 3676e0dac50fSopenharmony_ci needResize = true; 3677e0dac50fSopenharmony_ci } 3678e0dac50fSopenharmony_ci if (height > newLimits.maxHeight_) { 3679e0dac50fSopenharmony_ci height = newLimits.maxHeight_; 3680e0dac50fSopenharmony_ci needResize = true; 3681e0dac50fSopenharmony_ci } 3682e0dac50fSopenharmony_ci if (needResize) { 3683e0dac50fSopenharmony_ci Resize(width, height); 3684e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Resize window by limits. Id: %{public}u, width: %{public}u," 3685e0dac50fSopenharmony_ci " height: %{public}u", GetWindowId(), width, height); 3686e0dac50fSopenharmony_ci } 3687e0dac50fSopenharmony_ci} 3688e0dac50fSopenharmony_ci 3689e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetWindowLimits(WindowLimits& windowLimits) 3690e0dac50fSopenharmony_ci{ 3691e0dac50fSopenharmony_ci WLOGFI("Id:%{public}u, minWidth:%{public}u, minHeight:%{public}u, " 3692e0dac50fSopenharmony_ci "maxWidth:%{public}u, maxHeight:%{public}u", GetWindowId(), windowLimits.minWidth_, 3693e0dac50fSopenharmony_ci windowLimits.minHeight_, windowLimits.maxWidth_, windowLimits.maxHeight_); 3694e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3695e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 3696e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3697e0dac50fSopenharmony_ci } 3698e0dac50fSopenharmony_ci 3699e0dac50fSopenharmony_ci WindowType windowType = GetType(); 3700e0dac50fSopenharmony_ci bool isDragEnabledSystemWin = WindowHelper::IsSystemWindow(windowType) && property_->GetDragEnabled(); 3701e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(windowType) && 3702e0dac50fSopenharmony_ci !WindowHelper::IsSubWindow(windowType) && 3703e0dac50fSopenharmony_ci windowType != WindowType::WINDOW_TYPE_DIALOG && 3704e0dac50fSopenharmony_ci !isDragEnabledSystemWin) { 3705e0dac50fSopenharmony_ci WLOGFE("type not support. Id:%{public}u, type:%{public}u", 3706e0dac50fSopenharmony_ci GetWindowId(), static_cast<uint32_t>(windowType)); 3707e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 3708e0dac50fSopenharmony_ci } 3709e0dac50fSopenharmony_ci 3710e0dac50fSopenharmony_ci const auto& customizedLimits = property_->GetWindowLimits(); 3711e0dac50fSopenharmony_ci uint32_t minWidth = windowLimits.minWidth_ ? windowLimits.minWidth_ : customizedLimits.minWidth_; 3712e0dac50fSopenharmony_ci uint32_t minHeight = windowLimits.minHeight_ ? windowLimits.minHeight_ : customizedLimits.minHeight_; 3713e0dac50fSopenharmony_ci uint32_t maxWidth = windowLimits.maxWidth_ ? windowLimits.maxWidth_ : customizedLimits.maxWidth_; 3714e0dac50fSopenharmony_ci uint32_t maxHeight = windowLimits.maxHeight_ ? windowLimits.maxHeight_ : customizedLimits.maxHeight_; 3715e0dac50fSopenharmony_ci 3716e0dac50fSopenharmony_ci property_->SetUserWindowLimits({ 3717e0dac50fSopenharmony_ci maxWidth, maxHeight, minWidth, minHeight, customizedLimits.maxRatio_, customizedLimits.minRatio_ 3718e0dac50fSopenharmony_ci }); 3719e0dac50fSopenharmony_ci userLimitsSet_ = true; 3720e0dac50fSopenharmony_ci UpdateWindowSizeLimits(); 3721e0dac50fSopenharmony_ci WMError ret = UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_WINDOW_LIMITS); 3722e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3723e0dac50fSopenharmony_ci WLOGFE("update window proeprty failed! id: %{public}u.", GetWindowId()); 3724e0dac50fSopenharmony_ci return ret; 3725e0dac50fSopenharmony_ci } 3726e0dac50fSopenharmony_ci UpdateNewSize(); 3727e0dac50fSopenharmony_ci 3728e0dac50fSopenharmony_ci fillWindowLimits(windowLimits); 3729e0dac50fSopenharmony_ci return WMError::WM_OK; 3730e0dac50fSopenharmony_ci} 3731e0dac50fSopenharmony_ci 3732e0dac50fSopenharmony_civoid WindowSceneSessionImpl::fillWindowLimits(WindowLimits& windowLimits) 3733e0dac50fSopenharmony_ci{ 3734e0dac50fSopenharmony_ci const auto& newLimits = property_->GetWindowLimits(); 3735e0dac50fSopenharmony_ci windowLimits.minWidth_ = newLimits.minWidth_; 3736e0dac50fSopenharmony_ci windowLimits.minHeight_ = newLimits.minHeight_; 3737e0dac50fSopenharmony_ci windowLimits.maxWidth_ = newLimits.maxWidth_; 3738e0dac50fSopenharmony_ci windowLimits.maxHeight_ = newLimits.maxHeight_; 3739e0dac50fSopenharmony_ci WLOGFI("success! Id:%{public}u, minWidth:%{public}u, minHeight:%{public}u, " 3740e0dac50fSopenharmony_ci "maxWidth:%{public}u, maxHeight:%{public}u", GetWindowId(), windowLimits.minWidth_, 3741e0dac50fSopenharmony_ci windowLimits.minHeight_, windowLimits.maxWidth_, windowLimits.maxHeight_); 3742e0dac50fSopenharmony_ci} 3743e0dac50fSopenharmony_ci 3744e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::NotifyDialogStateChange(bool isForeground) 3745e0dac50fSopenharmony_ci{ 3746e0dac50fSopenharmony_ci const auto type = GetType(); 3747e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_DIALOG, "state change [name:%{public}s, id:%{public}d, type:%{public}u], state:%{public}u," 3748e0dac50fSopenharmony_ci " requestState:%{public}u, isForeground:%{public}d", property_->GetWindowName().c_str(), GetPersistentId(), 3749e0dac50fSopenharmony_ci type, state_, requestState_, static_cast<int32_t>(isForeground)); 3750e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3751e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_DIALOG, "session is invalid, id:%{public}d", GetPersistentId()); 3752e0dac50fSopenharmony_ci return WSError::WS_ERROR_INVALID_WINDOW; 3753e0dac50fSopenharmony_ci } 3754e0dac50fSopenharmony_ci 3755e0dac50fSopenharmony_ci if (isForeground) { 3756e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 3757e0dac50fSopenharmony_ci return WSError::WS_OK; 3758e0dac50fSopenharmony_ci } 3759e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN) { 3760e0dac50fSopenharmony_ci state_ = WindowState::STATE_SHOWN; 3761e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_SHOWN; 3762e0dac50fSopenharmony_ci NotifyAfterForeground(); 3763e0dac50fSopenharmony_ci } 3764e0dac50fSopenharmony_ci } else { 3765e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_HIDDEN) { 3766e0dac50fSopenharmony_ci return WSError::WS_OK; 3767e0dac50fSopenharmony_ci } 3768e0dac50fSopenharmony_ci if (state_ == WindowState::STATE_SHOWN) { 3769e0dac50fSopenharmony_ci state_ = WindowState::STATE_HIDDEN; 3770e0dac50fSopenharmony_ci requestState_ = WindowState::STATE_HIDDEN; 3771e0dac50fSopenharmony_ci NotifyAfterBackground(); 3772e0dac50fSopenharmony_ci } 3773e0dac50fSopenharmony_ci } 3774e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_DIALOG, "success [name:%{public}s, id:%{public}d, type:%{public}u]," 3775e0dac50fSopenharmony_ci " state:%{public}u, requestState:%{public}u", property_->GetWindowName().c_str(), property_->GetPersistentId(), 3776e0dac50fSopenharmony_ci type, state_, requestState_); 3777e0dac50fSopenharmony_ci return WSError::WS_OK; 3778e0dac50fSopenharmony_ci} 3779e0dac50fSopenharmony_ci 3780e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetDefaultDensityEnabled(bool enabled) 3781e0dac50fSopenharmony_ci{ 3782e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "Id=%{public}d set default density enabled=%{public}d", GetWindowId(), enabled); 3783e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3784e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "window is invalid"); 3785e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3786e0dac50fSopenharmony_ci } 3787e0dac50fSopenharmony_ci 3788e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(GetType())) { 3789e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "must be app main window"); 3790e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_CALLING; 3791e0dac50fSopenharmony_ci } 3792e0dac50fSopenharmony_ci 3793e0dac50fSopenharmony_ci if (isDefaultDensityEnabled_ == enabled) { 3794e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "isDefaultDensityEnabled not change"); 3795e0dac50fSopenharmony_ci return WMError::WM_OK; 3796e0dac50fSopenharmony_ci } 3797e0dac50fSopenharmony_ci isDefaultDensityEnabled_ = enabled; 3798e0dac50fSopenharmony_ci 3799e0dac50fSopenharmony_ci std::shared_lock<std::shared_mutex> lock(windowSessionMutex_); 3800e0dac50fSopenharmony_ci for (const auto& winPair : windowSessionMap_) { 3801e0dac50fSopenharmony_ci auto window = winPair.second.second; 3802e0dac50fSopenharmony_ci if (window == nullptr) { 3803e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr"); 3804e0dac50fSopenharmony_ci continue; 3805e0dac50fSopenharmony_ci } 3806e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_LAYOUT, "Id=%{public}d UpdateDensity", window->GetWindowId()); 3807e0dac50fSopenharmony_ci window->UpdateDensity(); 3808e0dac50fSopenharmony_ci } 3809e0dac50fSopenharmony_ci return WMError::WM_OK; 3810e0dac50fSopenharmony_ci} 3811e0dac50fSopenharmony_ci 3812e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetDefaultDensityEnabled() 3813e0dac50fSopenharmony_ci{ 3814e0dac50fSopenharmony_ci return isDefaultDensityEnabled_.load(); 3815e0dac50fSopenharmony_ci} 3816e0dac50fSopenharmony_ci 3817e0dac50fSopenharmony_cifloat WindowSceneSessionImpl::GetVirtualPixelRatio(sptr<DisplayInfo> displayInfo) 3818e0dac50fSopenharmony_ci{ 3819e0dac50fSopenharmony_ci float vpr = 1.0f; 3820e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 3821e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_LAYOUT, "displayInfo is nullptr"); 3822e0dac50fSopenharmony_ci return vpr; 3823e0dac50fSopenharmony_ci } 3824e0dac50fSopenharmony_ci bool isDefaultDensityEnabled = false; 3825e0dac50fSopenharmony_ci if (WindowHelper::IsMainWindow(GetType())) { 3826e0dac50fSopenharmony_ci isDefaultDensityEnabled = GetDefaultDensityEnabled(); 3827e0dac50fSopenharmony_ci } else { 3828e0dac50fSopenharmony_ci auto mainWindow = FindMainWindowWithContext(); 3829e0dac50fSopenharmony_ci if (mainWindow) { 3830e0dac50fSopenharmony_ci isDefaultDensityEnabled = mainWindow->GetDefaultDensityEnabled(); 3831e0dac50fSopenharmony_ci CopyUniqueDensityParameter(mainWindow); 3832e0dac50fSopenharmony_ci } 3833e0dac50fSopenharmony_ci } 3834e0dac50fSopenharmony_ci if (isDefaultDensityEnabled) { 3835e0dac50fSopenharmony_ci vpr = displayInfo->GetDefaultVirtualPixelRatio(); 3836e0dac50fSopenharmony_ci } else if (useUniqueDensity_) { 3837e0dac50fSopenharmony_ci vpr = virtualPixelRatio_; 3838e0dac50fSopenharmony_ci } else { 3839e0dac50fSopenharmony_ci vpr = displayInfo->GetVirtualPixelRatio(); 3840e0dac50fSopenharmony_ci } 3841e0dac50fSopenharmony_ci return vpr; 3842e0dac50fSopenharmony_ci} 3843e0dac50fSopenharmony_ci 3844e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::HideNonSecureWindows(bool shouldHide) 3845e0dac50fSopenharmony_ci{ 3846e0dac50fSopenharmony_ci return SingletonContainer::Get<WindowAdapter>().AddOrRemoveSecureSession(property_->GetPersistentId(), shouldHide); 3847e0dac50fSopenharmony_ci} 3848e0dac50fSopenharmony_ci 3849e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetTextFieldAvoidInfo(double textFieldPositionY, double textFieldHeight) 3850e0dac50fSopenharmony_ci{ 3851e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "textFieldPositionY: %{public}f, textFieldHeight:%{public}f", 3852e0dac50fSopenharmony_ci textFieldPositionY, textFieldHeight); 3853e0dac50fSopenharmony_ci property_->SetTextFieldPositionY(textFieldPositionY); 3854e0dac50fSopenharmony_ci property_->SetTextFieldHeight(textFieldHeight); 3855e0dac50fSopenharmony_ci UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_TEXTFIELD_AVOID_INFO); 3856e0dac50fSopenharmony_ci return WMError::WM_OK; 3857e0dac50fSopenharmony_ci} 3858e0dac50fSopenharmony_ci 3859e0dac50fSopenharmony_cistd::unique_ptr<Media::PixelMap> WindowSceneSessionImpl::HandleWindowMask( 3860e0dac50fSopenharmony_ci const std::vector<std::vector<uint32_t>>& windowMask) 3861e0dac50fSopenharmony_ci{ 3862e0dac50fSopenharmony_ci const Rect& windowRect = GetRequestRect(); 3863e0dac50fSopenharmony_ci uint32_t maskHeight = windowMask.size(); 3864e0dac50fSopenharmony_ci if (maskHeight == 0) { 3865e0dac50fSopenharmony_ci WLOGFE("WindowMask is invalid"); 3866e0dac50fSopenharmony_ci return nullptr; 3867e0dac50fSopenharmony_ci } 3868e0dac50fSopenharmony_ci uint32_t maskWidth = windowMask[0].size(); 3869e0dac50fSopenharmony_ci if ((windowRect.height_ > 0 && windowRect.height_ != maskHeight) || 3870e0dac50fSopenharmony_ci (windowRect.width_ > 0 && windowRect.width_ != maskWidth)) { 3871e0dac50fSopenharmony_ci WLOGFE("WindowMask is invalid"); 3872e0dac50fSopenharmony_ci return nullptr; 3873e0dac50fSopenharmony_ci } 3874e0dac50fSopenharmony_ci constexpr uint32_t bgraChannel = 4; 3875e0dac50fSopenharmony_ci Media::InitializationOptions opts; 3876e0dac50fSopenharmony_ci opts.size.width = static_cast<int32_t>(maskWidth); 3877e0dac50fSopenharmony_ci opts.size.height = static_cast<int32_t>(maskHeight); 3878e0dac50fSopenharmony_ci uint32_t length = maskWidth * maskHeight * bgraChannel; 3879e0dac50fSopenharmony_ci uint8_t* data = static_cast<uint8_t*>(malloc(length)); 3880e0dac50fSopenharmony_ci if (data == nullptr) { 3881e0dac50fSopenharmony_ci WLOGFE("data is nullptr"); 3882e0dac50fSopenharmony_ci return nullptr; 3883e0dac50fSopenharmony_ci } 3884e0dac50fSopenharmony_ci constexpr uint32_t fullChannel = 255; 3885e0dac50fSopenharmony_ci constexpr uint32_t greenChannel = 1; 3886e0dac50fSopenharmony_ci constexpr uint32_t redChannel = 2; 3887e0dac50fSopenharmony_ci constexpr uint32_t alphaChannel = 3; 3888e0dac50fSopenharmony_ci for (uint32_t i = 0; i < maskHeight; i++) { 3889e0dac50fSopenharmony_ci for (uint32_t j = 0; j < maskWidth; j++) { 3890e0dac50fSopenharmony_ci uint32_t idx = i * maskWidth + j; 3891e0dac50fSopenharmony_ci uint32_t channel = windowMask[i][j] > 0 ? fullChannel : 0; 3892e0dac50fSopenharmony_ci uint32_t channelIndex = idx * bgraChannel; 3893e0dac50fSopenharmony_ci data[channelIndex] = channel; // blue channel 3894e0dac50fSopenharmony_ci data[channelIndex + greenChannel] = channel; // green channel 3895e0dac50fSopenharmony_ci data[channelIndex + redChannel] = fullChannel; // red channel 3896e0dac50fSopenharmony_ci data[channelIndex + alphaChannel] = channel; // alpha channel 3897e0dac50fSopenharmony_ci } 3898e0dac50fSopenharmony_ci } 3899e0dac50fSopenharmony_ci std::unique_ptr<Media::PixelMap> mask = Media::PixelMap::Create(reinterpret_cast<uint32_t*>(data), length, opts); 3900e0dac50fSopenharmony_ci free(data); 3901e0dac50fSopenharmony_ci return mask; 3902e0dac50fSopenharmony_ci} 3903e0dac50fSopenharmony_ci 3904e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetWindowMask(const std::vector<std::vector<uint32_t>>& windowMask) 3905e0dac50fSopenharmony_ci{ 3906e0dac50fSopenharmony_ci WLOGFI("WindowId: %{public}u", GetWindowId()); 3907e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 3908e0dac50fSopenharmony_ci WLOGFE("session is invalid"); 3909e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3910e0dac50fSopenharmony_ci } 3911e0dac50fSopenharmony_ci 3912e0dac50fSopenharmony_ci std::shared_ptr<Media::PixelMap> mask = HandleWindowMask(windowMask); 3913e0dac50fSopenharmony_ci if (mask == nullptr) { 3914e0dac50fSopenharmony_ci WLOGFE("Failed to create pixelMap of window mask"); 3915e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 3916e0dac50fSopenharmony_ci } 3917e0dac50fSopenharmony_ci 3918e0dac50fSopenharmony_ci auto rsMask = RSMask::CreatePixelMapMask(mask); 3919e0dac50fSopenharmony_ci surfaceNode_->SetCornerRadius(0.0f); 3920e0dac50fSopenharmony_ci surfaceNode_->SetShadowRadius(0.0f); 3921e0dac50fSopenharmony_ci surfaceNode_->SetAbilityBGAlpha(0); 3922e0dac50fSopenharmony_ci surfaceNode_->SetMask(rsMask); // RS interface to set mask 3923e0dac50fSopenharmony_ci RSTransaction::FlushImplicitTransaction(); 3924e0dac50fSopenharmony_ci 3925e0dac50fSopenharmony_ci property_->SetWindowMask(mask); 3926e0dac50fSopenharmony_ci property_->SetIsShaped(true); 3927e0dac50fSopenharmony_ci return UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_WINDOW_MASK); 3928e0dac50fSopenharmony_ci} 3929e0dac50fSopenharmony_ci 3930e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateDensity() 3931e0dac50fSopenharmony_ci{ 3932e0dac50fSopenharmony_ci UpdateDensityInner(nullptr); 3933e0dac50fSopenharmony_ci} 3934e0dac50fSopenharmony_ci 3935e0dac50fSopenharmony_civoid WindowSceneSessionImpl::UpdateDensityInner(const sptr<DisplayInfo>& info) 3936e0dac50fSopenharmony_ci{ 3937e0dac50fSopenharmony_ci if (!userLimitsSet_) { 3938e0dac50fSopenharmony_ci UpdateWindowSizeLimits(); 3939e0dac50fSopenharmony_ci UpdateNewSize(); 3940e0dac50fSopenharmony_ci WMError ret = UpdateProperty(WSPropertyChangeAction::ACTION_UPDATE_WINDOW_LIMITS); 3941e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 3942e0dac50fSopenharmony_ci WLOGFE("update window proeprty failed! id: %{public}u.", GetWindowId()); 3943e0dac50fSopenharmony_ci return; 3944e0dac50fSopenharmony_ci } 3945e0dac50fSopenharmony_ci } 3946e0dac50fSopenharmony_ci 3947e0dac50fSopenharmony_ci NotifyDisplayInfoChange(info); 3948e0dac50fSopenharmony_ci 3949e0dac50fSopenharmony_ci auto preRect = GetRect(); 3950e0dac50fSopenharmony_ci UpdateViewportConfig(preRect, WindowSizeChangeReason::UNDEFINED, nullptr, info); 3951e0dac50fSopenharmony_ci WLOGFI("[%{public}d, %{public}d, %{public}u, %{public}u]", 3952e0dac50fSopenharmony_ci preRect.posX_, preRect.posY_, preRect.width_, preRect.height_); 3953e0dac50fSopenharmony_ci} 3954e0dac50fSopenharmony_ci 3955e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::RegisterKeyboardPanelInfoChangeListener( 3956e0dac50fSopenharmony_ci const sptr<IKeyboardPanelInfoChangeListener>& listener) 3957e0dac50fSopenharmony_ci{ 3958e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lockListener(keyboardPanelInfoChangeListenerMutex_); 3959e0dac50fSopenharmony_ci if (keyboardPanelInfoChangeListeners_ == nullptr) { 3960e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "id: %{public}d", 3961e0dac50fSopenharmony_ci GetPersistentId()); 3962e0dac50fSopenharmony_ci keyboardPanelInfoChangeListeners_ = listener; 3963e0dac50fSopenharmony_ci } else { 3964e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_KEYBOARD, "listener already registered"); 3965e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_OPERATION; 3966e0dac50fSopenharmony_ci } 3967e0dac50fSopenharmony_ci 3968e0dac50fSopenharmony_ci return WMError::WM_OK; 3969e0dac50fSopenharmony_ci} 3970e0dac50fSopenharmony_ci 3971e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::UnregisterKeyboardPanelInfoChangeListener( 3972e0dac50fSopenharmony_ci const sptr<IKeyboardPanelInfoChangeListener>& listener) 3973e0dac50fSopenharmony_ci{ 3974e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lockListener(keyboardPanelInfoChangeListenerMutex_); 3975e0dac50fSopenharmony_ci keyboardPanelInfoChangeListeners_ = nullptr; 3976e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "id: %{public}d", GetPersistentId()); 3977e0dac50fSopenharmony_ci 3978e0dac50fSopenharmony_ci return WMError::WM_OK; 3979e0dac50fSopenharmony_ci} 3980e0dac50fSopenharmony_ci 3981e0dac50fSopenharmony_civoid WindowSceneSessionImpl::NotifyKeyboardPanelInfoChange(const KeyboardPanelInfo& keyboardPanelInfo) 3982e0dac50fSopenharmony_ci{ 3983e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "isKeyboardPanelShown: %{public}d, gravity: %{public}d" 3984e0dac50fSopenharmony_ci ", rect_: [%{public}d, %{public}d, %{public}d, %{public}d]", keyboardPanelInfo.isShowing_, 3985e0dac50fSopenharmony_ci keyboardPanelInfo.gravity_, keyboardPanelInfo.rect_.posX_, keyboardPanelInfo.rect_.posY_, 3986e0dac50fSopenharmony_ci keyboardPanelInfo.rect_.width_, keyboardPanelInfo.rect_.height_); 3987e0dac50fSopenharmony_ci std::lock_guard<std::mutex> lockListener(keyboardPanelInfoChangeListenerMutex_); 3988e0dac50fSopenharmony_ci if (keyboardPanelInfoChangeListeners_ && keyboardPanelInfoChangeListeners_.GetRefPtr()) { 3989e0dac50fSopenharmony_ci keyboardPanelInfoChangeListeners_.GetRefPtr()->OnKeyboardPanelInfoChanged(keyboardPanelInfo); 3990e0dac50fSopenharmony_ci } else { 3991e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "listener is unRegistered"); 3992e0dac50fSopenharmony_ci } 3993e0dac50fSopenharmony_ci} 3994e0dac50fSopenharmony_ci 3995e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::UpdateDisplayId(uint64_t displayId) 3996e0dac50fSopenharmony_ci{ 3997e0dac50fSopenharmony_ci property_->SetDisplayId(displayId); 3998e0dac50fSopenharmony_ci NotifyDisplayInfoChange(); 3999e0dac50fSopenharmony_ci return WSError::WS_OK; 4000e0dac50fSopenharmony_ci} 4001e0dac50fSopenharmony_ci 4002e0dac50fSopenharmony_ciWSError WindowSceneSessionImpl::UpdateOrientation() 4003e0dac50fSopenharmony_ci{ 4004e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DMS, "id: %{public}d", GetPersistentId()); 4005e0dac50fSopenharmony_ci NotifyDisplayInfoChange(); 4006e0dac50fSopenharmony_ci return WSError::WS_OK; 4007e0dac50fSopenharmony_ci} 4008e0dac50fSopenharmony_ci 4009e0dac50fSopenharmony_civoid WindowSceneSessionImpl::NotifyDisplayInfoChange(const sptr<DisplayInfo>& info) 4010e0dac50fSopenharmony_ci{ 4011e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DMS, "id: %{public}d", GetPersistentId()); 4012e0dac50fSopenharmony_ci sptr<DisplayInfo> displayInfo = nullptr; 4013e0dac50fSopenharmony_ci DisplayId displayId = 0; 4014e0dac50fSopenharmony_ci if (info == nullptr) { 4015e0dac50fSopenharmony_ci displayId = property_->GetDisplayId(); 4016e0dac50fSopenharmony_ci auto display = SingletonContainer::IsDestroyed() ? nullptr : 4017e0dac50fSopenharmony_ci SingletonContainer::Get<DisplayManager>().GetDisplayById(displayId); 4018e0dac50fSopenharmony_ci if (display == nullptr) { 4019e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DMS, "get display by displayId %{public}" PRIu64 " failed.", displayId); 4020e0dac50fSopenharmony_ci return; 4021e0dac50fSopenharmony_ci } 4022e0dac50fSopenharmony_ci displayInfo = display->GetDisplayInfo(); 4023e0dac50fSopenharmony_ci } else { 4024e0dac50fSopenharmony_ci displayInfo = info; 4025e0dac50fSopenharmony_ci } 4026e0dac50fSopenharmony_ci if (displayInfo == nullptr) { 4027e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DMS, "get display info %{public}" PRIu64 " failed.", displayId); 4028e0dac50fSopenharmony_ci return; 4029e0dac50fSopenharmony_ci } 4030e0dac50fSopenharmony_ci float density = GetVirtualPixelRatio(displayInfo); 4031e0dac50fSopenharmony_ci DisplayOrientation orientation = displayInfo->GetDisplayOrientation(); 4032e0dac50fSopenharmony_ci 4033e0dac50fSopenharmony_ci if (context_ == nullptr) { 4034e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DMS, "id:%{public}d failed, context is null.", GetPersistentId()); 4035e0dac50fSopenharmony_ci return; 4036e0dac50fSopenharmony_ci } 4037e0dac50fSopenharmony_ci auto token = context_->GetToken(); 4038e0dac50fSopenharmony_ci if (token == nullptr) { 4039e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DMS, "get token window:%{public}d failed.", GetPersistentId()); 4040e0dac50fSopenharmony_ci return; 4041e0dac50fSopenharmony_ci } 4042e0dac50fSopenharmony_ci SingletonContainer::Get<WindowManager>().NotifyDisplayInfoChange(token, displayId, density, orientation); 4043e0dac50fSopenharmony_ci} 4044e0dac50fSopenharmony_ci 4045e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::MoveAndResizeKeyboard(const KeyboardLayoutParams& params) 4046e0dac50fSopenharmony_ci{ 4047e0dac50fSopenharmony_ci int32_t displayWidth = 0; 4048e0dac50fSopenharmony_ci int32_t displayHeight = 0; 4049e0dac50fSopenharmony_ci auto display = SingletonContainer::Get<DisplayManager>().GetDisplayById(property_->GetDisplayId()); 4050e0dac50fSopenharmony_ci if (display != nullptr) { 4051e0dac50fSopenharmony_ci displayWidth = display->GetWidth(); 4052e0dac50fSopenharmony_ci displayHeight = display->GetHeight(); 4053e0dac50fSopenharmony_ci } else { 4054e0dac50fSopenharmony_ci auto defaultDisplayInfo = DisplayManager::GetInstance().GetDefaultDisplay(); 4055e0dac50fSopenharmony_ci if (defaultDisplayInfo != nullptr) { 4056e0dac50fSopenharmony_ci displayWidth = defaultDisplayInfo->GetWidth(); 4057e0dac50fSopenharmony_ci displayHeight = defaultDisplayInfo->GetHeight(); 4058e0dac50fSopenharmony_ci } else { 4059e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_KEYBOARD, "display is null, name: %{public}s, id: %{public}d", 4060e0dac50fSopenharmony_ci property_->GetWindowName().c_str(), GetPersistentId()); 4061e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 4062e0dac50fSopenharmony_ci } 4063e0dac50fSopenharmony_ci } 4064e0dac50fSopenharmony_ci bool isLandscape = displayWidth > displayHeight ? true : false; 4065e0dac50fSopenharmony_ci Rect newRect = isLandscape ? params.LandscapeKeyboardRect_ : params.PortraitKeyboardRect_; 4066e0dac50fSopenharmony_ci property_->SetRequestRect(newRect); 4067e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "Id: %{public}d, newRect: %{public}s, isLandscape: %{public}d, " 4068e0dac50fSopenharmony_ci "displayWidth: %{public}d, displayHeight: %{public}d", GetPersistentId(), newRect.ToString().c_str(), 4069e0dac50fSopenharmony_ci isLandscape, displayWidth, displayHeight); 4070e0dac50fSopenharmony_ci return WMError::WM_OK; 4071e0dac50fSopenharmony_ci} 4072e0dac50fSopenharmony_ci 4073e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::AdjustKeyboardLayout(const KeyboardLayoutParams& params) 4074e0dac50fSopenharmony_ci{ 4075e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_KEYBOARD, "gravity: %{public}u, LandscapeKeyboardRect: %{public}s, " 4076e0dac50fSopenharmony_ci "PortraitKeyboardRect: %{public}s, LandscapePanelRect: %{public}s, PortraitPanelRect: %{public}s", 4077e0dac50fSopenharmony_ci static_cast<uint32_t>(params.gravity_), params.LandscapeKeyboardRect_.ToString().c_str(), 4078e0dac50fSopenharmony_ci params.PortraitKeyboardRect_.ToString().c_str(), params.LandscapePanelRect_.ToString().c_str(), 4079e0dac50fSopenharmony_ci params.PortraitPanelRect_.ToString().c_str()); 4080e0dac50fSopenharmony_ci property_->SetKeyboardLayoutParams(params); 4081e0dac50fSopenharmony_ci property_->SetKeyboardSessionGravity(static_cast<SessionGravity>(params.gravity_), 0); 4082e0dac50fSopenharmony_ci auto ret = MoveAndResizeKeyboard(params); 4083e0dac50fSopenharmony_ci if (ret != WMError::WM_OK) { 4084e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_KEYBOARD, "keyboard move and resize failed"); 4085e0dac50fSopenharmony_ci return ret; 4086e0dac50fSopenharmony_ci } 4087e0dac50fSopenharmony_ci if (auto hostSession = GetHostSession()) { 4088e0dac50fSopenharmony_ci return static_cast<WMError>(hostSession->AdjustKeyboardLayout(params)); 4089e0dac50fSopenharmony_ci } 4090e0dac50fSopenharmony_ci return WMError::WM_OK; 4091e0dac50fSopenharmony_ci} 4092e0dac50fSopenharmony_ci 4093e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetImmersiveModeEnabledState(bool enable) 4094e0dac50fSopenharmony_ci{ 4095e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "id: %{public}u, enable: %{public}u", GetWindowId(), enable); 4096e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 4097e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 4098e0dac50fSopenharmony_ci } 4099e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 4100e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 4101e0dac50fSopenharmony_ci if (!WindowHelper::IsWindowModeSupported(property_->GetModeSupportInfo(), WindowMode::WINDOW_MODE_FULLSCREEN)) { 4102e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 4103e0dac50fSopenharmony_ci } 4104e0dac50fSopenharmony_ci const WindowType curWindowType = GetType(); 4105e0dac50fSopenharmony_ci if (!WindowHelper::IsMainWindow(curWindowType) && !WindowHelper::IsSubWindow(curWindowType)) { 4106e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 4107e0dac50fSopenharmony_ci } 4108e0dac50fSopenharmony_ci 4109e0dac50fSopenharmony_ci enableImmersiveMode_ = enable; 4110e0dac50fSopenharmony_ci hostSession->OnLayoutFullScreenChange(enableImmersiveMode_); 4111e0dac50fSopenharmony_ci WindowMode mode = GetMode(); 4112e0dac50fSopenharmony_ci if (!windowSystemConfig_.IsPcWindow() || mode == WindowMode::WINDOW_MODE_FULLSCREEN) { 4113e0dac50fSopenharmony_ci return SetLayoutFullScreen(enableImmersiveMode_); 4114e0dac50fSopenharmony_ci } 4115e0dac50fSopenharmony_ci return WMError::WM_OK; 4116e0dac50fSopenharmony_ci} 4117e0dac50fSopenharmony_ci 4118e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetImmersiveModeEnabledState() const 4119e0dac50fSopenharmony_ci{ 4120e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "id: %{public}u, enableImmersiveMode = %{public}u", 4121e0dac50fSopenharmony_ci GetWindowId(), enableImmersiveMode_); 4122e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 4123e0dac50fSopenharmony_ci return false; 4124e0dac50fSopenharmony_ci } 4125e0dac50fSopenharmony_ci return enableImmersiveMode_; 4126e0dac50fSopenharmony_ci} 4127e0dac50fSopenharmony_ci 4128e0dac50fSopenharmony_ciuint32_t WindowSceneSessionImpl::GetStatusBarHeight() 4129e0dac50fSopenharmony_ci{ 4130e0dac50fSopenharmony_ci uint32_t height = 0; 4131e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 4132e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, height); 4133e0dac50fSopenharmony_ci height = static_cast<uint32_t>(hostSession->GetStatusBarHeight()); 4134e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "%{public}d", height); 4135e0dac50fSopenharmony_ci return height; 4136e0dac50fSopenharmony_ci} 4137e0dac50fSopenharmony_ci 4138e0dac50fSopenharmony_citemplate <typename K, typename V> 4139e0dac50fSopenharmony_cistatic V GetValueByKey(const std::unordered_map<K, V>& map, K key) 4140e0dac50fSopenharmony_ci{ 4141e0dac50fSopenharmony_ci auto it = map.find(key); 4142e0dac50fSopenharmony_ci return it != map.end() ? it->second : V{}; 4143e0dac50fSopenharmony_ci} 4144e0dac50fSopenharmony_ci 4145e0dac50fSopenharmony_civoid WindowSceneSessionImpl::HandleEventForCompatibleMode(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 4146e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem) 4147e0dac50fSopenharmony_ci{ 4148e0dac50fSopenharmony_ci int32_t action = pointerEvent->GetPointerAction(); 4149e0dac50fSopenharmony_ci switch (action) { 4150e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_DOWN: 4151e0dac50fSopenharmony_ci HandleDownForCompatibleMode(pointerEvent, pointerItem); 4152e0dac50fSopenharmony_ci break; 4153e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_MOVE: 4154e0dac50fSopenharmony_ci HandleMoveForCompatibleMode(pointerEvent, pointerItem); 4155e0dac50fSopenharmony_ci break; 4156e0dac50fSopenharmony_ci case MMI::PointerEvent::POINTER_ACTION_UP: 4157e0dac50fSopenharmony_ci HandleUpForCompatibleMode(pointerEvent, pointerItem); 4158e0dac50fSopenharmony_ci break; 4159e0dac50fSopenharmony_ci default: 4160e0dac50fSopenharmony_ci break; 4161e0dac50fSopenharmony_ci } 4162e0dac50fSopenharmony_ci} 4163e0dac50fSopenharmony_ci 4164e0dac50fSopenharmony_civoid WindowSceneSessionImpl::HandleDownForCompatibleMode(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 4165e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem) 4166e0dac50fSopenharmony_ci{ 4167e0dac50fSopenharmony_ci int32_t displayX = pointerItem.GetDisplayX(); 4168e0dac50fSopenharmony_ci int32_t displayY = pointerItem.GetDisplayY(); 4169e0dac50fSopenharmony_ci int32_t displayId = property_->GetDisplayId(); 4170e0dac50fSopenharmony_ci int32_t pointerCount = pointerEvent->GetPointerCount(); 4171e0dac50fSopenharmony_ci if (pointerCount == 1) { 4172e0dac50fSopenharmony_ci eventMapTriggerByDisplay_[displayId] = std::vector<bool>(MAX_POINTERS); 4173e0dac50fSopenharmony_ci eventMapDeltaXByDisplay_[displayId] = std::vector<int32_t>(MAX_POINTERS); 4174e0dac50fSopenharmony_ci downPointerByDisplay_[displayId] = std::vector<PointInfo>(MAX_POINTERS); 4175e0dac50fSopenharmony_ci isOverTouchSlop_ = false; 4176e0dac50fSopenharmony_ci isDown_ = true; 4177e0dac50fSopenharmony_ci } 4178e0dac50fSopenharmony_ci 4179e0dac50fSopenharmony_ci if (IsInMappingRegionForCompatibleMode(displayX, displayY)) { 4180e0dac50fSopenharmony_ci int32_t pointerId = pointerEvent->GetPointerId(); 4181e0dac50fSopenharmony_ci if (pointerId >= GetValueByKey(eventMapTriggerByDisplay_, displayId).size() || 4182e0dac50fSopenharmony_ci pointerId >= GetValueByKey(eventMapDeltaXByDisplay_, displayId).size() || 4183e0dac50fSopenharmony_ci pointerId >= GetValueByKey(downPointerByDisplay_, displayId).size()) { 4184e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "pointerId: %{public}d out of range", pointerId); 4185e0dac50fSopenharmony_ci return; 4186e0dac50fSopenharmony_ci } 4187e0dac50fSopenharmony_ci eventMapTriggerByDisplay_[displayId][pointerId] = true; 4188e0dac50fSopenharmony_ci downPointerByDisplay_[displayId][pointerId] = {displayX, displayY}; 4189e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 4190e0dac50fSopenharmony_ci float xMappingScale = 1.0f; 4191e0dac50fSopenharmony_ci if (windowRect.posX_ != 0) { 4192e0dac50fSopenharmony_ci xMappingScale = static_cast<float>(windowRect.width_) / windowRect.posX_; 4193e0dac50fSopenharmony_ci } 4194e0dac50fSopenharmony_ci int32_t windowLeft = windowRect.posX_; 4195e0dac50fSopenharmony_ci int32_t windowRight = windowRect.posX_ + windowRect.width_; 4196e0dac50fSopenharmony_ci int32_t transferX; 4197e0dac50fSopenharmony_ci if (displayX <= windowLeft) { 4198e0dac50fSopenharmony_ci transferX = windowRight - xMappingScale * (windowLeft - displayX); 4199e0dac50fSopenharmony_ci } else { 4200e0dac50fSopenharmony_ci transferX = windowLeft + xMappingScale * (displayX - windowRight); 4201e0dac50fSopenharmony_ci } 4202e0dac50fSopenharmony_ci if (transferX < 0) { 4203e0dac50fSopenharmony_ci transferX = 0; 4204e0dac50fSopenharmony_ci } 4205e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "DOWN in mapping region, displayX: %{public}d, transferX: %{public}d, " 4206e0dac50fSopenharmony_ci "pointerId: %{public}d", displayX, transferX, pointerId); 4207e0dac50fSopenharmony_ci eventMapDeltaXByDisplay_[displayId][pointerId] = transferX - displayX; 4208e0dac50fSopenharmony_ci ConvertPointForCompatibleMode(pointerEvent, pointerItem, transferX); 4209e0dac50fSopenharmony_ci } 4210e0dac50fSopenharmony_ci} 4211e0dac50fSopenharmony_ci 4212e0dac50fSopenharmony_civoid WindowSceneSessionImpl::HandleMoveForCompatibleMode(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 4213e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem) 4214e0dac50fSopenharmony_ci{ 4215e0dac50fSopenharmony_ci if (!isDown_) { 4216e0dac50fSopenharmony_ci TLOGW(WmsLogTag::DEFAULT, "receive move before down, skip"); 4217e0dac50fSopenharmony_ci return; 4218e0dac50fSopenharmony_ci } 4219e0dac50fSopenharmony_ci int32_t displayId = property_->GetDisplayId(); 4220e0dac50fSopenharmony_ci int32_t pointerId = pointerEvent->GetPointerId(); 4221e0dac50fSopenharmony_ci if (pointerId >= GetValueByKey(eventMapTriggerByDisplay_, displayId).size() || 4222e0dac50fSopenharmony_ci pointerId >= GetValueByKey(eventMapDeltaXByDisplay_, displayId).size() || 4223e0dac50fSopenharmony_ci !GetValueByKey(eventMapTriggerByDisplay_, displayId)[pointerId]) { 4224e0dac50fSopenharmony_ci return; 4225e0dac50fSopenharmony_ci } 4226e0dac50fSopenharmony_ci 4227e0dac50fSopenharmony_ci int32_t displayX = pointerItem.GetDisplayX(); 4228e0dac50fSopenharmony_ci int32_t displayY = pointerItem.GetDisplayY(); 4229e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 4230e0dac50fSopenharmony_ci if (!isOverTouchSlop_ && CheckTouchSlop(pointerId, displayX, displayY, windowRect.width_ / TOUCH_SLOP_RATIO)) { 4231e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "reach touch slop, threshold: %{public}d", windowRect.width_ / TOUCH_SLOP_RATIO); 4232e0dac50fSopenharmony_ci isOverTouchSlop_ = true; 4233e0dac50fSopenharmony_ci } 4234e0dac50fSopenharmony_ci int32_t transferX = displayX + GetValueByKey(eventMapDeltaXByDisplay_, displayId)[pointerId]; 4235e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "MOVE, displayX: %{public}d, transferX: %{public}d, pointerId: %{public}d", 4236e0dac50fSopenharmony_ci displayX, transferX, pointerId); 4237e0dac50fSopenharmony_ci ConvertPointForCompatibleMode(pointerEvent, pointerItem, transferX); 4238e0dac50fSopenharmony_ci} 4239e0dac50fSopenharmony_ci 4240e0dac50fSopenharmony_civoid WindowSceneSessionImpl::HandleUpForCompatibleMode(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 4241e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem) 4242e0dac50fSopenharmony_ci{ 4243e0dac50fSopenharmony_ci if (!isDown_) { 4244e0dac50fSopenharmony_ci TLOGW(WmsLogTag::DEFAULT, "receive up before down, skip"); 4245e0dac50fSopenharmony_ci return; 4246e0dac50fSopenharmony_ci } 4247e0dac50fSopenharmony_ci int32_t displayId = property_->GetDisplayId(); 4248e0dac50fSopenharmony_ci int32_t pointerId = pointerEvent->GetPointerId(); 4249e0dac50fSopenharmony_ci if (pointerId >= GetValueByKey(eventMapTriggerByDisplay_, displayId).size() || 4250e0dac50fSopenharmony_ci pointerId >= GetValueByKey(eventMapDeltaXByDisplay_, displayId).size()) { 4251e0dac50fSopenharmony_ci return; 4252e0dac50fSopenharmony_ci } 4253e0dac50fSopenharmony_ci if (GetValueByKey(eventMapTriggerByDisplay_, displayId)[pointerId]) { 4254e0dac50fSopenharmony_ci int32_t displayX = pointerItem.GetDisplayX(); 4255e0dac50fSopenharmony_ci int32_t transferX = displayX + GetValueByKey(eventMapDeltaXByDisplay_, displayId)[pointerId]; 4256e0dac50fSopenharmony_ci ConvertPointForCompatibleMode(pointerEvent, pointerItem, transferX); 4257e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "UP, displayX: %{public}d, transferX: %{public}d, pointerId: %{public}d", 4258e0dac50fSopenharmony_ci displayX, transferX, pointerId); 4259e0dac50fSopenharmony_ci GetValueByKey(eventMapDeltaXByDisplay_, displayId)[pointerId] = 0; 4260e0dac50fSopenharmony_ci GetValueByKey(eventMapTriggerByDisplay_, displayId)[pointerId] = false; 4261e0dac50fSopenharmony_ci IgnoreClickEvent(pointerEvent); 4262e0dac50fSopenharmony_ci } 4263e0dac50fSopenharmony_ci int32_t pointerCount = pointerEvent->GetPointerCount(); 4264e0dac50fSopenharmony_ci if (pointerCount == 1) { 4265e0dac50fSopenharmony_ci eventMapDeltaXByDisplay_.erase(displayId); 4266e0dac50fSopenharmony_ci eventMapTriggerByDisplay_.erase(displayId); 4267e0dac50fSopenharmony_ci downPointerByDisplay_.erase(displayId); 4268e0dac50fSopenharmony_ci isDown_ = false; 4269e0dac50fSopenharmony_ci } 4270e0dac50fSopenharmony_ci} 4271e0dac50fSopenharmony_ci 4272e0dac50fSopenharmony_civoid WindowSceneSessionImpl::ConvertPointForCompatibleMode(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, 4273e0dac50fSopenharmony_ci MMI::PointerEvent::PointerItem& pointerItem, int32_t transferX) 4274e0dac50fSopenharmony_ci{ 4275e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 4276e0dac50fSopenharmony_ci int32_t pointerId = pointerEvent->GetPointerId(); 4277e0dac50fSopenharmony_ci 4278e0dac50fSopenharmony_ci pointerItem.SetDisplayX(transferX); 4279e0dac50fSopenharmony_ci pointerItem.SetDisplayXPos(static_cast<double>(transferX)); 4280e0dac50fSopenharmony_ci pointerItem.SetWindowX(transferX - windowRect.posX_); 4281e0dac50fSopenharmony_ci pointerItem.SetWindowXPos(static_cast<double>(transferX - windowRect.posX_)); 4282e0dac50fSopenharmony_ci pointerEvent->UpdatePointerItem(pointerId, pointerItem); 4283e0dac50fSopenharmony_ci} 4284e0dac50fSopenharmony_ci 4285e0dac50fSopenharmony_cibool WindowSceneSessionImpl::IsInMappingRegionForCompatibleMode(int32_t displayX, int32_t displayY) 4286e0dac50fSopenharmony_ci{ 4287e0dac50fSopenharmony_ci const auto& windowRect = GetRect(); 4288e0dac50fSopenharmony_ci Rect pointerRect = { displayX, displayY, 0, 0 }; 4289e0dac50fSopenharmony_ci return !pointerRect.IsInsideOf(windowRect); 4290e0dac50fSopenharmony_ci} 4291e0dac50fSopenharmony_ci 4292e0dac50fSopenharmony_cibool WindowSceneSessionImpl::CheckTouchSlop(int32_t pointerId, int32_t displayX, int32_t displayY, int32_t threshold) 4293e0dac50fSopenharmony_ci{ 4294e0dac50fSopenharmony_ci int32_t displayId = property_->GetDisplayId(); 4295e0dac50fSopenharmony_ci if (downPointerByDisplay_.find(displayId) == downPointerByDisplay_.end()) { 4296e0dac50fSopenharmony_ci return false; 4297e0dac50fSopenharmony_ci } 4298e0dac50fSopenharmony_ci std::vector<PointInfo> downPointers = downPointerByDisplay_[displayId]; 4299e0dac50fSopenharmony_ci return pointerId < downPointers.size() && 4300e0dac50fSopenharmony_ci (std::abs(displayX - downPointers[pointerId].x) >= threshold || 4301e0dac50fSopenharmony_ci std::abs(displayY - downPointers[pointerId].y) >= threshold); 4302e0dac50fSopenharmony_ci} 4303e0dac50fSopenharmony_ci 4304e0dac50fSopenharmony_civoid WindowSceneSessionImpl::IgnoreClickEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) 4305e0dac50fSopenharmony_ci{ 4306e0dac50fSopenharmony_ci int32_t action = pointerEvent->GetPointerAction(); 4307e0dac50fSopenharmony_ci if (action != MMI::PointerEvent::POINTER_ACTION_UP) { 4308e0dac50fSopenharmony_ci return; 4309e0dac50fSopenharmony_ci } 4310e0dac50fSopenharmony_ci if (isOverTouchSlop_) { 4311e0dac50fSopenharmony_ci if (pointerEvent->GetPointerCount() == 1) { 4312e0dac50fSopenharmony_ci isOverTouchSlop_ = false; 4313e0dac50fSopenharmony_ci } 4314e0dac50fSopenharmony_ci } else { 4315e0dac50fSopenharmony_ci pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_CANCEL); 4316e0dac50fSopenharmony_ci TLOGI(WmsLogTag::DEFAULT, "transfer UP to CANCEL for not over touch slop"); 4317e0dac50fSopenharmony_ci } 4318e0dac50fSopenharmony_ci} 4319e0dac50fSopenharmony_ci 4320e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::GetWindowStatus(WindowStatus& windowStatus) 4321e0dac50fSopenharmony_ci{ 4322e0dac50fSopenharmony_ci if (IsWindowSessionInvalid()) { 4323e0dac50fSopenharmony_ci TLOGE(WmsLogTag::DEFAULT, "session is invalid"); 4324e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_WINDOW; 4325e0dac50fSopenharmony_ci } 4326e0dac50fSopenharmony_ci windowStatus = GetWindowStatusInner(GetMode()); 4327e0dac50fSopenharmony_ci TLOGD(WmsLogTag::DEFAULT, "Id:%{public}u, WindowStatus:%{public}u", GetWindowId(), windowStatus); 4328e0dac50fSopenharmony_ci return WMError::WM_OK; 4329e0dac50fSopenharmony_ci} 4330e0dac50fSopenharmony_ci 4331e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetIsUIExtFirstSubWindow() const 4332e0dac50fSopenharmony_ci{ 4333e0dac50fSopenharmony_ci return property_->GetIsUIExtFirstSubWindow(); 4334e0dac50fSopenharmony_ci} 4335e0dac50fSopenharmony_ci 4336e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetIsUIExtAnySubWindow() const 4337e0dac50fSopenharmony_ci{ 4338e0dac50fSopenharmony_ci return property_->GetIsUIExtAnySubWindow(); 4339e0dac50fSopenharmony_ci} 4340e0dac50fSopenharmony_ci 4341e0dac50fSopenharmony_ciWMError WindowSceneSessionImpl::SetGestureBackEnabled(bool enable) 4342e0dac50fSopenharmony_ci{ 4343e0dac50fSopenharmony_ci if (windowSystemConfig_.IsPcWindow()) { 4344e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "device is not support."); 4345e0dac50fSopenharmony_ci return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 4346e0dac50fSopenharmony_ci } 4347e0dac50fSopenharmony_ci if (!WindowHelper::IsMainFullScreenWindow(GetType(), property_->GetWindowMode())) { 4348e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "not full screen main window."); 4349e0dac50fSopenharmony_ci return WMError::WM_ERROR_INVALID_PARAM; 4350e0dac50fSopenharmony_ci } 4351e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "id: %{public}u, enable: %{public}u", GetWindowId(), enable); 4352e0dac50fSopenharmony_ci gestureBackEnabled_ = enable; 4353e0dac50fSopenharmony_ci auto hostSession = GetHostSession(); 4354e0dac50fSopenharmony_ci CHECK_HOST_SESSION_RETURN_ERROR_IF_NULL(hostSession, WMError::WM_ERROR_NULLPTR); 4355e0dac50fSopenharmony_ci return hostSession->SetGestureBackEnabled(enable); 4356e0dac50fSopenharmony_ci} 4357e0dac50fSopenharmony_ci 4358e0dac50fSopenharmony_cibool WindowSceneSessionImpl::GetGestureBackEnabled() const 4359e0dac50fSopenharmony_ci{ 4360e0dac50fSopenharmony_ci if (windowSystemConfig_.IsPcWindow()) { 4361e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "device is not support."); 4362e0dac50fSopenharmony_ci return true; 4363e0dac50fSopenharmony_ci } 4364e0dac50fSopenharmony_ci if (!WindowHelper::IsMainFullScreenWindow(GetType(), property_->GetWindowMode())) { 4365e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_IMMS, "not full screen main window."); 4366e0dac50fSopenharmony_ci return true; 4367e0dac50fSopenharmony_ci } 4368e0dac50fSopenharmony_ci TLOGD(WmsLogTag::WMS_IMMS, "id: %{public}u, enable: %{public}u", 4369e0dac50fSopenharmony_ci GetWindowId(), gestureBackEnabled_); 4370e0dac50fSopenharmony_ci return gestureBackEnabled_; 4371e0dac50fSopenharmony_ci} 4372e0dac50fSopenharmony_ci 4373e0dac50fSopenharmony_ci} // namespace Rosen 4374e0dac50fSopenharmony_ci} // namespace OHOS 4375