1 /*
2 * Copyright (c) 2024 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 "screen_session_dumper.h"
17
18 #include <csignal>
19 #include <fstream>
20 #include <transaction/rs_interfaces.h>
21
22 #include "unique_fd.h"
23 #include "screen_session_manager.h"
24 #include "session_permission.h"
25 #include "screen_rotation_property.h"
26 #include "screen_sensor_connector.h"
27 #include "parameters.h"
28 #include "fold_screen_controller/super_fold_state_manager.h"
29 #include "fold_screen_controller/super_fold_sensor_manager.h"
30 #include "fold_screen_controller/fold_screen_sensor_manager.h"
31 #include "fold_screen_state_internel.h"
32 #include "window_helper.h"
33 #include "fold_screen_controller/secondary_fold_sensor_manager.h"
34
35 namespace OHOS {
36 namespace Rosen {
37 namespace {
38 constexpr int LINE_WIDTH = 30;
39 constexpr int DUMPER_PARAM_INDEX_ONE = 1;
40 constexpr int DUMPER_PARAM_INDEX_TWO = 2;
41 constexpr int DUMPER_PARAM_INDEX_THREE = 3;
42 constexpr int MAX_DUMPER_PARAM_NUMBER = 10;
43 const std::string ARG_DUMP_HELP = "-h";
44 const std::string ARG_DUMP_ALL = "-a";
45 const std::string ARG_DUMP_FOLD_STATUS = "-f";
46
47 constexpr int MOTION_SENSOR_PARAM_SIZE = 2;
48 const std::string STATUS_FOLD_HALF = "-z";
49 const std::string STATUS_EXPAND = "-y";
50 const std::string STATUS_FOLD = "-p";
51 const std::string ARG_SET_ROTATION_SENSOR = "-motion"; // rotation event inject
52 const std::string ARG_SET_ROTATION_LOCK = "-rotationlock";
53 const std::string ARG_PUBLISH_CAST_EVENT = "-publishcastevent";
54 const std::string ARG_FOLD_DISPLAY_FULL = "-f";
55 const std::string ARG_FOLD_DISPLAY_MAIN = "-m";
56 const std::string ARG_FOLD_DISPLAY_GLOBALL_FULL = "-g";
57 const std::string ARG_FOLD_DISPLAY_SUB = "-sub";
58 const std::string ARG_FOLD_DISPLAY_COOR = "-coor";
59 const std::vector<std::string> displayModeCommands = {"-f", "-m", "-sub", "-coor", "-g"};
60 const std::string ARG_LOCK_FOLD_DISPLAY_STATUS = "-l";
61 const std::string ARG_UNLOCK_FOLD_DISPLAY_STATUS = "-u";
62 const std::string ARG_SET_ON_TENT_MODE = "-ontent";
63 const std::string ARG_SET_OFF_TENT_MODE = "-offtent";
64 const std::string ARG_SET_HOVER_STATUS = "-hoverstatus";
65 const std::string ARG_SET_SUPER_FOLD_STATUS = "-supertrans";
66 const std::string ARG_SET_POSTURE_HALL = "-posture";
67 const std::string ARG_SET_POSTURE_HALL_STATUS = "-registerhall"; // 关闭开合sensor报值
68 const std::string ARG_SET_SECONDARY_FOLD_STATUS = "-secondary";
69 const std::string ARG_CHANGE_OUTER_CMD = "outer";
70 const std::string ANGLE_STR = "angle";
71 const std::string HALL_STR = "hall";
72 const std::string ARG_SET_LANDSCAPE_LOCK = "-landscapelock";
73 const std::string ARG_SET_DURINGCALL_STATE = "-duringcallstate";
74 #ifdef FOLD_ABILITY_ENABLE
75 constexpr int SUPER_FOLD_STATUS_MAX = 2;
76 const char SECONDARY_DUMPER_VALUE_BOUNDARY[] = "mfg";
77 constexpr size_t SECONDARY_FOLD_STATUS_INDEX_M = 0;
78 constexpr size_t SECONDARY_FOLD_STATUS_INDEX_F = 1;
79 constexpr size_t SECONDARY_FOLD_STATUS_INDEX_G = 2;
80 constexpr size_t SECONDARY_FOLD_STATUS_COMMAND_NUM = 2;
81 constexpr uint16_t HALL_EXT_DATA_FLAG = 26;
82 #endif
83 }
84
GetProcessNameByPid(int32_t pid)85 static std::string GetProcessNameByPid(int32_t pid)
86 {
87 std::string filePath = "/proc/" + std::to_string(pid) + "/comm";
88 char tmpPath[PATH_MAX] = { 0 };
89 if (!realpath(filePath.c_str(), tmpPath)) {
90 return "UNKNOWN";
91 }
92 std::ifstream infile(filePath);
93 if (!infile.is_open()) {
94 return "UNKNOWN";
95 }
96 std::string processName = "UNKNOWN";
97 std::getline(infile, processName);
98 infile.close();
99 return processName;
100 }
101
ScreenSessionDumper(int fd,const std::vector<std::u16string> & args)102 ScreenSessionDumper::ScreenSessionDumper(int fd, const std::vector<std::u16string>& args)
103 : fd_(fd)
104 {
105 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> cv;
106 std::string info;
107 for (auto& u16str : args) {
108 std::string arg = cv.to_bytes(u16str);
109 params_.emplace_back(arg);
110 info += arg;
111 }
112 TLOGI(WmsLogTag::DMS, "input args: [%{public}s]", info.c_str());
113 }
114
IsNumber(std::string str)115 bool ScreenSessionDumper::IsNumber(std::string str)
116 {
117 if (str.size() == 0) {
118 return false;
119 }
120 for (int32_t i = 0; i < static_cast<int32_t>(str.size()); i++) {
121 if (str.at(i) < '0' || str.at(i) > '9') {
122 return false;
123 }
124 }
125 return true;
126 }
127
OutputDumpInfo()128 void ScreenSessionDumper::OutputDumpInfo()
129 {
130 if (fd_ < 0) {
131 TLOGE(WmsLogTag::DMS, "invalid fd: %{public}d", fd_);
132 return;
133 }
134
135 static_cast<void>(signal(SIGPIPE, SIG_IGN)); // ignore SIGPIPE crash
136 int ret = dprintf(fd_, "%s\n", dumpInfo_.c_str());
137 if (ret < 0) {
138 TLOGE(WmsLogTag::DMS, "dprintf error. ret: %{public}d", ret);
139 return;
140 }
141 dumpInfo_.clear();
142 }
143
144
ExecuteDumpCmd()145 void ScreenSessionDumper::ExecuteDumpCmd()
146 {
147 if (!(SessionPermission::IsSACalling() || SessionPermission::IsStartByHdcd())) {
148 TLOGE(WmsLogTag::DMS, "dump permission denied!");
149 return;
150 }
151 if (params_.empty()) {
152 TLOGE(WmsLogTag::DMS, "params is null");
153 return;
154 }
155 if (params_[0] == ARG_DUMP_HELP) {
156 ShowHelpInfo();
157 } else if (params_[0] == ARG_DUMP_ALL) {
158 ShowAllScreenInfo();
159 ShowVisibleAreaDisplayInfo();
160 ShowClientScreenInfo();
161 } else if (params_[0] == ARG_DUMP_FOLD_STATUS) {
162 DumpFoldStatus();
163 }
164 ExecuteInjectCmd();
165 OutputDumpInfo();
166 }
167
ExecuteInjectCmd()168 void ScreenSessionDumper::ExecuteInjectCmd()
169 {
170 if (IsDeveloperModeCommand()) {
171 return;
172 }
173 bool isDebugMode = system::GetBoolParameter("dms.hidumper.supportdebug", false);
174 if (!isDebugMode) {
175 TLOGI(WmsLogTag::DMS, "Can't use DMS hidumper inject methods.");
176 dumpInfo_.append("dms.hidumper.supportdebug false\n");
177 return;
178 }
179 if (params_.size() == DUMPER_PARAM_INDEX_THREE) {
180 TLOGI(WmsLogTag::DMS, "dump params[0] = %{public}s ,params[1] = %{public}s ,para,s[2] = %{public}s",
181 params_[0].c_str(), params_[DUMPER_PARAM_INDEX_ONE].c_str(), params_[DUMPER_PARAM_INDEX_TWO].c_str());
182 ScreenSessionManager::GetInstance().MultiScreenModeChange(params_[0], params_[DUMPER_PARAM_INDEX_ONE],
183 params_[DUMPER_PARAM_INDEX_TWO]);
184 return;
185 }
186 if (params_[0].find(ARG_PUBLISH_CAST_EVENT) != std::string::npos) {
187 MockSendCastPublishEvent(params_[0]);
188 return;
189 } else if (params_.size() == 1 && (params_[0] == ARG_LOCK_FOLD_DISPLAY_STATUS
190 || params_[0] == ARG_UNLOCK_FOLD_DISPLAY_STATUS)) {
191 int errCode = SetFoldStatusLocked();
192 if (errCode != 0) {
193 ShowIllegalArgsInfo();
194 }
195 return;
196 }
197 ExecuteInjectCmd2();
198 }
199
IsDeveloperModeCommand()200 bool ScreenSessionDumper::IsDeveloperModeCommand()
201 {
202 bool isEnd = true;
203 bool isDeveloperMode = system::GetBoolParameter("const.security.developermode.state", false);
204 if (!isDeveloperMode) {
205 return isEnd;
206 }
207 // print param
208 TLOGI(WmsLogTag::DMS, "get calling uid(%{public}zu)", params_.size());
209 if ((params_.size() < 1) || (params_.size() > MAX_DUMPER_PARAM_NUMBER)) {
210 TLOGE(WmsLogTag::DMS, "params size exceeded limit");
211 return isEnd;
212 }
213 for (const auto& param : params_) {
214 TLOGI(WmsLogTag::DMS, "params_: [%{public}s]", param.c_str());
215 }
216 // deal displayMode and motion/foldstatus
217 if (IsValidDisplayModeCommand(params_[0])) {
218 // check and set display mode
219 if (SetFoldDisplayMode() != 0) {
220 ShowIllegalArgsInfo();
221 }
222 } else if (params_[0] == STATUS_FOLD_HALF || params_[0] == STATUS_EXPAND || params_[0] == STATUS_FOLD) {
223 ShowNotifyFoldStatusChangedInfo();
224 } else if (params_[0].find(ARG_SET_ROTATION_SENSOR) != std::string::npos) {
225 SetMotionSensorValue(params_[0]);
226 } else if (params_[0].find(ARG_SET_ROTATION_LOCK) != std::string::npos) {
227 SetRotationLockedValue(params_[0]);
228 } else {
229 isEnd = false;
230 }
231 return isEnd;
232 }
233
ExecuteInjectCmd2()234 void ScreenSessionDumper::ExecuteInjectCmd2()
235 {
236 if (params_[0].find(ARG_SET_ON_TENT_MODE) != std::string::npos ||
237 params_[0].find(ARG_SET_OFF_TENT_MODE) != std::string::npos) {
238 SetEnterOrExitTentMode(params_[0]);
239 } else if (params_[0].find(ARG_SET_HOVER_STATUS) != std::string::npos) {
240 SetHoverStatusChange(params_[0]);
241 } else if (params_[0].find(ARG_SET_SUPER_FOLD_STATUS) != std::string::npos) {
242 SetSuperFoldStatusChange(params_[0]);
243 } else if (params_[0].find(ARG_SET_POSTURE_HALL) != std::string::npos) {
244 SetHallAndPostureValue(params_[0]);
245 } else if (params_[0].find(ARG_SET_POSTURE_HALL_STATUS) != std::string::npos) {
246 SetHallAndPostureStatus(params_[0]);
247 } else if (params_[0].find(ARG_SET_SECONDARY_FOLD_STATUS) != std::string::npos) {
248 SetSecondaryStatusChange(params_[0]);
249 } else if (params_[0].find(ARG_SET_LANDSCAPE_LOCK) != std::string::npos) {
250 SetLandscapeLock(params_[0]);
251 } else if (params_[0].find(ARG_SET_DURINGCALL_STATE) != std::string::npos) {
252 SetDuringCallState(params_[0]);
253 }
254 }
255
DumpEventTracker(EventTracker & tracker)256 void ScreenSessionDumper::DumpEventTracker(EventTracker& tracker)
257 {
258 std::ostringstream oss;
259 auto recordInfos = tracker.GetRecordInfos();
260 oss << "-------------- DMS KEY EVENTS LIST --------------" << std::endl;
261 for (const auto& info : recordInfos) {
262 oss << std::left << "[" << tracker.formatTimestamp(info.timestamp).c_str()
263 << "]: " << info.info.c_str() << std::endl;
264 }
265 dumpInfo_.append(oss.str());
266 }
267
DumpMultiUserInfo(std::vector<int32_t> oldScbPids,int32_t userId,int32_t ScbPid)268 void ScreenSessionDumper::DumpMultiUserInfo(std::vector<int32_t> oldScbPids, int32_t userId, int32_t ScbPid)
269 {
270 std::ostringstream oss;
271 oss << "-------------- DMS Multi User Info --------------" << std::endl;
272 oss << std::left << "[oldScbPid:] ";
273 for (auto oldScbPid : oldScbPids) {
274 oss << oldScbPid << " ";
275 }
276 oss << std::endl;
277 oss << std::left << "[userId:] " << userId << std::endl;
278 oss << std::left << "[ScbPid:] " << ScbPid << std::endl;
279 dumpInfo_.append(oss.str());
280 }
281
DumpFreezedPidList(std::set<int32_t> pidList)282 void ScreenSessionDumper::DumpFreezedPidList(std::set<int32_t> pidList)
283 {
284 std::ostringstream oss;
285 oss << "-------------- DMS FREEZED PID LIST --------------" << std::endl;
286 for (auto pid : pidList) {
287 oss << std::left << "[PID: " << pid << "]: "
288 << " [" << GetProcessNameByPid(pid) << "]"<< std::endl;
289 }
290 dumpInfo_.append(oss.str());
291 }
292
ShowHelpInfo()293 void ScreenSessionDumper::ShowHelpInfo()
294 {
295 dumpInfo_.append("Usage:\n")
296 .append(" -h ")
297 .append("|help text for the tool\n")
298 .append(" -a ")
299 .append("|dump all screen information in the system\n")
300 .append(" -z ")
301 .append("|switch to fold half status\n")
302 .append(" -y ")
303 .append("|switch to expand status\n")
304 .append(" -p ")
305 .append("|switch to fold status\n")
306 .append(" -f ")
307 .append("|switch to full display mode\n")
308 .append(" -m ")
309 .append("|switch to main display mode\n")
310 .append(" -sub ")
311 .append("|switch to sub display mode\n")
312 .append(" -coor ")
313 .append("|switch to coor display mode\n")
314 .append(" -g ")
315 .append("|switch to global full display mode\n")
316 .append(" -rotationlock ")
317 .append("|set rotation lock, 0 to unloick, 1 to lock, "\
318 "eg. -rotationlock,0 \n")
319 .append(" -motion ")
320 .append("|set the sensor rotation angle clockwise, "\
321 "0 means 0 degree, 1 means 90 degree, 2 means 180 degree, 3 means 270 degree, eg. -motion,1\n");
322 if (!system::GetBoolParameter("dms.hidumper.supportdebug", false)) {
323 return;
324 }
325 dumpInfo_.append(" -ontent ")
326 .append("|set up tent mode\n")
327 .append(" -offtent ")
328 .append("|set exit tent mode\n")
329 .append(" -publishcastevent ")
330 .append("|publish cast event\n")
331 .append(" -registerhall ")
332 .append("|set hall register, 0 to unregister, 1 to register\n");
333 }
334
ShowAllScreenInfo()335 void ScreenSessionDumper::ShowAllScreenInfo()
336 {
337 std::vector<ScreenId> screenIds = ScreenSessionManager::GetInstance().GetAllScreenIds();
338 for (auto screenId : screenIds) {
339 std::ostringstream oss;
340 oss << "---------------- Screen ID: " << screenId << " ----------------" << std::endl;
341 dumpInfo_.append(oss.str());
342 DumpFoldStatus();
343 DumpTentMode();
344 DumpScreenSessionById(screenId);
345 DumpRsInfoById(screenId);
346 DumpCutoutInfoById(screenId);
347 DumpScreenInfoById(screenId);
348 DumpScreenPropertyById(screenId);
349 DumpFoldCreaseRegion();
350 }
351 }
352
ShowClientScreenInfo()353 void ScreenSessionDumper::ShowClientScreenInfo()
354 {
355 std::string clientInfos = ScreenSessionManager::GetInstance().DumperClientScreenSessions();
356 dumpInfo_.append(clientInfos);
357 }
358
ShowVisibleAreaDisplayInfo()359 void ScreenSessionDumper::ShowVisibleAreaDisplayInfo()
360 {
361 std::vector<DisplayId> displayIds = ScreenSessionManager::GetInstance().GetAllDisplayIds();
362 for (auto displayId : displayIds) {
363 std::ostringstream oss;
364 oss << "-------------- Display ID: " << displayId << " --------------" << std::endl;
365 dumpInfo_.append(oss.str());
366 DumpVisibleAreaDisplayInfoById(displayId);
367 }
368 }
369
DumpFoldStatus()370 void ScreenSessionDumper::DumpFoldStatus()
371 {
372 std::ostringstream oss;
373 auto foldStatus = ScreenSessionManager::GetInstance().GetFoldStatus();
374 std::string status = "";
375 switch (foldStatus) {
376 case FoldStatus::EXPAND: {
377 status = "EXPAND";
378 break;
379 }
380 case FoldStatus::FOLDED: {
381 status = "FOLDED";
382 break;
383 }
384 case FoldStatus::HALF_FOLD: {
385 status = "HALF_FOLD";
386 break;
387 }
388 case FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_EXPAND: {
389 status = "FOLD_STATUS_EXPANDED_WITH_SECOND_EXPANDED";
390 break;
391 }
392 case FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_HALF_FOLDED: {
393 status = "FOLD_STATUS_EXPANDED_WITH_SECOND_HALF_FOLDED";
394 break;
395 }
396 case FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_EXPAND: {
397 status = "FOLD_STATUS_FOLDED_WITH_SECOND_EXPANDED";
398 break;
399 }
400 case FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_HALF_FOLDED: {
401 status = "FOLD_STATUS_FOLDED_WITH_SECOND_HALF_FOLDED";
402 break;
403 }
404 case FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_EXPAND: {
405 status = "FOLD_STATUS_HALF_FOLDED_WITH_SECOND_EXPANDED";
406 break;
407 }
408 case FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_HALF_FOLDED: {
409 status = "FOLD_STATUS_HALF_FOLDED_WITH_SECOND_HALF_FOLDED";
410 break;
411 }
412 default: {
413 status = "UNKNOWN";
414 break;
415 }
416 }
417 oss << std::left << std::setw(LINE_WIDTH) << "FoldStatus: "
418 << status << std::endl;
419 dumpInfo_.append(oss.str());
420 }
421
DumpTentMode()422 void ScreenSessionDumper::DumpTentMode()
423 {
424 std::ostringstream oss;
425 bool isTentMode = ScreenSessionManager::GetInstance().GetTentMode();
426 oss << std::left << std::setw(LINE_WIDTH) << "TentMode: "
427 << (isTentMode ? "true" : "false") << std::endl;
428 dumpInfo_.append(oss.str());
429 }
430
DumpFoldCreaseRegion()431 void ScreenSessionDumper::DumpFoldCreaseRegion()
432 {
433 std::ostringstream oss;
434 auto creaseRegion = ScreenSessionManager::GetInstance().GetCurrentFoldCreaseRegion();
435 if (creaseRegion == nullptr) {
436 TLOGE(WmsLogTag::DMS, "creaseRegion is nullptr.");
437 return;
438 }
439 auto creaseRects = creaseRegion->GetCreaseRects();
440 if (creaseRects.empty()) {
441 TLOGE(WmsLogTag::DMS, "current crease region is null");
442 return;
443 }
444 oss << std::left << std::setw(LINE_WIDTH) << "CurrentCreaseRects<X, Y, W, H>: "
445 << creaseRects[0].posX_ << ", " << creaseRects[0].posY_ << ", "
446 << creaseRects[0].width_ << ", " << creaseRects[0].height_ << std::endl;
447 dumpInfo_.append(oss.str());
448 }
449
DumpScreenSessionById(ScreenId id)450 void ScreenSessionDumper::DumpScreenSessionById(ScreenId id)
451 {
452 std::ostringstream oss;
453 oss << "[SCREEN SESSION]" << std::endl;
454 auto screenSession = ScreenSessionManager::GetInstance().GetScreenSession(id);
455 if (screenSession == nullptr) {
456 TLOGE(WmsLogTag::DMS, "screenSession nullptr. screen id: %{public}" PRIu64"", id);
457 return;
458 }
459 oss << std::left << std::setw(LINE_WIDTH) << "Name: "
460 << screenSession->GetName() << std::endl;
461 oss << std::left << std::setw(LINE_WIDTH) << "DisplayId: "
462 << screenSession->GetDisplayId() << std::endl;
463 oss << std::left << std::setw(LINE_WIDTH) << "RSScreenId: "
464 << screenSession->GetRSScreenId() << std::endl;
465 oss << std::left << std::setw(LINE_WIDTH) << "isInternal: "
466 <<(screenSession->GetIsInternal() ? "true" : "false") << std::endl;
467 oss << std::left << std::setw(LINE_WIDTH) << "isExtend: "
468 << (screenSession->GetIsExtend() ? "true" : "false") << std::endl;
469 if (screenSession->GetDisplayNode()) {
470 oss << std::left << std::setw(LINE_WIDTH) << "NodeId: "
471 << screenSession->GetDisplayNode()->GetId() << std::endl;
472 } else {
473 oss << std::left << std::setw(LINE_WIDTH) << "NodeId: " << "nullptr" << std::endl;
474 }
475 sptr<SupportedScreenModes> activeModes = screenSession->GetActiveScreenMode();
476 if (activeModes != nullptr) {
477 oss << std::left << std::setw(LINE_WIDTH) << "activeModes<id, W, H, RS>: "
478 << activeModes->id_ << ", " << activeModes->width_ << ", "
479 << activeModes->height_ << ", " << activeModes->refreshRate_ << std::endl;
480 }
481 oss << std::left << std::setw(LINE_WIDTH) << "SourceMode: "
482 << static_cast<int32_t>(screenSession->GetSourceMode()) << std::endl;
483 oss << std::left << std::setw(LINE_WIDTH) << "ScreenCombination: "
484 << static_cast<int32_t>(screenSession->GetScreenCombination()) << std::endl;
485 oss << std::left << std::setw(LINE_WIDTH) << "Orientation: "
486 << static_cast<int32_t>(screenSession->GetOrientation()) << std::endl;
487 oss << std::left << std::setw(LINE_WIDTH) << "Rotation: "
488 << static_cast<int32_t>(screenSession->GetRotation()) << std::endl;
489 oss << std::left << std::setw(LINE_WIDTH) << "ScreenRequestedOrientation: "
490 << static_cast<int32_t>(screenSession->GetScreenRequestedOrientation()) << std::endl;
491 oss << std::left << std::setw(LINE_WIDTH) << "isExtend: "
492 << static_cast<int32_t>(screenSession->GetIsExtend()) << std::endl;
493 dumpInfo_.append(oss.str());
494 }
495
DumpRsInfoById(ScreenId id)496 void ScreenSessionDumper::DumpRsInfoById(ScreenId id)
497 {
498 std::ostringstream oss;
499 oss << "[RS INFO]" << std::endl;
500 auto screenSession = ScreenSessionManager::GetInstance().GetScreenSession(id);
501 if (screenSession == nullptr) {
502 TLOGE(WmsLogTag::DMS, "screenSession nullptr. screen id: %{public}" PRIu64"", id);
503 return;
504 }
505 auto state = static_cast<ScreenPowerState>(RSInterfaces::GetInstance().GetScreenPowerStatus(id));
506 oss << std::left << std::setw(LINE_WIDTH) << "ScreenPowerState: "
507 << static_cast<int32_t>(state) << std::endl;
508 std::vector<ScreenColorGamut> colorGamuts;
509 DMError ret = screenSession->GetScreenSupportedColorGamuts(colorGamuts);
510 if (ret == DMError::DM_OK && colorGamuts.size() > 0) {
511 oss << std::left << std::setw(LINE_WIDTH) << "SupportedColorGamuts: ";
512 for (uint32_t i = 0; i < colorGamuts.size() - 1; i++) {
513 oss << static_cast<int32_t>(colorGamuts[i]) << ", ";
514 }
515 oss << static_cast<int32_t>(colorGamuts[colorGamuts.size() - 1]) << std::endl;
516 }
517 ScreenColorGamut colorGamut;
518 ret = screenSession->GetScreenColorGamut(colorGamut);
519 if (ret == DMError::DM_OK) {
520 oss << std::left << std::setw(LINE_WIDTH) << "ScreenColorGamut: "
521 << static_cast<int32_t>(colorGamut) << std::endl;
522 }
523 ScreenGamutMap gamutMap;
524 ret = screenSession->GetScreenGamutMap(gamutMap);
525 if (ret == DMError::DM_OK) {
526 oss << std::left << std::setw(LINE_WIDTH) << "ScreenGamutMap: "
527 << static_cast<int32_t>(gamutMap) << std::endl;
528 }
529 GraphicPixelFormat pixelFormat;
530 ret = screenSession->GetPixelFormat(pixelFormat);
531 if (ret == DMError::DM_OK) {
532 oss << std::left << std::setw(LINE_WIDTH) << "GraphicPixelFormat: "
533 << static_cast<int32_t>(pixelFormat) << std::endl;
534 }
535 dumpInfo_.append(oss.str());
536 DumpRsInfoById01(screenSession); // 拆分函数,避免函数过长
537 }
538
DumpRsInfoById01(sptr<ScreenSession> screenSession)539 void ScreenSessionDumper::DumpRsInfoById01(sptr<ScreenSession> screenSession)
540 {
541 std::ostringstream oss;
542 std::vector<ScreenHDRFormat> hdrFormats;
543 DMError ret = screenSession->GetSupportedHDRFormats(hdrFormats);
544 if (ret == DMError::DM_OK && hdrFormats.size() > 0) {
545 oss << std::left << std::setw(LINE_WIDTH) << "SupportedScreenHDRFormat: ";
546 for (uint32_t i = 0; i < hdrFormats.size() - 1; i++) {
547 oss << static_cast<int32_t>(hdrFormats[i]) << ", ";
548 }
549 oss << static_cast<int32_t>(hdrFormats[hdrFormats.size() - 1]) << std::endl;
550 }
551 ScreenHDRFormat hdrFormat;
552 ret = screenSession->GetScreenHDRFormat(hdrFormat);
553 if (ret == DMError::DM_OK) {
554 oss << std::left << std::setw(LINE_WIDTH) << "ScreenHDRFormat: "
555 << static_cast<int32_t>(hdrFormat) << std::endl;
556 }
557 std::vector<GraphicCM_ColorSpaceType> colorSpaces;
558 ret = screenSession->GetSupportedColorSpaces(colorSpaces);
559 if (ret == DMError::DM_OK && colorSpaces.size() > 0) {
560 oss << std::left << std::setw(LINE_WIDTH) << "SupportedColorSpaces: ";
561 for (uint32_t i = 0; i < colorSpaces.size() - 1; i++) {
562 oss << static_cast<int32_t>(colorSpaces[i]) << ", ";
563 }
564 oss << static_cast<int32_t>(colorSpaces[colorSpaces.size() - 1]) << std::endl;
565 }
566 GraphicCM_ColorSpaceType colorSpace;
567 ret = screenSession->GetScreenColorSpace(colorSpace);
568 if (ret == DMError::DM_OK) {
569 oss << std::left << std::setw(LINE_WIDTH) << "ScreenColorSpace: "
570 << static_cast<int32_t>(colorSpace) << std::endl;
571 }
572 dumpInfo_.append(oss.str());
573 }
574
DumpCutoutInfoPrint(std::ostringstream & oss,const DMRect & areaRect,const std::string & label)575 void ScreenSessionDumper::DumpCutoutInfoPrint(std::ostringstream& oss,
576 const DMRect& areaRect, const std::string& label)
577 {
578 oss << std::left << std::setw(LINE_WIDTH) << label
579 << areaRect.posX_ << ", "
580 << areaRect.posY_ << ", "
581 << areaRect.width_ << ", "
582 << areaRect.height_ << std::endl;
583 }
584
DumpCutoutInfoById(ScreenId id)585 void ScreenSessionDumper::DumpCutoutInfoById(ScreenId id)
586 {
587 std::ostringstream oss;
588 oss << "[CUTOUT INFO]" << std::endl;
589 sptr<CutoutInfo> cutoutInfo = ScreenSessionManager::GetInstance().GetCutoutInfo(id);
590 if (cutoutInfo == nullptr) {
591 TLOGE(WmsLogTag::DMS, "cutoutInfo nullptr. screen id: %{public}" PRIu64"", id);
592 return;
593 }
594 DumpCutoutInfoPrint(oss, cutoutInfo->GetWaterfallDisplayAreaRects().left, "WaterFall_L<X,Y,W,H>: ");
595 DumpCutoutInfoPrint(oss, cutoutInfo->GetWaterfallDisplayAreaRects().top, "WaterFall_T<X,Y,W,H>: ");
596 DumpCutoutInfoPrint(oss, cutoutInfo->GetWaterfallDisplayAreaRects().right, "WaterFall_R<X,Y,W,H>: ");
597 DumpCutoutInfoPrint(oss, cutoutInfo->GetWaterfallDisplayAreaRects().bottom, "WaterFall_B<X,Y,W,H>: ");
598
599 std::vector<DMRect> boundingRects = cutoutInfo->GetBoundingRects();
600 oss << std::left << std::setw(LINE_WIDTH) << "BoundingRects<X,Y,W,H>: ";
601 for (auto rect : boundingRects) {
602 oss << "[" << rect.posX_ << ", " << rect.posY_ << ", " << rect.width_ << ", " << rect.height_ << "] ";
603 }
604 oss << std::endl;
605 dumpInfo_.append(oss.str());
606 }
607
DumpScreenInfoById(ScreenId id)608 void ScreenSessionDumper::DumpScreenInfoById(ScreenId id)
609 {
610 std::ostringstream oss;
611 oss << "[SCREEN INFO]" << std::endl;
612 auto screenInfo = ScreenSessionManager::GetInstance().GetScreenInfoById(id);
613 if (screenInfo == nullptr) {
614 TLOGE(WmsLogTag::DMS, "screenInfo nullptr. screen id: %{public}" PRIu64"", id);
615 return;
616 }
617 oss << std::left << std::setw(LINE_WIDTH) << "VirtualWidth: "
618 << screenInfo->GetVirtualWidth() << std::endl;
619 oss << std::left << std::setw(LINE_WIDTH) << "VirtualHeight: "
620 << screenInfo->GetVirtualHeight() << std::endl;
621 oss << std::left << std::setw(LINE_WIDTH) << "LastParentId: "
622 << screenInfo->GetLastParentId() << std::endl;
623 oss << std::left << std::setw(LINE_WIDTH) << "ParentId: "
624 << screenInfo->GetParentId() << std::endl;
625 oss << std::left << std::setw(LINE_WIDTH) << "IsScreenGroup: "
626 << screenInfo->GetIsScreenGroup() << std::endl;
627 oss << std::left << std::setw(LINE_WIDTH) << "VirtualPixelRatio: "
628 << screenInfo->GetVirtualPixelRatio() << std::endl;
629 oss << std::left << std::setw(LINE_WIDTH) << "Rotation: "
630 << static_cast<int32_t>(screenInfo->GetRotation()) << std::endl;
631 oss << std::left << std::setw(LINE_WIDTH) << "Orientation: "
632 << static_cast<int32_t>(screenInfo->GetOrientation()) << std::endl;
633 oss << std::left << std::setw(LINE_WIDTH) << "SourceMode: "
634 << static_cast<int32_t>(screenInfo->GetSourceMode()) << std::endl;
635 oss << std::left << std::setw(LINE_WIDTH) << "ScreenType: "
636 << static_cast<int32_t>(screenInfo->GetType()) << std::endl;
637 dumpInfo_.append(oss.str());
638 }
639
DumpVisibleAreaDisplayInfoById(DisplayId id)640 void ScreenSessionDumper::DumpVisibleAreaDisplayInfoById(DisplayId id)
641 {
642 std::ostringstream oss;
643 oss << "[DISPLAY INFO]" << std::endl;
644 auto displayInfo = ScreenSessionManager::GetInstance().GetVisibleAreaDisplayInfoById(id);
645 if (displayInfo == nullptr) {
646 TLOGE(WmsLogTag::DMS, "displayInfo nullptr. display id: %{public}" PRIu64"", id);
647 return;
648 }
649 oss << std::left << std::setw(LINE_WIDTH) << "visibleAreaWidth: "
650 << displayInfo->GetWidth() << std::endl;
651 oss << std::left << std::setw(LINE_WIDTH) << "visibleAreaHeight: "
652 << displayInfo->GetHeight() << std::endl;
653 dumpInfo_.append(oss.str());
654 }
655
DumpScreenPropertyById(ScreenId id)656 void ScreenSessionDumper::DumpScreenPropertyById(ScreenId id)
657 {
658 std::ostringstream oss;
659 oss << "[SCREEN PROPERTY]" << std::endl;
660 ScreenProperty screenProperty = ScreenSessionManager::GetInstance().GetScreenProperty(id);
661
662 oss << std::left << std::setw(LINE_WIDTH) << "Rotation: " << screenProperty.GetRotation() << std::endl;
663 oss << std::left << std::setw(LINE_WIDTH) << "Density: " << screenProperty.GetDensity() << std::endl;
664 oss << std::left << std::setw(LINE_WIDTH) << "DensityInCurResolution: "
665 << screenProperty.GetDensityInCurResolution() << std::endl;
666 oss << std::left << std::setw(LINE_WIDTH) << "PhyWidth: " << screenProperty.GetPhyWidth() << std::endl;
667 oss << std::left << std::setw(LINE_WIDTH) << "PhyHeight: " << screenProperty.GetPhyHeight() << std::endl;
668 oss << std::left << std::setw(LINE_WIDTH) << "RefreshRate: " << screenProperty.GetRefreshRate() << std::endl;
669 oss << std::left << std::setw(LINE_WIDTH) << "VirtualPixelRatio: "
670 << screenProperty.GetVirtualPixelRatio() << std::endl;
671 oss << std::left << std::setw(LINE_WIDTH) << "ScreenRotation: "
672 << static_cast<int32_t>(screenProperty.GetRotation()) << std::endl;
673 oss << std::left << std::setw(LINE_WIDTH) << "Orientation: "
674 << static_cast<int32_t>(screenProperty.GetOrientation()) << std::endl;
675 oss << std::left << std::setw(LINE_WIDTH) << "DisplayOrientation: "
676 << static_cast<int32_t>(screenProperty.GetDisplayOrientation()) << std::endl;
677 oss << std::left << std::setw(LINE_WIDTH) << "GetScreenType: "
678 << static_cast<int32_t>(screenProperty.GetScreenType()) << std::endl;
679 oss << std::left << std::setw(LINE_WIDTH) << "ReqOrientation: "
680 << static_cast<int32_t>(screenProperty.GetScreenRequestedOrientation()) << std::endl;
681 oss << std::left << std::setw(LINE_WIDTH) << "DPI<X, Y>: " << screenProperty.GetXDpi()
682 << ", " << screenProperty.GetYDpi() << std::endl;
683 oss << std::left << std::setw(LINE_WIDTH) << "Offset<X, Y>: " << screenProperty.GetOffsetX()
684 << ", " << screenProperty.GetOffsetY() << std::endl;
685 oss << std::left << std::setw(LINE_WIDTH) << "StartPosition<X, Y>: " << screenProperty.GetStartX()
686 << ", " << screenProperty.GetStartY() << std::endl;
687 oss << std::left << std::setw(LINE_WIDTH) << "Bounds<L,T,W,H>: "
688 << screenProperty.GetBounds().rect_.GetLeft() << ", "
689 << screenProperty.GetBounds().rect_.GetTop() << ", "
690 << screenProperty.GetBounds().rect_.GetWidth() << ", "
691 << screenProperty.GetBounds().rect_.GetHeight() << ", " << std::endl;
692 oss << std::left << std::setw(LINE_WIDTH) << "PhyBounds<L,T,W,H>: "
693 << screenProperty.GetPhyBounds().rect_.GetLeft() << ", "
694 << screenProperty.GetPhyBounds().rect_.GetTop() << ", "
695 << screenProperty.GetPhyBounds().rect_.GetWidth() << ", "
696 << screenProperty.GetPhyBounds().rect_.GetHeight() << ", " << std::endl;
697 oss << std::left << std::setw(LINE_WIDTH) << "AvailableArea<X,Y,W,H> "
698 << screenProperty.GetAvailableArea().posX_ << ", "
699 << screenProperty.GetAvailableArea().posY_ << ", "
700 << screenProperty.GetAvailableArea().width_ << ", "
701 << screenProperty.GetAvailableArea().height_ << ", " << std::endl;
702 oss << std::left << std::setw(LINE_WIDTH) << "DefaultDeviceRotationOffset "
703 << screenProperty.GetDefaultDeviceRotationOffset() << std::endl;
704 oss << std::left << std::setw(LINE_WIDTH) << "DisplayGroupId "
705 << screenProperty.GetDisplayGroupId() << std::endl;
706 oss << std::left << std::setw(LINE_WIDTH) << "MainDisplayIdOfGroup "
707 << screenProperty.GetMainDisplayIdOfGroup() << std::endl;
708 dumpInfo_.append(oss.str());
709 }
710
711 /**
712 * hidumper inject methods
713 */
ShowNotifyFoldStatusChangedInfo()714 void ScreenSessionDumper::ShowNotifyFoldStatusChangedInfo()
715 {
716 TLOGI(WmsLogTag::DMS, "params_: [%{public}s]", params_[0].c_str());
717 int errCode = ScreenSessionManager::GetInstance().NotifyFoldStatusChanged(params_[0]);
718 if (errCode != 0) {
719 ShowIllegalArgsInfo();
720 } else {
721 std::ostringstream oss;
722 oss << "currentFoldStatus is: "
723 << static_cast<uint32_t>(ScreenSessionManager::GetInstance().GetFoldStatus())
724 << std::endl;
725 dumpInfo_.append(oss.str());
726 }
727 }
728
ShowIllegalArgsInfo()729 void ScreenSessionDumper::ShowIllegalArgsInfo()
730 {
731 dumpInfo_.append("The arguments are illegal and you can enter '-h' for help.");
732 }
733
SetMotionSensorValue(std::string input)734 void ScreenSessionDumper::SetMotionSensorValue(std::string input)
735 {
736 size_t commaPos = input.find_last_of(',');
737 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_ROTATION_SENSOR)) {
738 std::string valueStr = input.substr(commaPos + 1, MOTION_SENSOR_PARAM_SIZE);
739 if (valueStr.size() == 1 && !std::isdigit(valueStr[0])) {
740 return;
741 }
742 if (valueStr.size() == MOTION_SENSOR_PARAM_SIZE && valueStr != "-1") {
743 return;
744 }
745 int32_t value = std::stoi(valueStr);
746 if (value < static_cast<int32_t>(DeviceRotation::INVALID) ||
747 value > static_cast<int32_t>(DeviceRotation::ROTATION_LANDSCAPE_INVERTED)) {
748 TLOGE(WmsLogTag::DMS, "params is invalid: %{public}d", value);
749 return;
750 }
751 ScreenRotationProperty::HandleSensorEventInput(static_cast<DeviceRotation>(value));
752 TLOGI(WmsLogTag::DMS, "mock motion sensor: %{public}d", value);
753 }
754 }
755
SetRotationLockedValue(std::string input)756 void ScreenSessionDumper::SetRotationLockedValue(std::string input)
757 {
758 size_t commaPos = input.find_last_of(',');
759 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_ROTATION_LOCK)) {
760 std::string valueStr = input.substr(commaPos + 1);
761 if (valueStr.size() != 1) {
762 return;
763 }
764 if (!std::isdigit(valueStr[0])) {
765 return;
766 }
767 int32_t value = std::stoi(valueStr);
768 ScreenSessionManager::GetInstance().SetScreenRotationLocked(static_cast<bool>(value));
769 TLOGI(WmsLogTag::DMS, "mock rotation locked: %{public}d", value);
770 }
771 }
772
MockSendCastPublishEvent(std::string input)773 void ScreenSessionDumper::MockSendCastPublishEvent(std::string input)
774 {
775 std::ostringstream oss;
776 oss << "-------------- DMS SEND CAST PUBLISH EVENT --------------" << std::endl;
777 size_t commaPos = input.find_last_of(',');
778 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_PUBLISH_CAST_EVENT)) {
779 std::string valueStr = input.substr(commaPos + 1);
780 if (valueStr.size() != 1) {
781 oss << std::left << "[error]: " << "the value is too long" << std::endl;
782 dumpInfo_.append(oss.str());
783 return;
784 }
785 if (!std::isdigit(valueStr[0])) {
786 oss << std::left << "[error]: " << "value is not a number" << std::endl;
787 dumpInfo_.append(oss.str());
788 return;
789 }
790 int32_t value = std::stoi(valueStr);
791 ScreenSessionManager::GetInstance().NotifyCastWhenScreenConnectChange(static_cast<bool>(value));
792 oss << std::left << "[success]: " << "send cast publish event success" << std::endl;
793 } else {
794 oss << std::left << "[error]: " << "the command is invalid" << std::endl;
795 }
796 dumpInfo_.append(oss.str());
797 }
798
IsValidDisplayModeCommand(std::string command)799 bool ScreenSessionDumper::IsValidDisplayModeCommand(std::string command)
800 {
801 if (std::find(displayModeCommands.begin(), displayModeCommands.end(), command) != displayModeCommands.end()) {
802 return true;
803 }
804 return false;
805 }
806
SetFoldDisplayMode()807 int32_t ScreenSessionDumper::SetFoldDisplayMode()
808 {
809 std::string modeParam = params_[0];
810 if (modeParam.empty()) {
811 return -1;
812 }
813 FoldDisplayMode displayMode = FoldDisplayMode::UNKNOWN;
814 if (modeParam == ARG_FOLD_DISPLAY_FULL) {
815 displayMode = FoldDisplayMode::FULL;
816 } else if (modeParam == ARG_FOLD_DISPLAY_MAIN) {
817 displayMode = FoldDisplayMode::MAIN;
818 } else if (modeParam == ARG_FOLD_DISPLAY_SUB) {
819 displayMode = FoldDisplayMode::SUB;
820 } else if (modeParam == ARG_FOLD_DISPLAY_COOR) {
821 displayMode = FoldDisplayMode::COORDINATION;
822 } else if (modeParam == ARG_FOLD_DISPLAY_GLOBALL_FULL) {
823 displayMode = FoldDisplayMode::GLOBAL_FULL;
824 } else {
825 TLOGW(WmsLogTag::DMS, "SetFoldDisplayMode mode not support");
826 return -1;
827 }
828 ScreenSessionManager::GetInstance().SetFoldDisplayMode(displayMode);
829 return 0;
830 }
831
SetFoldStatusLocked()832 int ScreenSessionDumper::SetFoldStatusLocked()
833 {
834 std::string lockParam = params_[0];
835 if (lockParam.empty()) {
836 return -1;
837 }
838 bool lockDisplayStatus = false;
839 if (lockParam == ARG_LOCK_FOLD_DISPLAY_STATUS) {
840 lockDisplayStatus = true;
841 } else if (lockParam == ARG_UNLOCK_FOLD_DISPLAY_STATUS) {
842 lockDisplayStatus = false;
843 } else {
844 TLOGW(WmsLogTag::DMS, "SetFoldStatusLocked status not support");
845 return -1;
846 }
847 ScreenSessionManager::GetInstance().SetFoldStatusLocked(lockDisplayStatus);
848 return 0;
849 }
850
SetEnterOrExitTentMode(std::string input)851 void ScreenSessionDumper::SetEnterOrExitTentMode(std::string input)
852 {
853 #ifdef FOLD_ABILITY_ENABLE
854 if (input == ARG_SET_ON_TENT_MODE) {
855 ScreenSessionManager::GetInstance().OnTentModeChanged(true);
856 } else if (input == ARG_SET_OFF_TENT_MODE) {
857 ScreenSessionManager::GetInstance().OnTentModeChanged(false);
858 }
859 #endif
860 }
861
SetHoverStatusChange(std::string input)862 void ScreenSessionDumper::SetHoverStatusChange(std::string input)
863 {
864 size_t commaPos = input.find_last_of(',');
865 auto screenSession = ScreenSessionManager::GetInstance().GetDefaultScreenSession();
866 if (screenSession == nullptr) {
867 TLOGE(WmsLogTag::DMS, "screenSession is nullptr");
868 return;
869 }
870 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_HOVER_STATUS)) {
871 std::string valueStr = input.substr(commaPos + 1);
872 if (valueStr.size() != 1) {
873 dumpInfo_.append("[error]: the value is too long");
874 return;
875 }
876 if (!std::isdigit(valueStr[0])) {
877 dumpInfo_.append("[error]: value is not a number");
878 return;
879 }
880 int32_t value = std::stoi(valueStr);
881 if ((value < static_cast<int32_t>(DeviceHoverStatus::INVALID)) ||
882 (value > static_cast<int32_t>(DeviceHoverStatus::CAMERA_STATUS_CANCEL))) {
883 TLOGE(WmsLogTag::DMS, "params is invalid: %{public}d", value);
884 return;
885 }
886 screenSession->HoverStatusChange(value);
887 TLOGI(WmsLogTag::DMS, "SetHoverStatusChange: %{public}d", value);
888 }
889 }
890
SetHallAndPostureValue(std::string input)891 void ScreenSessionDumper::SetHallAndPostureValue(std::string input)
892 {
893 #ifdef FOLD_ABILITY_ENABLE
894 std::string token;
895 std::istringstream ss(input);
896 std::vector<std::string> tokens;
897 while (std::getline(ss, token, ',')) {
898 tokens.push_back(token);
899 }
900 if (tokens.size() != DUMPER_PARAM_INDEX_THREE && tokens[0] != ARG_SET_POSTURE_HALL) {
901 TLOGE(WmsLogTag::DMS, "param error: %{public}s", input.c_str());
902 return;
903 }
904 if (!IsNumber(tokens[DUMPER_PARAM_INDEX_ONE]) || !IsNumber(tokens[DUMPER_PARAM_INDEX_TWO])) {
905 TLOGE(WmsLogTag::DMS, "param error: %{public}s", input.c_str());
906 return;
907 }
908 int hallVal = stoi(tokens[DUMPER_PARAM_INDEX_ONE]);
909 int postureVal = stoi(tokens[DUMPER_PARAM_INDEX_TWO]);
910 FoldScreenSensorManager::ExtHallData hallData = {
911 .flag = (1 << 1),
912 .hall = hallVal,
913 };
914 PostureData postureData = {
915 .angle = postureVal,
916 };
917 SensorEvent hallEvent = {
918 .data = reinterpret_cast<uint8_t *>(&hallData),
919 .dataLen = sizeof(FoldScreenSensorManager::ExtHallData),
920 };
921 SensorEvent postureEvent = {
922 .data = reinterpret_cast<uint8_t *>(&postureData),
923 .dataLen = sizeof(PostureData),
924 };
925 FoldScreenSensorManager::GetInstance().HandleHallData(&hallEvent);
926 FoldScreenSensorManager::GetInstance().HandlePostureData(&postureEvent);
927 TLOGI(WmsLogTag::DMS, "mock posture: %{public}d, hall: %{public}d ", postureVal, hallVal);
928 #endif
929 }
930
SetHallAndPostureStatus(std::string input)931 void ScreenSessionDumper::SetHallAndPostureStatus(std::string input)
932 {
933 #ifdef FOLD_ABILITY_ENABLE
934 size_t commaPos = input.find_last_of(',');
935 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_POSTURE_HALL_STATUS)) {
936 std::string valueStr = input.substr(commaPos + 1, DUMPER_PARAM_INDEX_ONE);
937 if (valueStr.size() != DUMPER_PARAM_INDEX_ONE && !std::isdigit(valueStr[0])) {
938 return;
939 }
940 int32_t value = std::stoi(valueStr);
941 if (value) {
942 if (FoldScreenStateInternel::IsSuperFoldDisplayDevice()) {
943 SuperFoldSensorManager::GetInstance().RegisterPostureCallback();
944 SuperFoldSensorManager::GetInstance().RegisterHallCallback();
945 } else {
946 FoldScreenSensorManager::GetInstance().RegisterHallCallback();
947 FoldScreenSensorManager::GetInstance().RegisterPostureCallback();
948 ScreenSensorConnector::SubscribeRotationSensor();
949 }
950 } else {
951 if (FoldScreenStateInternel::IsSuperFoldDisplayDevice()) {
952 SuperFoldSensorManager::GetInstance().UnregisterPostureCallback();
953 SuperFoldSensorManager::GetInstance().UnregisterHallCallback();
954 } else {
955 FoldScreenSensorManager::GetInstance().UnRegisterHallCallback();
956 FoldScreenSensorManager::GetInstance().UnRegisterPostureCallback();
957 ScreenSensorConnector::UnsubscribeRotationSensor();
958 }
959 }
960 TLOGI(WmsLogTag::DMS, "hall and posture register status: %{public}d", value);
961 }
962 #endif
963 }
964
SetSuperFoldStatusChange(std::string input)965 void ScreenSessionDumper::SetSuperFoldStatusChange(std::string input)
966 {
967 #ifdef FOLD_ABILITY_ENABLE
968 size_t commaPos = input.find_last_of(',');
969 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_SUPER_FOLD_STATUS)) {
970 std::string valueStr = input.substr(commaPos + 1, SUPER_FOLD_STATUS_MAX);
971 if (valueStr.empty()) {
972 return;
973 }
974 if (valueStr.size() == 1 && !std::isdigit(valueStr[0])) {
975 return;
976 }
977 if (valueStr.size() == SUPER_FOLD_STATUS_MAX && !std::isdigit(valueStr[0])
978 && !std::isdigit(valueStr[1])) {
979 return;
980 }
981 int32_t value = std::stoi(valueStr);
982 if (value <= static_cast<int32_t>(SuperFoldStatusChangeEvents::UNDEFINED) ||
983 value >= static_cast<int32_t>(SuperFoldStatusChangeEvents::INVALID)) {
984 TLOGE(WmsLogTag::DMS, "params is invalid: %{public}d", value);
985 return;
986 }
987 SuperFoldStateManager::GetInstance().
988 HandleSuperFoldStatusChange(static_cast<SuperFoldStatusChangeEvents>(value));
989 TLOGI(WmsLogTag::DMS, "state: %{public}d, event: %{public}d",
990 SuperFoldStateManager::GetInstance().GetCurrentStatus(), value);
991 }
992 #endif
993 }
994
SetSecondaryStatusChange(const std::string & input)995 void ScreenSessionDumper::SetSecondaryStatusChange(const std::string &input)
996 {
997 #ifdef FOLD_ABILITY_ENABLE
998 if (!FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) {
999 TLOGD(WmsLogTag::DMS, "not secondary device");
1000 return;
1001 }
1002 TLOGI(WmsLogTag::DMS, "secondary input: %{public}s", input.c_str());
1003 size_t commaPos = input.find(',');
1004 if (!((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_SECONDARY_FOLD_STATUS))) {
1005 return;
1006 }
1007 std::string valueStr = input.substr(commaPos + 1, 1);
1008 if (valueStr.empty()) {
1009 return;
1010 }
1011 char ch = valueStr[0];
1012 TLOGI(WmsLogTag::DMS, "value: %{public}c", ch);
1013 const char *end = SECONDARY_DUMPER_VALUE_BOUNDARY + sizeof(SECONDARY_DUMPER_VALUE_BOUNDARY); // mfg
1014 const char *result = std::find(SECONDARY_DUMPER_VALUE_BOUNDARY, end, ch);
1015 if (result == end) {
1016 if (ch == 'p') { // sensor
1017 TriggerSecondarySensor(input.substr(commaPos + 1, input.size() - commaPos - 1));
1018 } else if (ch == 'z') { // foldstatus
1019 TriggerSecondaryFoldStatus(input.substr(commaPos + 1, input.size() - commaPos - 1));
1020 } else {
1021 TLOGE(WmsLogTag::DMS, "command not supported.");
1022 }
1023 return;
1024 }
1025
1026 FoldDisplayMode displayMode = FoldDisplayMode::UNKNOWN;
1027 if (ch == SECONDARY_DUMPER_VALUE_BOUNDARY[SECONDARY_FOLD_STATUS_INDEX_M]) {
1028 displayMode = FoldDisplayMode::FULL;
1029 } else if (ch == SECONDARY_DUMPER_VALUE_BOUNDARY[SECONDARY_FOLD_STATUS_INDEX_F]) {
1030 displayMode = FoldDisplayMode::MAIN;
1031 } else if (ch == SECONDARY_DUMPER_VALUE_BOUNDARY[SECONDARY_FOLD_STATUS_INDEX_G]) {
1032 displayMode = FoldDisplayMode::GLOBAL_FULL;
1033 } else {
1034 TLOGW(WmsLogTag::DMS, "SetFoldDisplayMode mode is not supported.");
1035 return;
1036 }
1037 ScreenSessionManager::GetInstance().SetFoldDisplayMode(displayMode);
1038 #endif
1039 }
1040
SetLandscapeLock(std::string input)1041 void ScreenSessionDumper::SetLandscapeLock(std::string input)
1042 {
1043 #ifdef FOLD_ABILITY_ENABLE
1044 if (!FoldScreenStateInternel::IsSuperFoldDisplayDevice()) {
1045 TLOGI(WmsLogTag::DMS, "not super fold device");
1046 return;
1047 }
1048 size_t commaPos = input.find_last_of(',');
1049 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_LANDSCAPE_LOCK)) {
1050 std::string valueStr = input.substr(commaPos + 1, DUMPER_PARAM_INDEX_ONE);
1051 if (valueStr.size() != DUMPER_PARAM_INDEX_ONE || !std::isdigit(valueStr[0])) {
1052 return;
1053 }
1054 int32_t value = std::stoi(valueStr);
1055 if (value) {
1056 ScreenSessionManager::GetInstance().HandleExtendScreenConnect(0);
1057 } else {
1058 ScreenSessionManager::GetInstance().HandleExtendScreenDisconnect(0);
1059 }
1060 TLOGI(WmsLogTag::DMS, "landscape lock: %{public}d", value);
1061 }
1062 #endif
1063 }
1064
SetDuringCallState(std::string input)1065 void ScreenSessionDumper::SetDuringCallState(std::string input)
1066 {
1067 #ifdef FOLD_ABILITY_ENABLE
1068 size_t commaPos = input.find_last_of(',');
1069 if ((commaPos != std::string::npos) && (input.substr(0, commaPos) == ARG_SET_DURINGCALL_STATE)) {
1070 std::string valueStr = input.substr(commaPos + 1);
1071 if (valueStr.size() != 1) {
1072 dumpInfo_.append("[error]: the value is too long");
1073 return;
1074 }
1075 if (!std::isdigit(valueStr[0])) {
1076 dumpInfo_.append("[error]: value is not a number");
1077 return;
1078 }
1079 if ((valueStr[0] != '0') && (valueStr[0] != '1')) {
1080 TLOGE(WmsLogTag::DMS, "param is invalid: %{public}s", valueStr.c_str());
1081 return;
1082 }
1083 bool value = static_cast<bool>(std::stoi(valueStr));
1084 ScreenSessionManager::GetInstance().SetDuringCallState(value);
1085 TLOGI(WmsLogTag::DMS, "SetDuringCallState: %{public}d", value);
1086 }
1087 #endif
1088 }
1089
1090 #ifdef FOLD_ABILITY_ENABLE
IsAllCharDigit(const std::string & firstPostureStr)1091 bool ScreenSessionDumper::IsAllCharDigit(const std::string &firstPostureStr)
1092 {
1093 for (size_t i = 0; i < firstPostureStr.size(); i++) {
1094 if (!std::isdigit(firstPostureStr[i])) {
1095 TLOGW(WmsLogTag::DMS, "%{public}s is not number", firstPostureStr.c_str());
1096 return false;
1097 }
1098 }
1099 return true;
1100 }
1101
GetPostureAndHall(std::vector<std::string> strVec,std::vector<float> & postures,std::vector<uint16_t> & halls)1102 bool ScreenSessionDumper::GetPostureAndHall(std::vector<std::string> strVec,
1103 std::vector<float> &postures, std::vector<uint16_t> &halls)
1104 {
1105 for (std::string str : strVec) {
1106 size_t index = str.find(":");
1107 if (index == std::string::npos) {
1108 return false;
1109 }
1110 std::string key = str.substr(0, index);
1111 std::string value = str.substr(index + 1, str.size() - index - 1);
1112 index = value.find(",");
1113 if (index == std::string::npos) {
1114 return false;
1115 }
1116 std::vector<std::string> posturesStrList = WindowHelper::Split(value, ",");
1117 std::string firstPostureStr;
1118 std::string secondPostureStr;
1119 std::string thirdPostureStr;
1120 if (posturesStrList.size() == DUMPER_PARAM_INDEX_THREE) {
1121 firstPostureStr = posturesStrList[0];
1122 secondPostureStr = posturesStrList[1];
1123 thirdPostureStr = posturesStrList[DUMPER_PARAM_INDEX_TWO];
1124 if (!WindowHelper::IsFloatingNumber(firstPostureStr) ||
1125 !WindowHelper::IsFloatingNumber(secondPostureStr)) {
1126 TLOGW(WmsLogTag::DMS, "posture should be a float number");
1127 return false;
1128 }
1129 if (thirdPostureStr != "0" && thirdPostureStr != "1") {
1130 TLOGW(WmsLogTag::DMS, "third posture is not 0 or 1");
1131 return false;
1132 }
1133 postures.emplace_back(std::stof(firstPostureStr));
1134 postures.emplace_back(std::stof(secondPostureStr));
1135 postures.emplace_back(std::stof(thirdPostureStr));
1136 } else if (posturesStrList.size() == DUMPER_PARAM_INDEX_TWO) {
1137 firstPostureStr = posturesStrList[0];
1138 secondPostureStr = posturesStrList[1];
1139 if (!IsAllCharDigit(firstPostureStr) || !IsAllCharDigit(secondPostureStr)) {
1140 return false;
1141 }
1142 halls.emplace_back(static_cast<uint16_t>(std::stoi(firstPostureStr)));
1143 halls.emplace_back(static_cast<uint16_t>(std::stoi(secondPostureStr)));
1144 } else {
1145 TLOGW(WmsLogTag::DMS, "sensor command error");
1146 return false;
1147 }
1148 }
1149 return true;
1150 }
1151
TriggerSecondarySensor(const std::string & valueStr)1152 void ScreenSessionDumper::TriggerSecondarySensor(const std::string &valueStr)
1153 {
1154 TLOGI(WmsLogTag::DMS, "%{public}s", valueStr.c_str());
1155 std::vector<std::string> strVec = WindowHelper::Split(valueStr, "/");
1156 std::vector<float> postures;
1157 std::vector<uint16_t> halls;
1158 if (!GetPostureAndHall(strVec, postures, halls)) {
1159 TLOGW(WmsLogTag::DMS, "GetPostureAndHall failed");
1160 return;
1161 }
1162 FoldScreenSensorManager::ExtHallData hallData = {
1163 .flag = HALL_EXT_DATA_FLAG,
1164 .hall = halls[0],
1165 .hallAb = halls[1],
1166 };
1167 FoldScreenSensorManager::PostureDataSecondary postureData = {
1168 .postureBc = postures[0],
1169 .postureAb = postures[1],
1170 .postureAbAnti = postures[DUMPER_PARAM_INDEX_TWO],
1171 };
1172 SensorEvent hallEvent = {
1173 .data = reinterpret_cast<uint8_t *>(&hallData),
1174 .dataLen = sizeof(FoldScreenSensorManager::ExtHallData),
1175 };
1176 SensorEvent postureEvent = {
1177 .data = reinterpret_cast<uint8_t *>(&postureData),
1178 .dataLen = sizeof(FoldScreenSensorManager::PostureDataSecondary),
1179 };
1180 TLOGI(WmsLogTag::DMS, "mock secondary sensor: %{public}s, %{public}s",
1181 FoldScreenStateInternel::TransVec2Str(postures, ANGLE_STR).c_str(),
1182 FoldScreenStateInternel::TransVec2Str(halls, HALL_STR).c_str());
1183 SecondaryFoldSensorManager::GetInstance().HandleHallDataExt(&hallEvent);
1184 SecondaryFoldSensorManager::GetInstance().HandlePostureData(&postureEvent);
1185 }
1186
TriggerSecondaryFoldStatus(const std::string & valueStr)1187 void ScreenSessionDumper::TriggerSecondaryFoldStatus(const std::string &valueStr)
1188 {
1189 std::vector<std::string> strVec = WindowHelper::Split(valueStr, "=");
1190 if (strVec.size() != SECONDARY_FOLD_STATUS_COMMAND_NUM) {
1191 TLOGW(WmsLogTag::DMS, "secondary foldstatus command miss '=' or has extra '='.");
1192 return;
1193 }
1194 const std::string &foldStatusStr = strVec[1];
1195 for (size_t i = 0; i < foldStatusStr.size(); i++) {
1196 if (!std::isdigit(foldStatusStr[i])) {
1197 TLOGW(WmsLogTag::DMS, "secondary foldstatus command contains characters that are not numbers.");
1198 return;
1199 }
1200 }
1201 uint32_t foldStatus = static_cast<uint32_t>(std::stoi(foldStatusStr));
1202 switch (foldStatus) {
1203 case static_cast<uint32_t>(FoldStatus::EXPAND) :
1204 case static_cast<uint32_t>(FoldStatus::FOLDED) :
1205 case static_cast<uint32_t>(FoldStatus::HALF_FOLD) :
1206 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_EXPAND) :
1207 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_EXPAND_WITH_SECOND_HALF_FOLDED) :
1208 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_EXPAND) :
1209 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_FOLDED_WITH_SECOND_HALF_FOLDED) :
1210 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_EXPAND) :
1211 case static_cast<uint32_t>(FoldStatus::FOLD_STATE_HALF_FOLDED_WITH_SECOND_HALF_FOLDED) : {
1212 break;
1213 }
1214 default: {
1215 TLOGW(WmsLogTag::DMS, "secondary foldstatus is out of range.");
1216 return;
1217 }
1218 }
1219 TLOGI(WmsLogTag::DMS, "change fold status, %{public}s", foldStatusStr.c_str());
1220 ScreenSessionManager::GetInstance().TriggerFoldStatusChange(static_cast<FoldStatus>(foldStatus));
1221 }
1222 #endif
1223 } // Rosen
1224 } // OHOS