// Copyright (C) 2007 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//
// Definitions for building the Android core library and associated tests.
//

// The Android core library provides low-level APIs for use by the rest of the
// Android software stack. It is made up of various parts, some of which can be
// found in libcore/ and other parts that can be found in various external/
// directories.
//
// libcore has some sub-directories that follow a common structure:
// e.g. dalvik, dom, harmony-tests, json, jsr166-tests, luni, libart, ojluni,
// support, xml, xmlpull.
//
// The structure of these is generally:
//
//   src/
//       main/               # To be shipped on every device.
//            java/          # Java source for library code.
//            native/        # C/C++ source for library code.
//            resources/     # Support files.
//       test/               # Built only on demand, for testing.
//            java/          # Java source for tests.
//            native/        # C/C++ source for tests (rare).
//            resources/     # Support files.
//
// All subdirectories are optional.

build = [
    "openjdk_java_files.bp",
    "non_openjdk_java_files.bp",
]

// The Java files and their associated resources.
filegroup {
    name: "core-luni-resources",
    visibility: [
        "//libcore:__subpackages__",
    ],
    path: "luni/src/main/java/",
    srcs: [
        "luni/src/main/java/java/util/logging/logging.properties",
        "luni/src/main/java/java/security/security.properties",
    ],
}

filegroup {
    name: "core-ojluni-resources",
    visibility: [
        "//libcore:__subpackages__",
    ],
    path: "ojluni/src/main/resources/",
    srcs: [
        "ojluni/src/main/resources/**/*",
    ],
}

core_resources = [
    ":core-luni-resources",
    ":core-ojluni-resources",
]

// The source files that go into core-oj.
filegroup {
    name: "core_oj_java_files",
    visibility: [
        "//libcore:__subpackages__",
    ],
    srcs: [":openjdk_java_files"],
}

// http://b/129765390, http://b/188966706
// Rewrite links to "platform" or "technotes" folders which are siblings
// (and thus outside of) {@docRoot}.
//
// We have to escape \ as \\ and $ as $$ here because they get resolved by
// different layers of the build tooling. The arguments are wrapped in '' so
// that the shell doesn't add yet another level of escaping.
rewrite_openjdk_doc_links = "sed 's" +
    "!\\({@docRoot}/\\.\\.\\/\\|[./]\\+\\)\\(\\(platform\\|technotes\\).\\+\\)\">" +
    "!https://docs.oracle.com/javase/8/docs/\\2\">!' " +
    "$(in) > $(out)"

// OpenJDK source is not annotated with @hide so we need this separate
// filegroup for just the parts that contribute to the API.
gensrcs {
    name: "core_oj_api_files",
    cmd: rewrite_openjdk_doc_links,
    srcs: [":openjdk_javadoc_files"],
    output_extension: "java",
}

// The source files that go into core-libart.l
filegroup {
    name: "core_libart_java_files",
    visibility: [
        "//libcore:__subpackages__",
    ],
    srcs: [
        ":non_openjdk_java_files",
    ],
}

// Some parts of libart are not annotated with @hide so we need this separate
// filegroup for just the parts that contribute to the API.
filegroup {
    name: "core_libart_api_files",
    srcs: [
        ":non_openjdk_javadoc_files",
    ],
}

// The set of files for the ART module that contribute to one or more API
// surfaces. This includes files that are in the public API as well as those
// that are not but which have been marked up with @hide plus one or more of
// the API defining annotations.
//
// Some source files in :core_oj_api_files and :openjdk_mmodule_extra_files are
// annotated by applying annotations to the .annotated.java stubs files in
// ojluni/annotated/mmodules and rather than in the original source. See the comments
// in openjdk_java_files.bp for more details.
filegroup {
    name: "art_module_api_files",
    visibility: [
        "//libcore:__subpackages__",
    ],
    srcs: [
        ":apache-xml_api_files",
        ":bouncycastle_java_files",
        ":core_oj_api_files",
        ":core_libart_api_files",
        ":okhttp_api_files",
        ":openjdk_mmodule_extra_files",
    ],
}

java_defaults {
    name: "libcore_java_defaults",
    javacflags: [
        //"-Xlint:all",
        //"-Xlint:-serial,-deprecation,-unchecked",
    ],
    dxflags: ["--core-library"],
    errorprone: {
        javacflags: [
            "-Xep:MissingOverride:OFF", // Ignore missing @Override.
            "-Xep:ConstantOverflow:WARN", // Known constant overflow in SplittableRandom
            "-Xep:UnicodeInCode:WARN", // XML parser uses line feeds in whitespace
        ],
    },
    min_sdk_version: "31",
}

//
// Build for the target (device).
//

// A target used to bootstrap compilation for the core library.
//
// See core-all-system-modules for more details.
java_library {
    name: "core-all",
    defaults: ["libcore_java_defaults"],

    srcs: [
        // Use the source code for the I18N module intra core API as using the
        // compiled version does not work due to limitations in either soong or the javac
        // toolchain. See http://b/142056316 for more details.
        ":i18n.module.intra.core.api{.public.stubs.source}",
        ":core_oj_java_files",
        ":core_libart_java_files",
        // framework-api-annotations contain API annotations, e.g. @SystemApi.
        ":framework-api-annotations",
        ":openjdk_lambda_stub_files",
        ":openjdk_generated_annotation_stub_files",
        ":app-compat-annotations-source",

        // Use the okhttp source too to allow libcore code to reference it
        // directly.
        ":okhttp_impl_files",
    ],

    sdk_version: "none",
    system_modules: "none",
    patch_module: "java.base",
    openjdk9: {
        srcs: ["luni/src/module/java/module-info.java"],
    },

    java_resources: core_resources,

    installable: false,

    plugins: [
        "compat-changeid-annotation-processor",
        "unsupportedappusage-annotation-processor",
    ],
    libs: [
        "conscrypt.module.intra.core.api",
    ],
}

platform_compat_config {
    name: "libcore-platform-compat-config",
    src: ":core-all",
    visibility: [
        "//art/build/apex",
        "//art/build/sdk",
    ],
}

// A system modules definition for use by core library targets only. It only
// contains the core-all jar, which contains the classes that end up in core-oj,
// core-libart as well as the lambda stubs needed to compile Java lambda code.
// It does not contain other parts of core library like conscrypt, bouncycastle,
// etc. This system_modules definition is used to bootstrap compilation for
// other parts of the core library like core-oj, core-libart, conscrypt,
// bouncycastle, etc. It is also used to compile Libcore tests, as well as ART
// Java tests (run-tests).
java_system_modules {
    name: "core-all-system-modules",

    // Visibility is deliberately restricted to a small set of build modules that
    // the core library team control.
    visibility: [
        "//art/test:__subpackages__",
        "//external/apache-harmony:__subpackages__",
        "//external/apache-xml",
        "//external/okhttp",
        "//libcore:__subpackages__",
    ],

    libs: ["core-all"],
}

// Contains the parts of core library associated with OpenJDK.
java_library {
    name: "core-oj",
    visibility: [
        "//art/build/apex",
        "//art/build/sdk",
        "//external/wycheproof",
        "//libcore/benchmarks",
        "//packages/modules/ArtPrebuilt",
    ],
    apex_available: [
        "com.android.art",
        "com.android.art.debug",
    ],
    defaults: ["libcore_java_defaults"],
    installable: true,
    hostdex: true,

    srcs: [":core_oj_java_files"],
    java_resources: core_resources,

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    patch_module: "java.base",

    jacoco: {
        exclude_filter: [
            "java.lang.Class",
            "java.lang.Long",
            "java.lang.Number",
            "java.lang.Object",
            "java.lang.String",
            "java.lang.invoke.MethodHandle",
            "java.lang.invoke.VarHandle",
            "java.lang.ref.Reference",
            "java.lang.reflect.Proxy",
            "java.util.AbstractMap",
            "java.util.HashMap",
            "java.util.HashMap$Node",
            "java.util.Map",
        ],
    },

    notice: "ojluni/NOTICE",

    hiddenapi_additional_annotations: [
        "core-oj-hiddenapi-annotations",
    ],
}

// Contains parts of core library not associated with OpenJDK. Contains not
// just java.*, javax.* code but also android.system.* and various internal
// libcore.* packages.
java_library {
    name: "core-libart",
    visibility: [
        "//art/build/apex",
        "//art/build/sdk",
        "//external/wycheproof",
        "//libcore/benchmarks",
        "//packages/modules/ArtPrebuilt",
    ],
    apex_available: [
        "com.android.art",
        "com.android.art.debug",
    ],
    defaults: ["libcore_java_defaults"],
    installable: true,
    hostdex: true,

    srcs: [":core_libart_java_files"],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    patch_module: "java.base",

    jacoco: {
        exclude_filter: [
            "java.lang.DexCache",
            "dalvik.system.ClassExt",
        ],
    },

    target: {
        hostdex: {
            required: [
                // Files used to simulate the /system, runtime APEX and tzdata
                // APEX dir structure on host.
                "icu_tzdata.dat_host_tzdata_apex",
                "tzdata_host",
                "tzdata_host_tzdata_apex",
                "tzlookup.xml_host_tzdata_apex",
                "tz_version_host",
                "tz_version_host_tzdata_apex",
            ],
        },
        darwin: {
            enabled: false,
        },
    },
}

// Java library for use on host, e.g. by robolectric or layoutlib.
java_library {
    name: "core-libart-for-host",
    visibility: [
        "//art/build/sdk",
        "//external/robolectric",
        "//external/robolectric-shadows",
        "//frameworks/layoutlib",
    ],
    static_libs: [
        "core-libart",
    ],
    sdk_version: "none",
    system_modules: "none",
}

// Provided solely to contribute information about which hidden parts of the
// core-oj API are used by apps.
//
// Usually, e.g. for core-libart, the UnsupportedAppUsage annotations are
// added to the source that is compiled directly into the bootjar and the build
// system extracts the information about UnsupportedAppUsage directly from
// there.
//
// This approach of having separate annotated source and a separate build
// target was taken for ojluni to avoid having to maintain local patches in the
// ojluni source for UnsupportedAppUsage annotations as that would make it more
// difficult to pull down changes from upstream.
//
java_library {
    name: "core-oj-hiddenapi-annotations",
    // Do not allow this to be accessed from outside this directory.
    visibility: ["//visibility:private"],
    defaults: ["libcore_java_defaults"],
    compile_dex: true,

    srcs: [":openjdk_hiddenapi_javadoc_files"],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    patch_module: "java.base",
    plugins: ["unsupportedappusage-annotation-processor"],
}

java_defaults {
    name: "core_lambda_stubs_defaults",
    defaults: ["libcore_java_defaults"],
    hostdex: true,

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    patch_module: "java.base",

    notice: "ojluni/NOTICE",

    installable: false,
    include_srcs: true,
}

// Creates a jar that exists to satisfy javac when compiling source code that
// contains lambdas. This contains all classes / methods required by javac
// when generating invoke-dynamic lambda implementation code, even those that
// are also in the public SDK API from API level 26 onwards.
java_library {
    name: "core-lambda-stubs",
    visibility: ["//visibility:public"],
    defaults: ["core_lambda_stubs_defaults"],
    srcs: [
        ":openjdk_lambda_stub_files",
        ":openjdk_lambda_duplicate_stub_files",
    ],
    // This jar is packaged as part of the SDK, use -target 8 so that it works
    // with old JDKs.
    java_version: "1.8",
}

// An alternative to core-lambda-stubs that omits openjdk_lambda_duplicate_stub_files
// because those classes are also part of the core library public SDK API
// (since API level 26).
java_library {
    name: "core-lambda-stubs-for-system-modules",
    visibility: [
        "//art/build/sdk",
        "//build/soong/java/core-libraries",
    ],
    defaults: ["core_lambda_stubs_defaults"],
    srcs: [
        ":openjdk_lambda_stub_files",
    ],
    include_srcs: true,
}

// Creates a jar that exists to satisfy javac when compiling source code that
// contains @Generated annotations, which are produced by some code generation
// tools (notably dagger) but aren't part of the Android API.
// See http://b/123891440.
java_library {
    name: "core-generated-annotation-stubs",
    visibility: [
        "//art/build/sdk",
        "//build/soong/java/core-libraries",
    ],
    defaults: ["libcore_java_defaults"],
    srcs: [
        ":openjdk_generated_annotation_stub_files",
    ],
    hostdex: true,
    sdk_version: "none",
    system_modules: "core-all-system-modules",
    patch_module: "java.base",
    notice: "ojluni/NOTICE",
    installable: false,
    include_srcs: true,
}

// Builds libcore test rules
java_library_static {
    name: "core-test-rules",
    visibility: [
        "//art/build/sdk",
        "//cts/tests/tests/util",
        "//external/conscrypt",
        "//external/conscrypt/apex/tests",
        "//frameworks/base/location/tests/locationtests",
        "//frameworks/base/core/tests/coretests",
        "//frameworks/base/wifi/tests",
        "//libcore/luni/src/test/java9compatibility",
        "//packages/modules/Wifi/framework/tests",
    ],
    hostdex: true,
    srcs: [
        "dalvik/test-rules/src/main/**/*.java",
        "test-rules/src/main/**/*.java",
    ],
    static_libs: ["junit"],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
}

// Builds platform_compat test rules
java_library_static {
    name: "core-compat-test-rules",
    visibility: [
        "//art/build/sdk",
        "//frameworks/base/tests/PlatformCompatGating/test-rules",
    ],
    srcs: [
        "luni/src/main/java/android/compat/**/*.java",
        "test-rules/src/platform_compat/**/*.java",
        "luni/src/main/java/libcore/api/CorePlatformApi.java",
        "luni/src/main/java/libcore/api/IntraCoreApi.java",
    ],
    static_libs: [
        "junit",
        "guava",
    ],
    sdk_version: "none",
    system_modules: "core-all-system-modules",
    // This builds classes that are in the java.base Java module:
    patch_module: "java.base",
    hostdex: true,
}

// Builds the core-tests-support library used by various tests.
java_library_static {
    name: "core-tests-support",
    visibility: [
        "//art/build/sdk",
        "//cts/apps/CtsVerifier",
        "//cts/tests/tests/keystore",
        "//cts/tests/tests/net",
        "//cts/tests/tests/net/api23Test",
        "//external/apache-harmony",
        "//frameworks/base/core/tests/coretests",
        "//libcore/benchmarks",
        "//packages/apps/KeyChain/tests",
        "//system/timezone/distro/core",
        "//packages/modules/Connectivity/tests:__subpackages__",
    ],
    hostdex: true,
    srcs: ["support/src/test/java/**/*.java"],

    sdk_version: "core_platform",
    libs: ["junit"],
    static_libs: [
        "bouncycastle-unbundled",
        "bouncycastle-bcpkix-unbundled",
        "bouncycastle-ocsp-unbundled",
    ],
}

// Builds the jsr166-tests library.
java_test {
    name: "jsr166-tests",
    visibility: [
        "//art/build/sdk",
        "//cts/tests/libcore/jsr166",
    ],
    srcs: ["jsr166-tests/src/test/java/**/*.java"],
    sdk_version: "none",
    system_modules: "core-all-system-modules",
    libs: [
        "junit",
    ],
    errorprone: {
        javacflags: [
            "-Xep:DoNotCall:OFF",
        ],
    },
}

// A filegroup that provides access to a source file for a toolchain test that
// checks Java 9 language features are handled properly by JarJar.
filegroup {
    name: "core-java-9-language-features-source",
    srcs: ["luni/src/main/java/libcore/internal/Java9LanguageFeatures.java"],
    visibility: ["//libcore/luni/src/test/java9language"],
}

// A filegroup that provides access to a source file for a toolchain test that
// checks Java 11 language features are handled properly by JarJar.
filegroup {
    name: "core-java-11-language-features-source",
    srcs: ["luni/src/main/java/libcore/internal/Java11LanguageFeatures.java"],
    visibility: ["//libcore/luni/src/test/java11language"],
}

genrule {
    name: "core-tests-smali-dex",
    srcs: ["luni/src/test/java/**/*.smali"],
    cmd: "$(location smali) ass --api 28 -o $(out) $(in)",
    out: ["core-tests-smali.dex"],
    tools: ["smali"],
}

filegroup {
    name: "core-ojtests-javax-resources",
    // Set path to keep the resources and .class files in the same directory in the jar file.
    path: "ojluni/src",
    srcs: ["ojluni/src/test/javax/**/*"],
    exclude_srcs: ["ojluni/src/test/javax/**/*.java"],
}

// Builds the core-tests library.
java_test {
    name: "core-tests",
    visibility: [
        "//art/build/sdk",
        "//cts/tests/libcore/luni",
    ],
    defaults: ["libcore_java_defaults"],
    hostdex: true,
    srcs: [
        "dalvik/src/test/java/**/*.java",
        "dalvik/test-rules/src/test/java/**/*.java",
        "dom/src/test/java/**/*.java",
        "harmony-tests/src/test/java/**/*.java",
        "json/src/test/java/**/*.java",
        "luni/src/test/java/**/*.java",
        "test-rules/src/test/java/**/*.java",
        "xml/src/test/java/**/*.java",
    ],
    exclude_srcs: [
        "harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/*.java",
        "luni/src/test/java/libcore/java/util/zip/Zip64Test.java",
        "luni/src/test/java/libcore/java/util/zip/Zip64FileTest.java",
        "luni/src/test/java/libcore/javax/crypto/**/*.java",
        "luni/src/test/java/libcore/javax/net/ssl/**/*.java",
        "luni/src/test/java/org/apache/harmony/crypto/**/*.java",
    ],

    java_resource_dirs: [
        "*/src/test/java",
        "*/src/test/resources",
    ],
    exclude_java_resource_dirs: [
        "ojluni/src/test/java",
        "ojluni/src/test/javax",
        "ojluni/src/test/resources",
    ],

    java_resources: [
        ":annotations-test",
        ":filesystemstest",
        ":parameter-metadata-test",
        ":core-tests-smali-dex",
    ],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    libs: [
        "okhttp",
        "bouncycastle",
    ],

    static_libs: [
        "core-compat-test-rules",
        "core-java-9-compatibility-tests",
        "core-java-9-language-tests",
        "core-java-11-language-tests",
        "core-test-rules",
        "core-tests-support",
        "junit-params",
        "libcore-crypto-tests",
        "mockftpserver",
        "mockito-target",
        "mockwebserver",
        "nist-pkix-tests",
        "slf4j-jdk14",
        "sqlite-jdbc",
        "truth-prebuilt-jar",
    ],

    errorprone: {
        javacflags: [
            "-Xep:TryFailThrowable:ERROR",
            "-Xep:ComparisonOutOfRange:ERROR",
            "-Xep:DoNotCall:OFF",
        ],
    },

    test_config: "AndroidTest-core-tests.xml",
}

java_test {
    name: "libcore-crypto-tests",

    visibility: [
        "//art/build/sdk",
        "//external/conscrypt/apex/tests",
    ],
    srcs: [
        "harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/*.java",
        "luni/src/test/java/libcore/javax/crypto/**/*.java",
        "luni/src/test/java/libcore/javax/net/ssl/**/*.java",
        "luni/src/test/java/libcore/libcore/util/SerializationTester.java",
        "luni/src/test/java/libcore/sun/security/**/*.java",
        "luni/src/test/java/org/apache/harmony/crypto/**/*.java",
    ],

    java_resource_dirs: [
        "luni/src/test/java",
        "luni/src/test/resources",
        "support/src/test/java",
    ],

    sdk_version: "none",
    system_modules: "core-all-system-modules",

    static_libs: [
        "core-test-rules",
        "core-tests-support",
        "junit-params",
        "mockito-target",
    ],
}

// Builds the core-ojtests library that contains test code from OpenJDK.
java_test {
    name: "core-ojtests",
    defaults: ["libcore_java_defaults"],
    hostdex: true,

    srcs: [
        "ojluni/src/test/java/**/*.java",
        "ojluni/src/test/javax/**/*.java",
        "ojluni/src/test/sun/**/*.java",
    ],
    java_resource_dirs: [
        "ojluni/src/test/java",
        "ojluni/src/test/resources",
    ],

    java_resources: [
        ":core-ojtests-javax-resources",
    ],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    libs: [
        "okhttp",
        "bouncycastle",
    ],

    static_libs: [
        "junit",
        "testng",
    ],

    // ojluni/src/test/java/util/stream/{bootlib,boottest}
    // contains tests that are in packages from java.base;
    // By default, OpenJDK 9's javac will only compile such
    // code if it's declared to also be in java.base at
    // compile time.
    //
    // For now, we use patch_module to put all sources
    // and dependencies from this make target into java.base;
    // other source directories in this make target are in
    // packages not from java.base; if this becomes a problem
    // in future, this could be addressed eg. by splitting
    // boot{lib,test} out into a separate make target,
    // deleting those tests or moving them to a different
    // package.
    patch_module: "java.base",

    errorprone: {
        javacflags: [
            "-Xep:AlwaysThrows:OFF",
            "-Xep:DoNotCall:OFF",
        ],
    },
}

// Builds the core-ojtests-public library. Excludes any private API tests.
// Like core-ojtests but smaller.
java_test {
    name: "core-ojtests-public",
    visibility: [
        "//art/build/sdk",
        "//cts/tests/libcore/ojluni",
    ],
    defaults: ["libcore_java_defaults"],
    srcs: [
        "ojluni/src/test/java/**/*.java",
        "ojluni/src/test/javax/**/*.java",
        "ojluni/src/test/sun/**/*.java",
    ],
    // Filter out the following:
    // 1.) DeserializeMethodTest and SerializedLambdaTest, because they depends on stub classes
    //     and won't actually run, and
    // 2.) util/stream/boot*. Those directories contain classes in the package java.util.stream;
    //     excluding them means we don't need patch_module: "java.base"
    exclude_srcs: [
        "**/DeserializeMethodTest.java",
        "**/SerializedLambdaTest.java",
        "ojluni/src/test/java/util/stream/boot*/**/*",
    ],
    java_resource_dirs: [
        "ojluni/src/test/java",
        "ojluni/src/test/resources",
        // Include source code as part of JAR
        "ojluni/src/test/dist",
    ],

    java_resources: [
        ":core-ojtests-javax-resources",
    ],

    sdk_version: "none",
    system_modules: "core-all-system-modules",
    libs: [
        "bouncycastle",
        "junit",
        "okhttp",
        "testng",
    ],

    errorprone: {
        javacflags: [
            "-Xep:AlwaysThrows:OFF",
            "-Xep:DoNotCall:OFF",
        ],
    },
}

// Exports annotated stubs source files in ojluni/annotations/sdk to make them
// available to metalava. Used for nullability annotations in OpenJDK source.
droiddoc_exported_dir {
    name: "ojluni-annotated-sdk-stubs",
    visibility: [
        "//libcore:__subpackages__",
    ],
    path: "ojluni/annotations/sdk",
}

droiddoc_exported_dir {
    name: "ojluni-annotated-nullability-stubs",
    path: "ojluni/annotations/sdk/nullability",
}

// Exports annotated stubs source files in ojluni/annotations/mmodules to make
// them available to metalava. Used for core platform API and intra-core API
// annotations in OpenJDK source.
droiddoc_exported_dir {
    name: "ojluni-annotated-mmodule-stubs",
    visibility: [
        "//libcore/mmodules/intracoreapi",
    ],
    path: "ojluni/annotations/mmodule",
}

// A file containing the list of tags that are "known" to us from the OpenJdk
// source code and so should not cause an error or warning.
filegroup {
    name: "known-oj-tags",
    visibility: [
        "//frameworks/base",
    ],
    srcs: [
        "known_oj_tags.txt",
    ],
}

// A special set of stubs containing the minimal set of self consistent
// classes for which a system module can be created. Every system module must
// contain the java.lang classes so the set was constructed by starting with
// the java.lang classes and then adding their transitive dependencies without
// splitting packages. So, if one class from a package is used then all classes
// in that package were added to the set.
//
// Needed for java-current-stubs-system-modules.
droidstubs {
    name: "java-current-stubs-source",
    srcs: [
        ":core_oj_api_files",
        ":core_libart_api_files",
    ],
    installable: false,
    sdk_version: "none",
    system_modules: "none",

    args: "--stub-packages java.*:javax.*:org.w3c.dom.*:org.xml.sax.*",
}

java_library {
    name: "java.current.stubs",
    srcs: [":java-current-stubs-source"],
    errorprone: {
        javacflags: [
            "-Xep:MissingOverride:OFF",
        ],
    },
    patch_module: "java.base",
    sdk_version: "none",
    system_modules: "none",
}

// A special set of system modules needed to build art.module.public.api
// that contain nullability annotations when targeting java language level 1.9
// and above.
java_system_modules {
    name: "java-current-stubs-system-modules",
    libs: [
        // Minimal set of classes required for a system module.
        "java.current.stubs",

        // The nullability annotations used by the generated stubs.
        "stub-annotations",
    ],
}

java_library {
    name: "framework-api-annotations-lib",
    srcs: [":framework-api-annotations"],
    sdk_version: "none",
    patch_module: "java.base",
    system_modules: "core-all-system-modules",
    installable: false,
    visibility: [
        "//visibility:private",
    ],
}

// Define the public SDK API provided by the ART module.
java_sdk_library {
    name: "art.module.public.api",
    visibility: [
        "//art/build/sdk",
        "//build/soong/java/core-libraries",
        "//frameworks/base",
        "//frameworks/base/api",

        // DO NOT REMOVE: Legacy visibility, needed for snapshots that are
        // generated for the S build.
        "//libcore/mmodules/core_platform_api",
    ],
    srcs: [
        ":core_oj_api_files",
        ":core_libart_api_files",

        // Some source files in :core_oj_api_files and :openjdk_mmodule_extra_files are
        // annotated by applying annotations to the .annotated.java stubs files in
        // ojluni/annotated/mmodules and rather than in the original source. See the comments
        // in openjdk_java_files.bp for more details.
        ":openjdk_mmodule_extra_files",
        ":okhttp_api_files",

    ],
    libs: [
        // Put framework-api-annotations into libs to avoid exposing the definition of framework's
        // annotations from libcore (wrong place) instead of framework (correct place).
        "framework-api-annotations-lib",
        // Provide access to I18N constants that are used to initialize
        // constants in the public API. i.e. to allow the value of the
        // java.text.CollectionElementIterator.NULLORDER to be initialized from
        // android.icu.text.CollationElementIterator.NULLORDER.
        "i18n.module.intra.core.api.stubs",
    ],
    stub_only_static_libs: ["notices-for-stubs-jar"],

    // Make dex jars for the stubs available for use by hiddenapi processing.
    compile_dex: true,

    public: {
        enabled: true,
    },
    system: {
        enabled: true,
    },
    module_lib: {
        enabled: true,
    },

    api_only: true,
    droiddoc_options: [
        "--force-convert-to-warning-nullability-annotations +*:-android.*:+android.icu.*:-dalvik.* ",
        "--hide-annotation libcore.api.Hide",
    ],

    merge_inclusion_annotations_dirs: ["ojluni-annotated-mmodule-stubs"],
    // Emit nullability annotations from the source to the stub files.
    annotations_enabled: true,

    merge_annotations_dirs: [
        "metalava-manual",
        "ojluni-annotated-sdk-stubs",
    ],

    doctag_files: [
        ":known-oj-tags",
    ],

    errorprone: {
        javacflags: [
            "-Xep:MissingOverride:OFF",
        ],
    },
    patch_module: "java.base",
    sdk_version: "none",
    system_modules: "java-current-stubs-system-modules",
    // The base name for the artifacts that are automatically published to the
    // dist and which end up in one of the sub-directories of prebuilts/sdk.
    // As long as this matches the name of the artifacts in prebuilts/sdk then
    // the API will be checked for compatibility against the latest released
    // version of the API.
    dist_stem: "art",
    dist_group: "android",
}

// Used when compiling higher-level code against art.module.public.api.stubs.
//
// This is only intended for use within core libraries and must not be used
// from outside.
java_system_modules {
    name: "art-module-public-api-stubs-system-modules",
    visibility: [
        "//art/build/sdk",
        "//external/conscrypt",
        "//external/icu/android_icu4j",
        "//external/wycheproof",
    ],
    libs: [
        "art.module.public.api.stubs",
        // This one is not on device but it's needed when javac compiles code
        // containing lambdas.
        "core-lambda-stubs-for-system-modules",
        // This one is not on device but it's needed when javac compiles code
        // containing @Generated annotations produced by some code generation
        // tools.
        // See http://b/123891440.
        "core-generated-annotation-stubs",

        // Ensure that core libraries that depend on the public API can access
        // the UnsupportedAppUsage, CorePlatformApi and IntraCoreApi
        // annotations.
        "art.module.api.annotations.for.system.modules",

        // Make nullability annotations available when compiling public stubs.
        // They are provided as a separate library because while the
        // annotations are not themselves part of the public API provided by
        // this module they are used in the stubs.
        "stub-annotations",
    ],
}

// Used when compiling higher-level code against art.module.public.api.stubs.module_lib.
//
// This is only intended for use within core libraries and must not be used
// from outside.
java_system_modules {
    name: "art-module-lib-api-stubs-system-modules",
    visibility: [
        "//art/build/sdk",
        "//external/conscrypt",
        "//external/icu/android_icu4j",
    ],
    libs: [
        "art.module.public.api.stubs.module_lib",
    ],
}

// Target for validating nullability annotations for correctness and
// completeness. To check that there are no nullability errors:
//   m art-module-public-api-stubs-nullability-validation
// To check that there are only the expected nullability warnings:
//   m art-module-public-api-stubs-nullability-validation-check-nullability-warnings
// (If that check fails, it will provide instructions on how to proceed,
// including the command to run to update the expected warnings file.)
droidstubs {
    name: "art-module-public-api-stubs-nullability-validation",
    srcs: [":art_module_api_files"],
    installable: false,
    sdk_version: "none",
    system_modules: "none",
    annotations_enabled: true,
    args: "--hide-annotation libcore.api.Hide " +
        "--validate-nullability-from-merged-stubs ",
    merge_inclusion_annotations_dirs: ["ojluni-annotated-mmodule-stubs"],
    merge_annotations_dirs: [
        // N.B. Stubs in this filegroup will be validated:
        "ojluni-annotated-nullability-stubs",
    ],
    // The list of classes which have nullability annotations included in the source.
    // (This is in addition to those which have annotations in the merged stubs.)
    validate_nullability_from_list: "nullability_annotated_classes.txt",
    // The expected set of warnings about missing annotations:
    check_nullability_warnings: "nullability_warnings.txt",
}

// A special set of system modules for building the following library for use
// in the art-module-public-api-system-modules.
java_system_modules {
    name: "api-annotations-system-modules",
    libs: [
        "art.module.public.api.stubs",
    ],
}

// A library that contains annotations that define API surfaces (core
// platform, intra core and the hidden API) along with some supporting
// constants. The annotations are source only and do not introduce any runtime
// dependencies. Specially built for use in system modules definitions to
// avoid introducing compile time cycles.
java_library {
    name: "art.module.api.annotations.for.system.modules",
    visibility: [
        "//art/libartservice",
    ],
    srcs: [
        ":api_surface_annotation_files",
    ],

    installable: false,
    sdk_version: "none",
    system_modules: "api-annotations-system-modules",
    patch_module: "java.base",
}

// Create a library containing the api surface annotations, built against
// core_current for use by the annotation processor in frameworks/base.
java_library {
    name: "art.module.api.annotations",
    visibility: [
        "//art/build/sdk",
        "//external/icu/android_icu4j",
        "//frameworks/base",
    ],
    host_supported: true,
    srcs: [
        ":api_surface_annotation_files",
    ],
    sdk_version: "core_current",
}