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

Commit cf1f1d91 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

AAPT: Version <adaptive-icon> to v26

Bug: 35908647
Test: manual
Change-Id: Ic8f43efe34385192fbab18675eb5898ed80912a5
parent 3ab5c017
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -1403,7 +1403,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
            String8 src = it.getFile()->getPrintableSource();
            err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
                    it.getFile(), &table, xmlFlags);
            if (err == NO_ERROR) {
            // Only verify IDs if there was no error and the file is non-empty.
            if (err == NO_ERROR && it.getFile()->hasData()) {
                ResXMLTree block;
                block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
                checkForIds(src, block);
@@ -1550,7 +1551,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
            String8 src = it.getFile()->getPrintableSource();
            err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
                    it.getFile(), &table, xmlFlags);
            if (err == NO_ERROR) {
            if (err == NO_ERROR && it.getFile()->hasData()) {
                ResXMLTree block;
                block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
                checkForIds(src, block);
@@ -1598,7 +1599,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
        err = compileXmlFile(bundle, assets, workItem.resourceName, workItem.xmlRoot,
                             workItem.file, &table, xmlCompilationFlags);

        if (err == NO_ERROR) {
        if (err == NO_ERROR && workItem.file->hasData()) {
            assets->addResource(workItem.resPath.getPathLeaf(),
                                workItem.resPath,
                                workItem.file,
+82 −0
Original line number Diff line number Diff line
@@ -78,6 +78,17 @@ status_t compileXmlFile(const Bundle* bundle,
                        ResourceTable* table,
                        int options)
{
    if (table->versionForCompat(bundle, resourceName, target, root)) {
        // The file was versioned, so stop processing here.
        // The resource entry has already been removed and the new one added.
        // Remove the assets entry.
        sp<AaptDir> resDir = assets->getDirs().valueFor(String8("res"));
        sp<AaptDir> dir = resDir->getDirs().valueFor(target->getGroupEntry().toDirName(
                target->getResourceType()));
        dir->removeFile(target->getPath().getPathLeaf());
        return NO_ERROR;
    }

    if ((options&XML_COMPILE_STRIP_WHITESPACE) != 0) {
        root->removeWhitespace(true, NULL);
    } else  if ((options&XML_COMPILE_COMPACT_WHITESPACE) != 0) {
@@ -4758,6 +4769,77 @@ static bool IsTransitionElement(const String16& name) {
    return false;
}

bool ResourceTable::versionForCompat(const Bundle* bundle, const String16& resourceName,
                                         const sp<AaptFile>& target, const sp<XMLNode>& root) {
    XMLNode* node = root.get();
    while (node->getType() != XMLNode::TYPE_ELEMENT) {
        // We're assuming the root element is what we're looking for, which can only be under a
        // bunch of namespace declarations.
        if (node->getChildren().size() != 1) {
          // Not sure what to do, bail.
          return false;
        }
        node = node->getChildren().itemAt(0).get();
    }

    if (node->getElementNamespace().size() != 0) {
        // Not something we care about.
        return false;
    }

    int versionedSdk = 0;
    if (node->getElementName() == String16("adaptive-icon")) {
        versionedSdk = SDK_O;
    }

    const int minSdkVersion = getMinSdkVersion(bundle);
    const ConfigDescription config(target->getGroupEntry().toParams());
    if (versionedSdk <= minSdkVersion || versionedSdk <= config.sdkVersion) {
        return false;
    }

    sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()),
            String16(target->getResourceType()), resourceName);
    if (!shouldGenerateVersionedResource(cl, config, versionedSdk)) {
        return false;
    }

    // Remove the original entry.
    cl->removeEntry(config);

    // We need to wholesale version this file.
    ConfigDescription newConfig(config);
    newConfig.sdkVersion = versionedSdk;
    sp<AaptFile> newFile = new AaptFile(target->getSourceFile(),
            AaptGroupEntry(newConfig), target->getResourceType());
    String8 resPath = String8::format("res/%s/%s.xml",
            newFile->getGroupEntry().toDirName(target->getResourceType()).string(),
            String8(resourceName).string());
    resPath.convertToResPath();

    // Add a resource table entry.
    addEntry(SourcePos(),
            String16(mAssets->getPackage()),
            String16(target->getResourceType()),
            resourceName,
            String16(resPath),
            NULL,
            &newConfig);

    // Schedule this to be compiled.
    CompileResourceWorkItem item;
    item.resourceName = resourceName;
    item.resPath = resPath;
    item.file = newFile;
    item.xmlRoot = root->clone();
    item.needsCompiling = false;    // This step occurs after we parse/assign, so we don't need
                                    // to do it again.
    mWorkQueue.push(item);

    // Now mark the old entry as deleted.
    return true;
}

status_t ResourceTable::modifyForCompat(const Bundle* bundle,
                                        const String16& resourceName,
                                        const sp<AaptFile>& target,
+7 −0
Original line number Diff line number Diff line
@@ -203,6 +203,9 @@ public:
    size_t numLocalResources() const;
    bool hasResources() const;

    bool versionForCompat(const Bundle* bundle, const String16& resourceName,
                          const sp<AaptFile>& file, const sp<XMLNode>& root);

    status_t modifyForCompat(const Bundle* bundle);
    status_t modifyForCompat(const Bundle* bundle,
                             const String16& resourceName,
@@ -431,6 +434,10 @@ public:
            mEntries.add(config, entry);
        }
        
        void removeEntry(const ResTable_config& config) {
            mEntries.removeItem(config);
        }

        const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; }
    private:
        const String16 mName;