1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "zidl/window_stub.h"
17 #include <vector>
18 #include "ipc_skeleton.h"
19 #include <key_event.h>
20 #include "pointer_event.h"
21 #include "window_manager_hilog.h"
22 #include <transaction/rs_transaction.h>
23
24 namespace OHOS {
25 namespace Rosen {
26 namespace {
27 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowStub"};
28 }
29
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)30 int WindowStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
31 {
32 if (staticDestroyMonitor_.IsDestroyed()) {
33 WLOGFE("Main thread finished, static data has been destroyed");
34 return -1;
35 }
36 if (data.ReadInterfaceToken() != GetDescriptor()) {
37 WLOGFE("InterfaceToken check failed");
38 return -1;
39 }
40 WindowMessage msgId = static_cast<WindowMessage>(code);
41 switch (msgId) {
42 case WindowMessage::TRANS_ID_UPDATE_WINDOW_RECT: {
43 struct Rect rect { data.ReadInt32(), data.ReadInt32(), data.ReadUint32(), data.ReadUint32() };
44 bool decoStatus = data.ReadBool();
45 WindowSizeChangeReason reason = static_cast<WindowSizeChangeReason>(data.ReadUint32());
46 bool hasRSTransaction = data.ReadBool();
47 if (hasRSTransaction) {
48 auto rsTransaction = data.ReadParcelable<RSTransaction>();
49 if (!rsTransaction) {
50 WLOGFE("RSTransaction unMarsh failed");
51 return -1;
52 }
53 std::shared_ptr<RSTransaction> transaction(rsTransaction);
54 UpdateWindowRect(rect, decoStatus, reason, transaction);
55 } else {
56 UpdateWindowRect(rect, decoStatus, reason);
57 }
58 break;
59 }
60 case WindowMessage::TRANS_ID_UPDATE_WINDOW_MODE: {
61 WindowMode mode = static_cast<WindowMode>(data.ReadUint32());
62 UpdateWindowMode(mode);
63 break;
64 }
65 case WindowMessage::TRANS_ID_UPDATE_MODE_SUPPORT_INFO: {
66 uint32_t modeSupportInfo = data.ReadUint32();
67 UpdateWindowModeSupportInfo(modeSupportInfo);
68 break;
69 }
70 case WindowMessage::TRANS_ID_UPDATE_FOCUS_STATUS: {
71 bool focused = data.ReadBool();
72 UpdateFocusStatus(focused);
73 break;
74 }
75 case WindowMessage::TRANS_ID_UPDATE_AVOID_AREA: {
76 sptr<AvoidArea> avoidArea = data.ReadStrongParcelable<AvoidArea>();
77 uint32_t type;
78 if (!data.ReadUint32(type)) {
79 return -1;
80 }
81 UpdateAvoidArea(avoidArea, static_cast<AvoidAreaType>(type));
82 break;
83 }
84 case WindowMessage::TRANS_ID_UPDATE_WINDOW_STATE: {
85 UpdateWindowState(static_cast<WindowState>(data.ReadUint32()));
86 break;
87 }
88 case WindowMessage::TRANS_ID_UPDATE_DRAG_EVENT: {
89 PointInfo point;
90 point.x = data.ReadInt32();
91 point.y = data.ReadInt32();
92 DragEvent event = static_cast<DragEvent>(data.ReadUint32());
93 UpdateWindowDragInfo(point, event);
94 break;
95 }
96 case WindowMessage::TRANS_ID_UPDATE_DISPLAY_ID: {
97 UpdateDisplayId(data.ReadUint64(), data.ReadUint64());
98 break;
99 }
100 case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA: {
101 sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
102 bool hasRSTransaction = data.ReadBool();
103 if (hasRSTransaction) {
104 auto rsTransaction = data.ReadParcelable<RSTransaction>();
105 if (!rsTransaction) {
106 WLOGFE("RSTransaction unMarsh failed");
107 return -1;
108 }
109 std::shared_ptr<RSTransaction> transaction(rsTransaction);
110 UpdateOccupiedAreaChangeInfo(info, transaction);
111 } else {
112 UpdateOccupiedAreaChangeInfo(info);
113 }
114
115 break;
116 }
117 case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA_AND_RECT: {
118 sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
119 struct Rect rect { data.ReadInt32(), data.ReadInt32(), data.ReadUint32(), data.ReadUint32() };
120 bool hasRSTransaction = data.ReadBool();
121 if (hasRSTransaction) {
122 auto rsTransaction = data.ReadParcelable<RSTransaction>();
123 if (!rsTransaction) {
124 WLOGFE("RSTransaction unMarsh failed");
125 return -1;
126 }
127 std::shared_ptr<RSTransaction> transaction(rsTransaction);
128 UpdateOccupiedAreaAndRect(info, rect, transaction);
129 } else {
130 UpdateOccupiedAreaAndRect(info, rect);
131 }
132
133 break;
134 }
135 case WindowMessage::TRANS_ID_UPDATE_ACTIVE_STATUS: {
136 bool isActive = data.ReadBool();
137 UpdateActiveStatus(isActive);
138 break;
139 }
140 case WindowMessage::TRANS_ID_GET_WINDOW_PROPERTY: {
141 auto property = GetWindowProperty();
142 reply.WriteParcelable(property.GetRefPtr());
143 break;
144 }
145 case WindowMessage::TRANS_ID_NOTIFY_OUTSIDE_PRESSED: {
146 NotifyTouchOutside();
147 break;
148 }
149 case WindowMessage::TRANS_ID_NOTIFY_SCREEN_SHOT: {
150 NotifyScreenshot();
151 break;
152 }
153 case WindowMessage::TRANS_ID_NOTIFY_DESTROY: {
154 NotifyDestroy();
155 break;
156 }
157 case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND: {
158 NotifyForeground();
159 break;
160 }
161 case WindowMessage::TRANS_ID_NOTIFY_BACKGROUND: {
162 NotifyBackground();
163 break;
164 }
165 case WindowMessage::TRANS_ID_DUMP_INFO: {
166 std::vector<std::string> params;
167 if (!data.ReadStringVector(¶ms)) {
168 WLOGFE("Fail to read params");
169 return -1;
170 }
171 DumpInfo(params);
172 break;
173 }
174 case WindowMessage::TRANS_ID_NOTIFY_CLIENT_POINT_UP: {
175 auto pointerEvent = MMI::PointerEvent::Create();
176 if (!pointerEvent->ReadFromParcel(data)) {
177 WLOGFE("Read Pointer Event failed");
178 return -1;
179 }
180 NotifyWindowClientPointUp(pointerEvent);
181 break;
182 }
183 case WindowMessage::TRANS_ID_UPDATE_ZOOM_TRANSFORM: {
184 Transform trans;
185 trans.Unmarshalling(data);
186 bool isDisplayZoomOn = data.ReadBool();
187 UpdateZoomTransform(trans, isDisplayZoomOn);
188 break;
189 }
190 case WindowMessage::TRANS_ID_RESTORE_SPLIT_WINDOW_MODE: {
191 RestoreSplitWindowMode(data.ReadUint32());
192 break;
193 }
194 case WindowMessage::TRANS_ID_CONSUME_KEY_EVENT: {
195 auto event = MMI::KeyEvent::Create();
196 if (!event->ReadFromParcel(data)) {
197 WLOGFE("Read Pointer Event failed");
198 return -1;
199 }
200 ConsumeKeyEvent(event);
201 break;
202 }
203 case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS: {
204 bool interactive = data.ReadBool();
205 NotifyForegroundInteractiveStatus(interactive);
206 break;
207 }
208 default:
209 WLOGFW("unknown transaction code %{public}d", code);
210 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
211 }
212 return 0;
213 }
214 } // namespace Rosen
215 } // namespace OHOS
216