//
// Copyright (C) 2020 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_team: "trendy_team_fwk_core_networking",
    // See: http://go/android-license-faq
    default_applicable_licenses: ["Android-Apache-2.0"],
}

service_remoteauth_pre_jarjar_lib = "service-remoteauth-pre-jarjar"

// The above variables may have different values
// depending on the branch, and this comment helps
// separate them from the rest of the file to avoid merge conflicts

aidl_interface {
    name: "connectivity_native_aidl_interface",
    local_include_dir: "binder",
    srcs: [
        "binder/android/net/connectivity/aidl/*.aidl",
    ],
    backend: {
        java: {
            apex_available: [
                "com.android.tethering",
            ],
            min_sdk_version: "30",
        },
        ndk: {
            apex_available: [
                "com.android.tethering",
            ],
            min_sdk_version: "30",
        },
    },
    versions: ["1"],

}

cc_library_static {
    name: "connectivity_native_aidl_interface-lateststable-ndk",
    min_sdk_version: "30",
    whole_static_libs: [
        "connectivity_native_aidl_interface-V1-ndk",
    ],
    apex_available: [
        "com.android.tethering",
    ],
}

java_library {
    name: "connectivity_native_aidl_interface-lateststable-java",
    sdk_version: "system_current",
    min_sdk_version: "30",
    static_libs: [
        "connectivity_native_aidl_interface-V1-java",
    ],
    apex_available: [
        "com.android.tethering",
    ],
}

// The library name match the service-connectivity jarjar rules that put the JNI utils in the
// android.net.connectivity.com.android.net.module.util package.
cc_library_shared {
    name: "libandroid_net_connectivity_com_android_net_module_util_jni",
    min_sdk_version: "30",
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
        "-Wthread-safety",
    ],
    srcs: [
        "jni/com_android_net_module_util/onload.cpp",
    ],
    static_libs: [
        "libnet_utils_device_common_bpfjni",
        "libnet_utils_device_common_bpfutils",
    ],
    shared_libs: [
        "liblog",
        "libnativehelper",
    ],
    apex_available: [
        "com.android.tethering",
    ],
}

cc_library_shared {
    name: "libandroid_net_connectivity_com_android_net_module_util_jni_CommonConnectivityJni",
    srcs: [
        "jni/commonconnectivity/onload.cpp",
    ],
    min_sdk_version: "30",
    shared_libs: [
        "libbinder_ndk",
        "liblog",
        "libnativehelper",
    ],
    static_libs: [
        "libcommonconnectivityjni",
    ],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
        "-Wthread-safety",
    ],
    apex_available: [
        "com.android.tethering",
    ],
}

cc_library_shared {
    name: "libservice-connectivity",
    min_sdk_version: "30",
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
        "-Wthread-safety",
    ],
    srcs: [
        ":services.connectivity-netstats-jni-sources",
        "jni/com_android_server_connectivity_ClatCoordinator.cpp",
        "jni/onload.cpp",
    ],
    header_libs: [
        "bpf_connectivity_headers",
    ],
    static_libs: [
        "libclat",
        "libip_checksum",
        "libmodules-utils-build",
        "libnetjniutils",
        "libnet_utils_device_common_bpfjni",
        "libserviceconnectivityjni",
        "netd_aidl_interface-lateststable-ndk",
        "libcommonconnectivityjni",
    ],
    shared_libs: [
        "libbase",
        "libcutils",
        "libnetdutils",
        "liblog",
        "libnativehelper",
        "libnetworkstats",
    ],
    apex_available: [
        "com.android.tethering",
    ],
}

java_library {
    name: "service-connectivity-pre-jarjar",
    sdk_version: "system_server_current",
    min_sdk_version: "30",
    // NetworkStackApiShimSettingsForCurrentBranch provides the latest available shims depending on
    // the branch to "service-connectivity".
    // There are Tethering.apk and TetheringNext.apk variants for the tethering APEX,
    // which use NetworkStackApiStableShims and NetworkStackApiCurrentShims respectively.
    // Note that there can be no service-connectivity-next because it would need to be configured in
    // default_art_config.mk which doesn't support conditionals, hence this scheme of using a
    // variable here.
    defaults: ["NetworkStackApiShimSettingsForCurrentBranch"],
    srcs: [
        "src/**/*.java",
        ":framework-connectivity-shared-srcs",
        ":services-connectivity-shared-srcs",
        ":statslog-connectivity-java-gen",
    ],
    libs: [
        "framework-annotations-lib",
        "framework-bluetooth.stubs.module_lib",
        "framework-configinfrastructure.stubs.module_lib",
        "framework-connectivity-pre-jarjar",
        "framework-connectivity-t-pre-jarjar",
        // The framework-connectivity-t library is only available on T+ platforms
        // so any calls to it must be protected with a check to ensure that it is
        // available. The linter will detect any unprotected calls through an API
        // but not direct calls to the implementation. So, this depends on the
        // module lib stubs directly to ensure the linter will work correctly
        // as depending on framework-connectivity-t would cause it to be compiled
        // against the implementation because the two libraries are in the same
        // APEX.
        "framework-connectivity-t.stubs.module_lib",
        // TODO: figure out why just using "framework-tethering" uses the stubs, even though both
        // service-connectivity and framework-tethering are in the same APEX.
        "framework-tethering.impl",
        "framework-wifi.stubs.module_lib",
        "unsupportedappusage",
        "ServiceConnectivityResources",
        "framework-statsd.stubs.module_lib",
        "framework-permission.stubs.module_lib",
        "framework-permission-s.stubs.module_lib",
    ],
    static_libs: [
        // Do not add libs here if they are already included
        // in framework-connectivity
        "android.net.platform.flags-aconfig-java-export",
        "androidx.annotation_annotation",
        "com.android.tethering.mainline.beta.flags-aconfig-java",
        "connectivity-net-module-utils-bpf",
        "connectivity_native_aidl_interface-lateststable-java",
        "dnsresolver_aidl_interface-V17-java",
        "modules-utils-shell-command-handler",
        "net-utils-service-connectivity",
        "netd-client",
        "networkstack-client",
        "PlatformProperties",
        "service-connectivity-protos",
        "service-connectivity-stats-protos",
    ],
    apex_available: [
        "com.android.tethering",
    ],
    lint: {
        baseline_filename: "lint-baseline.xml",

    },
    visibility: [
        "//packages/modules/Connectivity/service-t",
        "//packages/modules/Connectivity/service-b",
        "//packages/modules/Connectivity/networksecurity:__subpackages__",
        "//packages/modules/Connectivity/tests:__subpackages__",
        "//packages/modules/Connectivity/thread/service:__subpackages__",
        "//packages/modules/Connectivity/thread/tests:__subpackages__",
    ],
}

java_library {
    name: "service-connectivity-protos",
    sdk_version: "system_current",
    min_sdk_version: "30",
    proto: {
        type: "nano",
    },
    srcs: [
        ":system-messages-proto-src",
    ],
    libs: ["libprotobuf-java-nano"],
    apex_available: [
        "com.android.tethering",
    ],
    lint: {
        strict_updatability_linting: true,

    },
}

java_defaults {
    name: "service-connectivity-defaults",
    sdk_version: "system_server_current",
    min_sdk_version: "30",
    defaults: [
        "standalone-system-server-module-optimize-defaults",
    ],
    // This library combines system server jars that have access to different bootclasspath jars.
    // Lower SDK service jars must not depend on higher SDK jars as that would let them
    // transitively depend on the wrong bootclasspath jars. Sources also cannot be added here as
    // they would depend on bootclasspath jars that may not be available.
    static_libs: [
        "service-connectivity-pre-jarjar",
        "service-connectivity-tiramisu-pre-jarjar",
        "service-nearby-pre-jarjar",
        "service-networksecurity-pre-jarjar",
        service_remoteauth_pre_jarjar_lib,
        "service-thread-pre-jarjar",
    ] + select(release_flag("RELEASE_MOVE_VCN_TO_MAINLINE"), {
        true: ["service-connectivity-b-pre-jarjar"],
        default: [],
    }),

    // The below libraries are not actually needed to build since no source is compiled
    // (only combining prebuilt static_libs), but they are necessary so that R8 has the right
    // references to optimize the code. Without these, there will be missing class warnings and
    // code may be wrongly optimized.
    // R8 runs after jarjar, so the framework-X libraries need to be the post-jarjar artifacts
    // (.impl), if they are not just stubs, so that the name of jarjared classes match.
    libs: [
        "androidx.annotation_annotation",
        "framework-annotations-lib",
        "framework-connectivity.impl",
        "framework-connectivity-t.impl",
        "framework-tethering.impl",
        "framework-wifi.stubs.module_lib",
        "libprotobuf-java-nano",
        "framework-permission.stubs.module_lib",
        "framework-permission-s.stubs.module_lib",
    ],
    jarjar_rules: ":connectivity-jarjar-rules",
    apex_available: [
        "com.android.tethering",
    ],
    optimize: {
        proguard_flags_files: ["proguard.flags"],
    },
}

// A special library created strictly for use by the tests as they need the
// implementation library but that is not available when building from prebuilts.
// Using a library with a different name to what is used by the prebuilts ensures
// that this will never depend on the prebuilt.
// Switching service-connectivity to a java_sdk_library would also have worked as
// that has built in support for managing this but that is too big a change at this
// point.
java_library {
    name: "service-connectivity-for-tests",
    defaults: ["service-connectivity-defaults"],
}

java_library {
    name: "service-connectivity",
    defaults: ["service-connectivity-defaults"],
    installable: true,
    dex_preopt: {
        // The profile is updated monthly or before mainline releases if requested, with the
        // aggregated profiles collected from Droidfooders. go/boot-image-profiles.
        profile: select(release_flag("RELEASE_ART_COMPILE_CONNECTIVITY_SERVICE_SPEED_PROFILE"), {
            true: "art-profile",
            false: "",
        }),
    },
}

java_library_static {
    name: "service-connectivity-stats-protos",
    sdk_version: "system_current",
    min_sdk_version: "30",
    proto: {
        type: "lite",
    },
    srcs: [
        "src/com/android/metrics/stats.proto",
    ],
    static_libs: ["ConnectivityServiceprotos"],
    apex_available: ["com.android.tethering"],
}

java_genrule {
    name: "connectivity-jarjar-rules",
    defaults: ["jarjar-rules-combine-defaults"],
    srcs: [
        ":framework-connectivity-jarjar-rules",
        ":service-connectivity-jarjar-gen",
        ":service-nearby-jarjar-gen",
        ":service-networksecurity-jarjar-gen",
        ":service-remoteauth-jarjar-gen",
        ":service-thread-jarjar-gen",
    ],
    out: ["connectivity-jarjar-rules.txt"],
    visibility: ["//packages/modules/Connectivity:__subpackages__"],
}

// TODO: This filegroup temporary exposes for NetworkStats. It should be
// removed right after NetworkStats moves into mainline module.
filegroup {
    name: "traffic-controller-utils",
    srcs: ["src/com/android/server/BpfNetMaps.java"],
    visibility: ["//packages/modules/Connectivity:__subpackages__"],
}

java_genrule {
    name: "service-connectivity-jarjar-gen",
    tool_files: [
        ":service-connectivity-pre-jarjar{.jar}",
        ":service-connectivity-b-pre-jarjar{.jar}",
        ":service-connectivity-tiramisu-pre-jarjar{.jar}",
        "jarjar-excludes.txt",
    ],
    tools: [
        "jarjar-rules-generator",
    ],
    out: ["service_connectivity_jarjar_rules.txt"],
    cmd: "$(location jarjar-rules-generator) " +
        "$(location :service-connectivity-pre-jarjar{.jar}) " +
        "$(location :service-connectivity-b-pre-jarjar{.jar}) " +
        "$(location :service-connectivity-tiramisu-pre-jarjar{.jar}) " +
        "--prefix android.net.connectivity " +
        "--excludes $(location jarjar-excludes.txt) " +
        "--output $(out)",
    visibility: ["//visibility:private"],
}

java_genrule {
    name: "service-nearby-jarjar-gen",
    tool_files: [
        ":service-nearby-pre-jarjar{.jar}",
        "jarjar-excludes.txt",
    ],
    tools: [
        "jarjar-rules-generator",
    ],
    out: ["service_nearby_jarjar_rules.txt"],
    cmd: "$(location jarjar-rules-generator) " +
        "$(location :service-nearby-pre-jarjar{.jar}) " +
        "--prefix com.android.server.nearby " +
        "--excludes $(location jarjar-excludes.txt) " +
        "--output $(out)",
    visibility: ["//visibility:private"],
}

java_genrule {
    name: "service-remoteauth-jarjar-gen",
    tool_files: [
        ":" + service_remoteauth_pre_jarjar_lib + "{.jar}",
        "jarjar-excludes.txt",
    ],
    tools: [
        "jarjar-rules-generator",
    ],
    out: ["service_remoteauth_jarjar_rules.txt"],
    cmd: "$(location jarjar-rules-generator) " +
        "$(location :" + service_remoteauth_pre_jarjar_lib + "{.jar}) " +
        "--prefix com.android.server.remoteauth " +
        "--excludes $(location jarjar-excludes.txt) " +
        "--output $(out)",
    visibility: ["//visibility:private"],
}

java_genrule {
    name: "service-thread-jarjar-gen",
    tool_files: [
        ":service-thread-pre-jarjar{.jar}",
        "jarjar-excludes.txt",
    ],
    tools: [
        "jarjar-rules-generator",
    ],
    out: ["service_thread_jarjar_rules.txt"],
    cmd: "$(location jarjar-rules-generator) " +
        "$(location :service-thread-pre-jarjar{.jar}) " +
        "--prefix com.android.server.thread " +
        "--excludes $(location jarjar-excludes.txt) " +
        "--output $(out)",
    visibility: ["//visibility:private"],
}

java_genrule {
    name: "service-networksecurity-jarjar-gen",
    tool_files: [
        ":service-networksecurity-pre-jarjar{.jar}",
        "jarjar-excludes.txt",
    ],
    tools: [
        "jarjar-rules-generator",
    ],
    out: ["service_ct_jarjar_rules.txt"],
    cmd: "$(location jarjar-rules-generator) " +
        "$(location :service-networksecurity-pre-jarjar{.jar}) " +
        "--prefix com.android.server.net.ct " +
        "--excludes $(location jarjar-excludes.txt) " +
        "--output $(out)",
    visibility: ["//visibility:private"],
}

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