/*
 * Copyright (C) 2017 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 androidx.build.Publish
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

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

dependencies {
  api(project(":lifecycle:lifecycle-reactivestreams"))
  api(libs.kotlinStdlib)

  testImplementation(libs.junit)
  testImplementation(libs.rxjava2)
  testImplementation(libs.truth)
  testImplementation(libs.kotlinCoroutinesTest)
  testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
  testImplementation("androidx.arch.core:core-testing:2.1.0")
}

androidx {
  name = "Android Lifecycle ReactiveStreams KTX"
  publish = Publish.SNAPSHOT_AND_RELEASE
  mavenGroup = LibraryGroups.LIFECYCLE
  inceptionYear = "2018"
  description = "Kotlin extensions for Lifecycle ReactiveStreams"
}

android {
    namespace "androidx.lifecycle.reactivestreams.ktx"
}

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