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