# Copyright 2016 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/features.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")  # For generate_jni().
}

component("gamepad") {
  output_name = "device_gamepad"

  sources = [
    "game_controller_data_fetcher_mac.h",
    "game_controller_data_fetcher_mac.mm",
    "gamepad_consumer.cc",
    "gamepad_consumer.h",
    "gamepad_data_fetcher.cc",
    "gamepad_data_fetcher.h",
    "gamepad_data_fetcher_manager.cc",
    "gamepad_data_fetcher_manager.h",
    "gamepad_export.h",
    "gamepad_haptics_manager.cc",
    "gamepad_haptics_manager.h",
    "gamepad_monitor.cc",
    "gamepad_monitor.h",
    "gamepad_pad_state_provider.cc",
    "gamepad_pad_state_provider.h",
    "gamepad_platform_data_fetcher.h",
    "gamepad_platform_data_fetcher_android.cc",
    "gamepad_platform_data_fetcher_android.h",
    "gamepad_platform_data_fetcher_linux.cc",
    "gamepad_platform_data_fetcher_linux.h",
    "gamepad_platform_data_fetcher_mac.h",
    "gamepad_platform_data_fetcher_mac.mm",
    "gamepad_platform_data_fetcher_win.cc",
    "gamepad_platform_data_fetcher_win.h",
    "gamepad_provider.cc",
    "gamepad_provider.h",
    "gamepad_service.cc",
    "gamepad_service.h",
    "gamepad_shared_buffer.cc",
    "gamepad_shared_buffer.h",
    "gamepad_standard_mappings.cc",
    "gamepad_standard_mappings.h",
    "gamepad_standard_mappings_linux.cc",
    "gamepad_standard_mappings_mac.mm",
    "gamepad_standard_mappings_win.cc",
    "gamepad_user_gesture.cc",
    "gamepad_user_gesture.h",
    "raw_input_data_fetcher_win.cc",
    "raw_input_data_fetcher_win.h",
    "xbox_controller_mac.h",
    "xbox_controller_mac.mm",
    "xbox_data_fetcher_mac.cc",
    "xbox_data_fetcher_mac.h",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//device/base/synchronization",
    "//device/gamepad/public/cpp:shared_with_blink",
    "//device/gamepad/public/interfaces",
    "//mojo/public/cpp/system",
    "//third_party/WebKit/public:blink_headers",
  ]

  defines = [ "DEVICE_GAMEPAD_IMPLEMENTATION" ]

  if (is_win) {
    cflags = [ "/wd4267" ]  # conversion from 'size_t' (64 bit) to 'type'(32 bit).
  }

  if (is_linux) {
    if (use_udev) {
      deps += [ "//device/udev_linux" ]
    } else {
      sources -= [ "gamepad_platform_data_fetcher_linux.cc" ]
    }
  }

  if (is_android) {
    deps += [ ":jni_headers" ]
  }

  if (is_mac) {
    libs = [
      "CoreFoundation.framework",
      "Foundation.framework",
      "GameController.framework",
      "IOKit.framework",
    ]
  }
}

static_library("test_helpers") {
  testonly = true

  sources = [
    "gamepad_test_helpers.cc",
    "gamepad_test_helpers.h",
  ]

  public_deps = [
    ":gamepad",
    "//base",
    "//device/gamepad/public/cpp:shared_with_blink",
    "//third_party/WebKit/public:blink_headers",
  ]
}

if (is_android) {
  generate_jni("jni_headers") {
    sources = [
      "android/java/src/org/chromium/device/gamepad/GamepadList.java",
    ]
    jni_package = "gamepad"
  }

  android_library("java") {
    java_files = [
      "android/java/src/org/chromium/device/gamepad/GamepadDevice.java",
      "android/java/src/org/chromium/device/gamepad/GamepadList.java",
      "android/java/src/org/chromium/device/gamepad/GamepadMappings.java",
    ]
    deps = [
      "//base:base_java",
      "//third_party/android_tools:android_support_annotations_java",
    ]
    srcjar_deps = [ ":java_enums_srcjar" ]
  }

  java_cpp_enum("java_enums_srcjar") {
    sources = [
      "gamepad_standard_mappings.h",
    ]
  }
}
