# Sources and objects

export ANDROID_HOME=$(ANDROID_SDK)

ARCH = $(ANDROID_ABI)

SRC=sflphone-android
LIBSFLPHONEJNI_H=sflphone/daemon/src/sflphone.h
LIBSFLPHONEJNI=$(SRC)/obj/local/$(ARCH)/libsflphone.so

JAVA_SOURCES=$(shell find $(SRC)/src/org/sflphone/ -type f -name "*.java")

ifneq ($(V),)
ANT_OPTS += -v
VERBOSE =
GEN =
else
VERBOSE = @
GEN = @echo "Generating" $@;
endif

ifeq ($(RELEASE),1)
ANT_TARGET = release
SFLPHONE_APK=$(SRC)/bin/SFLphone-release-unsigned.apk
NDK_DEBUG=0
else
ANT_TARGET = debug
SFLPHONE_APK=$(SRC)/bin/SFLphone-debug.apk
NDK_DEBUG=1
endif

define build_apk
	@echo
	@echo "=== Building $(SFLPHONE_APK) for $(ARCH) ==="
	@echo
	date +"%Y-%m-%d" > $(SRC)/assets/builddate.txt
	echo `id -u -n`@`hostname` > $(SRC)/assets/builder.txt
	git rev-parse --short HEAD > $(SRC)/assets/revision.txt
	./gen-env.sh $(SRC)
	$(VERBOSE)cd $(SRC) && ant $(ANT_OPTS) $(ANT_TARGET)
endef

$(SFLPHONE_APK): $(LIBSFLPHONEJNI) $(JAVA_SOURCES)
	@echo
	@echo "=== Building $@ for $(ARCH) ==="
	@echo
	date +"%Y-%m-%d" > $(SRC)/assets/builddate.txt
	echo `id -u -n`@`hostname` > $(SRC)/assets/builder.txt
	git rev-parse --short HEAD > $(SRC)/assets/revision.txt
	$(VERBOSE)cd $(SRC) && ant $(ANT_OPTS) $(ANT_TARGET)

$(LIBSFLPHONEJNI): $(LIBSFLPHONEJNI_H)
	@if [ -z "$(SFLPHONE_BUILD_DIR)" ]; then echo "SFLPHONE_BUILD_DIR not defined" ; exit 1; fi
	@if [ -z "$(ANDROID_NDK)" ]; then echo "ANDROID_NDK not defined" ; exit 1; fi
	@echo
	@echo "=== Building libsflphonejni ==="
	@echo
	$(VERBOSE)if [ -z "$(SFLPHONE_SRC_DIR)" ] ; then SFLPHONE_SRC_DIR=./sflphone; fi ; \
	if [ -z "$(SFLPHONE_CONTRIB)" ] ; then SFLPHONE_CONTRIB="$$SFLPHONE_SRC_DIR/daemon/contrib/$(TARGET_TUPLE)"; fi ; \
	if [ `echo "$(SFLPHONE_BUILD_DIR)" | head -c 1` != "/" ] ; then \
        SFLPHONE_BUILD_DIR="../$(SFLPHONE_BUILD_DIR)"; \
	fi ; \
	[ `echo "$$SFLPHONE_CONTRIB" | head -c 1` != "/" ] && SFLPHONE_CONTRIB="../$$SFLPHONE_CONTRIB"; \
	[ `echo "$$SFLPHONE_SRC_DIR" | head -c 1` != "/" ] && SFLPHONE_SRC_DIR="../$$SFLPHONE_SRC_DIR"; \
	$(ANDROID_NDK)/ndk-build -C $(SRC) \
		SFLPHONE_SRC_DIR="$$SFLPHONE_SRC_DIR" \
		SFLPHONE_CONTRIB="$$SFLPHONE_CONTRIB" \
		SFLPHONE_BUILD_DIR="$$SFLPHONE_BUILD_DIR" \
		NDK_DEBUG=$(NDK_DEBUG) \
		TARGET_CFLAGS="$$SFLPHONE_EXTRA_CFLAGS"

apk:
	$(call build_apk)

apkclean:
	rm -f $(SFLPHONE_APK)

lightclean:
	cd $(SRC) && rm -rf libs/armeabi-v7a libs/x86 libs/mips obj bin $(SFLPHONE_APK)

clean: lightclean
	rm -rf $(SRC)/gen java-libs/*/gen java-libs/*/bin .sdk

jniclean: lightclean
	rm -f $(LIBSFLPHONEJNI)

distclean: clean jniclean

install: $(SFLPHONE_APK)
	@echo "=== Installing SFLphone on device ==="
	adb wait-for-device
	adb install -r $(SFLPHONE_APK)

uninstall:
	adb wait-for-device
	adb uninstall org.sflphone

run:
	@echo "=== Running SFLphone on device ==="
	adb wait-for-device
	adb shell am start -n org.sflphone/org.sflphone.client.HomeActivity

build-and-run: install run

apkclean-run: apkclean build-and-run
	adb logcat -c

distclean-run: distclean build-and-run
	adb logcat -c

vlc-sdk.7z: .sdk
	7z a $@ vlc-sdk/

.sdk:
	mkdir -p vlc-sdk/libs
	cd vlc-android; cp -r libs/* ../vlc-sdk/libs
	mkdir -p vlc-sdk/src/org/videolan
	cp -r vlc-android/src/org/videolan/libvlc vlc-sdk/src/org/videolan
	touch $@

.PHONY: lightclean clean jniclean distclean distclean-run apkclean apkclean-run install run build-and-run
