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 #ifndef ACCESSIBILITY_ACCOUNT_DATA_H 16 #define ACCESSIBILITY_ACCOUNT_DATA_H 17 18 #include <map> 19 #include <set> 20 #include <string> 21 #include <vector> 22 23 #include "accessibility_caption.h" 24 #include "i_accessibility_enable_ability_lists_observer.h" 25 #include "accessibility_settings_config.h" 26 #include "accessibility_window_connection.h" 27 #include "accessible_ability_connection.h" 28 #include "i_accessible_ability_manager_caption_observer.h" 29 #include "i_accessible_ability_manager_config_observer.h" 30 #include "i_accessible_ability_manager_state_observer.h" 31 #include "element_name.h" 32 #include "accessibility_setting_provider.h" 33 #include "os_account_info.h" 34 35 namespace OHOS { 36 namespace Accessibility { 37 using CaptionPropertyCallbacks = std::vector<sptr<IAccessibleAbilityManagerCaptionObserver>>; 38 class AccessibleAbilityConnection; 39 class AccessibilityWindowConnection; 40 41 struct ConfigValueAtoHosUpdate { 42 bool highContrastText = false; 43 bool invertColor = false; 44 bool audioMono = false; 45 bool daltonizationState = false; 46 float audioBalance = 0.0; 47 bool isScreenReaderEnabled = false; 48 int clickResponseTime = 0; 49 bool ignoreRepeatClickState = false; 50 int ignoreRepeatClickTime = 0; 51 int displayDaltonizer = 0; 52 bool shortcutEnabledOnLockScreen = false; 53 bool shortcutDialogShown = false; 54 }; 55 56 class AccessibilityAccountData final : public RefBase { 57 public: 58 AccessibilityAccountData(int32_t accountId); 59 ~AccessibilityAccountData(); 60 61 /** 62 * @brief Get the ID of the account. 63 * @return Returns accountId. 64 */ 65 int32_t GetAccountId(); 66 67 /** 68 * @brief Get Accessibility state. 69 * @return returns whether accessibility is connected and whether can touch browse. 70 */ 71 uint32_t GetAccessibilityState(); 72 73 /** 74 * @brief Switch users and clear old user data. 75 */ 76 void OnAccountSwitched(); 77 78 /** 79 * @brief Add connected accessibility services. 80 * @param connection Accessible ability connection. 81 */ 82 void AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection); 83 84 /** 85 * @brief Remove connected accessibility services. 86 * @param element The element name of ability. 87 */ 88 void RemoveConnectedAbility(const AppExecFwk::ElementName &element); 89 90 /** 91 * @brief Remove connecting accessibility services. 92 * @param uri bundle name + / + ability name. 93 */ 94 void RemoveConnectingA11yAbility(const std::string &uri); 95 96 void AddCaptionPropertyCallback(const sptr<IAccessibleAbilityManagerCaptionObserver>& callback); 97 void RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback); 98 99 void AddEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver>& observer); 100 void RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer); 101 102 /** 103 * @brief Add interface operation interactive connection. 104 * @param windowId Interface operation interactive connection the 105 * corresponding window id. 106 * @param interactionConnection Interface interface operation 107 * interactive connection. 108 */ 109 void AddAccessibilityWindowConnection( 110 const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection); 111 112 /** 113 * @brief Remove interface operation interactive connection. 114 * @param windowId Interface operation interactive connection the corresponding window id. 115 */ 116 void RemoveAccessibilityWindowConnection(const int32_t windowId); 117 118 /** 119 * @brief Add connecting accessibility. 120 * @param uri The uri of ability 121 * @param connection The connection of ability 122 */ 123 void AddConnectingA11yAbility(const std::string &uri, const sptr<AccessibleAbilityConnection> &connection); 124 125 void AddEnabledAbility(const std::string &name); // For UT 126 127 /** 128 * @brief Remove accessibility that have been opened. 129 * @param name bundle name + / + ability name. 130 * @return return true if removes enabled ability successfully, otherwise refer to the RetError for the failure. 131 */ 132 RetError RemoveEnabledAbility(const std::string &name); 133 134 void AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo); // For UT 135 136 /** 137 * @brief Empty installed accessibility list. 138 * @param abilityInfo Accessibility ability info. 139 */ 140 void RemoveInstalledAbility(const std::string &bundleName); 141 142 /** 143 * @brief The real procedure for add connecting ability. 144 */ 145 void ClearInstalledAbility(); 146 147 /** 148 * @brief Get connected accessibility list. 149 * @return Store map of connected accessibility abilities. 150 */ 151 const std::map<std::string, sptr<AccessibleAbilityConnection>> GetConnectedA11yAbilities(); 152 153 const CaptionPropertyCallbacks GetCaptionPropertyCallbacks(); 154 155 /** 156 * @brief Get interface operation interactive connection list. 157 * @return Store map of interface operation interactive connection. 158 */ 159 const std::map<int32_t, sptr<AccessibilityWindowConnection>> GetAsacConnections(); 160 161 /** 162 * @brief Query accessible ability connection through elementName URI. 163 * @param elementName Accessibility elementName URI 164 * @return Accessible ability connection corresponding to elementName URI. 165 */ 166 const sptr<AccessibleAbilityConnection> GetAccessibleAbilityConnection(const std::string &elementName); 167 168 /** 169 * @brief Query interface operation interactive connection through window id. 170 * @param windowId Interface operation interactive connection the corresponding window id. 171 * @return Interface operation interactive connection corresponding to window id. 172 */ 173 const sptr<AccessibilityWindowConnection> GetAccessibilityWindowConnection(const int32_t windowId); 174 175 /** 176 * @brief Get connecting ability of specified uri. 177 * @param uri The name of ability. 178 * @return Strong point of connecting ability. 179 */ 180 sptr<AccessibleAbilityConnection> GetConnectingA11yAbility(const std::string &uri); 181 182 /** 183 * @brief Get the accessibility ability info of the corresponding state according to the 184 * ability state type. 185 * @param state Ability state type. 186 */ 187 void GetAbilitiesByState(AbilityStateType state, std::vector<AccessibilityAbilityInfo> &abilities); 188 189 /** 190 * @brief Get the accessibility ability info of the disabled ability. 191 */ 192 void GetDisableAbilities(std::vector<AccessibilityAbilityInfo> &disabledAbilities); 193 194 /** 195 * @brief Get enable accessibility list. 196 * @return Store map of enable accessibility abilities. 197 */ 198 const std::vector<std::string> &GetEnabledAbilities(); 199 200 /** 201 * @brief Get install accessibility list. 202 * @return Store vector of install accessibility abilities. 203 */ 204 const std::vector<AccessibilityAbilityInfo> &GetInstalledAbilities() const; 205 206 /** 207 * @brief Update user enabled accessibility capabilities. 208 */ 209 void UpdateAccountCapabilities(); 210 211 /** 212 * @brief Get flag with whether have zoom capability. 213 * @return isScreenMagnification_. 214 */ GetScreenMagnificationFlag()215 bool GetScreenMagnificationFlag() 216 { 217 return isScreenMagnification_; 218 } 219 220 /** 221 * @brief Get flag with whether have touch guide capability. 222 * @return isEventTouchGuideState_. 223 */ GetEventTouchGuideStateFlag()224 bool GetEventTouchGuideStateFlag() 225 { 226 return isEventTouchGuideState_; 227 } 228 229 /** 230 * @brief Get flag with whether have key event observer capability. 231 * @return isFilteringKeyEvents_. 232 */ GetFilteringKeyEventsFlag()233 bool GetFilteringKeyEventsFlag() 234 { 235 return isFilteringKeyEvents_; 236 } 237 238 /** 239 * @brief Get flag with whether have gesture capability. 240 * @return isGesturesSimulation_. 241 */ GetGesturesSimulationFlag()242 bool GetGesturesSimulationFlag() 243 { 244 return isGesturesSimulation_; 245 } 246 bool GetInstalledAbilitiesFromBMS(); 247 248 std::shared_ptr<AccessibilitySettingsConfig> GetConfig(); 249 250 RetError EnableAbility(const std::string &name, const uint32_t capabilities); 251 252 void SetScreenReaderState(const std::string &name, const std::string &state); 253 bool GetDefaultUserScreenReaderState(); 254 AccountSA::OsAccountType GetAccountType(); 255 256 void Init(); 257 258 void UpdateEnableAbilityListsState(); 259 void UpdateInstallAbilityListsState(); 260 261 void AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver>& callback); 262 void RemoveConfigCallback(const wptr<IRemoteObject>& callback); 263 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> GetConfigCallbacks(); 264 void SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer); 265 266 void GetImportantEnabledAbilities(std::map<std::string, uint32_t> &importantEnabledAbilities) const; 267 void UpdateImportantEnabledAbilities(std::map<std::string, uint32_t> &importantEnabledAbilities); 268 void UpdateAutoStartEnabledAbilities(); 269 270 uint32_t GetInputFilterFlag() const; 271 void UpdateAbilities(); 272 bool RemoveAbility(const std::string &bundleName); 273 void AddAbility(const std::string &bundleName); 274 void ChangeAbility(const std::string &bundleName); 275 276 void AddUITestClient(const sptr<IRemoteObject> &obj, 277 const std::string &bundleName, const std::string &abilityName); 278 void RemoveUITestClient(sptr<AccessibleAbilityConnection> &connection, const std::string &bundleName); 279 void SetAbilityAutoStartState(const std::string &name, const bool state); 280 void DelAutoStartPrefKeyInRemovePkg(const std::string &bundleName); 281 bool GetAbilityAutoStartState(const std::string &name); 282 void GetConfigValueAtoHos(ConfigValueAtoHosUpdate &value); 283 284 private: 285 /** 286 * @brief Update connected accessibility whether have touch guide 287 * capability. Have touch guide capability isEventTouchGuideState_ is 288 * true, otherwise isEventTouchGuideState_ is false. 289 */ 290 void UpdateEventTouchGuideCapability(); 291 292 /** 293 * @brief Update connected accessibility whether have gesture capability. 294 * Have gesture capability isGesturesSimulation_ is true, 295 * otherwise isGesturesSimulation_ is false. 296 */ 297 void UpdateGesturesSimulationCapability(); 298 299 /** 300 * @brief Update connected accessibility whether have key event observer capability. 301 * Have key event observer capability isFilteringKeyEvents_ is true, 302 * otherwise isFilteringKeyEvents_ is false. 303 */ 304 void UpdateFilteringKeyEventsCapability(); 305 306 /** 307 * @brief Update connected accessibility whether have zoom capability. 308 * Have zoom capability isScreenMagnification_ is true, 309 * otherwise isScreenMagnification_ is false. 310 */ 311 void UpdateMagnificationCapability(); 312 313 class AccessibilityAbility { 314 public: 315 AccessibilityAbility() = default; 316 ~AccessibilityAbility() = default; 317 void AddAccessibilityAbility(const std::string& uri, const sptr<AccessibleAbilityConnection>& connection); 318 sptr<AccessibleAbilityConnection> GetAccessibilityAbilityByName(const std::string& elementName); 319 sptr<AccessibleAbilityConnection> GetAccessibilityAbilityByUri(const std::string& uri); 320 void GetAccessibilityAbilities(std::vector<sptr<AccessibleAbilityConnection>>& connectionList); 321 void GetAbilitiesInfo(std::vector<AccessibilityAbilityInfo>& abilities); 322 bool IsExistCapability(Capability capability); 323 void GetAccessibilityAbilitiesMap(std::map<std::string, sptr<AccessibleAbilityConnection>>& connectionMap); 324 void GetDisableAbilities(std::vector<AccessibilityAbilityInfo>& disabledAbilities); 325 int32_t GetSizeByUri(const std::string& uri); 326 void RemoveAccessibilityAbilityByName(const std::string& bundleName, bool& result); 327 void RemoveAccessibilityAbilityByUri(const std::string& uri); 328 void Clear(); 329 size_t GetSize(); 330 private: 331 std::map<std::string, sptr<AccessibleAbilityConnection>> connectionMap_; 332 std::mutex mutex_; 333 }; 334 335 int32_t id_; 336 AccountSA::OsAccountType accountType_ = AccountSA::OsAccountType::END; 337 bool isEventTouchGuideState_ = false; 338 bool isScreenMagnification_ = false; 339 bool isFilteringKeyEvents_ = false; 340 bool isGesturesSimulation_ = false; 341 std::string screenReaderKey_ = "accessibility_screenreader_enabled"; 342 uint32_t connectCounter_ = 1; 343 AccessibilityAbility connectedA11yAbilities_; // key: bundleName/abilityName 344 AccessibilityAbility connectingA11yAbilities_; // key: bundleName/abilityName 345 std::vector<sptr<IAccessibilityEnableAbilityListsObserver>> enableAbilityListsObservers_; 346 std::mutex enableAbilityListObserversMutex_; // mutex for enableAbilityListsObservers_ 347 std::map<int32_t, sptr<AccessibilityWindowConnection>> asacConnections_; // key: windowId 348 std::mutex asacConnectionsMutex_; // mutex for map asacConnections_ 349 CaptionPropertyCallbacks captionPropertyCallbacks_; 350 std::mutex captionPropertyCallbacksMutex_; // mutex for captionPropertyCallbacks_ 351 std::vector<AccessibilityAbilityInfo> installedAbilities_; 352 std::vector<std::string> enabledAbilities_; // bundleName/abilityName 353 std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> configCallbacks_; 354 std::mutex configCallbacksMutex_; // mutex for vector configCallbacks_ 355 std::shared_ptr<AccessibilitySettingsConfig> config_ = nullptr; 356 }; 357 358 class AccessibilityAccountDataMap { 359 public: 360 AccessibilityAccountDataMap() = default; 361 ~AccessibilityAccountDataMap() = default; 362 sptr<AccessibilityAccountData> AddAccountData(int32_t accountId); 363 sptr<AccessibilityAccountData> GetCurrentAccountData(int32_t accountId); 364 sptr<AccessibilityAccountData> GetAccountData(int32_t accountId); 365 sptr<AccessibilityAccountData> RemoveAccountData(int32_t accountId); 366 void Clear(); 367 private: 368 std::map<int32_t, sptr<AccessibilityAccountData>> accountDataMap_; 369 std::mutex accountDataMutex_; 370 }; 371 } // namespace Accessibility 372 } // namespace OHOS 373 #endif // ACCESSIBILITY_ACCOUNT_DATA_H