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_SYSTEM_ABILITY_CLIENT_H 17 #define NAPI_ACCESSIBILITY_SYSTEM_ABILITY_CLIENT_H 18 19 #include <vector> 20 #include <map> 21 #include "napi/native_api.h" 22 #include "napi/native_node_api.h" 23 #include "accessibility_config.h" 24 #include "accessibility_system_ability_client.h" 25 #include "accessibility_state_event.h" 26 #include "accessibility_ability_info.h" 27 #include "accessibility_utils.h" 28 #include "accessibility_config_observer.h" 29 30 namespace OHOS { 31 namespace Accessibility { 32 napi_handle_scope TmpOpenScope(napi_env env); 33 } // namespace Accessibility 34 } // namespace OHOS 35 36 const uint32_t START_WORK_ARGS_SIZE = 2; 37 struct StateListener { handlerRef_StateListener38 StateListener(napi_env env, napi_ref ref, bool isBoolObserver = true) : handlerRef_(ref), env_(env), 39 isBoolObserver_(isBoolObserver) {}; 40 static void NotifyJS(napi_env env, bool state, napi_ref handlerRef); 41 static void NotifyJS(napi_env env, std::string mode, napi_ref handlerRef); 42 void OnStateChanged(const bool state); 43 void OnStateChanged(const std::string mode); 44 45 napi_ref handlerRef_ = nullptr; 46 napi_env env_ = nullptr; 47 bool isBoolObserver_ = true; 48 }; 49 50 class StateListenerImpl : public OHOS::Accessibility::AccessibilityStateObserver, 51 public std::enable_shared_from_this<StateListenerImpl> { 52 public: StateListenerImpl(OHOS::Accessibility::AccessibilityStateEventType type)53 StateListenerImpl(OHOS::Accessibility::AccessibilityStateEventType type) : type_(type) {}; 54 void OnStateChanged(const bool state) override; 55 void SubscribeToFramework(); 56 void UnsubscribeFromFramework(); 57 void SubscribeObserver(napi_env env, napi_value observer, bool isBoolObserver = true); 58 void UnsubscribeObserver(napi_env env, napi_value observer); 59 void UnsubscribeObservers(); 60 61 private: 62 ffrt::mutex mutex_; 63 OHOS::Accessibility::AccessibilityStateEventType type_; 64 std::vector<std::shared_ptr<StateListener>> observers_ = {}; 65 66 private: 67 void DeleteObserverReference(napi_env env, std::shared_ptr<StateListener> observer); 68 }; 69 70 struct NAccessibilitySystemAbilityClient { 71 napi_async_work work_ {}; 72 napi_deferred deferred_ {}; 73 napi_ref thisRefer_ {}; 74 napi_ref callback_ {}; 75 napi_env env_ {}; 76 bool enabled_ = false; 77 bool touchEnabled_ = false; 78 OHOS::Accessibility::AbilityStateType stateTypes_ = OHOS::Accessibility::ABILITY_STATE_INVALID; 79 uint32_t abilityTypes_ = 0; 80 std::vector<OHOS::Accessibility::AccessibilityAbilityInfo> abilityList_ {}; 81 OHOS::AccessibilityConfig::CaptionProperty captionProperty_ {}; 82 bool setCaptionPropertyReturn_ = false; 83 bool captionState_ = false; 84 bool setCaptionStateReturn_ = false; 85 bool enabledState_ = false; 86 bool setEnabledReturn_ = false; 87 bool touchGuideState_ = false; 88 bool setTouchGuideStateReturn_ = false; 89 bool gestureState_ = false; 90 bool setGestureStateReturn_ = false; 91 bool keyEventObserverState_ = false; 92 bool setKeyEvenReturn_ = false; 93 OHOS::Accessibility::AccessibilityEventInfo eventInfo_ {}; 94 bool result_ = false; 95 OHOS::Accessibility::RetError ret_ = OHOS::Accessibility::RET_ERR_FAILED; 96 std::string eventType_ = ""; 97 98 std::map<std::string, std::vector<std::shared_ptr<StateListener>>> stateListeners_; 99 std::vector<std::shared_ptr<NAccessibilityConfigObserver>> captionListener_; 100 }; 101 102 class NAccessibilityClient { 103 public: 104 static napi_value IsOpenAccessibility(napi_env env, napi_callback_info info); 105 static napi_value IsOpenAccessibilitySync(napi_env env, napi_callback_info info); 106 static napi_value IsOpenTouchExploration(napi_env env, napi_callback_info info); 107 static napi_value IsOpenTouchExplorationSync(napi_env env, napi_callback_info info); 108 static napi_value IsScreenReaderOpenSync(napi_env env, napi_callback_info info); 109 static napi_value GetTouchModeSync(napi_env env, napi_callback_info info); 110 static napi_value GetAbilityList(napi_env env, napi_callback_info info); 111 static napi_value GetAccessibilityExtensionList(napi_env env, napi_callback_info info); 112 static napi_value GetAccessibilityExtensionListSync(napi_env env, napi_callback_info info); 113 static napi_value SubscribeState(napi_env env, napi_callback_info info); 114 static napi_value UnsubscribeState(napi_env env, napi_callback_info info); 115 static napi_value SendEvent(napi_env env, napi_callback_info info); 116 static napi_value SendAccessibilityEvent(napi_env env, napi_callback_info info); 117 118 static void DefineJSCaptionsManager(napi_env env); 119 static napi_value AccessibleAbilityConstructor(napi_env env, napi_callback_info info); 120 static napi_value GetCaptionsManager(napi_env env, napi_callback_info info); 121 static napi_value GetCaptionStateEnabled(napi_env env, napi_callback_info info); 122 static napi_value SetCaptionStateEnabled(napi_env env, napi_callback_info info); 123 static napi_value GetCaptionStyle(napi_env env, napi_callback_info info); 124 static napi_value SetCaptionStyle(napi_env env, napi_callback_info info); 125 static napi_value RegisterCaptionStateCallback(napi_env env, napi_callback_info info); 126 static napi_value DeregisterCaptionStateCallback(napi_env env, napi_callback_info info); 127 128 static void DefineJSCaptionsStyle(napi_env env); 129 static napi_value AccessibleAbilityConstructorStyle(napi_env env, napi_callback_info info); 130 static napi_value GetCaptionsFontFamily(napi_env env, napi_callback_info info); 131 static napi_value SetCaptionsFontFamily(napi_env env, napi_callback_info info); 132 static napi_value GetCaptionsFontScale(napi_env env, napi_callback_info info); 133 static napi_value SetCaptionsFontScale(napi_env env, napi_callback_info info); 134 static napi_value GetCaptionFrontColor(napi_env env, napi_callback_info info); 135 static napi_value SetCaptionFrontColor(napi_env env, napi_callback_info info); 136 static napi_value GetCaptionFontEdgeType(napi_env env, napi_callback_info info); 137 static napi_value SetCaptionFontEdgeType(napi_env env, napi_callback_info info); 138 static napi_value GetCaptionBackgroundColor(napi_env env, napi_callback_info info); 139 static napi_value SetCaptionBackgroundColor(napi_env env, napi_callback_info info); 140 static napi_value GetCaptionWindowColor(napi_env env, napi_callback_info info); 141 static napi_value SetCaptionWindowColor(napi_env env, napi_callback_info info); 142 143 static napi_ref aaConsRef_; 144 static napi_ref aaStyleConsRef_; 145 static std::shared_ptr<StateListenerImpl> accessibilityStateListeners_; 146 static std::shared_ptr<StateListenerImpl> touchGuideStateListeners_; 147 static std::shared_ptr<StateListenerImpl> screenReaderStateListeners_; 148 static std::shared_ptr<StateListenerImpl> touchModeListeners_; 149 static std::shared_ptr<NAccessibilityConfigObserverImpl> captionListeners_; 150 151 private: 152 static napi_value GetAccessibilityExtensionListAsync( 153 napi_env env, size_t argc, napi_value* parameters, NAccessibilitySystemAbilityClient* data); 154 static void GetAccessibilityStateEventType( 155 napi_env env, napi_value* args, OHOS::Accessibility::RetError& errCode, uint32_t& type); 156 static void Completefunction(napi_env env, std::string type, void* data); 157 static void GetAbilityListExecute(napi_env env, void* data); 158 static void GetAbilityListComplete(napi_env env, napi_status status, void* data); 159 static void SendEventExecute(napi_env env, void* data); 160 static void SendEventComplete(napi_env env, napi_status status, void* data); 161 static bool CheckAbilityType(const std::string& abilityType); 162 static bool CheckStateType(const std::string& stateType); 163 NAccessibilityClient() = default; 164 ~NAccessibilityClient() = default; 165 }; 166 167 #endif // NAPI_ACCESSIBILITY_SYSTEM_ABILITY_CLIENT_H