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 #include "accessibility_ability_info.h"
17
18 #include "bundle_mgr_client.h"
19 #include "hilog_wrapper.h"
20 #include "json_utils.h"
21 #include "nlohmann/json.hpp"
22 #include "parcel_util.h"
23
24 using namespace std;
25 using namespace OHOS::AppExecFwk;
26
27 namespace OHOS {
28 namespace Accessibility {
AccessibilityAbilityInfo(const AppExecFwk::ExtensionAbilityInfo & abilityInfo)29 AccessibilityAbilityInfo::AccessibilityAbilityInfo(const AppExecFwk::ExtensionAbilityInfo &abilityInfo)
30 {
31 HILOG_DEBUG("start.");
32 bundleName_ = abilityInfo.bundleName;
33 moduleName_ = abilityInfo.moduleName;
34 name_ = abilityInfo.name;
35 eventTypes_ = EventType::TYPES_ALL_MASK;
36 HILOG_DEBUG("bundle name is [%{public}s].", bundleName_.c_str());
37 HILOG_DEBUG("module name is [%{public}s].", moduleName_.c_str());
38 HILOG_DEBUG("ability name is [%{public}s]].", name_.c_str());
39 description_ = abilityInfo.description;
40 std::vector<std::string> profileInfos;
41 std::string metadataName = "ohos.accessibleability";
42 BundleMgrClient bundleMgrClient;
43 bundleMgrClient.GetResConfigFile(abilityInfo, metadataName, profileInfos);
44 if (profileInfos.empty()) {
45 HILOG_ERROR("profileInfos is empty.");
46 return;
47 }
48
49 if (!ParseAAConfig(profileInfos[0])) {
50 HILOG_ERROR("Parse AccessibilityAbility config file failed.");
51 }
52 HILOG_DEBUG("capabilities is [%{public}d].", capabilities_);
53 HILOG_DEBUG("rationale is [%{public}s].", rationale_.c_str());
54 HILOG_DEBUG("settingsAbility is [%{public}s]].", settingsAbility_.c_str());
55 }
56
ParseAAConfig(std::string & config)57 bool AccessibilityAbilityInfo::ParseAAConfig(std::string &config)
58 {
59 HILOG_DEBUG("start.");
60 nlohmann::json sourceJson = nlohmann::json::parse(config);
61
62 // accessibilityCapabilities
63 vector<string> capabilities;
64 if (!JsonUtils::GetStringVecFromJson(
65 sourceJson, AccessibleAbility_JSON_KEY_ACCESSIBILITY_CAPABILITIES,
66 capabilities)) {
67 HILOG_ERROR("Get stringVec from json failed.");
68 return false;
69 }
70 PraseVecUtils::ParseCapabilitiesFromVec(capabilities, capabilities_);
71
72 // accessibilityCapabilityRationale
73 if (!JsonUtils::GetStringFromJson(
74 sourceJson,
75 AccessibleAbility_JSON_KEY_ACCESSIBILITY_CAPABILITIES_RATIONALE,
76 rationale_)) {
77 HILOG_ERROR("Get stringVec from json failed.");
78 return false;
79 }
80
81 // settingsAbility
82 if (!JsonUtils::GetStringFromJson(
83 sourceJson, AccessibleAbility_JSON_KEY_SETTINGS_ABILITY,
84 settingsAbility_)) {
85 HILOG_ERROR("Get stringVec from json failed.");
86 return false;
87 }
88 return true;
89 }
90
GetAccessibilityAbilityType()91 uint32_t AccessibilityAbilityInfo::GetAccessibilityAbilityType()
92 {
93 HILOG_DEBUG("types(%{public}d)start.", abilityTypes_);
94 return abilityTypes_;
95 }
96
GetCapabilityValues()97 uint32_t AccessibilityAbilityInfo::GetCapabilityValues()
98 {
99 HILOG_DEBUG("start.");
100 return capabilities_;
101 }
102
GetDescription()103 string AccessibilityAbilityInfo::GetDescription()
104 {
105 HILOG_DEBUG("start.");
106 return description_;
107 }
108
GetEventTypes()109 uint32_t AccessibilityAbilityInfo::GetEventTypes()
110 {
111 HILOG_DEBUG("start.");
112 return eventTypes_;
113 }
114
GetId()115 string AccessibilityAbilityInfo::GetId()
116 {
117 HILOG_DEBUG("start.");
118 return bundleName_ + "/" + name_;
119 }
120
GetName()121 string AccessibilityAbilityInfo::GetName()
122 {
123 HILOG_DEBUG("start.");
124 return name_;
125 }
126
GetPackageName()127 string AccessibilityAbilityInfo::GetPackageName()
128 {
129 HILOG_DEBUG("start.");
130 return bundleName_;
131 }
132
SetPackageName(string bundleName)133 void AccessibilityAbilityInfo::SetPackageName(string bundleName)
134 {
135 HILOG_DEBUG("start.");
136 bundleName_ = bundleName;
137 }
138
GetFilterBundleNames()139 vector<string> AccessibilityAbilityInfo::GetFilterBundleNames()
140 {
141 HILOG_DEBUG("start.");
142 return targetBundleNames_;
143 }
144
GetSettingsAbility()145 std::string AccessibilityAbilityInfo::GetSettingsAbility()
146 {
147 HILOG_DEBUG("start.");
148 return settingsAbility_;
149 }
150
ReadFromParcel(Parcel & parcel)151 bool AccessibilityAbilityInfo::ReadFromParcel(Parcel &parcel)
152 {
153 HILOG_DEBUG("start.");
154 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, bundleName_);
155 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, moduleName_);
156 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, name_);
157 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, description_);
158
159 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, capabilities_);
160 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, rationale_);
161 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, abilityTypes_);
162 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, eventTypes_);
163 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, settingsAbility_);
164 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(StringVector, parcel, &targetBundleNames_);
165
166 return true;
167 }
168
Marshalling(Parcel & parcel) const169 bool AccessibilityAbilityInfo::Marshalling(Parcel &parcel) const
170 {
171 HILOG_DEBUG("start.");
172 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, bundleName_);
173 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, moduleName_);
174 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, name_);
175 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, description_);
176
177 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, capabilities_);
178 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, rationale_);
179 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, abilityTypes_);
180 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, eventTypes_);
181 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String, parcel, settingsAbility_);
182 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(StringVector, parcel, targetBundleNames_);
183
184 return true;
185 }
186
Unmarshalling(Parcel & parcel)187 AccessibilityAbilityInfo *AccessibilityAbilityInfo::Unmarshalling(Parcel &parcel)
188 {
189 HILOG_DEBUG("start.");
190 AccessibilityAbilityInfo *accessibilityAbilityInfo = new AccessibilityAbilityInfo();
191
192 if (accessibilityAbilityInfo && !accessibilityAbilityInfo->ReadFromParcel(parcel)) {
193 HILOG_ERROR("ReadFromParcel AccessibilityAbilityInfo failed.");
194 delete accessibilityAbilityInfo;
195 accessibilityAbilityInfo = nullptr;
196 }
197
198 return accessibilityAbilityInfo;
199 }
200 } // namespace Accessibility
201 } // namespace OHOS