# Copyright 2019 The Fuchsia 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/components.gni")
import("//src/sys/core/build/core_shard.gni")

group("ui") {
  testonly = true
  deps = [
    "a11y",
    "bin",
    "examples",
    "input",
    "scenic",
    "tools",
    "wayland",
  ]
}

group("tests") {
  testonly = true

  deps = [
    "a11y:tests",
    "backlight:tests",
    "bin:tests",
    "examples:tests",
    "input:tests",
    "lib:tests",
    "light:tests",
    "scenic:tests",
    "testing:tests",
    "tests",
    "tools:tests",
    "wayland:tests",
  ]
}

core_shard("ui_core_shard") {
  shard_file = "meta/ui.core_shard.cml"
}

fuchsia_component("ui_component") {
  component_name = "ui"
  manifest = "meta/ui.cml"
  deps = [ "//src/graphics/display/bin/coordinator-connector:shard-includes" ]
}

fuchsia_package("ui_package") {
  package_name = "ui"

  deps = [ ":ui_component" ]
}

fuchsia_component("ui_with_synthetic_device_support_component") {
  component_name = "ui"
  manifest = "meta/ui_with_synthetic_device_support.cml"
  deps = [
    # `display-coordinator-connector` lets components connect to the
    # `fuchsia.hardware.display.Coordinator` service, provided by the display
    # coordinator driver so that components can present contents to the display
    # hardware.
    "//src/graphics/display/bin/coordinator-connector:shard-includes",
    "//src/ui/testing/input_helper:input-helper-component",
  ]
}

fuchsia_package("ui_with_synthetic_device_support_package") {
  package_name = "ui"

  deps = [ ":ui_with_synthetic_device_support_component" ]
}
