• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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