1 /* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef NAPI_ACCESSIBILITY_CONFIG_H 17 #define NAPI_ACCESSIBILITY_CONFIG_H 18 19 #include <vector> 20 #include <map> 21 #include "accessibility_config.h" 22 #include "accessibility_config_observer.h" 23 #include "accessibility_utils.h" 24 #include "ffrt.h" 25 #include "napi/native_api.h" 26 #include "napi/native_node_api.h" 27 28 struct EnableAbilityListsObserver { EnableAbilityListsObserverEnableAbilityListsObserver29 EnableAbilityListsObserver(napi_env env, napi_ref callback) : env_(env), callback_(callback) {}; 30 void OnEnableAbilityListsStateChanged(); 31 int OnEnableAbilityListsStateChangedWork(uv_work_t *work); 32 napi_env env_ = nullptr; 33 napi_ref callback_ = nullptr; 34 }; 35 36 class EnableAbilityListsObserverImpl : public OHOS::AccessibilityConfig::AccessibilityEnableAbilityListsObserver, 37 public std::enable_shared_from_this<EnableAbilityListsObserverImpl> { 38 public: 39 EnableAbilityListsObserverImpl() = default; 40 void OnEnableAbilityListsStateChanged() override; 41 void OnInstallAbilityListsStateChanged() override; 42 void SubscribeToFramework(); 43 void UnsubscribeFromFramework(); 44 void SubscribeObserver(napi_env env, napi_value observer); 45 void SubscribeInstallObserver(napi_env env, napi_value observer); 46 void UnsubscribeObserver(napi_env env, napi_value observer); 47 void UnsubscribeObservers(); 48 void UnsubscribeInstallObserver(napi_env env, napi_value observer); 49 void UnsubscribeInstallObservers(); 50 51 private: 52 ffrt::mutex mutex_; 53 std::vector<std::shared_ptr<EnableAbilityListsObserver>> enableAbilityListsObservers_ = {}; 54 std::vector<std::shared_ptr<EnableAbilityListsObserver>> installAbilityListsObservers_ = {}; 55 }; 56 57 struct NAccessibilityConfigData { 58 napi_async_work work_ {}; 59 napi_deferred deferred_ {}; 60 napi_ref callback_ {}; 61 std::string abilityName_ = ""; 62 uint32_t capabilities_ = 0; 63 std::string stringConfig_ = ""; 64 uint32_t uint32Config_ = 0; 65 int32_t int32Config_ = 0; 66 float floatConfig_ = 0; 67 std::vector<std::string> stringVectorConfig_ {}; 68 OHOS::AccessibilityConfig::CaptionProperty captionProperty_ {}; 69 OHOS::AccessibilityConfig::CONFIG_ID id_ = OHOS::AccessibilityConfig::CONFIG_ID::CONFIG_ID_MAX; 70 bool boolConfig_ = false; 71 OHOS::Accessibility::RetError ret_ = OHOS::Accessibility::RET_ERR_FAILED; 72 }; 73 74 class NAccessibilityConfigClass { 75 public: NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_ID id)76 NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_ID id) 77 : id_(id) {} ~NAccessibilityConfigClass()78 ~NAccessibilityConfigClass() 79 { 80 napi_delete_reference(env_, wrapper_); 81 } 82 Destructor(napi_env env,void * nativeObject,void *)83 static void Destructor(napi_env env, void* nativeObject, void*) 84 { 85 NAccessibilityConfigClass* obj = static_cast<NAccessibilityConfigClass*>(nativeObject); 86 obj->~NAccessibilityConfigClass(); 87 delete obj; 88 nativeObject = nullptr; 89 } 90 GetConfigId()91 OHOS::AccessibilityConfig::CONFIG_ID GetConfigId() const 92 { 93 return id_; 94 } 95 SetEnv(const napi_env env)96 void SetEnv(const napi_env env) 97 { 98 env_ = env; 99 } 100 GetEnv()101 napi_env GetEnv() const 102 { 103 return env_; 104 } 105 GetWrapper()106 napi_ref* GetWrapper() 107 { 108 return &wrapper_; 109 } 110 private: 111 OHOS::AccessibilityConfig::CONFIG_ID id_; 112 napi_env env_ = nullptr; 113 napi_ref wrapper_ = nullptr; 114 }; 115 116 class NAccessibilityConfig { 117 public: 118 static napi_value EnableAbility(napi_env env, napi_callback_info info); 119 static napi_value DisableAbility(napi_env env, napi_callback_info info); 120 static napi_value SubscribeState(napi_env env, napi_callback_info info); 121 static napi_value UnsubscribeState(napi_env env, napi_callback_info info); 122 static napi_value SetMagnificationState(napi_env env, napi_callback_info info); 123 static napi_value SetConfig(napi_env env, napi_callback_info info); 124 static napi_value GetConfig(napi_env env, napi_callback_info info); 125 static napi_value SubscribeConfigObserver(napi_env env, napi_callback_info info); 126 static napi_value UnSubscribeConfigObserver(napi_env env, napi_callback_info info); 127 static std::shared_ptr<NAccessibilityConfigObserverImpl> configObservers_; 128 static std::shared_ptr<EnableAbilityListsObserverImpl> enableAbilityListsObservers_; ConfigCreateJsUndefined(napi_env env)129 static inline napi_value ConfigCreateJsUndefined(napi_env env) 130 { 131 napi_value result = nullptr; 132 napi_get_undefined(env, &result); 133 return result; 134 } 135 private: 136 static void AsyncWorkComplete(napi_env env, napi_status status, void* data); 137 static void SetConfigExecute(napi_env env, void* data); 138 static void SetScreenTouchConfigExecute(NAccessibilityConfigData* callbackInfo); 139 static void GetConfigComplete(napi_env env, napi_status status, void* data); 140 static void GetConfigExecute(napi_env env, void* data); 141 static bool CheckReadPermission(const std::string &permission); 142 static bool IsAvailable(napi_env env, napi_callback_info info); 143 static void GetScreenTouchConfigExecute(NAccessibilityConfigData* callbackInfo); 144 static void EnableAbilityError(size_t& argc, OHOS::Accessibility::RetError& errCode, 145 napi_env env, napi_value* parameters, NAccessibilityConfigData* callbackInfo); 146 static void DisableAbilityError(size_t& argc, OHOS::Accessibility::RetError& errCode, 147 napi_env env, napi_value* parameters, NAccessibilityConfigData* callbackInfo); 148 static void ConfigCompleteInfoById(napi_env env, NAccessibilityConfigData* callbackInfo, 149 napi_value* result, size_t len); 150 static NAccessibilityConfigData* GetCallbackInfo(napi_env env, napi_callback_info info, 151 napi_value* parameters, size_t& argc, NAccessibilityConfigClass*& obj); 152 static bool ParseConnectTimeoutData(napi_env env, NAccessibilityConfigData* callbackInfo, 153 napi_value* parameters); 154 static bool ParseMouseAutoClickData(napi_env env, NAccessibilityConfigData* callbackInfo, 155 napi_value* parameters); 156 static bool SetConfigParseBoolData(napi_env env, NAccessibilityConfigData* callbackInfo, 157 napi_value* parameters); 158 static bool SetConfigParseData(napi_env env, NAccessibilityConfigClass* obj, 159 NAccessibilityConfigData* callbackInfo, napi_value* parameters, size_t argc); 160 NAccessibilityConfig() = default; 161 ~NAccessibilityConfig() = default; 162 }; 163 164 #endif // NAPI_ACCESSIBILITY_CONFIG_H