From fb48d292d9eb78a73f9473d90911ecb81da5fffd Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Sat, 7 Nov 2015 15:52:13 -0800 Subject: AAPT2: Add support for overlays when merging resources Change-Id: Iea9e41123cf89e3cfba7eb6bea89def56dee8093 --- tools/aapt2/ResourceTable.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'tools/aapt2/ResourceTable.cpp') diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp index deafe206910d..73d85852b2b0 100644 --- a/tools/aapt2/ResourceTable.cpp +++ b/tools/aapt2/ResourceTable.cpp @@ -190,22 +190,32 @@ static constexpr const char16_t* kValidNameMangledChars = u"._-$"; bool ResourceTable::addResource(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr value, IDiagnostics* diag) { - return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, diag); + return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, + resolveValueCollision, diag); } bool ResourceTable::addResource(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr value, IDiagnostics* diag) { - return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, diag); + return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, + resolveValueCollision, diag); } bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, IDiagnostics* diag) { + return addFileReference(name, config, source, path, resolveValueCollision, diag); +} + +bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, + const Source& source, const StringPiece16& path, + std::function conflictResolver, + IDiagnostics* diag) { std::unique_ptr fileRef = util::make_unique( stringPool.makeRef(path)); fileRef->setSource(source); - return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, diag); + return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, + conflictResolver, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, @@ -213,7 +223,7 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, std::unique_ptr value, IDiagnostics* diag) { return addResourceImpl(name, ResourceId{}, config, std::move(value), kValidNameMangledChars, - diag); + resolveValueCollision, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, @@ -221,12 +231,17 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr value, IDiagnostics* diag) { - return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, diag); + return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, + resolveValueCollision, diag); } -bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceId resId, - const ConfigDescription& config, std::unique_ptr value, - const char16_t* validChars, IDiagnostics* diag) { +bool ResourceTable::addResourceImpl(const ResourceNameRef& name, + const ResourceId resId, + const ConfigDescription& config, + std::unique_ptr value, + const char16_t* validChars, + std::function conflictResolver, + IDiagnostics* diag) { assert(value && "value can't be nullptr"); assert(diag && "diagnostics can't be nullptr"); @@ -289,7 +304,7 @@ bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceI // This resource did not exist before, add it. entry->values.insert(iter, ResourceConfigValue{ config, std::move(value) }); } else { - int collisionResult = resolveValueCollision(iter->value.get(), value.get()); + int collisionResult = conflictResolver(iter->value.get(), value.get()); if (collisionResult > 0) { // Take the incoming value. iter->value = std::move(value); -- cgit v1.2.3