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 std::vector<sptr<AccessibleAbilityConnection>> connectionList;
53 connectedA11yAbilities_.GetAccessibilityAbilities(connectionList);
54 for (auto& connection : connectionList) {
55 connection->Disconnect();
56 }
57
58 // Clear all abilities.
59 connectedA11yAbilities_.Clear();
60 connectingA11yAbilities_.Clear();
61 enabledAbilities_.clear();
62 installedAbilities_.clear();
63
64 // Clear Setting State.
65 isEventTouchGuideState_ = false;
66 isScreenMagnification_ = false;
67 isFilteringKeyEvents_ = false;
68 isGesturesSimulation_ = false;
69 }
70
71 // add connect ability.
AddConnectedAbility(sptr<AccessibleAbilityConnection> & connection)72 void AccessibilityAccountData::AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection)
73 {
74 std::string uri = Utils::GetUri(connection->GetElementName());
75 HILOG_DEBUG("URI is %{public}s", uri.c_str());
76 connectedA11yAbilities_.AddAccessibilityAbility(uri, connection);
77 }
78
79 // remove connect ability.
RemoveConnectedAbility(const AppExecFwk::ElementName & element)80 void AccessibilityAccountData::RemoveConnectedAbility(const AppExecFwk::ElementName &element)
81 {
82 connectedA11yAbilities_.RemoveAccessibilityAbilityByUri(Utils::GetUri(element));
83 }
84
AddCaptionPropertyCallback(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)85 void AccessibilityAccountData::AddCaptionPropertyCallback(
86 const sptr<IAccessibleAbilityManagerCaptionObserver>& callback)
87 {
88 (void)callback;
89 }
90
RemoveCaptionPropertyCallback(const wptr<IRemoteObject> & callback)91 void AccessibilityAccountData::RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback)
92 {
93 (void)callback;
94 HILOG_DEBUG("start.");
95 }
96 // add AccessibilityInteractionConnection
AddAccessibilityWindowConnection(const int32_t windowId,const sptr<AccessibilityWindowConnection> & interactionConnection)97 void AccessibilityAccountData::AddAccessibilityWindowConnection(
98 const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection)
99 {
100 HILOG_DEBUG("windowId(%{public}d)", windowId);
101 if (!asacConnections_.count(windowId)) {
102 asacConnections_.insert(std::make_pair(windowId, interactionConnection));
103 }
104 }
105
106 // remove AccessibilityWindowConnection
RemoveAccessibilityWindowConnection(const int32_t windowId)107 void AccessibilityAccountData::RemoveAccessibilityWindowConnection(const int32_t windowId)
108 {
109 HILOG_DEBUG("windowId(%{public}d)", windowId);
110 auto iter = asacConnections_.find(windowId);
111 if (iter != asacConnections_.end()) {
112 asacConnections_.erase(iter);
113 }
114 }
115
AddConnectingA11yAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)116 void AccessibilityAccountData::AddConnectingA11yAbility(const std::string &uri,
117 const sptr<AccessibleAbilityConnection> &connection)
118 {
119 connectingA11yAbilities_.AddAccessibilityAbility(uri, connection);
120 }
121
RemoveConnectingA11yAbility(const std::string & uri)122 void AccessibilityAccountData::RemoveConnectingA11yAbility(const std::string &uri)
123 {
124 connectingA11yAbilities_.RemoveAccessibilityAbilityByUri(uri);
125 }
126
127 // For UT
AddEnabledAbility(const std::string & bundleName)128 void AccessibilityAccountData::AddEnabledAbility(const std::string& bundleName)
129 {
130 HILOG_DEBUG("start.");
131 if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
132 [bundleName](const std::string &enabledAbility) {
133 return enabledAbility == bundleName;
134 })) {
135 HILOG_ERROR("The ability is already enabled, and it's bundle name is %{public}s", bundleName.c_str());
136 return;
137 }
138 enabledAbilities_.push_back(bundleName);
139 HILOG_DEBUG("Add EnabledAbility: %{public}zu", enabledAbilities_.size());
140 }
141
RemoveEnabledAbility(const std::string & name)142 RetError AccessibilityAccountData::RemoveEnabledAbility(const std::string &name)
143 {
144 HILOG_DEBUG("start");
145 for (auto it = enabledAbilities_.begin(); it != enabledAbilities_.end(); it++) {
146 if (*it == name) {
147 HILOG_DEBUG("Removed %{public}s from EnabledAbility: ", name.c_str());
148 enabledAbilities_.erase(it);
149 HILOG_DEBUG("EnabledAbility size(%{public}zu)", enabledAbilities_.size());
150 return RET_OK;
151 }
152 }
153 HILOG_ERROR("The ability(%{public}s) is not enabled.", name.c_str());
154 return RET_ERR_NOT_ENABLED;
155 }
156
157 // For UT
AddInstalledAbility(AccessibilityAbilityInfo & abilityInfo)158 void AccessibilityAccountData::AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo)
159 {
160 (void)abilityInfo;
161 }
162
RemoveInstalledAbility(const std::string & bundleName)163 void AccessibilityAccountData::RemoveInstalledAbility(const std::string &bundleName)
164 {
165 (void)bundleName;
166 }
167
ClearInstalledAbility()168 void AccessibilityAccountData::ClearInstalledAbility()
169 {}
170
GetAccessibleAbilityConnection(const std::string & elementName)171 const sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
172 const std::string &elementName)
173 {
174 (void)elementName;
175 return nullptr;
176 }
177
GetAccessibilityWindowConnection(const int32_t windowId)178 const sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
179 const int32_t windowId)
180 {
181 if (asacConnections_.count(windowId) > 0) {
182 return asacConnections_[windowId];
183 }
184 return nullptr;
185 }
186
GetConnectedA11yAbilities()187 const std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
188 {
189 HILOG_DEBUG("GetConnectedA11yAbilities start.");
190 std::map<std::string, sptr<AccessibleAbilityConnection>> connectionMap;
191 connectedA11yAbilities_.GetAccessibilityAbilitiesMap(connectionMap);
192 return connectionMap;
193 }
194
GetAsacConnections()195 const std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
196 {
197 HILOG_DEBUG("GetAsacConnections start");
198 return asacConnections_;
199 }
200
GetCaptionPropertyCallbacks()201 const CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
202 {
203 HILOG_DEBUG("GetCaptionPropertyCallbacks start");
204 return captionPropertyCallbacks_;
205 }
206
GetConnectingA11yAbility(const std::string & uri)207 sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
208 {
209 return connectingA11yAbilities_.GetAccessibilityAbilityByUri(uri);
210 }
211
GetEnabledAbilities()212 const std::vector<std::string>& AccessibilityAccountData::GetEnabledAbilities()
213 {
214 HILOG_DEBUG("enabledAbilities_'s size is %{public}zu", enabledAbilities_.size());
215 for (auto& ability : enabledAbilities_) {
216 HILOG_DEBUG("bundleName %{public}s ", ability.c_str());
217 }
218 return enabledAbilities_;
219 }
220
GetInstalledAbilities() const221 const std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
222 {
223 HILOG_DEBUG("GetInstalledAbilities start");
224 return installedAbilities_;
225 }
226
GetAbilitiesByState(AbilityStateType state,std::vector<AccessibilityAbilityInfo> & abilities)227 void AccessibilityAccountData::GetAbilitiesByState(
228 AbilityStateType state, std::vector<AccessibilityAbilityInfo> &abilities)
229 {
230 (void)state;
231 (void)abilities;
232 }
233
UpdateAccountCapabilities()234 void AccessibilityAccountData::UpdateAccountCapabilities()
235 {}
236
UpdateEventTouchGuideCapability()237 void AccessibilityAccountData::UpdateEventTouchGuideCapability()
238 {}
239
UpdateGesturesSimulationCapability()240 void AccessibilityAccountData::UpdateGesturesSimulationCapability()
241 {}
242
UpdateFilteringKeyEventsCapability()243 void AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
244 {
245 isFilteringKeyEvents_ = false;
246 }
247
UpdateMagnificationCapability()248 void AccessibilityAccountData::UpdateMagnificationCapability()
249 {
250 isScreenMagnification_ = false;
251 }
252
UpdateEnableAbilityListsState()253 void AccessibilityAccountData::UpdateEnableAbilityListsState()
254 {
255 return;
256 }
257
EnableAbility(const std::string & name,const uint32_t capabilities)258 RetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
259 {
260 HILOG_DEBUG("start.");
261 if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
262 [name](const std::string &enabledAbility) {
263 return enabledAbility == name;
264 })) {
265 HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
266 return RET_ERR_CONNECTION_EXIST;
267 }
268 enabledAbilities_.push_back(name);
269 return RET_OK;
270 }
271
GetInstalledAbilitiesFromBMS()272 bool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
273 {
274 HILOG_DEBUG("start.");
275 return true;
276 }
277
SetScreenReaderState(const std::string & name,const std::string & state)278 void AccessibilityAccountData::SetScreenReaderState(const std::string &name, const std::string &state)
279 {
280 HILOG_DEBUG("start.");
281 (void)name;
282 (void)state;
283 }
284
GetDefaultUserScreenReaderState()285 bool AccessibilityAccountData::GetDefaultUserScreenReaderState()
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 HILOG_DEBUG("start.");
303 (void)observer;
304 }
305
RemoveEnableAbilityListsObserver(const wptr<IRemoteObject> & observer)306 void AccessibilityAccountData::RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer)
307 {
308 (void)observer;
309 }
310
AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)311 void AccessibilityAccountData::AddConfigCallback(
312 const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
313 {
314 HILOG_DEBUG("AddConfigCallback start");
315 configCallbacks_.push_back(callback);
316 }
317
GetConfigCallbacks()318 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> AccessibilityAccountData::GetConfigCallbacks()
319 {
320 HILOG_DEBUG("GetConfigCallbacks start");
321 return configCallbacks_;
322 }
323
SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> & observer)324 void AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
325 {
326 HILOG_DEBUG("SetConfigCallbacks start");
327 configCallbacks_ = observer;
328 }
329
RemoveConfigCallback(const wptr<IRemoteObject> & callback)330 void AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
331 {
332 HILOG_DEBUG("RemoveConfigCallback start");
333 for (auto iter = configCallbacks_.begin(); iter != configCallbacks_.end(); iter++) {
334 if ((*iter)->AsObject() == callback) {
335 configCallbacks_.erase(iter);
336 break;
337 }
338 }
339 }
340
GetConfig()341 std::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
342 {
343 HILOG_DEBUG("GetConfig start");
344 return config_;
345 }
346
GetImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities) const347 void AccessibilityAccountData::GetImportantEnabledAbilities(
348 std::map<std::string, uint32_t> &importantEnabledAbilities) const
349 {
350 HILOG_DEBUG("GetImportantEnabledAbilities start");
351 (void)importantEnabledAbilities;
352 }
353
UpdateImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities)354 void AccessibilityAccountData::UpdateImportantEnabledAbilities(
355 std::map<std::string, uint32_t> &importantEnabledAbilities)
356 {
357 HILOG_DEBUG("UpdateImportantEnabledAbilities start");
358 (void)importantEnabledAbilities;
359 }
360
GetInputFilterFlag() const361 uint32_t AccessibilityAccountData::GetInputFilterFlag() const
362 {
363 HILOG_DEBUG("GetInputFilterFlag start");
364 return 0;
365 }
366
UpdateAbilities()367 void AccessibilityAccountData::UpdateAbilities()
368 {
369 HILOG_DEBUG("UpdateAbilities start");
370 }
371
AddUITestClient(const sptr<IRemoteObject> & obj,const std::string & bundleName,const std::string & abilityName)372 void AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
373 const std::string &bundleName, const std::string &abilityName)
374 {
375 (void)obj;
376 (void)bundleName;
377 (void)abilityName;
378 }
379
RemoveUITestClient(sptr<AccessibleAbilityConnection> & connection,const std::string & bundleName)380 void AccessibilityAccountData::RemoveUITestClient(
381 sptr<AccessibleAbilityConnection> &connection, const std::string &bundleName)
382 {
383 (void)connection;
384 (void)bundleName;
385 }
386
SetAbilityAutoStartState(const std::string & name,const bool state)387 void AccessibilityAccountData::SetAbilityAutoStartState(const std::string &name, const bool state)
388 {
389 (void)name;
390 (void)state;
391 }
392
GetAbilityAutoStartState(const std::string & key)393 bool AccessibilityAccountData::GetAbilityAutoStartState(const std::string &key)
394 {
395 (void)key;
396 return true;
397 }
398
GetConfigValueAtoHos(ConfigValueAtoHosUpdate & value)399 void AccessibilityAccountData::GetConfigValueAtoHos(ConfigValueAtoHosUpdate &value)
400 {
401 (void)value;
402 }
403
DelAutoStartPrefKeyInRemovePkg(const std::string & bundleName)404 void AccessibilityAccountData::DelAutoStartPrefKeyInRemovePkg(const std::string &bundleName)
405 {
406 (void)bundleName;
407 }
408
UpdateAutoStartEnabledAbilities()409 void AccessibilityAccountData::UpdateAutoStartEnabledAbilities()
410 {
411 }
412
GetAccessibilityAbilityByUri(const std::string & uri)413 sptr<AccessibleAbilityConnection> AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilityByUri(
414 const std::string& uri)
415 {
416 auto iter = connectionMap_.find(uri);
417 if (iter != connectionMap_.end()) {
418 return iter->second;
419 }
420
421 return nullptr;
422 }
423
Clear()424 void AccessibilityAccountData::AccessibilityAbility::Clear()
425 {
426 return connectionMap_.clear();
427 }
428
AddAccessibilityAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)429 void AccessibilityAccountData::AccessibilityAbility::AddAccessibilityAbility(const std::string& uri,
430 const sptr<AccessibleAbilityConnection>& connection)
431 {
432 if (!connectionMap_.count(uri)) {
433 connectionMap_[uri] = connection;
434 return;
435 }
436 }
437
RemoveAccessibilityAbilityByUri(const std::string & uri)438 void AccessibilityAccountData::AccessibilityAbility::RemoveAccessibilityAbilityByUri(const std::string& uri)
439 {
440 auto iter = connectionMap_.find(uri);
441 if (iter != connectionMap_.end()) {
442 connectionMap_.erase(iter);
443 }
444 }
445
GetAccessibilityAbilities(std::vector<sptr<AccessibleAbilityConnection>> & connectionList)446 void AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilities(
447 std::vector<sptr<AccessibleAbilityConnection>>& connectionList)
448 {
449 for (auto& connection : connectionMap_) {
450 connectionList.push_back(connection.second);
451 }
452 }
453
GetAccessibilityAbilitiesMap(std::map<std::string,sptr<AccessibleAbilityConnection>> & connectionMap)454 void AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilitiesMap(
455 std::map<std::string, sptr<AccessibleAbilityConnection>>& connectionMap)
456 {
457 connectionMap = connectionMap_;
458 }
459
AddAccountData(int32_t accountId)460 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::AddAccountData(
461 int32_t accountId)
462 {
463 auto iter = accountDataMap_.find(accountId);
464 if (iter != accountDataMap_.end()) {
465 HILOG_DEBUG("accountId is existed");
466 return iter->second;
467 }
468
469 sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
470 if (accountData == nullptr) {
471 return nullptr;
472 }
473
474 accountData->Init();
475 accountDataMap_[accountId] = accountData;
476 return accountData;
477 }
478
GetCurrentAccountData(int32_t accountId)479 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetCurrentAccountData(
480 int32_t accountId)
481 {
482 auto iter = accountDataMap_.find(accountId);
483 if (iter != accountDataMap_.end()) {
484 return iter->second;
485 }
486
487 sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
488 if (!accountData) {
489 return nullptr;
490 }
491
492 accountDataMap_[accountId] = accountData;
493 return accountData;
494 }
495
GetAccountData(int32_t accountId)496 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetAccountData(
497 int32_t accountId)
498 {
499 auto iter = accountDataMap_.find(accountId);
500 if (iter != accountDataMap_.end()) {
501 return iter->second;
502 }
503
504 return nullptr;
505 }
506
RemoveAccountData(int32_t accountId)507 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::RemoveAccountData(
508 int32_t accountId)
509 {
510 sptr<AccessibilityAccountData> accountData = nullptr;
511 auto iter = accountDataMap_.find(accountId);
512 if (iter != accountDataMap_.end()) {
513 accountData = iter->second;
514 accountDataMap_.erase(iter);
515 }
516
517 return accountData;
518 }
519
Clear()520 void AccessibilityAccountDataMap::Clear()
521 {
522 accountDataMap_.clear();
523 }
524
GetAccountType()525 AccountSA::OsAccountType AccessibilityAccountData::GetAccountType()
526 {
527 return AccountSA::OsAccountType::PRIVATE;
528 }
529 } // namespace Accessibility
530 } // namespace OHOS