load("//tools/python:private/defs.bzl", "py_binary", "py_library")
load(":defs.bzl", "run_ijar", "run_singlejar")

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

# The toolchain type used to distinguish Android SDK toolchains.
toolchain_type(name = "sdk_toolchain_type")

alias(
    name = "sdk",
    actual = "//external:android/sdk",
)

android_tools_defaults_jar(name = "android_jar")

android_library(
    name = "incremental_stub_application",
    exports = ["//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:incremental_stub_application"],
)

android_library(
    name = "incremental_split_stub_application",
    exports = ["//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:incremental_split_stub_application"],
)

alias(
    name = "busybox",
    actual = "//src/tools/android/java/com/google/devtools/build/android:ResourceProcessorBusyBox",
)

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

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

# 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/android/java/com/google/devtools/build/android/r8"],
)

# NOTE: d8 dex builder doesn't support the persistent worker mode at the moment. To use this config,
# without a build error, --nouse_workers_with_dexbuilder flag must also be specified.
config_setting(
    name = "d8_incremental_dexing",
    values = {
        "define": "android_incremental_dexing_tool=d8_dexbuilder",
    },
)

config_setting(
    name = "dx_incremental_dexing",
    values = {
        "define": "android_incremental_dexing_tool=dx_dexbuilder",
    },
)

alias(
    name = "dexbuilder",
    actual = select({
        "d8_incremental_dexing": ":d8_dexbuilder",
        "dx_incremental_dexing": "//src/tools/android/java/com/google/devtools/build/android/dexer:DexBuilder",
        "//conditions:default": ":d8_dexbuilder",
    }),
)

# Matches dx_standalone_dexer in android_sdk_repository_template.bzl. Not using
# the one there to avoid a dependency on the android sdk.
config_setting(
    name = "dx_standalone_dexer",
    values = {"define": "android_standalone_dexing_tool=dx_compat_dx"},
)

alias(
    name = "dexbuilder_after_proguard",
    actual = select({
       ":dx_standalone_dexer": "//src/tools/android/java/com/google/devtools/build/android/dexer:DexBuilder",
       "//conditions:default": ":d8_dexbuilder",
    }),
)

# Defines d8_dexmerger 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_dexmerger",
    main_class = "com.google.devtools.build.android.r8.DexFileMerger",
    visibility = ["//visibility:private"],
    runtime_deps = ["//src/tools/android/java/com/google/devtools/build/android/r8"],
)

config_setting(
    name = "use_dx_dexmerger",
    values = {
        "define": "android_dexmerger_tool=dx_dexmerger",
    },
)

config_setting(
    name = "use_d8_dexmerger",
    values = {
        "define": "android_dexmerger_tool=d8_dexmerger",
    },
)

alias(
    name = "dexmerger",
    actual = select({
        "use_d8_dexmerger": ":d8_dexmerger",
        "use_dx_dexmerger": "//src/tools/android/java/com/google/devtools/build/android/dexer:DexFileMerger",
        "//conditions:default": ":d8_dexmerger",
    }),
)

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

config_setting(
    name = "d8_desugaring",
    values = {
        "define": "android_desugaring_tool=d8",
    },
)

config_setting(
    name = "legacy_desugaring",
    values = {
        "define": "android_desugaring_tool=legacy",
    },
)

sh_binary(
    name = "desugar_java8",
    srcs = select({
        "legacy_desugaring": ["desugar.sh"],
        "d8_desugaring": ["d8_desugar.sh"],
        "//conditions:default": ["d8_desugar.sh"],
    }),
    deps = ["@bazel_tools//tools/bash/runfiles"],
    data = select({
        "legacy_desugaring": ["//src/tools/android/java/com/google/devtools/build/android/desugar:Desugar"],
        "d8_desugaring": ["@bazel_tools//src/tools/android/java/com/google/devtools/build/android/r8:desugar", "chm_only_desugar_jdk_libs.json"],
        "//conditions:default": ["@bazel_tools//src/tools/android/java/com/google/devtools/build/android/r8:desugar", "chm_only_desugar_jdk_libs.json"],
    })
)

alias(
    name = "aar_import_deps_checker",
    actual = "//src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps:ImportDepsChecker_embedded",
    visibility = ["//visibility:public"],
)

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

# 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 = [
        "@bazel_tools//tools/jdk:platformclasspath",
    ],
    out = "java_base_extras.jar",
    include_prefixes = [
        "java/lang/invoke/",
        "java/lang/annotation/",
    ],
    visibility = ["//visibility:private"],
)

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

run_ijar(
    name = "ijar_desugared_java8_legacy_libs",
    jar = "desugared_java8_legacy_libs.jar",
    visibility = ["//visibility:private"],
)

sh_binary(
    name = "build_java8_legacy_dex",
    srcs = ["build_java8_legacy_dex.sh"],
    data = [
        "minify_java8_legacy_libs.cfg",
        ":desugared_java8_legacy_libs",
        ":dexer",
        "@bazel_tools//src/tools/android/java/com/google/devtools/build/android/desugar/scan:KeepScanner",
        "@bazel_tools//tools/jdk:proguard",
    ],
    visibility = ["//visibility:public"],
)

sh_binary(
    name = "merge_proguard_maps",
    srcs = ["fail.sh"],
    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"],
)

filegroup(
    name = "desugared_java8_legacy_libs",
    srcs = ["desugared_java8_legacy_libs.jar"],
    visibility = ["//visibility:private"],
)

genrule(
    name = "desugar_java8_legacy_libs",
    srcs = ["@android_tools//:desugar_jdk_libs.jar"],
    outs = ["desugared_java8_legacy_libs.jar"],
    message = "Desugaring java8 legacy libs",
    cmd = """
    $(location :desugar_java8) \
        --input $< \
        --output $@ \
        --classpath_entry "$(location @bazel_tools//tools/jdk:platformclasspath)" \
        --core_library --allow_empty_bootclasspath \
        --nobest_effort_tolerate_missing_deps \
        --noemit_dependency_metadata_as_needed \
        --nodesugar_try_with_resources_if_needed \
        --desugar_supported_core_libs \
        --rewrite_core_library_prefix java/time/ \
        --rewrite_core_library_prefix java/lang/Double8 \
        --rewrite_core_library_prefix java/lang/Integer8 \
        --rewrite_core_library_prefix java/lang/Long8 \
        --rewrite_core_library_prefix java/lang/Math8 \
        --rewrite_core_library_prefix java/io/Desugar \
        --rewrite_core_library_prefix java/io/UncheckedIOException \
        --rewrite_core_library_prefix java/util/stream/ \
        --rewrite_core_library_prefix java/util/function/ \
        --rewrite_core_library_prefix java/util/Desugar \
        --rewrite_core_library_prefix java/util/DoubleSummaryStatistics \
        --rewrite_core_library_prefix java/util/IntSummaryStatistics \
        --rewrite_core_library_prefix java/util/LongSummaryStatistics \
        --rewrite_core_library_prefix java/util/Objects \
        --rewrite_core_library_prefix java/util/Optional \
        --rewrite_core_library_prefix java/util/PrimitiveIterator \
        --rewrite_core_library_prefix java/util/Spliterator \
        --rewrite_core_library_prefix java/util/StringJoiner \
        --rewrite_core_library_prefix javadesugar/testing/ \
        --rewrite_core_library_prefix java/util/concurrent/ConcurrentHashMap \
        --rewrite_core_library_prefix java/util/concurrent/ThreadLocalRandom \
        --rewrite_core_library_prefix java/util/concurrent/atomic/DesugarAtomic \
        --auto_desugar_shadowed_api_use \
        --emulate_core_library_interface java/util/Collection \
        --emulate_core_library_interface java/util/Map \
        --emulate_core_library_interface java/util/Map\\$$Entry \
        --emulate_core_library_interface java/util/Iterator \
        --emulate_core_library_interface java/util/Comparator \
        --dont_rewrite_core_library_invocation "java/util/Iterator#remove" """,
    tools = [
        ":desugar_java8",
        "@bazel_tools//tools/jdk:platformclasspath",
    ],
    visibility = ["//visibility:private"],
)

# No-one should depend on this but :desugared_java8_legacy_libs above
exports_files(
    ["desugar_jdk_libs.jar"],
    visibility = ["//visibility:private"],
)

# Mirrors @<repo>//:dx_binary generated by android_sdk_repository rule without
# needing the SDK repo's name (typically @androidsdk but not required).
java_binary(
    name = "dexer",
    main_class = "com.android.dx.command.Main",
    visibility = ["//visibility:private"],
    runtime_deps = ["//external:android/dx_jar_import"],
)

alias(
    name = "IdlClass",
    actual = "//src/tools/android/java/com/google/devtools/build/android/idlclass:IdlClass",
)

py_binary(
    name = "instrumentation_test_check",
    srcs = ["instrumentation_test_check.py"],
    python_version = "PY3",
    deps = ["//third_party/py/abseil"],
)

py_binary(
    name = "build_incremental_dexmanifest",
    srcs = [":build_incremental_dexmanifest.py"],
    python_version = "PY3",
    deps = [],
)

py_binary(
    name = "build_split_manifest",
    srcs = ["build_split_manifest.py"],
    python_version = "PY3",
    deps = [
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "incremental_install",
    srcs = ["incremental_install.py"],
    python_version = "PY3",
    deps = [
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "strip_resources",
    srcs = ["strip_resources.py"],
    python_version = "PY3",
    deps = [
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "aar_native_libs_zip_creator",
    srcs = [
        "aar_native_libs_zip_creator.py",
    ],
    python_version = "PY3",
    deps = [
        ":junction_lib",
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "stubify_manifest",
    srcs = ["stubify_manifest.py"],
    python_version = "PY3",
    deps = [
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "aar_embedded_proguard_extractor",
    srcs = ["aar_embedded_proguard_extractor.py"],
    python_version = "PY3",
    deps = [
        ":junction_lib",
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "aar_embedded_jars_extractor",
    srcs = ["aar_embedded_jars_extractor.py"],
    python_version = "PY3",
    deps = [
        ":junction_lib",
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "aar_resources_extractor",
    srcs = ["aar_resources_extractor.py"],
    python_version = "PY3",
    deps = [
        ":junction_lib",
        "//third_party/py/abseil",
    ],
)

py_binary(
    name = "resource_extractor",
    srcs = ["resource_extractor.py"],
    python_version = "PY3",
)

py_library(
    name = "junction_lib",
    srcs = ["junction.py"],
    # TODO(bazel-team): remove srcs_version = "PY2AND3" while fixing https://github.com/bazelbuild/bazel/issues/10127.
    srcs_version = "PY2AND3",
    visibility = ["//visibility:private"],
)

alias(
    name = "android_runtest",
    actual = "fail.sh",
)

alias(
    name = "adb_static",
    actual = "fail.sh",
)

alias(
    name = "adb",
    actual = "@androidsdk//:adb",
)

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

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

alias(
    name = "databinding_annotation_processor",
    actual = "//external:databinding_annotation_processor",
)

# This is the default value of databinding_annotation_processor if the user does
# not provide one. Also used by the bind rules in android.WORKSPACE.
filegroup(name = "empty")

alias(
    name = "instrumentation_test_entry_point",
    actual = "@android_test_support//:instrumentation_test_runner",
)

# This is the default binding of //external:android/sdk. If someone attempts to
# build a rule that depends on //external:android/sdk without setting up
# android_sdk_repository in their WORKSPACE, the genrule will fail with a
# helpful error message.
android_sdk(
    name = "poison_pill_android_sdk",
    aapt = ":error_message",
    adb = ":error_message",
    aidl = ":error_message",
    android_jar = ":error_message.jar",
    apksigner = ":error_message",
    dx = ":error_message",
    framework_aidl = ":error_message",
    main_dex_classes = ":error_message",
    main_dex_list_creator = ":error_message",
    proguard = ":error_message",
    shrinked_android_jar = ":error_message.jar",
    zipalign = ":error_message",
)

genrule(
    name = "no_android_sdk_repository_error",
    outs = [
        "error_message",
        "error_message.jar",
    ],
    cmd = """echo \
    This build requires an Android SDK. Please add the android_sdk_repository \
    rule to your WORKSPACE. ; \
    exit 1 """,
)

# //external:has_androidsdk is bound to either
# @bazel_tools//tools/android:always_true or
# @bazel_tools//tools/android:always_false depending on whether
# android_sdk_repository has run and is valid. This allows targets to depend on
# targets from @androidsdk if and only if the user has an
# android_sdk_repository set up.

config_feature_flag(
    name = "true",
    allowed_values = [
        "true",
        "false",
    ],
    default_value = "true",
)

config_setting(
    name = "always_true",
    flag_values = {
        ":true": "true",
    },
)

config_setting(
    name = "always_false",
    flag_values = {
        ":true": "false",
    },
)

package_group(
    name = "android_device_allowlist",
    packages = ["public"],
)

package_group(
    name = "export_deps_allowlist",
    packages = ["public"],
)

package_group(
    name = "allow_android_library_deps_without_srcs_allowlist",
    packages = ["public"],
)

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

filegroup(
    name = "bzl_srcs",
    srcs = glob(["*.bzl"]),
    visibility = ["//tools:__pkg__"],
)
