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

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import androidx.build.LibraryType
import androidx.build.Publish

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
}

dependencies {
    api(libs.kotlinStdlib)
    api('androidx.paging:paging-rxjava2:3.1.1')
    implementation(project(":room:room-paging"))
    implementation(project(":room:room-rxjava2"))

    androidTestImplementation(libs.truth)
    androidTestImplementation(libs.testExtJunitKtx)
    androidTestImplementation(libs.testRunner)
    androidTestImplementation(libs.kotlinTestJunit) //
    androidTestImplementation(libs.kotlinCoroutinesTest)
    androidTestImplementation(libs.kotlinCoroutinesRx2)
    androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
    androidTestImplementation(project(":internal-testutils-common"))
    kspAndroidTest(
            project(path: ":room:room-compiler", configuration: "shadowAndImplementation")
    )
}

// Allow usage of Kotlin's @OptIn.
tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn"]
    }
}

androidx {
    name = "Room Paging RxJava2"
    type = LibraryType.PUBLISHED_LIBRARY
    mavenGroup = LibraryGroups.ROOM
    inceptionYear = "2022"
    description = "RxJava2 integration in Room Paging"
    publish = Publish.SNAPSHOT_AND_RELEASE
}

android {
    namespace "androidx.room.paging.rxjava2"
}
