# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/rules.gni")
import("//mojo/public/mojo_application.gni")

template("mojo_android_java_application") {
  assert(defined(invoker.mojo_main))

  dex_output_path = "$target_out_dir/${target_name}.dex.jar"

  android_lib_name = "__${target_name}_lib"
  android_standalone_name = "__${target_name}_standalone"

  all_deps = [
    "//mojo/public/java:bindings",
    "//mojo/public/java:system",
  ]
  if (defined(invoker.deps)) {
    all_deps += invoker.deps
  }

  android_library(android_lib_name) {
    java_files = invoker.sources

    manifest_entries = [ "Mojo-Class:" + invoker.mojo_main ]

    deps = all_deps
  }

  android_standalone_library(android_standalone_name) {
    deps = [ ":${android_lib_name}" ] + all_deps

    dex_path = dex_output_path

    system_gen_dir = get_path_info("//mojo/public/java/BUILD.gn", "gen_dir")
    excluded_jars = [ "${system_gen_dir}/system.dex.jar" ]
  }

  if (defined(invoker.output_name)) {
    mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo"
  } else {
    mojo_output = "$root_out_dir/" + target_name + ".mojo"
  }

  action(target_name) {
    script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root)

    input = dex_output_path
    inputs = [
      input,
    ]

    output = mojo_output
    outputs = [
      output,
    ]

    rebase_input = rebase_path(input, root_build_dir)
    rebase_output = rebase_path(output, root_build_dir)
    args = [
      "--input=$rebase_input",
      "--output=$rebase_output",
      "--line=#!mojo mojo:java_handler",
    ]
  }
}
