Add matrix.kernel.level.

Indicates at which level is the kernel requirement from.

Also fix tests now that matrix.kernel.level is serialized.

Bug: 139309488
Test: vintf_object_test
Test: libvintf_test

Change-Id: Ic65b0a2a95a2311b480753a139f3029e87848786
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 9b2da7f..e42f9f7 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -656,6 +656,10 @@
         }
         appendAttr(root, "version", kv);
 
+        if (kernel.getSourceMatrixLevel() != Level::UNSPECIFIED) {
+            appendAttr(root, "level", kernel.getSourceMatrixLevel());
+        }
+
         if (!kernel.mConditions.empty()) {
             appendChild(root, matrixKernelConditionsConverter(kernel.mConditions, d));
         }
@@ -664,12 +668,15 @@
         }
     }
     bool buildObject(MatrixKernel* object, NodeType* root, std::string* error) const override {
+        Level sourceMatrixLevel = Level::UNSPECIFIED;
         if (!parseAttr(root, "version", &object->mMinLts, error) ||
+            !parseOptionalAttr(root, "level", Level::UNSPECIFIED, &sourceMatrixLevel, error) ||
             !parseOptionalChild(root, matrixKernelConditionsConverter, {}, &object->mConditions,
                                 error) ||
             !parseChildren(root, matrixKernelConfigConverter, &object->mConfigs, error)) {
             return false;
         }
+        object->setSourceMatrixLevel(sourceMatrixLevel);
         return true;
     }
 };