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 }
100
ScreenSessionManagerClientStub()101 ScreenSessionManagerClientStub::ScreenSessionManagerClientStub()
102 {
103 InitScreenChangeMap();
104 }
105
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)106 int ScreenSessionManagerClientStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
107 MessageOption& option)
108 {
109 int handleRet = ERR_INVALID_STATE;
110 if (data.ReadInterfaceToken() != GetDescriptor()) {
111 WLOGFE("Failed to check interface token!");
112 return handleRet;
113 }
114 ScreenSessionManagerClientMessage msgId = static_cast<ScreenSessionManagerClientMessage>(code);
115 auto handleCall = HandleScreenChangeMap_.find(msgId);
116 if (handleCall != HandleScreenChangeMap_.end() && handleCall->second != nullptr) {
117 auto handleFunc = handleCall->second;
118 handleRet = handleFunc(data, reply);
119 } else {
120 WLOGFE("Failed to find function handler!");
121 handleRet = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
122 }
123 return handleRet;
124 }
125
HandleSwitchUserCallback(MessageParcel & data,MessageParcel & reply)126 int ScreenSessionManagerClientStub::HandleSwitchUserCallback(MessageParcel& data, MessageParcel& reply)
127 {
128 WLOGD("HandleSwitchUserCallback");
129 std::vector<int32_t> oldScbPids;
130 data.ReadInt32Vector(&oldScbPids);
131 int32_t currentScbPid = data.ReadInt32();
132 SwitchUserCallback(oldScbPids, currentScbPid);
133 return ERR_NONE;
134 }
135
HandleOnScreenConnectionChanged(MessageParcel & data,MessageParcel & reply)136 int ScreenSessionManagerClientStub::HandleOnScreenConnectionChanged(MessageParcel& data, MessageParcel& reply)
137 {
138 WLOGD("HandleOnScreenConnectionChanged");
139 auto screenId = static_cast<ScreenId>(data.ReadUint64());
140 auto screenEvent = static_cast<ScreenEvent>(data.ReadUint8());
141 auto rsId = static_cast<ScreenId>(data.ReadUint64());
142 auto name = data.ReadString();
143 OnScreenConnectionChanged(screenId, screenEvent, rsId, name);
144 return ERR_NONE;
145 }
146
HandleOnPropertyChanged(MessageParcel & data,MessageParcel & reply)147 int ScreenSessionManagerClientStub::HandleOnPropertyChanged(MessageParcel& data, MessageParcel& reply)
148 {
149 WLOGD("HandleOnPropertyChanged");
150 auto screenId = static_cast<ScreenId>(data.ReadUint64());
151 ScreenProperty property;
152 if (!RSMarshallingHelper::Unmarshalling(data, property)) {
153 WLOGFE("Read property failed");
154 return ERR_INVALID_DATA;
155 }
156 auto reason = static_cast<ScreenPropertyChangeReason>(data.ReadUint32());
157 OnPropertyChanged(screenId, property, reason);
158 return ERR_NONE;
159 }
160
HandleOnPowerStatusChanged(MessageParcel & data,MessageParcel & reply)161 int ScreenSessionManagerClientStub::HandleOnPowerStatusChanged(MessageParcel& data, MessageParcel& reply)
162 {
163 WLOGD("HandleOnPowerStatusChanged");
164 auto event = static_cast<DisplayPowerEvent>(data.ReadUint32());
165 auto status = static_cast<EventStatus>(data.ReadUint32());
166 auto reason = static_cast<PowerStateChangeReason>(data.ReadUint32());
167 OnPowerStatusChanged(event, status, reason);
168 return ERR_NONE;
169 }
170
HandleOnSensorRotationChanged(MessageParcel & data,MessageParcel & reply)171 int ScreenSessionManagerClientStub::HandleOnSensorRotationChanged(MessageParcel& data, MessageParcel& reply)
172 {
173 WLOGD("HandleOnSensorRotationChanged");
174 auto screenId = static_cast<ScreenId>(data.ReadUint64());
175 auto sensorRotation = data.ReadFloat();
176 OnSensorRotationChanged(screenId, sensorRotation);
177 return ERR_NONE;
178 }
179
HandleOnScreenOrientationChanged(MessageParcel & data,MessageParcel & reply)180 int ScreenSessionManagerClientStub::HandleOnScreenOrientationChanged(MessageParcel& data, MessageParcel& reply)
181 {
182 WLOGD("HandleOnScreenOrientationChanged");
183 auto screenId = static_cast<ScreenId>(data.ReadUint64());
184 auto screenOrientation = data.ReadFloat();
185 OnScreenOrientationChanged(screenId, screenOrientation);
186 return ERR_NONE;
187 }
188
HandleOnScreenRotationLockedChanged(MessageParcel & data,MessageParcel & reply)189 int ScreenSessionManagerClientStub::HandleOnScreenRotationLockedChanged(MessageParcel& data, MessageParcel& reply)
190 {
191 WLOGD("HandleOnScreenRotationLockedChanged");
192 auto screenId = static_cast<ScreenId>(data.ReadUint64());
193 auto isLocked = data.ReadBool();
194 OnScreenRotationLockedChanged(screenId, isLocked);
195 return ERR_NONE;
196 }
197
HandleOnDisplayStateChanged(MessageParcel & data,MessageParcel & reply)198 int ScreenSessionManagerClientStub::HandleOnDisplayStateChanged(MessageParcel& data, MessageParcel& reply)
199 {
200 WLOGD("HandleOnDisplayStateChanged");
201 auto defaultDisplayId = static_cast<DisplayId>(data.ReadUint64());
202 auto displayInfo = data.ReadStrongParcelable<DisplayInfo>();
203 auto mapSize = data.ReadUint32();
204 std::map<DisplayId, sptr<DisplayInfo>> displayInfoMap;
205 while (mapSize--) {
206 auto displayId = data.ReadUint64();
207 auto displayInfoValue = data.ReadStrongParcelable<DisplayInfo>();
208 displayInfoMap.emplace(displayId, displayInfoValue);
209 }
210 auto type = static_cast<DisplayStateChangeType>(data.ReadUint32());
211 OnDisplayStateChanged(defaultDisplayId, displayInfo, displayInfoMap, type);
212 return ERR_NONE;
213 }
214
HandleOnUpdateFoldDisplayMode(MessageParcel & data,MessageParcel & reply)215 int ScreenSessionManagerClientStub::HandleOnUpdateFoldDisplayMode(MessageParcel& data, MessageParcel& reply)
216 {
217 WLOGD("HandleOnUpdateFoldDisplayMode");
218 auto foldDisplayMode = static_cast<FoldDisplayMode>(data.ReadUint32());
219 OnUpdateFoldDisplayMode(foldDisplayMode);
220 return ERR_NONE;
221 }
222
HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel & data,MessageParcel & reply)223 int ScreenSessionManagerClientStub::HandleOnGetSurfaceNodeIdsFromMissionIdsChanged(MessageParcel& data,
224 MessageParcel& reply)
225 {
226 std::vector<uint64_t> missionIds;
227 data.ReadUInt64Vector(&missionIds);
228 std::vector<uint64_t> surfaceNodeIds;
229 data.ReadUInt64Vector(&surfaceNodeIds);
230 bool isBlackList = data.ReadBool();
231 OnGetSurfaceNodeIdsFromMissionIdsChanged(missionIds, surfaceNodeIds, isBlackList);
232 if (!reply.WriteUInt64Vector(surfaceNodeIds)) {
233 WLOGFE("Write surfaceNodeIds failed");
234 return ERR_TRANSACTION_FAILED;
235 }
236 return ERR_NONE;
237 }
238
HandleOnScreenshot(MessageParcel & data,MessageParcel & reply)239 int ScreenSessionManagerClientStub::HandleOnScreenshot(MessageParcel& data, MessageParcel& reply)
240 {
241 WLOGD("HandleOnScreenshot");
242 auto displayId = static_cast<DisplayId>(data.ReadUint64());
243 OnScreenshot(displayId);
244 return ERR_NONE;
245 }
246
HandleOnImmersiveStateChanged(MessageParcel & data,MessageParcel & reply)247 int ScreenSessionManagerClientStub::HandleOnImmersiveStateChanged(MessageParcel& data, MessageParcel& reply)
248 {
249 WLOGD("HandleOnImmersiveStateChanged");
250 bool immersive = false;
251 OnImmersiveStateChanged(immersive);
252 if (!reply.WriteBool(immersive)) {
253 WLOGFE("Write immersive failed");
254 return ERR_TRANSACTION_FAILED;
255 }
256 return ERR_NONE;
257 }
258
HandleOnSetDisplayNodeScreenId(MessageParcel & data,MessageParcel & reply)259 int ScreenSessionManagerClientStub::HandleOnSetDisplayNodeScreenId(MessageParcel& data, MessageParcel& reply)
260 {
261 WLOGD("HandleOnSetDisplayNodeScreenId");
262 auto screenId = static_cast<ScreenId>(data.ReadUint64());
263 auto displayNodeScreenId = static_cast<ScreenId>(data.ReadUint64());
264 SetDisplayNodeScreenId(screenId, displayNodeScreenId);
265 return ERR_NONE;
266 }
267
HandleSetVirtualPixelRatioSystem(MessageParcel & data,MessageParcel & reply)268 int ScreenSessionManagerClientStub::HandleSetVirtualPixelRatioSystem(MessageParcel& data, MessageParcel& reply)
269 {
270 WLOGD("HandleSetVirtualPixelRatioSystem");
271 auto screenId = static_cast<ScreenId>(data.ReadUint64());
272 float virtualPixelRatio = data.ReadFloat();
273 SetVirtualPixelRatioSystem(screenId, virtualPixelRatio);
274 return ERR_NONE;
275 }
276
HandleOnFoldStatusChangedReportUE(MessageParcel & data,MessageParcel & reply)277 int ScreenSessionManagerClientStub::HandleOnFoldStatusChangedReportUE(MessageParcel& data, MessageParcel& reply)
278 {
279 std::vector<std::string> screenFoldInfo;
280 data.ReadStringVector(&screenFoldInfo);
281 OnFoldStatusChangedReportUE(screenFoldInfo);
282 return ERR_NONE;
283 }
284
HandleOnHoverStatusChanged(MessageParcel & data,MessageParcel & reply)285 int ScreenSessionManagerClientStub::HandleOnHoverStatusChanged(MessageParcel& data, MessageParcel& reply)
286 {
287 WLOGD("HandleOnHoverStatusChanged");
288 auto screenId = static_cast<ScreenId>(data.ReadUint64());
289 auto hoverStatus = data.ReadInt32();
290 OnHoverStatusChanged(screenId, hoverStatus);
291 return ERR_NONE;
292 }
293
HandleScreenCaptureNotify(MessageParcel & data,MessageParcel & reply)294 int ScreenSessionManagerClientStub::HandleScreenCaptureNotify(MessageParcel& data, MessageParcel& reply)
295 {
296 auto screenId = static_cast<ScreenId>(data.ReadUint64());
297 auto uid = data.ReadInt32();
298 auto clientName = data.ReadString();
299 WLOGI("notify scb capture screenId=%{public}" PRIu64", uid=%{public}d.", screenId, uid);
300 ScreenCaptureNotify(screenId, uid, clientName);
301 return ERR_NONE;
302 }
303 } // namespace OHOS::Rosen
304