/*
 * Copyright (C) 2022-2026 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_settings_config.h"
#include "hilog_wrapper.h"
#include "system_ability_definition.h"
#include "utils.h"
#include "accessibility_setting_provider.h"
#include "accessible_ability_manager_service.h"
#include "accessibility_account_data.h"
#include "parameters.h"
#include "accessibility_notification_helper.h"
#include "magnification_def.h"
#include "nlohmann/json.hpp"
#include "accessibility_base_utils.h"

namespace OHOS {
namespace Accessibility {
namespace {
    constexpr uint32_t DEFAULT_COLOR = 0xff000000;
    const int32_t DEFAULT_FONT_SCALE = 100;
    const int32_t SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
    const int32_t SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
    const int32_t DEFAULT_ACCOUNT_ID = 100;
    const char* ACCESSIBILITY = "accessibility";
    const char* TOUCH_GUIDE_STATE = "touch_guide_state";
    const char* GESTURE_KEY = "gesture_state";
    const char* CAPTION_KEY = "caption_state";
    const char* KEYEVENT_OBSERVER = "keyevent_observer";
    const char* SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
    const char* SCREEN_MAGNIFICATION_TYPE = "accessibility_magnification_capability";
    const char* SCREEN_MAGNIFICATION_MODE = "accessibility_magnification_mode";
    const char* SCREEN_MAGNIFICATION_SCALE = "accessibility_display_magnification_scale";
    const char* SCREEN_MAGNIFICATION_TRIGGER_METHOD = "accessibility_display_magnification_trigger_method";
    const char* MOUSEKEY = "mousekey";
    const char* HIGH_CONTRAST_TEXT_KEY = "high_text_contrast_enabled";
    const char* DALTONIZATION_STATE = "accessibility_display_daltonizer_enabled";
    const char* INVERT_COLOR_KEY = "accessibility_display_inversion_enabled";
    const char* ANIMATION_OFF_KEY = "animation_off";
    const char* ANIMATION_CACHE_FLAG = "accessibility_animation_cache_flag";
    const char* AUDIO_MONO_KEY = "master_mono";
    const char* IGNORE_REPEAT_CLICK_SWITCH = "ignore_repeat_click_switch";
    const char* SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
    const char* SHORTCUT_SERVICE = "accessibility_shortcut_target_service";
    const char* CLICK_RESPONCE_TIME = "click_response_time";
    const char* IGNORE_REPEAT_CLICK_TIME = "ignore_repeat_click_time";
    const char* DALTONIZATION_COLOR_FILTER_KEY = "accessibility_display_daltonizer";
    const char* CONTENT_TIMEOUT_KEY = "accessibility_content_timeout";
    const char* BRIGHTNESS_DISCOUNT_KEY = "accessibility_brightness_discount";
    const char* AUDIO_BALANCE_KEY = "master_balance";
    const char* FONT_FAMILY = "accessibility_font_family";
    const char* FONT_COLOR = "accessibility_font_color";
    const char* FONT_EDGE_TYPE = "accessibility_font_edge_type";
    const char* BACKGROUND_COLOR = "accessibility_background_color";
    const char* WINDOW_COLOR = "accessibility_window_color";
    const char* FONT_SCALE = "accessibility_font_scale";
    const char* ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
    const char* SHORTCUT_ENABLED_ON_LOCK_SCREEN = "accessibility_shortcut_enabled_on_lock_screen";
    const char* SHORTCUT_ON_LOCK_SCREEN = "accessibility_shortcut_on_lock_screen"; // AOS key
    const char* SHORTCUT_TIMEOUT = "accessibility_shortcut_timeout";
    const char* ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
    const char* SCREENREADER_TAG = "screenreader";
    const char* INVERT_COLOR_AOS_TAG = "ColorInversion";
    const char* INVERT_COLOR_TAG = "INVERT_COLOR";
    const char* AUDIO_MONO_TAG = "AUDIO_MONO";
    const char* HIGH_CONTRAST_TEXT_TAG = "HIGH_CONTRAST_TEXT";
    const char* CAPTIONS_ASSISTANT_HMOS_TAG = "CAPTIONS_ASSISTANT";
    const char* SCREEN_MAGNIFICATION_TAG = "SCREEN_MAGNIFICATION";
    const char* SCREEN_READER_BUNDLE_ABILITY_NAME = "com.ohos.screenreader/AccessibilityExtAbility";
    const char* ACCESSIBILITY_SCREENREADER_ENABLED = "accessibility_screenreader_enabled";
    const char* ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE = "accessibility_privacy_clone_or_upgrade";
    const char* IGNORE_REPEAT_CLICK_RECONFIRM = "accessibility_ignore_repeat_click_reconfirm";
    const char* ZOOM_GESTURE_ENABLED_RECONFIRM = "accessibility_zoom_gesture_enabled_reconfirm";
    const char* GRAPHIC_ANIMATION_SCALE_NAME = "persist.sys.graphic.animationscale";
    const char* ARKUI_ANIMATION_SCALE_NAME = "persist.sys.arkui.animationscale";
    const char* FLASH_REMINDER_SWITCH_KEY = "accessibility_flash_reminder_switch";
    const char* FLASH_REMINDER_ENABLED = "accessibility_reminder_function_enabled";
    const char* VOICE_RECOGNITION_KEY = "accessibility_sound_recognition_switch";
    const char* VOICE_RECOGNITION_TYPES = "accessibility_sound_recognition_enabled";
    const char* IGNORE_REPEAT_CLICK_TIMESTAMP = "accessibility_ignore_repeat_click_timestamp";
    const char* RECOVERY_IGNORE_REPEAT_CLICK_DATE = "recovery_ignore_repeat_click_switch_date";
    const char* IGNORE_REPEATED_CLICK_CACHE_FLAG = "accessibility_ignore_repeat_click_cache_flag";
    const char* IGNORE_REPEATED_CLICK_EXCLUDE_FLAG = "accessibility_ignore_repeat_click_exclude_flag";
    const char* OOBE_COLOR_FILTER_CACHE_FLAG = "accessibility_oobe_color_filter_cache_flag";
    const char* OOBE_COLOR_FILTER_SWITCH_CACHE = "accessibility_oobe_color_filter_switch_cache";
    const char* OOBE_COLOR_FILTER_DALTONIZER_CACHE = "accessibility_oobe_color_filter_daltonizer_cache";
    const char* CLONE_CAPABILITY = "const.accessibility.cloneCapability";
    const char* OLD_DEVICE_CAPABILITY = "accessibility_clone_capability";
    const char* SUPPORT_THREE_FINGER_ZOOM = "accessibility_support_three_finger_zoom";
    const char* TRANSITION_ANIMATIONS_TIMESTAMP = "accessibility_transition_animations_timestamp";
    const char* ELDER_CARE_ENABLED_KEY = "accessibility_elder_care_switch_enabled";
    constexpr int DOUBLE_CLICK_RESPONSE_TIME_MEDIUM = 300;
    constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORTEST = 100;
    constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORT = 400;
    constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_MEDIUM = 700;
    constexpr int DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG = 1000;
    constexpr int DISPLAY_DALTONIZER_INVALID = -1;
    constexpr int DISPLAY_DALTONIZER_GREEN = 12;
    constexpr int DISPLAY_DALTONIZER_RED = 11;
    constexpr int DISPLAY_DALTONIZER_BLUE = 13;
    constexpr int INVALID_MASTER_MONO_VALUE = -1;
    constexpr int AUDIO_BALANCE_STEP = 5;
    constexpr int CLONE_CAPABILITY_ZOOM_GUSTURE = 1 << 0;
    constexpr int CLONE_CAPABILITY_HIGH_CONTRAST_TEXT = 1 << 1;
    constexpr int CLONE_CAPABILITY_INVERT_COLOR = 1 << 2;
    constexpr int CLONE_CAPABILITY_COLOR_CORRECTION = 1 << 3;
    constexpr int CLONE_CAPABILITY_TRANSITION_ANIMATION = 1 << 4;
    constexpr int CLONE_CAPABILITY_AUDIO_ADJUSTMENT = 1 << 5;
    constexpr int CLONE_CAPABILITY_SOUND_RECOGNITION = 1 << 6;
    constexpr int CLONE_CAPABILITY_FLASH_REMINDER = 1 << 7;
    constexpr int CLONE_CAPABILITY_TOUCH_SCREEN = 1 << 8;
    constexpr int CLONE_CAPABILITY_SHORT_KEY = 1 << 9;
    constexpr float INVALID_MASTER_BALANCE_VALUE = 2.0;
    constexpr uint32_t IGNORE_REPEAT_CLICK_SHORTEST = 0;
    constexpr uint32_t IGNORE_REPEAT_CLICK_SHORT = 1;
    constexpr float DEFAULT_MAGNIFICATION_SCALE = 2.0;
    constexpr int32_t INVALID_TRIGGER_METHOD = -1;
    bool g_ignoreRepeatClickOnceFlag = false;
    bool g_transitionAnimationsOnceFlag = false;

    constexpr int PC_ENABLE_CAPABILITY_LIST[] = {
        CLONE_CAPABILITY_INVERT_COLOR,
        CLONE_CAPABILITY_COLOR_CORRECTION,
        CLONE_CAPABILITY_AUDIO_ADJUSTMENT,
    };
} // namespace
AccessibilitySettingsConfig::AccessibilitySettingsConfig(int32_t id)
{
    HILOG_DEBUG("id = [%{public}d]", id);
    accountId_ = id;
}

RetError AccessibilitySettingsConfig::SetEnabled(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(ACCESSIBILITY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetEnabled");
        HILOG_ERROR("set accessibility failed");
        return ret;
    }
    enabled_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetTouchGuideState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(TOUCH_GUIDE_STATE, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetTouchGuideState");
        HILOG_ERROR("set eventTouchGuideState_ failed");
        return ret;
    }
    eventTouchGuideState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetGestureState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(GESTURE_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetGestureState");
        HILOG_ERROR("set gesturesSimulation_ failed");
        return ret;
    }
    gesturesSimulation_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetKeyEventObserverState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(KEYEVENT_OBSERVER, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetKeyEventObserverState");
        HILOG_ERROR("set filteringKeyEvents_ failed");
        return ret;
    }
    filteringKeyEvents_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetCaptionState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(CAPTION_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionState");
        HILOG_ERROR("set isCaptionState_ failed");
        return ret;
    }
    isCaptionState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetScreenMagnificationState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(SCREEN_MAGNIFICATION_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetScreenMagnificationState");
        HILOG_ERROR("set SetScreenMagnificationState failed");
        return ret;
    }
    SetMagnificationState(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetMagnificationState(const bool state)
{
    isScreenMagnificationState_.store(state);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetScreenMagnificationType(const uint32_t type)
{
    HILOG_DEBUG("screenMagnificationType = [%{public}u]", type);
    screenMagnificationType_.store(type);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetFlashReminderSwitch(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    flashReminderSwitch_.store(state);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetSeniorModeState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    seniorModeState_.store(state);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetScreenMagnificationMode(const uint32_t mode)
{
    HILOG_DEBUG("screenMagnificationMode = [%{public}u]", mode);
    screenMagnificationMode_.store(mode);
    return RET_OK;
}


RetError AccessibilitySettingsConfig::SetScreenMagnificationTriggerMethod(const int32_t triggerMethod)
{
    HILOG_DEBUG("screenMagnificationTriggerMethod = [%{public}d]", triggerMethod);
    screenMagnificationTriggerMethod_.store(triggerMethod);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetScreenMagnificationScale(const float scale)
{
    HILOG_DEBUG("screenMagnificationScale = [%{public}f]", scale);
    screenMagnificationScale_.store(scale);
    return RET_OK;
}

RetError AccessibilitySettingsConfig::SetShortKeyState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(SHORTCUT_ENABLED, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyState");
        HILOG_ERROR("set isShortKeyState_ failed");
        return ret;
    }
    isShortKeyState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetShortKeyOnLockScreenState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(SHORTCUT_ENABLED_ON_LOCK_SCREEN, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyOnLockScreenState");
        HILOG_ERROR("set isShortKeyEnabledOnLockScreen_ failed");
        return ret;
    }
    isShortKeyEnabledOnLockScreen_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetShortKeyTimeout(const int32_t time)
{
    HILOG_DEBUG("time = [%{public}u]", time);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    auto ret = datashare_->PutIntValue(SHORTCUT_TIMEOUT, static_cast<int32_t>(time));
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortKeyTimeout");
        HILOG_ERROR("set shortKeyTimeout_ failed");
        return ret;
    }
    shortKeyTimeout_.store(time);
    return ret;
}

RetError AccessibilitySettingsConfig::SetStartToHosState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }
    auto ret = datashare_->PutBoolValue("AccessibilityStartToHos", state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetStartToHosState");
        HILOG_ERROR("set startToHosState failed");
    }
    return ret;
}

RetError AccessibilitySettingsConfig::SetMouseKeyState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(MOUSEKEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetMouseKeyState");
        HILOG_ERROR("set isMouseKeyState_ failed");
        return ret;
    }
    isMouseKeyState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetMouseAutoClick(const int32_t time)
{
    HILOG_DEBUG("time = [%{public}d]", time);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    auto ret = datashare_->PutIntValue("MouseAutoClick", time);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetMouseAutoClick");
        HILOG_ERROR("set mouseAutoClick_ failed");
        return ret;
    }
    mouseAutoClick_.store(time);
    return ret;
}

RetError AccessibilitySettingsConfig::SetShortkeyTarget(const std::string &name)
{
    HILOG_DEBUG("name = [%{public}s]", name.c_str());
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    auto ret = datashare_->PutStringValue("ShortkeyTarget", name);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyTarget");
        HILOG_ERROR("set shortkeyTarget_ failed");
        return ret;
    }
    shortkeyTarget_ = name;
    return ret;
}

RetError AccessibilitySettingsConfig::SetShortkeyMultiTarget(const std::vector<std::string> &name)
{
    HILOG_DEBUG();
    std::set<std::string> targets;
    std::copy_if(name.begin(), name.end(), std::inserter(targets, targets.end()),
        [&targets](const std::string &target) {
            if (targets.find(target) == targets.end()) {
                targets.insert(target);
                return true;
            }
            return false;
        });
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    std::string stringOut = "";
    Utils::VectorToString(std::vector<std::string>(targets.begin(), targets.end()), stringOut);
    auto ret = datashare_->PutStringValue(SHORTCUT_SERVICE, stringOut);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyMultiTarget");
        HILOG_ERROR("set shortkeyMultiTarget_ failed");
        return ret;
    }
    shortkeyMultiTarget_ = std::vector<std::string>(targets.begin(), targets.end());
    return ret;
}

RetError AccessibilitySettingsConfig::SetShortkeyMultiTargetInPkgRemove(const std::string &name)
{
    HILOG_DEBUG();
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }
    RetError rtn = RET_OK;

    for (auto iter = shortkeyMultiTarget_.begin(); iter != shortkeyMultiTarget_.end(); ++iter) {
        if (*iter == name) {
            shortkeyMultiTarget_.erase(iter);
            std::string stringOut = "";
            Utils::VectorToString(shortkeyMultiTarget_, stringOut);
            rtn = datashare_->PutStringValue(SHORTCUT_SERVICE, stringOut);
            break;
        }
    }
    if (rtn != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetShortkeyMultiTargetInPkgRemove");
        HILOG_ERROR("set shortkeyMultiTarget_ failed");
        shortkeyMultiTarget_.push_back(name);
    }
    return rtn;
}

RetError AccessibilitySettingsConfig::SetHighContrastTextState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(HIGH_CONTRAST_TEXT_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetHighContrastTextState");
        HILOG_ERROR("set highContrastTextState_ failed");
        return ret;
    }
    highContrastTextState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetInvertColorState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(INVERT_COLOR_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetInvertColorState");
        HILOG_ERROR("set invertColorState_ failed");
        return ret;
    }
    invertColorState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetAnimationOffState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(ANIMATION_OFF_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAnimationOffState");
        HILOG_ERROR("set animationOffState_ failed");
        return ret;
    }
    animationOffState_.store(state);
    if (state) {
        int64_t nowTime = IgnoreRepeatClickNotification::GetWallTimeMs();
        ret = datashare_->PutLongValue(TRANSITION_ANIMATIONS_TIMESTAMP, nowTime);
        if (nowTime >= 0) {
            TransitionAnimationsNotification::RegisterTimers(static_cast<uint64_t>(nowTime));
        }
    } else {
        ret = datashare_->PutLongValue(TRANSITION_ANIMATIONS_TIMESTAMP, 0);
        TransitionAnimationsNotification::DestroyTimers();
        TransitionAnimationsNotification::CancelNotification();
    }
    Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateAccessibilityState();
    return ret;
}

RetError AccessibilitySettingsConfig::SetAudioMonoState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(AUDIO_MONO_KEY, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAudioMonoState");
        HILOG_ERROR("set audioMonoState_ failed");
        return ret;
    }
    audioMonoState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetDaltonizationState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(DALTONIZATION_STATE, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetDaltonizationState");
        HILOG_ERROR("set daltonizationState_ failed");
        return ret;
    }
    daltonizationState_.store(state);
    return ret;
}

RetError AccessibilitySettingsConfig::SetDaltonizationColorFilter(const uint32_t filter)
{
    HILOG_DEBUG("filter = [%{public}u]", filter);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    uint32_t daltonizationColorFilter = filter;
    if (filter == DISPLAY_DALTONIZER_GREEN) {
        daltonizationColorFilter = AccessibilityConfig::Deuteranomaly;
    } else if (filter == DISPLAY_DALTONIZER_RED) {
        daltonizationColorFilter = AccessibilityConfig::Protanomaly;
    } else if (filter == DISPLAY_DALTONIZER_BLUE) {
        daltonizationColorFilter = AccessibilityConfig::Tritanomaly;
    } else if (filter == static_cast<uint32_t>(DISPLAY_DALTONIZER_INVALID)) {
        daltonizationColorFilter = 0;
    }
    auto ret = datashare_->PutIntValue(DALTONIZATION_COLOR_FILTER_KEY, static_cast<int32_t>(daltonizationColorFilter));
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetDaltonizationColorFilter");
        HILOG_ERROR("set daltonizationColorFilter_ failed");
        return ret;
    }
    daltonizationColorFilter_.store(daltonizationColorFilter);
    return ret;
}


RetError AccessibilitySettingsConfig::SetContentTimeout(const uint32_t time)
{
    HILOG_DEBUG("time = [%{public}u]", time);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    auto ret = datashare_->PutIntValue(CONTENT_TIMEOUT_KEY, static_cast<int32_t>(time));
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetContentTimeout");
        HILOG_ERROR("set contentTimeout_ failed");
        return ret;
    }
    contentTimeout_.store(time);
    return ret;
}

RetError AccessibilitySettingsConfig::SetBrightnessDiscount(const float discount)
{
    HILOG_DEBUG("discount = [%{public}f]", discount);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    auto ret = datashare_->PutFloatValue(BRIGHTNESS_DISCOUNT_KEY, discount);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetBrightnessDiscount");
        HILOG_ERROR("set brightnessDiscount_ failed");
        return ret;
    }
    brightnessDiscount_.store(discount);
    return ret;
}

RetError AccessibilitySettingsConfig::SetAudioBalance(const float balance)
{
    HILOG_DEBUG("balance = [%{public}f]", balance);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    float audioBalance = round(balance * AUDIO_BALANCE_STEP) / AUDIO_BALANCE_STEP;
    auto ret = datashare_->PutFloatValue(AUDIO_BALANCE_KEY, audioBalance);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetAudioBalance");
        HILOG_ERROR("set audioBalance_ failed");
        return ret;
    }
    audioBalance_.store(audioBalance);
    return ret;
}

RetError AccessibilitySettingsConfig::SetClickResponseTime(const uint32_t time)
{
    HILOG_DEBUG("clickResponseTime = [%{public}u]", time);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    uint32_t clickResponseTime = time;
    if (time == DOUBLE_CLICK_RESPONSE_TIME_MEDIUM) {
        clickResponseTime = AccessibilityConfig::ResponseDelayMedium;
    } else if (time > DOUBLE_CLICK_RESPONSE_TIME_MEDIUM) {
        clickResponseTime = AccessibilityConfig::ResponseDelayLong;
    }
    auto ret = datashare_->PutIntValue(CLICK_RESPONCE_TIME, clickResponseTime);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetClickResponseTime");
        HILOG_ERROR("set clickResponseTime_ failed");
        return ret;
    }
    clickResponseTime_.store(clickResponseTime);
    return ret;
}

RetError AccessibilitySettingsConfig::SetIgnoreRepeatClickState(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(IGNORE_REPEAT_CLICK_SWITCH, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetIgnoreRepeatClickState");
        HILOG_ERROR("set ignoreRepeatClickState_ failed");
        return ret;
    }
    ignoreRepeatClickState_.store(state);
    if (state) {
        int64_t nowTime = IgnoreRepeatClickNotification::GetWallTimeMs();
        ret = datashare_->PutLongValue(IGNORE_REPEAT_CLICK_TIMESTAMP, nowTime);
        if (nowTime >= 0 ) {
            IgnoreRepeatClickNotification::RegisterTimers(static_cast<uint64_t>(nowTime));
        }
    } else {
        ret = datashare_->PutLongValue(IGNORE_REPEAT_CLICK_TIMESTAMP, 0);
        IgnoreRepeatClickNotification::DestroyTimers();
        IgnoreRepeatClickNotification::CancelNotification();
    }
    return ret;
}

RetError AccessibilitySettingsConfig::SetIgnoreRepeatClickReconfirm(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(IGNORE_REPEAT_CLICK_RECONFIRM, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetIgnoreRepeatClickReconfirm");
        HILOG_ERROR("set ignoreRepeatClickReconfirm failed");
        return ret;
    }
    return ret;
}

RetError AccessibilitySettingsConfig::SetZoomGestureEnabledReconfirm(const bool state)
{
    HILOG_DEBUG("state = [%{public}s]", state ? "True" : "False");
    auto ret = SetConfigState(ZOOM_GESTURE_ENABLED_RECONFIRM, state);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetZoomGestureEnabledReconfirm");
        HILOG_ERROR("set zoomGestureEnabledReconfirm failed");
        return ret;
    }
    return ret;
}

RetError AccessibilitySettingsConfig::SetColorModeState(const A11yDarkModeType &type)
{
    uint32_t darkModeValue = static_cast<uint32_t>(type);
    HILOG_DEBUG("name = [%{public}d]", darkModeValue);
    if (!systemDatashare_) {
        HILOG_ERROR("systemDatashare_ is nullptr");
        return RET_ERR_NULLPTR;
    }
 
    auto ret = systemDatashare_->PutStringValue("settings.uiappearance.darkmode_mode",
        std::to_string(darkModeValue), true);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetColorModeState");
        HILOG_ERROR("set SetColorModeState failed");
    }
    return ret;
}

RetError AccessibilitySettingsConfig::SetIgnoreRepeatClickTime(const uint32_t time)
{
    HILOG_DEBUG("ignoreRepeatClickTime = [%{public}u]", time);
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return RET_ERR_NULLPTR;
    }

    uint32_t ignoreRepeatClickTime = time;
    if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORTEST) {
        ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutShortest;
    } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_SHORT) {
        ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutShort;
    } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_MEDIUM) {
        ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutMedium;
    } else if (time == DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG) {
        ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutLong;
    } else if (time > DOUBLE_IGNORE_REPEAT_CLICK_TIME_LONG) {
        ignoreRepeatClickTime = AccessibilityConfig::RepeatClickTimeoutLongest;
    }
    auto ret = datashare_->PutIntValue(IGNORE_REPEAT_CLICK_TIME, ignoreRepeatClickTime);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetIgnoreRepeatClickTime");
        HILOG_ERROR("set ignoreRepeatClickTime_ failed");
        return ret;
    }
    ignoreRepeatClickTime_.store(ignoreRepeatClickTime);
    return ret;
}

RetError AccessibilitySettingsConfig::SetCaptionProperty(const AccessibilityConfig::CaptionProperty& caption)
{
    HILOG_DEBUG();
    captionProperty_ = caption;
    if (!datashare_) {
        return RET_ERR_NULLPTR;
    }

    auto fontFamilyRet = datashare_->PutStringValue(FONT_FAMILY, captionProperty_.GetFontFamily());
    if (fontFamilyRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontFamily");
    }
    auto fontColorRet = datashare_->PutIntValue(FONT_COLOR, static_cast<int32_t>(captionProperty_.GetFontColor()));
    if (fontColorRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontColor");
    }
    auto fontEdgeTypeRet = datashare_->PutStringValue(FONT_EDGE_TYPE, captionProperty_.GetFontEdgeType());
    if (fontEdgeTypeRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontEdgeType");
    }
    auto backgroundColorRet = datashare_->PutIntValue(BACKGROUND_COLOR, static_cast<int32_t>(
        captionProperty_.GetBackgroundColor()));
    if (backgroundColorRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.backgroundColor");
    }
    auto windowColorRet = datashare_->PutIntValue(WINDOW_COLOR, static_cast<int32_t>(
        captionProperty_.GetWindowColor()));
    if (windowColorRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.windowColor");
    }
    auto fontScaleRet = datashare_->PutIntValue(FONT_SCALE, captionProperty_.GetFontScale());
    if (fontScaleRet != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetCaptionProperty.fontScale");
    }
    return RET_OK;
}

bool AccessibilitySettingsConfig::GetCaptionState() const
{
    return isCaptionState_.load();
}

bool AccessibilitySettingsConfig::GetScreenMagnificationState() const
{
    return isScreenMagnificationState_.load();
}

bool AccessibilitySettingsConfig::GetShortKeyState() const
{
    return isShortKeyState_.load();
}

bool AccessibilitySettingsConfig::GetShortKeyOnLockScreenState() const
{
    return isShortKeyEnabledOnLockScreen_.load();
}

int32_t AccessibilitySettingsConfig::GetShortKeyTimeout() const
{
    return shortKeyTimeout_.load();
}

bool AccessibilitySettingsConfig::GetMouseKeyState() const
{
    return isMouseKeyState_.load();
}

int32_t AccessibilitySettingsConfig::GetMouseAutoClick() const
{
    return mouseAutoClick_.load();
}

const std::string &AccessibilitySettingsConfig::GetShortkeyTarget() const
{
    return shortkeyTarget_;
}

const std::vector<std::string> AccessibilitySettingsConfig::GetShortkeyMultiTarget()
{
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    std::vector<std::string> rtnVec = shortkeyMultiTarget_;
    return rtnVec;
}

bool AccessibilitySettingsConfig::GetHighContrastTextState() const
{
    return highContrastTextState_.load();
}

bool AccessibilitySettingsConfig::GetInvertColorState() const
{
    return invertColorState_.load();
}

bool AccessibilitySettingsConfig::GetAnimationOffState() const
{
    return animationOffState_.load();
}

bool AccessibilitySettingsConfig::GetAudioMonoState() const
{
    return audioMonoState_.load();
}

bool AccessibilitySettingsConfig::GetDaltonizationState() const
{
    return daltonizationState_.load();
}

uint32_t AccessibilitySettingsConfig::GetDaltonizationColorFilter() const
{
    return daltonizationColorFilter_.load();
}

uint32_t AccessibilitySettingsConfig::GetContentTimeout() const
{
    return contentTimeout_.load();
}

float AccessibilitySettingsConfig::GetBrightnessDiscount() const
{
    return brightnessDiscount_.load();
}

float AccessibilitySettingsConfig::GetAudioBalance() const
{
    return audioBalance_.load();
}

bool AccessibilitySettingsConfig::GetEnabledState() const
{
    return enabled_.load();
}

bool AccessibilitySettingsConfig::GetTouchGuideState() const
{
    return eventTouchGuideState_.load();
}

bool AccessibilitySettingsConfig::GetGestureState() const
{
    return gesturesSimulation_.load();
}

bool AccessibilitySettingsConfig::GetKeyEventObserverState() const
{
    return filteringKeyEvents_.load();
}

const AccessibilityConfig::CaptionProperty &AccessibilitySettingsConfig::GetCaptionProperty() const
{
    return captionProperty_;
};

uint32_t AccessibilitySettingsConfig::GetClickResponseTime() const
{
    return clickResponseTime_.load();
}

uint32_t AccessibilitySettingsConfig::GetScreenMagnificationType() const
{
    return screenMagnificationType_.load();
}

bool AccessibilitySettingsConfig::GetFlashReminderSwitch() const
{
    return flashReminderSwitch_.load();
}

bool AccessibilitySettingsConfig::GetSeniorModeState() const
{
    return seniorModeState_.load();
}

uint32_t AccessibilitySettingsConfig::GetScreenMagnificationMode() const
{
    return screenMagnificationMode_.load();
}

float AccessibilitySettingsConfig::GetScreenMagnificationScale() const
{
    return screenMagnificationScale_.load();
}

int32_t AccessibilitySettingsConfig::GetScreenMagnificationTriggerMethod() const
{
    return screenMagnificationTriggerMethod_.load();
}

bool AccessibilitySettingsConfig::GetIgnoreRepeatClickState() const
{
    return ignoreRepeatClickState_.load();
}

uint32_t AccessibilitySettingsConfig::GetIgnoreRepeatClickTime() const
{
    return ignoreRepeatClickTime_.load();
}

RetError AccessibilitySettingsConfig::SetEnabledAccessibilityServices(const std::vector<std::string> &services)
{
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    enabledAccessibilityServices_ = services;
    if (datashare_ == nullptr) {
        HILOG_WARN("datashare_ is null.");
        return RET_ERR_NULLPTR;
    }
    std::string stringOut = "";
    Utils::VectorToString(enabledAccessibilityServices_, stringOut);
    auto ret = datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetEnabledAccessibilityServices");
        HILOG_ERROR("set enabledAccessibilityServices failed");
    }
    return ret;
}

const std::vector<std::string> AccessibilitySettingsConfig::GetEnabledAccessibilityServices()
{
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    std::vector<std::string> rtnVec = enabledAccessibilityServices_;
    return rtnVec;
}

RetError AccessibilitySettingsConfig::AddEnabledAccessibilityService(const std::string &serviceName)
{
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    auto iter = std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(), serviceName);
    if (iter != enabledAccessibilityServices_.end()) {
        return RET_OK;
    }

    if (!datashare_) {
        return RET_ERR_NULLPTR;
    }
    enabledAccessibilityServices_.push_back(serviceName);
    std::string stringOut = "";
    Utils::VectorToString(enabledAccessibilityServices_, stringOut);
    return datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
}

RetError AccessibilitySettingsConfig::RemoveEnabledAccessibilityService(const std::string &serviceName)
{
    std::lock_guard<ffrt::mutex> lock(interfaceMutex_);
    auto iter = std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(), serviceName);
    if (iter == enabledAccessibilityServices_.end()) {
        return RET_OK;
    }

    if (!datashare_) {
        return RET_ERR_NULLPTR;
    }
    enabledAccessibilityServices_.erase(iter);
    std::string stringOut = "";
    Utils::VectorToString(enabledAccessibilityServices_, stringOut);
    return datashare_->PutStringValue(ENABLED_ACCESSIBILITY_SERVICES, stringOut);
}

bool AccessibilitySettingsConfig::GetStartToHosState()
{
    HILOG_DEBUG();
    if (!datashare_) {
        return false;
    }

    bool value = true;
    value = datashare_->GetBoolValue("AccessibilityStartToHos", true);
    return value;
}

uint32_t AccessibilitySettingsConfig::GetConfigState()
{
    HILOG_DEBUG();
    uint32_t state = 0;
    if (isCaptionState_.load()) {
        state |= STATE_CAPTION_ENABLED;
    }

    if (isScreenMagnificationState_.load()) {
        state |= STATE_SCREENMAGNIFIER_ENABLED;
    }

    if (isMouseKeyState_.load()) {
        state |= STATE_MOUSEKEY_ENABLED;
    }

    if (isShortKeyState_.load()) {
        state |= STATE_SHORTKEY_ENABLED;
    }

    if (highContrastTextState_.load()) {
        state |= STATE_HIGHCONTRAST_ENABLED;
    }

    if (daltonizationState_.load()) {
        state |= STATE_DALTONIZATION_STATE_ENABLED;
    }

    if (invertColorState_.load()) {
        state |= STATE_INVETRTCOLOR_ENABLED;
    }

    if (animationOffState_.load()) {
        state |= STATE_ANIMATIONOFF_ENABLED;
    }

    if (audioMonoState_.load()) {
        state |= STATE_AUDIOMONO_ENABLED;
    }

    if (ignoreRepeatClickState_.load()) {
        state |= STATE_IGNORE_REPEAT_CLICK_ENABLED;
    }
    return state;
}

void AccessibilitySettingsConfig::InitCaption()
{
    HILOG_DEBUG();
    if (datashare_ == nullptr) {
        return;
    }

    std::string strValue = datashare_->GetStringValue(CAPTION_KEY, "");
    HILOG_DEBUG(" pref_->GetString() = %{public}s.", strValue.c_str());
    if (!std::strcmp(strValue.c_str(), "on")) {
        isCaptionState_.store(true);
    } else {
        isCaptionState_.store(false);
    }

    std::string fontFamliy = datashare_->GetStringValue(FONT_FAMILY, "default");
    HILOG_DEBUG("fontFamily = %{public}s.", fontFamliy.c_str());

    int32_t fontScale =  static_cast<int32_t>(datashare_->GetIntValue(FONT_SCALE, DEFAULT_FONT_SCALE));
    HILOG_DEBUG("fontScale = %{public}d.", fontScale);

    uint32_t fontColor = static_cast<uint32_t>(datashare_->GetIntValue(FONT_COLOR, DEFAULT_COLOR));
    HILOG_DEBUG("fontColor = 0x%{public}x.", fontColor);

    std::string fontEdgeType = datashare_->GetStringValue(FONT_EDGE_TYPE, "none");
    HILOG_DEBUG("fontEdgeType = 0x%{public}s.", fontEdgeType.c_str());

    uint32_t backgroundColor = static_cast<uint32_t>(datashare_->GetIntValue(BACKGROUND_COLOR, DEFAULT_COLOR));
    HILOG_DEBUG("backgroundColor = 0x%{public}x.", backgroundColor);

    uint32_t windowColor = static_cast<uint32_t>(datashare_->GetIntValue(WINDOW_COLOR, DEFAULT_COLOR));
    HILOG_DEBUG("windowColor = 0x%{public}x.", windowColor);

    captionProperty_.SetFontFamily(fontFamliy);
    captionProperty_.SetFontScale(fontScale);
    captionProperty_.SetFontColor(fontColor);
    captionProperty_.SetFontEdgeType(fontEdgeType);
    captionProperty_.SetBackgroundColor(backgroundColor);
    captionProperty_.SetWindowColor(windowColor);
}

void AccessibilitySettingsConfig::InitShortKeyConfig()
{
    isShortKeyState_.store(datashare_->GetBoolValue(SHORTCUT_ENABLED, true));
    datashare_->GetBoolValue(SHORTCUT_ENABLED_ON_LOCK_SCREEN, true);
    shortKeyTimeout_.store(static_cast<int32_t>(datashare_->GetIntValue(SHORTCUT_TIMEOUT,
        SHORT_KEY_TIMEOUT_BEFORE_USE)));

    if (shortKeyTimeout_.load() == 1) {
        SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
    } else if (shortKeyTimeout_.load() == 0) {
        SetShortKeyTimeout(SHORT_KEY_TIMEOUT_BEFORE_USE);
    }

    shortkeyTarget_ = datashare_->GetStringValue("ShortkeyTarget", "none");

    std::string tmpString = datashare_->GetStringValue(SHORTCUT_SERVICE, SCREEN_READER_BUNDLE_ABILITY_NAME);
    shortkeyMultiTarget_ = {};
    Utils::StringToVector(tmpString, shortkeyMultiTarget_);

    bool isScreenReaderEnabledOriginal =
        (std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(),
        SCREEN_READER_BUNDLE_ABILITY_NAME) != enabledAccessibilityServices_.end());
    tmpString = datashare_->GetStringValue(ENABLED_ACCESSIBILITY_SERVICES, "");
    enabledAccessibilityServices_ = {};
    Utils::StringToVector(tmpString, enabledAccessibilityServices_);
    CloneShortkeyService(isScreenReaderEnabledOriginal);
}

void AccessibilitySettingsConfig::InitPrivacySpaceConfig()
{
    // Initialization of the private space after cloning or upgrade
    std::shared_ptr<AccessibilitySettingProvider> service = AccessibilitySettingProvider::GetInstance(
        POWER_MANAGER_SERVICE_ID);
    if (service == nullptr) {
        HILOG_ERROR("service is nullptr");
        return;
    }
    bool cloneOrUpgradeFlag = false;
    service->GetBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, cloneOrUpgradeFlag);
    if (cloneOrUpgradeFlag && (accountId_ != DEFAULT_ACCOUNT_ID)) {
        if (isShortKeyState_.load()) {
            SetShortKeyOnLockScreenState(true);
        } else {
            SetShortKeyOnLockScreenState(false);
        }
        SetDefaultShortcutKeyService();
        SetIgnoreRepeatClickReconfirm(ignoreRepeatClickState_.load());
        SetZoomGestureEnabledReconfirm(isScreenMagnificationState_.load());
        service->PutBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, false);
    }
}

void AccessibilitySettingsConfig::InitAnimationOffConfig()
{
    animationOffState_.store(datashare_->GetBoolValue(ANIMATION_OFF_KEY, false));
    std::string graphicState = system::GetParameter(GRAPHIC_ANIMATION_SCALE_NAME, "1");
    std::string arkuiState = system::GetParameter(ARKUI_ANIMATION_SCALE_NAME, "1");
    if (animationOffState_.load()) {
        system::SetParameter(GRAPHIC_ANIMATION_SCALE_NAME, "0");
        system::SetParameter(ARKUI_ANIMATION_SCALE_NAME, "0");
    } else {
        if (graphicState == "0") {
            system::SetParameter(GRAPHIC_ANIMATION_SCALE_NAME, "1");
            graphicState = "1";
        }
        if (arkuiState == "0") {
            system::SetParameter(ARKUI_ANIMATION_SCALE_NAME, "1");
            arkuiState = "1";
        }
        if (arkuiState != graphicState) {
            system::SetParameter(ARKUI_ANIMATION_SCALE_NAME, graphicState);
        }
    }
    if (animationOffState_.load()) {
        TransitionAnimationsNotification::PublishTransitionAnimationsReminder();
        int64_t timeStamp = datashare_->GetLongValue(TRANSITION_ANIMATIONS_TIMESTAMP, 0);
        if (timeStamp == 0) {
            timeStamp = IgnoreRepeatClickNotification::GetWallTimeMs();
            datashare_->PutLongValue(TRANSITION_ANIMATIONS_TIMESTAMP, timeStamp);
        }
        if (timeStamp > 0) {
            TransitionAnimationsNotification::RegisterTimers(static_cast<uint64_t>(timeStamp));
        }
        if (g_transitionAnimationsOnceFlag) {
            TransitionAnimationsNotification::PublishTransitionAnimationsReminder();
        } else {
            g_transitionAnimationsOnceFlag = true;
        }
    }
}

void AccessibilitySettingsConfig::HandleIgnoreRepeatClickState()
{
    int64_t recoveryDate = datashare_->GetLongValue(RECOVERY_IGNORE_REPEAT_CLICK_DATE, 0);
    if (ignoreRepeatClickState_.load() && recoveryDate == 0 &&
        (ignoreRepeatClickTime_.load() == IGNORE_REPEAT_CLICK_SHORTEST ||
            ignoreRepeatClickTime_.load() == IGNORE_REPEAT_CLICK_SHORT)) {
        ignoreRepeatClickState_.store(false);
        SetIgnoreRepeatClickState(false);
        recoveryDate = IgnoreRepeatClickNotification::GetWallTimeMs();
        datashare_->PutLongValue(RECOVERY_IGNORE_REPEAT_CLICK_DATE, recoveryDate);
        HILOG_INFO("recovery ignore repeat click %{public}" PRId64, recoveryDate);
    }
 
    if (ignoreRepeatClickState_.load()) {
        bool isScreenReaderEnabled =
            (std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(),
            SCREEN_READER_BUNDLE_ABILITY_NAME) != enabledAccessibilityServices_.end());
        bool isDataShareScreenReaderEnabled = datashare_->GetBoolValue(ACCESSIBILITY_SCREENREADER_ENABLED, false);
        if (isScreenReaderEnabled || isDataShareScreenReaderEnabled) {
            HILOG_INFO("screenReader is open, recovery ignore repeat click");
            SetIgnoreRepeatClickState(false);
            return;
        }
        IgnoreRepeatClickNotification::PublishIgnoreRepeatClickReminder();
        int64_t timeStamp = datashare_->GetLongValue(IGNORE_REPEAT_CLICK_TIMESTAMP, 0);
        if (timeStamp == 0) {
            timeStamp = IgnoreRepeatClickNotification::GetWallTimeMs();
            datashare_->PutLongValue(IGNORE_REPEAT_CLICK_TIMESTAMP, timeStamp);
        }
        if (timeStamp > 0) {
            IgnoreRepeatClickNotification::RegisterTimers(static_cast<uint64_t>(timeStamp));
        }
        if (g_ignoreRepeatClickOnceFlag) {
            IgnoreRepeatClickNotification::PublishIgnoreRepeatClickReminder();
        } else {
            g_ignoreRepeatClickOnceFlag = true;
        }
    }
}

void AccessibilitySettingsConfig::HandleIgnoreRepeatClickCache()
{
    bool value = false;
    value = datashare_->GetBoolValue(IGNORE_REPEATED_CLICK_CACHE_FLAG, false);
    if (value) {
        ignoreRepeatClickState_.store(true);
        datashare_->PutBoolValue(IGNORE_REPEAT_CLICK_SWITCH, true);
        datashare_->PutBoolValue(IGNORE_REPEATED_CLICK_CACHE_FLAG, false);
    } else {
        ignoreRepeatClickState_.store(datashare_->GetBoolValue(IGNORE_REPEAT_CLICK_SWITCH, false));
    }
    datashare_->PutBoolValue(IGNORE_REPEATED_CLICK_EXCLUDE_FLAG, false);
}

void AccessibilitySettingsConfig::HandleDaltonizationColorCache()
{
    if (!datashare_) {
        HILOG_ERROR("helper is nullptr");
        return;
    }
 
    uint32_t daltonizationColorFilter = static_cast<uint32_t>(datashare_->GetIntValue(
        DALTONIZATION_COLOR_FILTER_KEY, AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly));
    bool colorFilterCacheFlag = datashare_->GetBoolValue(OOBE_COLOR_FILTER_CACHE_FLAG, false);
    if (colorFilterCacheFlag) {
        HILOG_INFO("HandleDaltonizationColorCache recovery");
        bool ColorFilterSwitchCache = datashare_->GetBoolValue(OOBE_COLOR_FILTER_SWITCH_CACHE, false);
        std::string daltonizerModeCache = datashare_->GetStringValue(OOBE_COLOR_FILTER_DALTONIZER_CACHE, "");
        daltonizationColorFilter = ConvertStringToDaltonizationTypes(daltonizerModeCache);
        datashare_->PutBoolValue(DALTONIZATION_STATE, ColorFilterSwitchCache);
        daltonizationState_.store(ColorFilterSwitchCache);
    }
 
    if (daltonizationState_ && daltonizationColorFilter_ == AccessibilityConfig::DALTONIZATION_TYPE::Normal) {
        HILOG_INFO("HandleDaltonizationColorCache to default");
        daltonizationColorFilter = AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly;
        datashare_->PutBoolValue(DALTONIZATION_STATE, false);
        daltonizationState_.store(false);
    }
    auto ret = datashare_->PutIntValue(DALTONIZATION_COLOR_FILTER_KEY, static_cast<int32_t>(daltonizationColorFilter));
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "HandleDaltonizationColorCache");
        HILOG_ERROR("set daltonizationColorFilter_ failed");
        return;
    }
    daltonizationColorFilter_.store(daltonizationColorFilter);
    return;
}

void AccessibilitySettingsConfig::InitSetting()
{
    HILOG_DEBUG();
    if (datashare_ == nullptr) {
        return;
    }
    
    InitShortKeyConfig();
    InitPrivacySpaceConfig();
    InitAnimationOffConfig();
    CloneAudioState();
    isScreenMagnificationState_.store(datashare_->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false));
    isMouseKeyState_.store(datashare_->GetBoolValue(MOUSEKEY, false));
    invertColorState_.store(datashare_->GetBoolValue(INVERT_COLOR_KEY, false));
    highContrastTextState_.store(datashare_->GetBoolValue(HIGH_CONTRAST_TEXT_KEY, false));
    daltonizationState_.store(datashare_->GetBoolValue(DALTONIZATION_STATE, false));
    audioMonoState_.store(datashare_->GetBoolValue(AUDIO_MONO_KEY, false));
    HandleIgnoreRepeatClickCache();
    mouseAutoClick_.store(static_cast<int32_t>(datashare_->GetIntValue("MouseAutoClick", -1)));
    daltonizationColorFilter_.store(static_cast<uint32_t>(datashare_->GetIntValue(
        DALTONIZATION_COLOR_FILTER_KEY, AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly)));
    SetDaltonizationColorFilter(daltonizationColorFilter_.load());
    HandleDaltonizationColorCache();
    contentTimeout_.store(static_cast<uint32_t>(datashare_->GetIntValue(CONTENT_TIMEOUT_KEY, 0)));
    brightnessDiscount_.store(static_cast<float>(datashare_->GetFloatValue(BRIGHTNESS_DISCOUNT_KEY, 1.0)));
    audioBalance_.store(static_cast<float>(datashare_->GetFloatValue(AUDIO_BALANCE_KEY, 0)));
    SetAudioBalance(audioBalance_.load());
    screenMagnificationType_.store(static_cast<uint32_t>(
        datashare_->GetIntValue(SCREEN_MAGNIFICATION_TYPE, FULL_SCREEN_MAGNIFICATION)));
    screenMagnificationMode_.store(static_cast<uint32_t>(
        datashare_->GetIntValue(SCREEN_MAGNIFICATION_MODE, FULL_SCREEN_MAGNIFICATION)));
    screenMagnificationScale_.store(static_cast<float>(
        datashare_->GetFloatValue(SCREEN_MAGNIFICATION_SCALE, DEFAULT_MAGNIFICATION_SCALE)));
    int32_t triggerMethodValue = datashare_->GetIntValue(SCREEN_MAGNIFICATION_TRIGGER_METHOD, INVALID_TRIGGER_METHOD);
    if (triggerMethodValue == INVALID_TRIGGER_METHOD) {
        int32_t defaultTriggerMethod = isScreenMagnificationState_.load() ?
            SINGLE_FINGER_TRIPLE_TAP_MODE : THREE_FINGER_DOUBLE_TAP_MODE;
        screenMagnificationTriggerMethod_.store(defaultTriggerMethod);
        datashare_->PutIntValue(SCREEN_MAGNIFICATION_TRIGGER_METHOD, defaultTriggerMethod);
    }
    clickResponseTime_.store(static_cast<uint32_t>(datashare_->GetIntValue(CLICK_RESPONCE_TIME, 0)));
    SetClickResponseTime(clickResponseTime_.load());
    ignoreRepeatClickTime_.store(static_cast<uint32_t>(datashare_->GetIntValue(IGNORE_REPEAT_CLICK_TIME, 0)));
    SetIgnoreRepeatClickTime(ignoreRepeatClickTime_.load());
    datashare_->GetStringValue(FLASH_REMINDER_SWITCH_KEY, "0");
    datashare_->GetStringValue(FLASH_REMINDER_ENABLED, "DEFAULT");
    datashare_->GetBoolValue(VOICE_RECOGNITION_KEY, false);
    datashare_->GetStringValue(VOICE_RECOGNITION_TYPES, "DEFAULT");
    HandleIgnoreRepeatClickState();
    flashReminderSwitch_.store(datashare_->GetBoolValue(FLASH_REMINDER_SWITCH_KEY, false));
    seniorModeState_.store(datashare_->GetBoolValue(ELDER_CARE_ENABLED_KEY, false));
}

void AccessibilitySettingsConfig::InitCapability()
{
    HILOG_DEBUG();
    if (datashare_ == nullptr) {
        return;
    }

    enabled_.store(datashare_->GetBoolValue(ACCESSIBILITY, false));
    eventTouchGuideState_.store(datashare_->GetBoolValue(TOUCH_GUIDE_STATE, false));
    gesturesSimulation_.store(datashare_->GetBoolValue(GESTURE_KEY, false));
    filteringKeyEvents_.store(datashare_->GetBoolValue(KEYEVENT_OBSERVER, false));
}

RetError AccessibilitySettingsConfig::SetConfigState(const std::string& key, bool value)
{
    if (!datashare_) {
        return RET_ERR_NULLPTR;
    }
    auto ret = datashare_->PutBoolValue(key, value);
    if (ret != RET_OK) {
        HILOG_ERROR("set configState failed");
    }
    return ret;
}

void AccessibilitySettingsConfig::Init()
{
    HILOG_DEBUG();
    if (!datashare_) {
        datashare_ = std::make_shared<AccessibilityDatashareHelper>(DATASHARE_TYPE::SECURE, accountId_);
    }
    if (datashare_ == nullptr) {
        return;
    }
    RetError ret = datashare_->Initialize(POWER_MANAGER_SERVICE_ID);
    InitCaption();
    InitSetting();

    if (!systemDatashare_) {
        systemDatashare_ = std::make_shared<AccessibilityDatashareHelper>(DATASHARE_TYPE::SYSTEM, accountId_);
    }
    if (systemDatashare_ == nullptr) {
        return;
    }
    RetError systemRet = systemDatashare_->Initialize(POWER_MANAGER_SERVICE_ID);

    if (!globalDatashare_) {
        globalDatashare_ = std::make_shared<AccessibilityDatashareHelper>(DATASHARE_TYPE::GLOBAL, accountId_);
    }
    if (globalDatashare_ == nullptr) {
        return;
    }
    RetError globalRet = globalDatashare_->Initialize(POWER_MANAGER_SERVICE_ID);
    if (ret == RET_OK && systemRet == RET_OK && globalRet == RET_OK) {
        isInitialized_ = true;
    }
}

void AccessibilitySettingsConfig::CloneAudioState()
{
    HILOG_DEBUG();
    if (systemDatashare_ == nullptr) {
        return;
    }

    RetError ret = RET_OK;
    int32_t monoValue = static_cast<int32_t>(systemDatashare_->GetIntValue(AUDIO_MONO_KEY, INVALID_MASTER_MONO_VALUE));
    if (monoValue != INVALID_MASTER_MONO_VALUE) {
        SetAudioMonoState(monoValue == 1);
        ret = systemDatashare_->PutIntValue(AUDIO_MONO_KEY, INVALID_MASTER_MONO_VALUE);
        if (ret != RET_OK) {
            Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "CloneAudioState.monoValue");
            HILOG_ERROR("reset monoValue in system table failed");
        }
    }

    float audioBalance = static_cast<float>(systemDatashare_->GetFloatValue(AUDIO_BALANCE_KEY,
        INVALID_MASTER_BALANCE_VALUE));
    if (abs(audioBalance - INVALID_MASTER_BALANCE_VALUE) > EPS) {
        SetAudioBalance(audioBalance);
        ret = systemDatashare_->PutFloatValue(AUDIO_BALANCE_KEY, INVALID_MASTER_BALANCE_VALUE);
        if (ret != RET_OK) {
            Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "CloneAudioState.audioBalance");
            HILOG_ERROR("reset audioBalance in system table failed");
        }
    }
}

uint32_t AccessibilitySettingsConfig::GetShortKeyService(std::vector<std::string> &services)
{
    uint32_t serviceFlag = 0;

    auto screenReader = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(SCREENREADER_TAG) != std::string::npos;
    });
    serviceFlag = screenReader != services.end() ? STATE_EXPLORATION_ENABLED : serviceFlag;

    auto invertColor = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(INVERT_COLOR_AOS_TAG) != std::string::npos ||
            service.find(INVERT_COLOR_TAG) != std::string::npos;
    });
    serviceFlag = invertColor != services.end() ? (serviceFlag | STATE_INVETRTCOLOR_ENABLED) : serviceFlag;

    auto audioMono = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(AUDIO_MONO_TAG) != std::string::npos;
    });
    serviceFlag = audioMono != services.end() ? (serviceFlag | STATE_AUDIOMONO_ENABLED) : serviceFlag;

    auto highContrastText = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(HIGH_CONTRAST_TEXT_TAG) != std::string::npos;
    });
    serviceFlag = highContrastText != services.end() ? (serviceFlag | STATE_HIGHCONTRAST_ENABLED) : serviceFlag;

    auto captionsAssistant = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(CAPTIONS_ASSISTANT_HMOS_TAG) != std::string::npos;
    });
    serviceFlag = captionsAssistant != services.end() ? (serviceFlag | STATE_CAPTION_ENABLED) : serviceFlag;

    auto screenMagnification = std::find_if(services.begin(), services.end(), [&](const std::string& service) {
        return service.find(SCREEN_MAGNIFICATION_TAG) != std::string::npos;
    });
    serviceFlag = screenMagnification != services.end() ? (serviceFlag | STATE_SCREENMAGNIFIER_ENABLED) : serviceFlag;

    return serviceFlag;
}

void AccessibilitySettingsConfig::CloneShortkeyService(bool isScreenReaderEnabled)
{
    std::vector<std::string> tmpVec = GetShortkeyMultiTarget();
    uint32_t shortkeyServiceFlag = GetShortKeyService(tmpVec);
    std::vector<std::string> shortkeyService;
    if (shortkeyServiceFlag & STATE_EXPLORATION_ENABLED) {
        shortkeyService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
    }
    if (shortkeyServiceFlag & STATE_INVETRTCOLOR_ENABLED) {
        shortkeyService.push_back(INVERT_COLOR_TAG);
    }
    if (shortkeyServiceFlag & STATE_AUDIOMONO_ENABLED) {
        shortkeyService.push_back(AUDIO_MONO_TAG);
    }
    if (shortkeyServiceFlag & STATE_HIGHCONTRAST_ENABLED) {
        shortkeyService.push_back(HIGH_CONTRAST_TEXT_TAG);
    }
    if (shortkeyServiceFlag & STATE_CAPTION_ENABLED) {
        shortkeyService.push_back(CAPTIONS_ASSISTANT_HMOS_TAG);
    }
    if (shortkeyServiceFlag & STATE_SCREENMAGNIFIER_ENABLED) {
        shortkeyService.push_back(SCREEN_MAGNIFICATION_TAG);
    }
    SetShortkeyMultiTarget(shortkeyService);

    tmpVec = GetEnabledAccessibilityServices();
    shortkeyServiceFlag = GetShortKeyService(tmpVec);
    std::vector<std::string> enabledShortkeyService;
    if ((shortkeyServiceFlag & STATE_EXPLORATION_ENABLED) || (isScreenReaderEnabled == true)) {
        enabledShortkeyService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
    }
    SetEnabledAccessibilityServices(enabledShortkeyService);
}

void AccessibilitySettingsConfig::SetDefaultShortcutKeyService()
{
    HILOG_DEBUG();

    if (GetShortkeyMultiTarget().empty()) {
        HILOG_INFO("set default shortcut key service.");
        std::vector<std::string> defaultService;
        defaultService.push_back(SCREEN_READER_BUNDLE_ABILITY_NAME);
        SetShortkeyMultiTarget(defaultService);
    }
}

void AccessibilitySettingsConfig::CloneOnDeviceCapability()
{
    HILOG_INFO();
    std::string deviceType = OHOS::system::GetDeviceType();
    HILOG_INFO("deviceType: %{public}s", deviceType.c_str());
    if (deviceType != "2in1") {
        return;
    }

    int32_t newCapability = system::GetIntParameter(CLONE_CAPABILITY, 0);
    if (newCapability == 0) {
        HILOG_INFO("newCapability is 0");
        return;
    }

    std::shared_ptr<AccessibilitySettingProvider> service =
        AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
    if (service == nullptr) {
        HILOG_ERROR("service is nullptr");
        return;
    }
    int32_t oldCapability = 0;
    service->GetIntValue(OLD_DEVICE_CAPABILITY, oldCapability);
    HILOG_INFO("newCapability: %{public}d, oldCapability: %{public}d", newCapability, oldCapability);
    for (auto capability : PC_ENABLE_CAPABILITY_LIST) {
        if ((static_cast<uint32_t>(newCapability) & static_cast<uint32_t>(capability)) != (
            static_cast<uint32_t>(oldCapability) & static_cast<uint32_t>(capability))) {
            HILOG_INFO("capability: %{public}d is not same, need recover", capability);
            recoverCapability(capability);
        }
    }
    service->PutIntValue(OLD_DEVICE_CAPABILITY, 0);
}

void AccessibilitySettingsConfig::recoverCapability(int32_t capability)
{
    switch (capability) {
        case CLONE_CAPABILITY_ZOOM_GUSTURE:
            return;
        case CLONE_CAPABILITY_HIGH_CONTRAST_TEXT:
            return;
        case CLONE_CAPABILITY_INVERT_COLOR:
            recoverInvertColor();
            return;
        case CLONE_CAPABILITY_COLOR_CORRECTION:
            recoverColorCorrection();
            return;
        case CLONE_CAPABILITY_TRANSITION_ANIMATION:
            return;
        case CLONE_CAPABILITY_AUDIO_ADJUSTMENT:
            recoverAudioAdjustment();
            return;
        case CLONE_CAPABILITY_SOUND_RECOGNITION:
            return;
        case CLONE_CAPABILITY_FLASH_REMINDER:
            return;
        case CLONE_CAPABILITY_TOUCH_SCREEN:
            return;
        case CLONE_CAPABILITY_SHORT_KEY:
            return;
    }
}

void AccessibilitySettingsConfig::recoverInvertColor()
{
    HILOG_INFO();
    if (datashare_ == nullptr) {
        HILOG_ERROR("datashare_ is nullptr");
        return;
    }
    if (invertColorState_.load() != datashare_->GetBoolValue(INVERT_COLOR_KEY, false)) {
        HILOG_INFO("invertColorState_: %{public}d need recovery", invertColorState_.load());
        SetInvertColorState(invertColorState_.load());
    }
}

void AccessibilitySettingsConfig::recoverColorCorrection()
{
    HILOG_INFO();
    if (datashare_ == nullptr) {
        HILOG_ERROR("datashare_ is nullptr");
        return;
    }
    if (daltonizationState_.load() != datashare_->GetBoolValue(DALTONIZATION_STATE, false)) {
        HILOG_INFO("daltonizationState_: %{public}d need recovery", daltonizationState_.load());
        SetDaltonizationState(daltonizationState_.load());
    }
    if (daltonizationColorFilter_.load() !=
        static_cast<uint32_t>(datashare_->GetIntValue(
            DALTONIZATION_COLOR_FILTER_KEY, AccessibilityConfig::DALTONIZATION_TYPE::Deuteranomaly))) {
        HILOG_INFO("daltonizationColorFilter_: %{public}d need recovery", daltonizationColorFilter_.load());
        SetDaltonizationColorFilter(daltonizationColorFilter_.load());
    }
}

void AccessibilitySettingsConfig::recoverAudioAdjustment()
{
    HILOG_INFO();
    if (datashare_ == nullptr) {
        HILOG_ERROR("datashare_ is nullptr");
        return;
    }
    if (audioMonoState_.load() != datashare_->GetBoolValue(AUDIO_MONO_KEY, false)) {
        HILOG_INFO("audioMonoState_: %{public}d need recovery", audioMonoState_.load());
        SetAudioMonoState(audioMonoState_.load());
    }
    if (audioBalance_.load() != static_cast<float>(datashare_->GetFloatValue(AUDIO_BALANCE_KEY, 0))) {
        HILOG_INFO("audioBalance_: %{public}f need recovery", audioBalance_.load());
        SetAudioBalance(audioBalance_.load());
    }
}

void AccessibilitySettingsConfig::OnDataClone()
{
    HILOG_INFO();
    CloneOnDeviceCapability();
    if (ignoreRepeatClickState_.load()) {
        IgnoreRepeatClickNotification::CancelNotification();
    }
    if (animationOffState_.load()) {
        TransitionAnimationsNotification::CancelNotification();
    }

    bool isShortkeyEnabled = GetShortKeyState();
    bool isShortkeyEnabledOnLockScreen = GetShortKeyOnLockScreenState();

    InitSetting();
    SetDefaultShortcutKeyService();
    SetIgnoreRepeatClickReconfirm(ignoreRepeatClickState_.load());
    SetZoomGestureEnabledReconfirm(isScreenMagnificationState_.load());

    if (isShortKeyState_.load()) {
        SetShortKeyOnLockScreenState(true);
    } else {
        SetShortKeyOnLockScreenState(false);
    }
    
    if (isShortkeyEnabled != GetShortKeyState()) {
        SetShortKeyState(isShortkeyEnabled);
        SetShortKeyState(!isShortkeyEnabled);
    }
    if (isShortkeyEnabledOnLockScreen != GetShortKeyOnLockScreenState()) {
        SetShortKeyOnLockScreenState(isShortkeyEnabledOnLockScreen);
        SetShortKeyOnLockScreenState(!isShortkeyEnabledOnLockScreen);
    }
    Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateShortKeyRegister();

    std::shared_ptr<AccessibilitySettingProvider> service =
        AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
    if (service == nullptr) {
        HILOG_ERROR("service is nullptr");
        return;
    }
    int32_t isSupportThreeFingerZoom = globalDatashare_->GetIntValue(SUPPORT_THREE_FINGER_ZOOM, -1);
    HILOG_INFO("isSupportThreeFingerZoom: %{public}d", isSupportThreeFingerZoom);
    if (isSupportThreeFingerZoom == -1) {
        bool screenMagnificationEnabled = datashare_->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
        int32_t triggerMethod = screenMagnificationEnabled ?
            SINGLE_FINGER_TRIPLE_TAP_MODE : THREE_FINGER_DOUBLE_TAP_MODE;
        datashare_->PutIntValue(SCREEN_MAGNIFICATION_TRIGGER_METHOD, triggerMethod);
        screenMagnificationTriggerMethod_.store(triggerMethod);
        HILOG_INFO("low version clone, set triggerMethod: %{public}d", triggerMethod);
    }
    globalDatashare_->PutIntValue(SUPPORT_THREE_FINGER_ZOOM, -1);
    bool isScreenReaderEnabled =
        (std::find(enabledAccessibilityServices_.begin(), enabledAccessibilityServices_.end(),
        SCREEN_READER_BUNDLE_ABILITY_NAME) != enabledAccessibilityServices_.end());
    if (isScreenReaderEnabled) {
        ErrCode ret = service->PutBoolValue(ACCESSIBILITY_SCREENREADER_ENABLED, true, true);
        sptr<AccessibilityAccountData> accountData
            = Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
        accountData->screenReaderState_ = true;
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "OnDataClone.screenReader");
        HILOG_INFO("set screenReader state, ret = %{public}d", ret);
    }
    service->PutBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, true);
    service->PutBoolValue(ACCESSIBILITY_CLONE_FLAG, false);
}

bool AccessibilitySettingsConfig::GetInitializeState()
{
    return isInitialized_;
}

void AccessibilitySettingsConfig::SetInitializeState(bool isInitialized)
{
    isInitialized_ = isInitialized;
    if (isInitialized) {
        return;
    }
    if (datashare_) {
        datashare_->Uninitialize();
    }
    if (systemDatashare_) {
        systemDatashare_->Uninitialize();
    }
}

void AccessibilitySettingsConfig::SetSeniorModeStateForAppMap(const std::map<std::string, bool>& map)
{
    HILOG_DEBUG();
    std::lock_guard<ffrt::mutex> lock(seniorModeStateForAppMapMutex_);
    seniorModeStateForAppMap_ = map;
}

std::map<std::string, bool> AccessibilitySettingsConfig::GetSeniorModeStateForAppMap() const
{
    HILOG_DEBUG();
    std::lock_guard<ffrt::mutex> lock(seniorModeStateForAppMapMutex_);
    return seniorModeStateForAppMap_;
}

bool AccessibilitySettingsConfig::GetSeniorModeStateForApp(const std::string &bundleName, int32_t appIndex)
{
    HILOG_DEBUG();
    if (!datashare_) {
        HILOG_ERROR("datashare_ is nullptr");
        return false;
    }
    constexpr char SENIOR_MODE_STATE_KEY[] = "accessibility_senior_mode_state_for_app";
    std::string seniorModeStateInfo = datashare_->GetStringValue(SENIOR_MODE_STATE_KEY, "{}");
    if (!nlohmann::json::accept(seniorModeStateInfo)) {
        HILOG_ERROR("Invalid json format");
        return false;
    }
    nlohmann::json jsonObj = nlohmann::json::parse(seniorModeStateInfo);
    if (!jsonObj.is_object()) {
        HILOG_ERROR("Json is not an object");
        return false;
    }
    std::string key = Utils::GetSeniorModeStateKey(bundleName, appIndex);
    if (jsonObj.contains(key) && jsonObj[key].is_boolean()) {
        return jsonObj[key].get<bool>();
    }
    return false;
}

RetError AccessibilitySettingsConfig::SetSeniorModeStateForApp(const std::string &bundleName, int32_t appIndex,
    const bool state)
{
    HILOG_INFO("bundleName: %{public}s, state: %{public}d", bundleName.c_str(), state);
    if (!datashare_) {
        return RET_ERR_NULLPTR;
    }
    constexpr char SENIOR_MODE_STATE_KEY[] = "accessibility_senior_mode_state_for_app";
    std::string seniorModeStateInfo = datashare_->GetStringValue(SENIOR_MODE_STATE_KEY, "{}");

    nlohmann::json jsonObj;
    if (nlohmann::json::accept(seniorModeStateInfo)) {
        jsonObj = nlohmann::json::parse(seniorModeStateInfo);
    }
    if (!jsonObj.is_object()) {
        jsonObj = nlohmann::json::object();
    }
    std::string key = Utils::GetSeniorModeStateKey(bundleName, appIndex);
    if (jsonObj.contains(key) && jsonObj[key].is_boolean() && jsonObj[key].get<bool>() == state) {
        HILOG_DEBUG("Value unchanged, skip database update");
        return RET_OK;
    }
    jsonObj[key] = state;
    std::string newJsonStr = jsonObj.dump();
    auto ret = datashare_->PutStringValue(SENIOR_MODE_STATE_KEY, newJsonStr);
    if (ret != RET_OK) {
        Utils::RecordDatashareInteraction(A11yDatashareValueType::UPDATE, "SetSeniorModeStateForApp");
        HILOG_ERROR("SetSeniorModeStateForApp failed");
        return ret;
    }
    return ret;
}
} // namespace Accessibility
} // namespace OHOS