xref: /aosp_15_r20/frameworks/base/tools/aapt2/test/Builders.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include "test/Builders.h"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include "Diagnostics.h"
20*d57664e9SAndroid Build Coastguard Worker #include "android-base/logging.h"
21*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPiece.h"
22*d57664e9SAndroid Build Coastguard Worker #include "io/StringStream.h"
23*d57664e9SAndroid Build Coastguard Worker #include "test/Common.h"
24*d57664e9SAndroid Build Coastguard Worker #include "util/Util.h"
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker using ::aapt::configuration::Abi;
27*d57664e9SAndroid Build Coastguard Worker using ::aapt::configuration::AndroidSdk;
28*d57664e9SAndroid Build Coastguard Worker using ::aapt::configuration::ConfiguredArtifact;
29*d57664e9SAndroid Build Coastguard Worker using ::aapt::configuration::GetOrCreateGroup;
30*d57664e9SAndroid Build Coastguard Worker using ::aapt::io::StringInputStream;
31*d57664e9SAndroid Build Coastguard Worker using ::android::ConfigDescription;
32*d57664e9SAndroid Build Coastguard Worker using ::android::StringPiece;
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker namespace aapt {
35*d57664e9SAndroid Build Coastguard Worker namespace test {
36*d57664e9SAndroid Build Coastguard Worker 
AddSimple(StringPiece name,const ResourceId & id)37*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddSimple(StringPiece name, const ResourceId& id) {
38*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, id, util::make_unique<Id>());
39*d57664e9SAndroid Build Coastguard Worker }
40*d57664e9SAndroid Build Coastguard Worker 
AddSimple(StringPiece name,const ConfigDescription & config,const ResourceId & id)41*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddSimple(StringPiece name,
42*d57664e9SAndroid Build Coastguard Worker                                                       const ConfigDescription& config,
43*d57664e9SAndroid Build Coastguard Worker                                                       const ResourceId& id) {
44*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, config, id, util::make_unique<Id>());
45*d57664e9SAndroid Build Coastguard Worker }
46*d57664e9SAndroid Build Coastguard Worker 
AddReference(StringPiece name,StringPiece ref)47*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddReference(StringPiece name, StringPiece ref) {
48*d57664e9SAndroid Build Coastguard Worker   return AddReference(name, {}, ref);
49*d57664e9SAndroid Build Coastguard Worker }
50*d57664e9SAndroid Build Coastguard Worker 
AddReference(StringPiece name,const ResourceId & id,StringPiece ref)51*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddReference(StringPiece name, const ResourceId& id,
52*d57664e9SAndroid Build Coastguard Worker                                                          StringPiece ref) {
53*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, id, util::make_unique<Reference>(ParseNameOrDie(ref)));
54*d57664e9SAndroid Build Coastguard Worker }
55*d57664e9SAndroid Build Coastguard Worker 
AddString(StringPiece name,StringPiece str)56*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, StringPiece str) {
57*d57664e9SAndroid Build Coastguard Worker   return AddString(name, {}, str);
58*d57664e9SAndroid Build Coastguard Worker }
59*d57664e9SAndroid Build Coastguard Worker 
AddString(StringPiece name,const ResourceId & id,StringPiece str)60*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, const ResourceId& id,
61*d57664e9SAndroid Build Coastguard Worker                                                       StringPiece str) {
62*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
63*d57664e9SAndroid Build Coastguard Worker }
64*d57664e9SAndroid Build Coastguard Worker 
AddString(StringPiece name,const ResourceId & id,const ConfigDescription & config,StringPiece str)65*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddString(StringPiece name, const ResourceId& id,
66*d57664e9SAndroid Build Coastguard Worker                                                       const ConfigDescription& config,
67*d57664e9SAndroid Build Coastguard Worker                                                       StringPiece str) {
68*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, config, id, util::make_unique<String>(table_->string_pool.MakeRef(str)));
69*d57664e9SAndroid Build Coastguard Worker }
70*d57664e9SAndroid Build Coastguard Worker 
AddFileReference(StringPiece name,StringPiece path,io::IFile * file)71*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, StringPiece path,
72*d57664e9SAndroid Build Coastguard Worker                                                              io::IFile* file) {
73*d57664e9SAndroid Build Coastguard Worker   return AddFileReference(name, {}, path, file);
74*d57664e9SAndroid Build Coastguard Worker }
75*d57664e9SAndroid Build Coastguard Worker 
AddFileReference(StringPiece name,const ResourceId & id,StringPiece path,io::IFile * file)76*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, const ResourceId& id,
77*d57664e9SAndroid Build Coastguard Worker                                                              StringPiece path, io::IFile* file) {
78*d57664e9SAndroid Build Coastguard Worker   auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
79*d57664e9SAndroid Build Coastguard Worker   file_ref->file = file;
80*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, id, std::move(file_ref));
81*d57664e9SAndroid Build Coastguard Worker }
82*d57664e9SAndroid Build Coastguard Worker 
AddFileReference(StringPiece name,StringPiece path,const ConfigDescription & config,io::IFile * file)83*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddFileReference(StringPiece name, StringPiece path,
84*d57664e9SAndroid Build Coastguard Worker                                                              const ConfigDescription& config,
85*d57664e9SAndroid Build Coastguard Worker                                                              io::IFile* file) {
86*d57664e9SAndroid Build Coastguard Worker   auto file_ref = util::make_unique<FileReference>(table_->string_pool.MakeRef(path));
87*d57664e9SAndroid Build Coastguard Worker   file_ref->file = file;
88*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, config, {}, std::move(file_ref));
89*d57664e9SAndroid Build Coastguard Worker }
90*d57664e9SAndroid Build Coastguard Worker 
AddValue(StringPiece name,std::unique_ptr<Value> value)91*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name,
92*d57664e9SAndroid Build Coastguard Worker                                                      std::unique_ptr<Value> value) {
93*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, {}, std::move(value));
94*d57664e9SAndroid Build Coastguard Worker }
95*d57664e9SAndroid Build Coastguard Worker 
AddValue(StringPiece name,const ResourceId & id,std::unique_ptr<Value> value)96*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name, const ResourceId& id,
97*d57664e9SAndroid Build Coastguard Worker                                                      std::unique_ptr<Value> value) {
98*d57664e9SAndroid Build Coastguard Worker   return AddValue(name, {}, id, std::move(value));
99*d57664e9SAndroid Build Coastguard Worker }
100*d57664e9SAndroid Build Coastguard Worker 
AddValue(StringPiece name,const ConfigDescription & config,const ResourceId & id,std::unique_ptr<Value> value)101*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::AddValue(StringPiece name,
102*d57664e9SAndroid Build Coastguard Worker                                                      const ConfigDescription& config,
103*d57664e9SAndroid Build Coastguard Worker                                                      const ResourceId& id,
104*d57664e9SAndroid Build Coastguard Worker                                                      std::unique_ptr<Value> value) {
105*d57664e9SAndroid Build Coastguard Worker   ResourceName res_name = ParseNameOrDie(name);
106*d57664e9SAndroid Build Coastguard Worker   NewResourceBuilder builder(res_name);
107*d57664e9SAndroid Build Coastguard Worker   builder.SetValue(std::move(value), config).SetAllowMangled(true);
108*d57664e9SAndroid Build Coastguard Worker   if (id.id != 0U) {
109*d57664e9SAndroid Build Coastguard Worker     builder.SetId(id);
110*d57664e9SAndroid Build Coastguard Worker   }
111*d57664e9SAndroid Build Coastguard Worker 
112*d57664e9SAndroid Build Coastguard Worker   CHECK(table_->AddResource(builder.Build(), GetDiagnostics()));
113*d57664e9SAndroid Build Coastguard Worker   return *this;
114*d57664e9SAndroid Build Coastguard Worker }
115*d57664e9SAndroid Build Coastguard Worker 
SetSymbolState(StringPiece name,const ResourceId & id,Visibility::Level level,bool allow_new)116*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::SetSymbolState(StringPiece name, const ResourceId& id,
117*d57664e9SAndroid Build Coastguard Worker                                                            Visibility::Level level,
118*d57664e9SAndroid Build Coastguard Worker                                                            bool allow_new) {
119*d57664e9SAndroid Build Coastguard Worker   ResourceName res_name = ParseNameOrDie(name);
120*d57664e9SAndroid Build Coastguard Worker   NewResourceBuilder builder(res_name);
121*d57664e9SAndroid Build Coastguard Worker   builder.SetVisibility({level}).SetAllowNew({}).SetAllowMangled(true);
122*d57664e9SAndroid Build Coastguard Worker   if (id.id != 0U) {
123*d57664e9SAndroid Build Coastguard Worker     builder.SetId(id);
124*d57664e9SAndroid Build Coastguard Worker   }
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker   CHECK(table_->AddResource(builder.Build(), GetDiagnostics()));
127*d57664e9SAndroid Build Coastguard Worker   return *this;
128*d57664e9SAndroid Build Coastguard Worker }
129*d57664e9SAndroid Build Coastguard Worker 
SetOverlayable(StringPiece name,const OverlayableItem & overlayable)130*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::SetOverlayable(StringPiece name,
131*d57664e9SAndroid Build Coastguard Worker                                                            const OverlayableItem& overlayable) {
132*d57664e9SAndroid Build Coastguard Worker   ResourceName res_name = ParseNameOrDie(name);
133*d57664e9SAndroid Build Coastguard Worker   CHECK(table_->AddResource(
134*d57664e9SAndroid Build Coastguard Worker       NewResourceBuilder(res_name).SetOverlayable(overlayable).SetAllowMangled(true).Build(),
135*d57664e9SAndroid Build Coastguard Worker       GetDiagnostics()));
136*d57664e9SAndroid Build Coastguard Worker   return *this;
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker 
Add(NewResource && res)139*d57664e9SAndroid Build Coastguard Worker ResourceTableBuilder& ResourceTableBuilder::Add(NewResource&& res) {
140*d57664e9SAndroid Build Coastguard Worker   CHECK(table_->AddResource(std::move(res), GetDiagnostics()));
141*d57664e9SAndroid Build Coastguard Worker   return *this;
142*d57664e9SAndroid Build Coastguard Worker }
143*d57664e9SAndroid Build Coastguard Worker 
string_pool()144*d57664e9SAndroid Build Coastguard Worker android::StringPool* ResourceTableBuilder::string_pool() {
145*d57664e9SAndroid Build Coastguard Worker   return &table_->string_pool;
146*d57664e9SAndroid Build Coastguard Worker }
147*d57664e9SAndroid Build Coastguard Worker 
Build()148*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<ResourceTable> ResourceTableBuilder::Build() {
149*d57664e9SAndroid Build Coastguard Worker   return std::move(table_);
150*d57664e9SAndroid Build Coastguard Worker }
151*d57664e9SAndroid Build Coastguard Worker 
BuildReference(StringPiece ref,const std::optional<ResourceId> & id)152*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Reference> BuildReference(StringPiece ref, const std::optional<ResourceId>& id) {
153*d57664e9SAndroid Build Coastguard Worker   std::unique_ptr<Reference> reference = util::make_unique<Reference>(ParseNameOrDie(ref));
154*d57664e9SAndroid Build Coastguard Worker   reference->id = id;
155*d57664e9SAndroid Build Coastguard Worker   return reference;
156*d57664e9SAndroid Build Coastguard Worker }
157*d57664e9SAndroid Build Coastguard Worker 
BuildPrimitive(uint8_t type,uint32_t data)158*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<BinaryPrimitive> BuildPrimitive(uint8_t type, uint32_t data) {
159*d57664e9SAndroid Build Coastguard Worker   android::Res_value value = {};
160*d57664e9SAndroid Build Coastguard Worker   value.size = sizeof(value);
161*d57664e9SAndroid Build Coastguard Worker   value.dataType = type;
162*d57664e9SAndroid Build Coastguard Worker   value.data = data;
163*d57664e9SAndroid Build Coastguard Worker   return util::make_unique<BinaryPrimitive>(value);
164*d57664e9SAndroid Build Coastguard Worker }
165*d57664e9SAndroid Build Coastguard Worker 
AttributeBuilder()166*d57664e9SAndroid Build Coastguard Worker AttributeBuilder::AttributeBuilder()
167*d57664e9SAndroid Build Coastguard Worker     : attr_(util::make_unique<Attribute>(android::ResTable_map::TYPE_ANY)) {
168*d57664e9SAndroid Build Coastguard Worker }
169*d57664e9SAndroid Build Coastguard Worker 
SetTypeMask(uint32_t typeMask)170*d57664e9SAndroid Build Coastguard Worker AttributeBuilder& AttributeBuilder::SetTypeMask(uint32_t typeMask) {
171*d57664e9SAndroid Build Coastguard Worker   attr_->type_mask = typeMask;
172*d57664e9SAndroid Build Coastguard Worker   return *this;
173*d57664e9SAndroid Build Coastguard Worker }
174*d57664e9SAndroid Build Coastguard Worker 
SetWeak(bool weak)175*d57664e9SAndroid Build Coastguard Worker AttributeBuilder& AttributeBuilder::SetWeak(bool weak) {
176*d57664e9SAndroid Build Coastguard Worker   attr_->SetWeak(weak);
177*d57664e9SAndroid Build Coastguard Worker   return *this;
178*d57664e9SAndroid Build Coastguard Worker }
179*d57664e9SAndroid Build Coastguard Worker 
SetComment(StringPiece comment)180*d57664e9SAndroid Build Coastguard Worker AttributeBuilder& AttributeBuilder::SetComment(StringPiece comment) {
181*d57664e9SAndroid Build Coastguard Worker   attr_->SetComment(comment);
182*d57664e9SAndroid Build Coastguard Worker   return *this;
183*d57664e9SAndroid Build Coastguard Worker }
184*d57664e9SAndroid Build Coastguard Worker 
AddItem(StringPiece name,uint32_t value)185*d57664e9SAndroid Build Coastguard Worker AttributeBuilder& AttributeBuilder::AddItem(StringPiece name, uint32_t value) {
186*d57664e9SAndroid Build Coastguard Worker   attr_->symbols.push_back(
187*d57664e9SAndroid Build Coastguard Worker       Attribute::Symbol{Reference(ResourceName({}, ResourceType::kId, name)), value});
188*d57664e9SAndroid Build Coastguard Worker   return *this;
189*d57664e9SAndroid Build Coastguard Worker }
190*d57664e9SAndroid Build Coastguard Worker 
AddItemWithComment(StringPiece name,uint32_t value,StringPiece comment)191*d57664e9SAndroid Build Coastguard Worker AttributeBuilder& AttributeBuilder::AddItemWithComment(StringPiece name, uint32_t value,
192*d57664e9SAndroid Build Coastguard Worker                                                        StringPiece comment) {
193*d57664e9SAndroid Build Coastguard Worker   Reference ref(ResourceName({}, ResourceType::kId, name));
194*d57664e9SAndroid Build Coastguard Worker   ref.SetComment(comment);
195*d57664e9SAndroid Build Coastguard Worker   attr_->symbols.push_back(Attribute::Symbol{ref, value});
196*d57664e9SAndroid Build Coastguard Worker   return *this;
197*d57664e9SAndroid Build Coastguard Worker }
198*d57664e9SAndroid Build Coastguard Worker 
Build()199*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Attribute> AttributeBuilder::Build() {
200*d57664e9SAndroid Build Coastguard Worker   return std::move(attr_);
201*d57664e9SAndroid Build Coastguard Worker }
202*d57664e9SAndroid Build Coastguard Worker 
SetParent(StringPiece str)203*d57664e9SAndroid Build Coastguard Worker StyleBuilder& StyleBuilder::SetParent(StringPiece str) {
204*d57664e9SAndroid Build Coastguard Worker   style_->parent = Reference(ParseNameOrDie(str));
205*d57664e9SAndroid Build Coastguard Worker   return *this;
206*d57664e9SAndroid Build Coastguard Worker }
207*d57664e9SAndroid Build Coastguard Worker 
AddItem(StringPiece str,std::unique_ptr<Item> value)208*d57664e9SAndroid Build Coastguard Worker StyleBuilder& StyleBuilder::AddItem(StringPiece str, std::unique_ptr<Item> value) {
209*d57664e9SAndroid Build Coastguard Worker   style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
210*d57664e9SAndroid Build Coastguard Worker   return *this;
211*d57664e9SAndroid Build Coastguard Worker }
212*d57664e9SAndroid Build Coastguard Worker 
AddItem(StringPiece str,const ResourceId & id,std::unique_ptr<Item> value)213*d57664e9SAndroid Build Coastguard Worker StyleBuilder& StyleBuilder::AddItem(StringPiece str, const ResourceId& id,
214*d57664e9SAndroid Build Coastguard Worker                                     std::unique_ptr<Item> value) {
215*d57664e9SAndroid Build Coastguard Worker   AddItem(str, std::move(value));
216*d57664e9SAndroid Build Coastguard Worker   style_->entries.back().key.id = id;
217*d57664e9SAndroid Build Coastguard Worker   return *this;
218*d57664e9SAndroid Build Coastguard Worker }
219*d57664e9SAndroid Build Coastguard Worker 
Build()220*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Style> StyleBuilder::Build() {
221*d57664e9SAndroid Build Coastguard Worker   return std::move(style_);
222*d57664e9SAndroid Build Coastguard Worker }
223*d57664e9SAndroid Build Coastguard Worker 
AddItem(StringPiece str,const std::optional<ResourceId> & id)224*d57664e9SAndroid Build Coastguard Worker StyleableBuilder& StyleableBuilder::AddItem(StringPiece str, const std::optional<ResourceId>& id) {
225*d57664e9SAndroid Build Coastguard Worker   styleable_->entries.push_back(Reference(ParseNameOrDie(str)));
226*d57664e9SAndroid Build Coastguard Worker   styleable_->entries.back().id = id;
227*d57664e9SAndroid Build Coastguard Worker   return *this;
228*d57664e9SAndroid Build Coastguard Worker }
229*d57664e9SAndroid Build Coastguard Worker 
Build()230*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Styleable> StyleableBuilder::Build() {
231*d57664e9SAndroid Build Coastguard Worker   return std::move(styleable_);
232*d57664e9SAndroid Build Coastguard Worker }
233*d57664e9SAndroid Build Coastguard Worker 
BuildXmlDom(StringPiece str)234*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<xml::XmlResource> BuildXmlDom(StringPiece str) {
235*d57664e9SAndroid Build Coastguard Worker   std::string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
236*d57664e9SAndroid Build Coastguard Worker   input.append(str.data(), str.size());
237*d57664e9SAndroid Build Coastguard Worker   StringInputStream in(input);
238*d57664e9SAndroid Build Coastguard Worker   StdErrDiagnostics diag;
239*d57664e9SAndroid Build Coastguard Worker   std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, android::Source("test.xml"));
240*d57664e9SAndroid Build Coastguard Worker   CHECK(doc != nullptr && doc->root != nullptr) << "failed to parse inline XML string";
241*d57664e9SAndroid Build Coastguard Worker   return doc;
242*d57664e9SAndroid Build Coastguard Worker }
243*d57664e9SAndroid Build Coastguard Worker 
BuildXmlDomForPackageName(IAaptContext * context,StringPiece str)244*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<xml::XmlResource> BuildXmlDomForPackageName(IAaptContext* context,
245*d57664e9SAndroid Build Coastguard Worker                                                             StringPiece str) {
246*d57664e9SAndroid Build Coastguard Worker   std::unique_ptr<xml::XmlResource> doc = BuildXmlDom(str);
247*d57664e9SAndroid Build Coastguard Worker   doc->file.name.package = context->GetCompilationPackage();
248*d57664e9SAndroid Build Coastguard Worker   return doc;
249*d57664e9SAndroid Build Coastguard Worker }
250*d57664e9SAndroid Build Coastguard Worker 
SetName(const std::string & name)251*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::SetName(const std::string& name) {
252*d57664e9SAndroid Build Coastguard Worker   artifact_.name = name;
253*d57664e9SAndroid Build Coastguard Worker   return *this;
254*d57664e9SAndroid Build Coastguard Worker }
255*d57664e9SAndroid Build Coastguard Worker 
SetVersion(int version)256*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::SetVersion(int version) {
257*d57664e9SAndroid Build Coastguard Worker   artifact_.version = version;
258*d57664e9SAndroid Build Coastguard Worker   return *this;
259*d57664e9SAndroid Build Coastguard Worker }
260*d57664e9SAndroid Build Coastguard Worker 
AddAbi(configuration::Abi abi)261*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::AddAbi(configuration::Abi abi) {
262*d57664e9SAndroid Build Coastguard Worker   artifact_.abis.push_back(abi);
263*d57664e9SAndroid Build Coastguard Worker   return *this;
264*d57664e9SAndroid Build Coastguard Worker }
265*d57664e9SAndroid Build Coastguard Worker 
AddDensity(const ConfigDescription & density)266*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::AddDensity(const ConfigDescription& density) {
267*d57664e9SAndroid Build Coastguard Worker   artifact_.screen_densities.push_back(density);
268*d57664e9SAndroid Build Coastguard Worker   return *this;
269*d57664e9SAndroid Build Coastguard Worker }
270*d57664e9SAndroid Build Coastguard Worker 
AddLocale(const ConfigDescription & locale)271*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::AddLocale(const ConfigDescription& locale) {
272*d57664e9SAndroid Build Coastguard Worker   artifact_.locales.push_back(locale);
273*d57664e9SAndroid Build Coastguard Worker   return *this;
274*d57664e9SAndroid Build Coastguard Worker }
275*d57664e9SAndroid Build Coastguard Worker 
SetAndroidSdk(int min_sdk)276*d57664e9SAndroid Build Coastguard Worker ArtifactBuilder& ArtifactBuilder::SetAndroidSdk(int min_sdk) {
277*d57664e9SAndroid Build Coastguard Worker   artifact_.android_sdk = {AndroidSdk::ForMinSdk(min_sdk)};
278*d57664e9SAndroid Build Coastguard Worker   return *this;
279*d57664e9SAndroid Build Coastguard Worker }
280*d57664e9SAndroid Build Coastguard Worker 
Build()281*d57664e9SAndroid Build Coastguard Worker configuration::OutputArtifact ArtifactBuilder::Build() {
282*d57664e9SAndroid Build Coastguard Worker   return artifact_;
283*d57664e9SAndroid Build Coastguard Worker }
284*d57664e9SAndroid Build Coastguard Worker 
AddAbiGroup(const std::string & label,std::vector<configuration::Abi> abis)285*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAbiGroup(
286*d57664e9SAndroid Build Coastguard Worker     const std::string& label, std::vector<configuration::Abi> abis) {
287*d57664e9SAndroid Build Coastguard Worker   return AddGroup(label, &config_.abi_groups, std::move(abis));
288*d57664e9SAndroid Build Coastguard Worker }
289*d57664e9SAndroid Build Coastguard Worker 
AddDensityGroup(const std::string & label,std::vector<std::string> densities)290*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDensityGroup(
291*d57664e9SAndroid Build Coastguard Worker     const std::string& label, std::vector<std::string> densities) {
292*d57664e9SAndroid Build Coastguard Worker   std::vector<ConfigDescription> configs;
293*d57664e9SAndroid Build Coastguard Worker   for (const auto& density : densities) {
294*d57664e9SAndroid Build Coastguard Worker     configs.push_back(test::ParseConfigOrDie(density));
295*d57664e9SAndroid Build Coastguard Worker   }
296*d57664e9SAndroid Build Coastguard Worker   return AddGroup(label, &config_.screen_density_groups, configs);
297*d57664e9SAndroid Build Coastguard Worker }
298*d57664e9SAndroid Build Coastguard Worker 
AddLocaleGroup(const std::string & label,std::vector<std::string> locales)299*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddLocaleGroup(
300*d57664e9SAndroid Build Coastguard Worker     const std::string& label, std::vector<std::string> locales) {
301*d57664e9SAndroid Build Coastguard Worker   std::vector<ConfigDescription> configs;
302*d57664e9SAndroid Build Coastguard Worker   for (const auto& locale : locales) {
303*d57664e9SAndroid Build Coastguard Worker     configs.push_back(test::ParseConfigOrDie(locale));
304*d57664e9SAndroid Build Coastguard Worker   }
305*d57664e9SAndroid Build Coastguard Worker   return AddGroup(label, &config_.locale_groups, configs);
306*d57664e9SAndroid Build Coastguard Worker }
307*d57664e9SAndroid Build Coastguard Worker 
AddDeviceFeatureGroup(const std::string & label)308*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddDeviceFeatureGroup(
309*d57664e9SAndroid Build Coastguard Worker     const std::string& label) {
310*d57664e9SAndroid Build Coastguard Worker   return AddGroup(label, &config_.device_feature_groups);
311*d57664e9SAndroid Build Coastguard Worker }
312*d57664e9SAndroid Build Coastguard Worker 
AddGlTextureGroup(const std::string & label)313*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddGlTextureGroup(
314*d57664e9SAndroid Build Coastguard Worker     const std::string& label) {
315*d57664e9SAndroid Build Coastguard Worker   return AddGroup(label, &config_.gl_texture_groups);
316*d57664e9SAndroid Build Coastguard Worker }
317*d57664e9SAndroid Build Coastguard Worker 
AddAndroidSdk(std::string label,int min_sdk)318*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddAndroidSdk(
319*d57664e9SAndroid Build Coastguard Worker     std::string label, int min_sdk) {
320*d57664e9SAndroid Build Coastguard Worker   config_.android_sdks[label] = AndroidSdk::ForMinSdk(min_sdk);
321*d57664e9SAndroid Build Coastguard Worker   return *this;
322*d57664e9SAndroid Build Coastguard Worker }
323*d57664e9SAndroid Build Coastguard Worker 
AddArtifact(configuration::ConfiguredArtifact artifact)324*d57664e9SAndroid Build Coastguard Worker PostProcessingConfigurationBuilder& PostProcessingConfigurationBuilder::AddArtifact(
325*d57664e9SAndroid Build Coastguard Worker     configuration::ConfiguredArtifact artifact) {
326*d57664e9SAndroid Build Coastguard Worker   config_.artifacts.push_back(std::move(artifact));
327*d57664e9SAndroid Build Coastguard Worker   return *this;
328*d57664e9SAndroid Build Coastguard Worker }
329*d57664e9SAndroid Build Coastguard Worker 
Build()330*d57664e9SAndroid Build Coastguard Worker configuration::PostProcessingConfiguration PostProcessingConfigurationBuilder::Build() {
331*d57664e9SAndroid Build Coastguard Worker   return config_;
332*d57664e9SAndroid Build Coastguard Worker }
333*d57664e9SAndroid Build Coastguard Worker 
334*d57664e9SAndroid Build Coastguard Worker }  // namespace test
335*d57664e9SAndroid Build Coastguard Worker }  // namespace aapt
336