# 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/rules.gni")

android_library("net_java") {
  DEPRECATED_java_in_dir = "java/src"
  deps = [
    "//base:base_java",
  ]

  srcjar_deps = [
    ":net_errors_java",
    ":net_android_java_enums_srcjar",
    ":remote_android_keystore_aidl",
  ]
}

android_aidl("remote_android_keystore_aidl") {
  interface_file = "java/src/org/chromium/net/IRemoteAndroidKeyStoreInterface.aidl"
  sources = [
    "java/src/org/chromium/net/IRemoteAndroidKeyStore.aidl",
    "java/src/org/chromium/net/IRemoteAndroidKeyStoreCallbacks.aidl",
  ]
}

android_library("net_java_test_support") {
  DEPRECATED_java_in_dir = "../test/android/javatests/src"
}

android_library("net_javatests") {
  DEPRECATED_java_in_dir = "javatests/src"
  deps = [
    "//base:base_java",
    "//base:base_java_test_support",
    ":net_java",
  ]
}

java_cpp_template("net_errors_java") {
  package_name = "org/chromium/net"
  sources = [
    "java/NetError.template",
  ]
  inputs = [
    "../base/net_error_list.h"
  ]
}

java_cpp_enum("net_android_java_enums_srcjar") {
  sources = [
    "../base/mime_util.h",
    "cert_verify_result_android.h",
    "keystore.h"
  ]
  outputs = [
    "org/chromium/net/CertificateMimeType.java",
    "org/chromium/net/CertVerifyStatusAndroid.java",
    "org/chromium/net/PrivateKeyType.java",
  ]
}

# TODO(GYP)
if (false) {
  unittest_apk("net_unittests_apk") {
    deps = [
      ":net_java",
      ":net_javatests",
      "//net:net_unittests",
    ]
    unittests_dep = "//net:net_unittests"
  }
}
