• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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