// 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.

package {
    // See: http://go/android-license-faq
    // A large-scale-change added 'default_applicable_licenses' to import
    // all of the 'license_kinds' from "frameworks_base_license"
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["frameworks_base_license"],
    default_team: "trendy_team_multitasking_windowing",
}

// Begin ProtoLog
java_library {
    name: "wm_shell_protolog-groups",
    srcs: [
        "src/com/android/wm/shell/protolog/ShellProtoLogGroup.java",
        ":protolog-common-src",
    ],
}

filegroup {
    name: "wm_shell-sources",
    srcs: [
        "src/**/*.java",
    ],
    path: "src",
}

// Sources that have no dependencies that can be used directly downstream of this library
// TODO(b/322791067): move these sources to WindowManager-Shell-shared
filegroup {
    name: "wm_shell_util-sources",
    srcs: [
        "src/com/android/wm/shell/animation/Interpolators.java",
        "src/com/android/wm/shell/animation/PhysicsAnimator.kt",
        "src/com/android/wm/shell/common/bubbles/*.kt",
        "src/com/android/wm/shell/common/bubbles/*.java",
        "src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt",
        "src/com/android/wm/shell/common/split/SplitScreenConstants.java",
        "src/com/android/wm/shell/common/TransactionPool.java",
        "src/com/android/wm/shell/common/TriangleShape.java",
        "src/com/android/wm/shell/draganddrop/DragAndDropConstants.java",
        "src/com/android/wm/shell/pip/PipContentOverlay.java",
        "src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java",
        "src/com/android/wm/shell/sysui/ShellSharedConstants.java",
        "src/com/android/wm/shell/util/**/*.java",
    ],
    path: "src",
}

// Aidls which can be used directly downstream of this library
filegroup {
    name: "wm_shell-aidls",
    srcs: [
        "src/**/*.aidl",
    ],
    path: "src",
}

// TODO(b/168581922) protologtool do not support kotlin(*.kt)
filegroup {
    name: "wm_shell-sources-kt",
    srcs: [
        "src/**/*.kt",
    ],
    path: "src",
}

genrule {
    name: "wm_shell_protolog_src",
    srcs: [
        ":wm_shell_protolog-groups",
        ":wm_shell-sources",
    ],
    tools: ["protologtool"],
    cmd: "$(location protologtool) transform-protolog-calls " +
        "--protolog-class com.android.internal.protolog.common.ProtoLog " +
        "--protolog-impl-class com.android.wm.shell.protolog.ShellProtoLogImpl " +
        "--protolog-cache-class com.android.wm.shell.protolog.ShellProtoLogCache " +
        "--loggroups-class com.android.wm.shell.protolog.ShellProtoLogGroup " +
        "--loggroups-jar $(location :wm_shell_protolog-groups) " +
        "--output-srcjar $(out) " +
        "$(locations :wm_shell-sources)",
    out: ["wm_shell_protolog.srcjar"],
}

genrule {
    name: "generate-wm_shell_protolog.json",
    srcs: [
        ":wm_shell_protolog-groups",
        ":wm_shell-sources",
    ],
    tools: ["protologtool"],
    cmd: "$(location protologtool) generate-viewer-config " +
        "--protolog-class com.android.internal.protolog.common.ProtoLog " +
        "--loggroups-class com.android.wm.shell.protolog.ShellProtoLogGroup " +
        "--loggroups-jar $(location :wm_shell_protolog-groups) " +
        "--viewer-conf $(out) " +
        "$(locations :wm_shell-sources)",
    out: ["wm_shell_protolog.json"],
}

genrule {
    name: "protolog.json.gz",
    srcs: [":generate-wm_shell_protolog.json"],
    out: ["wmshell.protolog.json.gz"],
    cmd: "gzip -c < $(in) > $(out)",
}

prebuilt_etc {
    name: "wmshell.protolog.json.gz",
    system_ext_specific: true,
    src: ":protolog.json.gz",
    filename_from_src: true,
}

// End ProtoLog

java_library {
    name: "WindowManager-Shell-proto",

    srcs: ["proto/*.proto"],

    proto: {
        type: "nano",
    },
}

java_library {
    name: "WindowManager-Shell-shared",

    srcs: ["shared/**/*.java"],
}

android_library {
    name: "WindowManager-Shell",
    srcs: [
        ":wm_shell_protolog_src",
        // TODO(b/168581922) protologtool do not support kotlin(*.kt)
        ":wm_shell-sources-kt",
        ":wm_shell-aidls",
    ],
    resource_dirs: [
        "res",
    ],
    static_libs: [
        "androidx.appcompat_appcompat",
        "androidx.core_core-animation",
        "androidx.core_core-ktx",
        "androidx.arch.core_core-runtime",
        "androidx-constraintlayout_constraintlayout",
        "androidx.dynamicanimation_dynamicanimation",
        "androidx.recyclerview_recyclerview",
        "kotlinx-coroutines-android",
        "kotlinx-coroutines-core",
        "iconloader_base",
        "com_android_wm_shell_flags_lib",
        "com.android.window.flags.window-aconfig-java",
        "WindowManager-Shell-proto",
        "WindowManager-Shell-shared",
        "perfetto_trace_java_protos",
        "dagger2",
        "jsr330",
    ],
    libs: [
        // Soong fails to automatically add this dependency because all the
        // *.kt sources are inside a filegroup.
        "kotlin-annotations",
    ],
    kotlincflags: ["-Xjvm-default=all"],
    manifest: "AndroidManifest.xml",
    plugins: ["dagger2-compiler"],
    use_resource_processor: true,
}

android_app {
    name: "WindowManagerShellRobolectric",
    platform_apis: true,
    static_libs: [
        "WindowManager-Shell",
    ],
    manifest: "multivalentTests/AndroidManifestRobolectric.xml",
    use_resource_processor: true,
}

android_robolectric_test {
    name: "WMShellRobolectricTests",
    instrumentation_for: "WindowManagerShellRobolectric",
    upstream: true,
    java_resource_dirs: [
        "multivalentTests/robolectric/config",
    ],
    srcs: [
        "multivalentTests/src/**/*.kt",
    ],
    // TODO(b/323188766): Include BubbleStackViewTest once the robolectric issue is fixed.
    exclude_srcs: ["multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt"],
    static_libs: [
        "junit",
        "androidx.test.runner",
        "androidx.test.rules",
        "androidx.test.ext.junit",
        "mockito-robolectric-prebuilt",
        "mockito-kotlin2",
        "truth",
    ],
}

android_test {
    name: "WMShellMultivalentTestsOnDevice",
    srcs: [
        "multivalentTests/src/**/*.kt",
    ],
    static_libs: [
        "WindowManager-Shell",
        "junit",
        "androidx.test.runner",
        "androidx.test.rules",
        "androidx.test.ext.junit",
        "frameworks-base-testutils",
        "mockito-kotlin2",
        "mockito-target-extended-minus-junit4",
        "truth",
        "platform-test-annotations",
        "platform-test-rules",
    ],
    libs: [
        "android.test.base",
        "android.test.runner",
    ],
    jni_libs: [
        "libdexmakerjvmtiagent",
        "libstaticjvmtiagent",
    ],
    kotlincflags: ["-Xjvm-default=all"],
    optimize: {
        enabled: false,
    },
    test_suites: ["device-tests"],
    platform_apis: true,
    certificate: "platform",
    aaptflags: [
        "--extra-packages",
        "com.android.wm.shell",
    ],
    manifest: "multivalentTests/AndroidManifest.xml",
}
