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