X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/d0c4b8109ffb0ad08dcbf29203c71af10715fd87..8ec55f9174b7a620ecde564fb29e9e5a1296df01:/Resource.cpp?ds=sidebyside diff --git a/Resource.cpp b/Resource.cpp index fd6ddb5..b2bd9ff 100644 --- a/Resource.cpp +++ b/Resource.cpp @@ -433,11 +433,73 @@ static void checkForIds(const String8& path, ResXMLParser& parser) } } +static void applyFileOverlay(const sp& assets, + const sp& baseSet, + const char *resType) +{ + // Replace any base level files in this category with any found from the overlay + // Also add any found only in the overlay. + sp overlay = assets->getOverlay(); + String8 resTypeString(resType); + + // work through the linked list of overlays + while (overlay.get()) { + KeyedVector >* overlayRes = overlay->getResources(); + + // get the overlay resources of the requested type + ssize_t index = overlayRes->indexOfKey(resTypeString); + if (index >= 0) { + sp overlaySet = overlayRes->valueAt(index); + + // for each of the resources, check for a match in the previously built + // non-overlay "baseset". + size_t overlayCount = overlaySet->size(); + for (size_t overlayIndex=0; overlayIndexindexOfKey(overlaySet->keyAt(overlayIndex)); + if (baseIndex != UNKNOWN_ERROR) { + // look for same flavor. For a given file (strings.xml, for example) + // there may be a locale specific or other flavors - we want to match + // the same flavor. + sp overlayGroup = overlaySet->valueAt(overlayIndex); + sp baseGroup = baseSet->valueAt(baseIndex); + + DefaultKeyedVector > baseFiles = + baseGroup->getFiles(); + DefaultKeyedVector > overlayFiles = + overlayGroup->getFiles(); + size_t overlayGroupSize = overlayFiles.size(); + for (size_t overlayGroupIndex = 0; + overlayGroupIndexremoveFile(baseFileIndex); + } else { + // didn't find a match fall through and add it.. + } + baseGroup->addFile(overlayFiles.valueAt(overlayGroupIndex)); + } + } else { + // this group doesn't exist (a file that's only in the overlay) + // add it + baseSet->add(overlaySet->keyAt(overlayIndex), + overlaySet->valueAt(overlayIndex)); + } + } + // this overlay didn't have resources for this type + } + // try next overlay + overlay = overlay->getOverlay(); + } + return; +} + #define ASSIGN_IT(n) \ do { \ - ssize_t index = resources.indexOfKey(String8(#n)); \ + ssize_t index = resources->indexOfKey(String8(#n)); \ if (index >= 0) { \ - n ## s = resources.valueAt(index); \ + n ## s = resources->valueAt(index); \ } \ } while (0) @@ -468,18 +530,16 @@ status_t buildResources(Bundle* bundle, const sp& assets) NOISY(printf("Found %d included resource packages\n", (int)table.size())); - sp res = assets->getDirs().valueFor(String8("res")); - // -------------------------------------------------------------- // First, gather all resource information. // -------------------------------------------------------------- // resType -> leafName -> group - KeyedVector > resources; - collect_files(assets, &resources); + KeyedVector > *resources = + new KeyedVector >; + collect_files(assets, resources); sp drawables; - sp valuess; sp layouts; sp anims; sp xmls; @@ -492,10 +552,28 @@ status_t buildResources(Bundle* bundle, const sp& assets) ASSIGN_IT(anim); ASSIGN_IT(xml); ASSIGN_IT(raw); - ASSIGN_IT(values); ASSIGN_IT(color); ASSIGN_IT(menu); + assets->setResources(resources); + // now go through any resource overlays and collect their files + sp current = assets->getOverlay(); + while(current.get()) { + KeyedVector > *resources = + new KeyedVector >; + current->setResources(resources); + collect_files(current, resources); + current = current->getOverlay(); + } + // apply the overlay files to the base set + 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"); + bool hasErrors = false; if (drawables != NULL) { @@ -538,17 +616,26 @@ status_t buildResources(Bundle* bundle, const sp& assets) } } - if (valuess != NULL) { - ResourceDirIterator it(valuess, String8("values")); - ssize_t res; - while ((res=it.next()) == NO_ERROR) { - sp file = it.getFile(); - - res = compileResourceFile(bundle, assets, file, it.getParams(), &table); - if (res != NO_ERROR) { - hasErrors = true; + // compile resources + current = assets; + while(current.get()) { + KeyedVector > *resources = + current->getResources(); + + ssize_t index = resources->indexOfKey(String8("values")); + if (index >= 0) { + ResourceDirIterator it(resources->valueAt(index), String8("values")); + ssize_t res; + while ((res=it.next()) == NO_ERROR) { + sp file = it.getFile(); + res = compileResourceFile(bundle, assets, file, it.getParams(), + (current!=assets), &table); + if (res != NO_ERROR) { + hasErrors = true; + } } } + current = current->getOverlay(); } if (colors != NULL) {