1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2021-2022 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_agent.h"
17e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
18e0dac50fSopenharmony_ci#include "wm_common.h"
19e0dac50fSopenharmony_ci
20e0dac50fSopenharmony_cinamespace OHOS {
21e0dac50fSopenharmony_cinamespace Rosen {
22e0dac50fSopenharmony_cinamespace {
23e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowAgent"};
24e0dac50fSopenharmony_ci}
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_ciWindowAgent::WindowAgent(sptr<WindowImpl>& windowImpl)
27e0dac50fSopenharmony_ci{
28e0dac50fSopenharmony_ci    window_ = windowImpl;
29e0dac50fSopenharmony_ci}
30e0dac50fSopenharmony_ci
31e0dac50fSopenharmony_ciWMError WindowAgent::UpdateWindowRect(const struct Rect& rect, bool decoStatus, WindowSizeChangeReason reason,
32e0dac50fSopenharmony_ci    const std::shared_ptr<RSTransaction>& rsTransaction)
33e0dac50fSopenharmony_ci{
34e0dac50fSopenharmony_ci    if (window_ == nullptr) {
35e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
36e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
37e0dac50fSopenharmony_ci    }
38e0dac50fSopenharmony_ci    window_->UpdateRect(rect, decoStatus, reason, rsTransaction);
39e0dac50fSopenharmony_ci    return WMError::WM_OK;
40e0dac50fSopenharmony_ci}
41e0dac50fSopenharmony_ci
42e0dac50fSopenharmony_ciWMError WindowAgent::UpdateWindowMode(WindowMode mode)
43e0dac50fSopenharmony_ci{
44e0dac50fSopenharmony_ci    if (window_ == nullptr) {
45e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
46e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
47e0dac50fSopenharmony_ci    }
48e0dac50fSopenharmony_ci    window_->UpdateMode(mode);
49e0dac50fSopenharmony_ci    return WMError::WM_OK;
50e0dac50fSopenharmony_ci}
51e0dac50fSopenharmony_ci
52e0dac50fSopenharmony_ciWMError WindowAgent::UpdateWindowModeSupportInfo(uint32_t modeSupportInfo)
53e0dac50fSopenharmony_ci{
54e0dac50fSopenharmony_ci    if (window_ == nullptr) {
55e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
56e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
57e0dac50fSopenharmony_ci    }
58e0dac50fSopenharmony_ci    window_->UpdateModeSupportInfo(modeSupportInfo);
59e0dac50fSopenharmony_ci    return WMError::WM_OK;
60e0dac50fSopenharmony_ci}
61e0dac50fSopenharmony_ci
62e0dac50fSopenharmony_ciWMError WindowAgent::UpdateFocusStatus(bool focused)
63e0dac50fSopenharmony_ci{
64e0dac50fSopenharmony_ci    if (window_ == nullptr) {
65e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
66e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
67e0dac50fSopenharmony_ci    }
68e0dac50fSopenharmony_ci    window_->UpdateFocusStatus(focused);
69e0dac50fSopenharmony_ci    return WMError::WM_OK;
70e0dac50fSopenharmony_ci}
71e0dac50fSopenharmony_ci
72e0dac50fSopenharmony_ciWMError WindowAgent::UpdateAvoidArea(const sptr<AvoidArea>& avoidArea, AvoidAreaType type)
73e0dac50fSopenharmony_ci{
74e0dac50fSopenharmony_ci    if (window_ == nullptr || avoidArea == nullptr) {
75e0dac50fSopenharmony_ci        WLOGFE("window_ or avoidArea is nullptr.");
76e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
77e0dac50fSopenharmony_ci    }
78e0dac50fSopenharmony_ci    window_->UpdateAvoidArea(avoidArea, type);
79e0dac50fSopenharmony_ci    return WMError::WM_OK;
80e0dac50fSopenharmony_ci}
81e0dac50fSopenharmony_ci
82e0dac50fSopenharmony_ciWMError WindowAgent::UpdateWindowState(WindowState state)
83e0dac50fSopenharmony_ci{
84e0dac50fSopenharmony_ci    if (window_ == nullptr) {
85e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
86e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
87e0dac50fSopenharmony_ci    }
88e0dac50fSopenharmony_ci    window_->UpdateWindowState(state);
89e0dac50fSopenharmony_ci    return WMError::WM_OK;
90e0dac50fSopenharmony_ci}
91e0dac50fSopenharmony_ci
92e0dac50fSopenharmony_ciWMError WindowAgent::UpdateWindowDragInfo(const PointInfo& point, DragEvent event)
93e0dac50fSopenharmony_ci{
94e0dac50fSopenharmony_ci    if (window_ == nullptr) {
95e0dac50fSopenharmony_ci        WLOGFE("window is null");
96e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
97e0dac50fSopenharmony_ci    }
98e0dac50fSopenharmony_ci    window_->UpdateDragEvent(point, event);
99e0dac50fSopenharmony_ci    return WMError::WM_OK;
100e0dac50fSopenharmony_ci}
101e0dac50fSopenharmony_ci
102e0dac50fSopenharmony_ciWMError WindowAgent::UpdateDisplayId(DisplayId from, DisplayId to)
103e0dac50fSopenharmony_ci{
104e0dac50fSopenharmony_ci    if (window_ == nullptr) {
105e0dac50fSopenharmony_ci        WLOGFE("window is null");
106e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
107e0dac50fSopenharmony_ci    }
108e0dac50fSopenharmony_ci    window_->UpdateDisplayId(from, to);
109e0dac50fSopenharmony_ci    return WMError::WM_OK;
110e0dac50fSopenharmony_ci}
111e0dac50fSopenharmony_ci
112e0dac50fSopenharmony_ciWMError WindowAgent::UpdateOccupiedAreaChangeInfo(const sptr<OccupiedAreaChangeInfo>& info,
113e0dac50fSopenharmony_ci    const std::shared_ptr<RSTransaction>& rsTransaction)
114e0dac50fSopenharmony_ci{
115e0dac50fSopenharmony_ci    if (window_ == nullptr) {
116e0dac50fSopenharmony_ci        WLOGFE("window is null");
117e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
118e0dac50fSopenharmony_ci    }
119e0dac50fSopenharmony_ci    window_->UpdateOccupiedAreaChangeInfo(info, rsTransaction);
120e0dac50fSopenharmony_ci    return WMError::WM_OK;
121e0dac50fSopenharmony_ci}
122e0dac50fSopenharmony_ci
123e0dac50fSopenharmony_ciWMError WindowAgent::UpdateOccupiedAreaAndRect(const sptr<OccupiedAreaChangeInfo>& info, const Rect& rect,
124e0dac50fSopenharmony_ci    const std::shared_ptr<RSTransaction>& rsTransaction)
125e0dac50fSopenharmony_ci{
126e0dac50fSopenharmony_ci    if (window_ == nullptr) {
127e0dac50fSopenharmony_ci        WLOGFE("window is null");
128e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
129e0dac50fSopenharmony_ci    }
130e0dac50fSopenharmony_ci    auto property = window_->GetWindowProperty();
131e0dac50fSopenharmony_ci    if (property) {
132e0dac50fSopenharmony_ci        window_->UpdateRect(rect, property->GetDecoStatus(), WindowSizeChangeReason::UNDEFINED);
133e0dac50fSopenharmony_ci    }
134e0dac50fSopenharmony_ci    window_->UpdateOccupiedAreaChangeInfo(info, rsTransaction);
135e0dac50fSopenharmony_ci    return WMError::WM_OK;
136e0dac50fSopenharmony_ci}
137e0dac50fSopenharmony_ci
138e0dac50fSopenharmony_ciWMError WindowAgent::UpdateActiveStatus(bool isActive)
139e0dac50fSopenharmony_ci{
140e0dac50fSopenharmony_ci    if (window_ == nullptr) {
141e0dac50fSopenharmony_ci        WLOGFE("window is null");
142e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
143e0dac50fSopenharmony_ci    }
144e0dac50fSopenharmony_ci    window_->UpdateActiveStatus(isActive);
145e0dac50fSopenharmony_ci    return WMError::WM_OK;
146e0dac50fSopenharmony_ci}
147e0dac50fSopenharmony_ci
148e0dac50fSopenharmony_cisptr<WindowProperty> WindowAgent::GetWindowProperty()
149e0dac50fSopenharmony_ci{
150e0dac50fSopenharmony_ci    if (window_ == nullptr) {
151e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
152e0dac50fSopenharmony_ci        return nullptr;
153e0dac50fSopenharmony_ci    }
154e0dac50fSopenharmony_ci    return window_->GetWindowProperty();
155e0dac50fSopenharmony_ci}
156e0dac50fSopenharmony_ci
157e0dac50fSopenharmony_ciWMError WindowAgent::RestoreSplitWindowMode(uint32_t mode)
158e0dac50fSopenharmony_ci{
159e0dac50fSopenharmony_ci    if (window_ == nullptr) {
160e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
161e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
162e0dac50fSopenharmony_ci    }
163e0dac50fSopenharmony_ci    window_->RestoreSplitWindowMode(mode);
164e0dac50fSopenharmony_ci    return WMError::WM_OK;
165e0dac50fSopenharmony_ci}
166e0dac50fSopenharmony_ci
167e0dac50fSopenharmony_ciWMError WindowAgent::NotifyTouchOutside()
168e0dac50fSopenharmony_ci{
169e0dac50fSopenharmony_ci    if (window_ == nullptr) {
170e0dac50fSopenharmony_ci        WLOGI("window is null");
171e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
172e0dac50fSopenharmony_ci    }
173e0dac50fSopenharmony_ci    WLOGFD("called");
174e0dac50fSopenharmony_ci    window_->NotifyTouchOutside();
175e0dac50fSopenharmony_ci    return WMError::WM_OK;
176e0dac50fSopenharmony_ci}
177e0dac50fSopenharmony_ci
178e0dac50fSopenharmony_ciWMError WindowAgent::NotifyScreenshot()
179e0dac50fSopenharmony_ci{
180e0dac50fSopenharmony_ci    if (window_ == nullptr) {
181e0dac50fSopenharmony_ci        WLOGFE("notify screenshot failed: window is null.");
182e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
183e0dac50fSopenharmony_ci    }
184e0dac50fSopenharmony_ci    WLOGFD("called");
185e0dac50fSopenharmony_ci    window_->NotifyScreenshot();
186e0dac50fSopenharmony_ci    return WMError::WM_OK;
187e0dac50fSopenharmony_ci}
188e0dac50fSopenharmony_ci
189e0dac50fSopenharmony_ciWMError WindowAgent::DumpInfo(const std::vector<std::string>& params)
190e0dac50fSopenharmony_ci{
191e0dac50fSopenharmony_ci    if (window_ == nullptr) {
192e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
193e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
194e0dac50fSopenharmony_ci    }
195e0dac50fSopenharmony_ci    std::vector<std::string> info;
196e0dac50fSopenharmony_ci    window_->DumpInfo(params, info);
197e0dac50fSopenharmony_ci    return WMError::WM_OK;
198e0dac50fSopenharmony_ci}
199e0dac50fSopenharmony_ci
200e0dac50fSopenharmony_ciWMError WindowAgent::UpdateZoomTransform(const Transform& trans, bool isDisplayZoomOn)
201e0dac50fSopenharmony_ci{
202e0dac50fSopenharmony_ci    if (window_ == nullptr) {
203e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
204e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
205e0dac50fSopenharmony_ci    }
206e0dac50fSopenharmony_ci    window_->UpdateZoomTransform(trans, isDisplayZoomOn);
207e0dac50fSopenharmony_ci    return WMError::WM_OK;
208e0dac50fSopenharmony_ci}
209e0dac50fSopenharmony_ci
210e0dac50fSopenharmony_ciWMError WindowAgent::NotifyDestroy(void)
211e0dac50fSopenharmony_ci{
212e0dac50fSopenharmony_ci    if (window_ == nullptr) {
213e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
214e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
215e0dac50fSopenharmony_ci    }
216e0dac50fSopenharmony_ci    window_->NotifyDestroy();
217e0dac50fSopenharmony_ci    return WMError::WM_OK;
218e0dac50fSopenharmony_ci}
219e0dac50fSopenharmony_ci
220e0dac50fSopenharmony_ciWMError WindowAgent::NotifyForeground(void)
221e0dac50fSopenharmony_ci{
222e0dac50fSopenharmony_ci    if (window_ == nullptr) {
223e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
224e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
225e0dac50fSopenharmony_ci    }
226e0dac50fSopenharmony_ci    window_->NotifyForeground();
227e0dac50fSopenharmony_ci    return WMError::WM_OK;
228e0dac50fSopenharmony_ci}
229e0dac50fSopenharmony_ci
230e0dac50fSopenharmony_ciWMError WindowAgent::NotifyBackground(void)
231e0dac50fSopenharmony_ci{
232e0dac50fSopenharmony_ci    if (window_ == nullptr) {
233e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
234e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
235e0dac50fSopenharmony_ci    }
236e0dac50fSopenharmony_ci    window_->NotifyBackground();
237e0dac50fSopenharmony_ci    return WMError::WM_OK;
238e0dac50fSopenharmony_ci}
239e0dac50fSopenharmony_ci
240e0dac50fSopenharmony_ciWMError WindowAgent::NotifyWindowClientPointUp(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
241e0dac50fSopenharmony_ci{
242e0dac50fSopenharmony_ci    if (window_ == nullptr) {
243e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
244e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
245e0dac50fSopenharmony_ci    }
246e0dac50fSopenharmony_ci    window_->ConsumePointerEvent(pointerEvent);
247e0dac50fSopenharmony_ci    return WMError::WM_OK;
248e0dac50fSopenharmony_ci}
249e0dac50fSopenharmony_ci
250e0dac50fSopenharmony_civoid WindowAgent::ConsumeKeyEvent(std::shared_ptr<MMI::KeyEvent> event)
251e0dac50fSopenharmony_ci{
252e0dac50fSopenharmony_ci    if (window_ == nullptr) {
253e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
254e0dac50fSopenharmony_ci        return;
255e0dac50fSopenharmony_ci    }
256e0dac50fSopenharmony_ci    window_->ConsumeKeyEvent(event);
257e0dac50fSopenharmony_ci}
258e0dac50fSopenharmony_ci
259e0dac50fSopenharmony_civoid WindowAgent::NotifyForegroundInteractiveStatus(bool interactive)
260e0dac50fSopenharmony_ci{
261e0dac50fSopenharmony_ci    if (window_ == nullptr) {
262e0dac50fSopenharmony_ci        WLOGFE("window_ is nullptr");
263e0dac50fSopenharmony_ci        return;
264e0dac50fSopenharmony_ci    }
265e0dac50fSopenharmony_ci    window_->NotifyForegroundInteractiveStatus(interactive);
266e0dac50fSopenharmony_ci}
267e0dac50fSopenharmony_ci
268e0dac50fSopenharmony_ci} // namespace Rosen
269e0dac50fSopenharmony_ci} // namespace OHOS
270