# Copyright 2018 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")
import("//third_party/feed/java_sources.gni")
import("//third_party/feed/proto_sources.gni")
import("//third_party/protobuf/proto_library.gni")

android_resources("sharedstream_resources") {
  resource_dirs =
      [ "src/src/main/java/com/google/android/libraries/feed/sharedstream/res" ]
  custom_package = "com.google.android.libraries.feed.sharedstream"
}

android_resources("piet_resources") {
  resource_dirs =
      [ "src/src/main/java/com/google/android/libraries/feed/piet/res" ]
  custom_package = "com.google.android.libraries.feed.piet"
}

android_resources("basicstream_internal_viewholders_resources") {
  resource_dirs = [ "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/viewholders/res" ]
  deps = [
    ":sharedstream_resources",
  ]
  custom_package =
      "com.google.android.libraries.feed.basicstream.internal.viewholders"
}

android_resources("basicstream_resources") {
  resource_dirs =
      [ "src/src/main/java/com/google/android/libraries/feed/basicstream/res/" ]
  custom_package = "com.google.android.libraries.feed.basicstream"
}

android_resources("shared_stream_publicapi_menumeasurer_resources") {
  resource_dirs = [ "src/src/main/java/com/google/android/libraries/feed/sharedstream/publicapi/menumeasurer/res/" ]
  custom_package =
      "com.google.android.libraries.feed.sharedstream.publicapi.menumeasurer"
}

android_resources("sharedstream_contextmenumanager_resources") {
  resource_dirs =
      [ "src/src/main/java/com/google/android/libraries/feed/sharedstream/res" ]
  custom_package =
      "com.google.android.libraries.feed.sharedstream.contextmenumanager"
}

android_library("feed_lib_java") {
  chromium_code = false
  java_files = feed_lib_java_sources

  deps = [
    ":basicstream_internal_viewholders_resources",
    ":basicstream_resources",
    ":feed_lib_proto_java",
    ":piet_resources",
    ":shared_stream_publicapi_menumeasurer_resources",
    ":sharedstream_contextmenumanager_resources",
    "//third_party/android_deps:android_support_annotations_java",
    "//third_party/android_deps:android_support_cardview_java",
    "//third_party/android_deps:android_support_v7_appcompat_java",
    "//third_party/android_deps:android_support_v7_recyclerview_java",
    "//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
    "//third_party/android_deps:javax_inject_javax_inject_java",
    "//third_party/jsr-305:jsr_305_javalib",
  ]
}

android_library("feed_conformance_test_lib_android_java") {
  chromium_code = false
  java_files = feed_conformance_test_lib_sources
  testonly = true

  deps = [
    ":feed_lib_java",
    ":feed_lib_proto_java",
    "//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
    "//third_party/google-truth:google_truth_java",
    "//third_party/guava:guava_android_java",
    "//third_party/junit:junit",
  ]
}

proto_java_library("feed_lib_proto_java") {
  proto_path = "src"
  sources = feed_lib_proto_sources
}
