// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// To use, run:
//  $  gradle updateDependencies
//
// This script downloads the embedding dependencies into a lib/ directory,
// extract jar files from AARs, so they can be used in gn.
def destinationDir = "lib"

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:3.5.0"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

apply plugin: "com.android.application"

configurations {
  // Use this configuration for dependencies required by the embedding.
  embedding
  // Use any of these configurations for dependencies required for testing the embedding.
  embeddingTesting
  embeddingTesting_v16
}

android {
  compileSdkVersion 30

  dependencies {
    embedding "androidx.annotation:annotation:1.1.0"
    embedding "androidx.fragment:fragment:1.1.0"

    def lifecycle_version = "2.2.0"
    embedding "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
    embedding "androidx.lifecycle:lifecycle-common:$lifecycle_version"
    embedding "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    // This dependency is here to allow linking to Play core in tests, but
    // is not used in a default Flutter app. This dependency should be manually
    // added to the user's app gradle in order to opt into using split AOT
    // dynamic features.
    embedding "com.google.android.play:core:1.8.0"

    // Testing
    // TODO(xster): remove these android-all compile time dependencies.
    // Use https://github.com/robolectric/robolectric/blob/master/robolectric/src/main/java/org/robolectric/plugins/LegacyDependencyResolver.java#L24
    // and specify them as runtime dependencies.
    embeddingTesting "org.robolectric:android-all:9-robolectric-4913185-2"
    embeddingTesting_v16 "org.robolectric:android-all:4.1.2_r1-robolectric-r1"
    embeddingTesting "org.robolectric:robolectric:4.4"
    embeddingTesting "junit:junit:4.13"
    embeddingTesting "androidx.test:core:1.0.0"
    embeddingTesting "org.mockito:mockito-core:3.11.2"
  }
}

task updateDependencies() {
  delete destinationDir
  // Copy the dependencies from the compileOnly configuration into
  // the destination directory.
  copy {
    from configurations.embedding
    from configurations.embeddingTesting
    from configurations.embeddingTesting_v16
    into destinationDir
  }
  doLast {
    // Extract classes.jar from aar and rename it as the dependency name .jar
    // since javac doesn't support AARs.
    fileTree(destinationDir)
      .filter { it.name.endsWith(".aar") }
      .collect { aarDependency ->
        def dependencyName = "${aarDependency.name.take(aarDependency.name.lastIndexOf('.'))}";
        copy {
          into destinationDir
          from(zipTree(aarDependency)) {
            include "classes.jar"
          }
          rename "classes.jar", "${dependencyName}.jar"
        }
        delete aarDependency
      }
  }
  doLast {
    fileTree(destinationDir)
      .collect { dependency ->
        println "\"//third_party/robolectric/lib/${dependency.name}\","
      }
  }
}
