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

mainline_stubs_args =
    "--error UnhiddenSystemApi " +
    "--hide BroadcastBehavior " +
    "--hide DeprecationMismatch " +
    "--hide HiddenSuperclass " +
    "--hide HiddenTypedefConstant " +
    "--hide HiddenTypeParameter " +
    "--hide MissingPermission " +
    "--hide RequiresPermission " +
    "--hide SdkConstant " +
    "--hide Todo " +
    "--hide Typo " +
    "--hide UnavailableSymbol "

// TODO: remove the hiding when server classes are cleaned up.
mainline_framework_stubs_args =
    mainline_stubs_args +
    "--hide-package com.android.server "

priv_apps = " " +
    "--show-annotation android.annotation.SystemApi\\(" +
        "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" +
    "\\) "

module_libs = " " +
    " --show-annotation android.annotation.SystemApi\\(" +
        "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" +
    "\\) "

mainline_service_stubs_args =
    mainline_stubs_args +
    "--show-annotation android.annotation.SystemApi\\(" +
        "client=android.annotation.SystemApi.Client.SYSTEM_SERVER" +
    "\\) " +
    "--hide-annotation android.annotation.Hide " +
    "--hide InternalClasses " // com.android.* classes are okay in this interface

stubs_defaults {
    name: "framework-module-stubs-defaults-publicapi",
    args: mainline_framework_stubs_args,
    installable: false,
    sdk_version: "current",
    check_api: {
        current: {
            api_file: "api/current.txt",
            removed_api_file: "api/removed.txt",
        },
    },
    dist: {
        targets: ["sdk", "win_sdk"],
        dir: "apistubs/android/public/api",
    },
}

stubs_defaults {
    name: "framework-module-stubs-defaults-systemapi",
    args: mainline_framework_stubs_args + priv_apps,
    libs: ["framework-annotations-lib"],
    installable: false,
    sdk_version: "system_current",
    check_api: {
        current: {
            api_file: "api/system-current.txt",
            removed_api_file: "api/system-removed.txt",
        },
    },
    dist: {
        targets: ["sdk", "win_sdk"],
        dir: "apistubs/android/system/api",
    },
}

java_defaults {
    name: "framework-module-stubs-lib-defaults-publicapi",
    installable: false,
    sdk_version: "module_current",
}

java_defaults {
    name: "framework-module-stubs-lib-defaults-systemapi",
    installable: false,
    sdk_version: "module_current",
}

java_defaults {
    name: "framework-module-stubs-lib-defaults-module_libs_api",
    installable: false,
    sdk_version: "module_current",
}

// The defaults for module_libs comes in two parts - defaults for API checks
// and defaults for stub generation. This is because we want the API txt
// files to *only* include the module_libs_api, but the stubs to include
// module_libs_api as well as priv_apps.

stubs_defaults {
    name: "framework-module-api-defaults-module_libs_api",
    args: mainline_framework_stubs_args + module_libs,
    libs: ["framework-annotations-lib"],
    installable: false,
    sdk_version: "module_current",
    check_api: {
        current: {
            api_file: "api/module-lib-current.txt",
            removed_api_file: "api/module-lib-removed.txt",
        },
    },
    dist: {
        targets: ["sdk", "win_sdk"],
        dir: "apistubs/android/module-lib/api",
    },
}

stubs_defaults {
    name: "framework-module-stubs-defaults-module_libs_api",
    args: mainline_framework_stubs_args + module_libs + priv_apps,
    libs: ["framework-annotations-lib"],
    installable: false,
    sdk_version: "module_current",
}

stubs_defaults {
    name: "service-module-stubs-srcs-defaults",
    args: mainline_service_stubs_args,
    installable: false,
    check_api: {
        current: {
            api_file: "api/current.txt",
            removed_api_file: "api/removed.txt",
        },
    },
    dist: {
        targets: ["sdk", "win_sdk"],
        dir: "apistubs/android/system-server/api",
    },
}

// Empty for now, but a convenient place to add rules for all
// module java_library system_server stub libs.
java_defaults {
    name: "service-module-stubs-defaults",
}
