Add <conditions> to <kernel> in framework compat mat

When <conditions> are present, the <kernel> tag is only
checked when all conditions are met. This is to support
arch-specific kernel config requirements.

Test: libvintf_test
Bug: 64124223
Change-Id: I91ecd115ca42473b79bda24d9b8613eed817e7e2
Merged-In: I91ecd115ca42473b79bda24d9b8613eed817e7e2
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 3c840da..152c441 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -549,14 +549,31 @@
 
 const MatrixHalConverter matrixHalConverter{};
 
+struct MatrixKernelConditionsConverter : public XmlNodeConverter<std::vector<KernelConfig>> {
+    std::string elementName() const override { return "conditions"; }
+    void mutateNode(const std::vector<KernelConfig>& conds, NodeType* root,
+                    DocType* d) const override {
+        appendChildren(root, kernelConfigConverter, conds, d);
+    }
+    bool buildObject(std::vector<KernelConfig>* object, NodeType* root) const override {
+        return parseChildren(root, kernelConfigConverter, object);
+    }
+};
+
+const MatrixKernelConditionsConverter matrixKernelConditionsConverter{};
+
 struct MatrixKernelConverter : public XmlNodeConverter<MatrixKernel> {
     std::string elementName() const override { return "kernel"; }
     void mutateNode(const MatrixKernel &kernel, NodeType *root, DocType *d) const override {
         appendAttr(root, "version", kernel.mMinLts);
+        if (!kernel.mConditions.empty()) {
+            appendChild(root, matrixKernelConditionsConverter(kernel.mConditions, d));
+        }
         appendChildren(root, kernelConfigConverter, kernel.mConfigs, d);
     }
     bool buildObject(MatrixKernel *object, NodeType *root) const override {
         if (!parseAttr(root, "version", &object->mMinLts) ||
+            !parseOptionalChild(root, matrixKernelConditionsConverter, {}, &object->mConditions) ||
             !parseChildren(root, kernelConfigConverter, &object->mConfigs)) {
             return false;
         }