/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "accessibility_ability_command.h"
#include "accessibility_ability_utils.h"

#include <csignal>
#include <cstdlib>
#include <fstream>
#include <getopt.h>
#include <regex>

#include "ability_manager_client.h"
#include "accessibility_config.h"
#include "accessibility_system_ability_client.h"
#include "bool_wrapper.h"
#include "hilog_wrapper.h"
#include "iservice_registry.h"
#include "mission_snapshot.h"
#include "sa_mgr_client.h"
#include "system_ability_definition.h"
#include "test_observer.h"

using namespace OHOS::AppExecFwk;

namespace OHOS {
namespace AAFwk {
namespace {
const std::string ENABLE_SHORT_OPTIONS = "a:b:c:";
const std::string DISABLE_SHORT_OPTIONS = "a:b:";
const std::string SET_SHORT_OPTIONS = "v:";
const std::string STRING_LIST_ABILITY_NG = "error: failed to list abilities";
const int32_t MOUSE_AUTO_CLICK_TIME_LOW_BOUND = 1000;
const int32_t MOUSE_AUTO_CLICK_TIME_HIGH_BOUND = 5000;
const int32_t CONTENT_TIME_OUT_TIME_LOW_BOUND = 0;
const int32_t CONTENT_TIME_OUT_TIME_HIGH_BOUND = 5000;
const int32_t AUDIO_BALANCE_LOW_BOUND = -100;
const int32_t AUDIO_BALANCE_HIGH_BOUND = 100;
const int32_t BRIGHTNESS_DISCOUNT_LOW_BOUND = 0;
const int32_t BRIGHTNESS_DISCOUNT_HIGH_BOUND = 100;
const int32_t DALTIONIZATION_TYPE_LOW_BOUND = 0;
const int32_t DALTIONIZATION_TYPE_HIGH_BOUND = 3;
const int32_t TYPE_NORMAL = 0;
const int32_t TYPE_PROTANOMALY = 1;
const int32_t TYPE_DEUTERANOMALY = 2;
const int32_t TYPE_TRITANOMALY = 3;
const int32_t ACCESSIBILITY_ENABLE_COMMAND_ARGUMENT_NUM = 3;
const int32_t ACCESSIBILITY_DISABLE_COMMAND_ARGUMENT_NUM = 2;
const int32_t ACCESSIBILITY_SET_COMMAND_ARGUMENT_NUM = 1;

const std::string ACCESSIBILITY_TOOL_NAME = "accessibility";
const std::string ACCESSIBILITY_STRING_ENABLE_ABILITY_OK = "enable ability successfully.";
const std::string ACCESSIBILITY_STRING_ENABLE_ABILITY_NG = "error: failed to enable ability.\n";

const std::string ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_OK = "set screen magnification state successfully.";
const std::string ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_NG = "error: failed to set screen magnification state\n";
const std::string ACCESSIBILITY_SET_SHORT_KEY_STATE_OK = "set short key state successfully.";
const std::string ACCESSIBILITY_SET_SHORT_KEY_STATE_NG = "error: failed to set short key state.\n";
const std::string ACCESSIBILITY_SET_MOUSE_KEY_STATE_OK = "set mouse key state successfully.";
const std::string ACCESSIBILITY_SET_MOUSE_KEY_STATE_NG = "error: failed to set mouse key state.\n";
const std::string ACCESSIBILITY_SET_CAPTION_STATE_OK = "set caption state successfully.";
const std::string ACCESSIBILITY_SET_CAPTION_STATE_NG = "error: failed to set caption state.\n";
const std::string ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_OK = "set high contrast text state successfully.";
const std::string ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_NG = "error: failed to set high contrast text state.\n";
const std::string ACCESSIBILITY_SET_INVERT_COLOR_STATE_OK = "set invert color state successfully.";
const std::string ACCESSIBILITY_SET_INVERT_COLOR_STATE_NG = "error: failed to set invert color state.\n";
const std::string ACCESSIBILITY_SET_ANIMATION_OFF_STATE_OK = "set animation off state successfully.";
const std::string ACCESSIBILITY_SET_ANIMATION_OFF_STATE_NG = "error: failed to set animation off state.\n";
const std::string ACCESSIBILITY_SET_AUDIO_MONO_STATE_OK = "set audio mono state successfully.";
const std::string ACCESSIBILITY_SET_AUDIO_MONO_STATE_NG = "error: failed to set audio mono state.\n";
const std::string ACCESSIBILITY_SET_AUTO_CLICK_TIME_OK = "set mouse auto click time successfully.";
const std::string ACCESSIBILITY_SET_AUTO_CLICK_TIME_NG = "error: failed to set mouse auto click time.\n";
const std::string ACCESSIBILITY_SET_SHORT_KEY_TARGET_OK = "set short key target successfully.";
const std::string ACCESSIBILITY_SET_SHORT_KEY_TARGET_NG = "error: failed to set short key target.\n";
const std::string ACCESSIBILITY_SET_AUDIO_BALANCE_OK = "set audio balance successfully.";
const std::string ACCESSIBILITY_SET_AUDIO_BALANCE_NG = "error: failed to set audio balance successfully.";
const std::string ACCESSIBILITY_SET_CONTENT_TIME_OK = "set content timeout successfully.";
const std::string ACCESSIBILITY_SET_CONTENT_TIME_NG = "error: failed to set content timeout.\n";
const std::string ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_OK = "set brightness discount successfully.";
const std::string ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_NG = "error: failed to set brightness discount.\n";
const std::string ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_OK =
    "set daltonization color filter successfully.";
const std::string ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_NG =
    "error: failed to set daltonization color filter.\n";

const std::string ACCESSIBILITY_ABILITY_NOT_FOUND = " was not found!";
const std::string ACCESSIBILITY_HELP_MSG_NO_OPTION = "missing options.";

const std::string ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT =
    "argument -b <bundle-name> or --bundle=<bundle-name> is required!";
const std::string ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT =
    "argument -a <ability-name> or --ability=<ability-name> is required!";
const std::string ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT =
    "argument -c <capabilities-abbr>"
    " or --capabilities=<capabilities-abbr> is required!";

const std::string ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT = "there are too many arguments ";
const std::string ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT = "there are duplicate arguments.";

const std::string ACCESSIBILITY_STRING_DISABLE_ABILITY_OK = "disable ability successfully.";
const std::string ACCESSIBILITY_STRING_DISABLE_ABILITY_NG = "error: failed to disable ability.";

const std::string ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE = "option -a requires a value.";
const std::string ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE = "option -b requires a value.";
const std::string ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE = "option -c requires a value.";
const std::string ACCESSIBILITY_ABILITY_NO_SET_ARGUMENT_VALUE = "option -v requires a value.";

const std::string ACCESSIBILITY_ABILITY_SET_VALUE_INVALID = "value is invalid.";

const std::string ACCESSIBILITY_HELP_MSG =
    "usage: accessibility <command>\n"
    "these are common accessibility commands list:\n"
    "  help                        list available commands\n"
    "  enable                      enable ability with options\n"
    "  disable                     disable ability with options\n"
    "  list                        list the installed abilities info\n"
    "  setShortKeyState            set the state of the short key configuration item\n"
    "  setMouseKeyState            set the state of the mouse key configuration item\n"
    "  setCaptionState             set the state of the caption configuration item\n"
    "  setMouseAutoClick           set the time of the mouse auto click configuration item\n"
    "  setShortKeyTarget           set the name of the short key target configuration item\n"
    "  setHighContrastTextState    set the state of the high contrast text configuration item\n"
    "  setInvertColorState         set the state of the invert color configuration item\n"
    "  setDaltonizationColorFilter set the type of the daltonization color filter configuration item\n"
    "  setContentTimeout           set the time of the toast content duration configuration item\n"
    "  setAnimationOffState        set the state of the animation off configuration item\n"
    "  setBrightnessDiscount       set the discount of the screen brightness configuration item\n"
    "  setAudioMonoState           set the state of the audio mono configuration item\n"
    "  setAudioBalance             set the value of the audio balance configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_ENABLE_ABILITY =
    "usage: accessibility enable [-a <ability-name>] [-b <bundle-name>] [-c <capabilities-abbr>]\n"
    "enable the auxiliary application with bundle-name and ability-name and capabilities-abbr\n";

const std::string ACCESSIBILITY_HELP_MSG_DISABLE_ABILITY =
    "usage: accessibility disable [-a <ability-name>] [-b <bundle-name>]\n"
    "disable the auxiliary application with bundle-name and ability-name\n";

const std::string ACCESSIBILITY_HELP_MSG_LIST_ABILITIES =
    "the auxiliary capabilities supported by the accessibility subsystem are as follows:\n"
    "r:retrieve                                enable the retrieval capability of auxiliary application\n"
    "t:touch_guide                             enable the touch guide capability of auxiliary application\n"
    "g:gesture                                 enable the gesture injection capability of auxiliary application\n"
    "k:key_event_observer                      enable the key event interception capability of auxiliary application\n"
    "z:zoom                                    enable the gesture zoom capability of auxiliary application\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_SCREEN_MAGNIFICATION_STATE =
    "usage: accessibility setScreenMagnificationState [-v <0 | 1> ]\n"
    "set the state of the screen magnification configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_STATE =
    "usage: accessibility setShortKeyState [-v <0 | 1> ]\n"
    "set the state of the short key configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_MOUSE_KEY_STATE =
    "usage: accessibility setMouseKeyState [-v <0 | 1> ]\n"
    "set the state of the mouse key configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_CAPTION_STATE =
    "usage: accessibility setCaptionState [-v <0 | 1> ]\n"
    "set the state of the caption configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_HIGH_CONTRAST_TEXT_STATE =
    "usage: accessibility setHighContrastTextState [-v <0 | 1> ]\n"
    "set the state of the high contrast text configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_INVERT_COLOR_STATE =
    "usage: accessibility setInvertColorState [-v <0 | 1>]\n"
    "set the state of the invert color configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_DALTONIZATION_COLOR_FILTER =
    "usage: accessibility setDaltonizationColorFilter [-v <0 | 1 | 2 | 3>]\n"
    "normal = 0, protanomaly = 1, deuteranomaly = 2, tritanomaly = 3\n"
    "set the type of the daltonization color filter configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_ANIMATION_OFF_STATE =
    "usage: accessibility setAnimationOffState [-v <0 | 1>]\n"
    "set the state of the animation off configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_AUDIO_MONO_STATE =
    "usage: accessibility setAudioMonoState [-v <0 | 1>]\n"
    "set the state of the audio mono configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_AUTO_CLICK_TIME =
    "usage: accessibility setMouseAutoClick [-v <time-value>]\n"
    "the range of time-value is 1000 to 5000 and the default unit is ms\n"
    "set the time of the mouse auto click configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_TARGET =
    "usage: accessibility setShortKeyTarget -a <ability-name> -b <bundle-name>\n"
    "set the name of the short key target configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_CONTENT_TIME_OUT =
    "usage: accessibility setContentTimeout [-v <time-value>]\n"
    "the range of time-value is 0 to 5000 and the default unit is ms\n"
    "set the time of the toast content duration configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_BRIGHTNESS_DISCOUNT =
    "usage: accessibility setBrightnessDiscount [-v <discount-value>]\n"
    "the percentage of discount-value is 0 to 100\n"
    "set the discount of the screen brightness configuration item\n";

const std::string ACCESSIBILITY_HELP_MSG_SET_AUDIO_BALANCE =
    "usage: accessibility setAudioBalance [-v <balance-value>]\n"
    "the percentage of balance-value is -100 to 100\n"
    "the negative values represent the left channel and positive values represent the right channel\n"
    "set the value of the audio balance configuration item\n";

constexpr struct option ENABLE_LONG_OPTIONS[] = {
    {"ability", required_argument, nullptr, 'a'},
    {"bundle", required_argument, nullptr, 'b'},
    {"capabilities", required_argument, nullptr, 'c'},
    {nullptr, 0, nullptr, 0},
};

constexpr struct option DISABLE_LONG_OPTIONS[] = {
    {"ability", required_argument, nullptr, 'a'},
    {"bundle", required_argument, nullptr, 'b'},
    {nullptr, 0, nullptr, 0},
};

constexpr struct option SET_LONG_OPTIONS[] = {
    {"value", required_argument, nullptr, 'v'},
    {nullptr, 0, nullptr, 0},
};
}  // namespace

AccessibilityAbilityShellCommand::AccessibilityAbilityShellCommand(int argc, char* argv[])
    : ShellCommand(argc, argv, ACCESSIBILITY_TOOL_NAME)
{
    for (int i = 0; i < argc_; i++) {
        HILOG_INFO("argv_[%{public}d]: %{public}s", i, argv_[i]);
    }
    if (abilityClientPtr_ == nullptr) {
        abilityClientPtr_ = Accessibility::AccessibilitySystemAbilityClient::GetInstance();
        if (abilityClientPtr_ == nullptr) {
            HILOG_ERROR("Get accessibility system ability client failed.");
        }
    }
    int32_t addPermissionResult = AccessibilityUtils::AddPermission();
    if (addPermissionResult != 0) {
        HILOG_ERROR("Add permission for accessibility tool failed.");
    }
}

ErrCode AccessibilityAbilityShellCommand::init()
{
    messageMap_ = {
        {
            Accessibility::RET_ERR_FAILED,
            "reason: system exception.",
        },
        {
            Accessibility::RET_ERR_INVALID_PARAM,
            "reason: invalid param.",
        },
        {
            Accessibility::RET_ERR_NULLPTR,
            "reason: nullptr exception.",
        },
        {
            Accessibility::RET_ERR_IPC_FAILED,
            "reason: ipc failed.",
        },
        {
            Accessibility::RET_ERR_SAMGR,
            "reason: samgr error.",
        },
        {
            Accessibility::RET_ERR_NO_PERMISSION,
            "reason: no permissions.",
        },
        {
            Accessibility::RET_ERR_TIME_OUT,
            "reason: execution timeout.",
        },
        {
            Accessibility::RET_ERR_CONNECTION_EXIST,
            "reason: the ability is already enabled.",
        },
        {
            Accessibility::RET_ERR_NO_CAPABILITY,
            "reason: capabilities is wrong.",
        },
        {
            Accessibility::RET_ERR_NOT_INSTALLED,
            "reason: the auxiliary application is not installed.",
        },
        {
            Accessibility::RET_ERR_NOT_ENABLED,
            "reason: the auxiliary application is not enabled.",
        }
    };
    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::CreateMessageMap()
{
    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::CreateCommandMap()
{
    commandMap_ = {
        {"help", std::bind(&AccessibilityAbilityShellCommand::RunAsHelpCommand, this)},
        {"enable", std::bind(&AccessibilityAbilityShellCommand::RunAsEnableAbility, this)},
        {"disable", std::bind(&AccessibilityAbilityShellCommand::RunAsDisableAbility, this)},
        {"list", std::bind(&AccessibilityAbilityShellCommand::RunAsGetInstalledAbilities, this)},
        {"setShortKeyState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetShortKeyState, this)},
        {"setMouseKeyState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetMouseKeyState, this)},
        {"setCaptionState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetCaptionState, this)},
        {"setMouseAutoClick", std::bind(&AccessibilityAbilityShellCommand::RunAsSetMouseAutoClick, this)},
        {"setShortKeyTarget", std::bind(&AccessibilityAbilityShellCommand::RunAsSetShortKeyTarget, this)},
        {"setHighContrastTextState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetHighContrastTextState, this)},
        {"setInvertColorState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetInvertColorState, this)},
        {"setDaltonizationColorFilter",
            std::bind(&AccessibilityAbilityShellCommand::RunAsSetDaltonizationColorFilter, this)},
        {"setContentTimeout", std::bind(&AccessibilityAbilityShellCommand::RunAsSetContentTimeout, this)},
        {"setAnimationOffState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAnimationOffState, this)},
        {"setBrightnessDiscount", std::bind(&AccessibilityAbilityShellCommand::RunAsSetBrightnessDiscount, this)},
        {"setAudioMonoState", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAudioMonoState, this)},
        {"setAudioBalance", std::bind(&AccessibilityAbilityShellCommand::RunAsSetAudioBalance, this)},
    };

    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::RunAsHelpCommand()
{
    resultReceiver_.append(ACCESSIBILITY_HELP_MSG);

    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::MakeEnableCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
{
    int option = -1;
    int counter = 0;
    argument.command = "enable";
    while (true) {
        counter++;

        option = getopt_long(argc_, argv_, ENABLE_SHORT_OPTIONS.c_str(), ENABLE_LONG_OPTIONS, nullptr);

        HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);

        if (optind < 0 || optind > argc_) {
            return OHOS::ERR_INVALID_VALUE;
        }

        if (option == -1) {
            if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
                resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
                return OHOS::ERR_INVALID_VALUE;
            }
            break;
        }

        if (option == '?') {
            switch (optopt) {
                case 'a': {
                    resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                case 'b': {
                    resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                case 'c': {
                    resultReceiver_.append(argument.command + ": " +
                        ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                default: {
                    break;
                }
            }
        }

        switch (option) {
            case 'a': {
                argument.abilityName = optarg;
                argument.abilityArgumentNum++;
                break;
            }
            case 'b': {
                argument.bundleName = optarg;
                argument.bundleArgumentNum++;
                break;
            }
            case 'c': {
                argument.capabilityNames = optarg;
                argument.capabilityNamesArgumentNum++;
                break;
            }
            default: {
                argument.unknownArgumentNum++;
                argument.unknownArguments.push_back(argv_[optind - 1]);
                break;
            }
        }
    }
    return CheckEnableCommandArgument(argument, resultReceiver_);
}

ErrCode AccessibilityAbilityShellCommand::MakeDisableCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
{
    argument.command = "disable";
    ErrCode result = MakeCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK) {
        return CheckDisableCommandArgument(argument, resultReceiver_);
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsEnableAbility()
{
    AccessibilityCommandArgument argument;
    ErrCode result = MakeEnableCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        std::string name = argument.bundleName + "/" + argument.abilityName;
        std::string capabilityNames = argument.capabilityNames;
        uint32_t capabilities = AccessibilityUtils::GetCapabilityValue(capabilityNames);
        Accessibility::RetError ret = config.EnableAbility(name, capabilities);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_STRING_ENABLE_ABILITY_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_STRING_ENABLE_ABILITY_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_ENABLE_ABILITY);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsDisableAbility()
{
    AccessibilityCommandArgument argument;
    ErrCode result = MakeDisableCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        std::string name = argument.bundleName + "/" + argument.abilityName;
        Accessibility::RetError ret = config.DisableAbility(name);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_STRING_DISABLE_ABILITY_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_STRING_DISABLE_ABILITY_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_DISABLE_ABILITY);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsGetEnabledAbilities()
{
    ErrCode result = OHOS::ERR_OK;
    std::vector<std::string> enabledAbilities = GetEnabledAbilities();
    if (!enabledAbilities.empty()) {
        for (const auto& ability : enabledAbilities) {
            resultReceiver_.append(ability + "\n");
        }
    } else {
        result = OHOS::ERR_INVALID_VALUE;
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsGetInstalledAbilities()
{
    ErrCode result = OHOS::ERR_OK;
    std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
    if (!installedAbilities.empty()) {
        resultReceiver_.append(AccessibilityUtils::FormatAbilityInfos(installedAbilities));
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_LIST_ABILITIES);
    } else {
        result = OHOS::ERR_INVALID_VALUE;
    }
    return result;
}

const std::vector<std::string> AccessibilityAbilityShellCommand::GetEnabledAbilities()
{
    std::vector<std::string> enabledAbilities;
    if (abilityClientPtr_ != nullptr &&
        (abilityClientPtr_->GetEnabledAbilities(enabledAbilities) != Accessibility::RET_OK)) {
        HILOG_ERROR("Failed to GetEnabledAbilities");
    }
    return enabledAbilities;
}

const std::vector<Accessibility::AccessibilityAbilityInfo> AccessibilityAbilityShellCommand::GetInstalledAbilities()
{
    std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities;
    const uint32_t allTypes = Accessibility::AccessibilityAbilityTypes::ACCESSIBILITY_ABILITY_TYPE_ALL;
    const Accessibility::AbilityStateType stateType = Accessibility::AbilityStateType::ABILITY_STATE_INSTALLED;
    if (abilityClientPtr_ != nullptr &&
        (abilityClientPtr_->GetAbilityList(allTypes, stateType, installedAbilities) != Accessibility::RET_OK)) {
        HILOG_ERROR("Failed to GetInstalledAbilities");
    }
    return installedAbilities;
}

bool AccessibilityAbilityShellCommand::CheckBundleArgument(
    const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    if (argument.bundleArgumentNum == 0) {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT);
        return false;
    }
    if (argument.bundleArgumentNum > 1) {
        resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
        return false;
    }
    if (argument.bundleName.empty() || argument.bundleName[0] == '-') {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
        return false;
    }
    return true;
}

bool AccessibilityAbilityShellCommand::CheckAbilityArgument(
    const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    if (argument.abilityArgumentNum == 0) {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT);
        return false;
    }
    if (argument.abilityArgumentNum > 1) {
        resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
        return false;
    }
    if (argument.abilityName.empty() || argument.abilityName[0] == '-') {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
        return false;
    }
    return true;
}

bool AccessibilityAbilityShellCommand::CheckCapabilitiesArgument(
    const AccessibilityCommandArgument& argument,
    std::vector<Accessibility::AccessibilityAbilityInfo>& installedAbilities,
    std::string& resultMessage)
{
    if (argument.capabilityNamesArgumentNum == 0) {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT);
        return false;
    }
    if (argument.capabilityNamesArgumentNum > 1) {
        resultMessage.append(ACCESSIBILITY_ABILITY_DUPLICATE_ARGUMENT);
        return false;
    }
    if (argument.capabilityNames.empty() || argument.capabilityNames[0] == '-') {
        resultMessage.append(ACCESSIBILITY_ABILITY_NO_CAPABILITIES_ARGUMENT_VALUE);
        return false;
    }
    return true;
}

bool AccessibilityAbilityShellCommand::CheckParamValidity(
    const AccessibilityCommandArgument& argument,
    std::vector<Accessibility::AccessibilityAbilityInfo>& installedAbilities,
    std::string& resultMessage)
{
    const std::string& abilityName = argument.abilityName;
    const std::string& bundleName = argument.bundleName;
    const std::string& capabilityNames = argument.capabilityNames;
    bool isExisted = false;
    for (auto& ability : installedAbilities) {
        if (ability.GetName() == abilityName && ability.GetPackageName() == bundleName) {
            isExisted = true;
            const std::string staticCapabilityNames = AccessibilityUtils::GetStaticCapabilityNames(ability);
            std::string invalidCapabilityNames = AccessibilityUtils::GetInvalidCapabilityNames(capabilityNames,
                staticCapabilityNames);
            if (!invalidCapabilityNames.empty()) {
                resultMessage.append("the capabilities " + invalidCapabilityNames + ACCESSIBILITY_ABILITY_NOT_FOUND);
                return false;
            }
        }
    }
    if (!isExisted) {
        resultMessage.append("the auxiliary application " +
            bundleName + "/" + abilityName + ACCESSIBILITY_ABILITY_NOT_FOUND);
        return false;
    }
    return true;
}

ErrCode AccessibilityAbilityShellCommand::CheckEnableCommandArgument(const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    ErrCode result = OHOS::ERR_OK;
    resultMessage.append(argument.command + ": ");
    int32_t totalArgumentNum = argument.bundleArgumentNum + argument.abilityArgumentNum +
        argument.capabilityNamesArgumentNum + argument.unknownArgumentNum;
    if (totalArgumentNum > ACCESSIBILITY_ENABLE_COMMAND_ARGUMENT_NUM) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
        if (argument.bundleArgumentNum > 1 || argument.abilityArgumentNum > 1 ||
            argument.capabilityNamesArgumentNum > 1) {
            resultMessage.append("and exist duplicated arguments");
        }
        if (argument.unknownArgumentNum > 0) {
            resultMessage.append("and exist unknown arguments ");
            resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        }
        return OHOS::ERR_INVALID_VALUE;
    }
    if (argument.unknownArgumentNum > 0) {
        resultMessage.append("unknown arguments ");
        resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        return OHOS::ERR_INVALID_VALUE;
    }
    std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
    if (!CheckAbilityArgument(argument, resultMessage)) {
        HILOG_ERROR("abilityName = %{public}s is invalid", argument.abilityName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    if (!CheckBundleArgument(argument, resultMessage)) {
        HILOG_ERROR("bundleName = %{public}s is invalid", argument.bundleName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    if (!CheckCapabilitiesArgument(argument, installedAbilities, resultMessage)) {
        HILOG_ERROR("capabilityNames = %{public}s is invalid", argument.capabilityNames.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    if (!CheckParamValidity(argument, installedAbilities, resultMessage)) {
        HILOG_ERROR("%{public}s/%{public}s is not installed",
            argument.bundleName.c_str(), argument.abilityName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    std::vector<std::string> enabledAbilities = GetEnabledAbilities();
    std::string currentAbility = argument.bundleName + "/" + argument.abilityName;
    for (const auto& ability : enabledAbilities) {
        if (ability == currentAbility) {
            resultMessage.append("the auxiliary application has been enabled.");
            return OHOS::ERR_INVALID_VALUE;
        }
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::CheckDisableCommandArgument(const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    ErrCode result = CheckCommandArgument(argument, resultMessage);
    if (result == OHOS::ERR_OK) {
        std::vector<std::string> enabledAbilities = GetEnabledAbilities();
        std::string currentAbility = argument.bundleName + "/" + argument.abilityName;
        bool isEnabled = false;
        for (const auto& ability : enabledAbilities) {
            if (ability == currentAbility) {
                isEnabled = true;
                break;
            }
        }
        if (!isEnabled) {
            resultMessage.append("the auxiliary application was not enabled and could not be disabled.");
            return OHOS::ERR_INVALID_VALUE;
        }
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::CheckCommandArgument(const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    resultMessage.append(argument.command + ": ");
    int32_t totalArgumentNum = argument.bundleArgumentNum + argument.abilityArgumentNum +
        argument.capabilityNamesArgumentNum + argument.unknownArgumentNum;
    if (totalArgumentNum > ACCESSIBILITY_DISABLE_COMMAND_ARGUMENT_NUM) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
        if (argument.bundleArgumentNum > 1 || argument.abilityArgumentNum > 1) {
            resultMessage.append("and exist duplicated arguments.");
        }
        if (argument.unknownArgumentNum > 0) {
            resultMessage.append("and exist unknown arguments ");
            resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        }
        return OHOS::ERR_INVALID_VALUE;
    }
    if (argument.unknownArgumentNum > 0) {
        resultMessage.append("unknown arguments ");
        resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        return OHOS::ERR_INVALID_VALUE;
    }
    std::vector<Accessibility::AccessibilityAbilityInfo> installedAbilities = GetInstalledAbilities();
    if (!CheckAbilityArgument(argument, resultMessage)) {
        HILOG_ERROR("abilityName = %{public}s is invalid", argument.abilityName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    if (!CheckBundleArgument(argument, resultMessage)) {
        HILOG_ERROR("bundleName = %{public}s is invalid", argument.bundleName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    if (!CheckParamValidity(argument, installedAbilities, resultMessage)) {
        HILOG_ERROR("%{public}s/%{public}s is not installed",
            argument.bundleName.c_str(), argument.abilityName.c_str());
        return OHOS::ERR_INVALID_VALUE;
    }
    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::CheckSetCommandArgument(const AccessibilityCommandArgument& argument,
    std::string& resultMessage)
{
    resultMessage.append(argument.command + ": ");
    int32_t totalArgumentNum = argument.setArgumentNum + argument.unknownArgumentNum;
    if (totalArgumentNum > ACCESSIBILITY_SET_COMMAND_ARGUMENT_NUM) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_TOO_MANY_ARGUMENT);
        if (argument.setArgumentNum > 1) {
            resultMessage.append("and exist duplicated arguments.");
        }
        if (argument.unknownArgumentNum > 0) {
            resultMessage.append("and exist unknown arguments ");
            resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        }
        return OHOS::ERR_INVALID_VALUE;
    }
    if (argument.unknownArgumentNum > 0) {
        resultMessage.append("unknown arguments ");
        resultMessage.append(AccessibilityUtils::GetUnknownArgumentsMsg(argument.unknownArguments));
        return OHOS::ERR_INVALID_VALUE;
    }
    if (argument.setArgumentNum == 0) {
        resultMessage.append(ACCESSIBILITY_HELP_MSG_NO_OPTION);
        return OHOS::ERR_INVALID_VALUE;
    }
    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetScreenMagnificationState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setScreenMagnificationState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetScreenMagnificationState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_SCREEN_MAGNIFICATION_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SCREEN_MAGNIFICATION_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetShortKeyState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setShortKeyState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetShortKeyState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetMouseKeyState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setMouseKeyState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetMouseKeyState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_MOUSE_KEY_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_MOUSE_KEY_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_MOUSE_KEY_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetCaptionState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setCaptionState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetCaptionsState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_CAPTION_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_CAPTION_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_CAPTION_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetMouseAutoClick()
{
    AccessibilityCommandArgument argument;
    argument.command = "setMouseAutoClick";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
        MOUSE_AUTO_CLICK_TIME_LOW_BOUND, MOUSE_AUTO_CLICK_TIME_HIGH_BOUND)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        float time = 1.0 * std::atoi(argument.value.c_str()) / 100;
        Accessibility::RetError ret = config.SetMouseAutoClick(time);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_AUTO_CLICK_TIME_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_AUTO_CLICK_TIME_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUTO_CLICK_TIME);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetShortKeyTarget()
{
    AccessibilityCommandArgument argument;
    ErrCode result = MakeSetShortKeyTargetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        std::string name = argument.bundleName + "/" + argument.abilityName;
        Accessibility::RetError ret = config.SetShortkeyTarget(name);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_TARGET_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_SHORT_KEY_TARGET_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_SHORT_KEY_TARGET);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetHighContrastTextState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setHighContrastTextState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetHighContrastTextState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_HIGH_CONTRAST_TEXT_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_HIGH_CONTRAST_TEXT_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetInvertColorState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setInvertColorState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetInvertColorState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_INVERT_COLOR_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_INVERT_COLOR_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_INVERT_COLOR_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetDaltonizationColorFilter()
{
    AccessibilityCommandArgument argument;
    argument.command = "setDaltonizationColorFilter";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
        DALTIONIZATION_TYPE_LOW_BOUND, DALTIONIZATION_TYPE_HIGH_BOUND)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        return OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        int32_t value = std::atoi(argument.value.c_str());
        AccessibilityConfig::DALTONIZATION_TYPE type = AccessibilityConfig::DALTONIZATION_TYPE::Normal;
        switch (value) {
            case TYPE_NORMAL: {
                type = AccessibilityConfig::DALTONIZATION_TYPE::Normal;
                break;
            }
            case TYPE_PROTANOMALY: {
                type = AccessibilityConfig::DALTONIZATION_TYPE::Protanomaly;
                break;
            }
            case TYPE_DEUTERANOMALY: {
                type = AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly;
                break;
            }
            case TYPE_TRITANOMALY: {
                type = AccessibilityConfig::DALTONIZATION_TYPE::Tritanomaly;
                break;
            }
            default: {
                break;
            }
        }
        Accessibility::RetError ret = config.SetDaltonizationColorFilter(type);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_DALTONIZATIONZATION_COLOR_FILTER_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_DALTONIZATION_COLOR_FILTER);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetContentTimeout()
{
    AccessibilityCommandArgument argument;
    argument.command = "setContentTimeout";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
        CONTENT_TIME_OUT_TIME_LOW_BOUND, CONTENT_TIME_OUT_TIME_HIGH_BOUND)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        int32_t time = std::atoi(argument.value.c_str());
        Accessibility::RetError ret = config.SetContentTimeout(time);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_CONTENT_TIME_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_CONTENT_TIME_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_CONTENT_TIME_OUT);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetAnimationOffState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setAnimationOffState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetAnimationOffState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_ANIMATION_OFF_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_ANIMATION_OFF_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_ANIMATION_OFF_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetBrightnessDiscount()
{
    AccessibilityCommandArgument argument;
    argument.command = "setSetBrightnessDiscount";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
        BRIGHTNESS_DISCOUNT_LOW_BOUND, BRIGHTNESS_DISCOUNT_HIGH_BOUND)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        float discount = 1.0 * std::atoi(argument.value.c_str()) / 100;
        Accessibility::RetError ret = config.SetBrightnessDiscount(discount);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_BRIGHTNESS_DISCOUNT_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_BRIGHTNESS_DISCOUNT);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetAudioMonoState()
{
    AccessibilityCommandArgument argument;
    argument.command = "setAudioMonoState";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidStateString(argument.value)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        bool state = std::atoi(argument.value.c_str()) == 1;
        Accessibility::RetError ret = config.SetAudioMonoState(state);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_AUDIO_MONO_STATE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_AUDIO_MONO_STATE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUDIO_MONO_STATE);
        result = OHOS::ERR_INVALID_VALUE;
    }

    return result;
}

ErrCode AccessibilityAbilityShellCommand::RunAsSetAudioBalance()
{
    AccessibilityCommandArgument argument;
    argument.command = "setAudioBalance";
    ErrCode result = MakeSetCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK && !AccessibilityUtils::IsValidIntString(argument.value,
        AUDIO_BALANCE_LOW_BOUND, AUDIO_BALANCE_HIGH_BOUND)) {
        resultReceiver_.append(ACCESSIBILITY_ABILITY_SET_VALUE_INVALID);
        result = OHOS::ERR_INVALID_VALUE;
    }
    if (result == OHOS::ERR_OK) {
        auto& config = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
        (void)config.InitializeContext();
        float balance = 1.0 * std::atoi(argument.value.c_str()) / 100;
        Accessibility::RetError ret = config.SetAudioBalance(balance);
        if (ret == Accessibility::RET_OK) {
            resultReceiver_ = ACCESSIBILITY_SET_AUDIO_BALANCE_OK + "\n";
        } else {
            resultReceiver_ = ACCESSIBILITY_SET_AUDIO_BALANCE_NG;
            resultReceiver_.append(GetMessageFromCode(ret));
        }
    } else {
        resultReceiver_.append("\n");
        resultReceiver_.append(ACCESSIBILITY_HELP_MSG_SET_AUDIO_BALANCE);
        result = OHOS::ERR_INVALID_VALUE;
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::MakeSetShortKeyTargetCommandArgumentFromCmd(
    AccessibilityCommandArgument& argument)
{
    argument.command = "setShortkeyTarget";
    ErrCode result = MakeCommandArgumentFromCmd(argument);
    if (result == OHOS::ERR_OK) {
        return CheckCommandArgument(argument, resultReceiver_);
    }
    return result;
}

ErrCode AccessibilityAbilityShellCommand::MakeCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
{
    int option = -1;
    int counter = 0;
    while (true) {
        counter++;
        option = getopt_long(argc_, argv_, DISABLE_SHORT_OPTIONS.c_str(), DISABLE_LONG_OPTIONS, nullptr);

        HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);

        if (optind < 0 || optind > argc_) {
            return OHOS::ERR_INVALID_VALUE;
        }

        if (option == -1) {
            if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
                resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
                return OHOS::ERR_INVALID_VALUE;
            }
            break;
        }

        if (option == '?') {
            option = optopt;
            switch (option) {
                case 'a': {
                    resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_ABILITY_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                case 'b': {
                    resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_BUNDLE_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                default: {
                    break;
                }
            }
        }

        switch (option) {
            case 'a': {
                argument.abilityName = optarg;
                argument.abilityArgumentNum++;
                break;
            }
            case 'b': {
                argument.bundleName = optarg;
                argument.bundleArgumentNum++;
                break;
            }
            default: {
                argument.unknownArgumentNum++;
                argument.unknownArguments.push_back(argv_[optind - 1]);
                break;
            }
        }
    }
    return OHOS::ERR_OK;
}

ErrCode AccessibilityAbilityShellCommand::MakeSetCommandArgumentFromCmd(AccessibilityCommandArgument& argument)
{
    int option = -1;
    int counter = 0;

    while (true) {
        counter++;

        option = getopt_long(argc_, argv_, SET_SHORT_OPTIONS.c_str(), SET_LONG_OPTIONS, nullptr);

        HILOG_INFO("option: %{public}d, optopt: %{public}d, optind: %{public}d", option, optopt, optind);

        if (optind < 0 || optind > argc_) {
            return OHOS::ERR_INVALID_VALUE;
        }

        if (option == -1) {
            if (counter == 1 && strcmp(argv_[optind], cmd_.c_str()) == 0) {
                resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_HELP_MSG_NO_OPTION);
                return OHOS::ERR_INVALID_VALUE;
            }
            break;
        }

        if (option == '?') {
            option = optopt;
            switch (option) {
                case 'v': {
                    resultReceiver_.append(argument.command + ": " + ACCESSIBILITY_ABILITY_NO_SET_ARGUMENT_VALUE);
                    return OHOS::ERR_INVALID_VALUE;
                }
                default: {
                    break;
                }
            }
        }

        switch (option) {
            case 'v': {
                argument.value = optarg;
                argument.setArgumentNum++;
                break;
            }
            default: {
                argument.unknownArgumentNum++;
                argument.unknownArguments.push_back(argv_[optind - 1]);
                break;
            }
        }
    }
    return CheckSetCommandArgument(argument, resultReceiver_);
}

}  // namespace AAFwk
}  // namespace OHOS