#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Invokes //gradle for building the Android apps from GN/Ninja.
"""

import os
import sys
import subprocess
import platform

SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))

BAT = '.bat' if sys.platform.startswith(('cygwin', 'win')) else ''
GRADLE_BIN = os.path.normpath(os.path.join(SCRIPT_PATH, '..', '..', '..',
    'gradle', 'bin', 'gradle%s' % BAT))

ANDROID_HOME = os.path.normpath(os.path.join(SCRIPT_PATH, '..', '..', '..',
    'third_party', 'android_tools', 'sdk'))

if platform.system() == 'Darwin':
  JAVA_HOME = os.path.normpath(os.path.join(SCRIPT_PATH, '..', '..', '..',
      'third_party', 'java', 'openjdk', 'Contents', 'Home'))
else:
  JAVA_HOME = os.path.normpath(os.path.join(SCRIPT_PATH, '..', '..', '..',
      'third_party', 'java', 'openjdk'))

def main():
  if not os.path.isdir(ANDROID_HOME):
    raise Exception('%s (ANDROID_HOME) is not a directory' % ANDROID_HOME)

  android_dir = sys.argv[1]
  subprocess.check_output(
    args=[GRADLE_BIN] + sys.argv[2:],
    cwd=android_dir,
    env=dict(os.environ, ANDROID_HOME=ANDROID_HOME, JAVA_HOME=JAVA_HOME),
  )
  return 0


if __name__ == '__main__':
  sys.exit(main())
