import net.ltgt.gradle.errorprone.CheckSeverity

apply plugin: 'com.android.library'
apply plugin: 'net.ltgt.errorprone'
apply plugin: 'com.vanniktech.maven.publish'

android {
  compileSdkVersion 29
  resourcePrefix 'lottie_'

  defaultConfig {
    minSdkVersion 16
    targetSdkVersion 29
  }
  lintOptions {
    abortOnError true
    textReport true
    textOutput 'stdout'
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

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

  annotationProcessor "com.uber.nullaway:nullaway:0.7.5"
  errorprone "com.google.errorprone:error_prone_core:2.3.2"
  errorproneJavac "com.google.errorprone:javac:9+181-r4173-1"

  testImplementation "org.mockito:mockito-core:2.15.0"
  testImplementation 'junit:junit:4.12'
  testImplementation "org.robolectric:robolectric:4.3.1"
}

task sourcesJar(type: Jar) {
  from android.sourceSets.main.java.srcDirs
  classifier = '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
  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)
    }
  }
}

// Re-enable this if releases are uploaded from CI.
//gradle.taskGraph.whenReady { taskGraph ->
//  if (taskGraph.allTasks.any { it instanceof Sign }) {
//    allprojects { ext."signing.keyId" = System.getenv("GRADLE_SIGNING_KEY_ID") }
//    allprojects { ext."signing.secretKeyRingFile" = "~/.gnupg/secring.gpg" }
//    allprojects { ext."signing.password" = System.getenv("GRADLE_SIGNING_PASSWORD") }
//  }
//}
