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_manager_stub.h"
17e0dac50fSopenharmony_ci#include <ipc_skeleton.h>
18e0dac50fSopenharmony_ci#include <key_event.h>
19e0dac50fSopenharmony_ci#include <rs_iwindow_animation_controller.h>
20e0dac50fSopenharmony_ci#include <rs_window_animation_target.h>
21e0dac50fSopenharmony_ci
22e0dac50fSopenharmony_ci#include "marshalling_helper.h"
23e0dac50fSopenharmony_ci#include "memory_guard.h"
24e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_cinamespace OHOS {
27e0dac50fSopenharmony_cinamespace Rosen {
28e0dac50fSopenharmony_cinamespace {
29e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManagerStub"};
30e0dac50fSopenharmony_ci}
31e0dac50fSopenharmony_ci
32e0dac50fSopenharmony_ciint32_t WindowManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
33e0dac50fSopenharmony_ci    MessageOption& option)
34e0dac50fSopenharmony_ci{
35e0dac50fSopenharmony_ci    MemoryGuard cacheGuard;
36e0dac50fSopenharmony_ci    if (data.ReadInterfaceToken() != GetDescriptor()) {
37e0dac50fSopenharmony_ci        WLOGFE("InterfaceToken check failed");
38e0dac50fSopenharmony_ci        return ERR_TRANSACTION_FAILED;
39e0dac50fSopenharmony_ci    }
40e0dac50fSopenharmony_ci    auto msgId = static_cast<WindowManagerMessage>(code);
41e0dac50fSopenharmony_ci    switch (msgId) {
42e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_CREATE_WINDOW: {
43e0dac50fSopenharmony_ci            sptr<IRemoteObject> windowObject = data.ReadRemoteObject();
44e0dac50fSopenharmony_ci            sptr<IWindow> windowProxy = iface_cast<IWindow>(windowObject);
45e0dac50fSopenharmony_ci            sptr<WindowProperty> windowProperty = data.ReadStrongParcelable<WindowProperty>();
46e0dac50fSopenharmony_ci            std::shared_ptr<RSSurfaceNode> surfaceNode = RSSurfaceNode::Unmarshalling(data);
47e0dac50fSopenharmony_ci            uint32_t windowId;
48e0dac50fSopenharmony_ci            sptr<IRemoteObject> token = nullptr;
49e0dac50fSopenharmony_ci            if (windowProperty && windowProperty->GetTokenState()) {
50e0dac50fSopenharmony_ci                token = data.ReadRemoteObject();
51e0dac50fSopenharmony_ci            }
52e0dac50fSopenharmony_ci            WMError errCode = CreateWindow(windowProxy, windowProperty, surfaceNode, windowId, token);
53e0dac50fSopenharmony_ci            reply.WriteUint32(windowId);
54e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
55e0dac50fSopenharmony_ci            if (windowProperty) {
56e0dac50fSopenharmony_ci                reply.WriteUint32(windowProperty->GetWindowFlags());
57e0dac50fSopenharmony_ci                reply.WriteUint32(windowProperty->GetApiCompatibleVersion());
58e0dac50fSopenharmony_ci            }
59e0dac50fSopenharmony_ci            break;
60e0dac50fSopenharmony_ci        }
61e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_ADD_WINDOW: {
62e0dac50fSopenharmony_ci            sptr<WindowProperty> windowProperty = data.ReadStrongParcelable<WindowProperty>();
63e0dac50fSopenharmony_ci            WMError errCode = AddWindow(windowProperty);
64e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
65e0dac50fSopenharmony_ci            break;
66e0dac50fSopenharmony_ci        }
67e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_REMOVE_WINDOW: {
68e0dac50fSopenharmony_ci            uint32_t windowId = 0;
69e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
70e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LIFE, "TRANS_ID_REMOVE_WINDOW Read windowId failed.");
71e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
72e0dac50fSopenharmony_ci            }
73e0dac50fSopenharmony_ci            bool isFromInnerkits = false;
74e0dac50fSopenharmony_ci            if (!data.ReadBool(isFromInnerkits)) {
75e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LIFE, "TRANS_ID_REMOVE_WINDOW Read isFromInnerkits failed.");
76e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
77e0dac50fSopenharmony_ci            }
78e0dac50fSopenharmony_ci            WMError errCode = RemoveWindow(windowId, isFromInnerkits);
79e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
80e0dac50fSopenharmony_ci            break;
81e0dac50fSopenharmony_ci        }
82e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_DESTROY_WINDOW: {
83e0dac50fSopenharmony_ci            uint32_t windowId = 0;
84e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
85e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LIFE, "TRANS_ID_DESTROY_WINDOW Read windowId failed.");
86e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
87e0dac50fSopenharmony_ci            }
88e0dac50fSopenharmony_ci            WMError errCode = DestroyWindow(windowId);
89e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
90e0dac50fSopenharmony_ci            break;
91e0dac50fSopenharmony_ci        }
92e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_REQUEST_FOCUS: {
93e0dac50fSopenharmony_ci            uint32_t windowId = 0;
94e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
95e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_FOCUS, "read focus failed");
96e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
97e0dac50fSopenharmony_ci            }
98e0dac50fSopenharmony_ci            WMError errCode = RequestFocus(windowId);
99e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
100e0dac50fSopenharmony_ci            break;
101e0dac50fSopenharmony_ci        }
102e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_AVOID_AREA: {
103e0dac50fSopenharmony_ci            uint32_t windowId = data.ReadUint32();
104e0dac50fSopenharmony_ci            uint32_t avoidAreaTypeId = 0;
105e0dac50fSopenharmony_ci            if (!data.ReadUint32(avoidAreaTypeId) ||
106e0dac50fSopenharmony_ci                avoidAreaTypeId < static_cast<uint32_t>(AvoidAreaType::TYPE_SYSTEM) ||
107e0dac50fSopenharmony_ci                avoidAreaTypeId > static_cast<uint32_t>(AvoidAreaType::TYPE_NAVIGATION_INDICATOR)) {
108e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
109e0dac50fSopenharmony_ci            }
110e0dac50fSopenharmony_ci            auto avoidAreaType = static_cast<AvoidAreaType>(avoidAreaTypeId);
111e0dac50fSopenharmony_ci            AvoidArea avoidArea = GetAvoidAreaByType(windowId, avoidAreaType);
112e0dac50fSopenharmony_ci            reply.WriteParcelable(&avoidArea);
113e0dac50fSopenharmony_ci            break;
114e0dac50fSopenharmony_ci        }
115e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_REGISTER_WINDOW_MANAGER_AGENT: {
116e0dac50fSopenharmony_ci            uint32_t windowType = 0;
117e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowType) ||
118e0dac50fSopenharmony_ci                windowType >= static_cast<uint32_t>(WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_END)) {
119e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
120e0dac50fSopenharmony_ci            }
121e0dac50fSopenharmony_ci            auto type = static_cast<WindowManagerAgentType>(windowType);
122e0dac50fSopenharmony_ci            sptr<IRemoteObject> windowManagerAgentObject = data.ReadRemoteObject();
123e0dac50fSopenharmony_ci            if (windowManagerAgentObject == nullptr) {
124e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
125e0dac50fSopenharmony_ci            }
126e0dac50fSopenharmony_ci            sptr<IWindowManagerAgent> windowManagerAgentProxy =
127e0dac50fSopenharmony_ci                iface_cast<IWindowManagerAgent>(windowManagerAgentObject);
128e0dac50fSopenharmony_ci            WMError errCode = RegisterWindowManagerAgent(type, windowManagerAgentProxy);
129e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
130e0dac50fSopenharmony_ci            break;
131e0dac50fSopenharmony_ci        }
132e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_UNREGISTER_WINDOW_MANAGER_AGENT: {
133e0dac50fSopenharmony_ci            uint32_t windowType = 0;
134e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowType) ||
135e0dac50fSopenharmony_ci                windowType >= static_cast<uint32_t>(WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_END)) {
136e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
137e0dac50fSopenharmony_ci            }
138e0dac50fSopenharmony_ci            auto type = static_cast<WindowManagerAgentType>(windowType);
139e0dac50fSopenharmony_ci            sptr<IRemoteObject> windowManagerAgentObject = data.ReadRemoteObject();
140e0dac50fSopenharmony_ci            if (windowManagerAgentObject == nullptr) {
141e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
142e0dac50fSopenharmony_ci            }
143e0dac50fSopenharmony_ci            sptr<IWindowManagerAgent> windowManagerAgentProxy =
144e0dac50fSopenharmony_ci                iface_cast<IWindowManagerAgent>(windowManagerAgentObject);
145e0dac50fSopenharmony_ci            WMError errCode = UnregisterWindowManagerAgent(type, windowManagerAgentProxy);
146e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
147e0dac50fSopenharmony_ci            break;
148e0dac50fSopenharmony_ci        }
149e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_NOTIFY_READY_MOVE_OR_DRAG: {
150e0dac50fSopenharmony_ci            uint32_t windowId = 0;
151e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
152e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
153e0dac50fSopenharmony_ci            }
154e0dac50fSopenharmony_ci            sptr<WindowProperty> windowProperty = data.ReadStrongParcelable<WindowProperty>();
155e0dac50fSopenharmony_ci            if (windowProperty == nullptr) {
156e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
157e0dac50fSopenharmony_ci            }
158e0dac50fSopenharmony_ci            sptr<MoveDragProperty> moveDragProperty = data.ReadStrongParcelable<MoveDragProperty>();
159e0dac50fSopenharmony_ci            if (moveDragProperty == nullptr) {
160e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
161e0dac50fSopenharmony_ci            }
162e0dac50fSopenharmony_ci            NotifyServerReadyToMoveOrDrag(windowId, windowProperty, moveDragProperty);
163e0dac50fSopenharmony_ci            break;
164e0dac50fSopenharmony_ci        }
165e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_PROCESS_POINT_DOWN: {
166e0dac50fSopenharmony_ci            uint32_t windowId = 0;
167e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
168e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
169e0dac50fSopenharmony_ci            }
170e0dac50fSopenharmony_ci            bool isPointDown = false;
171e0dac50fSopenharmony_ci            if (!data.ReadBool(isPointDown)) {
172e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
173e0dac50fSopenharmony_ci            }
174e0dac50fSopenharmony_ci            ProcessPointDown(windowId, isPointDown);
175e0dac50fSopenharmony_ci            break;
176e0dac50fSopenharmony_ci        }
177e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_PROCESS_POINT_UP: {
178e0dac50fSopenharmony_ci            uint32_t windowId = 0;
179e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
180e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
181e0dac50fSopenharmony_ci            }
182e0dac50fSopenharmony_ci            ProcessPointUp(windowId);
183e0dac50fSopenharmony_ci            break;
184e0dac50fSopenharmony_ci        }
185e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_TOP_WINDOW_ID: {
186e0dac50fSopenharmony_ci            uint32_t mainWinId = 0;
187e0dac50fSopenharmony_ci            if (!data.ReadUint32(mainWinId)) {
188e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_HIERARCHY, "read mainWinId failed");
189e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
190e0dac50fSopenharmony_ci            }
191e0dac50fSopenharmony_ci            uint32_t topWinId = 0;
192e0dac50fSopenharmony_ci            WMError errCode = GetTopWindowId(mainWinId, topWinId);
193e0dac50fSopenharmony_ci            reply.WriteUint32(topWinId);
194e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
195e0dac50fSopenharmony_ci            break;
196e0dac50fSopenharmony_ci        }
197e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_MINIMIZE_ALL_APP_WINDOWS: {
198e0dac50fSopenharmony_ci            uint64_t displayId = 0;
199e0dac50fSopenharmony_ci            if (!data.ReadUint64(displayId)) {
200e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LIFE, "Read displayID failed.");
201e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
202e0dac50fSopenharmony_ci            }
203e0dac50fSopenharmony_ci            WMError errCode = MinimizeAllAppWindows(displayId);
204e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
205e0dac50fSopenharmony_ci            break;
206e0dac50fSopenharmony_ci        }
207e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_TOGGLE_SHOWN_STATE_FOR_ALL_APP_WINDOWS: {
208e0dac50fSopenharmony_ci            WMError errCode = ToggleShownStateForAllAppWindows();
209e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
210e0dac50fSopenharmony_ci            break;
211e0dac50fSopenharmony_ci        }
212e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_UPDATE_LAYOUT_MODE: {
213e0dac50fSopenharmony_ci            uint32_t layoutMode = 0;
214e0dac50fSopenharmony_ci            if (!data.ReadUint32(layoutMode)) {
215e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_LAYOUT, "read layoutMode failed");
216e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
217e0dac50fSopenharmony_ci            }
218e0dac50fSopenharmony_ci            auto mode = static_cast<WindowLayoutMode>(layoutMode);
219e0dac50fSopenharmony_ci            WMError errCode = SetWindowLayoutMode(mode);
220e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
221e0dac50fSopenharmony_ci            break;
222e0dac50fSopenharmony_ci        }
223e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_UPDATE_PROPERTY: {
224e0dac50fSopenharmony_ci            uint32_t actionValue = 0;
225e0dac50fSopenharmony_ci            if (!data.ReadUint32(actionValue)) {
226e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "read action error");
227e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
228e0dac50fSopenharmony_ci            }
229e0dac50fSopenharmony_ci            auto action = static_cast<PropertyChangeAction>(actionValue);
230e0dac50fSopenharmony_ci            sptr<WindowProperty> windowProperty = new WindowProperty();
231e0dac50fSopenharmony_ci            windowProperty->Read(data, action);
232e0dac50fSopenharmony_ci            WMError errCode = UpdateProperty(windowProperty, action);
233e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
234e0dac50fSopenharmony_ci            break;
235e0dac50fSopenharmony_ci        }
236e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_ACCESSIBILITY_WINDOW_INFO_ID: {
237e0dac50fSopenharmony_ci            std::vector<sptr<AccessibilityWindowInfo>> infos;
238e0dac50fSopenharmony_ci            WMError errCode = GetAccessibilityWindowInfo(infos);
239e0dac50fSopenharmony_ci            if (!MarshallingHelper::MarshallingVectorParcelableObj<AccessibilityWindowInfo>(reply, infos)) {
240e0dac50fSopenharmony_ci                WLOGFE("Write accessibility window infos failed");
241e0dac50fSopenharmony_ci                return -1;
242e0dac50fSopenharmony_ci            }
243e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
244e0dac50fSopenharmony_ci            break;
245e0dac50fSopenharmony_ci        }
246e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_UNRELIABLE_WINDOW_INFO_ID: {
247e0dac50fSopenharmony_ci            int32_t windowId = 0;
248e0dac50fSopenharmony_ci            if (!data.ReadInt32(windowId)) {
249e0dac50fSopenharmony_ci                WLOGFE("Failed to readInt32 windowId");
250e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
251e0dac50fSopenharmony_ci            }
252e0dac50fSopenharmony_ci            std::vector<sptr<UnreliableWindowInfo>> infos;
253e0dac50fSopenharmony_ci            WMError errCode = GetUnreliableWindowInfo(windowId, infos);
254e0dac50fSopenharmony_ci            if (!MarshallingHelper::MarshallingVectorParcelableObj<UnreliableWindowInfo>(reply, infos)) {
255e0dac50fSopenharmony_ci                WLOGFE("Write unreliable window infos failed");
256e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
257e0dac50fSopenharmony_ci            }
258e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
259e0dac50fSopenharmony_ci            break;
260e0dac50fSopenharmony_ci        }
261e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_VISIBILITY_WINDOW_INFO_ID: {
262e0dac50fSopenharmony_ci            std::vector<sptr<WindowVisibilityInfo>> infos;
263e0dac50fSopenharmony_ci            WMError errCode = GetVisibilityWindowInfo(infos);
264e0dac50fSopenharmony_ci            if (!MarshallingHelper::MarshallingVectorParcelableObj<WindowVisibilityInfo>(reply, infos)) {
265e0dac50fSopenharmony_ci                WLOGFE("Write visibility window infos failed");
266e0dac50fSopenharmony_ci                return -1;
267e0dac50fSopenharmony_ci            }
268e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
269e0dac50fSopenharmony_ci            break;
270e0dac50fSopenharmony_ci        }
271e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_ANIMATION_SET_CONTROLLER: {
272e0dac50fSopenharmony_ci            sptr<IRemoteObject> controllerObject = data.ReadRemoteObject();
273e0dac50fSopenharmony_ci            if (controllerObject == nullptr) {
274e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "Read animation controller object failed");
275e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
276e0dac50fSopenharmony_ci            }
277e0dac50fSopenharmony_ci            sptr<RSIWindowAnimationController> controller = iface_cast<RSIWindowAnimationController>(controllerObject);
278e0dac50fSopenharmony_ci            WMError errCode = SetWindowAnimationController(controller);
279e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
280e0dac50fSopenharmony_ci            break;
281e0dac50fSopenharmony_ci        }
282e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_SYSTEM_CONFIG: {
283e0dac50fSopenharmony_ci            SystemConfig config;
284e0dac50fSopenharmony_ci            WMError errCode = GetSystemConfig(config);
285e0dac50fSopenharmony_ci            reply.WriteParcelable(&config);
286e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
287e0dac50fSopenharmony_ci            break;
288e0dac50fSopenharmony_ci        }
289e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_NOTIFY_WINDOW_TRANSITION: {
290e0dac50fSopenharmony_ci            sptr<WindowTransitionInfo> from = data.ReadParcelable<WindowTransitionInfo>();
291e0dac50fSopenharmony_ci            sptr<WindowTransitionInfo> to = data.ReadParcelable<WindowTransitionInfo>();
292e0dac50fSopenharmony_ci            bool isFromClient = false;
293e0dac50fSopenharmony_ci            if (!data.ReadBool(isFromClient)) {
294e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
295e0dac50fSopenharmony_ci            }
296e0dac50fSopenharmony_ci            WMError errCode = NotifyWindowTransition(from, to, isFromClient);
297e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
298e0dac50fSopenharmony_ci            break;
299e0dac50fSopenharmony_ci        }
300e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_FULLSCREEN_AND_SPLIT_HOT_ZONE: {
301e0dac50fSopenharmony_ci            DisplayId displayId = 0;
302e0dac50fSopenharmony_ci            if (!data.ReadUint64(displayId)) {
303e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_FOCUS, "read displayId failed");
304e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
305e0dac50fSopenharmony_ci            }
306e0dac50fSopenharmony_ci            ModeChangeHotZones hotZones = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
307e0dac50fSopenharmony_ci            WMError errCode = GetModeChangeHotZones(displayId, hotZones);
308e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
309e0dac50fSopenharmony_ci
310e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.fullscreen_.posX_);
311e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.fullscreen_.posY_);
312e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.fullscreen_.width_);
313e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.fullscreen_.height_);
314e0dac50fSopenharmony_ci
315e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.primary_.posX_);
316e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.primary_.posY_);
317e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.primary_.width_);
318e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.primary_.height_);
319e0dac50fSopenharmony_ci
320e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.secondary_.posX_);
321e0dac50fSopenharmony_ci            reply.WriteInt32(hotZones.secondary_.posY_);
322e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.secondary_.width_);
323e0dac50fSopenharmony_ci            reply.WriteUint32(hotZones.secondary_.height_);
324e0dac50fSopenharmony_ci            break;
325e0dac50fSopenharmony_ci        }
326e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_ANIMATION_CALLBACK: {
327e0dac50fSopenharmony_ci            std::vector<uint32_t> windowIds;
328e0dac50fSopenharmony_ci            data.ReadUInt32Vector(&windowIds);
329e0dac50fSopenharmony_ci            bool isAnimated = data.ReadBool();
330e0dac50fSopenharmony_ci            sptr<RSIWindowAnimationFinishedCallback> finishedCallback = nullptr;
331e0dac50fSopenharmony_ci            MinimizeWindowsByLauncher(windowIds, isAnimated, finishedCallback);
332e0dac50fSopenharmony_ci            if (finishedCallback == nullptr) {
333e0dac50fSopenharmony_ci                if (!reply.WriteBool(false)) {
334e0dac50fSopenharmony_ci                    WLOGFE("finishedCallback is nullptr and failed to write!");
335e0dac50fSopenharmony_ci                    return ERR_INVALID_DATA;
336e0dac50fSopenharmony_ci                }
337e0dac50fSopenharmony_ci            } else {
338e0dac50fSopenharmony_ci                if (!reply.WriteBool(true) || !reply.WriteRemoteObject(finishedCallback->AsObject())) {
339e0dac50fSopenharmony_ci                    WLOGFE("finishedCallback is not nullptr and failed to write!");
340e0dac50fSopenharmony_ci                    return ERR_INVALID_DATA;
341e0dac50fSopenharmony_ci                }
342e0dac50fSopenharmony_ci            }
343e0dac50fSopenharmony_ci            break;
344e0dac50fSopenharmony_ci        }
345e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_UPDATE_AVOIDAREA_LISTENER: {
346e0dac50fSopenharmony_ci            uint32_t windowId = 0;
347e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
348e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
349e0dac50fSopenharmony_ci            }
350e0dac50fSopenharmony_ci            bool haveAvoidAreaListener = false;
351e0dac50fSopenharmony_ci            if (!data.ReadBool(haveAvoidAreaListener)) {
352e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
353e0dac50fSopenharmony_ci            }
354e0dac50fSopenharmony_ci            WMError errCode = UpdateAvoidAreaListener(windowId, haveAvoidAreaListener);
355e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
356e0dac50fSopenharmony_ci            break;
357e0dac50fSopenharmony_ci        }
358e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_UPDATE_RS_TREE: {
359e0dac50fSopenharmony_ci            uint32_t windowId = 0;
360e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
361e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
362e0dac50fSopenharmony_ci            }
363e0dac50fSopenharmony_ci            bool isAdd = false;
364e0dac50fSopenharmony_ci            if (!data.ReadBool(isAdd)) {
365e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
366e0dac50fSopenharmony_ci            }
367e0dac50fSopenharmony_ci            WMError errCode = UpdateRsTree(windowId, isAdd);
368e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
369e0dac50fSopenharmony_ci            break;
370e0dac50fSopenharmony_ci        }
371e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_BIND_DIALOG_TARGET: {
372e0dac50fSopenharmony_ci            uint32_t windowId = data.ReadUint32();
373e0dac50fSopenharmony_ci            sptr<IRemoteObject> targetToken = data.ReadRemoteObject();
374e0dac50fSopenharmony_ci            if (targetToken == nullptr) {
375e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_DIALOG, "Read targetToken object failed!");
376e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
377e0dac50fSopenharmony_ci            }
378e0dac50fSopenharmony_ci            WMError errCode = BindDialogTarget(windowId, targetToken);
379e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
380e0dac50fSopenharmony_ci            break;
381e0dac50fSopenharmony_ci        }
382e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_SET_ANCHOR_AND_SCALE : {
383e0dac50fSopenharmony_ci            int32_t x = 0;
384e0dac50fSopenharmony_ci            int32_t y = 0;
385e0dac50fSopenharmony_ci            if (!data.ReadInt32(x) || !data.ReadInt32(y)) {
386e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
387e0dac50fSopenharmony_ci            }
388e0dac50fSopenharmony_ci            float scale = 0.0f;
389e0dac50fSopenharmony_ci            if (!data.ReadFloat(scale)) {
390e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
391e0dac50fSopenharmony_ci            }
392e0dac50fSopenharmony_ci            SetAnchorAndScale(x, y, scale);
393e0dac50fSopenharmony_ci            break;
394e0dac50fSopenharmony_ci        }
395e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_SET_ANCHOR_OFFSET: {
396e0dac50fSopenharmony_ci            int32_t deltaX = 0;
397e0dac50fSopenharmony_ci            int32_t deltaY = 0;
398e0dac50fSopenharmony_ci            if (!data.ReadInt32(deltaX) || !data.ReadInt32(deltaY)) {
399e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
400e0dac50fSopenharmony_ci            }
401e0dac50fSopenharmony_ci            SetAnchorOffset(deltaX, deltaY);
402e0dac50fSopenharmony_ci            break;
403e0dac50fSopenharmony_ci        }
404e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_OFF_WINDOW_ZOOM: {
405e0dac50fSopenharmony_ci            OffWindowZoom();
406e0dac50fSopenharmony_ci            break;
407e0dac50fSopenharmony_ci        }
408e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_RAISE_WINDOW_Z_ORDER: {
409e0dac50fSopenharmony_ci            uint32_t windowId = 0;
410e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
411e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_HIERARCHY, "read windowId failed");
412e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
413e0dac50fSopenharmony_ci            }
414e0dac50fSopenharmony_ci            WMError errCode = RaiseToAppTop(windowId);
415e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
416e0dac50fSopenharmony_ci            break;
417e0dac50fSopenharmony_ci        }
418e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_SNAPSHOT: {
419e0dac50fSopenharmony_ci            uint32_t windowId = 0;
420e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
421e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "read windowId error");
422e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
423e0dac50fSopenharmony_ci            }
424e0dac50fSopenharmony_ci            std::shared_ptr<Media::PixelMap> pixelMap = GetSnapshot(windowId);
425e0dac50fSopenharmony_ci            reply.WriteParcelable(pixelMap.get());
426e0dac50fSopenharmony_ci            break;
427e0dac50fSopenharmony_ci        }
428e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GESTURE_NAVIGATION_ENABLED: {
429e0dac50fSopenharmony_ci            bool enable = data.ReadBool();
430e0dac50fSopenharmony_ci            WMError errCode = SetGestureNavigationEnabled(enable);
431e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
432e0dac50fSopenharmony_ci            break;
433e0dac50fSopenharmony_ci        }
434e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_SET_WINDOW_GRAVITY: {
435e0dac50fSopenharmony_ci            uint32_t windowId = INVALID_WINDOW_ID;
436e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
437e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "Read windowId failed.");
438e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
439e0dac50fSopenharmony_ci            }
440e0dac50fSopenharmony_ci            uint32_t gravityValue = 0;
441e0dac50fSopenharmony_ci            if (!data.ReadUint32(gravityValue) ||
442e0dac50fSopenharmony_ci                gravityValue < static_cast<uint32_t>(WindowGravity::WINDOW_GRAVITY_FLOAT) ||
443e0dac50fSopenharmony_ci                gravityValue > static_cast<uint32_t>(WindowGravity::WINDOW_GRAVITY_BOTTOM)) {
444e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "Window gravity value read failed, gravityValue: %{public}d",
445e0dac50fSopenharmony_ci                    gravityValue);
446e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
447e0dac50fSopenharmony_ci            }
448e0dac50fSopenharmony_ci            WindowGravity gravity = static_cast<WindowGravity>(gravityValue);
449e0dac50fSopenharmony_ci            uint32_t percent = 0;
450e0dac50fSopenharmony_ci            if (!data.ReadUint32(percent)) {
451e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_KEYBOARD, "Percent read failed.");
452e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
453e0dac50fSopenharmony_ci            }
454e0dac50fSopenharmony_ci            WMError errCode = SetWindowGravity(windowId, gravity, percent);
455e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
456e0dac50fSopenharmony_ci            break;
457e0dac50fSopenharmony_ci        }
458e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_DISPATCH_KEY_EVENT: {
459e0dac50fSopenharmony_ci            uint32_t windowId = 0;
460e0dac50fSopenharmony_ci            if (!data.ReadUint32(windowId)) {
461e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_EVENT, "Read failed!");
462e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
463e0dac50fSopenharmony_ci            }
464e0dac50fSopenharmony_ci            std::shared_ptr<MMI::KeyEvent> event = MMI::KeyEvent::Create();
465e0dac50fSopenharmony_ci            if (event == nullptr) {
466e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::WMS_EVENT, "event is null");
467e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
468e0dac50fSopenharmony_ci            }
469e0dac50fSopenharmony_ci            event->ReadFromParcel(data);
470e0dac50fSopenharmony_ci            DispatchKeyEvent(windowId, event);
471e0dac50fSopenharmony_ci            break;
472e0dac50fSopenharmony_ci        }
473e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_NOTIFY_DUMP_INFO_RESULT: {
474e0dac50fSopenharmony_ci            std::vector<std::string> info;
475e0dac50fSopenharmony_ci            if (!data.ReadStringVector(&info)) {
476e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
477e0dac50fSopenharmony_ci            }
478e0dac50fSopenharmony_ci            NotifyDumpInfoResult(info);
479e0dac50fSopenharmony_ci            break;
480e0dac50fSopenharmony_ci        }
481e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_WINDOW_ANIMATION_TARGETS: {
482e0dac50fSopenharmony_ci            std::vector<uint32_t> missionIds;
483e0dac50fSopenharmony_ci            if (!data.ReadUInt32Vector(&missionIds)) {
484e0dac50fSopenharmony_ci                TLOGE(WmsLogTag::DEFAULT, "Read animation target mission ids failed");
485e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
486e0dac50fSopenharmony_ci            }
487e0dac50fSopenharmony_ci            std::vector<sptr<RSWindowAnimationTarget>> targets;
488e0dac50fSopenharmony_ci            WMError errCode = GetWindowAnimationTargets(missionIds, targets);
489e0dac50fSopenharmony_ci            if (!MarshallingHelper::MarshallingVectorParcelableObj<RSWindowAnimationTarget>(reply, targets)) {
490e0dac50fSopenharmony_ci                WLOGFE("Write window animation targets failed");
491e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
492e0dac50fSopenharmony_ci            }
493e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(errCode));
494e0dac50fSopenharmony_ci            break;
495e0dac50fSopenharmony_ci        }
496e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_SET_MAXIMIZE_MODE: {
497e0dac50fSopenharmony_ci            uint32_t modeId = 0;
498e0dac50fSopenharmony_ci            if (!data.ReadUint32(modeId) || modeId >= static_cast<uint32_t>(MaximizeMode::MODE_END)) {
499e0dac50fSopenharmony_ci                return ERR_INVALID_DATA;
500e0dac50fSopenharmony_ci            }
501e0dac50fSopenharmony_ci            MaximizeMode maximizeMode = static_cast<MaximizeMode>(modeId);
502e0dac50fSopenharmony_ci            SetMaximizeMode(maximizeMode);
503e0dac50fSopenharmony_ci            break;
504e0dac50fSopenharmony_ci        }
505e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_MAXIMIZE_MODE: {
506e0dac50fSopenharmony_ci            MaximizeMode maximizeMode = GetMaximizeMode();
507e0dac50fSopenharmony_ci            reply.WriteInt32(static_cast<int32_t>(maximizeMode));
508e0dac50fSopenharmony_ci            break;
509e0dac50fSopenharmony_ci        }
510e0dac50fSopenharmony_ci        case WindowManagerMessage::TRANS_ID_GET_FOCUS_WINDOW_INFO: {
511e0dac50fSopenharmony_ci            FocusChangeInfo focusInfo;
512e0dac50fSopenharmony_ci            GetFocusWindowInfo(focusInfo);
513e0dac50fSopenharmony_ci            reply.WriteParcelable(&focusInfo);
514e0dac50fSopenharmony_ci            break;
515e0dac50fSopenharmony_ci        }
516e0dac50fSopenharmony_ci        default:
517e0dac50fSopenharmony_ci            WLOGFW("unknown transaction code %{public}d", code);
518e0dac50fSopenharmony_ci            return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
519e0dac50fSopenharmony_ci    }
520e0dac50fSopenharmony_ci    return ERR_NONE;
521e0dac50fSopenharmony_ci}
522e0dac50fSopenharmony_ci} // namespace Rosen
523e0dac50fSopenharmony_ci} // namespace OHOS
524