// 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()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:3.5.0"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

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 31

  dependencies {
    embedding "androidx.annotation:annotation:1.1.0"
    embedding "androidx.core:core:1.6.0"
    embedding "androidx.fragment:fragment:1.1.0"
    embedding "androidx.tracing:tracing:1.0.0"
    embedding "androidx.window:window-java:1.0.0-beta04"

    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"
  }
}

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}\","
      }
  }
}
