1 /*
2 * Copyright (c) 2023 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/screen_session_manager_client_stub.h"
17
18 #include "window_manager_hilog.h"
19
20 namespace OHOS::Rosen {
21 namespace {
22 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenSessionManagerClientStub" };
23 } // namespace
24
InitScreenChangeMap()25 void ScreenSessionManagerClientStub::InitScreenChangeMap()
26 {
27 if (HandleScreenChangeMap_.size() != 0) {
28 WLOGFI("screen change map has init!");
29 return;
30 }
31 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_CONNECTION_CHANGED] =
32 [this](MessageParcel& data, MessageParcel& reply) {
33 return HandleOnScreenConnectionChanged(data, reply);
34 };
35 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_PROPERTY_CHANGED] =
36 [this](MessageParcel& data, MessageParcel& reply) {
37 return HandleOnPropertyChanged(data, reply);
38 };
39 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_POWER_STATUS_CHANGED] =
40 [this](MessageParcel& data, MessageParcel& reply) {
41 return HandleOnPowerStatusChanged(data, reply);
42 };
43 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_EXTEND_CHANGED] =
44 [this](MessageParcel& data, MessageParcel& reply) {
45 return HandleOnScreenExtendChanged(data, reply);
46 };
47 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SENSOR_ROTATION_CHANGED] =
48 [this](MessageParcel& data, MessageParcel& reply) {
49 return HandleOnSensorRotationChanged(data, reply);
50 };
51 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_HOVER_STATUS_CHANGED] =
52 [this](MessageParcel& data, MessageParcel& reply) {
53 return HandleOnHoverStatusChanged(data, reply);
54 };
55 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ORIENTATION_CHANGED] =
56 [this](MessageParcel& data, MessageParcel& reply) {
57 return HandleOnScreenOrientationChanged(data, reply);
58 };
59 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ROTATION_LOCKED_CHANGED] =
60 [this](MessageParcel& data, MessageParcel& reply) {
61 return HandleOnScreenRotationLockedChanged(data, reply);
62 };
63 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_DISPLAY_STATE_CHANGED] =
64 [this](MessageParcel& data, MessageParcel& reply) {
65 return HandleOnDisplayStateChanged(data, reply);
66 };
67 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_SHOT] =
68 [this](MessageParcel& data, MessageParcel& reply) {
69 return HandleOnScreenshot(data, reply);
70 };
71 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_IMMERSIVE_STATE_CHANGED] =
72 [this](MessageParcel& data, MessageParcel& reply) {
73 return HandleOnImmersiveStateChanged(data, reply);
74 };
75 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_DISPLAY_NODE_SCREEN_ID] =
76 [this](MessageParcel& data, MessageParcel& reply) {
77 return HandleOnSetDisplayNodeScreenId(data, reply);
78 };
79 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_GET_SURFACENODEID_FROM_MISSIONID] =
80 [this](MessageParcel& data, MessageParcel& reply) {
81 return HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(data, reply);
82 };
83 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_FOLD_DISPLAY_MODE] =
84 [this](MessageParcel& data, MessageParcel& reply) {
85 return HandleOnUpdateFoldDisplayMode(data, reply);
86 };
87 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SWITCH_USER_CMD] =
88 [this](MessageParcel& data, MessageParcel& reply) {
89 return HandleSwitchUserCallback(data, reply);
90 };
91 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_VIRTUAL_PIXEL_RATIO_SYSTEM] =
92 [this](MessageParcel& data, MessageParcel& reply) {
93 return HandleSetVirtualPixelRatioSystem(data, reply);
94 };
95 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_FOLDSTATUS_CHANGED_REPORT_UE] =
96 [this](MessageParcel& data, MessageParcel& reply) {
97 return HandleOnFoldStatusChangedReportUE(data, reply);
98 };
99 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_CAPTURE_NOTIFY] =
100 [this](MessageParcel& data, MessageParcel& reply) {
101 return HandleScreenCaptureNotify(data, reply);
102 };
103 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SUPER_FOLD_STATUS_CHANGED] =
104 [this](MessageParcel& data, MessageParcel& reply) {
105 return HandleOnSuperFoldStatusChanged(data, reply);
106 };
107 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SECONDARY_REFLEXION_CHANGED] =
108 [this](MessageParcel& data, MessageParcel& reply) {
109 return HandleOnSecondaryReflexionChanged(data, reply);
110 };
111 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_CAMERA_BACKSELFIE_CHANGED] =
112 [this](MessageParcel& data, MessageParcel& reply) {
113 return HandleOnCameraBackSelfieChanged(data, reply);
114 };
115 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_EXTEND_SCREEN_CONNECT_STATUS_CHANGED] =
116 [this](MessageParcel& data, MessageParcel& reply) {
117 return HandleOnExtendScreenConnectStatusChanged(data, reply);
118 };
119 }
120
ScreenSessionManagerClientStub()121 ScreenSessionManagerClientStub::ScreenSessionManagerClientStub()
122 {
123 InitScreenChangeMap();
124 }
125
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)126 int ScreenSessionManagerClientStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
127 MessageOption& option)
128 {
129 int handleRet = ERR_INVALID_STATE;
130 if (data.ReadInterfaceToken() != GetDescriptor()) {
131 WLOGFE("Failed to check interface token!");
132 return handleRet;
133 }
134 ScreenSessionManagerClientMessage msgId = static_cast<ScreenSessionManagerClientMessage>(code);
135 auto handleCall = HandleScreenChangeMap_.find(msgId);
136 if (handleCall != HandleScreenChangeMap_.end() && handleCall->second != nullptr) {
137 auto handleFunc = handleCall->second;
138 handleRet = handleFunc(data, reply);
139 } else {
140 WLOGFE("Failed to find function handler!");
141 handleRet = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
142 }
143 return handleRet;
144 }
145
HandleSwitchUserCallback(MessageParcel & data,MessageParcel & reply)146 int ScreenSessionManagerClientStub::HandleSwitchUserCallback(MessageParcel& data, MessageParcel& reply)
147 {
148 WLOGD("HandleSwitchUserCallback");
149 std::vector<int32_t> oldScbPids;
150 data.ReadInt32Vector(&oldScbPids);
151 int32_t currentScbPid = data.ReadInt32();
152 SwitchUserCallback(oldScbPids, currentScbPid);
153 return ERR_NONE;
154 }
155
HandleOnScreenConnectionChanged(MessageParcel & data,MessageParcel & reply)156 int ScreenSessionManagerClientStub::HandleOnScreenConnectionChanged(MessageParcel& data, MessageParcel& reply)
157 {
158 WLOGD("HandleOnScreenConnectionChanged");
159 auto rsId = static_cast<ScreenId>(data.ReadUint64());
160 auto name = data.ReadString();
161 bool isExtend = data.ReadBool();
162 auto innerName = data.ReadString();
163 auto screenId = static_cast<ScreenId>(data.ReadUint64());
164 auto screenEvent = static_cast<ScreenEvent>(data.ReadUint8());
165 SessionOption option = {
166 .rsId_ = rsId,
167 .name_ = name,
168 .isExtend_ = isExtend,
169 .innerName_ = innerName,
170 .screenId_ = screenId,
171 };
172 OnScreenConnectionChanged(option, screenEvent);
173 return ERR_NONE;
174 }
175
HandleOnPropertyChanged(MessageParcel & data,MessageParcel & reply)176 int ScreenSessionManagerClientStub::HandleOnPropertyChanged(MessageParcel& data, MessageParcel& reply)
177 {
178 WLOGD("HandleOnPropertyChanged");
179 auto screenId = static_cast<ScreenId>(data.ReadUint64());
180 ScreenProperty property;
181 if (!RSMarshallingHelper::Unmarshalling(data, property)) {
182 WLOGFE("Read property failed");
183 return ERR_INVALID_DATA;
184 }
185 auto reason = static_cast<ScreenPropertyChangeReason>(data.ReadUint32());
186 OnPropertyChanged(screenId, property, reason);
187 return ERR_NONE;
188 }
189
HandleOnPowerStatusChanged(MessageParcel & data,MessageParcel & reply)190 int ScreenSessionManagerClientStub::HandleOnPowerStatusChanged(MessageParcel& data, MessageParcel& reply)
191 {
192 WLOGD("HandleOnPowerStatusChanged");
193 auto event = static_cast<DisplayPowerEvent>(data.ReadUint32());
194 auto status = static_cast<EventStatus>(data.ReadUint32());
195 auto reason = static_cast<PowerStateChangeReason>(data.ReadUint32());
196 OnPowerStatusChanged(event, status, reason);
197 return ERR_NONE;
198 }
199
HandleOnSensorRotationChanged(MessageParcel & data,MessageParcel & reply)200 int ScreenSessionManagerClientStub::HandleOnSensorRotationChanged(MessageParcel& data, MessageParcel& reply)
201 {
202 WLOGD("HandleOnSensorRotationChanged");
203 auto screenId = static_cast<ScreenId>(data.ReadUint64());
204 auto sensorRotation = data.ReadFloat();
205 OnSensorRotationChanged(screenId, sensorRotation);
206 return ERR_NONE;
207 }
208
HandleOnScreenExtendChanged(MessageParcel & data,MessageParcel & reply)209 int ScreenSessionManagerClientStub::HandleOnScreenExtendChanged(MessageParcel& data, MessageParcel& reply)
210 {
211 auto mainScreenId = static_cast<ScreenId>(data.ReadUint64());
212 auto extendScreenId = static_cast<ScreenId>(data.ReadUint64());
213 WLOGI("mainScreenId=%{public}" PRIu64" extendScreenId=%{public}" PRIu64, mainScreenId, extendScreenId);
214 OnScreenExtendChanged(mainScreenId, extendScreenId);
215 return ERR_NONE;
216 }
217
HandleOnScreenOrientationChanged(MessageParcel & data,MessageParcel & reply)218 int ScreenSessionManagerClientStub::HandleOnScreenOrientationChanged(MessageParcel& data, MessageParcel& reply)
219 {
220 WLOGD("HandleOnScreenOrientationChanged");
221 auto screenId = static_cast<ScreenId>(data.ReadUint64());
222 auto screenOrientation = data.ReadFloat();
223 OnScreenOrientationChanged(screenId, screenOrientation);
224 return ERR_NONE;
225 }
226
HandleOnScreenRotationLockedChanged(MessageParcel & data,MessageParcel & reply)227 int ScreenSessionManagerClientStub::HandleOnScreenRotationLockedChanged(MessageParcel& data, MessageParcel& reply)
228 {
229 WLOGD("HandleOnScreenRotationLockedChanged");
230 auto screenId = static_cast<ScreenId>(data.ReadUint64());
231 auto isLocked = data.ReadBool();
232 OnScreenRotationLockedChanged(screenId, isLocked);
233 return ERR_NONE;
234 }
235
HandleOnDisplayStateChanged(MessageParcel & data,MessageParcel & reply)236 int ScreenSessionManagerClientStub::HandleOnDisplayStateChanged(MessageParcel& data, MessageParcel& reply)
237 {
238 WLOGD("HandleOnDisplayStateChanged");
239 auto defaultDisplayId = static_cast<DisplayId>(data.ReadUint64());
240 auto displayInfo = data.ReadStrongParcelable<DisplayInfo>();
241 auto mapSize = data.ReadUint32();
242 std::map<DisplayId, sptr<DisplayInfo>> displayInfoMap;
243 while (mapSize--) {
244 auto displayId = data.ReadUint64();
245 auto displayInfoValue = data.ReadStrongParcelable<DisplayInfo>();
246 displayInfoMap.emplace(displayId, displayInfoValue);
247 }
248 auto type = static_cast<DisplayStateChangeType>(data.ReadUint32());
249 OnDisplayStateChanged(defaultDisplayId, displayInfo, displayInfoMap, type);
250 return ERR_NONE;
251 }
252
HandleOnUpdateFoldDisplayMode(MessageParcel & data,MessageParcel & reply)253 int ScreenSessionManagerClientStub::HandleOnUpdateFoldDisplayMode(MessageParcel& data, MessageParcel& reply)
254 {
255 WLOGD("HandleOnUpdateFoldDisplayMode");
256 auto foldDisplayMode = static_cast<FoldDisplayMode>(data.ReadUint32());
257 OnUpdateFoldDisplayMode(foldDisplayMode);
258 return ERR_NONE;
259 }
260
HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel & data,MessageParcel & reply)261 int ScreenSessionManagerClientStub::HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel& data,
262 MessageParcel& reply)
263 {
264 std::vector<uint64_t> missionIds;
265 data.ReadUInt64Vector(&missionIds);
266 std::vector<uint64_t> surfaceNodeIds;
267 data.ReadUInt64Vector(&surfaceNodeIds);
268 bool isBlackList = data.ReadBool();
269 OnGetSurfaceNodeIdsFromMissionIdsChanged(missionIds, surfaceNodeIds, isBlackList);
270 if (!reply.WriteUInt64Vector(surfaceNodeIds)) {
271 WLOGFE("Write surfaceNodeIds failed");
272 return ERR_TRANSACTION_FAILED;
273 }
274 return ERR_NONE;
275 }
276
HandleOnScreenshot(MessageParcel & data,MessageParcel & reply)277 int ScreenSessionManagerClientStub::HandleOnScreenshot(MessageParcel& data, MessageParcel& reply)
278 {
279 WLOGD("HandleOnScreenshot");
280 auto displayId = static_cast<DisplayId>(data.ReadUint64());
281 OnScreenshot(displayId);
282 return ERR_NONE;
283 }
284
HandleOnImmersiveStateChanged(MessageParcel & data,MessageParcel & reply)285 int ScreenSessionManagerClientStub::HandleOnImmersiveStateChanged(MessageParcel& data, MessageParcel& reply)
286 {
287 WLOGD("HandleOnImmersiveStateChanged");
288 auto screenId = static_cast<ScreenId>(data.ReadUint64());
289 bool immersive = false;
290 OnImmersiveStateChanged(screenId, immersive);
291 if (!reply.WriteBool(immersive)) {
292 WLOGFE("Write immersive failed");
293 return ERR_TRANSACTION_FAILED;
294 }
295 return ERR_NONE;
296 }
297
HandleOnSetDisplayNodeScreenId(MessageParcel & data,MessageParcel & reply)298 int ScreenSessionManagerClientStub::HandleOnSetDisplayNodeScreenId(MessageParcel& data, MessageParcel& reply)
299 {
300 WLOGD("HandleOnSetDisplayNodeScreenId");
301 auto screenId = static_cast<ScreenId>(data.ReadUint64());
302 auto displayNodeScreenId = static_cast<ScreenId>(data.ReadUint64());
303 SetDisplayNodeScreenId(screenId, displayNodeScreenId);
304 return ERR_NONE;
305 }
306
HandleSetVirtualPixelRatioSystem(MessageParcel & data,MessageParcel & reply)307 int ScreenSessionManagerClientStub::HandleSetVirtualPixelRatioSystem(MessageParcel& data, MessageParcel& reply)
308 {
309 WLOGD("HandleSetVirtualPixelRatioSystem");
310 auto screenId = static_cast<ScreenId>(data.ReadUint64());
311 float virtualPixelRatio = data.ReadFloat();
312 SetVirtualPixelRatioSystem(screenId, virtualPixelRatio);
313 return ERR_NONE;
314 }
315
HandleOnFoldStatusChangedReportUE(MessageParcel & data,MessageParcel & reply)316 int ScreenSessionManagerClientStub::HandleOnFoldStatusChangedReportUE(MessageParcel& data, MessageParcel& reply)
317 {
318 std::vector<std::string> screenFoldInfo;
319 data.ReadStringVector(&screenFoldInfo);
320 OnFoldStatusChangedReportUE(screenFoldInfo);
321 return ERR_NONE;
322 }
323
HandleOnHoverStatusChanged(MessageParcel & data,MessageParcel & reply)324 int ScreenSessionManagerClientStub::HandleOnHoverStatusChanged(MessageParcel& data, MessageParcel& reply)
325 {
326 WLOGD("HandleOnHoverStatusChanged");
327 auto screenId = static_cast<ScreenId>(data.ReadUint64());
328 auto hoverStatus = data.ReadInt32();
329 auto needRotate = data.ReadBool();
330 OnHoverStatusChanged(screenId, hoverStatus, needRotate);
331 return ERR_NONE;
332 }
333
HandleScreenCaptureNotify(MessageParcel & data,MessageParcel & reply)334 int ScreenSessionManagerClientStub::HandleScreenCaptureNotify(MessageParcel& data, MessageParcel& reply)
335 {
336 auto screenId = static_cast<ScreenId>(data.ReadUint64());
337 auto uid = data.ReadInt32();
338 auto clientName = data.ReadString();
339 WLOGI("notify scb capture screenId=%{public}" PRIu64", uid=%{public}d.", screenId, uid);
340 ScreenCaptureNotify(screenId, uid, clientName);
341 return ERR_NONE;
342 }
343
HandleOnCameraBackSelfieChanged(MessageParcel & data,MessageParcel & reply)344 int ScreenSessionManagerClientStub::HandleOnCameraBackSelfieChanged(MessageParcel& data, MessageParcel& reply)
345 {
346 WLOGD("HandleOnCameraBackSelfieChanged");
347 auto screenId = static_cast<ScreenId>(data.ReadUint64());
348 bool isCameraBackSelfie = data.ReadBool();
349 OnCameraBackSelfieChanged(screenId, isCameraBackSelfie);
350 return ERR_NONE;
351 }
352
HandleOnSuperFoldStatusChanged(MessageParcel & data,MessageParcel & reply)353 int ScreenSessionManagerClientStub::HandleOnSuperFoldStatusChanged(MessageParcel& data, MessageParcel& reply)
354 {
355 auto screenId = static_cast<ScreenId>(data.ReadUint64());
356 auto superFoldStatus = static_cast<SuperFoldStatus>(data.ReadUint32());
357 WLOGI("super fold status screenId=%{public}" PRIu64", superFoldStatus=%{public}d.",
358 screenId, static_cast<uint32_t>(superFoldStatus));
359 OnSuperFoldStatusChanged(screenId, superFoldStatus);
360 return ERR_NONE;
361 }
362
HandleOnSecondaryReflexionChanged(MessageParcel & data,MessageParcel & reply)363 int ScreenSessionManagerClientStub::HandleOnSecondaryReflexionChanged(MessageParcel& data, MessageParcel& reply)
364 {
365 auto screenId = static_cast<ScreenId>(data.ReadUint64());
366 auto isSecondaryReflexion = static_cast<bool>(data.ReadUint32());
367 WLOGI("secondary reflexion screenId=%{public}" PRIu64", isSecondaryReflexion=%{public}d.",
368 screenId, static_cast<uint32_t>(isSecondaryReflexion));
369 OnSecondaryReflexionChanged(screenId, isSecondaryReflexion);
370 return ERR_NONE;
371 }
372
HandleOnExtendScreenConnectStatusChanged(MessageParcel & data,MessageParcel & reply)373 int ScreenSessionManagerClientStub::HandleOnExtendScreenConnectStatusChanged(MessageParcel& data, MessageParcel& reply)
374 {
375 auto screenId = static_cast<ScreenId>(data.ReadUint64());
376 auto extendScreenConnectStatus = static_cast<ExtendScreenConnectStatus>(data.ReadUint32());
377 WLOGI("extendScreenConnectStatus screenId=%{public}" PRIu64", extendScreenConnectStatus=%{public}d.",
378 screenId, static_cast<uint32_t>(extendScreenConnectStatus));
379 OnExtendScreenConnectStatusChanged(screenId, extendScreenConnectStatus);
380 return ERR_NONE;
381 }
382 } // namespace OHOS::Rosen
383