# 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/public/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/public/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/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/keyboard",
             "//sky/services/media",
             "//sky/services/ns_net",
             "//sky/services/vsync",
           ]
  }

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