// Copyright (C) 2022 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.

package {
    default_applicable_licenses: ["Android-Apache-2.0"],
}

genrule {
    name: "statslog-adservices-java-gen",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --java $(out) --module adservices" +
        " --javaPackage com.android.adservices.service.stats --javaClass AdServicesStatsLog",
    out: ["com/android/adservices/service/stats/AdServicesStatsLog.java"],
}

// Converts the text proto Cobalt registry into a binary proto.
genrule {
    name: "cobalt-registry-binarypb-gen",
    srcs: [
        "resources/cobalt_registry.textpb",
        ":adservices-cobalt-proto",
    ],
    out: ["cobalt_registry.binarypb"],
    tools: ["aprotoc"],
    cmd: "$(location aprotoc) --encode=cobalt.CobaltRegistry " +
        "--proto_path=packages/modules/AdServices/adservices/libraries/cobalt/proto " +
        "packages/modules/AdServices/adservices/libraries/cobalt/proto/cobalt_registry.proto " +
        "< $(location resources/cobalt_registry.textpb) > $(out)",
}

// Outputs a class confirming the Cobalt registry asset is validated, conditioned on
// the asset binary proto and text proto being the same.
genrule {
    name: "cobalt-registry-validated-java",
    srcs: [
        ":checked_in_cobalt_registry_binarypb",
        ":cobalt-registry-binarypb-gen",
        "resources/CobaltRegistryValidated.java",
    ],
    // Compare the generated binary proto to the asset binary proto and fail if they
    // are different. Additionally, print a message with instructions on how to update
    // the asset binary proto.
    cmd: "cp $(location resources/CobaltRegistryValidated.java) $(out) && " +
        "cmp -s $(location :cobalt-registry-binarypb-gen) $(location :checked_in_cobalt_registry_binarypb) " +
        "|| (echo -e '\\n\\n################################################################\\n#\\n" +
        "#  ERROR: Binary registry is out of date.  To update it, run:\\n#\\n" +
        "#  cp $(location :cobalt-registry-binarypb-gen) " +
        "packages/modules/AdServices/adservices/apk/assets/cobalt/cobalt_registry.binarypb\\n#\\n" +
        "################################################################\\n\\n' >&2 && false)",
    out: ["com/android/adservices/cobalt/CobaltRegistryValidated.java"],
}

filegroup {
    name: "adservices-service-core-sources",
    srcs: [
        "java/**/*.java",
    ],
    path: "java",
    visibility: [
        "//packages/modules/AdServices/adservices/tests:__subpackages__",
        "//package/modules/ExtServices/extservices:__subpackages__",
    ],
}

filegroup {
    name: "adservices-service-core-jni-sources",
    srcs: [
        "jni/java/**/*.java",
    ],
    path: "jni",
    visibility: [
        "//packages/modules/AdServices/adservices:__subpackages__",
    ],
}

filegroup {
    name: "adservices-service-core-flags-constants-sources",
    srcs: [
        "java/com/android/adservices/cobalt/CobaltConstants.java",
        "java/com/android/adservices/service/CommonFlagsConstants.java",
        "java/com/android/adservices/service/CommonDebugFlagsConstants.java",
        "java/com/android/adservices/service/DebugFlagsConstants.java",
        "java/com/android/adservices/service/FlagsConstants.java",
    ],
    path: "java",
    visibility: [
        "//packages/modules/AdServices/adservices/tests/test-util",
    ],
}

// TODO(b/306522832): move to Shared/ and change packages (to something like
// c.a.ads.flags), although we'd need to be consider whether to make sure it's
// used only by adservices itself, not ODP (or SdkSandbox)
filegroup {
    name: "adservices-service-common-flags-sources",
    srcs: [
        "java/com/android/adservices/service/CommonDebugFlags.java",
        "java/com/android/adservices/service/CommonDebugFlagsConstants.java",
        "java/com/android/adservices/service/CommonFlagsConstants.java",
    ],
    path: "java",
    visibility: [
        "//packages/modules/AdServices/adservices/service",
    ],
}

filegroup {
    name: "adservices-service-core-phflags-sources",
    srcs: [
        ":adservices-service-core-flags-constants-sources",
        ":adservices-service-common-flags-sources",
        "java/com/android/adservices/service/Flags.java",
        "java/com/android/adservices/service/FlagsFactory.java",
        "java/com/android/adservices/service/PhFlags.java",
        "java/com/android/adservices/service/DebugFlags.java",
    ],
    path: "java",
    visibility: [
        "//packages/modules/AdServices/adservices/tests/test-util",
    ],
}

android_library {
    name: "adservices-service-core",
    sdk_version: "module_current",
    min_sdk_version: "30",
    srcs: [
        ":adservices-service-core-sources",
        ":adservices-service-core-jni-sources",
        ":adservices-shared-sideless-flags-sources",
        ":cobalt-registry-validated-java",
        ":statslog-adservices-java-gen",
    ],
    manifest: "AndroidManifest.xml",
    plugins: [
        "androidx.appsearch_appsearch-compiler-plugin",
        "androidx.room_room-compiler-plugin",
        "auto_oneof_plugin",
        "auto_value_plugin",
        "auto_annotation_plugin",
    ],
    javacflags: [
        "-Aroom.schemaLocation=packages/modules/AdServices/adservices/service-core/schemas",
    ],
    libs: [
        "androidx.room_room-runtime",
        "framework-annotations-lib", // For @SystemApi, etc
        "framework-adservices.impl",
        "framework-configinfrastructure.stubs.module_lib",
        "framework-sdkextensions.stubs.module_lib", // For SdkExtensions
        "framework-sdksandbox.impl",
        "framework-ondevicepersonalization.stubs.module_lib",
        "framework-statsd.stubs.module_lib", // For WW logging
        "jsr305",
        "auto_value_annotations",
    ],
    static_libs: [
        "androidx.concurrent_concurrent-futures",
        "androidx.annotation_annotation",
        "androidx.appsearch_appsearch",
        "androidx.appsearch_appsearch-platform-storage",
        "cbor-java",
        "mobile_data_downloader_lib",
        "modules-utils-preconditions",
        "tflite_support_classifiers_java",
        "mobile_data_downloader_lib",
        "androidx.webkit_webkit",
        "androidx.javascriptengine_javascriptengine",
        "adservices-cobalt",
        "adservices-proto-lite",
        "adservices-grpclib-lite",
        "adservices-shared-common",
        "adservices-shared-datastore",
        "adservices-shared-error-logging",
        "adservices-shared-metriclogger",
        "adservices-shared-spe",
        "adservices-shared-storage",
        "adservices-shared-util",
        "modules-utils-build",
    ],
    jarjar_rules: "jarjar-rules.txt",
    apex_available: [
        "com.android.adservices",
        "com.android.extservices",
    ],
    lint: {
        extra_check_modules: ["AdServicesProdLintChecker"],
        baseline_filename: "lint-baseline.xml",
    },
}

cc_library_shared {
    name: "libhpke_jni",
    min_sdk_version: "30",
    sdk_version: "current",
    stl: "libc++_static",
    cflags: [
        "-Werror",
        "-Wno-unused-parameter",
        "-Wno-unused-but-set-variable",
    ],
    srcs: [
        "jni/cpp/hpke_jni.cpp",
        "jni/cpp/ohttp_jni.cpp",
        "jni/cpp/act_jni.cpp",
    ],
    include_dirs: ["packages/modules/AdServices/adservices/service-core/jni/include"],
    header_libs: ["jni_headers"],
    shared_libs: [
        "liblog",
    ],
    static_libs: [
        "libact",
        "libcrypto_static",
    ],
    version_script: "jni/version-script.lds",
    apex_available: [
        "//apex_available:platform",
        "com.android.adservices",
        "com.android.extservices",
    ],
    visibility: [
        "//packages/modules/AdServices:__subpackages__",
        "//packages/modules/ExtServices:__subpackages__",
    ],
}

// Schemas needs to be bundled via this android_library since service-core unit tests for schema
// migration will need this.
android_library {
    name: "adservices-service-core-schema",
    sdk_version: "module_current",
    min_sdk_version: "30",
    asset_dirs: [
        "schemas",
    ],
    // Must use EmptyManifest.xml since this will be used by the service-core tests. If we use the
    // normal "AndroidManifest.xml", we may introduce potential error like redeclare permissions.
    // See b/228270294 for the error about duplicated permissions.
    manifest: "EmptyManifest.xml",
    lint: {
        baseline_filename: "lint-baseline2.xml",
    },
}
