/*
 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * Gets the most recent android platform installed, relative to the given path.
 * The path will either be ANDROID_SDK or ANDROID_NDK
 * TODO Shouldn't we instead just ask people to point to the one they want to use?
 *
 * @param path The path to the Android SDK or NDK
 * @return The name of the most recent platform
 */
String getLatestPlatform(String path) {
    def max = 0
    file(cygpath("$path/platforms")).eachFile() {file->
        def pname = file.getName() - "android-"
        def ptf = pname?.isInteger() ? pname.toInteger() : 0
        if (max < ptf) {
            max = ptf
        }
    }
    if (max == 0) {
        return null;
    }
    return "android-" + max
}

int compareVersions(String s1, String s2) {
    def v1t = s1.tokenize(".")
    def v2t = s2.tokenize(".")
    for(int i = 0; i < v1t.size(); i++) {
        if (i == v2t.size()) {
            return 1
        }
        int n1 = v1t[i].isInteger() ? v1t[i].toInteger() : 0
        int n2 = v2t[i].isInteger() ? v2t[i].toInteger() : 0
        if (n1 == n2) {
            continue
        } else if (n1 > n2) {
            return 1;
        } else {
            return -1
        }
    }
    return (v2t.size() > v1t.size()) ? -1 : 0
}

String getLatestToolchain(String ndk, String tch) {
    def max = "0.0"
    def matchFile = null
    file(cygpath("$ndk/toolchains")).eachFile() {file->
        def filename = file.getName()
        if (filename.startsWith(tch)) {
            def p = filename - "$tch-"
            if (compareVersions(p, max) > 0) {
                max = p
                matchFile = file
            }
        }
    }
    return matchFile.getAbsolutePath()
}

boolean assertDir(File dir) {
    return dir != null && dir.exists() && dir.isDirectory() && dir.canRead();
}

boolean assertDir(String dir) {
    return assertDir(file(dir))
}

def closedDir = file("$projectDir/../rt-closed")

def toolchainArchs = ["arm-linux-androideabi", "mipsel-linux-android", "x86"]
def armArchs = ["armeabi", "armeabiv-7a"]

ANDROID = [:]
ANDROID.compileSwing = false;
ANDROID.compileSWT = false;
ANDROID.compileFXPackager = false;
ANDROID.glassPlatform = "android"
ANDROID.armArch = armArchs[0]
ANDROID.libDest = "lib/${ANDROID.armArch}"
ANDROID.jfxdvklib = "jfxdvk.jar"
ANDROID.library = { name -> return "lib${name}.so" as String }

def sdk = project.hasProperty("ANDROID_SDK") ? "${ANDROID_SDK}" : null;
def ndk = project.hasProperty("ANDROID_NDK") ? "${ANDROID_NDK}" : null;
ANDROID.canBuild = sdk != null && ndk != null
if (!ANDROID.canBuild) {
    fail("Can't build Android. Path to SDK or NDK was not set or is invalid!")
}

ANDROID.canBuild = assertDir(sdk) && assertDir(ndk)
if (!ANDROID.canBuild) {
    if (!assertDir(sdk)) {
        logger.error("Path to ANDROID_SDK is invalid! [$sdk]")
    }
    if (!assertDir(ndk)) {
        logger.error("Path to ANDROID_NDK is invalid! [$ndk]")
    }
    fail("Cannot build, missing android tools")
}

def sdk_target = project.hasProperty("ANDROID_SDK_TARGET") ?  "${ANDROID_SDK_TARGET}" : getLatestPlatform(sdk);
if (!assertDir(file("$sdk/platforms/$sdk_target"))) {
    sdk_target = getLatestPlatform(sdk);
    logger.warn("Redefine ANDROID_SDK_TARGET to: [$sdk_target]")
}

def ndk_target = project.hasProperty("ANDROID_NDK_TARGET") ? "${ANDROID_NDK_TARGET}" : getLatestPlatform(ndk);
if (!assertDir(file("$ndk/platforms/$ndk_target"))) {
    ndk_target = getLatestPlatform(ndk);
    logger.warn("Redefine ANDROID_NDK_TARGET to: [$ndk_target]")
}

ANDROID.canBuild = sdk_target != null && ndk_target != null
if (!ANDROID.canBuild) {
    fail("Can't determine sdk or ndk target platform!")
}

def toolchainHome = project.hasProperty("ANDROID_CROSS_TOOLS_VER") ?
    "$ndk/toolchains/${ANDROID_CROSS_TOOLS_VER}" : getLatestToolchain(ndk, toolchainArchs[0])
if (!assertDir(toolchainHome)) {
    toolchainHome = getLatestToolchain(ndk, toolchainArchs[0])
    logger.warn("Redefine toolchain to [$toolchainHome]")
}

// Look for the the Android SDK & NDK to use, as well as the compiler stuff
def compilerHome = null
file("$toolchainHome/prebuilt").eachDir() {subdir ->
    compilerHome = subdir.getAbsolutePath()
    return
}

ANDROID.canBuild = compilerHome != null
if (!ANDROID.canBuild) {
    fail("Failed to access toolchain [$toolchainHome/prebuilt/$toolsPlatform]!")
}

def freetypeDir = project.hasProperty("FREETYPE_DIR") ? "${FREETYPE_DIR}" : null
if (!assertDir(freetypeDir)) {
    logger.warn("FREETYPE_DIR $freetypeDir doesn't exists! Build continues without native text support.")
    freetypeDir = null
}
def compileNativeText = freetypeDir != null

def compiler = file("$compilerHome/bin/${toolchainArchs[0]}-gcc").getAbsolutePath()
def linker = file("$compilerHome/bin/${toolchainArchs[0]}-g++").getAbsolutePath()

// Log the settings we're building with
logger.quiet("ANDROID_SDK: $sdk")
logger.quiet("ANDROID_SDK_TARGET: $sdk_target")
logger.quiet("ANDROID_NDK: $ndk")
logger.quiet("ANDROID_NDK_TARGET: $ndk_target")
logger.quiet("FREETYPE_DIR: $freetypeDir")
logger.quiet("Compile native text: $compileNativeText")
logger.quiet("Android Compiler: $compiler")
logger.quiet("Android Linker: $linker")

project(":graphics") {

    task compileDalvikLibs(type: JavaCompile, group: "Build") {
        description = "Task compiles dalvik vm based libraries."
        sourceCompatibility = JavaVersion.VERSION_1_6
        targetCompatibility = JavaVersion.VERSION_1_6
        options.bootClasspath = "$sdk/platforms/$sdk_target/android.jar"
        classpath = files("build/classes/android")
        destinationDir = file("build/classes/android")
        dependencyCacheDir = file("build/dependency-cache")
        source fileTree(dir: 'src/android/java').matching { include 'com/oracle/dalvik/**' }
    }

    task jarDalvikLibs(type: Jar, group: "Build", dependsOn: compileDalvikLibs) {
        description = "Creates jfxdvk.jar with all dalvik based classes."
        archiveName = "jfxdvk.jar"
        includeEmptyDirs = false
        from("build/classes/android")
        include("com/oracle/dalvik/**/*")
        dependsOn(compileDalvikLibs)
    }

    afterEvaluate {
        addNative(project, "surface", ["android"])
        addNative(project, "vmlauncher", ["android"])
        if (compileNativeText) {
            addNative(project, "fontNativeFreetype", ["android"])
        }
        tasks["javahAndroidVmlauncher"].dependsOn(compileDalvikLibs)
        tasks["native"].dependsOn("nativeSurface", "nativeVmlauncher")
        if (compileNativeText) {
            tasks["native"].dependsOn("nativeFontNativeFreetype")
        }

        sdkAndroid  {
            dependsOn(jarDalvikLibs)
            doLast {
                def props = project.ext["ANDROID"]
                copy {
                    from(
                         "modules/graphics/build/libs/vmlauncher/android/${props.library(props.vmlauncher.lib)}",
                         "modules/graphics/build/libs/surface/android/${props.library(props.surface.lib)}"
                    )
                    into ("build/android-sdk/dalvik/${props.libDest}")
                }
                copy {
                    from ("modules/graphics/build/libs/${props.jfxdvklib}")
                    into ("build/android-sdk/dalvik/lib")
                }
                if (compileNativeText) {
                    copy {
                        from ("modules/graphics/build/libs/fontNativeFreetype/android")
                        into ("build/android-sdk/rt/$ANDROID.libDest")
                    }
                }
            }
        }
    }
}

project(":controls") {
    afterEvaluate {
        task compileControlsJavaAndroid(type: JavaCompile, group: "Build", dependsOn: [":graphics:compileJava", ":controls:compileJava"]) {
            description = "Task compiles controls for Android"
            classpath = files("modules/base/build/classes/main",
                "modules/graphics/build/classes/main",
                "modules/controls/build/classes/main"
            )
            destinationDir = file("modules/controls/build/classes/android")
            dependencyCacheDir = file("modules/controls/build/dependency-cache")
            source file("modules/controls/src/android/java")
        }

       task processControlsResourcesAndroid() {
           copy {
               from ("modules/controls/src/android/resources")
               into ("modules/controls/build/resources/android")
           }
        }

        sdkAndroid {
            dependsOn(compileControlsJavaAndroid, processControlsResourcesAndroid)
        }
    }
}

project(":web") {
    apply plugin: 'java'

    compileJava {
        enabled = false
    }

    afterEvaluate {
        if (!BUILD_CLOSED) {
            logger.warn("OpenJFX build. Skipping webkit build on Android.")
            return
        }
        def compileWebJavaAndroid = task("compileWebJavaAndroid",
            type: JavaCompile, group: "Build") {

            dependsOn(project(":graphics").classes, project(":base").classes)
            description = "Task compiles web component for Android."
            classpath = files(
                project(":controls").sourceSets.main.output.classesDir,
                project(":graphics").sourceSets.main.output.classesDir,
                project(":base").sourceSets.main.output.classesDir
            )
            destinationDir = file("modules/web/build/classes/android")
            dependencyCacheDir = file("modules/web/build/dependency-cache")
            source file("modules/web/src/android/java")
        }

        def jarWebJavaAndroid = task("jarWebJavaAndroid",
            type: Jar, group: "Build") {
            description = "Creates web.jar for Android."
            dependsOn(compileWebJavaAndroid)
            archiveName = "web.jar"
            includeEmptyDirs = false
            destinationDir = project.file("build/libs/android")
            from("build/classes/android")
        }

        addNative(project, "webview", ["android"])
        addNative(project, "dvkwebview", ["android"])
        javahAndroidWebview.dependsOn(compileWebJavaAndroid)
        javahAndroidDvkwebview.dependsOn(compileWebJavaAndroid)

        jfxrtAndroid {
            from "modules/web/build/classes/android"
        }

        sdkAndroid  {
            dependsOn(jarWebJavaAndroid)
            doLast {
                def props = project.ext["ANDROID"]
                copy {
                    from(
                         "modules/web/build/libs/dvkwebview/android/${props.library(props.dvkwebview.lib)}"
                    )
                    into ("build/android-sdk/dalvik/${props.libDest}")
                }
                copy {
                    from ("modules/web/build/libs/webview/android/${props.library(props.webview.lib)}")
                    into ("build/android-sdk/rt/${props.libDest}")
                }
            }
        }
    }
}


ANDROID.jfxrtJarExcludes = [
    "**/*.hlsl",
    "com/sun/glass/ui/win",
    "com/sun/prism/d3d",
    "com/sun/prism/es2/gl/win",
    "com/sun/prism/null3d",
    "com/sun/scenario/effect/impl/hw/d3d",
    "com/sun/glass/events/mac",
    "com/sun/glass/ui/mac",
    "com/sun/prism/es2/gl/mac",
    "com/sun/glass/ui/gtk",
    "com/sun/glass/ui/ios",
    "com/sun/prism/es2/gl/eglx11",
    "com/sun/prism/es2/gl/x11",
    "com/sun/glass/ui/swt", // SWT glass
    "javafx/embed/swing", // Swing Interop
    "javafx/embed/swt", // SWT Interop
    "com/oracle/dalvik"
]

def text = (compileNativeText) ? "native" : "t2k"

ANDROID.javafxPlatformProperties = """
javafx.platform=android
android.glass.platform=Lens
android.glass.lens=eglfb
android.prism.glDepthSize=16
android.prism.lcdtext=false
android.prism.debugfonts=true
android.prism.text=$text
android.embedded=eglfb
android.prism.allowhidpi=false
android.prism.maxTextureSize=2048
android.prism.dirtyopts=true
android.prism.vsync=false
android.log.lens=FINE
android.use.egl=true
android.com.sun.javafx.isEmbedded=true
"""
def sysroot = "$ndk/platforms/$ndk_target/arch-arm"

def ccFlags = ["--sysroot=$sysroot","-std=c99", "-DANDROID", "-c", "-nostdlib",
               "-DANDROID_NDK"]

if (project.hasProperty("DALVIK_VM")) {
    ccFlags += ["-DDALVIK_VM"]
}

def ccOptFlags = ["-fpic", "-ffunction-sections", "-funwind-tables","-fstack-protector",
                  "-Os", "-O2", "-fno-strict-aliasing", "-finline-limit=64", "-fomit-frame-pointer"]
def ccWarnFlags = ["-Wa,--noexecstack", "-Wno-psabi"]
def ccArchFlags = ["-mthumb", "-msoft-float", "-D__ARM_ARCH_5__", "-D__ARM_ARCH_5T__", "-D__ARM_ARCH_5E__",
                   "-D__ARM_ARCH_5TE__", "-march=armv5te" , "-mtune=xscale"]
def ccDebugFlags = [IS_DEBUG_NATIVE ? "-DDEBUG" : "-DNDEBUG"]
def ccDefaultIncludeFlags = ["-I$ndk/platforms/$ndk_target/arch-arm/usr/include"]

def linkFlags = ["--sysroot=$sysroot",
                 "-Wl,--no-undefined", "-Wl,-z,noexecstack", "-lc", "-lm", "-shared",
                 "-L$ndk/platforms/$ndk_target/arch-arm/usr/lib"]


ANDROID.vmlauncher = [:]
ANDROID.vmlauncher.classpath = files("$sdk/platforms/$sdk_target/android.jar",
                                     "modules/graphics/build/classes/android")

ANDROID.vmlauncher.javahSource = files("modules/graphics/build/classes/android")
ANDROID.vmlauncher.javahClasspath = files("modules/graphics/build/classes/android",
                                          "$sdk/platforms/$sdk_target/android.jar")
ANDROID.vmlauncher.javahInclude = [
    "com/oracle/dalvik/*"
]
ANDROID.vmlauncher.nativeSource = [
    file("modules/graphics/src/android/native/VMLauncher.c"),
    file("modules/graphics/src/android/native/NativePipeReader.c"),
    file("modules/graphics/src/android/native/DalvikProxySelector.c")
]
ANDROID.vmlauncher.compiler = compiler
ANDROID.vmlauncher.linker = linker
ANDROID.vmlauncher.lib = "vmlauncher"
ANDROID.vmlauncher.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.vmlauncher.linkFlags = [linkFlags, "-llog"].flatten()

ANDROID.surface = [:]
ANDROID.surface.javahInclude = [
    "com/sun/glass/events/*",
    "com/sun/glass/ui/android/*"
]
ANDROID.surface.nativeSource = [
    file("modules/graphics/src/main/native-glass/lens/android")
]
ANDROID.surface.compiler = compiler
ANDROID.surface.linker = linker
ANDROID.surface.lib = "glass_lens_android"
ANDROID.surface.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags, "-Isrc/main/native-glass/lens"].flatten()
ANDROID.surface.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()

ANDROID.webview = [:]
ANDROID.webview.javahSource = files("modules/web/build/classes/android")
ANDROID.webview.javahClasspath = files("modules/web/build/classes/android")
ANDROID.webview.javahInclude = [
    "com/sun/webkit/NativeWebView.class"
]
ANDROID.webview.nativeSource = [
    file("modules/web/src/android/native/native_webview.c")
]
ANDROID.webview.compiler = compiler
ANDROID.webview.linker = linker
ANDROID.webview.lib = "webview"
ANDROID.webview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.webview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()

ANDROID.dvkwebview = [:]
ANDROID.dvkwebview.javahSource = files("modules/web/build/classes/android")
ANDROID.dvkwebview.javahClasspath = files("modules/web/build/classes/android")
ANDROID.dvkwebview.javahInclude = [
    "com/sun/webkit/NativeWebView.class"
]
ANDROID.dvkwebview.nativeSource = [
    file("modules/web/src/android/native/android_webview.c")
]
ANDROID.dvkwebview.compiler = compiler
ANDROID.dvkwebview.linker = linker
ANDROID.dvkwebview.lib = "android_webview"
ANDROID.dvkwebview.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.dvkwebview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()

ANDROID.glass = [:]
ANDROID.glass.variants = ["eglfb", "lensport"]
ANDROID.glass.javahInclude = [
    "com/sun/glass/events/**",
    "com/sun/glass/ui/*",
    "com/sun/glass/ui/android/*",
    "com/sun/glass/ui/lens/*"]

ANDROID.glass.lensport = [:]
ANDROID.glass.lensport.nativeSource = [
    file("modules/graphics/src/main/native-glass/lens/lensport"),
    file("modules/graphics/src/main/native-glass/lens/lensport/initPlatform.c"),
    file("modules/graphics/src/main/native-glass/lens/lensport/wrapped_functions.c")
]
ANDROID.glass.lensport.compiler = compiler
ANDROID.glass.lensport.linker = linker
ANDROID.glass.lensport.lib = "lens_porting"
ANDROID.glass.lensport.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags, "-DISEGLFB", "-DLENSPORT",
    "-I", file("modules/graphics/src/main/native-glass/lens")].flatten()
ANDROID.glass.lensport.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()

ANDROID.glass.eglfb = [:]
ANDROID.glass.eglfb.nativeSource = [
    file("modules/graphics/src/main/native-glass/lens"),
    file("modules/graphics/src/main/native-glass/lens/wm"),
    file("modules/graphics/src/main/native-glass/lens/cursor/nullCursor"),
    file("modules/graphics/src/main/native-glass/lens/input/android"),
    file("modules/graphics/src/main/native-glass/lens/wm/screen/androidScreen.c")
]
ANDROID.glass.eglfb.compiler = compiler
ANDROID.glass.eglfb.linker = linker
ANDROID.glass.eglfb.lib = "glass_lens_eglfb"
ANDROID.glass.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.glass.eglfb.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()

ANDROID.prism = [:]
ANDROID.prism.javahInclude = ["com/sun/prism/impl/**/*", "com/sun/prism/PresentableState*"]
ANDROID.prism.nativeSource = file("modules/graphics/src/main/native-prism")
ANDROID.prism.compiler = compiler
ANDROID.prism.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.prism.linker = linker
ANDROID.prism.linkFlags = [linkFlags].flatten()
ANDROID.prism.lib = "prism_common"

ANDROID.prismSW = [:]
ANDROID.prismSW.javahInclude = ["com/sun/pisces/**/*"]
ANDROID.prismSW.nativeSource = file("modules/graphics/src/main/native-prism-sw")
ANDROID.prismSW.compiler = compiler
ANDROID.prismSW.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.prismSW.linker = linker
ANDROID.prismSW.linkFlags = [linkFlags].flatten()
ANDROID.prismSW.lib = "prism_sw"

ANDROID.decora = [:]
ANDROID.decora.compiler = compiler
ANDROID.decora.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.decora.linker = linker
ANDROID.decora.linkFlags = [linkFlags].flatten()
ANDROID.decora.lib = "decora_sse"

ANDROID.iio = [:]
ANDROID.iio.javahInclude = ["com/sun/javafx/iio/**/*"]
ANDROID.iio.nativeSource = [
    file("modules/graphics/src/main/native-iio"),
    file("modules/graphics/src/main/native-iio/libjpeg7")]
ANDROID.iio.compiler = compiler
ANDROID.iio.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.iio.linker = linker
ANDROID.iio.linkFlags = [linkFlags].flatten()
ANDROID.iio.lib = "javafx_iio"

ANDROID.prismES2 = [:]
ANDROID.prismES2.variants = ["eglfb"]
ANDROID.prismES2.javahInclude = ["com/sun/prism/es2/**/*"]

ANDROID.prismES2.eglfb = [:]
ANDROID.prismES2.eglfb.nativeSource = [
    file("modules/graphics/src/main/native-prism-es2"),
    file("modules/graphics/src/main/native-prism-es2/GL"),
    file("modules/graphics/src/main/native-prism-es2/eglfb")]
ANDROID.prismES2.eglfb.compiler = compiler
ANDROID.prismES2.eglfb.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags, "-DIS_EGLFB"].flatten()
ANDROID.prismES2.eglfb.linker = linker
ANDROID.prismES2.eglfb.linkFlags = [linkFlags, "-ldl", "-llog", "-lGLESv2", "-lEGL"].flatten()
ANDROID.prismES2.eglfb.lib = "prism_es2_eglfb"

ANDROID.font = [:]
ANDROID.font.javahInclude = [
        "com/sun/javafx/font/**/*",
        "com/sun/javafx/text/**/*"]
ANDROID.font.nativeSource = [file("$closedDir/javafx-font-native/src")]
ANDROID.font.compiler = compiler
ANDROID.font.ccFlags = [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
    ccDebugFlags, ccDefaultIncludeFlags].flatten()
ANDROID.font.linker = linker
ANDROID.font.linkFlags = [linkFlags].flatten()
ANDROID.font.lib = "javafx_font"

if (BUILD_CLOSED) {
    ANDROID.fontT2K = [:]
    ANDROID.fontT2K.javahInclude = ["com/sun/javafx/font/t2k/**/*"]
    ANDROID.fontT2K.nativeSource = [
        file("$closedDir/javafx-font-t2k-native/src"),
        file("$closedDir/javafx-font-t2k-native/src/layout")]
    ANDROID.fontT2K.compiler = compiler
    ANDROID.fontT2K.ccFlags = [ccFlags, "-DLE_STANDALONE", "-fno-exceptions", "-fno-rtti", ccWarnFlags,
        ccArchFlags, ccOptFlags, ccDebugFlags, ccDefaultIncludeFlags].flatten()
    ANDROID.fontT2K.linker = linker
    ANDROID.fontT2K.linkFlags = [linkFlags, "-lstdc++"].flatten()
    ANDROID.fontT2K.lib = "javafx_font_t2k"
}

if (compileNativeText) {
    ANDROID.fontNativeFreetype = [:]
    ANDROID.fontNativeFreetype.javahInclude = [
        "com/sun/javafx/font/freetype/OSFreetype.class"
    ]
    ANDROID.fontNativeFreetype.nativeSource = [
        file("modules/graphics/src/main/native-font/freetype.c")
    ]
    ANDROID.fontNativeFreetype.compiler = compiler
    ANDROID.fontNativeFreetype.linker = linker
    ANDROID.fontNativeFreetype.lib = "javafx_font_freetype"

    ccFlags += ["-D_ENABLE_HARFBUZZ"]

    ANDROID.fontNativeFreetype.ccFlags =
        [ccFlags, ccWarnFlags, ccArchFlags, ccOptFlags,
        ccDebugFlags, ccDefaultIncludeFlags,
        "-I$freetypeDir/include", "-I$freetypeDir/include/freetype2"].flatten()

    ANDROID.fontNativeFreetype.linkFlags =
        [linkFlags, "-llog",
         "-L$freetypeDir/lib", "$freetypeDir/lib/libfreetype.a"].flatten()
}

ANDROID.media = [:]
ANDROID.media.compiler = compiler
ANDROID.media.linker = linker
ANDROID.media.lib = file("$compilerHome/bin/${toolchainArchs[0]}-ar").getAbsolutePath()
