Java support for passing vec<STRUCT-TYPE> and STRUCT-TYPE[] to and from methods.

Bug: 31380705
Change-Id: I7374538d0bc2b3562c997710bfa4ed1f95950589
diff --git a/VectorType.cpp b/VectorType.cpp
index 910bc39..05d18ed 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -57,10 +57,6 @@
     return mElementType->getJavaType() + "[]";
 }
 
-std::string VectorType::getJavaSuffix() const {
-    return mElementType->getJavaSuffix() + "Vector";
-}
-
 void VectorType::emitReaderWriter(
         Formatter &out,
         const std::string &name,
@@ -182,6 +178,38 @@
     out << "}\n\n";
 }
 
+void VectorType::emitJavaReaderWriter(
+        Formatter &out,
+        const std::string &parcelObj,
+        const std::string &argName,
+        bool isReader) const {
+    if (mElementType->isCompoundType()) {
+        if (isReader) {
+            out << mElementType->getJavaType()
+                << ".readVectorFromParcel("
+                << parcelObj
+                << ");\n";
+        } else {
+            out << mElementType->getJavaType()
+                << ".writeVectorToParcel("
+                << parcelObj
+                << ", "
+                << argName
+                << ");\n";
+        }
+
+        return;
+    }
+
+    emitJavaReaderWriterWithSuffix(
+            out,
+            parcelObj,
+            argName,
+            isReader,
+            mElementType->getJavaSuffix() + "Vector",
+            "" /* extra */);
+}
+
 void VectorType::emitJavaFieldInitializer(
         Formatter &out, const std::string &fieldName) const {
     out << "final Vector<"
@@ -197,6 +225,18 @@
         const std::string &fieldName,
         const std::string &offset,
         bool isReader) const {
+    VectorType::EmitJavaFieldReaderWriterForElementType(
+            out, mElementType, blobName, fieldName, offset, isReader);
+}
+
+// static
+void VectorType::EmitJavaFieldReaderWriterForElementType(
+        Formatter &out,
+        const Type *elementType,
+        const std::string &blobName,
+        const std::string &fieldName,
+        const std::string &offset,
+        bool isReader) {
     if (isReader) {
         out << "{\n";
         out.indent();
@@ -225,12 +265,12 @@
 
         out.indent();
 
-        mElementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
+        elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
 
         size_t elementAlign, elementSize;
-        mElementType->getAlignmentAndSize(&elementAlign, &elementSize);
+        elementType->getAlignmentAndSize(&elementAlign, &elementSize);
 
-        mElementType->emitJavaFieldReaderWriter(
+        elementType->emitJavaFieldReaderWriter(
                 out,
                 "childBlob",
                 "_hidl_vec_element",
@@ -268,7 +308,7 @@
         << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
 
     size_t elementAlign, elementSize;
-    mElementType->getAlignmentAndSize(&elementAlign, &elementSize);
+    elementType->getAlignmentAndSize(&elementAlign, &elementSize);
 
     // XXX make HwBlob constructor take a long instead of an int?
     out << "HwBlob childBlob = new HwBlob((int)(_hidl_vec_size * "
@@ -280,7 +320,7 @@
 
     out.indent();
 
-    mElementType->emitJavaFieldReaderWriter(
+    elementType->emitJavaFieldReaderWriter(
             out,
             "childBlob",
             fieldName + ".elementAt(_hidl_index)",