# Copyright 2015 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.

common_deps = [
  "//base",
  "//base:i18n",
  "//build/config/sanitizers:deps",
  "//dart/runtime:libdart",
  "//mojo/data_pipe_utils",
  "//mojo/edk/system",
  "//mojo/message_pump",
  "//mojo/public/cpp/application",
  "//mojo/public/interfaces/application",
  "//mojo/services/asset_bundle/interfaces",
  "//mojo/services/keyboard/interfaces",
  "//mojo/services/navigation/interfaces",
  "//mojo/services/network/interfaces",
  "//services/asset_bundle:lib",
  "//skia",
  "//sky/compositor",
  "//sky/engine",
  "//sky/engine/tonic",
  "//sky/engine/wtf",
  "//sky/services/engine:interfaces",
  "//sky/services/vsync:interfaces",
  "//sky/shell/dart",
  "//ui/gfx/geometry",
  "//ui/gl",
  "//url:url",
]

if (is_linux || is_mac) {

  testing_sources = [
    "testing/test_runner.cc",
    "testing/test_runner.h",
    "testing/testing.cc",
    "testing/testing.h",
  ]

}

source_set("common") {
  sources = [
    "gpu/ganesh_context.cc",
    "gpu/ganesh_context.h",
    "gpu/ganesh_surface.cc",
    "gpu/ganesh_surface.h",
    "gpu/rasterizer.cc",
    "gpu/rasterizer.h",
    "gpu_delegate.cc",
    "gpu_delegate.h",
    "platform_view.cc",
    "platform_view.h",
    "service_provider.cc",
    "service_provider.h",
    "shell.cc",
    "shell.h",
    "shell_view.cc",
    "shell_view.h",
    "switches.cc",
    "switches.h",
    "tracing_controller.cc",
    "tracing_controller.h",
    "ui/animator.cc",
    "ui/animator.h",
    "ui/engine.cc",
    "ui/engine.h",
    "ui/input_event_converter.cc",
    "ui/input_event_converter.h",
    "ui/internals.cc",
    "ui/internals.h",
    "ui/platform_impl.cc",
    "ui/platform_impl.h",
    "ui_delegate.cc",
    "ui_delegate.h",
  ]

  deps = common_deps
}

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")

  generate_jni("jni_headers") {
    sources = [
      "android/org/domokit/sky/shell/PlatformServiceProvider.java",
      "android/org/domokit/sky/shell/PlatformViewAndroid.java",
      "android/org/domokit/sky/shell/SkyMain.java",
      "android/org/domokit/sky/shell/TracingController.java",
      "android/org/domokit/sky/shell/UpdateService.java",
    ]
    jni_package = "sky/shell"
  }

  shared_library("sky_shell") {
    sources = [
      "android/library_loader.cc",
      "android/platform_service_provider_android.cc",
      "android/platform_service_provider_android.h",
      "android/platform_view_android.cc",
      "android/platform_view_android.h",
      "android/sky_main.cc",
      "android/sky_main.h",
      "android/tracing_controller.cc",
      "android/tracing_controller.h",
      "android/update_service_android.cc",
    ]

    deps = common_deps + [
             "//mojo/android:libsystem_java",
             ":jni_headers",
             ":common",
           ]
    ldflags = [
      "-lGLESv2",
      "-lEGL",
    ]
  }

  android_library("java") {
    java_files = [
      "android/org/domokit/sky/shell/PlatformServiceProvider.java",
      "android/org/domokit/sky/shell/PlatformViewAndroid.java",
      "android/org/domokit/sky/shell/ResourceCleaner.java",
      "android/org/domokit/sky/shell/ResourceExtractor.java",
      "android/org/domokit/sky/shell/ServiceFactory.java",
      "android/org/domokit/sky/shell/ServiceRegistry.java",
      "android/org/domokit/sky/shell/SkyActivity.java",
      "android/org/domokit/sky/shell/SkyApplication.java",
      "android/org/domokit/sky/shell/SkyMain.java",
      "android/org/domokit/sky/shell/TracingController.java",
      "android/org/domokit/sky/shell/UpdateService.java",
    ]

    deps = [
      "//base:base_java",
      "//mojo/android:system_java",
      "//mojo/public/interfaces/application:application_java",
      "//mojo/public/java:bindings",
      "//mojo/public/java:system",
      "//mojo/services/keyboard/interfaces:interfaces_java",
      "//mojo/services/network/interfaces:interfaces_java",
      "//mojo/services/sensors/interfaces:interfaces_java",
      "//services/keyboard",
      "//services/sensors:sensors_lib",
      "//sky/services/activity:activity_lib",
      "//sky/services/activity:interfaces_java",
      "//sky/services/engine:interfaces_java",
      "//sky/services/media:interfaces_java",
      "//sky/services/media:media_lib",
      "//sky/services/oknet",
      "//sky/services/updater:interfaces_java",
      "//sky/services/vsync:interfaces_java",
      "//sky/services/vsync:vsync_lib",
    ]
  }

  copy_ex("assets") {
    clear_dir = true
    dest = "$root_build_dir/sky_shell/assets"
    sources = [
      "$root_build_dir/icudtl.dat",
    ]
    deps = [
      "//third_party/icu:icudata",
    ]
  }

  android_apk("shell") {
    apk_name = "SkyShell"
    android_manifest = "android/AndroidManifest.xml"

    native_libs = [ "libsky_shell.so" ]
    asset_location = "$root_build_dir/sky_shell/assets"

    extensions_to_not_compress = ".flx"

    deps = [
      ":assets",
      ":assets",
      ":java",
      ":sky_shell",
      "//base:base_java",
    ]
  }
} else if (is_ios) {
  import("//build/config/ios/rules.gni")
  import("//build/config/ios/ios_sdk.gni")

  source_set("ios_scaffolding") {
    sources = [
      "ios/main_ios.mm",
      "ios/sky_app_delegate.h",
      "ios/sky_app_delegate.mm",
      "ios/sky_surface.h",
      "ios/sky_surface.mm",
      "ios/sky_view_controller.h",
      "ios/sky_view_controller.mm",
    ]

    set_sources_assignment_filter([])
    sources += [
      "mac/platform_mac.h",
      "mac/platform_mac.mm",
      "mac/platform_service_provider_mac.cc",
      "mac/platform_view_mac.h",
      "mac/platform_view_mac.mm",
    ]
    set_sources_assignment_filter(sources_assignment_filter)

    deps = common_deps + [
             ":common",
             "//sky/services/keyboard",
             "//sky/services/media",
             "//sky/services/ns_net",
             "//sky/services/vsync",
           ]
  }

  group("shell") {
    # iOS only supports application bundles with a precompiled instruction
    # buffer. There is not Shell target for the same.
  }
} else if (is_linux) {
  executable("shell") {
    output_name = "sky_shell"

    sources = [
      "linux/main_linux.cc",
      "linux/platform_service_provider_linux.cc",
      "linux/platform_view_linux.cc",
    ] + testing_sources

    deps = common_deps + [
             ":common",
             "//mojo/common",
           ]
  }
} else if (is_mac) {
  import("//build/config/mac/rules.gni")

  source_set("mac_scaffolding") {
    sources = [
      "mac/main_mac.mm",
      "mac/platform_mac.h",
      "mac/platform_mac.mm",
      "mac/platform_service_provider_mac.cc",
      "mac/platform_view_mac.h",
      "mac/platform_view_mac.mm",
      "mac/sky_app_delegate.h",
      "mac/sky_app_delegate.m",
      "mac/sky_application.h",
      "mac/sky_application.mm",
      "mac/sky_window.h",
      "mac/sky_window.mm",
    ] + testing_sources

    deps = common_deps + [
             ":common",
             "//mojo/common",
             "//sky/services/ns_net",
           ]
  }

  mac_app("shell") {
    app_name = "SkyShell"
    info_plist = "mac/Info.plist"

    # entitlements_path = ""
    # code_signing_identity = ""

    xibs = [ "mac/sky_mac.xib" ]

    resource_copy_mac("sky_resources") {
      resources = [
        "//third_party/icu/android/icudtl.dat",
        "ios/LaunchScreen.storyboardc"
      ]
      bundle_directory = "."
    }

    deps = [
      ":mac_scaffolding",
      ":sky_resources",
    ]
  }
} else {
  assert(false, "Unsupported platform")
}
