import com.vanniktech.maven.publish.SonatypeHost
import net.ltgt.gradle.errorprone.CheckSeverity

plugins {
  id 'com.android.library'
  id 'net.ltgt.errorprone'
  id 'com.vanniktech.maven.publish'
}

android {
  resourcePrefix 'lottie_'
  compileSdk 31
  defaultConfig {
    minSdk 16
    targetSdk 30
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }
  lintOptions {
    abortOnError true
    textReport true
    textOutput 'stdout'
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

mavenPublishing {
  publishToMavenCentral(SonatypeHost.DEFAULT)
  signAllPublications()
}

dependencies {
  implementation "androidx.appcompat:appcompat:$appcompatVersion"
  // Do not upgrade to 2.0 because it will bring in Kotlin as a transitive dependency.
  //noinspection GradleDependency
  implementation("com.squareup.okio:okio:1.17.4")

  annotationProcessor "com.uber.nullaway:nullaway:0.9.2"
  errorprone "com.google.errorprone:error_prone_core:2.9.0"
  //noinspection GradleDynamicVersion
  errorproneJavac "com.google.errorprone:javac:9+181-r4173-1"

  testImplementation "org.mockito:mockito-core:$mockitoVersion"
  testImplementation "org.robolectric:robolectric:$robolectricVersion"
  testImplementation "junit:junit:$junitVersion"
  androidTestImplementation "androidx.test.ext:junit:$extJunitVersion"
  androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
}

task sourcesJar(type: Jar) {
  from android.sourceSets.main.java.srcDirs
  archiveClassifier.set('sources')
}

task javadoc(type: Javadoc) {
  source = android.sourceSets.main.java.srcDirs
  configurations.implementation.setCanBeResolved(true)
  classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + configurations.implementation
}

tasks.withType(Javadoc) {
  // This started failing with the following when upgrading to AGP 7 and JDK 11.
  // TODO: investigate why once AGP 7 is stable.
  // javadoc: error - The code being documented uses modules but the packages defined in https://developer.android.com/reference/ are in the unnamed module.
  failOnError false
}

tasks.withType(JavaCompile) {
  // remove the if condition if you want to run NullAway on test code
  if (!name.toLowerCase().contains("test")) {
    options.errorprone {
      option("NullAway:AnnotatedPackages", "com.airbnb.lottie")
      // TODO: enable these and fix errors one by one.
      check("NullAway", CheckSeverity.OFF)
      check("StringSplitter", CheckSeverity.OFF)
      check("DefaultCharset", CheckSeverity.OFF)
      check("HidingField", CheckSeverity.OFF)
      check("NarrowingCompoundAssignment", CheckSeverity.OFF)
      check("MissingOverride", CheckSeverity.OFF)
      check("ReferenceEquality", CheckSeverity.OFF)
      check("FallThrough", CheckSeverity.OFF)
      check("FloatingPointLiteralPrecision", CheckSeverity.OFF)
      check("MissingCasesInEnumSwitch", CheckSeverity.OFF)
      check("OperatorPrecedence", CheckSeverity.OFF)
      // Disabled checks
      check("MixedMutabilityReturnType", CheckSeverity.OFF)
      check("MissingSummary", CheckSeverity.OFF)
      check("InlineMeSuggester", CheckSeverity.OFF)
    }
  }
}
