# Copyright 2014 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/config.gni")
import("//build/config/android/internal_rules.gni")
import("//tools/grit/grit_rule.gni")

assert(is_android)


# Declare a jni target
#
# This target generates the native jni bindings for a set of .java files.
#
# See base/android/jni_generator/jni_generator.py for more info about the
# format of generating JNI bindings.
#
# Variables
#   sources: list of .java files to generate jni for
#   jni_package: subdirectory path for generated bindings
#
# Example
#   generate_jni("foo_jni") {
#     sources = [
#       "android/java/src/org/chromium/foo/Foo.java",
#       "android/java/src/org/chromium/foo/FooUtil.java",
#     ]
#     jni_package = "foo"
#   }
template("generate_jni") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.sources))
  assert(defined(invoker.jni_package))
  jni_package = invoker.jni_package
  base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}"
  jni_output_dir = "${base_output_dir}/jni"

  jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h"

  foreach_target_name = "${target_name}__jni_gen"
  action_foreach(foreach_target_name) {
    script = "//base/android/jni_generator/jni_generator.py"
    depfile = "$target_gen_dir/$target_name.{{source_name_part}}.d"
    sources = invoker.sources
    inputs = [ jni_generator_include ]
    outputs = [
      depfile,
      "${jni_output_dir}/{{source_name_part}}_jni.h"
    ]

    args = [
      "--depfile", rebase_path(depfile, root_build_dir),
      "--input_file={{source}}",
      "--optimize_generation=1",
      "--ptr_type=long",
      "--output_dir", rebase_path(jni_output_dir, root_build_dir),
      "--includes", rebase_path(jni_generator_include, "//"),
    ]
    if (defined(invoker.jni_generator_jarjar_file)) {
      args += [
        "--jarjar", rebase_path(jni_generator_jarjar_file, root_build_dir),
      ]
    }
  }

  config("jni_includes_${target_name}") {
    include_dirs = [ base_output_dir ]
  }

  group(target_name) {
    deps = [ ":$foreach_target_name" ]
    public_configs = [ ":jni_includes_${target_name}" ]

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      public_deps = invoker.public_deps
    }
  }
}


# Declare a jni target for a prebuilt jar
#
# This target generates the native jni bindings for a set of classes in a .jar.
#
# See base/android/jni_generator/jni_generator.py for more info about the
# format of generating JNI bindings.
#
# Variables
#   classes: list of .class files in the jar to generate jni for. These should
#     include the full path to the .class file.
#   jni_package: subdirectory path for generated bindings
#   jar_file: the path to the .jar. If not provided, will default to the sdk's
#     android.jar
#
#   deps, public_deps: As normal
#
# Example
#   generate_jar_jni("foo_jni") {
#     classes = [
#       "android/view/Foo.class",
#     ]
#     jni_package = "foo"
#   }
template("generate_jar_jni") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.classes))
  assert(defined(invoker.jni_package))

  if (defined(invoker.jar_file)) {
    jar_file = invoker.jar_file
  } else {
    jar_file = android_sdk_jar
  }

  jni_package = invoker.jni_package
  base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}"
  jni_output_dir = "${base_output_dir}/jni"

  jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h"

  # TODO(cjhopman): make jni_generator.py support generating jni for multiple
  # .class files from a .jar.
  jni_actions = []
  foreach(class, invoker.classes) {
    _classname_list = []
    _classname_list = process_file_template(
        [class], "{{source_name_part}}")
    classname = _classname_list[0]
    jni_target_name = "${target_name}__jni_${classname}"
    jni_actions += [ ":$jni_target_name" ]
    action(jni_target_name) {
      depfile = "$target_gen_dir/$target_name.d"
      script = "//base/android/jni_generator/jni_generator.py"
      sources = [
        jni_generator_include,
        jar_file,
      ]
      outputs = [
        depfile,
        "${jni_output_dir}/${classname}_jni.h"
      ]

      args = [
        "--depfile", rebase_path(depfile, root_build_dir),
        "--jar_file", rebase_path(jar_file, root_build_dir),
        "--input_file", class,
        "--optimize_generation=1",
        "--ptr_type=long",
        "--output_dir", rebase_path(jni_output_dir, root_build_dir),
        "--includes", rebase_path(jni_generator_include, root_build_dir),
      ]
    }
  }

  config("jni_includes_${target_name}") {
    include_dirs = [ base_output_dir ]
  }

  group(target_name) {
    deps = jni_actions
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      public_deps = invoker.public_deps
    }
    public_configs = [ ":jni_includes_${target_name}" ]
  }
}


# Declare a target for c-preprocessor-generated java files
#
# This target generates java files using the host C pre-processor. Each file in
# sources will be compiled using the C pre-processor. If include_path is
# specified, it will be passed (with --I) to the pre-processor.
#
# This target will create a single .srcjar. Adding this target to an
# android_library target's srcjar_deps will make the generated java files be
# included in that library's final outputs.
#
# Variables
#   sources: list of files to be processed by the C pre-processor. For each
#     file in sources, there will be one .java file in the final .srcjar. For a
#     file named FooBar.template, a java file will be created with name
#     FooBar.java.
#   inputs: additional compile-time dependencies. Any files
#     `#include`-ed in the templates should be listed here.
#   package_name: this will be the subdirectory for each .java file in the
#     .srcjar.
#
# Example
#   java_cpp_template("foo_generated_enum") {
#     sources = [
#       "android/java/templates/Foo.template",
#     ]
#     inputs = [
#       "android/java/templates/native_foo_header.h",
#     ]
#
#     package_name = "org/chromium/base/library_loader"
#     include_path = "android/java/templates"
#   }
template("java_cpp_template") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.sources))
  package_name = invoker.package_name + ""

  if (defined(invoker.include_path)) {
    include_path = invoker.include_path + ""
  } else {
    include_path = "//"
  }

  action_foreach("${target_name}__apply_gcc") {
    script = "//build/android/gyp/gcc_preprocess.py"
    if (defined(invoker.inputs)) {
      inputs = invoker.inputs + []
    }
    depfile = "${target_gen_dir}/${target_name}_{{source_name_part}}.d"

    sources = invoker.sources

    gen_dir = "${target_gen_dir}/${target_name}/java_cpp_template/${package_name}"
    gcc_template_output_pattern = "${gen_dir}/{{source_name_part}}.java"

    outputs = [
      depfile,
      gcc_template_output_pattern
    ]

    args = [
      "--depfile", rebase_path(depfile, root_build_dir),
      "--include-path", rebase_path(include_path, root_build_dir),
      "--output", rebase_path(gen_dir, root_build_dir) + "/{{source_name_part}}.java",
      "--template={{source}}",
    ]

    if (defined(invoker.defines)) {
      foreach(def, invoker.defines) {
        args += ["--defines", def]
      }
    }
  }

  apply_gcc_outputs = get_target_outputs(":${target_name}__apply_gcc")
  base_gen_dir = get_label_info(":${target_name}__apply_gcc", "target_gen_dir")

  srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
  zip("${target_name}__zip_srcjar") {
    inputs = apply_gcc_outputs
    output = srcjar_path
    base_dir = base_gen_dir
  }

  group(target_name) {
    deps = [
      ":${target_name}__zip_srcjar"
    ]
  }
}

# Declare a target for generating Java classes from C++ enums.
#
# This target generates Java files from C++ enums using a script.
#
# This target will create a single .srcjar. Adding this target to an
# android_library target's srcjar_deps will make the generated java files be
# included in that library's final outputs.
#
# Variables
#   sources: list of files to be processed by the script. For each annotated
#     enum contained in the sources files the script will generate a .java
#     file with the same name as the name of the enum.
#
#   outputs: list of outputs, relative to the output_dir. These paths are
#     verified at build time by the script. To get the list programatically run:
#       python build/android/gyp/java_cpp_enum.py --output_dir=. \
#         --print_output_only path/to/header/file.h
#
# Example
#   java_cpp_enum("foo_generated_enum") {
#     sources = [
#       "src/native_foo_header.h",
#     ]
#     outputs = [
#       "org/chromium/FooEnum.java",
#     ]
#   }
template("java_cpp_enum") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.sources))
  assert(defined(invoker.outputs))

  action("${target_name}__generate_enum") {
    sources = invoker.sources
    script = "//build/android/gyp/java_cpp_enum.py"
    gen_dir = "${target_gen_dir}/${target_name}/enums"
    outputs = get_path_info(
        rebase_path(invoker.outputs, ".", gen_dir), "abspath")

    args = [
      "--output_dir", rebase_path(gen_dir, root_build_dir),
    ]
    foreach(output, rebase_path(outputs, root_build_dir)) {
      args += ["--assert_file", output]
    }
    args += rebase_path(invoker.sources, root_build_dir)
  }

  generate_enum_outputs = get_target_outputs(":${target_name}__generate_enum")
  base_gen_dir = get_label_info(":${target_name}__generate_enum",
                                "target_gen_dir")

  srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
  zip("${target_name}__zip_srcjar") {
    inputs = generate_enum_outputs
    output = srcjar_path
    base_dir = base_gen_dir
  }

  group(target_name) {
    deps = [
      ":${target_name}__zip_srcjar"
    ]
  }
}


# Declare an Android resources target
#
# This creates a resources zip file that will be used when building an Android
# library or apk and included into a final apk.
#
# To include these resources in a library/apk, this target should be listed in
# the library's deps. A library/apk will also include any resources used by its
# own dependencies.
#
# Variables
#   deps: Specifies the dependencies of this target. Any Android resources
#     listed in deps will be included by libraries/apks that depend on this
#     target.
#   resource_dirs: List of directories containing resources for this target.
#   android_manifest: AndroidManifest.xml for this target. Defaults to
#     //build/android/AndroidManifest.xml.
#   custom_package: java package for generated .java files.
#   v14_verify_only: If true, don't generate v14/v17 resources and just verify
#     that the resources are v14-compliant (see
#     build/android/gyp/generate_v14_compatible_resources.py). Defaults to
#     false.
#
# Example
#   android_resources("foo_resources") {
#     deps = [":foo_strings_grd"]
#     resource_dirs = ["res"]
#     custom_package = "org.chromium.foo"
#   }
template("android_resources") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.resource_dirs))
  assert(defined(invoker.android_manifest) || defined(invoker.custom_package))

  base_path = "$target_gen_dir/$target_name"
  zip_path = base_path + ".resources.zip"
  srcjar_path = base_path + ".srcjar"
  build_config = base_path + ".build_config"

  write_build_config("${target_name}__build_config") {
    type = "android_resources"
    resources_zip = zip_path
    srcjar = srcjar_path
    if (defined(invoker.deps)) { deps = invoker.deps }
    if (defined(invoker.android_manifest)) { android_manifest = invoker.android_manifest }
    if (defined(invoker.custom_package)) { custom_package = invoker.custom_package }
  }

  android_manifest = "//build/android/AndroidManifest.xml"
  if (defined(invoker.android_manifest)) {
    android_manifest = invoker.android_manifest
  }

  process_resources("${target_name}__process_resources") {
    resource_dirs = invoker.resource_dirs
    if (defined(invoker.custom_package)) {
      custom_package = invoker.custom_package
    }

    if (defined(invoker.v14_verify_only)) {
      v14_verify_only = invoker.v14_verify_only
    }
  }

  group(target_name) {
    deps = [
      ":${target_name}__build_config",
      ":${target_name}__process_resources",
    ]
  }
}


# Declare a target that generates localized strings.xml from a .grd file.
#
# If this target is included in the deps of an android resources/library/apk,
# the strings.xml will be included with that target.
#
# Variables
#   deps: Specifies the dependencies of this target.
#   grd_file: Path to the .grd file to generate strings.xml from.
#   outputs: Expected grit outputs (see grit rule).
#
# Example
#  java_strings_grd("foo_strings_grd") {
#    grd_file = "foo_strings.grd"
#  }
template("java_strings_grd") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  base_path = "$target_gen_dir/$target_name"
  resources_zip = base_path + ".resources.zip"
  build_config = base_path + ".build_config"

  write_build_config("${target_name}__build_config") {
    type = "android_resources"
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

  # Put grit files into this subdirectory of target_gen_dir.
  extra_output_path = target_name + "_grit_output"

  grit_target_name = "${target_name}__grit"
  grit_output_dir = "$target_gen_dir/$extra_output_path"
  grit(grit_target_name) {
    grit_flags = [
      "-E", "ANDROID_JAVA_TAGGED_ONLY=false",
    ]
    output_dir = grit_output_dir
    resource_ids = ""
    source = invoker.grd_file
    outputs = invoker.outputs
  }

  # This needs to get outputs from grit's internal target, not the final
  # source_set.
  generate_strings_outputs = get_target_outputs(":${grit_target_name}_grit")

  zip("${target_name}__zip") {
    base_dir = grit_output_dir
    inputs = generate_strings_outputs
    output = resources_zip
  }

  group(target_name) {
    deps = [
      ":${target_name}__build_config",
      ":${target_name}__zip",
    ]
  }
}


# Declare an Android library target
#
# This target creates an Android library containing java code and Android
# resources.
#
# Variables
#   deps: Specifies the dependencies of this target. Java targets in this list
#     will be added to the javac classpath. Android resources in dependencies
#     will be used when building this library.
#   java_files: List of .java files included in this library.
#   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars
#     will be added to java_files and be included in this library.
#   chromium_code: If true, extra analysis warning/errors will be enabled.
#   jar_excluded_patterns: List of patterns of .class files to exclude from the
#     final jar.
#   proguard_preprocess: If true, proguard preprocessing will be run. This can
#     be used to remove unwanted parts of the library.
#   proguard_config: Path to the proguard config for preprocessing.
#
#   DEPRECATED_java_in_dir: Directory containing java files. All .java files in
#     this directory will be included in the library. This is only supported to
#     ease the gyp->gn conversion and will be removed in the future.
#
# Example
#   android_library("foo_java") {
#     java_files = [
#       "android/org/chromium/foo/Foo.java",
#       "android/org/chromium/foo/FooInterface.java",
#       "android/org/chromium/foo/FooService.java",
#     ]
#     deps = [
#       ":bar_java"
#     ]
#     srcjar_deps = [
#       ":foo_generated_enum"
#     ]
#     jar_excluded_patterns = [
#       "*/FooService.class", "*/FooService##*.class"
#     ]
#   }
template("android_library") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.java_files) || defined(invoker.DEPRECATED_java_in_dir))
  _base_path = "$target_gen_dir/$target_name"
  _build_config = _base_path + ".build_config"
  _jar_path = _base_path + ".jar"
  _dex_path = _base_path + ".dex.jar"

  write_build_config("${target_name}__build_config") {
    type = "android_library"

    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    build_config = _build_config
    jar_path = _jar_path
    dex_path = _dex_path
  }

  _chromium_code = true
  if (defined(invoker.chromium_code)) {
    _chromium_code = invoker.chromium_code
  }

  android_java_library(target_name) {
    chromium_code = _chromium_code
    if (defined(invoker.java_files)) {
      java_files = invoker.java_files
    } else {
      DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir
    }
    build_config = _build_config
    jar_path = _jar_path
    dex_path = _dex_path

    if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) {
      proguard_preprocess = true
      proguard_config = invoker.proguard_config
    }

    jar_excluded_patterns = [
      "*/R.class", "*/R##*.class",
      "*/Manifest.class", "*/Manifest##*.class",
    ]
    if (defined(invoker.jar_excluded_patterns)) {
      jar_excluded_patterns += invoker.jar_excluded_patterns
    }

    if (defined(invoker.srcjar_deps)) {
      srcjar_deps = invoker.srcjar_deps
    }
  }
}


# Declare an Android library target for a prebuilt jar
#
# This target creates an Android library containing java code and Android
# resources.
#
# Variables
#   deps: Specifies the dependencies of this target. Java targets in this list
#     will be added to the javac classpath. Android resources in dependencies
#     will be used when building this library.
#   jar_path: Path to the prebuilt jar.
#   proguard_preprocess: If true, proguard preprocessing will be run. This can
#     be used to remove unwanted parts of the library.
#   proguard_config: Path to the proguard config for preprocessing.
#
# Example
#   android_java_prebuilt("foo_java") {
#     jar_path = "foo.jar"
#     deps = [
#       ":foo_resources",
#       ":bar_java"
#     ]
#   }
template("android_java_prebuilt") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.jar_path))
  _base_path = "${target_gen_dir}/$target_name"
  _jar_path = _base_path + ".jar"
  _dex_path = _base_path + ".dex.jar"
  _build_config = _base_path + ".build_config"

  write_build_config("${target_name}__build_config") {
    type = "android_library"

    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    build_config = _build_config
    jar_path = _jar_path
    dex_path = _dex_path
  }

  java_prebuilt("${target_name}__process_jar") {
    if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) {
      proguard_preprocess = true
      proguard_config = invoker.proguard_config
    }

    build_config = _build_config
    input_jar_path = invoker.jar_path
    output_jar_path = _jar_path
  }

  dex("${target_name}__dex") {
    sources = [_jar_path]
    output = _dex_path
  }

  group(target_name) {
    deps = [
      ":${target_name}__dex",
    ]
  }
}



# Declare an Android apk target
#
# This target creates an Android APK containing java code, resources, assets,
# and (possibly) native libraries.
#
# Variables
#   android_manifest: Path to AndroidManifest.xml.
#   datadeps: List of dependencies needed at runtime. These will be built but
#     won't change the generated .apk in any way (in fact they may be built
#     after the .apk is).
#   deps: List of dependencies. All Android java resources and libraries in the
#     "transitive closure" of these dependencies will be included in the apk.
#     Note: this "transitive closure" actually only includes such targets if
#     they are depended on through android_library or android_resources targets
#     (and so not through builtin targets like 'action', 'group', etc).
#   java_files: List of .java files to include in the apk.
#   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars
#      will be added to java_files and be included in this apk.
#   apk_name: Name for final apk.
#   final_apk_path: Path to final built apk. Default is
#     $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name.
#   native_libs: List paths of native libraries to include in this apk. If these
#     libraries depend on other shared_library targets, those dependencies will
#     also be included in the apk.
#   testonly: Marks this target as "test-only".
#
#   DEPRECATED_java_in_dir: Directory containing java files. All .java files in
#     this directory will be included in the library. This is only supported to
#     ease the gyp->gn conversion and will be removed in the future.
#
# Example
#   android_apk("foo_apk") {
#     android_manifest = "AndroidManifest.xml"
#     java_files = [
#       "android/org/chromium/foo/FooApplication.java",
#       "android/org/chromium/foo/FooActivity.java",
#     ]
#     deps = [
#       ":foo_support_java"
#       ":foo_resources"
#     ]
#     srcjar_deps = [
#       ":foo_generated_enum"
#     ]
#     native_libs = [
#       native_lib_path
#     ]
#   }
template("android_apk") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  assert(defined(invoker.final_apk_path) || defined(invoker.apk_name))
  gen_dir = "$target_gen_dir/$target_name"
  base_path = "$gen_dir/$target_name"
  build_config = "$base_path.build_config"
  resources_zip_path = "$base_path.resources.zip"
  all_resources_zip_path = "$base_path.resources.all.zip"
  jar_path = "$base_path.jar"
  final_dex_path = "$gen_dir/classes.dex"
  _template_name = target_name
  _final_apk_path = ""
  if (defined(invoker.final_apk_path)) {
    _final_apk_path = invoker.final_apk_path
  } else if (defined(invoker.apk_name)) {
    _final_apk_path = "$root_build_dir/apks/" + invoker.apk_name + ".apk"
  }
  _dist_jar_path_list = process_file_template(
      [ _final_apk_path ],
      "$root_build_dir/test.lib.java/{{source_name_part}}.jar"
      )
  _dist_jar_path = _dist_jar_path_list[0]

  _native_libs = []
  if (defined(invoker.native_libs)) {
    _native_libs = invoker.native_libs
    _native_libs_dir = base_path + "/libs"
  }

  _keystore_path = android_default_keystore_path
  _keystore_name = android_default_keystore_name
  _keystore_password = android_default_keystore_password

  if (defined(invoker.keystore_path)) {
    _keystore_path = invoker.keystore_path
    _keystore_name = invoker.keystore_name
    _keystore_password = invoker.keystore_password
  }

  _srcjar_deps = []
  if (defined(invoker.srcjar_deps)) {
    _srcjar_deps += invoker.srcjar_deps
  }

  _rebased_build_config = rebase_path(build_config, root_build_dir)

  write_build_config("${_template_name}__build_config") {
    type = "android_apk"
    dex_path = final_dex_path
    resources_zip = resources_zip_path

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }

    native_libs = _native_libs
  }

  final_deps = []

  final_deps += [":${_template_name}__process_resources"]
  process_resources("${_template_name}__process_resources") {
    srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
    android_manifest = invoker.android_manifest
    resource_dirs = ["//build/android/ant/empty/res"]
    zip_path = resources_zip_path
    generate_constant_ids = true
  }
  _srcjar_deps += [":${_template_name}__process_resources"]

  if (_native_libs != []) {
    _use_chromium_linker = false
    _enable_chromium_linker_tests = false
    _load_library_from_apk = false
    _native_lib_version_name = ""


    java_cpp_template("${_template_name}__native_libraries_java") {
      package_name = "org/chromium/base/library_loader"
      sources = [
        "//base/android/java/templates/NativeLibraries.template",
      ]
      inputs = [
        build_config,
      ]

      defines = [
        "NATIVE_LIBRARIES_LIST=" +
          "@FileArg($_rebased_build_config:native:java_libraries_list)",
        "NATIVE_LIBRARIES_VERSION_NUMBER=\"$_native_lib_version_name\"",
      ]
      if (_use_chromium_linker) {
        defines += ["ENABLED_CHROMIUM_LINKER"]
      }
      if (_load_library_from_apk) {
        defines += ["ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE"]
      }
      if (_enable_chromium_linker_tests) {
        defines += ["ENABLE_CHROMIUM_LINKER_TESTS"]
      }
    }
    _srcjar_deps += [ ":${_template_name}__native_libraries_java" ]
  }

  final_deps += [ ":${_template_name}__java" ]
  android_java_library("${_template_name}__java") {
    android_manifest = invoker.android_manifest
    if (defined(invoker.java_files)) {
      java_files = invoker.java_files
    } else if (defined(invoker.DEPRECATED_java_in_dir)) {
      DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir
    } else {
      java_files = []
    }
    srcjar_deps = _srcjar_deps
    dex_path = base_path + ".dex.jar"
  }

  if (_dist_jar_path != "") {
    # TODO(cjhopman): This is only ever needed to calculate the list of tests to
    # run. See build/android/pylib/instrumentation/test_jar.py. We should be
    # able to just do that calculation at build time instead.
    action("${_template_name}__create_dist_jar") {
      script = "//build/android/gyp/create_dist_jar.py"
      depfile = "$target_gen_dir/$target_name.d"
      inputs = [ build_config ]
      outputs = [
        depfile,
        _dist_jar_path,
      ]
      args = [
        "--depfile", rebase_path(depfile, root_build_dir),
        "--output", rebase_path(_dist_jar_path, root_build_dir),
        "--inputs=@FileArg($_rebased_build_config:dist_jar:dependency_jars)",
      ]
      inputs += [ jar_path ]
      _rebased_jar_path = rebase_path([ jar_path ], root_build_dir)
      args += [
        "--inputs=$_rebased_jar_path",
      ]
    }
  }

  final_deps += [":${_template_name}__final_dex"]
  dex("${_template_name}__final_dex") {
    deps = [ ":${_template_name}__java" ]
    sources = [ jar_path ]
    inputs = [ build_config ]
    output = final_dex_path
    dex_arg_key = "${_rebased_build_config}:apk_dex:dependency_dex_files"
    args = [ "--inputs=@FileArg($dex_arg_key)" ]
  }

  if (_native_libs != []) {
    copy_ex("${_template_name}__prepare_native") {
      clear_dir = true
      inputs = [
        build_config
      ]
      dest = "$_native_libs_dir/$android_app_abi"
      args = [
        "--files=@FileArg(${_rebased_build_config}:native:libraries)",
      ]
      if (is_debug) {
        rebased_gdbserver = rebase_path(android_gdbserver, root_build_dir)
        args += [
          "--files=[\"$rebased_gdbserver\"]"
        ]
      }
    }
  }

  final_deps += [":${_template_name}__create"]
  create_apk("${_template_name}__create") {
    apk_path = _final_apk_path
    android_manifest = invoker.android_manifest
    resources_zip = all_resources_zip_path
    dex_path = final_dex_path

    if (defined(invoker.asset_location)) {
      asset_location = invoker.asset_location
    }

    keystore_name = _keystore_name
    keystore_path = _keystore_path
    keystore_password = _keystore_password

    if (_native_libs != []) {
      native_libs_dir = _native_libs_dir
      deps = [":${_template_name}__prepare_native"]
    }
  }

  group(target_name) {
    deps = final_deps
    if (defined(invoker.datadeps)) {
      # TODO(cjhopman): Fix this when group datadeps works.
      deps += invoker.datadeps
    }
  }
}


# Declare an Android gtest apk
#
# This target creates an Android apk for running gtest-based unittests.
#
# Variables
#   deps: Specifies the dependencies of this target. These will be passed to
#     the underlying android_apk invocation and should include the java and
#     resource dependencies of the apk.
#   unittests_dep: This should be the label of the gtest native target. This
#     target must be defined previously in the same file.
#   unittests_binary: The name of the binary produced by the unittests_dep
#     target, relative to the root build directory. If unspecified, it assumes
#     the name of the unittests_dep target (which will be correct unless that
#     target specifies an "output_name".
#     TODO(brettw) make this automatic by allowing get_target_outputs to
#     support executables.
#
# Example
#   unittest_apk("foo_unittests_apk") {
#     deps = [ ":foo_java", ":foo_resources" ]
#     unittests_dep = ":foo_unittests"
#   }
template("unittest_apk") {
  testonly = true

  assert(defined(invoker.unittests_dep), "Need unittests_dep for $target_name")

  test_suite_name = get_label_info(invoker.unittests_dep, "name")

  if (defined(invoker.unittests_binary)) {
    unittests_binary = root_out_dir + "/" + invoker.unittests_binary
  } else {
    unittests_binary = root_out_dir + "/lib.stripped/lib" + test_suite_name + ".so"
  }

  android_apk(target_name) {
    _apk_name = test_suite_name
    final_apk_path = "$root_build_dir/${_apk_name}_apk/${_apk_name}-debug.apk"
    java_files = [
      "//testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java"
    ]
    android_manifest = "//testing/android/java/AndroidManifest.xml"
    unittests_outputs = [ unittests_binary ]
    native_libs = [unittests_outputs[0]]
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
    datadeps = [
      "//tools/android/md5sum",
    ]
  }
}

# Generate .java files from .aidl files.
#
# This target will store the .java files in a srcjar and should be included in
# an android_library or android_apk's srcjar_deps.
#
# Variables
#   sources: Paths to .aidl files to compile.
#   import_include: Path to directory containing .java files imported by the
#     .aidl files.
#   interface_file: Preprocessed aidl file to import.
#
# Example
#   android_aidl("foo_aidl") {
#     import_include = "java/src"
#     sources = [
#       "java/src/com/foo/bar/FooBarService.aidl",
#       "java/src/com/foo/bar/FooBarServiceCallback.aidl",
#     ]
#   }
template("android_aidl") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
  aidl_path = "${android_sdk_build_tools}/aidl"
  framework_aidl = "$android_sdk/framework.aidl"

  action(target_name) {
    script = "//build/android/gyp/aidl.py"
    sources = invoker.sources

    imports = [ framework_aidl ]
    if (defined(invoker.interface_file)) {
      assert(invoker.interface_file != "")
      imports += [ invoker.interface_file ]
    }

    inputs = [
      aidl_path,
    ] + imports

    depfile = "${target_gen_dir}/${target_name}.d"
    outputs = [
      depfile,
      srcjar_path
    ]
    rebased_imports = rebase_path(imports, root_build_dir)
    args = [
      "--depfile", rebase_path(depfile, root_build_dir),
      "--aidl-path", rebase_path(aidl_path, root_build_dir),
      "--imports=$rebased_imports",
      "--srcjar", rebase_path(srcjar_path, root_build_dir),
    ]
    if (defined(invoker.import_include) && invoker.import_include != "") {
      # TODO(cjhopman): aidl supports creating a depfile. We should be able to
      # switch to constructing a depfile for the overall action from that
      # instead of having all the .java files in the include paths as inputs.
      rebased_import_includes = rebase_path(
          [invoker.import_include], root_build_dir)
      args += [ "--includes=$rebased_import_includes" ]

      _java_files_build_rel = exec_script(
          "//build/android/gyp/find.py",
          rebase_path([invoker.import_include], root_build_dir),
          "list lines"
          )
      _java_files = rebase_path(_java_files_build_rel, ".", root_build_dir)
      inputs += _java_files
    }
    args += rebase_path(sources, root_build_dir)
  }
}

# Creates a dist directory for a native executable.
#
# Running a native executable on a device requires all the shared library
# dependencies of that executable. To make it easier to install and run such an
# executable, this will create a directory containing the native exe and all
# it's library dependencies.
#
# Note: It's usually better to package things as an APK than as a native
# executable.
#
# Variables
#   dist_dir: Directory for the exe and libraries. Everything in this directory
#     will be deleted before copying in the exe and libraries.
#   binary: Path to (stripped) executable.
#
# Example
#   create_native_executable_dist("foo_dist") {
#     dist_dir = "$root_build_dir/foo_dist"
#     binary = "$root_build_dir/exe.stripped/foo"
#   }
template("create_native_executable_dist") {
  if (defined(invoker.testonly)) { testonly = invoker.testonly }

  dist_dir = invoker.dist_dir
  binary = invoker.binary
  final_deps = []
  template_name = target_name

  libraries_list = "${target_gen_dir}/${template_name}_library_dependencies.list"

  # TODO(gyp)
  #'dependencies': [
  #'<(DEPTH)/build/android/setup.gyp:copy_system_libraries',
  #],

  stripped_libraries_dir = "$root_build_dir/lib.stripped"
  final_deps += [ ":${template_name}__find_library_dependencies" ]
  action("${template_name}__find_library_dependencies") {
    script = "//build/android/gyp/write_ordered_libraries.py"
    depfile = "$target_gen_dir/$target_name.d"
    inputs = [
      binary,
      android_readelf,
    ]
    outputs = [
      depfile,
      libraries_list,
    ]
    rebased_binaries = rebase_path([ binary ], root_build_dir)
    args = [
      "--depfile", rebase_path(depfile, root_build_dir),
      "--input-libraries=$rebased_binaries",
      "--libraries-dir", rebase_path(stripped_libraries_dir, root_build_dir),
      "--output", rebase_path(libraries_list, root_build_dir),
      "--readelf", rebase_path(android_readelf, root_build_dir),
    ]
  }

  final_deps += [ ":${template_name}__copy_libraries_and_exe" ]
  copy_ex("${template_name}__copy_libraries_and_exe") {
    clear_dir = true
    inputs = [
      binary,
      libraries_list
    ]
    dest = dist_dir
    rebased_binaries_list = rebase_path([ binary ], root_build_dir)
    rebased_libraries_list = rebase_path(libraries_list, root_build_dir)
    args = [
      "--files=$rebased_binaries_list",
      "--files=@FileArg($rebased_libraries_list:libraries)",
    ]
  }

  group(target_name) {
    deps = final_deps
  }
}


# Compile a protocol buffer to java.
#
# This generates java files from protocol buffers and creates an Android library
# containing the classes.
#
# Variables
#   sources: Paths to .proto files to compile.
#   proto_path: Root directory of .proto files.
#
# Example:
#  proto_java_library("foo_proto_java") {
#    proto_path = [ "src/foo" ]
#    sources = [ "$proto_path/foo.proto" ]
#  }
template("proto_java_library") {
  _protoc_dep = "//third_party/android_protobuf:android_protoc($host_toolchain)"
  _protoc_out_dir = get_label_info(_protoc_dep, "root_out_dir")
  _protoc_bin = "$_protoc_out_dir/android_protoc"
  _proto_path = invoker.proto_path

  _template_name = target_name

  action("${_template_name}__protoc_java") {
    srcjar_path = "$target_gen_dir/$target_name.srcjar"
    script = "//build/protoc_java.py"
    deps = [
      _protoc_dep
    ]
    sources = invoker.sources
    depfile = "$target_gen_dir/$target_name.d"
    outputs = [
      depfile,
      srcjar_path,
    ]
    args = [
      "--depfile", rebase_path(depfile, root_build_dir),
      "--protoc", rebase_path(_protoc_bin, root_build_dir),
      "--proto-path", rebase_path(_proto_path, root_build_dir),
      "--srcjar", rebase_path(srcjar_path, root_build_dir),
    ] + rebase_path(sources, root_build_dir)
  }

  android_library(target_name) {
    java_files = []
    srcjar_deps = [ ":${_template_name}__protoc_java" ]
    deps = [
      "//third_party/android_protobuf:protobuf_nano_javalib",
    ]
  }
}
