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