#!/bin/bash
#
# Copyright (C) 2008 The Android Open Source Project
#
# Licensed 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.

# Stop if something fails.
set -e

DX_FLAGS=""

while true; do
  if [ "x$1" = "x--dx-option" ]; then
    shift
    option="$1"
    DX_FLAGS="${DX_FLAGS} $option"
    shift
  elif expr "x$1" : "x--" >/dev/null 2>&1; then
    echo "unknown $0 option: $1" 1>&2
    exit 1
  else
    break
  fi
done

if [ -e classes.dex ]; then
  zip $TEST_NAME.jar classes.dex
  exit 0
fi

if [ -d src-multidex ]; then
  # Jack does not support this configuration unless we specify how to partition the DEX file
  # with a .jpp file.
  USE_JACK="false"
fi

if [ ${USE_JACK} = "true" ]; then
  # Jack toolchain
  if [ -d src ]; then
    ${JACK} --output-jack src.jack src
    imported_jack_files="--import src.jack"
  fi

  if [ -d src2 ]; then
    ${JACK} --output-jack src2.jack src2
    imported_jack_files="--import src2.jack ${imported_jack_files}"
  fi

  # Compile jack files into a DEX file. We set jack.import.type.policy=keep-first to consider
  # class definitions from src2 first.
  ${JACK} ${imported_jack_files} -D jack.import.type.policy=keep-first --output-dex .
else
  # Legacy toolchain with javac+dx
  if [ -d src ]; then
    mkdir classes
    ${JAVAC} -implicit:none -classpath src-multidex -d classes `find src -name '*.java'`
  fi

  if [ -d src-multidex ]; then
    mkdir classes2
    ${JAVAC} -implicit:none -classpath src -d classes2 `find src-multidex -name '*.java'`
    if [ ${NEED_DEX} = "true" ]; then
      ${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex \
        --dump-width=1000 ${DX_FLAGS} classes2
    fi
  fi

  if [ -d src2 ]; then
    mkdir -p classes
    ${JAVAC} -d classes `find src2 -name '*.java'`
  fi

  if [ ${NEED_DEX} = "true" ]; then
    ${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
      --dump-width=1000 ${DX_FLAGS} classes
  fi
fi

if [ -d smali ]; then
  # Compile Smali classes
  ${SMALI} -JXmx256m --output smali_classes.dex `find smali -name '*.smali'`
  ${DXMERGER} classes.dex classes.dex smali_classes.dex
fi

if [ -d src-ex ]; then
  if [ ${USE_JACK} = "true" ]; then
      # Rename previous "classes.dex" so it is not overwritten.
      mv classes.dex classes-1.dex
      #TODO find another way to append src.jack to the jack classpath
      ${JACK}:src.jack --output-dex . src-ex
      zip $TEST_NAME-ex.jar classes.dex
      # Restore previous "classes.dex" so it can be zipped.
      mv classes-1.dex classes.dex
  else
    mkdir classes-ex
    ${JAVAC} -d classes-ex -cp classes `find src-ex -name '*.java'`
    if [ ${NEED_DEX} = "true" ]; then
      ${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes-ex.dex \
        --dump-width=1000 ${DX_FLAGS} classes-ex

      # quick shuffle so that the stored name is "classes.dex"
      mv classes.dex classes-1.dex
      mv classes-ex.dex classes.dex
      zip $TEST_NAME-ex.jar classes.dex
      mv classes.dex classes-ex.dex
      mv classes-1.dex classes.dex
    fi
  fi
fi

# Create a single jar with two dex files for multidex.
if [ -d src-multidex ]; then
  zip $TEST_NAME.jar classes.dex classes2.dex
elif [ ${NEED_DEX} = "true" ]; then
  zip $TEST_NAME.jar classes.dex
fi
