• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include "accessibility_ability_command.h"
16 #include "accessibility_ability_utils.h"
17 
18 #include <csignal>
19 #include <cstdlib>
20 #include <fstream>
21 #include <getopt.h>
22 #include <regex>
23 
24 #include "ability_manager_client.h"
25 #include "accessibility_config.h"
26 #include "accessibility_system_ability_client.h"
27 #include "bool_wrapper.h"
28 #include "hilog_wrapper.h"
29 #include "iservice_registry.h"
30 #include "mission_snapshot.h"
31 #include "sa_mgr_client.h"
32 #include "system_ability_definition.h"
33 #include "test_observer.h"
34 
35 using namespace OHOS::AppExecFwk;
36 
37 namespace OHOS {
38 namespace AAFwk {
39 namespace {
40 const std::string ENABLE_SHORT_OPTIONS = "a:b:c:";
41 const std::string DISABLE_SHORT_OPTIONS = "a:b:";
42 const std::string SET_SHORT_OPTIONS = "v:";
43 const std::string STRING_LIST_ABILITY_NG = "error: failed to list abilities";
44 const int32_t MOUSE_AUTO_CLICK_TIME_LOW_BOUND = 1000;
45 const int32_t MOUSE_AUTO_CLICK_TIME_HIGH_BOUND = 5000;
46 const int32_t CONTENT_TIME_OUT_TIME_LOW_BOUND = 0;
47 const int32_t CONTENT_TIME_OUT_TIME_HIGH_BOUND = 5000;
48 const int32_t AUDIO_BALANCE_LOW_BOUND = -100;
49 const int32_t AUDIO_BALANCE_HIGH_BOUND = 100;
50 const int32_t BRIGHTNESS_DISCOUNT_LOW_BOUND = 0;
51 const int32_t BRIGHTNESS_DISCOUNT_HIGH_BOUND = 100;
52 const int32_t DALTIONIZATION_TYPE_LOW_BOUND = 0;
53 const int32_t DALTIONIZATION_TYPE_HIGH_BOUND = 3;
54 const int32_t TYPE_NORMAL = 0;
55 const int32_t TYPE_PROTANOMALY = 1;
56 const int32_t TYPE_DEUTERANOMALY = 2;
57 const int32_t TYPE_TRITANOMALY = 3;
58 const int32_t ACCESSIBILITY_ENABLE_COMMAND_ARGUMENT_NUM = 3;
59 const int32_t ACCESSIBILITY_DISABLE_COMMAND_ARGUMENT_NUM = 2;
60 const int32_t ACCESSIBILITY_SET_COMMAND_ARGUMENT_NUM = 1;
61 
62 const std::string ACCESSIBILITY_TOOL_NAME = "accessibility";
63 const std::string ACCESSIBILITY_STRING_ENABLE_ABILITY_OK = "enable ability successfully.";
64 const std::string ACCESSIBILITY_STRING_ENABLE_ABILITY_NG = "error: failed to enable ability.\n";
65 
66 const std::string ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_OK = "set screen magnification state successfully.";
67 const std::string ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_NG = "error: failed to set screen magnification state\n";
68 const std::string ACCESSIBILITY_SET_SHORT_KEY_STATE_OK = "set short key state successfully.";
69 const std::string ACCESSIBILITY_SET_SHORT_KEY_STATE_NG = "error: failed to set short key state.\n";
70 const std::string ACCESSIBILITY_SET_MOUSE_KEY_STATE_OK = "set mouse key state successfully.";
71 const std::string ACCESSIBILITY_SET_MOUSE_KEY_STATE_NG = "error: failed to set mouse key state.\n";
72 const std::string ACCESSIBILITY_SET_CAPTION_STATE_OK = "set caption state successfully.";
73 const std::string ACCESSIBILITY_SET_CAPTION_STATE_NG = "error: failed to set caption state.\n";
74 const std::string ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_OK = "set high contrast text state successfully.";
75 const std::string ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_NG = "error: failed to set high contrast text state.\n";
76 const std::string ACCESSIBILITY_SET_INVERT_COLOR_STATE_OK = "set invert color state successfully.";
77 const std::string ACCESSIBILITY_SET_INVERT_COLOR_STATE_NG = "error: failed to set invert color state.\n";
78 const std::string ACCESSIBILITY_SET_ANIMATION_OFF_STATE_OK = "set animation off state successfully.";
79 const std::string ACCESSIBILITY_SET_ANIMATION_OFF_STATE_NG = "error: failed to set animation off state.\n";
80 const std::string ACCESSIBILITY_SET_AUDIO_MONO_STATE_OK = "set audio mono state successfully.";
81 const std::string ACCESSIBILITY_SET_AUDIO_MONO_STATE_NG = "error: failed to set audio mono state.\n";
82 const std::string ACCESSIBILITY_SET_AUTO_CLICK_TIME_OK = "set mouse auto click time successfully.";
83 const std::string ACCESSIBILITY_SET_AUTO_CLICK_TIME_NG = "error: failed to set mouse auto click time.\n";
84 const std::string ACCESSIBILITY_SET_SHORT_KEY_TARGET_OK = "set short key target successfully.";
85 const std::string ACCESSIBILITY_SET_SHORT_KEY_TARGET_NG = "error: failed to set short key target.\n";
86 const std::string ACCESSIBILITY_SET_AUDIO_BALANCE_OK = "set audio balance successfully.";
87 const std::string ACCESSIBILITY_SET_AUDIO_BALANCE_NG = "error: failed to set audio balance successfully.";
88 const std::string ACCESSIBILITY_SET_CONTENT_TIME_OK = "set content timeout successfully.";
89 const std::string ACCESSIBILITY_SET_CONTENT_TIME_NG = "error: failed to set content timeout.\n";
90 const std::string ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_OK = "set brightness discount successfully.";
91 const std::string ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_NG = "error: failed to set brightness discount.\n";
92 const std::string ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_OK =
93     "set daltonization color filter successfully.";
94 const std::string ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_NG =
95     "error: failed to set daltonization color filter.\n";
96 
97 const std::string ACCESSIBILITY_ABILITY_NOT_FOUND = " was not found!";
98 const std::string ACCESSIBILITY_HELP_MSG_NO_OPTION = "missing options.";
99 
100 const std::string ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT =
101     "argument -b <bundle-name> or --bundle=<bundle-name> is required!";
102 const std::string ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT =
103     "argument -a <ability-name> or --ability=<ability-name> is required!";
104 const std::string ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT =
105     "argument -c <capabilities-abbr>"
106     " or --capabilities=<capabilities-abbr> is required!";
107 
108 const std::string ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT = "there are too many arguments ";
109 const std::string ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT = "there are duplicate arguments.";
110 
111 const std::string ACCESSIBILITY_STRING_DISABLE_ABILITY_OK = "disable ability successfully.";
112 const std::string ACCESSIBILITY_STRING_DISABLE_ABILITY_NG = "error: failed to disable ability.";
113 
114 const std::string ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE = "option -a requires a value.";
115 const std::string ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE = "option -b requires a value.";
116 const std::string ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE = "option -c requires a value.";
117 const std::string ACCESSIBILITY_ABILITY_NO_SET_ARGUMENT_VALUE = "option -v requires a value.";
118 
119 const std::string ACCESSIBILITY_ABILITY_SET_VALUE_INVALID = "value is invalid.";
120 
121 const std::string ACCESSIBILITY_HELP_MSG =
122     "usage: accessibility <command>\n"
123     "these are common accessibility commands list:\n"
124     "  help                        list available commands\n"
125     "  enable                      enable ability with options\n"
126     "  disable                     disable ability with options\n"
127     "  list                        list the installed abilities info\n"
128     "  setShortKeyState            set the state of the short key configuration item\n"
129     "  setMouseKeyState            set the state of the mouse key configuration item\n"
130     "  setCaptionState             set the state of the caption configuration item\n"
131     "  setMouseAutoClick           set the time of the mouse auto click configuration item\n"
132     "  setShortKeyTarget           set the name of the short key target configuration item\n"
133     "  setHighContrastTextState    set the state of the high contrast text configuration item\n"
134     "  setInvertColorState         set the state of the invert color configuration item\n"
135     "  setDaltonizationColorFilter set the type of the daltonization color filter configuration item\n"
136     "  setContentTimeout           set the time of the toast content duration configuration item\n"
137     "  setAnimationOffState        set the state of the animation off configuration item\n"
138     "  setBrightnessDiscount       set the discount of the screen brightness configuration item\n"
139     "  setAudioMonoState           set the state of the audio mono configuration item\n"
140     "  setAudioBalance             set the value of the audio balance configuration item\n";
141 
142 const std::string ACCESSIBILITY_HELP_MSG_ENABLE_ABILITY =
143     "usage: accessibility enable [-a <ability-name>] [-b <bundle-name>] [-c <capabilities-abbr>]\n"
144     "enable the auxiliary application with bundle-name and ability-name and capabilities-abbr\n";
145 
146 const std::string ACCESSIBILITY_HELP_MSG_DISABLE_ABILITY =
147     "usage: accessibility disable [-a <ability-name>] [-b <bundle-name>]\n"
148     "disable the auxiliary application with bundle-name and ability-name\n";
149 
150 const std::string ACCESSIBILITY_HELP_MSG_LIST_ABILITIES =
151     "the auxiliary capabilities supported by the accessibility subsystem are as follows:\n"
152     "r:retrieve                                enable the retrieval capability of auxiliary application\n"
153     "t:touch_guide                             enable the touch guide capability of auxiliary application\n"
154     "g:gesture                                 enable the gesture injection capability of auxiliary application\n"
155     "k:key_event_observer                      enable the key event interception capability of auxiliary application\n"
156     "z:zoom                                    enable the gesture zoom capability of auxiliary application\n";
157 
158 const std::string ACCESSIBILITY_HELP_MSG_SET_SCREEN_MAGNIFICATION_STATE =
159     "usage: accessibility setScreenMagnificationState [-v <0 | 1> ]\n"
160     "set the state of the screen magnification configuration item\n";
161 
162 const std::string ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_STATE =
163     "usage: accessibility setShortKeyState [-v <0 | 1> ]\n"
164     "set the state of the short key configuration item\n";
165 
166 const std::string ACCESSIBILITY_HELP_MSG_SET_MOUSE_KEY_STATE =
167     "usage: accessibility setMouseKeyState [-v <0 | 1> ]\n"
168     "set the state of the mouse key configuration item\n";
169 
170 const std::string ACCESSIBILITY_HELP_MSG_SET_CAPTION_STATE =
171     "usage: accessibility setCaptionState [-v <0 | 1> ]\n"
172     "set the state of the caption configuration item\n";
173 
174 const std::string ACCESSIBILITY_HELP_MSG_HIGH_CONTRAST_TEXT_STATE =
175     "usage: accessibility setHighContrastTextState [-v <0 | 1> ]\n"
176     "set the state of the high contrast text configuration item\n";
177 
178 const std::string ACCESSIBILITY_HELP_MSG_SET_INVERT_COLOR_STATE =
179     "usage: accessibility setInvertColorState [-v <0 | 1>]\n"
180     "set the state of the invert color configuration item\n";
181 
182 const std::string ACCESSIBILITY_HELP_MSG_SET_DALTONIZATION_COLOR_FILTER =
183     "usage: accessibility setDaltonizationColorFilter [-v <0 | 1 | 2 | 3>]\n"
184     "normal = 0, protanomaly = 1, deuteranomaly = 2, tritanomaly = 3\n"
185     "set the type of the daltonization color filter configuration item\n";
186 
187 const std::string ACCESSIBILITY_HELP_MSG_ANIMATION_OFF_STATE =
188     "usage: accessibility setAnimationOffState [-v <0 | 1>]\n"
189     "set the state of the animation off configuration item\n";
190 
191 const std::string ACCESSIBILITY_HELP_MSG_SET_AUDIO_MONO_STATE =
192     "usage: accessibility setAudioMonoState [-v <0 | 1>]\n"
193     "set the state of the audio mono configuration item\n";
194 
195 const std::string ACCESSIBILITY_HELP_MSG_SET_AUTO_CLICK_TIME =
196     "usage: accessibility setMouseAutoClick [-v <time-value>]\n"
197     "the range of time-value is 1000 to 5000 and the default unit is ms\n"
198     "set the time of the mouse auto click configuration item\n";
199 
200 const std::string ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_TARGET =
201     "usage: accessibility setShortKeyTarget -a <ability-name> -b <bundle-name>\n"
202     "set the name of the short key target configuration item\n";
203 
204 const std::string ACCESSIBILITY_HELP_MSG_SET_CONTENT_TIME_OUT =
205     "usage: accessibility setContentTimeout [-v <time-value>]\n"
206     "the range of time-value is 0 to 5000 and the default unit is ms\n"
207     "set the time of the toast content duration configuration item\n";
208 
209 const std::string ACCESSIBILITY_HELP_MSG_SET_BRIGHTNESS_DISCOUNT =
210     "usage: accessibility setBrightnessDiscount [-v <discount-value>]\n"
211     "the percentage of discount-value is 0 to 100\n"
212     "set the discount of the screen brightness configuration item\n";
213 
214 const std::string ACCESSIBILITY_HELP_MSG_SET_AUDIO_BALANCE =
215     "usage: accessibility setAudioBalance [-v <balance-value>]\n"
216     "the percentage of balance-value is -100 to 100\n"
217     "the negative values represent the left channel and positive values represent the right channel\n"
218     "set the value of the audio balance configuration item\n";
219 
220 constexpr struct option ENABLE_LONG_OPTIONS[] = {
221     {"ability", required_argument, nullptr, 'a'},
222     {"bundle", required_argument, nullptr, 'b'},
223     {"capabilities", required_argument, nullptr, 'c'},
224     {nullptr, 0, nullptr, 0},
225 };
226 
227 constexpr struct option DISABLE_LONG_OPTIONS[] = {
228     {"ability", required_argument, nullptr, 'a'},
229     {"bundle", required_argument, nullptr, 'b'},
230     {nullptr, 0, nullptr, 0},
231 };
232 
233 constexpr struct option SET_LONG_OPTIONS[] = {
234     {"value", required_argument, nullptr, 'v'},
235     {nullptr, 0, nullptr, 0},
236 };
237 }  // namespace
238 
AccessibilityAbilityShellCommand(int argc,char * argv[])239 AccessibilityAbilityShellCommand::AccessibilityAbilityShellCommand(int argc, char* argv[])
240     : ShellCommand(argc, argv, ACCESSIBILITY_TOOL_NAME)
241 {
242     for (int i = 0; i < argc_; i++) {
243         HILOG_INFO("argv_[%{public}d]: %{public}s", i, argv_[i]);
244     }
245     if (abilityClientPtr_ == nullptr) {
246         abilityClientPtr_ = Accessibility::AccessibilitySystemAbilityClient::GetInstance();
247         if (abilityClientPtr_ == nullptr) {
248             HILOG_ERROR("Get accessibility system ability client failed.");
249         }
250     }
251     int32_t addPermissionResult = AccessibilityUtils::AddPermission();
252     if (addPermissionResult != 0) {
253         HILOG_ERROR("Add permission for accessibility tool failed.");
254     }
255 }
256 
init()257 ErrCode AccessibilityAbilityShellCommand::init()
258 {
259     messageMap_ = {
260         {
261             Accessibility::RET_ERR_FAILED,
262             "reason: system exception.",
263         },
264         {
265             Accessibility::RET_ERR_INVALID_PARAM,
266             "reason: invalid param.",
267         },
268         {
269             Accessibility::RET_ERR_NULLPTR,
270             "reason: nullptr exception.",
271         },
272         {
273             Accessibility::RET_ERR_IPC_FAILED,
274             "reason: ipc failed.",
275         },
276         {
277             Accessibility::RET_ERR_SAMGR,
278             "reason: samgr error.",
279         },
280         {
281             Accessibility::RET_ERR_NO_PERMISSION,
282             "reason: no permissions.",
283         },
284         {
285             Accessibility::RET_ERR_TIME_OUT,
286             "reason: execution timeout.",
287         },
288         {
289             Accessibility::RET_ERR_CONNECTION_EXIST,
290             "reason: the ability is already enabled.",
291         },
292         {
293             Accessibility::RET_ERR_NO_CAPABILITY,
294             "reason: capabilities is wrong.",
295         },
296         {
297             Accessibility::RET_ERR_NOT_INSTALLED,
298             "reason: the auxiliary application is not installed.",
299         },
300         {
301             Accessibility::RET_ERR_NOT_ENABLED,
302             "reason: the auxiliary application is not enabled.",
303         }
304     };
305     return OHOS::ERR_OK;
306 }
307 
CreateMessageMap()308 ErrCode AccessibilityAbilityShellCommand::CreateMessageMap()
309 {
310     return OHOS::ERR_OK;
311 }
312 
CreateCommandMap()313 ErrCode AccessibilityAbilityShellCommand::CreateCommandMap()
314 {
315     commandMap_ = {
316         {"help", std::bind(&AccessibilityAbilityShellCommand::RunAsHelpCommand, this)},
317         {"enable", std::bind(&AccessibilityAbilityShellCommand::RunAsEnableAbility, this)},
318         {"disable", std::bind(&AccessibilityAbilityShellCommand::RunAsDisableAbility, this)},
319         {"list", std::bind(&AccessibilityAbilityShellCommand::RunAsGetInstalledAbilities, this)},
320         {"setShortKeyState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetShortKeyState, this)},
321         {"setMouseKeyState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetMouseKeyState, this)},
322         {"setCaptionState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetCaptionState, this)},
323         {"setMouseAutoClick", std::bind(&AccessibilityAbilityShellCommand::RunAsSetMouseAutoClick, this)},
324         {"setShortKeyTarget", std::bind(&AccessibilityAbilityShellCommand::RunAsSetShortKeyTarget, this)},
325         {"setHighContrastTextState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetHighContrastTextState, this)},
326         {"setInvertColorState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetInvertColorState, this)},
327         {"setDaltonizationColorFilter",
328             std::bind(&AccessibilityAbilityShellCommand::RunAsSetDaltonizationColorFilter, this)},
329         {"setContentTimeout", std::bind(&AccessibilityAbilityShellCommand::RunAsSetContentTimeout, this)},
330         {"setAnimationOffState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAnimationOffState, this)},
331         {"setBrightnessDiscount", std::bind(&AccessibilityAbilityShellCommand::RunAsSetBrightnessDiscount, this)},
332         {"setAudioMonoState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAudioMonoState, this)},
333         {"setAudioBalance", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAudioBalance, this)},
334     };
335 
336     return OHOS::ERR_OK;
337 }
338 
RunAsHelpCommand()339 ErrCode AccessibilityAbilityShellCommand::RunAsHelpCommand()
340 {
341     resultReceiver_.append(ACCESSIBILITY_HELP_MSG);
342 
343     return OHOS::ERR_OK;
344 }
345 
MakeEnableCommandArgumentFromCmd(AccessibilityCommandArgument & argument)346 ErrCode AccessibilityAbilityShellCommand::MakeEnableCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
347 {
348     int option = -1;
349     int counter = 0;
350     argument.command = "enable";
351     while (true) {
352         counter++;
353 
354         option = getopt_long(argc_, argv_, ENABLE_SHORT_OPTIONS.c_str(), ENABLE_LONG_OPTIONS, nullptr);
355 
356         HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
357 
358         if (optind < 0 || optind > argc_) {
359             return OHOS::ERR_INVALID_VALUE;
360         }
361 
362         if (option == -1) {
363             if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
364                 resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
365                 return OHOS::ERR_INVALID_VALUE;
366             }
367             break;
368         }
369 
370         if (option == '?') {
371             switch (optopt) {
372                 case 'a': {
373                     resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
374                     return OHOS::ERR_INVALID_VALUE;
375                 }
376                 case 'b': {
377                     resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
378                     return OHOS::ERR_INVALID_VALUE;
379                 }
380                 case 'c': {
381                     resultReceiver_.append(argument.command + ": " +
382                         ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE);
383                     return OHOS::ERR_INVALID_VALUE;
384                 }
385                 default: {
386                     break;
387                 }
388             }
389         }
390 
391         switch (option) {
392             case 'a': {
393                 argument.abilityName = optarg;
394                 argument.abilityArgumentNum++;
395                 break;
396             }
397             case 'b': {
398                 argument.bundleName = optarg;
399                 argument.bundleArgumentNum++;
400                 break;
401             }
402             case 'c': {
403                 argument.capabilityNames = optarg;
404                 argument.capabilityNamesArgumentNum++;
405                 break;
406             }
407             default: {
408                 argument.unknownArgumentNum++;
409                 argument.unknownArguments.push_back(argv_[optind - 1]);
410                 break;
411             }
412         }
413     }
414     return CheckEnableCommandArgument(argument, resultReceiver_);
415 }
416 
MakeDisableCommandArgumentFromCmd(AccessibilityCommandArgument & argument)417 ErrCode AccessibilityAbilityShellCommand::MakeDisableCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
418 {
419     argument.command = "disable";
420     ErrCode result = MakeCommandArgumentFromCmd(argument);
421     if (result == OHOS::ERR_OK) {
422         return CheckDisableCommandArgument(argument, resultReceiver_);
423     }
424     return result;
425 }
426 
RunAsEnableAbility()427 ErrCode AccessibilityAbilityShellCommand::RunAsEnableAbility()
428 {
429     AccessibilityCommandArgument argument;
430     ErrCode result = MakeEnableCommandArgumentFromCmd(argument);
431     if (result == OHOS::ERR_OK) {
432         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
433         (void)config.InitializeContext();
434         std::string name = argument.bundleName + "/" + argument.abilityName;
435         std::string capabilityNames = argument.capabilityNames;
436         uint32_t capabilities = AccessibilityUtils::GetCapabilityValue(capabilityNames);
437         Accessibility::RetError ret = config.EnableAbility(name, capabilities);
438         if (ret == Accessibility::RET_OK) {
439             resultReceiver_ = ACCESSIBILITY_STRING_ENABLE_ABILITY_OK + "\n";
440         } else {
441             resultReceiver_ = ACCESSIBILITY_STRING_ENABLE_ABILITY_NG;
442             resultReceiver_.append(GetMessageFromCode(ret));
443         }
444     } else {
445         resultReceiver_.append("\n");
446         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_ENABLE_ABILITY);
447         result = OHOS::ERR_INVALID_VALUE;
448     }
449 
450     return result;
451 }
452 
RunAsDisableAbility()453 ErrCode AccessibilityAbilityShellCommand::RunAsDisableAbility()
454 {
455     AccessibilityCommandArgument argument;
456     ErrCode result = MakeDisableCommandArgumentFromCmd(argument);
457     if (result == OHOS::ERR_OK) {
458         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
459         (void)config.InitializeContext();
460         std::string name = argument.bundleName + "/" + argument.abilityName;
461         Accessibility::RetError ret = config.DisableAbility(name);
462         if (ret == Accessibility::RET_OK) {
463             resultReceiver_ = ACCESSIBILITY_STRING_DISABLE_ABILITY_OK + "\n";
464         } else {
465             resultReceiver_ = ACCESSIBILITY_STRING_DISABLE_ABILITY_NG;
466             resultReceiver_.append(GetMessageFromCode(ret));
467         }
468     } else {
469         resultReceiver_.append("\n");
470         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_DISABLE_ABILITY);
471         result = OHOS::ERR_INVALID_VALUE;
472     }
473 
474     return result;
475 }
476 
RunAsGetEnabledAbilities()477 ErrCode AccessibilityAbilityShellCommand::RunAsGetEnabledAbilities()
478 {
479     ErrCode result = OHOS::ERR_OK;
480     std::vector<std::string> enabledAbilities = GetEnabledAbilities();
481     if (!enabledAbilities.empty()) {
482         for (const auto& ability : enabledAbilities) {
483             resultReceiver_.append(ability + "\n");
484         }
485     } else {
486         result = OHOS::ERR_INVALID_VALUE;
487     }
488     return result;
489 }
490 
RunAsGetInstalledAbilities()491 ErrCode AccessibilityAbilityShellCommand::RunAsGetInstalledAbilities()
492 {
493     ErrCode result = OHOS::ERR_OK;
494     std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
495     if (!installedAbilities.empty()) {
496         resultReceiver_.append(AccessibilityUtils::FormatAbilityInfos(installedAbilities));
497         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_LIST_ABILITIES);
498     } else {
499         result = OHOS::ERR_INVALID_VALUE;
500     }
501     return result;
502 }
503 
GetEnabledAbilities()504 const std::vector<std::string> AccessibilityAbilityShellCommand::GetEnabledAbilities()
505 {
506     std::vector<std::string> enabledAbilities;
507     if (abilityClientPtr_ != nullptr &&
508         (abilityClientPtr_->GetEnabledAbilities(enabledAbilities) != Accessibility::RET_OK)) {
509         HILOG_ERROR("Failed to GetEnabledAbilities");
510     }
511     return enabledAbilities;
512 }
513 
GetInstalledAbilities()514 const std::vector<Accessibility::AccessibilityAbilityInfo> AccessibilityAbilityShellCommand::GetInstalledAbilities()
515 {
516     std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities;
517     const uint32_t allTypes = Accessibility::AccessibilityAbilityTypes::ACCESSIBILITY_ABILITY_TYPE_ALL;
518     const Accessibility::AbilityStateType stateType = Accessibility::AbilityStateType::ABILITY_STATE_INSTALLED;
519     if (abilityClientPtr_ != nullptr &&
520         (abilityClientPtr_->GetAbilityList(allTypes, stateType, installedAbilities) != Accessibility::RET_OK)) {
521         HILOG_ERROR("Failed to GetInstalledAbilities");
522     }
523     return installedAbilities;
524 }
525 
CheckBundleArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)526 bool AccessibilityAbilityShellCommand::CheckBundleArgument(
527     const AccessibilityCommandArgument& argument,
528     std::string& resultMessage)
529 {
530     if (argument.bundleArgumentNum == 0) {
531         resultMessage.append(ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT);
532         return false;
533     }
534     if (argument.bundleArgumentNum > 1) {
535         resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
536         return false;
537     }
538     if (argument.bundleName.empty() || argument.bundleName[0] == '-') {
539         resultMessage.append(ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
540         return false;
541     }
542     return true;
543 }
544 
CheckAbilityArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)545 bool AccessibilityAbilityShellCommand::CheckAbilityArgument(
546     const AccessibilityCommandArgument& argument,
547     std::string& resultMessage)
548 {
549     if (argument.abilityArgumentNum == 0) {
550         resultMessage.append(ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT);
551         return false;
552     }
553     if (argument.abilityArgumentNum > 1) {
554         resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
555         return false;
556     }
557     if (argument.abilityName.empty() || argument.abilityName[0] == '-') {
558         resultMessage.append(ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
559         return false;
560     }
561     return true;
562 }
563 
CheckCapabilitiesArgument(const AccessibilityCommandArgument & argument,std::vector<Accessibility::AccessibilityAbilityInfo> & installedAbilities,std::string & resultMessage)564 bool AccessibilityAbilityShellCommand::CheckCapabilitiesArgument(
565     const AccessibilityCommandArgument& argument,
566     std::vector<Accessibility::AccessibilityAbilityInfo>& installedAbilities,
567     std::string& resultMessage)
568 {
569     if (argument.capabilityNamesArgumentNum == 0) {
570         resultMessage.append(ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT);
571         return false;
572     }
573     if (argument.capabilityNamesArgumentNum > 1) {
574         resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
575         return false;
576     }
577     if (argument.capabilityNames.empty() || argument.capabilityNames[0] == '-') {
578         resultMessage.append(ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE);
579         return false;
580     }
581     return true;
582 }
583 
CheckParamValidity(const AccessibilityCommandArgument & argument,std::vector<Accessibility::AccessibilityAbilityInfo> & installedAbilities,std::string & resultMessage)584 bool AccessibilityAbilityShellCommand::CheckParamValidity(
585     const AccessibilityCommandArgument& argument,
586     std::vector<Accessibility::AccessibilityAbilityInfo>& installedAbilities,
587     std::string& resultMessage)
588 {
589     const std::string& abilityName = argument.abilityName;
590     const std::string& bundleName = argument.bundleName;
591     const std::string& capabilityNames = argument.capabilityNames;
592     bool isExisted = false;
593     for (auto& ability : installedAbilities) {
594         if (ability.GetName() == abilityName && ability.GetPackageName() == bundleName) {
595             isExisted = true;
596             const std::string staticCapabilityNames = AccessibilityUtils::GetStaticCapabilityNames(ability);
597             std::string invalidCapabilityNames = AccessibilityUtils::GetInvalidCapabilityNames(capabilityNames,
598                 staticCapabilityNames);
599             if (!invalidCapabilityNames.empty()) {
600                 resultMessage.append("the capabilities " + invalidCapabilityNames + ACCESSIBILITY_ABILITY_NOT_FOUND);
601                 return false;
602             }
603         }
604     }
605     if (!isExisted) {
606         resultMessage.append("the auxiliary application " +
607             bundleName + "/" + abilityName + ACCESSIBILITY_ABILITY_NOT_FOUND);
608         return false;
609     }
610     return true;
611 }
612 
CheckEnableCommandArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)613 ErrCode AccessibilityAbilityShellCommand::CheckEnableCommandArgument(const AccessibilityCommandArgument& argument,
614     std::string& resultMessage)
615 {
616     ErrCode result = OHOS::ERR_OK;
617     resultMessage.append(argument.command + ": ");
618     int32_t totalArgumentNum = argument.bundleArgumentNum + argument.abilityArgumentNum +
619         argument.capabilityNamesArgumentNum + argument.unknownArgumentNum;
620     if (totalArgumentNum > ACCESSIBILITY_ENABLE_COMMAND_ARGUMENT_NUM) {
621         resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
622         if (argument.bundleArgumentNum > 1 || argument.abilityArgumentNum > 1 ||
623             argument.capabilityNamesArgumentNum > 1) {
624             resultMessage.append("and exist duplicated arguments");
625         }
626         if (argument.unknownArgumentNum > 0) {
627             resultMessage.append("and exist unknown arguments ");
628             resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
629         }
630         return OHOS::ERR_INVALID_VALUE;
631     }
632     if (argument.unknownArgumentNum > 0) {
633         resultMessage.append("unknown arguments ");
634         resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
635         return OHOS::ERR_INVALID_VALUE;
636     }
637     std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
638     if (!CheckAbilityArgument(argument, resultMessage)) {
639         HILOG_ERROR("abilityName = %{public}s is invalid", argument.abilityName.c_str());
640         return OHOS::ERR_INVALID_VALUE;
641     }
642     if (!CheckBundleArgument(argument, resultMessage)) {
643         HILOG_ERROR("bundleName = %{public}s is invalid", argument.bundleName.c_str());
644         return OHOS::ERR_INVALID_VALUE;
645     }
646     if (!CheckCapabilitiesArgument(argument, installedAbilities, resultMessage)) {
647         HILOG_ERROR("capabilityNames = %{public}s is invalid", argument.capabilityNames.c_str());
648         return OHOS::ERR_INVALID_VALUE;
649     }
650     if (!CheckParamValidity(argument, installedAbilities, resultMessage)) {
651         HILOG_ERROR("%{public}s/%{public}s is not installed",
652             argument.bundleName.c_str(), argument.abilityName.c_str());
653         return OHOS::ERR_INVALID_VALUE;
654     }
655     std::vector<std::string> enabledAbilities = GetEnabledAbilities();
656     std::string currentAbility = argument.bundleName + "/" + argument.abilityName;
657     for (const auto& ability : enabledAbilities) {
658         if (ability == currentAbility) {
659             resultMessage.append("the auxiliary application has been enabled.");
660             return OHOS::ERR_INVALID_VALUE;
661         }
662     }
663     return result;
664 }
665 
CheckDisableCommandArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)666 ErrCode AccessibilityAbilityShellCommand::CheckDisableCommandArgument(const AccessibilityCommandArgument& argument,
667     std::string& resultMessage)
668 {
669     ErrCode result = CheckCommandArgument(argument, resultMessage);
670     if (result == OHOS::ERR_OK) {
671         std::vector<std::string> enabledAbilities = GetEnabledAbilities();
672         std::string currentAbility = argument.bundleName + "/" + argument.abilityName;
673         bool isEnabled = false;
674         for (const auto& ability : enabledAbilities) {
675             if (ability == currentAbility) {
676                 isEnabled = true;
677                 break;
678             }
679         }
680         if (!isEnabled) {
681             resultMessage.append("the auxiliary application was not enabled and could not be disabled.");
682             return OHOS::ERR_INVALID_VALUE;
683         }
684     }
685     return result;
686 }
687 
CheckCommandArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)688 ErrCode AccessibilityAbilityShellCommand::CheckCommandArgument(const AccessibilityCommandArgument& argument,
689     std::string& resultMessage)
690 {
691     resultMessage.append(argument.command + ": ");
692     int32_t totalArgumentNum = argument.bundleArgumentNum + argument.abilityArgumentNum +
693         argument.capabilityNamesArgumentNum + argument.unknownArgumentNum;
694     if (totalArgumentNum > ACCESSIBILITY_DISABLE_COMMAND_ARGUMENT_NUM) {
695         resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
696         if (argument.bundleArgumentNum > 1 || argument.abilityArgumentNum > 1) {
697             resultMessage.append("and exist duplicated arguments.");
698         }
699         if (argument.unknownArgumentNum > 0) {
700             resultMessage.append("and exist unknown arguments ");
701             resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
702         }
703         return OHOS::ERR_INVALID_VALUE;
704     }
705     if (argument.unknownArgumentNum > 0) {
706         resultMessage.append("unknown arguments ");
707         resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
708         return OHOS::ERR_INVALID_VALUE;
709     }
710     std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
711     if (!CheckAbilityArgument(argument, resultMessage)) {
712         HILOG_ERROR("abilityName = %{public}s is invalid", argument.abilityName.c_str());
713         return OHOS::ERR_INVALID_VALUE;
714     }
715     if (!CheckBundleArgument(argument, resultMessage)) {
716         HILOG_ERROR("bundleName = %{public}s is invalid", argument.bundleName.c_str());
717         return OHOS::ERR_INVALID_VALUE;
718     }
719     if (!CheckParamValidity(argument, installedAbilities, resultMessage)) {
720         HILOG_ERROR("%{public}s/%{public}s is not installed",
721             argument.bundleName.c_str(), argument.abilityName.c_str());
722         return OHOS::ERR_INVALID_VALUE;
723     }
724     return OHOS::ERR_OK;
725 }
726 
CheckSetCommandArgument(const AccessibilityCommandArgument & argument,std::string & resultMessage)727 ErrCode AccessibilityAbilityShellCommand::CheckSetCommandArgument(const AccessibilityCommandArgument& argument,
728     std::string& resultMessage)
729 {
730     resultMessage.append(argument.command + ": ");
731     int32_t totalArgumentNum = argument.setArgumentNum + argument.unknownArgumentNum;
732     if (totalArgumentNum > ACCESSIBILITY_SET_COMMAND_ARGUMENT_NUM) {
733         resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
734         if (argument.setArgumentNum > 1) {
735             resultMessage.append("and exist duplicated arguments.");
736         }
737         if (argument.unknownArgumentNum > 0) {
738             resultMessage.append("and exist unknown arguments ");
739             resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
740         }
741         return OHOS::ERR_INVALID_VALUE;
742     }
743     if (argument.unknownArgumentNum > 0) {
744         resultMessage.append("unknown arguments ");
745         resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
746         return OHOS::ERR_INVALID_VALUE;
747     }
748     if (argument.setArgumentNum == 0) {
749         resultMessage.append(ACCESSIBILITY_HELP_MSG_NO_OPTION);
750         return OHOS::ERR_INVALID_VALUE;
751     }
752     return OHOS::ERR_OK;
753 }
754 
RunAsSetScreenMagnificationState()755 ErrCode AccessibilityAbilityShellCommand::RunAsSetScreenMagnificationState()
756 {
757     AccessibilityCommandArgument argument;
758     argument.command = "setScreenMagnificationState";
759     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
760     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
761         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
762         result = OHOS::ERR_INVALID_VALUE;
763     }
764     if (result == OHOS::ERR_OK) {
765         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
766         (void)config.InitializeContext();
767         bool state = std::atoi(argument.value.c_str()) == 1;
768         Accessibility::RetError ret = config.SetScreenMagnificationState(state);
769         if (ret == Accessibility::RET_OK) {
770             resultReceiver_ = ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_OK + "\n";
771         } else {
772             resultReceiver_ = ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_NG;
773             resultReceiver_.append(GetMessageFromCode(ret));
774         }
775     } else {
776         resultReceiver_.append("\n");
777         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SCREEN_MAGNIFICATION_STATE);
778         result = OHOS::ERR_INVALID_VALUE;
779     }
780 
781     return result;
782 }
783 
RunAsSetShortKeyState()784 ErrCode AccessibilityAbilityShellCommand::RunAsSetShortKeyState()
785 {
786     AccessibilityCommandArgument argument;
787     argument.command = "setShortKeyState";
788     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
789     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
790         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
791         result = OHOS::ERR_INVALID_VALUE;
792     }
793     if (result == OHOS::ERR_OK) {
794         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
795         (void)config.InitializeContext();
796         bool state = std::atoi(argument.value.c_str()) == 1;
797         Accessibility::RetError ret = config.SetShortKeyState(state);
798         if (ret == Accessibility::RET_OK) {
799             resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_STATE_OK + "\n";
800         } else {
801             resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_STATE_NG;
802             resultReceiver_.append(GetMessageFromCode(ret));
803         }
804     } else {
805         resultReceiver_.append("\n");
806         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_STATE);
807         result = OHOS::ERR_INVALID_VALUE;
808     }
809 
810     return result;
811 }
812 
RunAsSetMouseKeyState()813 ErrCode AccessibilityAbilityShellCommand::RunAsSetMouseKeyState()
814 {
815     AccessibilityCommandArgument argument;
816     argument.command = "setMouseKeyState";
817     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
818     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
819         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
820         result = OHOS::ERR_INVALID_VALUE;
821     }
822     if (result == OHOS::ERR_OK) {
823         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
824         (void)config.InitializeContext();
825         bool state = std::atoi(argument.value.c_str()) == 1;
826         Accessibility::RetError ret = config.SetMouseKeyState(state);
827         if (ret == Accessibility::RET_OK) {
828             resultReceiver_ = ACCESSIBILITY_SET_MOUSE_KEY_STATE_OK + "\n";
829         } else {
830             resultReceiver_ = ACCESSIBILITY_SET_MOUSE_KEY_STATE_NG;
831             resultReceiver_.append(GetMessageFromCode(ret));
832         }
833     } else {
834         resultReceiver_.append("\n");
835         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_MOUSE_KEY_STATE);
836         result = OHOS::ERR_INVALID_VALUE;
837     }
838 
839     return result;
840 }
841 
RunAsSetCaptionState()842 ErrCode AccessibilityAbilityShellCommand::RunAsSetCaptionState()
843 {
844     AccessibilityCommandArgument argument;
845     argument.command = "setCaptionState";
846     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
847     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
848         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
849         result = OHOS::ERR_INVALID_VALUE;
850     }
851     if (result == OHOS::ERR_OK) {
852         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
853         (void)config.InitializeContext();
854         bool state = std::atoi(argument.value.c_str()) == 1;
855         Accessibility::RetError ret = config.SetCaptionsState(state);
856         if (ret == Accessibility::RET_OK) {
857             resultReceiver_ = ACCESSIBILITY_SET_CAPTION_STATE_OK + "\n";
858         } else {
859             resultReceiver_ = ACCESSIBILITY_SET_CAPTION_STATE_NG;
860             resultReceiver_.append(GetMessageFromCode(ret));
861         }
862     } else {
863         resultReceiver_.append("\n");
864         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_CAPTION_STATE);
865         result = OHOS::ERR_INVALID_VALUE;
866     }
867 
868     return result;
869 }
870 
RunAsSetMouseAutoClick()871 ErrCode AccessibilityAbilityShellCommand::RunAsSetMouseAutoClick()
872 {
873     AccessibilityCommandArgument argument;
874     argument.command = "setMouseAutoClick";
875     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
876     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
877         MOUSE_AUTO_CLICK_TIME_LOW_BOUND, MOUSE_AUTO_CLICK_TIME_HIGH_BOUND)) {
878         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
879         result = OHOS::ERR_INVALID_VALUE;
880     }
881     if (result == OHOS::ERR_OK) {
882         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
883         (void)config.InitializeContext();
884         float time = 1.0 * std::atoi(argument.value.c_str()) / 100;
885         Accessibility::RetError ret = config.SetMouseAutoClick(time);
886         if (ret == Accessibility::RET_OK) {
887             resultReceiver_ = ACCESSIBILITY_SET_AUTO_CLICK_TIME_OK + "\n";
888         } else {
889             resultReceiver_ = ACCESSIBILITY_SET_AUTO_CLICK_TIME_NG;
890             resultReceiver_.append(GetMessageFromCode(ret));
891         }
892     } else {
893         resultReceiver_.append("\n");
894         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUTO_CLICK_TIME);
895         result = OHOS::ERR_INVALID_VALUE;
896     }
897 
898     return result;
899 }
900 
RunAsSetShortKeyTarget()901 ErrCode AccessibilityAbilityShellCommand::RunAsSetShortKeyTarget()
902 {
903     AccessibilityCommandArgument argument;
904     ErrCode result = MakeSetShortKeyTargetCommandArgumentFromCmd(argument);
905     if (result == OHOS::ERR_OK) {
906         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
907         (void)config.InitializeContext();
908         std::string name = argument.bundleName + "/" + argument.abilityName;
909         Accessibility::RetError ret = config.SetShortkeyTarget(name);
910         if (ret == Accessibility::RET_OK) {
911             resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_TARGET_OK + "\n";
912         } else {
913             resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_TARGET_NG;
914             resultReceiver_.append(GetMessageFromCode(ret));
915         }
916     } else {
917         resultReceiver_.append("\n");
918         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_TARGET);
919         result = OHOS::ERR_INVALID_VALUE;
920     }
921 
922     return result;
923 }
924 
RunAsSetHighContrastTextState()925 ErrCode AccessibilityAbilityShellCommand::RunAsSetHighContrastTextState()
926 {
927     AccessibilityCommandArgument argument;
928     argument.command = "setHighContrastTextState";
929     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
930     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
931         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
932         result = OHOS::ERR_INVALID_VALUE;
933     }
934     if (result == OHOS::ERR_OK) {
935         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
936         (void)config.InitializeContext();
937         bool state = std::atoi(argument.value.c_str()) == 1;
938         Accessibility::RetError ret = config.SetHighContrastTextState(state);
939         if (ret == Accessibility::RET_OK) {
940             resultReceiver_ = ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_OK + "\n";
941         } else {
942             resultReceiver_ = ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_NG;
943             resultReceiver_.append(GetMessageFromCode(ret));
944         }
945     } else {
946         resultReceiver_.append("\n");
947         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_HIGH_CONTRAST_TEXT_STATE);
948         result = OHOS::ERR_INVALID_VALUE;
949     }
950 
951     return result;
952 }
953 
RunAsSetInvertColorState()954 ErrCode AccessibilityAbilityShellCommand::RunAsSetInvertColorState()
955 {
956     AccessibilityCommandArgument argument;
957     argument.command = "setInvertColorState";
958     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
959     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
960         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
961         result = OHOS::ERR_INVALID_VALUE;
962     }
963     if (result == OHOS::ERR_OK) {
964         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
965         (void)config.InitializeContext();
966         bool state = std::atoi(argument.value.c_str()) == 1;
967         Accessibility::RetError ret = config.SetInvertColorState(state);
968         if (ret == Accessibility::RET_OK) {
969             resultReceiver_ = ACCESSIBILITY_SET_INVERT_COLOR_STATE_OK + "\n";
970         } else {
971             resultReceiver_ = ACCESSIBILITY_SET_INVERT_COLOR_STATE_NG;
972             resultReceiver_.append(GetMessageFromCode(ret));
973         }
974     } else {
975         resultReceiver_.append("\n");
976         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_INVERT_COLOR_STATE);
977         result = OHOS::ERR_INVALID_VALUE;
978     }
979 
980     return result;
981 }
982 
RunAsSetDaltonizationColorFilter()983 ErrCode AccessibilityAbilityShellCommand::RunAsSetDaltonizationColorFilter()
984 {
985     AccessibilityCommandArgument argument;
986     argument.command = "setDaltonizationColorFilter";
987     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
988     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
989         DALTIONIZATION_TYPE_LOW_BOUND, DALTIONIZATION_TYPE_HIGH_BOUND)) {
990         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
991         return OHOS::ERR_INVALID_VALUE;
992     }
993     if (result == OHOS::ERR_OK) {
994         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
995         (void)config.InitializeContext();
996         int32_t value = std::atoi(argument.value.c_str());
997         AccessibilityConfig::DALTONIZATION_TYPE type = AccessibilityConfig::DALTONIZATION_TYPE::Normal;
998         switch (value) {
999             case TYPE_NORMAL: {
1000                 type = AccessibilityConfig::DALTONIZATION_TYPE::Normal;
1001                 break;
1002             }
1003             case TYPE_PROTANOMALY: {
1004                 type = AccessibilityConfig::DALTONIZATION_TYPE::Protanomaly;
1005                 break;
1006             }
1007             case TYPE_DEUTERANOMALY: {
1008                 type = AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly;
1009                 break;
1010             }
1011             case TYPE_TRITANOMALY: {
1012                 type = AccessibilityConfig::DALTONIZATION_TYPE::Tritanomaly;
1013                 break;
1014             }
1015             default: {
1016                 break;
1017             }
1018         }
1019         Accessibility::RetError ret = config.SetDaltonizationColorFilter(type);
1020         if (ret == Accessibility::RET_OK) {
1021             resultReceiver_ = ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_OK + "\n";
1022         } else {
1023             resultReceiver_ = ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_NG;
1024             resultReceiver_.append(GetMessageFromCode(ret));
1025         }
1026     } else {
1027         resultReceiver_.append("\n");
1028         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_DALTONIZATION_COLOR_FILTER);
1029         result = OHOS::ERR_INVALID_VALUE;
1030     }
1031 
1032     return result;
1033 }
1034 
RunAsSetContentTimeout()1035 ErrCode AccessibilityAbilityShellCommand::RunAsSetContentTimeout()
1036 {
1037     AccessibilityCommandArgument argument;
1038     argument.command = "setContentTimeout";
1039     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
1040     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
1041         CONTENT_TIME_OUT_TIME_LOW_BOUND, CONTENT_TIME_OUT_TIME_HIGH_BOUND)) {
1042         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
1043         result = OHOS::ERR_INVALID_VALUE;
1044     }
1045     if (result == OHOS::ERR_OK) {
1046         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1047         (void)config.InitializeContext();
1048         int32_t time = std::atoi(argument.value.c_str());
1049         Accessibility::RetError ret = config.SetContentTimeout(time);
1050         if (ret == Accessibility::RET_OK) {
1051             resultReceiver_ = ACCESSIBILITY_SET_CONTENT_TIME_OK + "\n";
1052         } else {
1053             resultReceiver_ = ACCESSIBILITY_SET_CONTENT_TIME_NG;
1054             resultReceiver_.append(GetMessageFromCode(ret));
1055         }
1056     } else {
1057         resultReceiver_.append("\n");
1058         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_CONTENT_TIME_OUT);
1059         result = OHOS::ERR_INVALID_VALUE;
1060     }
1061 
1062     return result;
1063 }
1064 
RunAsSetAnimationOffState()1065 ErrCode AccessibilityAbilityShellCommand::RunAsSetAnimationOffState()
1066 {
1067     AccessibilityCommandArgument argument;
1068     argument.command = "setAnimationOffState";
1069     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
1070     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
1071         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
1072         result = OHOS::ERR_INVALID_VALUE;
1073     }
1074     if (result == OHOS::ERR_OK) {
1075         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1076         (void)config.InitializeContext();
1077         bool state = std::atoi(argument.value.c_str()) == 1;
1078         Accessibility::RetError ret = config.SetAnimationOffState(state);
1079         if (ret == Accessibility::RET_OK) {
1080             resultReceiver_ = ACCESSIBILITY_SET_ANIMATION_OFF_STATE_OK + "\n";
1081         } else {
1082             resultReceiver_ = ACCESSIBILITY_SET_ANIMATION_OFF_STATE_NG;
1083             resultReceiver_.append(GetMessageFromCode(ret));
1084         }
1085     } else {
1086         resultReceiver_.append("\n");
1087         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_ANIMATION_OFF_STATE);
1088         result = OHOS::ERR_INVALID_VALUE;
1089     }
1090 
1091     return result;
1092 }
1093 
RunAsSetBrightnessDiscount()1094 ErrCode AccessibilityAbilityShellCommand::RunAsSetBrightnessDiscount()
1095 {
1096     AccessibilityCommandArgument argument;
1097     argument.command = "setSetBrightnessDiscount";
1098     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
1099     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
1100         BRIGHTNESS_DISCOUNT_LOW_BOUND, BRIGHTNESS_DISCOUNT_HIGH_BOUND)) {
1101         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
1102         result = OHOS::ERR_INVALID_VALUE;
1103     }
1104     if (result == OHOS::ERR_OK) {
1105         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1106         (void)config.InitializeContext();
1107         float discount = 1.0 * std::atoi(argument.value.c_str()) / 100;
1108         Accessibility::RetError ret = config.SetBrightnessDiscount(discount);
1109         if (ret == Accessibility::RET_OK) {
1110             resultReceiver_ = ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_OK + "\n";
1111         } else {
1112             resultReceiver_ = ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_NG;
1113             resultReceiver_.append(GetMessageFromCode(ret));
1114         }
1115     } else {
1116         resultReceiver_.append("\n");
1117         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_BRIGHTNESS_DISCOUNT);
1118         result = OHOS::ERR_INVALID_VALUE;
1119     }
1120 
1121     return result;
1122 }
1123 
RunAsSetAudioMonoState()1124 ErrCode AccessibilityAbilityShellCommand::RunAsSetAudioMonoState()
1125 {
1126     AccessibilityCommandArgument argument;
1127     argument.command = "setAudioMonoState";
1128     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
1129     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
1130         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
1131         result = OHOS::ERR_INVALID_VALUE;
1132     }
1133     if (result == OHOS::ERR_OK) {
1134         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1135         (void)config.InitializeContext();
1136         bool state = std::atoi(argument.value.c_str()) == 1;
1137         Accessibility::RetError ret = config.SetAudioMonoState(state);
1138         if (ret == Accessibility::RET_OK) {
1139             resultReceiver_ = ACCESSIBILITY_SET_AUDIO_MONO_STATE_OK + "\n";
1140         } else {
1141             resultReceiver_ = ACCESSIBILITY_SET_AUDIO_MONO_STATE_NG;
1142             resultReceiver_.append(GetMessageFromCode(ret));
1143         }
1144     } else {
1145         resultReceiver_.append("\n");
1146         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUDIO_MONO_STATE);
1147         result = OHOS::ERR_INVALID_VALUE;
1148     }
1149 
1150     return result;
1151 }
1152 
RunAsSetAudioBalance()1153 ErrCode AccessibilityAbilityShellCommand::RunAsSetAudioBalance()
1154 {
1155     AccessibilityCommandArgument argument;
1156     argument.command = "setAudioBalance";
1157     ErrCode result = MakeSetCommandArgumentFromCmd(argument);
1158     if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
1159         AUDIO_BALANCE_LOW_BOUND, AUDIO_BALANCE_HIGH_BOUND)) {
1160         resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
1161         result = OHOS::ERR_INVALID_VALUE;
1162     }
1163     if (result == OHOS::ERR_OK) {
1164         auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
1165         (void)config.InitializeContext();
1166         float balance = 1.0 * std::atoi(argument.value.c_str()) / 100;
1167         Accessibility::RetError ret = config.SetAudioBalance(balance);
1168         if (ret == Accessibility::RET_OK) {
1169             resultReceiver_ = ACCESSIBILITY_SET_AUDIO_BALANCE_OK + "\n";
1170         } else {
1171             resultReceiver_ = ACCESSIBILITY_SET_AUDIO_BALANCE_NG;
1172             resultReceiver_.append(GetMessageFromCode(ret));
1173         }
1174     } else {
1175         resultReceiver_.append("\n");
1176         resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUDIO_BALANCE);
1177         result = OHOS::ERR_INVALID_VALUE;
1178     }
1179     return result;
1180 }
1181 
MakeSetShortKeyTargetCommandArgumentFromCmd(AccessibilityCommandArgument & argument)1182 ErrCode AccessibilityAbilityShellCommand::MakeSetShortKeyTargetCommandArgumentFromCmd(
1183     AccessibilityCommandArgument& argument)
1184 {
1185     argument.command = "setShortkeyTarget";
1186     ErrCode result = MakeCommandArgumentFromCmd(argument);
1187     if (result == OHOS::ERR_OK) {
1188         return CheckCommandArgument(argument, resultReceiver_);
1189     }
1190     return result;
1191 }
1192 
MakeCommandArgumentFromCmd(AccessibilityCommandArgument & argument)1193 ErrCode AccessibilityAbilityShellCommand::MakeCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
1194 {
1195     int option = -1;
1196     int counter = 0;
1197     while (true) {
1198         counter++;
1199         option = getopt_long(argc_, argv_, DISABLE_SHORT_OPTIONS.c_str(), DISABLE_LONG_OPTIONS, nullptr);
1200 
1201         HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
1202 
1203         if (optind < 0 || optind > argc_) {
1204             return OHOS::ERR_INVALID_VALUE;
1205         }
1206 
1207         if (option == -1) {
1208             if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
1209                 resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
1210                 return OHOS::ERR_INVALID_VALUE;
1211             }
1212             break;
1213         }
1214 
1215         if (option == '?') {
1216             option = optopt;
1217             switch (option) {
1218                 case 'a': {
1219                     resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
1220                     return OHOS::ERR_INVALID_VALUE;
1221                 }
1222                 case 'b': {
1223                     resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
1224                     return OHOS::ERR_INVALID_VALUE;
1225                 }
1226                 default: {
1227                     break;
1228                 }
1229             }
1230         }
1231 
1232         switch (option) {
1233             case 'a': {
1234                 argument.abilityName = optarg;
1235                 argument.abilityArgumentNum++;
1236                 break;
1237             }
1238             case 'b': {
1239                 argument.bundleName = optarg;
1240                 argument.bundleArgumentNum++;
1241                 break;
1242             }
1243             default: {
1244                 argument.unknownArgumentNum++;
1245                 argument.unknownArguments.push_back(argv_[optind - 1]);
1246                 break;
1247             }
1248         }
1249     }
1250     return OHOS::ERR_OK;
1251 }
1252 
MakeSetCommandArgumentFromCmd(AccessibilityCommandArgument & argument)1253 ErrCode AccessibilityAbilityShellCommand::MakeSetCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
1254 {
1255     int option = -1;
1256     int counter = 0;
1257 
1258     while (true) {
1259         counter++;
1260 
1261         option = getopt_long(argc_, argv_, SET_SHORT_OPTIONS.c_str(), SET_LONG_OPTIONS, nullptr);
1262 
1263         HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);
1264 
1265         if (optind < 0 || optind > argc_) {
1266             return OHOS::ERR_INVALID_VALUE;
1267         }
1268 
1269         if (option == -1) {
1270             if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
1271                 resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
1272                 return OHOS::ERR_INVALID_VALUE;
1273             }
1274             break;
1275         }
1276 
1277         if (option == '?') {
1278             option = optopt;
1279             switch (option) {
1280                 case 'v': {
1281                     resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_SET_ARGUMENT_VALUE);
1282                     return OHOS::ERR_INVALID_VALUE;
1283                 }
1284                 default: {
1285                     break;
1286                 }
1287             }
1288         }
1289 
1290         switch (option) {
1291             case 'v': {
1292                 argument.value = optarg;
1293                 argument.setArgumentNum++;
1294                 break;
1295             }
1296             default: {
1297                 argument.unknownArgumentNum++;
1298                 argument.unknownArguments.push_back(argv_[optind - 1]);
1299                 break;
1300             }
1301         }
1302     }
1303     return CheckSetCommandArgument(argument, resultReceiver_);
1304 }
1305 
1306 }  // namespace AAFwk
1307 }  // namespace OHOS
1308