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_SENSOR_ROTATION_CHANGED] =
44 [this](MessageParcel& data, MessageParcel& reply) {
45 return HandleOnSensorRotationChanged(data, reply);
46 };
47 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_HOVER_STATUS_CHANGED] =
48 [this](MessageParcel& data, MessageParcel& reply) {
49 return HandleOnHoverStatusChanged(data, reply);
50 };
51 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ORIENTATION_CHANGED] =
52 [this](MessageParcel& data, MessageParcel& reply) {
53 return HandleOnScreenOrientationChanged(data, reply);
54 };
55 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_ROTATION_LOCKED_CHANGED] =
56 [this](MessageParcel& data, MessageParcel& reply) {
57 return HandleOnScreenRotationLockedChanged(data, reply);
58 };
59 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_DISPLAY_STATE_CHANGED] =
60 [this](MessageParcel& data, MessageParcel& reply) {
61 return HandleOnDisplayStateChanged(data, reply);
62 };
63 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_SHOT] =
64 [this](MessageParcel& data, MessageParcel& reply) {
65 return HandleOnScreenshot(data, reply);
66 };
67 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_IMMERSIVE_STATE_CHANGED] =
68 [this](MessageParcel& data, MessageParcel& reply) {
69 return HandleOnImmersiveStateChanged(data, reply);
70 };
71 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_DISPLAY_NODE_SCREEN_ID] =
72 [this](MessageParcel& data, MessageParcel& reply) {
73 return HandleOnSetDisplayNodeScreenId(data, reply);
74 };
75 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_GET_SURFACENODEID_FROM_MISSIONID] =
76 [this](MessageParcel& data, MessageParcel& reply) {
77 return HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(data, reply);
78 };
79 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_FOLD_DISPLAY_MODE] =
80 [this](MessageParcel& data, MessageParcel& reply) {
81 return HandleOnUpdateFoldDisplayMode(data, reply);
82 };
83 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SWITCH_USER_CMD] =
84 [this](MessageParcel& data, MessageParcel& reply) {
85 return HandleSwitchUserCallback(data, reply);
86 };
87 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_SET_VIRTUAL_PIXEL_RATIO_SYSTEM] =
88 [this](MessageParcel& data, MessageParcel& reply) {
89 return HandleSetVirtualPixelRatioSystem(data, reply);
90 };
91 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_FOLDSTATUS_CHANGED_REPORT_UE] =
92 [this](MessageParcel& data, MessageParcel& reply) {
93 return HandleOnFoldStatusChangedReportUE(data, reply);
94 };
95 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SCREEN_CAPTURE_NOTIFY] =
96 [this](MessageParcel& data, MessageParcel& reply) {
97 return HandleScreenCaptureNotify(data, reply);
98 };
99 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_CAMERA_BACKSELFIE_CHANGED] =
100 [this](MessageParcel& data, MessageParcel& reply) {
101 return HandleOnCameraBackSelfieChanged(data, reply);
102 };
103 HandleScreenChangeMap_[ScreenSessionManagerClientMessage::TRANS_ID_ON_SECONDARY_REFLEXION_CHANGED] =
104 [this](MessageParcel& data, MessageParcel& reply) {
105 return HandleOnSecondaryReflexionChanged(data, reply);
106 };
107 }
108
ScreenSessionManagerClientStub()109 ScreenSessionManagerClientStub::ScreenSessionManagerClientStub()
110 {
111 InitScreenChangeMap();
112 }
113
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)114 int ScreenSessionManagerClientStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
115 MessageOption& option)
116 {
117 int handleRet = ERR_INVALID_STATE;
118 if (data.ReadInterfaceToken() != GetDescriptor()) {
119 WLOGFE("Failed to check interface token!");
120 return handleRet;
121 }
122 ScreenSessionManagerClientMessage msgId = static_cast<ScreenSessionManagerClientMessage>(code);
123 auto handleCall = HandleScreenChangeMap_.find(msgId);
124 if (handleCall != HandleScreenChangeMap_.end() && handleCall->second != nullptr) {
125 auto handleFunc = handleCall->second;
126 handleRet = handleFunc(data, reply);
127 } else {
128 WLOGFE("Failed to find function handler!");
129 handleRet = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
130 }
131 return handleRet;
132 }
133
HandleSwitchUserCallback(MessageParcel & data,MessageParcel & reply)134 int ScreenSessionManagerClientStub::HandleSwitchUserCallback(MessageParcel& data, MessageParcel& reply)
135 {
136 WLOGD("HandleSwitchUserCallback");
137 std::vector<int32_t> oldScbPids;
138 data.ReadInt32Vector(&oldScbPids);
139 int32_t currentScbPid = data.ReadInt32();
140 SwitchUserCallback(oldScbPids, currentScbPid);
141 return ERR_NONE;
142 }
143
HandleOnScreenConnectionChanged(MessageParcel & data,MessageParcel & reply)144 int ScreenSessionManagerClientStub::HandleOnScreenConnectionChanged(MessageParcel& data, MessageParcel& reply)
145 {
146 WLOGD("HandleOnScreenConnectionChanged");
147 auto screenId = static_cast<ScreenId>(data.ReadUint64());
148 auto screenEvent = static_cast<ScreenEvent>(data.ReadUint8());
149 auto rsId = static_cast<ScreenId>(data.ReadUint64());
150 auto name = data.ReadString();
151 OnScreenConnectionChanged(screenId, screenEvent, rsId, name);
152 return ERR_NONE;
153 }
154
HandleOnPropertyChanged(MessageParcel & data,MessageParcel & reply)155 int ScreenSessionManagerClientStub::HandleOnPropertyChanged(MessageParcel& data, MessageParcel& reply)
156 {
157 WLOGD("HandleOnPropertyChanged");
158 auto screenId = static_cast<ScreenId>(data.ReadUint64());
159 ScreenProperty property;
160 if (!RSMarshallingHelper::Unmarshalling(data, property)) {
161 WLOGFE("Read property failed");
162 return ERR_INVALID_DATA;
163 }
164 auto reason = static_cast<ScreenPropertyChangeReason>(data.ReadUint32());
165 OnPropertyChanged(screenId, property, reason);
166 return ERR_NONE;
167 }
168
HandleOnPowerStatusChanged(MessageParcel & data,MessageParcel & reply)169 int ScreenSessionManagerClientStub::HandleOnPowerStatusChanged(MessageParcel& data, MessageParcel& reply)
170 {
171 WLOGD("HandleOnPowerStatusChanged");
172 auto event = static_cast<DisplayPowerEvent>(data.ReadUint32());
173 auto status = static_cast<EventStatus>(data.ReadUint32());
174 auto reason = static_cast<PowerStateChangeReason>(data.ReadUint32());
175 OnPowerStatusChanged(event, status, reason);
176 return ERR_NONE;
177 }
178
HandleOnSensorRotationChanged(MessageParcel & data,MessageParcel & reply)179 int ScreenSessionManagerClientStub::HandleOnSensorRotationChanged(MessageParcel& data, MessageParcel& reply)
180 {
181 WLOGD("HandleOnSensorRotationChanged");
182 auto screenId = static_cast<ScreenId>(data.ReadUint64());
183 auto sensorRotation = data.ReadFloat();
184 OnSensorRotationChanged(screenId, sensorRotation);
185 return ERR_NONE;
186 }
187
HandleOnScreenOrientationChanged(MessageParcel & data,MessageParcel & reply)188 int ScreenSessionManagerClientStub::HandleOnScreenOrientationChanged(MessageParcel& data, MessageParcel& reply)
189 {
190 WLOGD("HandleOnScreenOrientationChanged");
191 auto screenId = static_cast<ScreenId>(data.ReadUint64());
192 auto screenOrientation = data.ReadFloat();
193 OnScreenOrientationChanged(screenId, screenOrientation);
194 return ERR_NONE;
195 }
196
HandleOnScreenRotationLockedChanged(MessageParcel & data,MessageParcel & reply)197 int ScreenSessionManagerClientStub::HandleOnScreenRotationLockedChanged(MessageParcel& data, MessageParcel& reply)
198 {
199 WLOGD("HandleOnScreenRotationLockedChanged");
200 auto screenId = static_cast<ScreenId>(data.ReadUint64());
201 auto isLocked = data.ReadBool();
202 OnScreenRotationLockedChanged(screenId, isLocked);
203 return ERR_NONE;
204 }
205
HandleOnDisplayStateChanged(MessageParcel & data,MessageParcel & reply)206 int ScreenSessionManagerClientStub::HandleOnDisplayStateChanged(MessageParcel& data, MessageParcel& reply)
207 {
208 WLOGD("HandleOnDisplayStateChanged");
209 auto defaultDisplayId = static_cast<DisplayId>(data.ReadUint64());
210 auto displayInfo = data.ReadStrongParcelable<DisplayInfo>();
211 auto mapSize = data.ReadUint32();
212 std::map<DisplayId, sptr<DisplayInfo>> displayInfoMap;
213 while (mapSize--) {
214 auto displayId = data.ReadUint64();
215 auto displayInfoValue = data.ReadStrongParcelable<DisplayInfo>();
216 displayInfoMap.emplace(displayId, displayInfoValue);
217 }
218 auto type = static_cast<DisplayStateChangeType>(data.ReadUint32());
219 OnDisplayStateChanged(defaultDisplayId, displayInfo, displayInfoMap, type);
220 return ERR_NONE;
221 }
222
HandleOnUpdateFoldDisplayMode(MessageParcel & data,MessageParcel & reply)223 int ScreenSessionManagerClientStub::HandleOnUpdateFoldDisplayMode(MessageParcel& data, MessageParcel& reply)
224 {
225 WLOGD("HandleOnUpdateFoldDisplayMode");
226 auto foldDisplayMode = static_cast<FoldDisplayMode>(data.ReadUint32());
227 OnUpdateFoldDisplayMode(foldDisplayMode);
228 return ERR_NONE;
229 }
230
HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel & data,MessageParcel & reply)231 int ScreenSessionManagerClientStub::HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel& data,
232 MessageParcel& reply)
233 {
234 std::vector<uint64_t> missionIds;
235 data.ReadUInt64Vector(&missionIds);
236 std::vector<uint64_t> surfaceNodeIds;
237 data.ReadUInt64Vector(&surfaceNodeIds);
238 bool isBlackList = data.ReadBool();
239 OnGetSurfaceNodeIdsFromMissionIdsChanged(missionIds, surfaceNodeIds, isBlackList);
240 if (!reply.WriteUInt64Vector(surfaceNodeIds)) {
241 WLOGFE("Write surfaceNodeIds failed");
242 return ERR_TRANSACTION_FAILED;
243 }
244 return ERR_NONE;
245 }
246
HandleOnScreenshot(MessageParcel & data,MessageParcel & reply)247 int ScreenSessionManagerClientStub::HandleOnScreenshot(MessageParcel& data, MessageParcel& reply)
248 {
249 WLOGD("HandleOnScreenshot");
250 auto displayId = static_cast<DisplayId>(data.ReadUint64());
251 OnScreenshot(displayId);
252 return ERR_NONE;
253 }
254
HandleOnImmersiveStateChanged(MessageParcel & data,MessageParcel & reply)255 int ScreenSessionManagerClientStub::HandleOnImmersiveStateChanged(MessageParcel& data, MessageParcel& reply)
256 {
257 WLOGD("HandleOnImmersiveStateChanged");
258 bool immersive = false;
259 OnImmersiveStateChanged(immersive);
260 if (!reply.WriteBool(immersive)) {
261 WLOGFE("Write immersive failed");
262 return ERR_TRANSACTION_FAILED;
263 }
264 return ERR_NONE;
265 }
266
HandleOnSetDisplayNodeScreenId(MessageParcel & data,MessageParcel & reply)267 int ScreenSessionManagerClientStub::HandleOnSetDisplayNodeScreenId(MessageParcel& data, MessageParcel& reply)
268 {
269 WLOGD("HandleOnSetDisplayNodeScreenId");
270 auto screenId = static_cast<ScreenId>(data.ReadUint64());
271 auto displayNodeScreenId = static_cast<ScreenId>(data.ReadUint64());
272 SetDisplayNodeScreenId(screenId, displayNodeScreenId);
273 return ERR_NONE;
274 }
275
HandleSetVirtualPixelRatioSystem(MessageParcel & data,MessageParcel & reply)276 int ScreenSessionManagerClientStub::HandleSetVirtualPixelRatioSystem(MessageParcel& data, MessageParcel& reply)
277 {
278 WLOGD("HandleSetVirtualPixelRatioSystem");
279 auto screenId = static_cast<ScreenId>(data.ReadUint64());
280 float virtualPixelRatio = data.ReadFloat();
281 SetVirtualPixelRatioSystem(screenId, virtualPixelRatio);
282 return ERR_NONE;
283 }
284
HandleOnFoldStatusChangedReportUE(MessageParcel & data,MessageParcel & reply)285 int ScreenSessionManagerClientStub::HandleOnFoldStatusChangedReportUE(MessageParcel& data, MessageParcel& reply)
286 {
287 std::vector<std::string> screenFoldInfo;
288 data.ReadStringVector(&screenFoldInfo);
289 OnFoldStatusChangedReportUE(screenFoldInfo);
290 return ERR_NONE;
291 }
292
HandleOnHoverStatusChanged(MessageParcel & data,MessageParcel & reply)293 int ScreenSessionManagerClientStub::HandleOnHoverStatusChanged(MessageParcel& data, MessageParcel& reply)
294 {
295 WLOGD("HandleOnHoverStatusChanged");
296 auto screenId = static_cast<ScreenId>(data.ReadUint64());
297 auto hoverStatus = data.ReadInt32();
298 auto needRotate = data.ReadBool();
299 OnHoverStatusChanged(screenId, hoverStatus, needRotate);
300 return ERR_NONE;
301 }
302
HandleScreenCaptureNotify(MessageParcel & data,MessageParcel & reply)303 int ScreenSessionManagerClientStub::HandleScreenCaptureNotify(MessageParcel& data, MessageParcel& reply)
304 {
305 auto screenId = static_cast<ScreenId>(data.ReadUint64());
306 auto uid = data.ReadInt32();
307 auto clientName = data.ReadString();
308 WLOGI("notify scb capture screenId=%{public}" PRIu64", uid=%{public}d.", screenId, uid);
309 ScreenCaptureNotify(screenId, uid, clientName);
310 return ERR_NONE;
311 }
312
HandleOnCameraBackSelfieChanged(MessageParcel & data,MessageParcel & reply)313 int ScreenSessionManagerClientStub::HandleOnCameraBackSelfieChanged(MessageParcel& data, MessageParcel& reply)
314 {
315 WLOGD("HandleOnCameraBackSelfieChanged");
316 auto screenId = static_cast<ScreenId>(data.ReadUint64());
317 bool isCameraBackSelfie = data.ReadBool();
318 OnCameraBackSelfieChanged(screenId, isCameraBackSelfie);
319 return ERR_NONE;
320 }
321
HandleOnSecondaryReflexionChanged(MessageParcel & data,MessageParcel & reply)322 int ScreenSessionManagerClientStub::HandleOnSecondaryReflexionChanged(MessageParcel& data, MessageParcel& reply)
323 {
324 auto screenId = static_cast<ScreenId>(data.ReadUint64());
325 auto isSecondaryReflexion = data.ReadBool();
326 WLOGI("secondary reflexion screenId=%{public}" PRIu64", isSecondaryReflexion=%{public}d.",
327 screenId, static_cast<uint32_t>(isSecondaryReflexion));
328 OnSecondaryReflexionChanged(screenId, isSecondaryReflexion);
329 return ERR_NONE;
330 }
331 } // namespace OHOS::Rosen
332