apply plugin: 'sdk-files'

/***
  DEPRECATED!  DEPRECATED!  DEPRECATED!  DEPRECATED!

  WARNING THIS FILE IS NO LONGER BEING USED AND WILL BE REMOVED IN THE NEAR FUTURE
  INSTEAD MODIFY:

  android/build/python/aemu/distribution.py

  OR BETTER:

  Modify the CMakeLists.txt such that the install(xxx) binplaces what you want
  to have end up in the release

  DEPRECATED!  DEPRECATED!  DEPRECATED!  DEPRECATED!
**/
import com.android.tools.internal.emulator.BuildEmulator

// Get SDK revision to define emulator revision
File fprops = new File(rootDir.getParentFile(), 'external/qemu/source.properties')
Properties props = new Properties()
props.load(fprops.newDataInputStream())

// Mac/Win emulator now has dependency on haxm 6.2.1
File fprops_mac = new File(rootDir.getParentFile(), 'external/qemu/mac.source.properties')
File fprops_win = new File(rootDir.getParentFile(), 'external/qemu/win.source.properties')

task buildDefaultEmulator(type: BuildEmulator) {
    revision = props."Pkg.Revision"
    build_number = System.getenv("BUILD_NUMBER")
    output = new File(project.buildDir, "default")
}

task buildEmulatorCodeCoverage(type: BuildEmulator) {
    debug = true
    revision = props."Pkg.Revision"
    build_number = System.getenv("BUILD_NUMBER")
    output = new File(project.buildDir, "coverage")
}


task buildWindowsEmulator(type: BuildEmulator) {
    revision = props."Pkg.Revision"
    build_number = System.getenv("BUILD_NUMBER")
    output = new File(project.buildDir, "windows")
    windows = true
}

// Package all data to construct a coverage report.
task packageCodeCoverage(type: Zip) {
    dependsOn buildEmulatorCodeCoverage
    outputs.upToDateWhen { false }
    archiveName = "code-coverage.zip"
    destinationDir = new File(project.buildDir, "coverage")
    from(buildEmulatorCodeCoverage.output) {
        include "**/*.csv"
    }
    from(buildEmulatorCodeCoverage.output) {
        include "**/*.gcda"
    }
    from(buildEmulatorCodeCoverage.output) {
        include "**/*.gcno"
    }
}


sdk {
    common(mac, linux) {
        item("$buildDefaultEmulator.output/distribution/emulator") {
            into ''
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/build/debug_info/") {
            into ''
            builtBy buildDefaultEmulator
            debug true
        }
        item("$project.rootDir/../external/qemu/android-info.txt") {
            into ''
        }
        // This will make it end up in the Debug configuration.
        item("$buildEmulatorCodeCoverage.output/code-coverage.zip") {
            debug true
            into ''
            builtBy  packageCodeCoverage
        }
    }

    linux {
        item(fprops) {
            notice null
        }
    }

    mac {
        item(fprops_mac) {
            name 'source.properties'
            notice null
        }
    }

    windows {
        item("$buildWindowsEmulator.output/distribution/emulator") {
            into ''
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/build/debug_info/") {
            into ''
            builtBy buildWindowsEmulator
            debug true
        }
        item("$project.rootDir/../external/qemu/android-info.txt") {
            into ''
        }
        item(fprops_win) {
            name 'source.properties'
            notice null
        }
        item("$project.rootDir/../external/qemu/android-info.txt") {
            into ''
        }
    }
}

import com.android.tools.internal.sdk.base.PlatformConfig
import com.android.tools.internal.sdk.base.ToolItem
import com.google.common.collect.Lists
for (PlatformConfig platform : sdk.getPlatforms()) {
    def itemlist = Lists.newArrayList()
    for (ToolItem toolitem: platform.getItems()) {
        if (toolitem.getDebug() || !toolitem.getExecutable()) {
            continue
        }
        def prop = toolitem.properties
        def itemPath = prop.itemPath
        if (itemPath instanceof String || itemPath instanceof GString) {
            def debugItemPath = itemPath
            def path = debugItemPath.split("/")
            def s = path[path.size()-1]
            if (!s.contains("emulator")) {
                continue
            }
           debugItemPath = debugItemPath.replaceFirst("$buildDefaultEmulator.output",
                                "$buildDefaultEmulator.output/build/debug_info")

            if (debugItemPath.equals(itemPath)) {
                continue
            }
            if (platform.getName().equals("mac")) {
                debugItemPath += ".dSYM"
                if (!prop.destinationPath) {
                    path = debugItemPath.split("/")
                    prop.destinationPath = path[path.size()-1]
                }

            }
            prop.debug=true;
            prop.remove('itemPath')
            prop.remove('class')
            def propcopy = {
                prop.each { k, v ->
                    delegate."$k"=v
                }
                return debugItemPath
            }
            def debugitem = new ToolItem(propcopy)
            propcopy.delegate = debugitem
            itemlist.add(debugitem)
        }

    }
    for (ToolItem debugitem: itemlist) {
        platform.getItems().add(debugitem)
    }
}
