<?xml version="1.0" encoding="UTF-8"?>
<project name="jogamp-androidtasks" basedir=".">
    <dirname property="jogamp-androidtasks.basedir" file="${ant.file.jogamp-androidtasks}"/>
    <taskdef resource="net/sf/antcontrib/antlib.xml">
      <classpath> 
        <pathelement location="${jogamp-androidtasks.basedir}/lib/ant-contrib-1.0b3.jar"/> 
      </classpath>
    </taskdef>

    <!---
        <aapt.signed 
            jarbuilddir="${build}"   // jar build location
            jarbasename="gluegen-rt" // jar base file name
            nativebuilddir="${gluegen.lib.dir}" // native library build location
            nativebasename="gluegen-rt"         // native library base file name "*${nativebasename}*.${native.library.suffix}"
            androidmanifest.path="resources/android/AndroidManifest.xml"
            androidresources.path="resources/android/res"
            jarmanifest.path="${build}/Manifest-rt.temp" // optional
            version.code="${jogamp_int_version}"
            version.name="${gluegen.version.plus}" 

            // optional values, for having a valid keystore:
            keystore.file="./my-kstore.jks"  // user supplied keystore
            keystore.alias="mykey01"         // key alias
            keystore.storepass="spwd"        // store pwd
            keystore.keypass="kpwd"          // key pwd
        />

        Even though we have impl. signing w/ an own keystore,
        we strongly discourage users to actually use it in an automated environment!
        Pls sign your apps manually. 
      -->

    <macrodef name="aapt.signed">
      <attribute name="assetsdir" default="/non.existing.src.path"/>
      <attribute name="jarsrcdir" default="/non.existing.src.path"/>
      <attribute name="jarbuilddir" />
      <attribute name="jarbasename" />
      <attribute name="nativebuilddir" />
      <attribute name="nativebasename" />
      <attribute name="androidmanifest.path" />
      <attribute name="androidresources.path" />
      <attribute name="jarmanifest.path" default="/non.existing.manifest.file"/>
      <!-- attribute name="jarclasspathrefid" default="/non.existing.jarclasspathrefid"/-->
      <attribute name="version.code" />
      <attribute name="version.name" />
      <attribute name="android.abi" default="generic" />
      <attribute name="keystore.file" default="${android.keystore.file}" />
      <attribute name="keystore.alias" default="${android.keystore.alias}" />
      <attribute name="keystore.storepass" default="${android.keystore.storepass}" />
      <attribute name="keystore.keypass" default="${android.keystore.keypass}" />

      <sequential>
        <var name="m.aapt.android.abi.extstr" unset="true"/>
        <var name="m.aapt.build.apk" unset="true"/>
        <var name="m.aapt.dex.file" unset="true"/>
        <var name="m.aapt.unsigned.package.file.name" unset="true"/>
        <var name="m.aapt.signed.file.name" unset="true"/>
        <var name="m.aapt.release.file.name" unset="true"/>
        <var name="m.aapt.keystore.file" unset="true"/>

        <var name="m.aapt.java.encoding" unset="true"/>

        <condition property="m.aapt.android.abi.extstr" value="-@{android.abi}" else="">
            <not>
                <equals arg1="@{android.abi}" arg2="generic" casesensitive="true" />
            </not>
        </condition>

        <property name="m.aapt.build.apk" value="@{jarbuilddir}/@{jarbasename}${m.aapt.android.abi.extstr}.apk.d" />
        <property name="m.aapt.dex.file" location="${m.aapt.build.apk}/image/classes.dex" />
        <property name="m.aapt.unsigned.package.file.name" value="@{jarbuilddir}/@{jarbasename}${m.aapt.android.abi.extstr}-unsigned.apk" />
        <property name="m.aapt.signed.file.name" value="${m.aapt.build.apk}/@{jarbasename}${m.aapt.android.abi.extstr}-signed-raw.apk" />
        <property name="m.aapt.release.file.name" value="@{jarbuilddir}/@{jarbasename}${m.aapt.android.abi.extstr}.apk" />

        <property name="m.aapt.java.encoding" value="UTF-8" />

        <condition property="m.aapt.keystore.file" value="@{keystore.file}" else="${m.aapt.build.apk}/debug.keystore">
            <available file="@{keystore.file}"/>
        </condition>

        <delete file="${m.aapt.release.file.name}" includeEmptyDirs="true" quiet="true" failonerror="false" />
        <delete dir="${m.aapt.build.apk}" includeEmptyDirs="true" quiet="true" failonerror="false" />

        <mkdir dir="${m.aapt.build.apk}/temp/src" />
        <mkdir dir="${m.aapt.build.apk}/temp/classes" />
        <mkdir dir="${m.aapt.build.apk}/image/assets" />
        <mkdir dir="${m.aapt.build.apk}/image/lib/@{android.abi}" />
        <copy todir="${m.aapt.build.apk}/image/lib/@{android.abi}">
            <fileset dir="@{nativebuilddir}">
                <include name="*@{nativebasename}*.${native.library.suffix}" />
            </fileset>
        </copy>

        <copy todir="${m.aapt.build.apk}/image/assets" failonerror="false" includeEmptyDirs="false">
            <fileset dir="@{jarsrcdir}"
                     includes="**"
                     excludes="**/*.java **/*.class **/*.h **/*.c **/*.m **/*.sh"/>
        </copy>
        <copy todir="${m.aapt.build.apk}/image/assets" failonerror="false" includeEmptyDirs="false">
            <fileset dir="@{assetsdir}"
                     includes="**"/>
        </copy>

        <copy file="@{androidmanifest.path}" tofile="${m.aapt.build.apk}/image/AndroidManifest.xml"/>
        <copy file="@{jarmanifest.path}" failonerror="false" tofile="${m.aapt.build.apk}/image/META-INF/MANIFEST.MF"/>

        <echo>aapt.signed @{jarbasename}: generating Android R.java from the resources...</echo>
        <exec dir="." executable="aapt" logError="true" failonerror="true" failifexecutionfails="true">
            <arg line="package"/>
            <!-- arg line="-v"/ -->
            <!-- arg line=" - - debug-mode"/ -->
            <arg line="-f"/>
            <arg line="-S"/>
            <arg line="@{androidresources.path}"/>
            <arg line="-M"/>
            <arg line="${m.aapt.build.apk}/image/AndroidManifest.xml"/>
            <arg line="-I"/>
            <arg line="${android.jar}"/>
            <arg line="-J"/>
            <arg line="${m.aapt.build.apk}/temp/src"/>
        </exec>

        <echo>aapt.signed @{jarbasename}: compiling R.java...</echo>
        <javac encoding="${m.aapt.java.encoding}"
            source="${target.sourcelevel}" 
            target="${target.targetlevel}" 
            bootclasspath="${target.rt.jar}"
            debug="false" extdirs=""
            destdir="${m.aapt.build.apk}/temp/classes"
            verbose="true">
            <src path="${m.aapt.build.apk}/temp/src" />
            <classpath>
                 <!-- path refid="@{jarclasspathrefid}"/-->
                 <pathelement location="@{jarbuilddir}/@{jarbasename}.jar" />
                 <pathelement path="${android.jar}"/>
            </classpath>
        </javac>

        <echo>aapt.signed @{jarbasename}: dex'ing</echo>
        <exec dir="." executable="dx" logError="true" failonerror="true" failifexecutionfails="true">
            <arg line="--dex"/>
            <arg line="--output=${m.aapt.dex.file}"/>
            <arg line="@{jarbuilddir}/@{jarbasename}.jar"/>
            <arg line="${m.aapt.build.apk}/temp/classes"/>
        </exec>
        
        <path id="android.antlibs">
            <pathelement path="${env.ANDROID_HOME}/tools/lib/anttasks.jar" />
            <pathelement path="${env.ANDROID_HOME}/tools/lib/sdklib.jar" />
            <pathelement path="${env.ANDROID_HOME}/tools/lib/androidprefs.jar" />
            <pathelement path="${env.ANDROID_HOME}/tools/lib/apkbuilder.jar" />
            <pathelement path="${env.ANDROID_HOME}/tools/lib/jarutils.jar" />
        </path>

        <echo>aapt.signed @{jarbasename}: packaging</echo>
        <exec dir="." executable="aapt" logError="true" failonerror="true" failifexecutionfails="true">
            <arg line="package"/>
            <!--arg line="-v"/-->
            <!-- arg line=" - - debug-mode"/ -->
            <arg line="-f"/>

            <arg line="-S" />
            <arg value="@{androidresources.path}"/>

            <!-- implicit image layout
            <arg line="-A" />
            <arg value="${m.aapt.build.apk}/image/assets"/> -->

            <arg line="-I" />
            <arg line="${android.jar}"/>

            <arg line="--version-code" />
            <arg value="@{version.code}"/>

            <arg line="--version-name" />
            <arg value="@{version.name}"/>

            <arg line="-F" />
            <arg value="${m.aapt.unsigned.package.file.name}"/>

            <arg line="${m.aapt.build.apk}/image/"/>
        </exec>
        
        <echo>aapt.signed @{jarbasename}: gen temp keystore @{keystore.alias} @ ${m.aapt.build.apk}/debug.keystore</echo>
        <exec dir="." executable="keytool" failonerror="true">
            <arg value="-genkey"/>

            <!-- Be Java6 keytool/jarsigner compatible, and hence Android compatible -->
            <arg value="-sigalg"/>
            <arg value="MD5withRSA"/>
            <arg value="-keyalg"/>
            <arg value="RSA"/>
            <arg value="-keysize"/>
            <arg value="1024"/>

            <arg value="-keystore" />
            <arg value="${m.aapt.build.apk}/debug.keystore" />

            <arg value="-alias" />
            <arg value="@{keystore.alias}" />

            <arg value="-dname" />
            <arg value='CN=JogAmp Debug,O=JogAmp,C=DE' />

            <arg value="-keypass" />
            <arg value="@{keystore.keypass}" />

            <arg value="-storepass" />
            <arg value="@{keystore.storepass}" />
        </exec>

        <!-- Be Java6 keytool/jarsigner compatible, and hence Android compatible -->
        <echo>aapt.signed @{jarbasename}: signing w/ key @{keystore.alias} @ ${m.aapt.keystore.file}</echo>
        <!-- signjar
              sigalg="MD5withRSA"
              digestalg="SHA1"
              jar="${m.aapt.unsigned.package.file.name}"
              signedjar="${m.aapt.signed.file.name}"
              keystore="${m.aapt.keystore.file}"
              alias="@{keystore.alias}"
              keypass="@{keystore.keypass}"
              storepass="@{keystore.storepass}"
              verbose="false" / -->

        <exec dir="." executable="jarsigner" failonerror="true">
            <!-- Be Java6 keytool/jarsigner compatible, and hence Android compatible -->
            <arg value="-sigalg"/>
            <arg value="MD5withRSA"/>
            <arg value="-digestalg"/>
            <arg value="SHA1"/>

            <arg value="-keystore" />
            <arg value="${m.aapt.keystore.file}" />

            <arg value="-keypass" />
            <arg value="@{keystore.keypass}" />

            <arg value="-storepass" />
            <arg value="@{keystore.storepass}" />

            <arg value="-signedjar" />
            <arg value="${m.aapt.signed.file.name}" />

            <arg value="${m.aapt.unsigned.package.file.name}" />
            <arg value="@{keystore.alias}" />
        </exec>

        <echo>aapt.signed @{jarbasename}: zip aligning</echo>
        <exec dir="." executable="${env.ANDROID_HOME}/build-tools/${env.ANDROID_BUILD_TOOLS_VERSION}/zipalign" failonerror="true">
            <arg line="-v" />
            <arg value="-f" />
            <arg value="4" />
            <arg path="${m.aapt.signed.file.name}" />
            <arg path="${m.aapt.release.file.name}" />
        </exec>

        <delete dir="${m.aapt.build.apk}" includeEmptyDirs="true" quiet="true" failonerror="false" />
    </sequential>
  </macrodef>  
</project>