Add per-named-item overlay ability in res xml.

Fixes 1899451.
Also errors out if you add a bag via an overlay (which would renumber
resources).  Note that you can still add elements within the bag as they are
not issued resource IDs.  So for example you can now modify the framework
themes.xml file without copying the entire file.

All bag types are now modifable except non-named bag types (how would you
address which element to replace?):
    array
    string_array
    integer_array
This commit is contained in:
Robert Greenwalt
2009-06-05 15:59:15 -07:00
parent 5d16ac5eb6
commit 1aa8170e6a
2 changed files with 17 additions and 5 deletions

View File

@ -729,6 +729,7 @@ status_t compileResourceFile(Bundle* bundle,
String16 curType;
int32_t curFormat = ResTable_map::TYPE_ANY;
bool curIsBag = false;
bool curIsBagReplaceOnOverwrite = false;
bool curIsStyled = false;
bool curIsPseudolocalizable = false;
bool localHasErrors = false;
@ -1171,6 +1172,7 @@ status_t compileResourceFile(Bundle* bundle,
curTag = &array16;
curType = array16;
curIsBag = true;
curIsBagReplaceOnOverwrite = true;
ssize_t formatIdx = block.indexOfAttribute(NULL, "format");
if (formatIdx >= 0) {
String16 formatStr = String16(block.getAttributeStringValue(
@ -1189,12 +1191,14 @@ status_t compileResourceFile(Bundle* bundle,
curType = array16;
curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING;
curIsBag = true;
curIsBagReplaceOnOverwrite = true;
curIsPseudolocalizable = true;
} else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) {
curTag = &integer_array16;
curType = array16;
curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER;
curIsBag = true;
curIsBagReplaceOnOverwrite = true;
} else {
SourcePos(in->getPrintableSource(), block.getLineNumber()).error(
"Found tag %s where item is expected\n",
@ -1229,9 +1233,10 @@ status_t compileResourceFile(Bundle* bundle,
}
if (!localHasErrors) {
err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
myPackage, curType, ident, parentIdent, &curParams,
overwrite);
err = outTable->startBag(SourcePos(in->getPrintableSource(),
block.getLineNumber()), myPackage, curType, ident,
parentIdent, &curParams,
overwrite, curIsBagReplaceOnOverwrite);
if (err != NO_ERROR) {
hasErrors = localHasErrors = true;
}
@ -1529,6 +1534,7 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos,
const String16& name,
const String16& bagParent,
const ResTable_config* params,
bool overlay,
bool replace, bool isId)
{
status_t result = NO_ERROR;
@ -1549,6 +1555,11 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos,
sourcePos.file.striing(), sourcePos.line, String8(type).string());
}
#endif
if (overlay && !hasBagOrEntry(package, type, name)) {
sourcePos.error("Can't add new bags in an overlay. See '%s'\n",
String8(name).string());
return UNKNOWN_ERROR;
}
sp<Entry> e = getEntry(package, type, name, sourcePos, params);
if (e == NULL) {
@ -1571,7 +1582,7 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos,
return result;
}
if (replace) {
if (overlay && replace) {
return e->emptyBag(sourcePos);
}
return result;

View File

@ -96,6 +96,7 @@ public:
const String16& name,
const String16& bagParent,
const ResTable_config* params = NULL,
bool overlay = false,
bool replace = false,
bool isId = false);