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/display_manager_agent_stub.h"
17
18 #include <vector>
19
20 #include "display_info.h"
21 #include "display_change_info.h"
22 #include "dm_common.h"
23 #include "marshalling_helper.h"
24 #include "screen_info.h"
25 #include "window_manager_hilog.h"
26
27 namespace OHOS::Rosen {
28 namespace {
29 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManagerAgentStub"};
30 }
31
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)32 int32_t DisplayManagerAgentStub::OnRemoteRequest(uint32_t code, MessageParcel& data,
33 MessageParcel& reply, MessageOption& option)
34 {
35 WLOGFD("code:%{public}u", code);
36 if (data.ReadInterfaceToken() != GetDescriptor()) {
37 WLOGFE("InterfaceToken check failed");
38 return -1;
39 }
40 switch (code) {
41 case TRANS_ID_NOTIFY_DISPLAY_POWER_EVENT: {
42 return ProcNotifyDisplayPowerEvent(data);
43 }
44 case TRANS_ID_NOTIFY_DISPLAY_STATE_CHANGED: {
45 return ProcNotifyDisplayStateChanged(data);
46 }
47 case TRANS_ID_ON_SCREEN_CONNECT: {
48 return ProcScreenConnect(data);
49 }
50 case TRANS_ID_ON_SCREEN_DISCONNECT: {
51 return ProcScreenDisconnect(data);
52 }
53 case TRANS_ID_ON_SCREEN_CHANGED: {
54 return ProcScreenChanged(data);
55 }
56 case TRANS_ID_ON_SCREENGROUP_CHANGED: {
57 return ProcScreenGroupChanged(data);
58 }
59 case TRANS_ID_ON_DISPLAY_CONNECT: {
60 return ProcDisplayConnect(data);
61 }
62 case TRANS_ID_ON_DISPLAY_DISCONNECT: {
63 return ProcDisplayDisconnect(data);
64 }
65 case TRANS_ID_ON_DISPLAY_CHANGED: {
66 return ProcDisplayChanged(data);
67 }
68 case TRANS_ID_ON_SCREEN_SHOT: {
69 return ProcScreenShot(data);
70 }
71 case TRANS_ID_ON_PRIVATE_WINDOW: {
72 return ProcPrivateWindow(data);
73 }
74 case TRANS_ID_ON_PRIVATE_WINDOW_LIST: {
75 return ProcPrivateWindowList(data);
76 }
77 case TRANS_ID_ON_FOLD_STATUS_CHANGED: {
78 return ProcFoldStatusChanged(data);
79 }
80 case TRANS_ID_ON_DISPLAY_CHANGE_INFO_CHANGED: {
81 return ProcDisplayChangeInfoChanged(data);
82 }
83 case TRANS_ID_ON_DISPLAY_MODE_CHANGED: {
84 return ProcDisplayModechanged(data);
85 }
86 case TRANS_ID_ON_AVAILABLE_AREA_CHANGED: {
87 return ProcAvailableAreaChanged(data);
88 }
89 case TRANS_ID_ON_FOLD_ANGLE_CHANGED: {
90 return ProcFoldAngleChanged(data);
91 }
92 case TRANS_ID_ON_CAPTURE_STATUS_CHANGED: {
93 return ProcCaptureStatusChanged(data);
94 }
95 case TRANS_ID_ON_SCREEN_MAGNETIC_STATE_CHANGED: {
96 return ProcScreenMagneticStatechanged(data);
97 }
98 case TRANS_ID_ON_SCREEN_MODE_CHANGED: {
99 std::vector<sptr<ScreenInfo>> screenInfos;
100 if (!MarshallingHelper::UnmarshallingVectorParcelableObj<ScreenInfo>(data, screenInfos)) {
101 WLOGFE("Read ScreenInfo failed");
102 return -1;
103 }
104 NotifyScreenModeChange(screenInfos);
105 break;
106 }
107 case TRANS_ID_NOTIFY_ABNORMAL_SCREEN_CONNECT_CHANGED: {
108 ScreenId screenId;
109 if (!data.ReadUint64(screenId)) {
110 WLOGFE("Read screenId failed");
111 return -1;
112 }
113 NotifyAbnormalScreenConnectChange(screenId);
114 break;
115 }
116 default: {
117 WLOGFW("unknown transaction code %{public}d", code);
118 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
119 }
120 }
121 return 0;
122 }
123
ProcFoldAngleChanged(MessageParcel & data)124 int32_t DisplayManagerAgentStub::ProcFoldAngleChanged(MessageParcel& data)
125 {
126 std::vector<float> foldAngles;
127 if (!data.ReadFloatVector(&foldAngles)) {
128 WLOGFE("Read foldAngles failed");
129 return -1;
130 }
131 NotifyFoldAngleChanged(foldAngles);
132 return 0;
133 }
134
ProcCaptureStatusChanged(MessageParcel & data)135 int32_t DisplayManagerAgentStub::ProcCaptureStatusChanged(MessageParcel& data)
136 {
137 bool isCapture = data.ReadBool();
138 NotifyCaptureStatusChanged(isCapture);
139 return 0;
140 }
141
ProcNotifyDisplayPowerEvent(MessageParcel & data)142 int32_t DisplayManagerAgentStub::ProcNotifyDisplayPowerEvent(MessageParcel& data)
143 {
144 DisplayPowerEvent event = static_cast<DisplayPowerEvent>(data.ReadUint32());
145 EventStatus status = static_cast<EventStatus>(data.ReadUint32());
146 NotifyDisplayPowerEvent(event, status);
147 return 0;
148 }
149
ProcNotifyDisplayStateChanged(MessageParcel & data)150 int32_t DisplayManagerAgentStub::ProcNotifyDisplayStateChanged(MessageParcel& data)
151 {
152 DisplayState state = static_cast<DisplayState>(data.ReadUint32());
153 DisplayId id = static_cast<DisplayId>(data.ReadUint64());
154 NotifyDisplayStateChanged(id, state);
155 return 0;
156 }
157
ProcScreenConnect(MessageParcel & data)158 int32_t DisplayManagerAgentStub::ProcScreenConnect(MessageParcel& data)
159 {
160 sptr<ScreenInfo> screenInfo = data.ReadParcelable<ScreenInfo>();
161 OnScreenConnect(screenInfo);
162 return 0;
163 }
164
ProcScreenDisconnect(MessageParcel & data)165 int32_t DisplayManagerAgentStub::ProcScreenDisconnect(MessageParcel& data)
166 {
167 ScreenId screenId;
168 if (!data.ReadUint64(screenId)) {
169 WLOGFE("Read ScreenId failed");
170 return -1;
171 }
172 OnScreenDisconnect(screenId);
173 return 0;
174 }
175
ProcScreenChanged(MessageParcel & data)176 int32_t DisplayManagerAgentStub::ProcScreenChanged(MessageParcel& data)
177 {
178 sptr<ScreenInfo> screenInfo = data.ReadParcelable<ScreenInfo>();
179 uint32_t event;
180 if (!data.ReadUint32(event)) {
181 WLOGFE("Read ScreenChangeEvent failed");
182 return -1;
183 }
184 OnScreenChange(screenInfo, static_cast<ScreenChangeEvent>(event));
185 return 0;
186 }
187
ProcScreenGroupChanged(MessageParcel & data)188 int32_t DisplayManagerAgentStub::ProcScreenGroupChanged(MessageParcel& data)
189 {
190 std::string trigger;
191 if (!data.ReadString(trigger)) {
192 WLOGFE("Read trigger failed");
193 return -1;
194 }
195 std::vector<sptr<ScreenInfo>> screenInfos;
196 if (!MarshallingHelper::UnmarshallingVectorParcelableObj<ScreenInfo>(data, screenInfos)) {
197 WLOGFE("Read ScreenInfo failed");
198 return -1;
199 }
200 uint32_t event;
201 if (!data.ReadUint32(event)) {
202 WLOGFE("Read ScreenChangeEvent failed");
203 return -1;
204 }
205 OnScreenGroupChange(trigger, screenInfos, static_cast<ScreenGroupChangeEvent>(event));
206 return 0;
207 }
208
ProcDisplayConnect(MessageParcel & data)209 int32_t DisplayManagerAgentStub::ProcDisplayConnect(MessageParcel& data)
210 {
211 sptr<DisplayInfo> displayInfo = data.ReadParcelable<DisplayInfo>();
212 OnDisplayCreate(displayInfo);
213 return 0;
214 }
215
ProcDisplayDisconnect(MessageParcel & data)216 int32_t DisplayManagerAgentStub::ProcDisplayDisconnect(MessageParcel& data)
217 {
218 DisplayId displayId;
219 if (!data.ReadUint64(displayId)) {
220 WLOGFE("Read DisplayId failed");
221 return -1;
222 }
223 OnDisplayDestroy(displayId);
224 return 0;
225 }
226
ProcDisplayChanged(MessageParcel & data)227 int32_t DisplayManagerAgentStub::ProcDisplayChanged(MessageParcel& data)
228 {
229 sptr<DisplayInfo> displayInfo = data.ReadParcelable<DisplayInfo>();
230 uint32_t event;
231 if (!data.ReadUint32(event)) {
232 WLOGFE("Read DisplayChangeEvent failed");
233 return -1;
234 }
235 OnDisplayChange(displayInfo, static_cast<DisplayChangeEvent>(event));
236 return 0;
237 }
238
ProcScreenShot(MessageParcel & data)239 int32_t DisplayManagerAgentStub::ProcScreenShot(MessageParcel& data)
240 {
241 sptr<ScreenshotInfo> snapshotInfo = data.ReadParcelable<ScreenshotInfo>();
242 OnScreenshot(snapshotInfo);
243 return 0;
244 }
245
ProcPrivateWindow(MessageParcel & data)246 int32_t DisplayManagerAgentStub::ProcPrivateWindow(MessageParcel& data)
247 {
248 bool hasPrivate = data.ReadBool();
249 NotifyPrivateWindowStateChanged(hasPrivate);
250 return 0;
251 }
252
ProcPrivateWindowList(MessageParcel & data)253 int32_t DisplayManagerAgentStub::ProcPrivateWindowList(MessageParcel& data)
254 {
255 DisplayId displayId = static_cast<DisplayId>(data.ReadUint64());
256 std::vector<std::string> privacyWindowList;
257 data.ReadStringVector(&privacyWindowList);
258 NotifyPrivateStateWindowListChanged(displayId, privacyWindowList);
259 return 0;
260 }
261
ProcFoldStatusChanged(MessageParcel & data)262 int32_t DisplayManagerAgentStub::ProcFoldStatusChanged(MessageParcel& data)
263 {
264 uint32_t foldStatus;
265 if (!data.ReadUint32(foldStatus)) {
266 WLOGFE("Read FoldStatus failed");
267 return -1;
268 }
269 NotifyFoldStatusChanged(static_cast<FoldStatus>(foldStatus));
270 return 0;
271 }
272
ProcDisplayChangeInfoChanged(MessageParcel & data)273 int32_t DisplayManagerAgentStub::ProcDisplayChangeInfoChanged(MessageParcel& data)
274 {
275 sptr<DisplayChangeInfo> info;
276 info = DisplayChangeInfo::Unmarshalling(data);
277 if (!info) {
278 WLOGFE("Read DisplayChangeInfo failed");
279 return -1;
280 }
281 NotifyDisplayChangeInfoChanged(info);
282 return 0;
283 }
284
ProcDisplayModechanged(MessageParcel & data)285 int32_t DisplayManagerAgentStub::ProcDisplayModechanged(MessageParcel& data)
286 {
287 uint32_t displayMode;
288 if (!data.ReadUint32(displayMode)) {
289 WLOGFE("Read FoldDisplayMode failed");
290 return -1;
291 }
292 NotifyDisplayModeChanged(static_cast<FoldDisplayMode>(displayMode));
293 return 0;
294 }
295
ProcAvailableAreaChanged(MessageParcel & data)296 int32_t DisplayManagerAgentStub::ProcAvailableAreaChanged(MessageParcel& data)
297 {
298 DMRect rect;
299 DisplayId displayId = static_cast<DisplayId>(data.ReadUint64());
300 rect.posX_ = data.ReadInt32();
301 rect.posY_ = data.ReadInt32();
302 rect.width_ = data.ReadUint32();
303 rect.height_ = data.ReadUint32();
304 NotifyAvailableAreaChanged(rect, displayId);
305 return 0;
306 }
307
ProcScreenMagneticStatechanged(MessageParcel & data)308 int32_t DisplayManagerAgentStub::ProcScreenMagneticStatechanged(MessageParcel& data)
309 {
310 bool isMagneticState = data.ReadBool();
311 NotifyScreenMagneticStateChanged(isMagneticState);
312 return 0;
313 }
314 } // namespace OHOS::Rosen
315