# Copyright 2018 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/android/rules.gni")
import("../gni/angle.gni")

vulkan_validation_layers = [ "VkLayer_khronos_validation" ]

angle_libraries = [
  "libEGL",
  "libGLESv1_CM",
  "libGLESv2",
  "libfeature_support",
]

if (is_starboard) {
  angle_libraries -= [ "libfeature_support" ]
}

if (enable_java_templates) {
  template("angle_apk") {
    manifest_target_name = "${target_name}__manifest"
    manifest_path =
        "${target_gen_dir}/${target_name}/android/AndroidManifest.xml"

    jinja_template(manifest_target_name) {
      input = "//third_party/angle/android/AndroidManifest.xml.jinja2"
      output = manifest_path
      variables = [ "manifest_package=${invoker.package_name}" ]
    }

    android_assets("${invoker.package_name}_assets") {
      disable_compression = true
      sources = [
        "src/feature_support_util/a4a_rules.json",
      ]
    }

    android_apk(target_name) {
      forward_variables_from(invoker, "*")
      android_manifest = manifest_path
      android_manifest_dep = ":$manifest_target_name"
      min_sdk_version = 26
      target_sdk_version = 28
      deps = [
        ":${invoker.package_name}_assets",
      ]
      if (symbol_level != 0) {
        deps += [ ":compressed_symbols" ]
        if (android_64bit_target_cpu) {
          deps += [ ":compressed_symbols($android_secondary_abi_toolchain)" ]
        }
      }

      uncompress_shared_libraries = true

      if (android_64bit_target_cpu) {
        if (symbol_level == 0) {
          secondary_abi_shared_libraries = []
          foreach(_library, angle_libraries) {
            secondary_abi_shared_libraries +=
                [ "$angle_root:${_library}($android_secondary_abi_toolchain)" ]
          }
          if (angle_enable_vulkan_validation_layers) {
            foreach(_layer, vulkan_validation_layers) {
              secondary_abi_shared_libraries += [
                "$angle_root/third_party/vulkan-validation-layers:${_layer}" +
                    "($android_secondary_abi_toolchain)",
              ]
            }
          }
        } else {
          _secondary_out_dir = get_label_info(
                  ":compressed_symbols($android_secondary_abi_toolchain)",
                  "root_out_dir")
          secondary_abi_loadable_modules = []
          foreach(_library, angle_libraries) {
            secondary_abi_loadable_modules += [ "$_secondary_out_dir/lib.compressed/${_library}${angle_libs_suffix}.so" ]
          }
          if (angle_enable_vulkan_validation_layers) {
            foreach(_layer, vulkan_validation_layers) {
              secondary_abi_loadable_modules +=
                  [ "${_secondary_out_dir}/lib.compressed/lib${_layer}.so" ]
            }
          }
        }
      }

      if (symbol_level == 0) {
        shared_libraries = []
        foreach(_library, angle_libraries) {
          shared_libraries += [ "$angle_root:$_library" ]
        }
        if (angle_enable_vulkan_validation_layers) {
          foreach(_layer, vulkan_validation_layers) {
            shared_libraries +=
                [ "$angle_root/third_party/vulkan-validation-layers:${_layer}" ]
          }
        }
      } else {
        loadable_modules = []
        foreach(_library, angle_libraries) {
          loadable_modules += [
            "$root_out_dir/lib.compressed/${_library}${angle_libs_suffix}.so",
          ]
        }
        if (angle_enable_vulkan_validation_layers) {
          foreach(_layer, vulkan_validation_layers) {
            loadable_modules +=
                [ "$root_out_dir/lib.compressed/lib${_layer}.so" ]
          }
        }
      }
    }
  }
}
