Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 832528f9 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Fix replacement-after-add of resource files in overlay.

Aapt was adding/removing elements from a list an continuing to use a stale copy for future indexes.
This could cause incorrect subsequent processing.  Add an en resource and modify an es, for example.
Adding the en would cause the base fileset's es version to be moved in the list.  Using the old index
we'd then attempt to remove the old es version with the wrong index and then add the new es version
generating a "duplicate file" error.

bug: 2090015
parent 3e59cf7e
Loading
Loading
Loading
Loading
+45 −19
Original line number Diff line number Diff line
@@ -428,10 +428,15 @@ static void checkForIds(const String8& path, ResXMLParser& parser)
    }
}

static bool applyFileOverlay(const sp<AaptAssets>& assets,
static bool applyFileOverlay(Bundle *bundle,
                             const sp<AaptAssets>& assets,
                             const sp<ResourceTypeSet>& baseSet,
                             const char *resType)
{
    if (bundle->getVerbose()) {
        printf("applyFileOverlay for %s\n", resType);
    }

    // Replace any base level files in this category with any found from the overlay
    // Also add any found only in the overlay.
    sp<AaptAssets> overlay = assets->getOverlay();
@@ -450,6 +455,9 @@ static bool applyFileOverlay(const sp<AaptAssets>& assets,
            // non-overlay "baseset".
            size_t overlayCount = overlaySet->size();
            for (size_t overlayIndex=0; overlayIndex<overlayCount; overlayIndex++) {
                if (bundle->getVerbose()) {
                    printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).string());
                }
                size_t baseIndex = baseSet->indexOfKey(overlaySet->keyAt(overlayIndex));
                if (baseIndex < UNKNOWN_ERROR) {
                    // look for same flavor.  For a given file (strings.xml, for example)
@@ -458,17 +466,35 @@ static bool applyFileOverlay(const sp<AaptAssets>& assets,
                    sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex);
                    sp<AaptGroup> baseGroup = baseSet->valueAt(baseIndex);

                    DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles = 
                            baseGroup->getFiles();
                    DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles =
                            overlayGroup->getFiles();
                    if (bundle->getVerbose()) {
                        DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles =
                                baseGroup->getFiles();
                        for (size_t i=0; i < baseFiles.size(); i++) {
                            printf("baseFile %d has flavor %s\n", i,
                                    baseFiles.keyAt(i).toString().string());
                        }
                        for (size_t i=0; i < overlayFiles.size(); i++) {
                            printf("overlayFile %d has flavor %s\n", i,
                                    overlayFiles.keyAt(i).toString().string());
                        }
                    }

                    size_t overlayGroupSize = overlayFiles.size();
                    for (size_t overlayGroupIndex = 0;
                            overlayGroupIndex<overlayGroupSize;
                            overlayGroupIndex++) {
                        size_t baseFileIndex =
                                baseFiles.indexOfKey(overlayFiles.keyAt(overlayGroupIndex));
                                baseGroup->getFiles().indexOfKey(overlayFiles.
                                keyAt(overlayGroupIndex));
                        if(baseFileIndex < UNKNOWN_ERROR) {
                            if (bundle->getVerbose()) {
                                printf("found a match (%d) for overlay file %s, for flavor %s\n",
                                        baseFileIndex,
                                        overlayGroup->getLeaf().string(),
                                        overlayFiles.keyAt(overlayGroupIndex).toString().string());
                            }
                            baseGroup->removeFile(baseFileIndex);
                        } else {
                            // didn't find a match fall through and add it..
@@ -623,13 +649,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
        current = current->getOverlay();
    }
    // apply the overlay files to the base set
    if (!applyFileOverlay(assets, drawables, "drawable") ||
            !applyFileOverlay(assets, layouts, "layout") ||
            !applyFileOverlay(assets, anims, "anim") ||
            !applyFileOverlay(assets, xmls, "xml") ||
            !applyFileOverlay(assets, raws, "raw") ||
            !applyFileOverlay(assets, colors, "color") ||
            !applyFileOverlay(assets, menus, "menu")) {
    if (!applyFileOverlay(bundle, assets, drawables, "drawable") ||
            !applyFileOverlay(bundle, assets, layouts, "layout") ||
            !applyFileOverlay(bundle, assets, anims, "anim") ||
            !applyFileOverlay(bundle, assets, xmls, "xml") ||
            !applyFileOverlay(bundle, assets, raws, "raw") ||
            !applyFileOverlay(bundle, assets, colors, "color") ||
            !applyFileOverlay(bundle, assets, menus, "menu")) {
        return UNKNOWN_ERROR;
    }