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