# 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/public/interfaces",
  "//mojo/services/keyboard/public/interfaces",
  "//mojo/services/navigation/public/interfaces",
  "//mojo/services/network/public/interfaces",
  "//services/asset_bundle:lib",
  "//skia",
  "//sky/engine",
  "//sky/engine/tonic",
  "//sky/engine/wtf",
  "//sky/services/engine:interfaces",
  "//sky/services/vsync:interfaces",
  "//sky/shell/dart",
  "//ui/gfx/geometry",
  "//ui/gl",
]

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/picture_serializer.cc",
    "gpu/picture_serializer.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",
    ]
    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",
    ]

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

  android_library("java") {
    java_files = [
      "android/org/domokit/sky/shell/GestureProvider.java",
      "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",
    ]

    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/public/interfaces:interfaces_java",
      "//mojo/services/network/public/interfaces:interfaces_java",
      "//mojo/services/sensors/public/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/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 = ".skyx"

    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/document_watcher.m",
      "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/ns_net",
             "//sky/services/keyboard",
             "//sky/services/media",
           ]
  }

  ios_app("shell") {
    app_name = "SkyShell"
    info_plist = "ios/Info.plist"
    entitlements_path = "ios/Entitlements.xcent"
    code_signing_identity = ios_code_signing_identity

    resource_copy_ios("sky_resources") {
      resources = [ "//third_party/icu/android/icudtl.dat" ]
      bundle_directory = "."
    }

    deps = [
      ":ios_scaffolding",
      ":sky_resources",
    ]
  }
} 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",
             "//sky/services/testing:interfaces",
           ]
  }
} 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",
             "//sky/services/ns_net",
             "//sky/services/testing:interfaces",
           ]
  }

  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")
}
