# 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 = [
    "abstract_haptic_gamepad.cc",
    "abstract_haptic_gamepad.h",
    "dualshock4_controller_base.cc",
    "dualshock4_controller_base.h",
    "dualshock4_controller_linux.cc",
    "dualshock4_controller_linux.h",
    "dualshock4_controller_mac.cc",
    "dualshock4_controller_mac.h",
    "dualshock4_controller_win.cc",
    "dualshock4_controller_win.h",
    "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_device_linux.cc",
    "gamepad_device_linux.h",
    "gamepad_device_mac.h",
    "gamepad_device_mac.mm",
    "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",
    "hid_dll_functions_win.cc",
    "hid_dll_functions_win.h",
    "raw_input_data_fetcher_win.cc",
    "raw_input_data_fetcher_win.h",
    "raw_input_gamepad_device_win.cc",
    "raw_input_gamepad_device_win.h",
    "switch_pro_controller_base.cc",
    "switch_pro_controller_base.h",
    "switch_pro_controller_linux.cc",
    "switch_pro_controller_linux.h",
    "udev_gamepad_linux.cc",
    "udev_gamepad_linux.h",
    "xbox_controller_mac.h",
    "xbox_controller_mac.mm",
    "xbox_data_fetcher_mac.cc",
    "xbox_data_fetcher_mac.h",
    "xinput_haptic_gamepad_win.cc",
    "xinput_haptic_gamepad_win.h",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//device/base/synchronization",
    "//device/gamepad/public/cpp:shared_with_blink",
    "//device/gamepad/public/mojom",
    "//mojo/public/cpp/system",
    "//third_party/blink/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_device_linux.cc",
        "gamepad_platform_data_fetcher_linux.cc",
        "udev_gamepad_linux.cc",
      ]
    }
  }

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

  if (is_mac) {
    libs = [
      "CoreFoundation.framework",
      "Foundation.framework",
      "ForceFeedback.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/blink/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",
    ]
  }
}
