<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements. See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership. The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License. You may obtain a copy of the License at
 http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied. See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
<project name="edgent.platform.android" default="all"
  xmlns:jacoco="antlib:org.jacoco.ant"
  >
    <description>
        Create the Android set of jars.
        Copies the Java 7 jars excluding any ones not supported on Android.
    </description>

  <property name="edgent" location="../.."/>
  <property name="edgent8.target" location="${edgent}/target/java8"/>
  <property name="edgent7.target" location="${edgent}/target/java7"/>
  <property name="edgent.android.target" location="${edgent}/target/android"/>

  <target name="init">
    <mkdir dir="${edgent.android.target}"/>
  </target>

  <target name="all" depends="copyFrom7"
    description="Create the Android jars"
    />

  <target name="copyFrom7" depends="init">
    <copy todir="${edgent.android.target}">
       <fileset dir="${edgent7.target}"
           excludes="scripts/** lib/edgent.runtime.jmxcontrol.jar lib/edgent.providers.development.jar console/**"
       />

    </copy>
    <!-- Delete the Android jars from Java 8 and 7 -->
    <!-- They get built there and are processed through the retrolambda -->
    <delete dir="${edgent8.target}/android"/>
    <delete dir="${edgent7.target}/android"/>
  </target>

  <target name="clean">
    <delete dir="${edgent.android.target}"/>
  </target>

</project>
