load("@rules_java//java:defs.bzl", "java_binary", "java_import", "java_library", "java_plugin")
load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test")
load("@rules_shell//shell:sh_binary.bzl", "sh_binary")
load("//rules:min_sdk_version.bzl", "min_sdk_version")
load(":defs.bzl", "android_jar", "run_ijar", "run_singlejar")

package(
    default_applicable_licenses = ["//:license"],
    default_visibility = ["//visibility:public"],
)

config_setting(
    name = "minimal_desugaring",
    values = {
        "define": "java8_library_desugaring=minimal",
    },
)

config_setting(
    name = "full_desugaring",
    values = {
        "define": "java8_library_desugaring=full",
    },
)

android_jar(
    name = "android_jar",
    visibility = ["//visibility:public"],
)

# TODO(b/175833857): This is a stub, should remove.
alias(
    name = "merge_manifests",
    actual = ":fail",
    visibility = ["//visibility:public"],
)

genrule(
    name = "gen_fail",
    outs = ["fail.sh"],
    cmd = "echo 'exit 1' > $@",
    executable = 1,
    visibility = ["//visibility:public"],
)

sh_binary(
    name = "fail",
    srcs = [":fail.sh"],
)

java_binary(
    name = "bundletool",
    main_class = "com.android.tools.build.bundletool.BundleToolMain",
    visibility = ["//visibility:public"],
    runtime_deps = ["@rules_android_maven//:com_android_tools_build_bundletool"],
)

java_plugin(
    name = "compiler_annotation_processor",
    generates_api = True,
    processor_class = "android.databinding.annotationprocessor.ProcessDataBinding",
    visibility = ["//visibility:public"],
    deps = [
        "//src/tools/java/com/google/devtools/build/android:databinding_exec_jar",
    ],
)

alias(
    name = "zip",
    actual = "//toolchains/android:zip",
    visibility = ["//visibility:public"],
)

alias(
    name = "unzip",
    actual = "//toolchains/android:unzip",
    visibility = ["//visibility:public"],
)

genrule(
    name = "full_desugar_jdk_libs_config_json",
    srcs = [
        "@rules_android_maven//:com_android_tools_desugar_jdk_libs_configuration_nio",
    ],
    outs = ["full_desugar_jdk_libs_config.json"],
    cmd = "unzip -q -c " +
          "$(location @rules_android_maven//:com_android_tools_desugar_jdk_libs_configuration_nio) " +
          "META-INF/desugar/d8/desugar.json > $@",
    visibility = ["//visibility:public"],
)

genrule(
    name = "minimal_desugar_jdk_libs_config_json",
    srcs = [
        "@rules_android_maven//:com_android_tools_desugar_jdk_libs_configuration_minimal",
    ],
    outs = ["minimal_desugar_jdk_libs_config.json"],
    cmd = "unzip -q -c " +
          "$(location @rules_android_maven//:com_android_tools_desugar_jdk_libs_configuration_minimal) " +
          "META-INF/desugar/d8/desugar.json > $@",
)

genrule(
    name = "desugar_jdk_libs_json",
    srcs = select({
        "full_desugaring": [":full_desugar_jdk_libs_config_json"],
        "minimal_desugaring": [":minimal_desugar_jdk_libs_config_json"],
        "//conditions:default": [":full_desugar_jdk_libs_config_json"],
    }),
    outs = ["desugar_jdk_libs.json"],
    cmd = "cp $< $@",
    visibility = ["//visibility:public"],
)

genrule(
    name = "minify_desugar_jdk_libs_pgcfg",
    srcs = [
        "//src/tools/extract_desugar_pgcfg_flags",
        ":desugar_jdk_libs_json",
    ],
    outs = ["minify_desugar_jdk_libs.pgcfg"],
    cmd = "$(location //src/tools/extract_desugar_pgcfg_flags) --input_json $(location :desugar_jdk_libs_json) --output_file $@",
)

_MIN_SDK_VERSION = str(min_sdk_version.DEPOT_FLOOR)

genrule(
    name = "build_java8_legacy_dex_params",
    outs = ["build_java8_legacy_dex_params.txt"],
    cmd = "echo -n --min-api %s > $@" % _MIN_SDK_VERSION,
    visibility = ["//visibility:private"],
)

genrule(
    name = "desugared_jdk_libs_from_maven_jar",
    srcs = select({
        "full_desugaring": ["@rules_android_maven//:com_android_tools_desugar_jdk_libs_nio"],
        "minimal_desugaring": ["@rules_android_maven//:com_android_tools_desugar_jdk_libs_minimal"],
        "//conditions:default": ["@rules_android_maven//:com_android_tools_desugar_jdk_libs_nio"],
    }),
    outs = ["desugared_jdk_libs_from_maven.jar"],
    cmd = "cp $< $@",
)

run_singlejar(
    name = "desugar_jdk_libs_all",
    srcs = [
        ":desugared_jdk_libs_from_maven_jar",
        "@rules_android_maven//:com_android_tools_desugar_jdk_libs_configuration",
    ],
    out = "desugar_jdk_libs_all.jar",
)

run_singlejar(
    name = "bootclasspath",
    srcs = [
        ":android_jar",
        ":desugar_java8_extra_bootclasspath",
    ],
    out = "android_bootclasspath.jar",
)

genrule(
    name = "desugared_jdk_libs_jar",
    srcs = [
        ":bootclasspath",
        ":desugar_jdk_libs_all",
        ":full_desugar_jdk_libs_config_json",
    ],
    outs = ["desugared_jdk_libs.jar"],
    cmd = "$(location //src/tools/java/com/google/devtools/build/android/r8:core_library_desugar) " +
          "--desugar_supported_core_libs " +
          "--desugared_lib_config=$(location :full_desugar_jdk_libs_config_json) " +
          "--bootclasspath_entry=$(location :bootclasspath) " +
          "--min_sdk_version=%d " % min_sdk_version.DEPOT_FLOOR +
          "--input=$(location :desugar_jdk_libs_all) --output=$@",
    tools = ["//src/tools/java/com/google/devtools/build/android/r8:core_library_desugar"],
)

sh_binary(
    name = "build_java8_legacy_dex",
    srcs = ["build_java8_legacy_dex.sh"],
    data = [
        "build_java8_legacy_dex_params",
        ":d8",
        ":desugared_jdk_libs_jar",
        ":minify_desugar_jdk_libs.pgcfg",
        ":r8",
        ":tracereferences",
        ":zip",
        "@rules_shell//shell/runfiles",
    ],
    visibility = ["//visibility:public"],
)

genrule(
    name = "java8_legacy_dex",
    outs = ["java8_legacy.dex.zip"],
    cmd = "$(location :build_java8_legacy_dex) --output $@",
    tools = [":build_java8_legacy_dex"],
    visibility = ["//visibility:public"],
)

genrule(
    name = "d8_desugar_params",
    outs = ["d8_desugar_params.txt"],
    cmd = "echo -n --min_sdk_version " + _MIN_SDK_VERSION + " > $@",
    visibility = ["//visibility:private"],
)

genrule(
    name = "desugar_min_sdk_version_txt",
    outs = ["desugar_min_sdk_version.txt"],
    cmd = "echo -n " + _MIN_SDK_VERSION + " > $@",
    visibility = ["//visibility:public"],
)

sh_binary(
    name = "desugar_java8",
    srcs = [":d8_desugar.sh"],
    data = [
        ":d8_desugar_params",
        ":full_desugar_jdk_libs_config_json",
        "//src/tools/java/com/google/devtools/build/android/r8:desugar",
        "@rules_shell//shell/runfiles",
    ],
    visibility = ["//visibility:public"],
)

run_ijar(
    name = "ijar_desugared_java8_legacy_libs",
    jar = ":desugared_jdk_libs.jar",
    visibility = ["//visibility:public"],
)

java_import(
    name = "desugared_java8_legacy_apis",
    constraints = ["android"],
    jars = [":ijar_desugared_java8_legacy_libs"],
    neverlink = 1,
    visibility = ["//visibility:public"],
)

# Flags to make OpenJDK perform reasonably on D8.
_JVM_FLAGS = [
    "-XX:+TieredCompilation",
    "-XX:TieredStopAtLevel=1",
    # Consistent with what we use for desugar.
    "-Xms8g",
    "-Xmx8g",
]

java_binary(
    name = "d8",
    jvm_flags = _JVM_FLAGS,
    main_class = "com.android.tools.r8.D8",
    visibility = ["//visibility:public"],
    runtime_deps = ["@rules_android_maven//:com_android_tools_r8"],
)

java_binary(
    name = "r8",
    jvm_flags = _JVM_FLAGS,
    main_class = "com.android.tools.r8.R8",
    visibility = ["//visibility:public"],
    runtime_deps = ["@rules_android_maven//:com_android_tools_r8"],
)

java_binary(
    name = "tracereferences",
    jvm_flags = _JVM_FLAGS,
    main_class = "com.android.tools.r8.tracereferences.TraceReferences",
    visibility = ["//visibility:public"],
    runtime_deps = ["@rules_android_maven//:com_android_tools_r8"],
)

java_binary(
    name = "resource_shrinker",
    main_class = "com.android.build.shrinker.ResourceShrinkerCli",
    visibility = ["//visibility:public"],
    runtime_deps = ["@rules_android_maven//:com_android_tools_build_gradle"],
)

alias(
    name = "merge_dexzips",
    actual = "//src/tools/java/com/google/devtools/build/android/ziputils:reducer",
    visibility = ["//visibility:public"],
)

alias(
    name = "shuffle_jars",
    actual = "//src/tools/java/com/google/devtools/build/android/ziputils:mapper",
    visibility = ["//visibility:public"],
)

alias(
    name = "zip_filter",
    actual = "//src/tools/java/com/google/devtools/build/android:ZipFilterAction",
    visibility = ["//visibility:public"],
)

java_binary(
    name = "databinding_exec",
    main_class = "android.databinding.AndroidDataBinding",
    visibility = ["//visibility:public"],
    runtime_deps = [
        "//src/tools/java/com/google/devtools/build/android:databinding_exec_jar",
    ],
)

# Defines d8_dexbuilder using @<repo>//:d8_jar_import generated by android_sdk_repository rule
# without needing the SDK repo's name (typically @androidsdk but not required).
java_binary(
    name = "d8_dexbuilder",
    main_class = "com.google.devtools.build.android.r8.CompatDexBuilder",
    visibility = ["//visibility:private"],
    runtime_deps = ["//src/tools/java/com/google/devtools/build/android/r8"],
)

alias(
    name = "dexbuilder",
    actual = ":d8_dexbuilder",
    visibility = ["//visibility:public"],
)

alias(
    name = "dexbuilder_after_proguard",
    actual = ":d8_dexbuilder",
    visibility = ["//visibility:public"],
)

alias(
    name = "dexsharder",
    actual = "//src/tools/java/com/google/devtools/build/android/dexer:DexFileSplitter",
    visibility = ["//visibility:public"],
)

java_binary(
    name = "d8_dexmerger",
    main_class = "com.google.devtools.build.android.r8.DexFileMerger",
    visibility = ["//visibility:private"],
    runtime_deps = ["//src/tools/java/com/google/devtools/build/android/r8"],
)

java_binary(
    name = "global_synthetics_generator",
    jvm_flags = [
        "-XX:+TieredCompilation",
        "-XX:TieredStopAtLevel=1",
        # Consistent with what we use for desugar.
        "-Xms8g",
        "-Xmx8g",
    ],
    main_class = "com.android.tools.r8.GlobalSyntheticsGenerator",
    runtime_deps = ["@rules_android_maven//:com_android_tools_r8"],
)

alias(
    name = "dexmerger",
    actual = ":d8_dexmerger",
    visibility = ["//visibility:public"],
)

# Bazel puts this on the bootclasspath of android_* targets to support Java 8
# if requested.
filegroup(
    name = "desugar_java8_extra_bootclasspath",
    srcs = ["java_base_extras.jar"],
    visibility = ["//visibility:public"],
)

# javac needs this Jar to compile lambdas, method references, and type annotations.
# These classes are not part of the android.jar.
run_singlejar(
    name = "gen_java_base_extras_jar",
    srcs = [
        "@rules_java//toolchains:platformclasspath",
    ],
    out = "java_base_extras.jar",
    include_prefixes = [
        "java/lang/invoke/",
        "java/lang/annotation/",
    ],
    visibility = ["//visibility:private"],
)

sh_binary(
    name = "dex_list_obfuscator",
    srcs = ["dex_list_obfuscator.sh"],
    visibility = ["//visibility:public"],
)

# If needed, this file can be regenerated by (validity is 30 * 365 days):
# keytool -genkeypair \
#    -alias androiddebugkey \
#    -dname "CN=Android Debug, O=Android, C=US" \
#    -keystore cica \
#    -sigalg SHA256withDSA \
#    -validity 10950
filegroup(
    name = "debug_keystore",
    srcs = ["bazel_debug.keystore"],
    visibility = ["//visibility:public"],
)

py_library(
    name = "junction_lib",
    srcs = ["junction.py"],
    visibility = ["//visibility:private"],
)

py_library(
    name = "json_worker_wrapper",
    srcs = ["json_worker_wrapper.py"],
    visibility = ["//visibility:private"],
)

py_binary(
    name = "aar_embedded_jars_extractor",
    srcs = ["aar_embedded_jars_extractor.py"],
    visibility = ["//visibility:public"],
    deps = [
        ":json_worker_wrapper",
        ":junction_lib",
        "@py_absl//absl:app",
    ],
)

py_binary(
    name = "aar_embedded_proguard_extractor",
    srcs = ["aar_embedded_proguard_extractor.py"],
    visibility = ["//visibility:public"],
    deps = [
        ":json_worker_wrapper",
        ":junction_lib",
        "@py_absl//absl:app",
    ],
)

py_binary(
    name = "aar_native_libs_zip_creator",
    srcs = [
        "aar_native_libs_zip_creator.py",
    ],
    visibility = ["//visibility:public"],
    deps = [
        ":json_worker_wrapper",
        ":junction_lib",
        "@py_absl//absl:app",
    ],
)

py_binary(
    name = "aar_resources_extractor",
    srcs = ["aar_resources_extractor.py"],
    visibility = ["//visibility:public"],
    deps = [
        ":json_worker_wrapper",
        ":junction_lib",
        "@py_absl//absl:app",
    ],
)

py_test(
    name = "aar_native_libs_zip_creator_test",
    srcs = ["aar_native_libs_zip_creator_test.py"],
    deps = [":aar_native_libs_zip_creator"],
)

py_test(
    name = "aar_embedded_jars_extractor_test",
    srcs = ["aar_embedded_jars_extractor_test.py"],
    deps = [":aar_embedded_jars_extractor"],
)

py_test(
    name = "aar_embedded_proguard_extractor_test",
    srcs = ["aar_embedded_proguard_extractor_test.py"],
    deps = [":aar_embedded_proguard_extractor"],
)

py_test(
    name = "aar_resources_extractor_test",
    srcs = ["aar_resources_extractor_test.py"],
    deps = [":aar_resources_extractor"],
)

py_test(
    name = "junction_test",
    srcs = ["junction_test.py"],
    deps = [":junction_lib"],
    # TODO: This test was migrated from Bazel and is missing some
    # Bazel-intrinsic test deps.
    tags = ["manual"],
)

java_binary(
    name = "apkdeployer",
    main_class = "com.android.tools.deployer.DeployerRunner",
    visibility = ["//visibility:public"],
    runtime_deps = [
        "@rules_android_maven//:com_android_tools_apkdeployer_apkdeployer",
    ],
)

java_library(
    name = "auto_service_lib",
    exports = [
        "@rules_android_maven//:com_google_auto_service_auto_service",
        "@rules_android_maven//:com_google_auto_service_auto_service_annotations",
    ],
)

java_library(
    name = "autovalue_lib",
    exports = [
        ":auto_service_lib",
        "@rules_android_maven//:com_google_auto_auto_common",
    ],
)

java_plugin(
    name = "autovalue_plugin",
    processor_class = "com.google.auto.value.processor.AutoValueProcessor",
    deps = [
        "@rules_android_maven//:com_google_auto_value_auto_value",
    ],
)

java_plugin(
    name = "auto_annotation_plugin",
    processor_class = "com.google.auto.value.processor.AutoAnnotationProcessor",
    deps = [
        "@rules_android_maven//:com_google_auto_value_auto_value",
    ],
)

java_plugin(
    name = "auto_builder_plugin",
    processor_class = "com.google.auto.value.processor.AutoBuilderProcessor",
    deps = [
        "@rules_android_maven//:com_google_auto_value_auto_value",
    ],
)

java_library(
    name = "auto_value_api",
    exports = [
        "@rules_android_maven//:com_google_auto_value_auto_value_annotations",
    ],
)

java_library(
    name = "autovalue",
    exported_plugins = [
        ":autovalue_plugin",
        ":auto_annotation_plugin",
        ":auto_builder_plugin",
    ],
    visibility = ["//src/tools/java/com/google/devtools/build/android:__subpackages__"],
    exports = [
        ":auto_value_api",
    ],
)

java_library(
    name = "error_prone_annotations",
    exports = [
        "@rules_android_maven//:com_google_errorprone_error_prone_annotations",
        "@rules_android_maven//:com_google_errorprone_error_prone_type_annotations",
    ],
)

java_library(
    name = "error_prone",
    exports = [
        ":error_prone_annotations",
        "@rules_android_maven//:com_google_errorprone_error_prone_check_api",
        "@rules_android_maven//:com_google_errorprone_error_prone_core",
    ],
)

genrule(
    name = "desugar_globals",
    outs = ["desugar.globals"],
    cmd = "$(JAVA) -Dcom.android.tools.r8.disableLambdaMethodAnnotations -jar $(location :global_synthetics_generator_deploy.jar) --min-api {} --output $@".format(min_sdk_version.DEPOT_FLOOR),
    toolchains = ["//tools/jdk:current_host_java_runtime"],
    tools = [":global_synthetics_generator_deploy.jar"],
    visibility = ["//visibility:public"],
)

genrule(
    name = "desugar_globals_dex_archive",
    srcs = [":desugar.globals"],
    outs = ["desugar_globals.zip"],
    cmd = """
      $(JAVA) -jar $(location :d8_deploy.jar) --no-desugaring --globals $(location :desugar.globals) --output $(@)
    """,
    toolchains = ["//tools/jdk:current_host_java_runtime"],
    tools = [":d8_deploy.jar"],
    visibility = ["//visibility:public"],
)

genrule(
    name = "desugar_globals_classes",
    outs = ["desugar_globals_classes.zip"],
    cmd = "$(JAVA) -Dcom.android.tools.r8.disableLambdaMethodAnnotations -jar $(location :global_synthetics_generator_deploy.jar) --min-api {} --classfile --output $@".format(min_sdk_version.DEPOT_FLOOR),
    toolchains = ["//tools/jdk:current_host_java_runtime"],
    tools = [":global_synthetics_generator_deploy.jar"],
    visibility = ["//visibility:public"],
)

genrule(
    name = "desugar_globals_jar",
    srcs = [":desugar_globals_classes.zip"],
    outs = ["desugar_globals.jar"],
    cmd = """
    tmp=$$(mktemp -d)
    unzip $(location :desugar_globals_classes.zip) -d $${tmp}
    rm $${tmp}/kind
    rm $${tmp}/compilerinfo
    mv $${tmp}/com/android/tools/r8/RecordTag.global $${tmp}/com/android/tools/r8/RecordTag.class
    mv $${tmp}/com/android/tools/r8/DesugarMethodHandlesLookup.global $${tmp}/com/android/tools/r8/DesugarMethodHandlesLookup.class
    mv $${tmp}/com/android/tools/r8/DesugarVarHandle.global $${tmp}/com/android/tools/r8/DesugarVarHandle.class
    mv $${tmp}'/com/android/tools/r8/DesugarVarHandle$$$$ExternalSyntheticBackportWithForwarding0.global' $${tmp}'/com/android/tools/r8/DesugarVarHandle$$$$ExternalSyntheticBackportWithForwarding0.class'
    out=$$(pwd)/$(@)
    cd $${tmp}
    zip -r $${out} .
""",
    visibility = ["//visibility:public"],
)
