/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
apply plugin: 'com.android.application'

/*
The arcore aar library contains the native shared libraries.  These are
extracted before building to a temporary directory.
 */
def arcore_libpath = "${buildDir}/arcore-native"

// Create a configuration to mark which aars to extract .so files from
configurations { natives }

android {
    sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call
    sourceSets.main.jniLibs.srcDir "src/main/libs"
    productFlavors { arm64 {} }

    setupSkiaLibraryBuild(project, applicationVariants, "libarcore")

    compileSdkVersion 27
    defaultConfig {
        applicationId "org.skia.viewer"
        // 24 is the minimum since ARCore only works with 24 and higher.
        minSdkVersion 24
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11", "-Wall"
                arguments "-DANDROID_STL=c++_static",
                        "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                        "-DARCORE_INCLUDE=${project.rootDir}/../../libraries/include",
                        "-DSKIA_INCLUDE_PATH=${project.rootDir}/../../../include"
            }
        }
        ndk {
            abiFilters "arm64-v8a"
        }
    }
    flavorDimensions "base"
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

}

dependencies {
    // ARCore library
    implementation 'com.google.ar:core:1.2.0'
    natives 'com.google.ar:core:1.2.0'

    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:design:27.0.2'
}

// Extracts the shared libraries from aars in the natives configuration.
// This is done so that NDK builds can access these libraries.
task extractNativeLibraries() {
    doFirst {
        configurations.natives.files.each { f ->
            copy {
                from zipTree(f)
                into arcore_libpath
                include "jni/**/*"
            }
        }
    }
}


tasks.whenTaskAdded {
    task-> if (task.name.contains("external") && !task.name.contains("Clean")) {
        task.dependsOn(extractNativeLibraries)

        //make sure skia lib is built and copied in the correct directory before building arcore
        tasks.whenTaskAdded {
            t-> if (t.name.contains("CopySkiaLib")) {
                task.dependsOn(t)
            }
        }
    }
}

