# 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/rules.gni")  # For generate_jni().
}

source_set("generic_sensor") {
  visibility = [ "//services/device:*" ]

  output_name = "generic_sensor"
  sources = [
    "absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.cc",
    "absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.h",
    "generic_sensor_consts.h",
    "linear_acceleration_fusion_algorithm_using_accelerometer.cc",
    "linear_acceleration_fusion_algorithm_using_accelerometer.h",
    "linux/sensor_data_linux.cc",
    "linux/sensor_data_linux.h",
    "orientation_euler_angles_fusion_algorithm_using_quaternion.cc",
    "orientation_euler_angles_fusion_algorithm_using_quaternion.h",
    "orientation_quaternion_fusion_algorithm_using_euler_angles.cc",
    "orientation_quaternion_fusion_algorithm_using_euler_angles.h",
    "orientation_util.cc",
    "orientation_util.h",
    "platform_sensor.cc",
    "platform_sensor.h",
    "platform_sensor_accelerometer_mac.cc",
    "platform_sensor_accelerometer_mac.h",
    "platform_sensor_ambient_light_mac.cc",
    "platform_sensor_ambient_light_mac.h",
    "platform_sensor_android.cc",
    "platform_sensor_android.h",
    "platform_sensor_fusion.cc",
    "platform_sensor_fusion.h",
    "platform_sensor_fusion_algorithm.cc",
    "platform_sensor_fusion_algorithm.h",
    "platform_sensor_linux.cc",
    "platform_sensor_linux.h",
    "platform_sensor_provider.cc",
    "platform_sensor_provider.h",
    "platform_sensor_provider_android.cc",
    "platform_sensor_provider_android.h",
    "platform_sensor_provider_base.cc",
    "platform_sensor_provider_base.h",
    "platform_sensor_provider_mac.cc",
    "platform_sensor_provider_mac.h",
    "platform_sensor_provider_win.cc",
    "platform_sensor_provider_win.h",
    "platform_sensor_reader_linux.cc",
    "platform_sensor_reader_linux.h",
    "platform_sensor_reader_win.cc",
    "platform_sensor_reader_win.h",
    "platform_sensor_win.cc",
    "platform_sensor_win.h",
    "relative_orientation_euler_angles_fusion_algorithm_using_accelerometer.cc",
    "relative_orientation_euler_angles_fusion_algorithm_using_accelerometer.h",
    "relative_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_gyroscope.cc",
    "relative_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_gyroscope.h",
    "sensor_impl.cc",
    "sensor_impl.h",
    "sensor_provider_impl.cc",
    "sensor_provider_impl.h",
  ]

  deps = [
    "//base",
    "//device/base/synchronization",
    "//services/device/public/cpp:device_features",
    "//ui/gfx/geometry:geometry",
  ]

  public_deps = [
    "//services/device/public/cpp/generic_sensor",
  ]

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

  if (is_mac) {
    deps += [ "//third_party/sudden_motion_sensor" ]
    libs = [
      "CoreFoundation.framework",
      "IOKit.framework",
    ]
  }

  if (use_udev) {
    deps += [
      "//device/base",
      "//device/udev_linux",
    ]

    sources += [
      "linux/sensor_device_manager.cc",
      "linux/sensor_device_manager.h",
      "platform_sensor_provider_linux.cc",
      "platform_sensor_provider_linux.h",
    ]
  }

  if (is_win) {
    libs = [
      "portabledeviceguids.lib",
      "sensorsapi.lib",
    ]
  }
}

if (is_android) {
  device_sensors_jni_sources = [
    "android/java/src/org/chromium/device/sensors/PlatformSensor.java",
    "android/java/src/org/chromium/device/sensors/PlatformSensorProvider.java",
  ]

  generate_jni("jni_headers") {
    visibility = [ ":generic_sensor" ]

    sources = device_sensors_jni_sources
    jni_package = "device"
  }

  android_library("java") {
    visibility = [
      "//services:*",
      "//services/device:*",
    ]

    java_files = device_sensors_jni_sources
    deps = [
      "//base:base_java",
      "//services/device/public/mojom:generic_sensor_java",
    ]
  }
}
