# 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/mojo_application.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//mojo/tools/embed/rules.gni")
import("//testing/test.gni")

# We don't support building in the component build since mojo apps are
# inherently components.
assert(!is_component_build)

group("shell") {
  testonly = true

  deps = [
    ":mojo_shell",
    ":tests",
    ":copy_symbols",
  ]

  if (is_android) {
    deps += [
      ":mojo_shell_apk",
      ":mojo_shell_tests_apk",
    ]
  }
}

group("tests") {
  testonly = true
  deps = [
    ":apptests",
    ":mojo_shell_tests",
    ":shell_nfc_apptests",
    "//shell/application_manager:mojo_application_manager_unittests",
    "//shell/crash:crash_unittests",
  ]
}

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

if (!mojo_use_prebuilt_mojo_shell) {
  shell_common_deps = [
    ":parent_lib",
    "//base",
    "//base/allocator",
    "//build/config/sanitizers:deps",
    "//mojo/environment:chromium",
    "//mojo/message_pump",
    "//shell/crash",
  ]
  shell_common_data_deps = [ ":mojo_shell_child" ]

  if (is_android) {
    shared_library("mojo_shell") {
      sources = [
        "android/library_loader.cc",
        "android/main.cc",
        "android/main.h",
      ]

      deps = shell_common_deps + [
               ":jni_headers",
               "//mojo/android:libsystem_java",
               "//mojo/services/window_manager/public/interfaces:interfaces",
               "//services/native_viewport:lib",
               "//shell/application_manager",
               "//ui/gl",
             ]

      data_deps = shell_common_data_deps
    }
  } else {
    executable("mojo_shell") {
      sources = [
        "desktop/main.cc",
      ]

      deps = shell_common_deps

      data_deps = shell_common_data_deps
    }
  }

  executable("mojo_shell_child") {
    sources = [
      "child_main.cc",
    ]

    deps = [
      ":child_controller_bindings",
      ":common_lib",
      "//base",
      "//base/allocator",
      "//build/config/sanitizers:deps",
      "//mojo/edk/system",
      "//mojo/environment:chromium",
      "//mojo/message_pump",
    ]
  }
}  # !mojo_use_prebuilt_mojo_shell

# Files used both by mojo_shell and mojo_shell_child (and tests).
source_set("common_lib") {
  sources = [
    "child_switches.cc",
    "child_switches.h",
    "init.cc",
    "init.h",
  ]

  deps = [
    "//base",
  ]

  public_deps = [
    ":native_application_support",
  ]
}

source_set("parent_lib") {
  sources = [
    "background_application_loader.cc",
    "background_application_loader.h",
    "child_process_host.cc",
    "child_process_host.h",
    "command_line_util.cc",
    "command_line_util.h",
    "context.cc",
    "context.h",
    "filename_util.cc",
    "filename_util.h",
    "in_process_native_runner.cc",
    "in_process_native_runner.h",
    "out_of_process_native_runner.cc",
    "out_of_process_native_runner.h",
    "switches.cc",
    "switches.h",
    "task_runners.cc",
    "task_runners.h",
    "tracer.cc",
    "tracer.h",
    "url_resolver.cc",
    "url_resolver.h",
    "url_response_disk_cache_loader.cc",
    "url_response_disk_cache_loader.h",
  ]

  deps = [
    ":child_controller_bindings",
    "//base",
    "//base/third_party/dynamic_annotations",
    "//base:base_static",
    "//mojo/application",
    "//mojo/common",
    "//mojo/common:tracing_impl",
    "//mojo/data_pipe_utils",
    "//mojo/edk/system",
    "//mojo/public/cpp/bindings",
    "//mojo/public/interfaces/application",
    "//mojo/services/network/public/interfaces",
    "//mojo/services/tracing/public/interfaces",
    "//services/url_response_disk_cache",
    "//shell/application_manager",
    "//url",
  ]

  public_deps = [
    ":common_lib",
  ]

  if (is_android) {
    sources += [
      "android/android_handler.cc",
      "android/android_handler.h",
      "android/android_handler_loader.cc",
      "android/android_handler_loader.h",
      "android/java_application_loader.cc",
      "android/java_application_loader.h",
      "android/native_viewport_application_loader.cc",
      "android/native_viewport_application_loader.h",
      "android/ui_application_loader_android.cc",
      "android/ui_application_loader_android.h",
    ]

    deps += [
      ":jni_headers",
      ":run_android_application_function",
      "//mojo/application:content_handler",
      "//mojo/services/content_handler/public/interfaces",
      "//mojo/services/gpu/public/interfaces",
      "//mojo/services/native_viewport/public/interfaces",
      "//services/gles2",
      "//services/native_viewport:lib",
    ]
  }
}

# This is a separate target mainly since it suppresses check_includes.
# TODO(vtl): Make it so that the suppression isn't needed.
source_set("native_application_support") {
  sources = [
    "native_application_support.cc",
    "native_application_support.h",
  ]

  public_deps = [
    "//mojo/public/cpp/bindings",
  ]

  deps = [
    "//base",
    "//mojo/gles2:control_thunks",
    "//mojo/gles2:gles2",
    "//mojo/gles2:mgl",
  ]

  # This target has to include the public thunk headers, which generally
  # shouldn't be included without picking an implementation. We are providing
  # the implementation but the thunk header target cannot declare that we are
  # permitted to include it since it's in the public SDK and we are not.
  # Suppress include checking so we can still check the rest of the targets in
  # this file.
  check_includes = false
}

if (is_android) {
  generate_jni("jni_headers") {
    sources = [
      "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java",
      "android/apk/src/org/chromium/mojo/shell/Bootstrap.java",
      "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/ShellService.java",
      "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java",
    ]
    jni_package = "mojo/shell"
  }

  android_library("bootstrap_java") {
    java_files = [ "android/apk/src/org/chromium/mojo/shell/Bootstrap.java" ]

    deps = [
      "//base:base_java",
    ]

    dex_path = "$target_out_dir/bootstrap_java.dex.jar"
  }

  shared_library("bootstrap") {
    sources = [
      "android/bootstrap.cc",
    ]
    deps = [
      ":jni_headers",
      ":run_android_application_function",
      "//base",
    ]
  }

  # Shared header between the bootstrap and the main shell .so.
  source_set("run_android_application_function") {
    sources = [
      "android/run_android_application_function.h",
    ]

    deps = [
      "//base",
    ]
  }

  android_library("java") {
    java_files = [
      "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java",
      "android/apk/src/org/chromium/mojo/shell/FileHelper.java",
      "android/apk/src/org/chromium/mojo/shell/IntentReceiverActivity.java",
      "android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/KeyboardFactory.java",
      "android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java",
      "android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java",
      "android/apk/src/org/chromium/mojo/shell/NativeViewportSupportApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/NfcApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/NfcDbManager.java",
      "android/apk/src/org/chromium/mojo/shell/NfcImpl.java",
      "android/apk/src/org/chromium/mojo/shell/NfcReceiverActivity.java",
      "android/apk/src/org/chromium/mojo/shell/NfcServiceFactoryBinder.java",
      "android/apk/src/org/chromium/mojo/shell/SharingActivity.java",
      "android/apk/src/org/chromium/mojo/shell/SharingApplicationDelegate.java",
      "android/apk/src/org/chromium/mojo/shell/ShellService.java",
      "android/apk/src/org/chromium/mojo/shell/ViewportActivity.java",
    ]

    deps = [
      ":resources",
      "//base:base_java",
      "//mojo/android:system_java",
      "//mojo/public/interfaces/application:application_java",
      "//mojo/public/java:application",
      "//mojo/public/java:bindings",
      "//mojo/public/java:system",
      "//mojo/services/keyboard/public/interfaces:interfaces_java",
      "//services/authentication",
      "//services/location",
      "//services/intent_receiver:bindings_java",
      "//services/native_viewport:interfaces_java",
      "//services/nfc_message_sink:bindings_java",
      "//services/sharing_sink:bindings_java",
      "//mojo/services/nfc/public/interfaces:interfaces_java",
      "//services/keyboard",
      "//services/native_viewport:native_viewport_java",
    ]
  }

  if (is_official_build) {
    icon_dir = "android/apk/res-official"
  } else {
    icon_dir = "android/apk/res-dev"
  }

  android_resources("resources") {
    resource_dirs = [
      "android/apk/res",
      icon_dir,
    ]
    custom_package = "org.chromium.mojo.shell"
  }

  mojo_shell_assets_dir = "$root_build_dir/mojo_shell_assets"
  mojo_shell_test_assets_dir = "$root_build_dir/mojo_shell_test_assets"

  copy_ex("copy_mojo_shell_assets") {
    clear_dir = true
    dest = mojo_shell_assets_dir
    sources = [
      "$root_out_dir/exe.stripped/mojo_shell_child",
      "$root_out_dir/lib.stripped/libbootstrap.so",
      "$root_out_dir/network_service.mojo",
      "$root_out_dir/obj/shell/bootstrap_java.dex.jar",
    ]
    deps = [
      ":mojo_shell_child",
      ":bootstrap",
      ":bootstrap_java",
      "//mojo/public/tools:copy_network_service",
    ]
  }

  copy_ex("copy_mojo_shell_test_assets") {
    clear_dir = true
    dest = mojo_shell_test_assets_dir
    sources = [
      "$root_out_dir/test_app.mojo",
      "$root_out_dir/test_request_tracker_app.mojo",
    ]
    deps = [
      "//services/test_service:test_app",
      "//services/test_service:test_request_tracker_app",
    ]
  }

  if (!is_official_build) {
    manifest_package = "org.chromium.mojo.shell"
    apk_name = "Mojo Shell (dev)"
  } else {
    manifest_package = "io.mojoapps.launcher"
    apk_name = "Mojo Shell"
  }

  if (is_official_build) {
    # Force GN to re-generate ninja files when a new commit is present.
    read_file("//.git/index", "")
    version_code =
        exec_script("//mojo/public/tools/gn/last_commit_timestamp.py",
                    [
                      "--directory",
                      rebase_path("//", root_build_dir),
                    ],
                    "trim string")

    # Download the keystore for signing.
    keystore_path = "$root_build_dir/mojo_shell-official.keystore"
    action("download_keystore") {
      script = "//mojo/tools/download_keystore.py"
      outputs = [
        keystore_path,
      ]
      args = [
        "keystore_file",
        rebase_path(keystore_path, root_build_dir),
      ]
    }
    keystore_password = exec_script("//mojo/tools/download_keystore.py",
                                    [ "keystore_password" ],
                                    "trim string")
  } else {
    version_code = "1"
  }
  version_name = "0.0.1"

  jinja_variables = [
    "manifest_package=$manifest_package",
    "apk_name=$apk_name",
    "version_code=$version_code",
    "version_name=$version_name",
  ]

  mojo_shell_manifest =
      "$target_gen_dir/mojo_shell_manifest/AndroidManifest.xml"

  jinja_template("mojo_shell_manifest") {
    variables = jinja_variables
    input = "android/apk/AndroidManifest.xml.jinja2"
    output = mojo_shell_manifest
  }

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

    android_manifest = mojo_shell_manifest

    native_libs = [ "libmojo_shell.so" ]

    asset_location = mojo_shell_assets_dir

    deps = [
      ":copy_mojo_shell_assets",
      ":java",
      ":mojo_shell",
      ":mojo_shell_manifest",
      ":resources",
      "//base:base_java",
      "//services/native_viewport:native_viewport_java",
      "//third_party/android_tools:google_play_services_default_resources",
    ]

    if (is_official_build) {
      deps += [ ":download_keystore" ]
      keystore_path = keystore_path
      keystore_name = "official"
      keystore_password = keystore_password
    }
  }

  android_library("mojo_shell_tests_java") {
    java_files =
        [ "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java" ]

    deps = [
      ":java",
      "//base:base_java",
    ]
  }
}

mojom("child_controller_bindings") {
  sources = [
    "child_controller.mojom",
  ]

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

test("mojo_shell_tests") {
  sources = [
    "background_application_loader_unittest.cc",
    "child_process_host_unittest.cc",
    "command_line_util_unittest.cc",
    "context_unittest.cc",
    "data_pipe_peek_unittest.cc",
    "in_process_native_runner_unittest.cc",
    "native_runner_unittest.cc",
    "shell_test_base.cc",
    "shell_test_base.h",
    "shell_test_base_android.cc",
    "shell_test_base_unittest.cc",
    "shell_test_main.cc",
    "url_resolver_unittest.cc",
  ]

  deps = [
    ":parent_lib",
    "//base",
    "//base/test:test_support",
    "//base:i18n",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/message_pump",
    "//mojo/public/cpp/bindings",
    "//services/test_service:bindings",
    "//shell/application_manager",
    "//testing/gtest",
    "//url",
  ]

  data_deps = [
    ":mojo_shell_child",
    "//services/test_service:test_app",
    "//services/test_service:test_request_tracker_app",
  ]

  if (is_android) {
    deps += [ ":jni_headers" ]

    apk_deps = [
      ":copy_mojo_shell_test_assets",
      ":mojo_shell_tests_java",
    ]

    apk_asset_location = mojo_shell_test_assets_dir
  }
}

# Shared library propagation will happen up to executable, shared library,
# or complete static library boundaries.
# Workaround from brettw to prevent gn from linking pingable app into the
# apptests executable.
static_library("pingable_app_dummy") {
  complete_static_lib = true
  testonly = true
  public_deps = [
    "//shell/test:pingable_app($default_toolchain)",
  ]
}

embed_file("embed_pingable") {
  source = "$root_build_dir/pingable_app.mojo"
  namespace = "shell::test"
  variable = "kPingable"
  testonly = true
  deps = [
    ":pingable_app_dummy",
  ]
}

mojo_native_application("apptests") {
  output_name = "shell_apptests"

  testonly = true

  sources = [
    "shell_apptest.cc",
  ]

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/data_pipe_utils",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/environment",
    "//mojo/public/cpp/system:system",
    "//mojo/services/http_server/public/cpp",
    "//mojo/services/http_server/public/interfaces",
    "//mojo/services/network/public/interfaces",
    "//shell/test:bindings",
    ":embed_pingable",
  ]

  data_deps = [ "//services/http_server:http_server($default_toolchain)" ]
}

mojo_native_application("shell_nfc_apptests") {
  output_name = "shell_nfc_apptests"

  testonly = true

  sources = [
    "android/nfc_apptest.cc",
  ]

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/common:common",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/public/cpp/environment",
    "//mojo/public/cpp/system:system",
    "//mojo/services/nfc/public/interfaces",
    "//shell/test:bindings",
  ]
}

copy("copy_symbols") {
  testonly = true

  deps = [
    ":mojo_shell",
    ":mojo_shell_child",
  ]
  if (is_android) {
    deps += [ ":bootstrap" ]
  }

  sources = [
    "${root_out_dir}/mojo_shell_child",
  ]
  if (is_android) {
    sources += [
      "${root_out_dir}/libbootstrap.so",
      "${root_out_dir}/libmojo_shell.so",
    ]
  } else {
    sources += [ "${root_out_dir}/mojo_shell" ]
  }

  outputs = [
    "${root_out_dir}/symbols/{{source_file_part}}",
  ]
}
