# 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")

servicess_android_path = get_path_info(".", "abspath")

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

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

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

  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

    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" ]
  }

  action(android_with_manifest_name) {
    script = "${servicess_android_path}/add_manifest_entry.py"

    input = dex_output_path
    inputs = [
      input,
    ]

    output = dex_with_manifest_output_path
    outputs = [
      output,
    ]

    rebase_input = rebase_path(input)
    rebase_output = rebase_path(output)
    mojo_main = invoker.mojo_main
    args = [
      "--input=$rebase_input",
      "--output=$rebase_output",
      "--key=Mojo-Class",
      "--value=$mojo_main",
    ]
  }

  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_with_manifest_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",
    ]
  }
}
