# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//android_webview/system_webview_apk_tmpl.gni")
import("//build/config/android/abi.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/python.gni")
import("//device/vr/buildflags/buildflags.gni")
import("//third_party/icu/config.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//weblayer/variables.gni")

generate_wrapper("run_webengine_shell") {
  testonly = true
  wrapper_script = "$root_out_dir/bin/run_webengine_shell"
  executable = "//weblayer/tools/run_webengine_shell.py"
  executable_args = [
    "--shell-apk-path",
    "@WrappedPath(apks/WEShellSandbox.apk)",
    "--support-apk-path",
    "@WrappedPath(apks/WESandbox.apk)",
    "--support-apk-path",
    "@WrappedPath(apks/WebLayerSupport.apk)",
  ]

  deps = [
    ":browser_sandbox_apk",
    ":webengine_shell_sandbox_apk",
    ":weblayer_support_apk",
  ]
}

generate_wrapper("run_webengine_shell_local") {
  testonly = true
  wrapper_script = "$root_out_dir/bin/run_webengine_shell_local"
  executable = "//weblayer/tools/run_webengine_shell.py"
  executable_args = [
    "--shell-apk-path",
    "@WrappedPath(apks/WEShellLocal.apk)",
    "--support-apk-path",
    "@WrappedPath(apks/WebLayerSupport.apk)",
  ]

  deps = [
    ":browser_sandbox_apk",
    ":webengine_shell_local_apk",
    ":weblayer_support_apk",
  ]
}

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

jinja_template("weblayer_support_manifest") {
  input = "support_apk/AndroidManifest.xml"
  output = weblayer_support_manifest
}

android_apk("weblayer_support_apk") {
  testonly = true

  # Test runner does not support having "additional apks" that are incremental.
  never_incremental = true

  deps = [
    ":weblayer_support_manifest",
    "//android_webview:locale_pak_assets",
    "//android_webview:pak_file_assets",
    "//android_webview:weblayer_webview_assets",
    "//weblayer:locale_pak_assets",
    "//weblayer/browser/java",
    "//weblayer/browser/java:test_java",
  ]

  # Transitive dependencies
  deps += [
    "//components/safe_browsing/android:safe_browsing_java",
    "//components/viz/service:service_java",
    "//media/base/android:media_java",
    "//media/capture/video/android:capture_java",
    "//mojo/public/java:system_java",
    "//net/android:net_java",
  ]

  # default upstream classes
  deps += [ "//weblayer/browser/java:upstream_java" ]

  # Add the Chromium linker for WebView compatibility support on L-M.
  deps += [ "//base/android/linker:chromium_android_linker" ]
  loadable_modules =
      [ "$root_out_dir/libchromium_android_linker$shlib_extension" ]

  if (enable_arcore) {
    _libarcore_dir = get_label_info(
                         "//third_party/arcore-android-sdk-client:com_google_ar_core_java($default_toolchain)",
                         "target_out_dir") + "/com_google_ar_core_java/jni"
    loadable_modules +=
        [ "$_libarcore_dir/$android_app_abi/libarcore_sdk_c.so" ]
    deps +=
        [ "//third_party/arcore-android-sdk-client:com_google_ar_core_java" ]
  }

  apk_name = "WebLayerSupport"
  android_manifest = weblayer_support_manifest
  target_sdk_version = 28
  android_manifest_dep = ":weblayer_support_manifest"
  shared_resources = true
  version_name = chrome_version_name
  version_code = webview_stable_version_code

  product_config_java_packages = [ weblayer_product_config_java_package ]

  shared_libraries = [ "//weblayer:libweblayer_test" ]
}

android_resources("webengine_shell_resources") {
  sources = [
    "webengine_shell_apk/res/drawable-night/ic_refresh.xml",
    "webengine_shell_apk/res/drawable-night/ic_stop.xml",
    "webengine_shell_apk/res/drawable/ic_refresh.xml",
    "webengine_shell_apk/res/drawable/ic_stop.xml",
    "webengine_shell_apk/res/layout/main.xml",
    "webengine_shell_apk/res/layout/navigation_test.xml",
    "webengine_shell_apk/res/layout/state_test.xml",
    "webengine_shell_apk/res/values/strings.xml",
    "webengine_shell_apk/res/values/styles.xml",
  ]
}

android_library("webengine_shell_java") {
  testonly = true
  resources_package = "org.chromium.webengine.shell"

  sources = [
    "webengine_shell_apk/src/org/chromium/webengine/shell/DefaultObservers.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineNavigationTestActivity.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellActivity.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineShellApplication.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/WebEngineStateTestActivity.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/topbar/CustomSpinner.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TabEventsDelegate.java",
    "webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TabEventsObserver.java",
  ]

  deps = [
    ":webengine_service_provider_resources",
    ":webengine_shell_resources",
    "//base:base_java",
    "//third_party/android_deps:com_google_guava_listenablefuture_java",
    "//third_party/android_deps:guava_android_java",
    "//third_party/androidx:androidx_annotation_annotation_java",
    "//third_party/androidx:androidx_appcompat_appcompat_java",
    "//third_party/androidx:androidx_concurrent_concurrent_futures_java",
    "//third_party/androidx:androidx_core_core_java",
    "//third_party/androidx:androidx_fragment_fragment_java",
    "//weblayer/public/java:service_provider_java",
    "//weblayer/public/java:webengine_java",
  ]
}

template("webengine_shell_apk_helper") {
  _webengine_shell_manifest =
      "$target_gen_dir/manifest_$target_name/AndroidManifest.xml"
  _manifest_target = target_name + "_manifest"

  jinja_template(_manifest_target) {
    input = "webengine_shell_apk/AndroidManifest.xml"
    output = _webengine_shell_manifest
    if (defined(invoker.browser_process_mode)) {
      variables = [ "browser_process_mode=" + invoker.browser_process_mode ]
    }
  }
  android_apk(target_name + "_apk") {
    testonly = true
    apk_name = invoker.apk_name

    deps = [
      ":$_manifest_target",
      ":webengine_shell_java",
    ]

    android_manifest = _webengine_shell_manifest
    android_manifest_dep = ":$_manifest_target"
    target_sdk_version = 28
  }
}

webengine_shell_apk_helper("webengine_shell_local") {
  browser_process_mode = "local"
  apk_name = "WEShellLocal"
}

webengine_shell_apk_helper("webengine_shell_sandbox") {
  browser_process_mode = "sandbox"
  apk_name = "WEShellSandbox"
}

webengine_services_manifest =
    "$target_gen_dir/service_provider/AndroidManifest.xml"

jinja_template("webengine_services_manifest") {
  input = "service_provider/AndroidManifest.xml"
  output = webengine_services_manifest
}

android_resources("webengine_service_provider_resources") {
  testonly = true
  android_manifest = webengine_services_manifest
  android_manifest_dep = ":webengine_services_manifest"

  deps = [ ":webengine_services_manifest" ]
}

# TODO(swestphal): Make this an AAR when BrowserProcess service can run in isolated process.
android_apk("browser_sandbox_apk") {
  testonly = true

  # Test runner does not support having "additional apks" that are incremental.
  never_incremental = true

  deps = [
    ":webengine_service_provider_resources",
    "//weblayer/public/java:service_provider_java",
    "//weblayer/public/java:webengine_interfaces_java",
  ]

  apk_name = "WESandbox"
  android_manifest = webengine_services_manifest
  android_manifest_dep = ":webengine_services_manifest"
  target_sdk_version = 28
  shared_resources = true
}