# Copyright 2014 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/ui.gni")
import("//mojo/public/mojo.gni")
import("//mojo/public/tools/bindings/mojom.gni")

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

if (!use_prebuilt_mojo_shell) {

# GYP version: mojo/mojo.gyp:mojo_shell
executable("mojo_shell") {
  sources = [
    "desktop/mojo_main.cc"
  ]

  deps = [
    ":lib",
    "//base",
    "//mojo/common",
    "//mojo/environment:chromium",
  ]

  if (is_component_build) {
    deps += ["//ui/gl"]
  }
}

}  # !use_prebuilt_mojo_shell

# GYP version: mojo/mojo.gyp:mojo_shell_lib
source_set("lib") {
  sources = [
    "app_child_process.cc",
    "app_child_process.h",
    "app_child_process_host.cc",
    "app_child_process_host.h",
    "child_process.cc",
    "child_process.h",
    "child_process_host.cc",
    "child_process_host.h",
    "context.cc",
    "context.h",
    "dynamic_application_loader.cc",
    "dynamic_application_loader.h",
    "dynamic_service_runner.cc",
    "dynamic_service_runner.h",
    "external_application_listener.h",
    "external_application_listener_posix.cc",
    "external_application_listener_win.cc",
    "filename_util.cc",
    "filename_util.h",
    "in_process_dynamic_service_runner.cc",
    "in_process_dynamic_service_runner.h",
    "incoming_connection_listener_posix.cc",
    "incoming_connection_listener_posix.h",
    "init.cc",
    "init.h",
    "mojo_url_resolver.cc",
    "mojo_url_resolver.h",
    "out_of_process_dynamic_service_runner.cc",
    "out_of_process_dynamic_service_runner.h",
    "switches.cc",
    "switches.h",
    "task_runners.cc",
    "task_runners.h",
    "test_child_process.cc",
    "test_child_process.h",
    "ui_application_loader_android.cc",
    "ui_application_loader_android.h",
  ]

  deps = [
    ":app_child_process_bindings",
    ":external_application_registrar_bindings",
    ":external_service_bindings",
    "//base",
    "//base/third_party/dynamic_annotations",
    "//base:base_static",
    "//mojo/application",
    "//mojo/application_manager",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/gles2",
    "//mojo/public/interfaces/application",
    "//mojo/services/public/interfaces/network",
    "//mojo/shell/domain_socket",
    "//mojo/spy",
  ]

  if (is_android) {
    sources += [
      "network_application_loader.cc",
      "network_application_loader.h",
    ]

    deps += [
      "//mojo/services/native_viewport:lib",
      "//mojo/services/network:lib",
    ]
  }
}

if (is_android) {
  generate_jni("jni_headers") {
    sources = [
      "android/apk/src/org/chromium/mojo_shell_apk/MojoMain.java",
    ]
    jni_package = "mojo"
  }

  android_library("java") {
    java_files = [
      "android/apk/src/org/chromium/mojo_shell_apk/MojoMain.java",
      "android/apk/src/org/chromium/mojo_shell_apk/MojoShellActivity.java",
      "android/apk/src/org/chromium/mojo_shell_apk/MojoShellApplication.java",
    ]

    deps = [
      "//base:base_java",
      "//net/android:net_java",
    ]
  }

  android_resources("resources") {
    resource_dirs = [ "android/apk/res" ]
    custom_package = "org.chromium.mojo_shell_apk"
  }

  shared_library("libmojo_shell") {
    sources = [
      "android/library_loader.cc",
      "android/mojo_main.cc",
      "android/mojo_main.h",
    ]
    deps = [
      ":jni_headers",
      ":lib",
      "//ui/gl",
    ]
  }

  android_apk("mojo_shell_apk") {
    apk_name = "MojoShell"

    android_manifest = "android/apk/AndroidManifest.xml"

    native_libs = [
      "libmojo_shell.so"
    ]

    deps = [
      ":java",
      ":libmojo_shell",
      ":resources",
      "//mojo/services/native_viewport:native_viewport_java",
    ]

  }
}

mojom("app_child_process_bindings") {
  sources = [
    "app_child_process.mojom"
  ]
}

mojom("external_service_bindings") {
  sources = [
    "external_service.mojom"
  ]
}

mojom("external_application_registrar_bindings") {
  sources = [
    "external_application_registrar.mojom"
  ]

  deps = [ "//mojo/public/interfaces/application" ]
}

source_set("external_application_registrar_connection") {
  sources = [
    "external_application_registrar_connection.cc",
    "external_application_registrar_connection.h",
  ]

  deps = [
   ":external_application_registrar_bindings",
   "//mojo/shell/domain_socket"
  ]
}

# GYP version: mojo/mojo.gyp:mojo_shell_tests
test("mojo_shell_tests") {
  sources = [
    "child_process_host_unittest.cc",
    "dynamic_application_loader_unittest.cc",
    "in_process_dynamic_service_runner_unittest.cc",
    "mojo_url_resolver_unittest.cc",
    "shell_test_base.cc",
    "shell_test_base.h",
    "shell_test_base_unittest.cc",
    "shell_test_main.cc",
  ]

  deps = [
    ":lib",
    "//base",
    "//base:i18n",
    "//base/test:test_support",
    "//testing/gtest",
    "//net:test_support",
    "//url",
    "//mojo/application_manager",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/services/test_service:bindings",
  ]

  datadeps = [
    "//mojo/services/test_service:test_app",
    "//mojo/services/test_service:test_request_tracker_app",
  ]

  if (is_android) {
    deps += [
      # TODO(GYP):
      #'../testing/android/native_test.gyp:native_test_native_code',
    ]
  }
}

# GYP version: mojo/mojo.gyp:mojo_shell_test_support
source_set("test_support") {
  sources = [
    "shell_test_helper.cc",
    "shell_test_helper.h",
  ]

  deps = [
    ":lib",
    "//mojo/edk/system",
  ]
}

# GYP version: mojo/mojo.gyp:external_application_tests
test("external_application_tests") {
  sources = [
    "incoming_connection_listener_unittest.cc",
    "external_application_listener_unittest.cc",
    "external_application_test_main.cc",
  ]

  deps = [
    ":lib",
    ":external_application_registrar_connection",
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
    "//url",
    "//mojo/application_manager",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/shell/domain_socket:tests",
  ]
}
