Convert libmojo Java from Android.mk to use Android.bp

Bug: 27569341
Test: mmma -j32 external/libmojo
Change-Id: I71a9cf98c210ddcc2cce53945ff0ebd2a608aaf6
diff --git a/Android.bp b/Android.bp
index 0b715dc..c7b5282 100644
--- a/Android.bp
+++ b/Android.bp
@@ -62,7 +62,6 @@
     host_supported: true,
 }
 
-// TODO(risan): Generate java out.
 genrule {
     name: "libmojo_mojom_headers",
     cmd: "$(location mojom_source_generator_sh)" +
@@ -395,3 +394,94 @@
 
     export_include_dirs: ["."],
 }
+
+genrule {
+    name: "libmojo_mojom_java_srcs",
+    cmd: "$(location mojom_source_generator_sh)" +
+    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
+    "    --package=external/libmojo" +
+    "    --output_dir=$(genDir)" +
+    "    --bytecode_path=$(genDir)" +
+    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
+    "    --generators=java" +
+    "    --use_new_wrapper_types" +
+    "    $(in)",
+
+    tools: [
+        "mojom_bindings_generator",
+        "mojom_source_generator_sh",
+    ],
+
+    tool_files: [
+        // This file was copied from out/Release in a Chrome checkout.
+        // TODO(lhchavez): Generate this file instead of hardcoding it.
+        "gen/mojo/common/common_custom_types__type_mappings",
+    ],
+
+    srcs: [":libmojo_mojom_files"],
+
+    out: [
+        "src/org/chromium/gfx/mojom/InsetsF.java",
+        "src/org/chromium/gfx/mojom/Insets.java",
+        "src/org/chromium/gfx/mojom/PointF.java",
+        "src/org/chromium/gfx/mojom/Point.java",
+        "src/org/chromium/gfx/mojom/RangeF.java",
+        "src/org/chromium/gfx/mojom/Range.java",
+        "src/org/chromium/gfx/mojom/RectF.java",
+        "src/org/chromium/gfx/mojom/Rect.java",
+        "src/org/chromium/gfx/mojom/SizeF.java",
+        "src/org/chromium/gfx/mojom/Size.java",
+        "src/org/chromium/gfx/mojom/Vector2dF.java",
+        "src/org/chromium/gfx/mojom/Vector2d.java",
+        "src/org/chromium/IPC/mojom/ChannelBootstrap_Internal.java",
+        "src/org/chromium/IPC/mojom/ChannelBootstrap.java",
+        "src/org/chromium/IPC/mojom/Channel_Internal.java",
+        "src/org/chromium/IPC/mojom/Channel.java",
+        "src/org/chromium/IPC/mojom/GenericInterface_Internal.java",
+        "src/org/chromium/IPC/mojom/GenericInterface.java",
+        "src/org/chromium/IPC/mojom/IpcConstants.java",
+        "src/org/chromium/IPC/mojom/SerializedHandle.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/FlushForTesting.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/InterfaceControlMessagesConstants.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersion.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersionResult.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RequireVersion.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunInput.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunMessageParams.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeInput.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeMessageParams.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunOutput.java",
+        "src/org/chromium/mojo/bindings/interfacecontrol/RunResponseMessageParams.java",
+        "src/org/chromium/mojo/bindings/pipecontrol/DisconnectReason.java",
+        "src/org/chromium/mojo/bindings/pipecontrol/PeerAssociatedEndpointClosedEvent.java",
+        "src/org/chromium/mojo/bindings/pipecontrol/PipeControlMessagesConstants.java",
+        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeInput.java",
+        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeMessageParams.java",
+        "src/org/chromium/mojo/common/mojom/File.java",
+        "src/org/chromium/mojo/common/mojom/String16.java",
+        "src/org/chromium/mojo/common/mojom/TextDirection.java",
+        "src/org/chromium/mojo/common/mojom/TimeDelta.java",
+        "src/org/chromium/mojo/common/mojom/Time.java",
+        "src/org/chromium/mojo/common/mojom/TimeTicks.java",
+        "src/org/chromium/mojo/common/mojom/UnguessableToken.java",
+        "src/org/chromium/mojo/common/mojom/Version.java",
+    ],
+}
+
+// TODO(risan): Rename this after Android.mk is removed.
+java_library {
+    name: "android.mojo_bp",
+
+    srcs: [
+        ":libmojo_mojom_java_srcs",
+        "base/android/java/src/org/chromium/base/BuildInfo.java",
+        "base/android/java/src/org/chromium/base/ContextUtils.java",
+        "base/android/java/src/org/chromium/base/Log.java",
+        "base/android/java/src/org/chromium/base/PackageUtils.java",
+        "base/android/java/src/org/chromium/base/VisibleForTesting.java",
+        "mojo/android/system/src/**/*.java",
+        "mojo/public/java/system/src/**/*.java",
+        "mojo/public/java/bindings/src/**/*.java",
+        "base/android/java/src/org/chromium/base/annotations/**/*.java",
+    ],
+}
diff --git a/soong/mojom_source_generator.sh b/soong/mojom_source_generator.sh
index 24a34ee..66b684c 100755
--- a/soong/mojom_source_generator.sh
+++ b/soong/mojom_source_generator.sh
@@ -27,6 +27,7 @@
 mojom_bindings_generator=""
 package=""
 output_dir=""
+generators=""
 
 # Given a path to directory or file, return the absolute path.
 get_abs_path() {
@@ -65,6 +66,9 @@
       bytecode_path="${arg#'--bytecode_path='}"
       bytecode_path="$(get_abs_path ${bytecode_path})"
       ;;
+    --generators=*)
+      generators="${arg#'--generators='}"
+      ;;
     --*)
       args=("${args[@]}" "${arg}")
       ;;
@@ -78,9 +82,23 @@
 "${mojom_bindings_generator}" precompile -o "${output_dir}"
 
 for file in "${files[@]}"; do
+  # Java source generations depends on zipfile that assumes the output directory
+  # already exists. So, we need to create the directory beforehand.
+  rel_path="${file#`pwd`/}"
+  rel_dir="${rel_path%/*}"
+
+  mkdir -p "${output_dir}/${rel_dir}"
+
   "${mojom_bindings_generator}" generate -o "${output_dir}" "${args[@]}" \
-      --typemap="${typemap}" --bytecode_path="${bytecode_path}" "${file}"
-  "${mojom_bindings_generator}" generate -o "${output_dir}" \
-      --generate_non_variant_code "${args[@]}" --typemap="${typemap}" \
-      --bytecode_path="${bytecode_path}" "${file}"
+      --typemap="${typemap}" --bytecode_path="${bytecode_path}" \
+      --generators=${generators} "${file}"
+  if [[ "${generators}" =~ .*c++.* ]] ; then
+    "${mojom_bindings_generator}" generate -o "${output_dir}" \
+        --generate_non_variant_code "${args[@]}" --typemap="${typemap}" \
+        --bytecode_path="${bytecode_path}" --generators=${generators} \
+        "${file}"
+  fi
+  if [[ "${generators}" =~ .*java.* ]] ; then
+    unzip -qo -d "${output_dir}"/src "${output_dir}/${rel_path}".srcjar
+  fi
 done