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

Commit 10f8f111 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 23341 into eclair

* changes:
  Fix replacement-after-add of resource files in overlay.
parents f66e2e24 832528f9
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;
    }