# 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/chromeos/ui_mode.gni")
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.cc",
    "dualshock4_controller.h",
    "gamepad_blocklist.cc",
    "gamepad_blocklist.h",
    "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_id_list.cc",
    "gamepad_id_list.h",
    "gamepad_monitor.cc",
    "gamepad_monitor.h",
    "gamepad_pad_state_provider.cc",
    "gamepad_pad_state_provider.h",
    "gamepad_platform_data_fetcher.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_uma.cc",
    "gamepad_uma.h",
    "gamepad_user_gesture.cc",
    "gamepad_user_gesture.h",
    "hid_haptic_gamepad.cc",
    "hid_haptic_gamepad.h",
    "hid_writer.h",
    "xbox_hid_controller.cc",
    "xbox_hid_controller.h",
  ]

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

  public_deps = [ "//services/device/public/mojom" ]

  defines = [ "DEVICE_GAMEPAD_IMPLEMENTATION" ]

  if (is_win) {
    sources += [
      "gamepad_standard_mappings_win.cc",
      "hid_writer_win.cc",
      "hid_writer_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",
      "wgi_data_fetcher_win.cc",
      "wgi_data_fetcher_win.h",
      "wgi_gamepad_device.cc",
      "wgi_gamepad_device.h",
      "xinput_data_fetcher_win.cc",
      "xinput_data_fetcher_win.h",
      "xinput_haptic_gamepad_win.cc",
      "xinput_haptic_gamepad_win.h",
    ]
    deps += [ "//device/base" ]
    libs = [ "hid.lib" ]
  }

  if (is_linux || is_chromeos) {
    sources += [
      "gamepad_standard_mappings_linux.cc",
      "hid_writer_linux.cc",
      "hid_writer_linux.h",
    ]
    if (use_udev) {
      sources += [
        "gamepad_device_linux.cc",
        "gamepad_device_linux.h",
        "gamepad_platform_data_fetcher_linux.cc",
        "gamepad_platform_data_fetcher_linux.h",
        "udev_gamepad_linux.cc",
        "udev_gamepad_linux.h",
      ]
      deps += [
        "//build:chromeos_buildflags",
        "//device/udev_linux",
      ]
    }
  }

  if (is_android) {
    sources += [
      "gamepad_platform_data_fetcher_android.cc",
      "gamepad_platform_data_fetcher_android.h",
    ]
    deps += [ ":jni_headers" ]
  }

  if (!is_android && !is_fuchsia) {
    sources += [
      "nintendo_controller.cc",
      "nintendo_controller.h",
      "nintendo_data_fetcher.cc",
      "nintendo_data_fetcher.h",
    ]
  }

  if (is_mac) {
    sources += [
      "game_controller_data_fetcher_mac.h",
      "game_controller_data_fetcher_mac.mm",
      "gamepad_device_mac.h",
      "gamepad_device_mac.mm",
      "gamepad_platform_data_fetcher_mac.h",
      "gamepad_platform_data_fetcher_mac.mm",
      "gamepad_standard_mappings_mac.mm",
      "hid_writer_mac.cc",
      "hid_writer_mac.h",
      "xbox_controller_mac.h",
      "xbox_controller_mac.mm",
      "xbox_data_fetcher_mac.cc",
      "xbox_data_fetcher_mac.h",
    ]
    frameworks = [
      "CoreFoundation.framework",
      "Foundation.framework",
      "ForceFeedback.framework",
      "GameController.framework",
      "IOKit.framework",
    ]
  }

  if (is_chromeos) {
    deps += [ "//chromeos/dbus/permission_broker" ]
  }
}

static_library("test_helpers") {
  testonly = true

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

  public_deps = [
    ":gamepad",
    "//base",
    "//base/test:test_support",
    "//device/gamepad/public/cpp:shared_with_blink",
    "//third_party/blink/public:blink_headers",
  ]

  if (is_win) {
    sources += [
      "test_support/fake_igamepad.cc",
      "test_support/fake_igamepad.h",
      "test_support/fake_igamepad_statics.cc",
      "test_support/fake_igamepad_statics.h",
      "test_support/fake_iraw_game_controller.cc",
      "test_support/fake_iraw_game_controller.h",
      "test_support/fake_winrt_wgi_environment.cc",
      "test_support/fake_winrt_wgi_environment.h",
    ]
  }
}

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

  android_library("java") {
    sources = [
      "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",
      "//base:jni_java",
      "//build/android:build_java",
      "//third_party/androidx:androidx_annotation_annotation_java",
    ]
    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
    srcjar_deps = [ ":java_enums_srcjar" ]
  }

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