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