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(¶ms)) { 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