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

declare_args() {
  # Password to the keystore used to sign MojoShell APK. The actual password
  # should be defined in args.gn in the root build directory.
  keystore_password = ""
}

# 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",
  ]

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

group("tests") {
  testonly = true
  deps = [
    ":mojo_shell_tests",
    "//shell/application_manager:mojo_application_manager_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/common",
    "//mojo/environment:chromium",
  ]
  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/common",
      "//mojo/edk/system",
      "//mojo/environment:chromium",
    ]
  }
}  # !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/edk/system",
    "//mojo/public/cpp/bindings",
    "//mojo/public/interfaces/application",
    "//mojo/services/network/public/interfaces",
    "//shell/application_manager",
    "//services/url_response_disk_cache",
    "//services/tracing:bindings",
    "//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/intent_receiver_manager_factory.cc",
      "android/intent_receiver_manager_factory.h",
      "android/intent_receiver_manager_impl.cc",
      "android/intent_receiver_manager_impl.h",
      "android/keyboard_impl.cc",
      "android/keyboard_impl.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/keyboard/public/interfaces",
      "//mojo/services/native_viewport/public/interfaces",
      "//services/android:bindings",
      "//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",
  ]

  # 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/IntentReceiverRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/Keyboard.java",
      "android/apk/src/org/chromium/mojo/shell/ShellMain.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/IntentReceiverService.java",
      "android/apk/src/org/chromium/mojo/shell/FileHelper.java",
      "android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java",
      "android/apk/src/org/chromium/mojo/shell/Keyboard.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/ShellMain.java",
    ]

    deps = [
      ":resources",
      "//base:base_java",
      "//mojo/android:system_java",
      "//mojo/public/java:bindings",
      "//mojo/public/java:system",
      "//mojo/services/keyboard/public/interfaces:interfaces_java",
      "//services/keyboard",
    ]
  }

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

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

  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 = [ rebase_path(keystore_path, root_build_dir) ]
    }
  } 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",
      ":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:i18n",
    "//base/test:test_support",
    "//testing/gtest",
    "//url",
    "//mojo/common",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/public/cpp/bindings",
    "//services/test_service:bindings",
    "//shell/application_manager",
  ]

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

embed_file("embed_pingable") {
  source = "$root_build_dir/pingable_app.mojo"
  namespace = "shell::test"
  variable = "kPingable"
  testonly = true

  deps = [
    "//shell/test:pingable_app",
  ]
}

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

  testonly = true

  sources = [
    "shell_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/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)" ]
}
