Vectors are now exposed as ArrayList<T> in the Java backend even for arguments

and return values to/from methods, they already were inside structures.
In addition vectors of arrays are now properly marshalled when used as arguments
or results to/from methods.

Bug: 32237331, 32180328
Test: hidl_test_java
Change-Id: Ie24f11668f22fc2c31fb7d8e8da534f1c970f58f
diff --git a/VectorType.cpp b/VectorType.cpp
index f656281..d7eb581 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -59,10 +59,18 @@
 
 std::string VectorType::getJavaType(
         std::string *extra, bool /* forInitializer */) const {
-    *extra = "[]";
+    extra->clear();
 
     std::string elementExtra;
-    return mElementType->getJavaType(&elementExtra) + elementExtra;
+    std::string elementJavaType = mElementType->getJavaType(&elementExtra);
+
+    CHECK(mElementType->isArray() || elementExtra.empty());
+
+    return "ArrayList<"
+        + (mElementType->isArray()
+                ? elementJavaType : mElementType->getJavaWrapperType())
+        + elementExtra
+        + ">";
 }
 
 std::string VectorType::getVtsType() const {
@@ -341,6 +349,50 @@
         return;
     }
 
+    if (mElementType->isArray()) {
+        if (isReader) {
+            std::string extra;
+            out << " new "
+                << getJavaType(&extra, false /* forInitializer */)
+                << "();\n";
+        }
+
+        out << "{\n";
+        out.indent();
+
+        out << "HwBlob _hidl_blob = ";
+
+        if (isReader) {
+            out << parcelObj
+                << ".readBuffer();\n";
+        } else {
+            size_t align, size;
+            getAlignmentAndSize(&align, &size);
+
+            out << "new HwBlob("
+                << size
+                << " /* size */);\n";
+        }
+
+        emitJavaFieldReaderWriter(
+                out,
+                0 /* depth */,
+                parcelObj,
+                "_hidl_blob",
+                argName,
+                "0 /* offset */",
+                isReader);
+
+        if (!isReader) {
+            out << parcelObj << ".writeBuffer(_hidl_blob);\n";
+        };
+
+        out.unindent();
+        out << "}\n";
+
+        return;
+    }
+
     emitJavaReaderWriterWithSuffix(
             out,
             parcelObj,
@@ -353,19 +405,15 @@
 void VectorType::emitJavaFieldInitializer(
         Formatter &out, const std::string &fieldName) const {
     std::string extra;
-    mElementType->getJavaType(&extra);
+    std::string javaType = getJavaType(&extra, false /* forInitializer */);
 
-    const std::string wrapperType = mElementType->getJavaWrapperType();
-
-    out << "final ArrayList<"
-        << wrapperType
-        << extra
-        << "> "
+    out << "final "
+        << javaType
+        << " "
         << fieldName
-        << " = new ArrayList<"
-        << wrapperType
-        << extra
-        << ">();\n";
+        << " = new "
+        << javaType
+        << "();\n";
 }
 
 void VectorType::emitJavaFieldReaderWriter(
@@ -450,16 +498,8 @@
                 iteratorName + " * " + std::to_string(elementSize),
                 true /* isReader */);
 
-        out << fieldName;
-
-        if (elementType->isArray()
-                && static_cast<const ArrayType *>(
-                    elementType)->getElementType()->resolveToScalarType()
-                        != nullptr) {
-            out << ".add(HwBlob.wrapArray(_hidl_vec_element));\n";
-        } else {
-            out << ".add(_hidl_vec_element);\n";
-        }
+        out << fieldName
+            << ".add(_hidl_vec_element);\n";
 
         out.unindent();
 
@@ -577,6 +617,10 @@
         return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
     }
 
+    if (mElementType->isVector()) {
+        return false;
+    }
+
     return true;
 }