# 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.

import("//android_webview/variables.gni")
import("//base/android/proguard/proguard.gni")
import("//build/config/android/config.gni")
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
import("//build/util/version.gni")
import("//chrome/android/trichrome.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//weblayer/variables.gni")

declare_args() {
  # Android package name to use when compiling the system_webview_apk and
  # trichrome_webview_apk targets. This should be used if the Android build
  # on which you are going to install WebView is configured to load a
  # different package name than the default used in AOSP.
  system_webview_package_name = "com.android.webview"

  # Whether to enable standalone and trichrome WebView bundle build targets.
  enable_webview_bundles = false
}

template("system_webview_apk_or_module_tmpl") {
  if (!defined(invoker.target_type)) {
    _is_bundle_module = false
    _target_type = "android_apk"
  } else {
    _is_bundle_module = invoker.target_type == "android_app_bundle_module"
    _target_type = invoker.target_type
  }
  target(_target_type, target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "is_64_bit_browser",
                             "include_32_bit_webview",
                             "include_64_bit_webview",
                           ])

    deps += [
      "//android_webview:android_webview_step1_java",
      "//android_webview:locale_pak_assets",
      "//android_webview:pak_file_assets",
    ]

    target_sdk_version = android_sdk_version
    product_config_java_packages = [ webview_product_config_java_package ]

    if (webview_includes_weblayer) {
      if (_is_bundle_module) {
        deps += [ "//weblayer:bundle_locale_pak_assets" ]
      } else {
        deps += [ "//weblayer:locale_pak_assets" ]
      }
      product_config_java_packages += [ weblayer_product_config_java_package ]
    }

    if (!defined(alternative_android_sdk_dep)) {
      alternative_android_sdk_dep = webview_framework_dep
    }

    if (webview_devui_show_icon) {
      deps += [ "//android_webview/nonembedded:devui_launcher_icon_resources" ]
    }

    _use_trichrome_library =
        defined(use_trichrome_library) && use_trichrome_library

    if (!_use_trichrome_library) {
      deps += [ "//android_webview:monochrome_webview_assets" ]
    }

    # Flag whether additional deps and libs should be included for each ABI.
    _include_primary_support = false
    _include_secondary_support = false

    if (!_use_trichrome_library) {
      shared_libraries = [ "//android_webview:libwebviewchromium" ]
      _include_primary_support = true
      if (_is_bundle_module) {
        # TODO(b/146491000): aapt2 currently doesn't support the --shared-lib
        # flag for bundles, so this will only work on M+.
        app_as_shared_lib = true
      } else {
        shared_resources = true
      }
      if (android_64bit_target_cpu) {
        secondary_abi_shared_libraries = [ "//android_webview:libwebviewchromium($android_secondary_abi_toolchain)" ]
        _include_secondary_support = true
      }
    } else {
      uncompress_shared_libraries = true
      app_as_shared_lib = true

      # Include placeholder libraries to ensure we are treated as the desired
      # architecture.
      if (android_64bit_target_cpu) {
        if (invoker.is_64_bit_browser) {
          native_lib_placeholders = [ "libdummy.so" ]
          if (invoker.include_32_bit_webview) {
            secondary_abi_shared_libraries = [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
            deps += [ "//android_webview:v8_snapshot_secondary_abi_assets" ]
            _include_secondary_support = true
          }
        } else {
          if (invoker.include_64_bit_webview) {
            shared_libraries = [ "//android_webview:monochrome" ]
            _include_primary_support = true
            if (use_v8_context_snapshot) {
              deps +=
                  [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
            } else {
              deps += [ "//v8:v8_external_startup_data_assets" ]
            }
          }
          secondary_native_lib_placeholders = [ "libdummy.so" ]
        }
      } else {
        native_lib_placeholders = [ "libdummy.so" ]
      }
    }

    if (_include_primary_support) {
      deps += [
        "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
      ]
      loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
    }
    if (_include_secondary_support) {
      _trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
      deps += [ _trampoline ]
      _secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
      secondary_abi_loadable_modules =
          [ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
    }

    if (!_use_trichrome_library || android_64bit_target_cpu) {
      # 32-bit TrichromeWebView doesn't have a native library, so only do this
      # for other configs.
      native_lib_version_rule = "//build/util:chrome_version_json"
      _native_lib_file =
          rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
      native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
    }

    aapt_locale_whitelist = locales

    # Match drawables, but not mipmaps.
    resource_blacklist_regex = "drawable[^/]*-xxxhdpi"

    # Exception rationale in https://crbug.com/691733.
    resource_blacklist_exceptions = [
      "*shadow*",  # Combination of gradient & transparency cause pixelation.
      "*.9.*",  # Most nine-patches contain shadows.
    ]

    if (!_is_bundle_module) {
      # Used as an additional apk in test scripts.
      never_incremental = true
      command_line_flags_file = "webview-command-line"
    }

    if (!is_java_debug) {
      proguard_enabled = true
      if (!defined(proguard_configs)) {
        proguard_configs = []
      }
      proguard_configs += [
        "//android_webview/nonembedded/java/proguard.flags",
        "//base/android/proguard/chromium_apk.flags",
        "//base/android/proguard/chromium_code.flags",
      ]
      if (enable_proguard_obfuscation) {
        proguard_configs +=
            [ "//base/android/proguard/enable_obfuscation.flags" ]
      } else {
        proguard_configs +=
            [ "//base/android/proguard/disable_all_obfuscation.flags" ]
      }
      png_to_webp = true
    }

    if (!defined(version_code)) {
      if (_use_trichrome_library) {
        if (android_64bit_target_cpu) {
          if (invoker.is_64_bit_browser) {
            if (invoker.include_32_bit_webview) {
              version_code = trichrome_64_32_version_code
            } else {
              version_code = trichrome_64_version_code
            }
          } else {
            if (invoker.include_64_bit_webview) {
              version_code = trichrome_32_64_version_code
            } else {
              version_code = trichrome_32_version_code
            }
          }
        } else {
          version_code = trichrome_version_code
        }
      } else if (android_channel == "dev") {
        version_code = webview_dev_version_code
      } else if (android_channel == "beta") {
        version_code = webview_beta_version_code
      } else {
        version_code = webview_stable_version_code
      }
    }
    if (!defined(version_name)) {
      version_name = chrome_version_name
    }
  }
}

# TODO(cduvall): Remove this once src/clank uses
# system_webview_apk_or_module_tmpl.
template("system_webview_apk_tmpl") {
  system_webview_apk_or_module_tmpl(target_name) {
    forward_variables_from(invoker, "*")
  }
}
