]> git.saurik.com Git - android/aapt.git/commitdiff
AI 144413: am: CL 144342 Fix bag (string-array,etc) behavior with overlays.
authorRobert Greenwalt <>
Fri, 3 Apr 2009 06:36:26 +0000 (23:36 -0700)
committerThe Android Open Source Project <initial-contribution@android.com>
Fri, 3 Apr 2009 06:36:26 +0000 (23:36 -0700)
  We used to replace elements in the default with elements from
  the overlay.  This change causes us to empty the array first
  so if the overlay array is smaller we don't end up with elements
  from the default array showing through at the end of the array.
  Ex: [A,B,C] and overlay [D] should give [D] but used to give
  [D,B,C].
  Original author: rgreenwalt

Automated import of CL 144413

ResourceTable.cpp
ResourceTable.h

index 6f71a1ed0d46947cdaf21cf81da1fe85b7e2c531..6e522a2c74c80a71b367e1f9a594e2897b1bf8b4 100644 (file)
@@ -1109,7 +1109,8 @@ status_t compileResourceFile(Bundle* bundle,
 
                 if (!localHasErrors) {
                     err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
 
                 if (!localHasErrors) {
                     err = outTable->startBag(SourcePos(in->getPrintableSource(), block.getLineNumber()),
-                                             myPackage, curType, ident, parentIdent, &curParams);
+                                             myPackage, curType, ident, parentIdent, &curParams, 
+                                             overwrite);
                     if (err != NO_ERROR) {
                         hasErrors = localHasErrors = true;
                     }
                     if (err != NO_ERROR) {
                         hasErrors = localHasErrors = true;
                     }
@@ -1409,6 +1410,8 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos,
                                  const ResTable_config* params,
                                  bool replace, bool isId)
 {
                                  const ResTable_config* params,
                                  bool replace, bool isId)
 {
+    status_t result = NO_ERROR;
+
     // Check for adding entries in other packages...  for now we do
     // nothing.  We need to do the right thing here to support skinning.
     uint32_t rid = mAssets->getIncludedResources()
     // Check for adding entries in other packages...  for now we do
     // nothing.  We need to do the right thing here to support skinning.
     uint32_t rid = mAssets->getIncludedResources()
@@ -1442,8 +1445,12 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos,
         }
         e->setParent(bagParent);
     }
         }
         e->setParent(bagParent);
     }
-    
-    return e->makeItABag(sourcePos);
+
+    if ((result = e->makeItABag(sourcePos)) != NO_ERROR) {
+        return result;
+    }
+    return e->emptyBag(sourcePos);
 }
 
 status_t ResourceTable::addBag(const SourcePos& sourcePos,
 }
 
 status_t ResourceTable::addBag(const SourcePos& sourcePos,
@@ -2798,6 +2805,17 @@ status_t ResourceTable::Entry::addToBag(const SourcePos& sourcePos,
     return NO_ERROR;
 }
 
     return NO_ERROR;
 }
 
+status_t ResourceTable::Entry::emptyBag(const SourcePos& sourcePos)
+{
+    status_t err = makeItABag(sourcePos);
+    if (err != NO_ERROR) {
+        return err;
+    }
+
+    mBag.clear();
+    return NO_ERROR;
+}
+
 status_t ResourceTable::Entry::generateAttributes(ResourceTable* table,
                                                   const String16& package)
 {
 status_t ResourceTable::Entry::generateAttributes(ResourceTable* table,
                                                   const String16& package)
 {
index e8fbd9b7b7c75538e9d9f13d3e6cf8bdaaeb43c1..74ba326c2bf3c6969f29c705c6407f6ca93860cc 100644 (file)
@@ -254,7 +254,9 @@ public:
         String16 getParent() const { return mParent; }
 
         status_t makeItABag(const SourcePos& sourcePos);
         String16 getParent() const { return mParent; }
 
         status_t makeItABag(const SourcePos& sourcePos);
-        
+
+        status_t emptyBag(const SourcePos& sourcePos);
         status_t setItem(const SourcePos& pos,
                          const String16& value,
                          const Vector<StringPool::entry_style_span>* style = NULL,
         status_t setItem(const SourcePos& pos,
                          const String16& value,
                          const Vector<StringPool::entry_style_span>* style = NULL,