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