1 /*
2 * Copyright (C) 2021 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 #include "accessibility_account_data.h"
17 #include "accessible_ability_manager_service.h"
18 #include "hilog_wrapper.h"
19 #include "utils.h"
20
21 namespace OHOS {
22 namespace Accessibility {
23 namespace {
24 const std::string PREF_TEST_PATH = "/data/service/el1/public/barrierfree/accessibility_ability_manager_service/";
25 } // namespace
26
AccessibilityAccountData(int32_t accountId)27 AccessibilityAccountData::AccessibilityAccountData(int32_t accountId)
28 {
29 id_ = accountId;
30 }
31
~AccessibilityAccountData()32 AccessibilityAccountData::~AccessibilityAccountData()
33 {}
34
GetAccountId()35 int32_t AccessibilityAccountData::GetAccountId()
36 {
37 HILOG_DEBUG("start.");
38 return id_;
39 }
40
41 // get client state.
GetAccessibilityState()42 uint32_t AccessibilityAccountData::GetAccessibilityState()
43 {
44 return 0;
45 }
46
47 // switch the user causes state changed.
OnAccountSwitched()48 void AccessibilityAccountData::OnAccountSwitched()
49 {
50 HILOG_DEBUG("start.");
51 // reset AccessibleAbilityConnection
52 for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
53 itr->second->Disconnect();
54 }
55
56 // Clear all abilities.
57 connectedA11yAbilities_.clear();
58 connectingA11yAbilities_.clear();
59 enabledAbilities_.clear();
60 installedAbilities_.clear();
61
62 // Clear Setting State.
63 isEventTouchGuideState_ = false;
64 isScreenMagnification_ = false;
65 isFilteringKeyEvents_ = false;
66 isGesturesSimulation_ = false;
67 }
68
69 // add connect ability.
AddConnectedAbility(sptr<AccessibleAbilityConnection> & connection)70 void AccessibilityAccountData::AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection)
71 {
72 std::string uri = Utils::GetUri(connection->GetElementName());
73 HILOG_DEBUG("URI is %{public}s", uri.c_str());
74 if (!connectedA11yAbilities_.count(uri)) {
75 connectedA11yAbilities_.insert(make_pair(uri, connection));
76 }
77
78 HILOG_DEBUG("Add ConnectedAbility: %{public}zu", connectedA11yAbilities_.size());
79 }
80
81 // remove connect ability.
RemoveConnectedAbility(const AppExecFwk::ElementName & element)82 void AccessibilityAccountData::RemoveConnectedAbility(const AppExecFwk::ElementName &element)
83 {
84 std::map<std::string, sptr<AccessibleAbilityConnection>>::iterator it =
85 connectedA11yAbilities_.find(Utils::GetUri(element));
86 if (it != connectedA11yAbilities_.end()) {
87 connectedA11yAbilities_.erase(it);
88 }
89 HILOG_INFO("Remove ConnectedAbility: %{public}zu", connectedA11yAbilities_.size());
90 }
91
AddCaptionPropertyCallback(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)92 void AccessibilityAccountData::AddCaptionPropertyCallback(
93 const sptr<IAccessibleAbilityManagerCaptionObserver>& callback)
94 {
95 (void)callback;
96 }
97
RemoveCaptionPropertyCallback(const wptr<IRemoteObject> & callback)98 void AccessibilityAccountData::RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback)
99 {
100 (void)callback;
101 HILOG_DEBUG("start.");
102 }
103 // add AccessibilityInteractionConnection
AddAccessibilityWindowConnection(const int32_t windowId,const sptr<AccessibilityWindowConnection> & interactionConnection)104 void AccessibilityAccountData::AddAccessibilityWindowConnection(
105 const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection)
106 {
107 HILOG_DEBUG("windowId(%{public}d)", windowId);
108 if (!asacConnections_.count(windowId)) {
109 asacConnections_.insert(std::make_pair(windowId, interactionConnection));
110 }
111 }
112
113 // remove AccessibilityWindowConnection
RemoveAccessibilityWindowConnection(const int32_t windowId)114 void AccessibilityAccountData::RemoveAccessibilityWindowConnection(const int32_t windowId)
115 {
116 HILOG_DEBUG("windowId(%{public}d)", windowId);
117 auto iter = asacConnections_.find(windowId);
118 if (iter != asacConnections_.end()) {
119 asacConnections_.erase(iter);
120 }
121 }
122
AddConnectingA11yAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)123 void AccessibilityAccountData::AddConnectingA11yAbility(const std::string &uri,
124 const sptr<AccessibleAbilityConnection> &connection)
125 {
126 auto iter = connectingA11yAbilities_.find(uri);
127 if (iter != connectingA11yAbilities_.end()) {
128 HILOG_ERROR("The ability is already connecting, and it's uri is %{public}s", uri.c_str());
129 return;
130 }
131 connectingA11yAbilities_[uri] = connection;
132 }
133
RemoveConnectingA11yAbility(const std::string & uri)134 void AccessibilityAccountData::RemoveConnectingA11yAbility(const std::string &uri)
135 {
136 auto iter = connectingA11yAbilities_.find(uri);
137 if (iter != connectingA11yAbilities_.end()) {
138 connectingA11yAbilities_.erase(iter);
139 return;
140 }
141 }
142
143 // For UT
AddEnabledAbility(const std::string & bundleName)144 void AccessibilityAccountData::AddEnabledAbility(const std::string& bundleName)
145 {
146 HILOG_DEBUG("start.");
147 if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
148 [bundleName](const std::string &enabledAbility) {
149 return enabledAbility == bundleName;
150 })) {
151 HILOG_ERROR("The ability is already enabled, and it's bundle name is %{public}s", bundleName.c_str());
152 return;
153 }
154 enabledAbilities_.push_back(bundleName);
155 HILOG_DEBUG("Add EnabledAbility: %{public}zu", enabledAbilities_.size());
156 }
157
RemoveEnabledAbility(const std::string & name)158 RetError AccessibilityAccountData::RemoveEnabledAbility(const std::string &name)
159 {
160 HILOG_DEBUG("start");
161 for (auto it = enabledAbilities_.begin(); it != enabledAbilities_.end(); it++) {
162 if (*it == name) {
163 HILOG_DEBUG("Removed %{public}s from EnabledAbility: ", name.c_str());
164 enabledAbilities_.erase(it);
165 HILOG_DEBUG("EnabledAbility size(%{public}zu)", enabledAbilities_.size());
166 return RET_OK;
167 }
168 }
169 HILOG_ERROR("The ability(%{public}s) is not enabled.", name.c_str());
170 return RET_ERR_NOT_ENABLED;
171 }
172
173 // For UT
AddInstalledAbility(AccessibilityAbilityInfo & abilityInfo)174 void AccessibilityAccountData::AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo)
175 {
176 (void)abilityInfo;
177 }
178
RemoveInstalledAbility(const std::string & bundleName)179 void AccessibilityAccountData::RemoveInstalledAbility(const std::string &bundleName)
180 {
181 (void)bundleName;
182 }
183
ClearInstalledAbility()184 void AccessibilityAccountData::ClearInstalledAbility()
185 {}
186
GetAccessibleAbilityConnection(const std::string & elementName)187 const sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
188 const std::string &elementName)
189 {
190 (void)elementName;
191 return nullptr;
192 }
193
GetAccessibilityWindowConnection(const int32_t windowId)194 const sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
195 const int32_t windowId)
196 {
197 if (asacConnections_.count(windowId) > 0) {
198 return asacConnections_[windowId];
199 }
200 return nullptr;
201 }
202
GetConnectedA11yAbilities()203 const std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
204 {
205 HILOG_DEBUG("start.");
206 return connectedA11yAbilities_;
207 }
208
GetAsacConnections()209 const std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
210 {
211 HILOG_DEBUG("start.");
212 return asacConnections_;
213 }
214
GetCaptionPropertyCallbacks()215 const CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
216 {
217 HILOG_DEBUG("start.");
218 return captionPropertyCallbacks_;
219 }
220
GetConnectingA11yAbility(const std::string & uri)221 sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
222 {
223 auto iter = connectingA11yAbilities_.find(uri);
224 if (iter != connectingA11yAbilities_.end()) {
225 return iter->second;
226 }
227 return nullptr;
228 }
229
GetEnabledAbilities()230 const std::vector<std::string>& AccessibilityAccountData::GetEnabledAbilities()
231 {
232 HILOG_DEBUG("enabledAbilities_ size is (%{public}zu).", enabledAbilities_.size());
233 for (auto& ability : enabledAbilities_) {
234 HILOG_DEBUG("bundleName = %{public}s ", ability.c_str());
235 }
236 return enabledAbilities_;
237 }
238
GetInstalledAbilities() const239 const std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
240 {
241 HILOG_DEBUG("start.");
242 return installedAbilities_;
243 }
244
GetAbilitiesByState(AbilityStateType state,std::vector<AccessibilityAbilityInfo> & abilities) const245 void AccessibilityAccountData::GetAbilitiesByState(
246 AbilityStateType state, std::vector<AccessibilityAbilityInfo> &abilities) const
247 {
248 (void)state;
249 (void)abilities;
250 }
251
UpdateAccountCapabilities()252 void AccessibilityAccountData::UpdateAccountCapabilities()
253 {}
254
UpdateEventTouchGuideCapability()255 void AccessibilityAccountData::UpdateEventTouchGuideCapability()
256 {}
257
UpdateGesturesSimulationCapability()258 void AccessibilityAccountData::UpdateGesturesSimulationCapability()
259 {}
260
UpdateFilteringKeyEventsCapability()261 void AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
262 {
263 isFilteringKeyEvents_ = false;
264 }
265
UpdateMagnificationCapability()266 void AccessibilityAccountData::UpdateMagnificationCapability()
267 {
268 isScreenMagnification_ = false;
269 }
270
EnableAbility(const std::string & name,const uint32_t capabilities)271 RetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
272 {
273 HILOG_DEBUG("start.");
274 if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
275 [name](const std::string &enabledAbility) {
276 return enabledAbility == name;
277 })) {
278 HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
279 return RET_ERR_CONNECTION_EXIST;
280 }
281 enabledAbilities_.push_back(name);
282 return RET_OK;
283 }
284
GetInstalledAbilitiesFromBMS()285 bool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
286 {
287 HILOG_DEBUG("start.");
288 return true;
289 }
290
Init()291 void AccessibilityAccountData::Init()
292 {
293 HILOG_DEBUG("start.");
294 if (!config_) {
295 config_ = std::make_shared<AccessibilitySettingsConfig>(id_);
296 }
297 }
298
AddEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver> & observer)299 void AccessibilityAccountData::AddEnableAbilityListsObserver(
300 const sptr<IAccessibilityEnableAbilityListsObserver>& observer)
301 {
302 (void)observer;
303 }
304
RemoveEnableAbilityListsObserver(const wptr<IRemoteObject> & observer)305 void AccessibilityAccountData::RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer)
306 {
307 (void)observer;
308 }
309
AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)310 void AccessibilityAccountData::AddConfigCallback(
311 const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
312 {
313 HILOG_DEBUG("start.");
314 configCallbacks_.push_back(callback);
315 }
316
GetConfigCallbacks() const317 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> &AccessibilityAccountData::GetConfigCallbacks() const
318 {
319 HILOG_DEBUG("start.");
320 return configCallbacks_;
321 }
322
SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> & observer)323 void AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
324 {
325 HILOG_DEBUG("start.");
326 configCallbacks_ = observer;
327 }
328
RemoveConfigCallback(const wptr<IRemoteObject> & callback)329 void AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
330 {
331 HILOG_DEBUG("start.");
332 for (auto itr = configCallbacks_.begin(); itr != configCallbacks_.end(); itr++) {
333 if ((*itr)->AsObject() == callback) {
334 configCallbacks_.erase(itr);
335 break;
336 }
337 }
338 }
339
GetConfig()340 std::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
341 {
342 HILOG_DEBUG("start.");
343 return config_;
344 }
345
GetImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities) const346 void AccessibilityAccountData::GetImportantEnabledAbilities(
347 std::map<std::string, uint32_t> &importantEnabledAbilities) const
348 {
349 HILOG_DEBUG();
350 (void)importantEnabledAbilities;
351 }
352
UpdateImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities)353 void AccessibilityAccountData::UpdateImportantEnabledAbilities(
354 std::map<std::string, uint32_t> &importantEnabledAbilities)
355 {
356 HILOG_DEBUG();
357 (void)importantEnabledAbilities;
358 }
359
GetInputFilterFlag() const360 uint32_t AccessibilityAccountData::GetInputFilterFlag() const
361 {
362 return 0;
363 }
364
UpdateAbilities()365 void AccessibilityAccountData::UpdateAbilities()
366 {
367 }
368
AddUITestClient(const sptr<IRemoteObject> & obj,const std::string & bundleName,const std::string & abilityName)369 void AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
370 const std::string &bundleName, const std::string &abilityName)
371 {
372 (void)obj;
373 (void)bundleName;
374 (void)abilityName;
375 }
376
RemoveUITestClient(sptr<AccessibleAbilityConnection> & connection,const std::string & bundleName)377 void AccessibilityAccountData::RemoveUITestClient(
378 sptr<AccessibleAbilityConnection> &connection, const std::string &bundleName)
379 {
380 (void)connection;
381 (void)bundleName;
382 }
383 } // namespace Accessibility
384 } // namespace OHOS