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 "zidl/window_stub.h"
17e0dac50fSopenharmony_ci#include <vector>
18e0dac50fSopenharmony_ci#include "ipc_skeleton.h"
19e0dac50fSopenharmony_ci#include <key_event.h>
20e0dac50fSopenharmony_ci#include "pointer_event.h"
21e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
22e0dac50fSopenharmony_ci#include <transaction/rs_transaction.h>
23e0dac50fSopenharmony_ci
24e0dac50fSopenharmony_cinamespace OHOS {
25e0dac50fSopenharmony_cinamespace Rosen {
26e0dac50fSopenharmony_cinamespace {
27e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowStub"};
28e0dac50fSopenharmony_ci}
29e0dac50fSopenharmony_ci
30e0dac50fSopenharmony_ciint WindowStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
31e0dac50fSopenharmony_ci{
32e0dac50fSopenharmony_ci    if (staticDestroyMonitor_.IsDestroyed()) {
33e0dac50fSopenharmony_ci        WLOGFE("Main thread finished, static data has been destroyed");
34e0dac50fSopenharmony_ci        return ERR_INVALID_STATE;
35e0dac50fSopenharmony_ci    }
36e0dac50fSopenharmony_ci    if (data.ReadInterfaceToken() != GetDescriptor()) {
37e0dac50fSopenharmony_ci        WLOGFE("InterfaceToken check failed");
38e0dac50fSopenharmony_ci        return ERR_TRANSACTION_FAILED;
39e0dac50fSopenharmony_ci    }
40e0dac50fSopenharmony_ci    WindowMessage msgId = static_cast<WindowMessage>(code);
41e0dac50fSopenharmony_ci    switch (msgId) {
42e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_WINDOW_RECT: {
43e0dac50fSopenharmony_ci            int32_t posX = 0;
44e0dac50fSopenharmony_ci            int32_t posY = 0;
45e0dac50fSopenharmony_ci            uint32_t width = 0;
46e0dac50fSopenharmony_ci            uint32_t height = 0;
47e0dac50fSopenharmony_ci            if (!data.ReadInt32(posX) || !data.ReadInt32(posY) || !data.ReadUint32(width) || !data.ReadUint32(height)) {
48e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read rect failed");
49e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
50e0dac50fSopenharmony_ci            }
51e0dac50fSopenharmony_ci            Rect rect { posX, posY, width, height };
52e0dac50fSopenharmony_ci            bool decoStatus = false;
53e0dac50fSopenharmony_ci            if (!data.ReadBool(decoStatus)) {
54e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read decoStatus failed");
55e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
56e0dac50fSopenharmony_ci            }
57e0dac50fSopenharmony_ci            uint32_t changeReason = 0;
58e0dac50fSopenharmony_ci            if (!data.ReadUint32(changeReason)) {
59e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read changeReason failed");
60e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
61e0dac50fSopenharmony_ci            }
62e0dac50fSopenharmony_ci            if (changeReason < static_cast<uint32_t>(WindowSizeChangeReason::UNDEFINED) ||
63e0dac50fSopenharmony_ci                changeReason > static_cast<uint32_t>(WindowSizeChangeReason::END)) {
64e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "Unknown reason");
65e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
66e0dac50fSopenharmony_ci            }
67e0dac50fSopenharmony_ci            WindowSizeChangeReason reason = static_cast<WindowSizeChangeReason>(changeReason);
68e0dac50fSopenharmony_ci            bool hasRSTransaction = false;
69e0dac50fSopenharmony_ci            if (!data.ReadBool(hasRSTransaction)) {
70e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read hasRSTransaction failed");
71e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
72e0dac50fSopenharmony_ci            }
73e0dac50fSopenharmony_ci            if (hasRSTransaction) {
74e0dac50fSopenharmony_ci                auto rsTransaction = data.ReadParcelable<RSTransaction>();
75e0dac50fSopenharmony_ci                if (!rsTransaction) {
76e0dac50fSopenharmony_ci                    WLOGFE("RSTransaction unMarsh failed");
77e0dac50fSopenharmony_ci                    return -1;
78e0dac50fSopenharmony_ci                }
79e0dac50fSopenharmony_ci                std::shared_ptr<RSTransaction> transaction(rsTransaction);
80e0dac50fSopenharmony_ci                UpdateWindowRect(rect, decoStatus, reason, transaction);
81e0dac50fSopenharmony_ci            } else {
82e0dac50fSopenharmony_ci                UpdateWindowRect(rect, decoStatus, reason);
83e0dac50fSopenharmony_ci            }
84e0dac50fSopenharmony_ci            break;
85e0dac50fSopenharmony_ci        }
86e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_WINDOW_MODE: {
87e0dac50fSopenharmony_ci            uint32_t windowMode = 0;
88e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowMode)) {
89e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read windowMode failed");
90e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
91e0dac50fSopenharmony_ci            }
92e0dac50fSopenharmony_ci            WindowMode mode = static_cast<WindowMode>(windowMode);
93e0dac50fSopenharmony_ci            UpdateWindowMode(mode);
94e0dac50fSopenharmony_ci            break;
95e0dac50fSopenharmony_ci        }
96e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_MODE_SUPPORT_INFO: {
97e0dac50fSopenharmony_ci            uint32_t modeSupportInfo = 0;
98e0dac50fSopenharmony_ci            if (!data.ReadUint32(modeSupportInfo)) {
99e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read modeSupportInfo failed");
100e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
101e0dac50fSopenharmony_ci            }
102e0dac50fSopenharmony_ci            UpdateWindowModeSupportInfo(modeSupportInfo);
103e0dac50fSopenharmony_ci            break;
104e0dac50fSopenharmony_ci        }
105e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_FOCUS_STATUS: {
106e0dac50fSopenharmony_ci            bool focused = data.ReadBool();
107e0dac50fSopenharmony_ci            UpdateFocusStatus(focused);
108e0dac50fSopenharmony_ci            break;
109e0dac50fSopenharmony_ci        }
110e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_AVOID_AREA: {
111e0dac50fSopenharmony_ci            sptr<AvoidArea> avoidArea = data.ReadStrongParcelable<AvoidArea>();
112e0dac50fSopenharmony_ci            if (avoidArea == nullptr) {
113e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
114e0dac50fSopenharmony_ci            }
115e0dac50fSopenharmony_ci            uint32_t type = 0;
116e0dac50fSopenharmony_ci            if (!data.ReadUint32(type) ||
117e0dac50fSopenharmony_ci                type < static_cast<uint32_t>(AvoidAreaType::TYPE_SYSTEM) ||
118e0dac50fSopenharmony_ci                type > static_cast<uint32_t>(AvoidAreaType::TYPE_NAVIGATION_INDICATOR)) {
119e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
120e0dac50fSopenharmony_ci            }
121e0dac50fSopenharmony_ci            UpdateAvoidArea(avoidArea, static_cast<AvoidAreaType>(type));
122e0dac50fSopenharmony_ci            break;
123e0dac50fSopenharmony_ci        }
124e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_WINDOW_STATE: {
125e0dac50fSopenharmony_ci            uint32_t state = 0;
126e0dac50fSopenharmony_ci            if (!data.ReadUint32(state)) {
127e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "read state error");
128e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
129e0dac50fSopenharmony_ci            }
130e0dac50fSopenharmony_ci            UpdateWindowState(static_cast<WindowState>(state));
131e0dac50fSopenharmony_ci            break;
132e0dac50fSopenharmony_ci        }
133e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_DRAG_EVENT: {
134e0dac50fSopenharmony_ci            PointInfo point = {0, 0};
135e0dac50fSopenharmony_ci            if (!data.ReadInt32(point.x) || !data.ReadInt32(point.y)) {
136e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
137e0dac50fSopenharmony_ci            }
138e0dac50fSopenharmony_ci            uint32_t eventType = 0;
139e0dac50fSopenharmony_ci            if (!data.ReadUint32(eventType) || eventType > static_cast<uint32_t>(DragEvent::DRAG_EVENT_END)) {
140e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
141e0dac50fSopenharmony_ci            }
142e0dac50fSopenharmony_ci            DragEvent event = static_cast<DragEvent>(eventType);
143e0dac50fSopenharmony_ci            UpdateWindowDragInfo(point, event);
144e0dac50fSopenharmony_ci            break;
145e0dac50fSopenharmony_ci        }
146e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_DISPLAY_ID: {
147e0dac50fSopenharmony_ci            uint64_t from = 0;
148e0dac50fSopenharmony_ci            uint64_t to = 0;
149e0dac50fSopenharmony_ci            if (!data.ReadUint64(from) || !data.ReadUint64(to)) {
150e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "read display id error");
151e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
152e0dac50fSopenharmony_ci            }
153e0dac50fSopenharmony_ci            UpdateDisplayId(from, to);
154e0dac50fSopenharmony_ci            break;
155e0dac50fSopenharmony_ci        }
156e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA: {
157e0dac50fSopenharmony_ci            sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
158e0dac50fSopenharmony_ci            if (info == nullptr) {
159e0dac50fSopenharmony_ci                WLOGFE("OccupiedAreaChangeInfo is null");
160e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
161e0dac50fSopenharmony_ci            }
162e0dac50fSopenharmony_ci            bool hasRSTransaction = data.ReadBool();
163e0dac50fSopenharmony_ci            if (hasRSTransaction) {
164e0dac50fSopenharmony_ci                auto rsTransaction = data.ReadParcelable<RSTransaction>();
165e0dac50fSopenharmony_ci                if (!rsTransaction) {
166e0dac50fSopenharmony_ci                    WLOGFE("RSTransaction unMarsh failed");
167e0dac50fSopenharmony_ci                    return ERR_INVALID_DATA;
168e0dac50fSopenharmony_ci                }
169e0dac50fSopenharmony_ci                std::shared_ptr<RSTransaction> transaction(rsTransaction);
170e0dac50fSopenharmony_ci                UpdateOccupiedAreaChangeInfo(info, transaction);
171e0dac50fSopenharmony_ci            } else {
172e0dac50fSopenharmony_ci                UpdateOccupiedAreaChangeInfo(info);
173e0dac50fSopenharmony_ci            }
174e0dac50fSopenharmony_ci            break;
175e0dac50fSopenharmony_ci        }
176e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA_AND_RECT: {
177e0dac50fSopenharmony_ci            sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
178e0dac50fSopenharmony_ci            if (info == nullptr) {
179e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "OccupiedAreaChangeInfo is null");
180e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
181e0dac50fSopenharmony_ci            }
182e0dac50fSopenharmony_ci            int32_t posX = 0;
183e0dac50fSopenharmony_ci            int32_t posY = 0;
184e0dac50fSopenharmony_ci            uint32_t width = 0;
185e0dac50fSopenharmony_ci            uint32_t height = 0;
186e0dac50fSopenharmony_ci            if (!data.ReadInt32(posX) || !data.ReadInt32(posY) ||
187e0dac50fSopenharmony_ci                !data.ReadUint32(width) || !data.ReadUint32(height)) {
188e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "Rect value read failed.");
189e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
190e0dac50fSopenharmony_ci            }
191e0dac50fSopenharmony_ci            struct Rect rect { posX, posY, width, height };
192e0dac50fSopenharmony_ci            bool hasRSTransaction = false;
193e0dac50fSopenharmony_ci            if (!data.ReadBool(hasRSTransaction)) {
194e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "hasRSTransaction value read failed.");
195e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
196e0dac50fSopenharmony_ci            }
197e0dac50fSopenharmony_ci            if (hasRSTransaction) {
198e0dac50fSopenharmony_ci                auto rsTransaction = data.ReadParcelable<RSTransaction>();
199e0dac50fSopenharmony_ci                if (!rsTransaction) {
200e0dac50fSopenharmony_ci                    TLOGE(WmsLogTag::WMS_KEYBOARD, "RSTransaction unMarsh failed");
201e0dac50fSopenharmony_ci                    return ERR_INVALID_DATA;
202e0dac50fSopenharmony_ci                }
203e0dac50fSopenharmony_ci                std::shared_ptr<RSTransaction> transaction(rsTransaction);
204e0dac50fSopenharmony_ci                UpdateOccupiedAreaAndRect(info, rect, transaction);
205e0dac50fSopenharmony_ci            } else {
206e0dac50fSopenharmony_ci                UpdateOccupiedAreaAndRect(info, rect);
207e0dac50fSopenharmony_ci            }
208e0dac50fSopenharmony_ci            break;
209e0dac50fSopenharmony_ci        }
210e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_ACTIVE_STATUS: {
211e0dac50fSopenharmony_ci            bool isActive = data.ReadBool();
212e0dac50fSopenharmony_ci            UpdateActiveStatus(isActive);
213e0dac50fSopenharmony_ci            break;
214e0dac50fSopenharmony_ci        }
215e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_GET_WINDOW_PROPERTY: {
216e0dac50fSopenharmony_ci            auto property = GetWindowProperty();
217e0dac50fSopenharmony_ci            reply.WriteParcelable(property.GetRefPtr());
218e0dac50fSopenharmony_ci            break;
219e0dac50fSopenharmony_ci        }
220e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_OUTSIDE_PRESSED: {
221e0dac50fSopenharmony_ci            NotifyTouchOutside();
222e0dac50fSopenharmony_ci            break;
223e0dac50fSopenharmony_ci        }
224e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_SCREEN_SHOT: {
225e0dac50fSopenharmony_ci            NotifyScreenshot();
226e0dac50fSopenharmony_ci            break;
227e0dac50fSopenharmony_ci        }
228e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_DESTROY: {
229e0dac50fSopenharmony_ci            NotifyDestroy();
230e0dac50fSopenharmony_ci            break;
231e0dac50fSopenharmony_ci        }
232e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND: {
233e0dac50fSopenharmony_ci            NotifyForeground();
234e0dac50fSopenharmony_ci            break;
235e0dac50fSopenharmony_ci        }
236e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_BACKGROUND: {
237e0dac50fSopenharmony_ci            NotifyBackground();
238e0dac50fSopenharmony_ci            break;
239e0dac50fSopenharmony_ci        }
240e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_DUMP_INFO: {
241e0dac50fSopenharmony_ci            std::vector<std::string> params;
242e0dac50fSopenharmony_ci            if (!data.ReadStringVector(&params)) {
243e0dac50fSopenharmony_ci                WLOGFE("Fail to read params");
244e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
245e0dac50fSopenharmony_ci            }
246e0dac50fSopenharmony_ci            DumpInfo(params);
247e0dac50fSopenharmony_ci            break;
248e0dac50fSopenharmony_ci        }
249e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_CLIENT_POINT_UP: {
250e0dac50fSopenharmony_ci            auto pointerEvent = MMI::PointerEvent::Create();
251e0dac50fSopenharmony_ci            if (!pointerEvent || !pointerEvent->ReadFromParcel(data)) {
252e0dac50fSopenharmony_ci                WLOGFE("Read Pointer Event failed");
253e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
254e0dac50fSopenharmony_ci            }
255e0dac50fSopenharmony_ci            NotifyWindowClientPointUp(pointerEvent);
256e0dac50fSopenharmony_ci            break;
257e0dac50fSopenharmony_ci        }
258e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_UPDATE_ZOOM_TRANSFORM: {
259e0dac50fSopenharmony_ci            Transform trans;
260e0dac50fSopenharmony_ci            trans.Unmarshalling(data);
261e0dac50fSopenharmony_ci            bool isDisplayZoomOn = data.ReadBool();
262e0dac50fSopenharmony_ci            UpdateZoomTransform(trans, isDisplayZoomOn);
263e0dac50fSopenharmony_ci            break;
264e0dac50fSopenharmony_ci        }
265e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_RESTORE_SPLIT_WINDOW_MODE: {
266e0dac50fSopenharmony_ci            uint32_t splitWindowMode = 0;
267e0dac50fSopenharmony_ci            if (!data.ReadUint32(splitWindowMode)) {
268e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read splitWindowMode failed");
269e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
270e0dac50fSopenharmony_ci            }
271e0dac50fSopenharmony_ci            RestoreSplitWindowMode(splitWindowMode);
272e0dac50fSopenharmony_ci            break;
273e0dac50fSopenharmony_ci        }
274e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_CONSUME_KEY_EVENT: {
275e0dac50fSopenharmony_ci            auto event = MMI::KeyEvent::Create();
276e0dac50fSopenharmony_ci            if (!event || !event->ReadFromParcel(data)) {
277e0dac50fSopenharmony_ci                WLOGFE("Read Pointer Event failed");
278e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
279e0dac50fSopenharmony_ci            }
280e0dac50fSopenharmony_ci            ConsumeKeyEvent(event);
281e0dac50fSopenharmony_ci            break;
282e0dac50fSopenharmony_ci        }
283e0dac50fSopenharmony_ci        case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS: {
284e0dac50fSopenharmony_ci            bool interactive = data.ReadBool();
285e0dac50fSopenharmony_ci            NotifyForegroundInteractiveStatus(interactive);
286e0dac50fSopenharmony_ci            break;
287e0dac50fSopenharmony_ci        }
288e0dac50fSopenharmony_ci        default:
289e0dac50fSopenharmony_ci            WLOGFW("unknown transaction code %{public}d", code);
290e0dac50fSopenharmony_ci            return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
291e0dac50fSopenharmony_ci    }
292e0dac50fSopenharmony_ci    return ERR_NONE;
293e0dac50fSopenharmony_ci}
294e0dac50fSopenharmony_ci} // namespace Rosen
295e0dac50fSopenharmony_ci} // namespace OHOS
296