Upgrade Android build to Gradle build system
authorShadowNinja <shadowninja@minetest.net>
Wed, 13 Apr 2016 18:14:04 +0000 (14:14 -0400)
committerShadowNinja <shadowninja@minetest.net>
Thu, 28 Apr 2016 16:28:42 +0000 (12:28 -0400)
The old Ant build system has been deprecated for a while and new development is focused on Gradle.
I also removed a hardcoded string that lint caught and moved the patch files to a subdirectory.
I left the JNI files in the root directory.

45 files changed:
.gitignore
build/android/AndroidManifest.xml.template [deleted file]
build/android/Makefile
build/android/build.gradle [new file with mode: 0644]
build/android/build.xml [deleted file]
build/android/irrlicht-back_button.patch [deleted file]
build/android/irrlicht-texturehack.patch [deleted file]
build/android/irrlicht-touchcount.patch [deleted file]
build/android/jni/Android.mk
build/android/jni/Application.mk
build/android/libiconv_android.patch [deleted file]
build/android/libiconv_stdio.patch [deleted file]
build/android/libvorbis-libogg-fpu.patch [deleted file]
build/android/openssl_arch.patch [deleted file]
build/android/patches/irrlicht-back_button.patch [new file with mode: 0644]
build/android/patches/irrlicht-texturehack.patch [new file with mode: 0644]
build/android/patches/irrlicht-touchcount.patch [new file with mode: 0644]
build/android/patches/libiconv_android.patch [new file with mode: 0644]
build/android/patches/libiconv_stdio.patch [new file with mode: 0644]
build/android/patches/libvorbis-libogg-fpu.patch [new file with mode: 0644]
build/android/patches/openssl_arch.patch [new file with mode: 0644]
build/android/project.properties [deleted file]
build/android/res/drawable-hdpi/irr_icon.png [deleted file]
build/android/res/drawable-ldpi/irr_icon.png [deleted file]
build/android/res/drawable-mdpi/irr_icon.png [deleted file]
build/android/res/drawable-xhdpi/irr_icon.png [deleted file]
build/android/res/layout/assetcopy.xml [deleted file]
build/android/res/values/styles.xml [deleted file]
build/android/settings.gradle [new file with mode: 0644]
build/android/src/debug/AndroidManifest.xml [new file with mode: 0644]
build/android/src/main/AndroidManifest.xml [new file with mode: 0644]
build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java [new file with mode: 0644]
build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java [new file with mode: 0644]
build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java [new file with mode: 0644]
build/android/src/main/res/drawable-hdpi/irr_icon.png [new file with mode: 0644]
build/android/src/main/res/drawable-ldpi/irr_icon.png [new file with mode: 0644]
build/android/src/main/res/drawable-mdpi/irr_icon.png [new file with mode: 0644]
build/android/src/main/res/drawable-xhdpi/irr_icon.png [new file with mode: 0644]
build/android/src/main/res/layout/assetcopy.xml [new file with mode: 0644]
build/android/src/main/res/values/strings.xml [new file with mode: 0644]
build/android/src/main/res/values/styles.xml [new file with mode: 0644]
build/android/src/net/minetest/minetest/MinetestAssetCopy.java [deleted file]
build/android/src/net/minetest/minetest/MinetestTextEntry.java [deleted file]
build/android/src/net/minetest/minetest/MtNativeActivity.java [deleted file]
util/bump_version.sh

index cd6ee3e32110ee3f64d99171f5cd878f00bfe0b6..f9c664da6e33c33c58f3eb5200803665fed34e9d 100644 (file)
@@ -73,15 +73,14 @@ locale/
 *.a
 
 ## Android build files
-build/android/assets
-build/android/bin
-build/android/Debug
+build/android/src/main/assets
+build/android/build
 build/android/deps
-build/android/gen
-build/android/jni/src
 build/android/libs
+build/android/jni/src
+build/android/src/main/jniLibs
 build/android/obj
-build/android/path.cfg
-build/android/and_env
-build/android/AndroidManifest.xml
+build/android/local.properties
+build/android/.gradle
 timestamp
+
diff --git a/build/android/AndroidManifest.xml.template b/build/android/AndroidManifest.xml.template
deleted file mode 100644 (file)
index 0f75ca6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-       package="net.minetest.minetest"
-       android:versionCode="###ANDROID_VERSION###"
-       android:versionName="###BASE_VERSION###.###ANDROID_VERSION###"
-       android:installLocation="auto">
-       <uses-sdk android:minSdkVersion="9"/>
-       <uses-feature android:glEsVersion="0x00010000" android:required="true"/>
-       <uses-permission android:name="android.permission.INTERNET" />
-       <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-       ###DEBUG_BUILD###
-       <application android:icon="@drawable/irr_icon" android:label="Minetest" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ###DEBUG_FLAG###>
-       <activity android:name=".MtNativeActivity"
-               android:label="Minetest"
-               android:launchMode="singleTask"
-               android:configChanges="orientation|keyboard|keyboardHidden|navigation"
-               android:screenOrientation="sensorLandscape"
-               android:clearTaskOnLaunch="true">
-               <intent-filter>
-                       <action android:name="android.intent.action.MAIN" />
-                       <category android:name="android.intent.category.LAUNCHER" />
-               </intent-filter>
-               <meta-data android:name="android.app.lib_name" android:value="minetest" />
-       </activity>
-       <activity android:name=".MinetestTextEntry"
-               android:theme="@style/Theme.Transparent"
-               android:excludeFromRecents="true">
-       </activity>
-       <activity android:name=".MinetestAssetCopy"
-               android:theme="@style/Theme.Transparent"
-               android:excludeFromRecents="true">
-       </activity>
-       </application>
-</manifest>
index df5f65c47ab376c1f03f77c5c80101717eb19427..f3a18189b571f26aa4848be9615d9ba655f2fda6 100644 (file)
@@ -8,29 +8,21 @@ OS := $(shell uname)
 # build for build platform
 APP_PLATFORM = android-9
 
-# paths used for timestaps, dependencys, tree config and libs
-PATHCFGFILE = path.cfg
-
-ROOT = $(shell pwd)
+ANDR_ROOT = $(shell pwd)
+PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..)
+APP_ROOT = $(ANDR_ROOT)/src/main
 
 GAMES_TO_COPY = minetest_game
 MODS_TO_COPY =
 
 
-VERSION_MAJOR := $(shell cat $(ROOT)/../../CMakeLists.txt | \
+VERSION_MAJOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
        grep ^set\(VERSION_MAJOR\ | sed 's/)/ /' | cut -f2 -d' ')
-VERSION_MINOR := $(shell cat $(ROOT)/../../CMakeLists.txt | \
+VERSION_MINOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
        grep ^set\(VERSION_MINOR\ | sed 's/)/ /' | cut -f2 -d' ')
-VERSION_PATCH := $(shell cat $(ROOT)/../../CMakeLists.txt | \
+VERSION_PATCH := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
        grep ^set\(VERSION_PATCH\ | sed 's/)/ /' | cut -f2 -d' ')
 
-################################################################################
-# Android Version code
-# Increase for each build!
-################################################################################
-# Play Store actual version (16/03/15): 11
-ANDROID_VERSION_CODE = 13
-
 ################################################################################
 # toolchain config for arm new processors
 ################################################################################
@@ -42,7 +34,7 @@ TARGET_CFLAGS_ADDON = -mfloat-abi=softfp -mfpu=vfpv3 -O3
 TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON)
 TARGET_ARCH = armv7
 CROSS_PREFIX = arm-linux-androideabi-
-COMPILER_VERSION = 4.8
+COMPILER_VERSION = 4.9
 HAVE_LEVELDB = 1
 
 ################################################################################
@@ -54,7 +46,7 @@ HAVE_LEVELDB = 1
 #TARGET_TOOLCHAIN = mipsel-linux-android-
 #TARGET_ARCH = mips32
 #CROSS_PREFIX = mipsel-linux-android-
-#COMPILER_VERSION = 4.8
+#COMPILER_VERSION = 4.9
 #HAVE_LEVELDB = 0
 
 ################################################################################
@@ -66,78 +58,80 @@ HAVE_LEVELDB = 1
 #TARGET_TOOLCHAIN = x86-
 #CROSS_PREFIX = i686-linux-android-
 #TARGET_ARCH = x86
-#COMPILER_VERSION = 4.8
+#COMPILER_VERSION = 4.9
 #HAVE_LEVELDB = 1
 
 ################################################################################
 ASSETS_TIMESTAMP = deps/assets_timestamp
 
-LEVELDB_DIR = $(ROOT)/deps/leveldb/
+LEVELDB_DIR = $(ANDR_ROOT)/deps/leveldb/
 LEVELDB_LIB = $(LEVELDB_DIR)libleveldb.a
 LEVELDB_TIMESTAMP = $(LEVELDB_DIR)/timestamp
-LEVELDB_TIMESTAMP_INT = $(ROOT)/deps/leveldb_timestamp
+LEVELDB_TIMESTAMP_INT = $(ANDR_ROOT)/deps/leveldb_timestamp
 LEVELDB_URL_GIT = https://github.com/google/leveldb
 LEVELDB_COMMIT = 2d0320a458d0e6a20fff46d5f80b18bfdcce7018
 
-OPENAL_DIR = $(ROOT)/deps/openal-soft/
+OPENAL_DIR = $(ANDR_ROOT)/deps/openal-soft/
 OPENAL_LIB = $(OPENAL_DIR)libs/$(TARGET_ABI)/libopenal.so
 OPENAL_TIMESTAMP = $(OPENAL_DIR)/timestamp
-OPENAL_TIMESTAMP_INT = $(ROOT)/deps/openal_timestamp
+OPENAL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openal_timestamp
 OPENAL_URL_GIT = https://github.com/apportable/openal-soft
 
-OGG_DIR = $(ROOT)/deps/libvorbis-libogg-android/
+OGG_DIR = $(ANDR_ROOT)/deps/libvorbis-libogg-android/
 OGG_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so
 VORBIS_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so
 OGG_TIMESTAMP = $(OGG_DIR)timestamp
-OGG_TIMESTAMP_INT = $(ROOT)/deps/ogg_timestamp
+OGG_TIMESTAMP_INT = $(ANDR_ROOT)/deps/ogg_timestamp
 OGG_URL_GIT = https://github.com/vincentjames501/libvorbis-libogg-android
 
 IRRLICHT_REVISION = 5122
-IRRLICHT_DIR = $(ROOT)/deps/irrlicht/
+IRRLICHT_DIR = $(ANDR_ROOT)/deps/irrlicht/
 IRRLICHT_LIB = $(IRRLICHT_DIR)lib/Android/libIrrlicht.a
 IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp
-IRRLICHT_TIMESTAMP_INT = $(ROOT)/deps/irrlicht_timestamp
+IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp
 IRRLICHT_URL_SVN = http://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION)
 
 OPENSSL_VERSION = 1.0.2g
 OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION)
-OPENSSL_DIR = $(ROOT)/deps/$(OPENSSL_BASEDIR)/
+OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/
 OPENSSL_LIB = $(OPENSSL_DIR)/libssl.so.1.0.0
 OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp
-OPENSSL_TIMESTAMP_INT = $(ROOT)/deps/openssl_timestamp
+OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp
 OPENSSL_URL = http://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz
 
 CURL_VERSION = 7.48.0
-CURL_DIR = $(ROOT)/deps/curl-$(CURL_VERSION)
+CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION)
 CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a
 CURL_TIMESTAMP = $(CURL_DIR)/timestamp
-CURL_TIMESTAMP_INT = $(ROOT)/deps/curl_timestamp
+CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp
 CURL_URL_HTTP = http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2
 
 GMP_VERSION = 6.1.0
-GMP_DIR = $(ROOT)/deps/gmp-$(GMP_VERSION)
+GMP_DIR = $(ANDR_ROOT)/deps/gmp-$(GMP_VERSION)
 GMP_LIB = $(GMP_DIR)/usr/lib/libgmp.so
 GMP_TIMESTAMP = $(GMP_DIR)/timestamp
-GMP_TIMESTAMP_INT = $(ROOT)/deps/gmp_timestamp
+GMP_TIMESTAMP_INT = $(ANDR_ROOT)/deps/gmp_timestamp
 GMP_URL_HTTP = https://gmplib.org/download/gmp/gmp-$(GMP_VERSION).tar.bz2
 
-FREETYPE_DIR = $(ROOT)/deps/freetype2-android/
+FREETYPE_DIR = $(ANDR_ROOT)/deps/freetype2-android/
 FREETYPE_LIB = $(FREETYPE_DIR)/Android/obj/local/$(TARGET_ABI)/libfreetype2-static.a
 FREETYPE_TIMESTAMP = $(FREETYPE_DIR)timestamp
-FREETYPE_TIMESTAMP_INT = $(ROOT)/deps/freetype_timestamp
+FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp
 FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
 
 ICONV_VERSION = 1.14
-ICONV_DIR = $(ROOT)/deps/libiconv/
+ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/
 ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so
 ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
-ICONV_TIMESTAMP_INT = $(ROOT)/deps/iconv_timestamp
+ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp
 ICONV_URL_HTTP = http://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
 
 SQLITE3_FOLDER = sqlite-amalgamation-3120200
 SQLITE3_URL = http://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip
 
--include $(PATHCFGFILE)
+ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
+ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
+NDK_MODULE_PATH = $(ANDROID_NDK)/toolchains
 
 #use interim target variable to switch leveldb on or off
 ifeq ($(HAVE_LEVELDB),1)
@@ -151,54 +145,50 @@ endif
        freetype_download clean_freetype freetype \
        apk clean_apk \
        clean_all clean prep_srcdir \
-       install_debug install envpaths all \
-       manifest clean_manifest\
+       install_debug install_release envpaths all \
        $(ASSETS_TIMESTAMP) $(LEVELDB_TIMESTAMP) \
        $(OPENAL_TIMESTAMP) $(OGG_TIMESTAMP) \
        $(IRRLICHT_TIMESTAMP) $(CURL_TIMESTAMP) \
        $(OPENSSL_TIMESTAMP) \
-       $(ROOT)/jni/src/android_version.h \
-       $(ROOT)/jni/src/android_version_githash.h
+       $(ANDR_ROOT)/jni/src/android_version.h \
+       $(ANDR_ROOT)/jni/src/android_version_githash.h
 
-debug : $(PATHCFGFILE)
+debug : local.properties
        export NDEBUG=;                                                            \
        export BUILD_TYPE=debug;                                                   \
        $(MAKE) apk
 
 all : debug release
 
-release : $(PATHCFGFILE)
+release : local.properties
        @export NDEBUG=1;                                                          \
        export BUILD_TYPE=release;                                                 \
        $(MAKE) apk
 
 reconfig: delconfig
-       @$(MAKE) $(PATHCFGFILE)
+       @$(MAKE) local.properties
 
-delconfig :
-       $(RM) ${PATHCFGFILE}
+delconfig:
+       $(RM) local.properties
 
-$(PATHCFGFILE) :
+local.properties:
        @echo "Please specify path of ANDROID NDK";                                \
-       echo "e.g. /home/user/android-ndk-r9c/";                                   \
+       echo "e.g. $$HOME/Android/ndk-r11c/";                                  \
        read ANDROID_NDK ;                                                         \
        if [ ! -d $$ANDROID_NDK ] ; then                                           \
                echo "$$ANDROID_NDK is not a valid folder";                            \
                exit 1;                                                                \
        fi;                                                                        \
-       echo "ANDROID_NDK = $$ANDROID_NDK" > ${PATHCFGFILE};                       \
-       echo "NDK_MODULE_PATH = $$ANDROID_NDK/toolchains" >> ${PATHCFGFILE};            \
-       echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";\
-       echo "+ Note: NDK_MODULE_PATH is set to $$ANDROID_NDK/toolchains";              \
-       echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";\
+       echo "ndk.dir = $$ANDROID_NDK" > local.properties;                         \
        echo "Please specify path of ANDROID SDK";                                 \
-       echo "e.g. /home/user/adt-bundle-linux-x86_64-20131030/sdk/";              \
+       echo "e.g. $$HOME/Android/sdk/";                                       \
        read SDKFLDR ;                                                             \
        if [ ! -d $$SDKFLDR ] ; then                                               \
                echo "$$SDKFLDR is not a valid folder";                                \
                exit 1;                                                                \
        fi;                                                                        \
-       echo "SDKFOLDER = $$SDKFLDR" >> ${PATHCFGFILE};
+       echo "sdk.dir = $$SDKFLDR" >> local.properties;
+
 
 $(OPENAL_TIMESTAMP) : openal_download
        @LAST_MODIF=$$(find ${OPENAL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
@@ -209,8 +199,8 @@ $(OPENAL_TIMESTAMP) : openal_download
 openal_download :
        @if [ ! -d ${OPENAL_DIR} ] ; then                                          \
                echo "openal sources missing, downloading...";                         \
-               mkdir -p ${ROOT}/deps;                                                 \
-               cd ${ROOT}/deps ;                                                      \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
+               cd ${ANDR_ROOT}/deps ;                                                 \
                git clone ${OPENAL_URL_GIT} || exit 1;                                 \
        fi
 
@@ -225,14 +215,14 @@ $(OPENAL_LIB): $(OPENAL_TIMESTAMP)
                REFRESH=1;                                                             \
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
        echo "changed timestamp for openal detected building...";                  \
        cd ${OPENAL_DIR};                                                          \
-       ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH}              \
-       APP_ABI=${TARGET_ABI} TARGET_ARCH_ABI=${TARGET_ABI}                        \
-       APP_PLATFORM=${APP_PLATFORM} TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"       \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                     \
+       ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
+               NDK_MODULE_PATH=${NDK_MODULE_PATH} APP_ABI=${TARGET_ABI}               \
+               TARGET_ARCH_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}             \
+               TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
+               TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
+               TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
        touch ${OPENAL_TIMESTAMP};                                                 \
        touch ${OPENAL_TIMESTAMP_INT};                                             \
        else                                                                       \
@@ -251,11 +241,11 @@ $(OGG_TIMESTAMP) : ogg_download
 ogg_download :
        @if [ ! -d ${OGG_DIR} ] ; then                                             \
                echo "ogg sources missing, downloading...";                            \
-               mkdir -p ${ROOT}/deps;                                                 \
-               cd ${ROOT}/deps ;                                                      \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
+               cd ${ANDR_ROOT}/deps ;                                                 \
                git clone ${OGG_URL_GIT}|| exit 1;                                     \
                cd libvorbis-libogg-android ;                                          \
-               patch -p1 < ../../libvorbis-libogg-fpu.patch || exit 1;                \
+               patch -p1 < ${ANDR_ROOT}/patches/libvorbis-libogg-fpu.patch || exit 1; \
                sed -i 's-:-?-' jni/Application.mk;                                    \
        fi
 
@@ -271,14 +261,14 @@ $(OGG_LIB): $(OGG_TIMESTAMP)
                REFRESH=1;                                                             \
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
        echo "changed timestamp for ogg detected building...";                     \
        cd ${OGG_DIR};                                                             \
-       ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH}              \
-       APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                         \
-       TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                    \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                     \
+       ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
+               NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
+               APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                     \
+               TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
+               TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
+               TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
        touch ${OGG_TIMESTAMP};                                                    \
        touch ${OGG_TIMESTAMP_INT};                                                \
        else                                                                       \
@@ -297,12 +287,12 @@ $(OPENSSL_TIMESTAMP) : openssl_download
 openssl_download :
        @if [ ! -d ${OPENSSL_DIR} ] ; then                                         \
                echo "openssl sources missing, downloading...";                        \
-               mkdir -p ${ROOT}/deps;                                                 \
-               cd ${ROOT}/deps ;                                                      \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
+               cd ${ANDR_ROOT}/deps ;                                                 \
                wget ${OPENSSL_URL} || exit 1;                                         \
                tar -xzf ${OPENSSL_BASEDIR}.tar.gz;                                    \
                cd ${OPENSSL_BASEDIR};                                                 \
-               patch -p1 < ../../openssl_arch.patch;                                  \
+               patch -p1 < ${ANDR_ROOT}/patches/openssl_arch.patch;                   \
        fi
 
 openssl : $(OPENSSL_LIB)
@@ -322,8 +312,8 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB)
        ln -s ${OPENSSL_DIR} ../openssl;                                           \
        export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl;                          \
        ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
-       --install-dir=$${TOOLCHAIN};                                               \
+               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+               --install-dir=$${TOOLCHAIN};                                           \
        export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
        CC=${CROSS_PREFIX}gcc ./Configure enable-gmp -DL_ENDIAN -I${GMP_DIR} -L${GMP_DIR}/usr/lib android-${TARGET_ARCH};\
        CC=${CROSS_PREFIX}gcc ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make depend;     \
@@ -337,8 +327,8 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB)
 
 clean_openssl :
        $(RM) -rf ${OPENSSL_DIR};                                                  \
-       $(RM) -rf $(ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz;                          \
-       $(RM) -rf $(ROOT)/deps/openssl
+       $(RM) -rf $(ANDR_ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz;                     \
+       $(RM) -rf $(ANDR_ROOT)/deps/openssl
 
 $(LEVELDB_TIMESTAMP) : leveldb_download
        @LAST_MODIF=$$(find ${LEVELDB_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
@@ -349,8 +339,8 @@ $(LEVELDB_TIMESTAMP) : leveldb_download
 leveldb_download :
        @if [ ! -d ${LEVELDB_DIR} ] ; then                                         \
                echo "leveldb sources missing, downloading...";                        \
-               mkdir -p ${ROOT}/deps;                                                 \
-               cd ${ROOT}/deps ;                                                      \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
+               cd ${ANDR_ROOT}/deps ;                                                 \
                git clone ${LEVELDB_URL_GIT} || exit 1;                                \
                cd ${LEVELDB_DIR} || exit 1;                                           \
                git checkout ${LEVELDB_COMMIT} || exit 1;                              \
@@ -367,22 +357,21 @@ $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP)
                REFRESH=1;                                                             \
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
-       export PATH=$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK};           \
        echo "changed timestamp for leveldb detected building...";                 \
        cd deps/leveldb;                                                           \
        export CROSS_PREFIX=${CROSS_PREFIX};                                       \
        export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb;                          \
        ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
-       --install-dir=$${TOOLCHAIN};                                               \
+               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+               --install-dir=$${TOOLCHAIN};                                           \
        export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
        export CC=${CROSS_PREFIX}gcc;                                              \
        export CXX=${CROSS_PREFIX}g++;                                             \
        export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}";                         \
-       export CPPFLAGS="$${CPPFLAGS} ${TARGET_CFLAGS_ADDON}";                     \
+       export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}";                     \
        export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}";                      \
        export TARGET_OS=OS_ANDROID_CROSSCOMPILE;                                  \
-       $(MAKE) -s || exit 1;                                                      \
+       $(MAKE) || exit 1;                                                      \
        touch ${LEVELDB_TIMESTAMP};                                                \
        touch ${LEVELDB_TIMESTAMP_INT};                                            \
        $(RM) -rf $${TOOLCHAIN};                                                   \
@@ -402,7 +391,7 @@ $(FREETYPE_TIMESTAMP) : freetype_download
 freetype_download :
        @if [ ! -d ${FREETYPE_DIR} ] ; then                                        \
                echo "freetype sources missing, downloading...";                       \
-               mkdir -p ${ROOT}/deps;                                                 \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
                cd deps;                                                               \
                git clone ${FREETYPE_URL_GIT} || exit 1;                               \
        fi
@@ -422,14 +411,14 @@ $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP)
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        mkdir -p ${FREETYPE_DIR};                                                  \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
        echo "changed timestamp for freetype detected building...";                \
        cd ${FREETYPE_DIR}/Android/jni;                                            \
-       ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH}              \
-       APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI}                         \
-       TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                    \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                     \
+       ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
+               NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
+               APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI}                     \
+               TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
+               TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
+               TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
        touch ${FREETYPE_TIMESTAMP};                                               \
        touch ${FREETYPE_TIMESTAMP_INT};                                           \
        else                                                                       \
@@ -448,15 +437,15 @@ $(ICONV_TIMESTAMP) : iconv_download
 iconv_download :
        @if [ ! -d ${ICONV_DIR} ] ; then                                           \
                echo "iconv sources missing, downloading...";                      \
-               mkdir -p ${ROOT}/deps;                                             \
-               cd ${ROOT}/deps;                                                   \
+               mkdir -p ${ANDR_ROOT}/deps;                                        \
+               cd ${ANDR_ROOT}/deps;                                              \
                wget ${ICONV_URL_HTTP} || exit 1;                                  \
                tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1;               \
                rm libiconv-${ICONV_VERSION}.tar.gz;                               \
                ln -s libiconv-${ICONV_VERSION} libiconv;                          \
                cd ${ICONV_DIR};                                                   \
-               patch -p1 < ${ROOT}/libiconv_android.patch;                        \
-               patch -p1 < ${ROOT}/libiconv_stdio.patch;                          \
+               patch -p1 < ${ANDR_ROOT}/patches/libiconv_android.patch;           \
+               patch -p1 < ${ANDR_ROOT}/patches/libiconv_stdio.patch;             \
        fi
 
 iconv : $(ICONV_LIB)
@@ -474,14 +463,13 @@ $(ICONV_LIB) : $(ICONV_TIMESTAMP)
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        mkdir -p ${ICONV_DIR};                                                     \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
        echo "changed timestamp for iconv detected building...";                   \
        cd ${ICONV_DIR};                                                           \
        \
        export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv;                            \
        ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
-       --install-dir=$${TOOLCHAIN};                                               \
+               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+               --install-dir=$${TOOLCHAIN};                                           \
        export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
        export CC=${CROSS_PREFIX}gcc;                                              \
        export CXX=${CROSS_PREFIX}g++;                                             \
@@ -508,13 +496,13 @@ clean_iconv :
 irrlicht_download :
        @if [ ! -d "deps/irrlicht" ] ; then                                        \
                echo "irrlicht sources missing, downloading...";                       \
-               mkdir -p ${ROOT}/deps;                                                 \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
                cd deps;                                                               \
                svn co ${IRRLICHT_URL_SVN} irrlicht || exit 1;                         \
                cd irrlicht;                                                           \
-               patch -p1 < ../../irrlicht-touchcount.patch || exit 1;                 \
-               patch -p1 < ../../irrlicht-back_button.patch || exit 1;                \
-               patch -p1 < ../../irrlicht-texturehack.patch || exit 1;                \
+               patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1;  \
+               patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \
+               patch -p1 < ${ANDR_ROOT}/patches/irrlicht-texturehack.patch || exit 1; \
        fi
 
 $(IRRLICHT_TIMESTAMP) : irrlicht_download
@@ -538,14 +526,14 @@ $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB)
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        mkdir -p ${IRRLICHT_DIR};                                                  \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
        echo "changed timestamp for irrlicht detected building...";                \
        cd deps/irrlicht/source/Irrlicht/Android;                                  \
-       ndk-build NDEBUG=${NDEBUG} NDK_MODULE_PATH=${NDK_MODULE_PATH}              \
-       APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                         \
-       TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                    \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                     \
+       ${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
+               NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
+               APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                     \
+               TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
+               TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
+               TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
        touch ${IRRLICHT_TIMESTAMP};                                               \
        touch ${IRRLICHT_TIMESTAMP_INT};                                           \
        else                                                                       \
@@ -564,7 +552,7 @@ $(CURL_TIMESTAMP) : curl_download
 curl_download :
        @if [ ! -d "deps/curl-${CURL_VERSION}" ] ; then                            \
                echo "curl sources missing, downloading...";                           \
-               mkdir -p ${ROOT}/deps;                                                 \
+               mkdir -p ${ANDR_ROOT}/deps;                                            \
                cd deps;                                                               \
                wget ${CURL_URL_HTTP} || exit 1;                                       \
                tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1;                       \
@@ -587,20 +575,18 @@ $(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB)
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        mkdir -p ${CURL_DIR};                                                      \
-       export PATH="$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK}";         \
        echo "changed timestamp for curl detected building...";                    \
        cd deps/curl-${CURL_VERSION};                                              \
        export CROSS_PREFIX=${CROSS_PREFIX};                                       \
        export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl;                             \
        ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
-       --install-dir=$${TOOLCHAIN};                                               \
+               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+               --install-dir=$${TOOLCHAIN};                                           \
        export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
        export CC=${CROSS_PREFIX}gcc;                                              \
        export CXX=${CROSS_PREFIX}g++;                                             \
        export TARGET_OS=OS_ANDROID_CROSSCOMPILE;                                  \
-       export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include                     \
-       ${TARGET_CFLAGS_ADDON}";                                                   \
+       export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include ${TARGET_CFLAGS_ADDON}"; \
        export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}";                         \
        export LDFLAGS="$${LDFLAGS} -L${OPENSSL_DIR} ${TARGET_LDFLAGS_ADDON}";     \
        ./configure --host=${TARGET_HOST} --disable-shared --enable-static --with-ssl;  \
@@ -625,7 +611,7 @@ $(GMP_TIMESTAMP) : gmp_download
 gmp_download :
        @if [ ! -d "${GMP_DIR}" ] ; then                                           \
                echo "gmp sources missing, downloading...";                        \
-               mkdir -p ${ROOT}/deps;                                             \
+               mkdir -p ${ANDR_ROOT}/deps;                                        \
                cd deps;                                                           \
                wget ${GMP_URL_HTTP} || exit 1;                                    \
                tar -xjf gmp-${GMP_VERSION}.tar.bz2 || exit 1;                     \
@@ -648,14 +634,13 @@ $(GMP_LIB): $(GMP_TIMESTAMP)
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        mkdir -p ${GMP_DIR};                                                       \
-       export PATH="$${PATH}:${SDKFOLDER}/platform-tools:${ANDROID_NDK}";         \
        echo "changed timestamp for gmp detected building...";                     \
        cd deps/gmp-${GMP_VERSION};                                                \
        export CROSS_PREFIX=${CROSS_PREFIX};                                       \
        export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-gmp;                              \
        ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-       --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                         \
-       --install-dir=$${TOOLCHAIN};                                               \
+               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+               --install-dir=$${TOOLCHAIN};                                           \
        export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
        export CC=${CROSS_PREFIX}gcc;                                              \
        export CXX=${CROSS_PREFIX}g++;                                             \
@@ -687,11 +672,11 @@ clean_sqlite3:
        $(RM) -f sqlite
 
 $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB)
-       @mkdir -p ${ROOT}/deps;                                                     \
+       @mkdir -p ${ANDR_ROOT}/deps;                                                \
        for DIRNAME in {builtin,client,doc,fonts,games,mods,po,textures}; do        \
-               LAST_MODIF=$$(find ${ROOT}/../../${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
+               LAST_MODIF=$$(find ${PROJ_ROOT}/${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
                if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then               \
-                       touch ${ROOT}/../../${DIRNAME}/timestamp;                   \
+                       touch ${PROJ_ROOT}/${DIRNAME}/timestamp;                   \
                        touch ${ASSETS_TIMESTAMP};                                  \
                        echo ${DIRNAME} changed $$LAST_MODIF;                       \
                fi;                                                                 \
@@ -701,11 +686,11 @@ $(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB)
                touch ${IRRLICHT_DIR}/media/timestamp;                                 \
                touch ${ASSETS_TIMESTAMP};                                             \
        fi;                                                                        \
-       if [ ${ROOT}/../../minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then  \
+       if [ ${PROJ_ROOT}/minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then   \
                echo "conf changed";                                                   \
                touch ${ASSETS_TIMESTAMP};                                             \
        fi;                                                                        \
-       if [ ${ROOT}/../../README.txt -nt ${ASSETS_TIMESTAMP} ] ; then             \
+       if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then              \
                touch ${ASSETS_TIMESTAMP};                                             \
        fi;                                                                        \
        if [ ! -e $(ASSETS_TIMESTAMP) ] ; then                                     \
@@ -720,34 +705,34 @@ assets : $(ASSETS_TIMESTAMP)
        if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then              \
                REFRESH=1;                                                             \
        fi;                                                                        \
-       if [ ! -d ${ROOT}/assets ] ; then                                          \
+       if [ ! -d ${APP_ROOT}/assets ] ; then                                      \
                REFRESH=1;                                                             \
        fi;                                                                        \
        if [ $$REFRESH -ne 0 ] ; then                                              \
        echo "assets changed, refreshing...";                                      \
        $(MAKE) clean_assets;                                                      \
-       mkdir -p ${ROOT}/assets/Minetest;                                          \
-       cp ${ROOT}/../../minetest.conf.example ${ROOT}/assets/Minetest;            \
-       cp ${ROOT}/../../README.txt ${ROOT}/assets/Minetest;                       \
-       cp -r ${ROOT}/../../builtin ${ROOT}/assets/Minetest;                       \
-       mkdir ${ROOT}/assets/Minetest/client;                                      \
-       cp -r ${ROOT}/../../client/shaders ${ROOT}/assets/Minetest/client;         \
-       cp ${ROOT}/../../doc/lgpl-2.1.txt ${ROOT}/assets/Minetest/LICENSE.txt;     \
-       mkdir ${ROOT}/assets/Minetest/fonts;                                       \
-       cp -r ${ROOT}/../../fonts/*.ttf ${ROOT}/assets/Minetest/fonts/;            \
-       mkdir ${ROOT}/assets/Minetest/games;                                       \
+       mkdir -p ${APP_ROOT}/assets/Minetest;                                      \
+       cp ${PROJ_ROOT}/minetest.conf.example ${APP_ROOT}/assets/Minetest;         \
+       cp ${PROJ_ROOT}/README.txt ${APP_ROOT}/assets/Minetest;                    \
+       cp -r ${PROJ_ROOT}/builtin ${APP_ROOT}/assets/Minetest;                    \
+       mkdir -p ${APP_ROOT}/assets/Minetest/client;                                  \
+       cp -r ${PROJ_ROOT}/client/shaders ${APP_ROOT}/assets/Minetest/client;      \
+       cp ${PROJ_ROOT}/doc/lgpl-2.1.txt ${APP_ROOT}/assets/Minetest/LICENSE.txt;  \
+       mkdir -p ${APP_ROOT}/assets/Minetest/fonts;                                   \
+       cp -r ${PROJ_ROOT}/fonts/*.ttf ${APP_ROOT}/assets/Minetest/fonts/;         \
+       mkdir -p ${APP_ROOT}/assets/Minetest/games;                                   \
        for game in ${GAMES_TO_COPY}; do                                           \
-           cp -r ${ROOT}/../../games/$$game ${ROOT}/assets/Minetest/games/;       \
+           cp -r ${PROJ_ROOT}/games/$$game ${APP_ROOT}/assets/Minetest/games/;    \
        done;                                                                      \
-       mkdir ${ROOT}/assets/Minetest/mods;                                        \
+       mkdir -p ${APP_ROOT}/assets/Minetest/mods;                                    \
        for mod in ${MODS_TO_COPY}; do                                             \
-           cp -r ${ROOT}/../../mods/$$mod ${ROOT}/assets/Minetest/mods/;          \
+           cp -r ${PROJ_ROOT}/mods/$$mod ${APP_ROOT}/assets/Minetest/mods/;       \
        done;                                                                      \
-       cp -r ${ROOT}/../../po ${ROOT}/assets/Minetest;                            \
-       cp -r ${ROOT}/../../textures ${ROOT}/assets/Minetest;                      \
-       mkdir -p ${ROOT}/assets/Minetest/media;                                    \
-       cp -r ${IRRLICHT_DIR}/media/Shaders ${ROOT}/assets/Minetest/media;         \
-       cd ${ROOT}/assets ||  exit 1;                                              \
+       cp -r ${PROJ_ROOT}/po ${APP_ROOT}/assets/Minetest;                         \
+       cp -r ${PROJ_ROOT}/textures ${APP_ROOT}/assets/Minetest;                   \
+       mkdir -p ${APP_ROOT}/assets/Minetest/media;                                \
+       cp -r ${IRRLICHT_DIR}/media/Shaders ${APP_ROOT}/assets/Minetest/media;     \
+       cd ${APP_ROOT}/assets ||  exit 1;                                          \
        find . -name "timestamp" -exec rm {} \; ;                                  \
        find . -name "*.blend" -exec rm {} \; ;                                    \
        find . -name "*~" -exec rm {} \; ;                                         \
@@ -755,8 +740,8 @@ assets : $(ASSETS_TIMESTAMP)
        find . -type d -path "*.svn" -exec rm -rf {} \; ;                          \
        find . -type f -path "*.gitignore" -exec rm -rf {} \; ;                    \
        ls -R | grep ":$$" | sed -e 's/:$$//' -e 's/\.//' -e 's/^\///' > "index.txt"; \
-       find Minetest >"filelist.txt";                                             \
-       cp ${ROOT}/${ASSETS_TIMESTAMP} ${ROOT}/${ASSETS_TIMESTAMP}.old;            \
+       find -L Minetest > filelist.txt;                                             \
+       cp ${ANDR_ROOT}/${ASSETS_TIMESTAMP} ${ANDR_ROOT}/${ASSETS_TIMESTAMP}.old;  \
        else                                                                       \
                echo "nothing to be done for assets";                                  \
        fi
@@ -764,56 +749,50 @@ assets : $(ASSETS_TIMESTAMP)
 clean_assets :
        @$(RM) -r assets
 
-apk: $(PATHCFGFILE) assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET)       \
-       $(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ROOT)/jni/src/android_version.h     \
-       $(ROOT)/jni/src/android_version_githash.h sqlite3_download
-       @export NDEBUG=$$NDEBUG; $(MAKE) manifest;                                 \
-       export PATH=$$PATH:${SDKFOLDER}/platform-tools:${ANDROID_NDK};             \
-       export ANDROID_HOME=${SDKFOLDER};                                          \
-       mkdir -p ${ROOT}/src;                                                      \
-       ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH}                               \
-       GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB}          \
-       APP_PLATFORM=${APP_PLATFORM}                                               \
-       TARGET_LIBDIR=${TARGET_LIBDIR}                                             \
-       TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                    \
-       TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                                  \
-       TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" &&                             \
-       ant $$BUILD_TYPE &&                                                        \
-       echo "++ Success!" &&                                                      \
-       echo "APK: bin/Minetest-$$BUILD_TYPE.apk" &&                               \
-       echo "You can install it with \`adb install -r bin/Minetest-$$BUILD_TYPE.apk\`"
+apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET)       \
+       $(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h    \
+       $(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download
+       @${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH}               \
+               GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB}      \
+               APP_PLATFORM=${APP_PLATFORM}                                           \
+               TARGET_LIBDIR=${TARGET_LIBDIR}                                         \
+               TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
+               TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
+               TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
+       if [ ! -e ${APP_ROOT}/jniLibs ]; then                                      \
+               ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1;                 \
+       fi;                                                                        \
+       export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \
+       export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') &&          \
+       gradle assemble$$BUILD_TYPE_C &&                                           \
+       echo "APK stored at: build/outputs/apk/Minetest-$$BUILD_TYPE.apk" &&       \
+       echo "You can install it with \`make install_$$BUILD_TYPE\`"
+
+# These Intentionally doesn't depend on their respective build steps,
+# because it takes a while to verify that everything's up-to-date.
+install_debug:
+       ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/Minetest-debug.apk
+
+install_release:
+       ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/Minetest-release.apk
 
 prep_srcdir :
-       @if [ ! -e ${ROOT}/jni/src ]; then                                         \
-               ln -s ${ROOT}/../../src ${ROOT}/jni/src;                           \
+       @if [ ! -e ${ANDR_ROOT}/jni/src ]; then                                    \
+               ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src;                           \
        fi
 
-clean_apk : manifest
-       @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK};             \
-       export ANDROID_HOME=${SDKFOLDER};                                          \
-       ant clean
-
-install_debug :
-       @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK};             \
-       adb install -r ${ROOT}/bin/Minetest-debug.apk
-
-install :
-       @export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK};             \
-       adb install -r ${ROOT}/bin/Minetest-release.apk
-
-envpaths :
-       @echo "export PATH=$$PATH:${SDKFOLDER}platform-tools:${ANDROID_NDK}" > and_env;\
-       echo "export ANDROID_HOME=${SDKFOLDER}" >> and_env;
+clean_apk :
+       gradle clean
 
 clean_all :
        @$(MAKE) clean_apk;                                                        \
-       $(MAKE) clean_assets clean_iconv clean_irrlicht clean_leveldb clean_curl clean_openssl \
-       clean_openal clean_ogg clean_gmp clean_manifest;                           \
+       $(MAKE) clean_assets clean_iconv clean_irrlicht clean_leveldb clean_curl   \
+       clean_openssl clean_openal clean_ogg clean_gmp;                            \
        sleep 1;                                                                   \
        $(RM) -r gen libs obj deps bin Debug and_env
 
-$(ROOT)/jni/src/android_version_githash.h : prep_srcdir
-       @export VERSION_FILE=${ROOT}/jni/src/android_version_githash.h;            \
+$(ANDR_ROOT)/jni/src/android_version_githash.h : prep_srcdir
+       @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version_githash.h;        \
        export VERSION_FILE_NEW=$${VERSION_FILE}.new;                              \
        {                                                                          \
        echo "#ifndef ANDROID_MT_VERSION_GITHASH_H";                               \
@@ -831,8 +810,8 @@ $(ROOT)/jni/src/android_version_githash.h : prep_srcdir
        fi
 
 
-$(ROOT)/jni/src/android_version.h : prep_srcdir
-       @export VERSION_FILE=${ROOT}/jni/src/android_version.h;                    \
+$(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir
+       @export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version.h;                \
        export VERSION_FILE_NEW=$${VERSION_FILE}.new;                              \
        {                                                                          \
        echo "#ifndef ANDROID_MT_VERSION_H";                                       \
@@ -851,22 +830,5 @@ $(ROOT)/jni/src/android_version.h : prep_srcdir
                rm "$${VERSION_FILE_NEW}";                                         \
        fi
 
-manifest :
-       @BASE_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}";        \
-       if [ "${NDEBUG}x" != "x" ] ; then                                          \
-               DBG='';                                                                \
-               DBG_FLAG="android:debuggable=\"false\"";                               \
-       else                                                                       \
-               DBG="<uses-permission android:name=\"android.permission.SET_DEBUG_APP\" />"; \
-               DBG_FLAG="android:debuggable=\"true\"";                                \
-       fi;                                                                        \
-       cat ${ROOT}/AndroidManifest.xml.template |                                 \
-       sed "s/###ANDROID_VERSION###/${ANDROID_VERSION_CODE}/g" |                  \
-       sed "s/###BASE_VERSION###/$$BASE_VERSION/g" |                              \
-       sed -e "s@###DEBUG_BUILD###@$$DBG@g" |                                     \
-       sed -e "s@###DEBUG_FLAG###@$$DBG_FLAG@g" >${ROOT}/AndroidManifest.xml
-
-clean_manifest :
-       rm -rf ${ROOT}/AndroidManifest.xml
-
 clean : clean_apk clean_assets
+
diff --git a/build/android/build.gradle b/build/android/build.gradle
new file mode 100644 (file)
index 0000000..3ce11be
--- /dev/null
@@ -0,0 +1,49 @@
+buildscript {
+       repositories {
+               mavenCentral()
+       }
+       dependencies {
+               classpath "com.android.tools.build:gradle:1.5.0"
+       }
+}
+
+apply plugin: "com.android.application"
+
+android {
+       compileSdkVersion 23
+       buildToolsVersion "23.0.3"
+
+       defaultConfig {
+               versionCode 13
+               versionName "${System.env.VERSION_STR}.${versionCode}"
+               minSdkVersion 9
+               targetSdkVersion 9
+               applicationId "net.minetest.minetest"
+               manifestPlaceholders = [ package: "net.minetest.minetest", project: project.name ]
+       }
+
+       lintOptions {
+               disable "OldTargetApi", "GoogleAppIndexingWarning"
+       }
+
+       Properties props = new Properties()
+       props.load(new FileInputStream(file("local.properties")))
+
+       if (props.getProperty("keystore") != null) {
+               signingConfigs {
+                       release {
+                               storeFile file(props["keystore"])
+                               storePassword props["keystore.password"]
+                               keyAlias props["key"]
+                               keyPassword props["key.password"]
+                       }
+               }
+
+               buildTypes {
+                       release {
+                               signingConfig signingConfigs.release
+                       }
+               }
+       }
+}
+
diff --git a/build/android/build.xml b/build/android/build.xml
deleted file mode 100644 (file)
index 50a3e95..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="Minetest" default="help">
-       <property file="local.properties" />
-       <property file="ant.properties" />
-       <property environment="env" />
-       <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-               <isset property="env.ANDROID_HOME" />
-       </condition>
-       <loadproperties srcFile="project.properties" />
-       <fail
-               message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-               unless="sdk.dir"
-       />
-       <import file="custom_rules.xml" optional="true" />
-       <import file="${sdk.dir}/tools/ant/build.xml" />
-</project>
diff --git a/build/android/irrlicht-back_button.patch b/build/android/irrlicht-back_button.patch
deleted file mode 100644 (file)
index 227749b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
---- irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2014-06-03 20:56:21.289559503 +0200
-+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp.orig        2014-06-03 20:57:39.281556749 +0200
-@@ -423,6 +423,7 @@
-                       }\r
-                       \r
-                       device->postEventFromUser(event);\r
-+                      status = 1;\r
-               }\r
-               break;\r
-               default:\r
-@@ -479,7 +480,7 @@
-     KeyMap[1] = KEY_LBUTTON; // AKEYCODE_SOFT_LEFT\r
-     KeyMap[2] = KEY_RBUTTON; // AKEYCODE_SOFT_RIGHT\r
-     KeyMap[3] = KEY_HOME; // AKEYCODE_HOME\r
--    KeyMap[4] = KEY_BACK; // AKEYCODE_BACK\r
-+    KeyMap[4] = KEY_CANCEL; // AKEYCODE_BACK\r
-     KeyMap[5] = KEY_UNKNOWN; // AKEYCODE_CALL\r
-     KeyMap[6] = KEY_UNKNOWN; // AKEYCODE_ENDCALL\r
-     KeyMap[7] = KEY_KEY_0; // AKEYCODE_0\r
diff --git a/build/android/irrlicht-texturehack.patch b/build/android/irrlicht-texturehack.patch
deleted file mode 100644 (file)
index a458ede..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-22 17:01:13.266568869 +0200
-+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200
-@@ -366,112 +366,140 @@
-       void(*convert)(const void*, s32, void*) = 0;\r
-       getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);\r
\r
--      // make sure we don't change the internal format of existing images\r
--      if (!newTexture)\r
--              InternalFormat = oldInternalFormat;\r
--\r
--    Driver->setActiveTexture(0, this);\r
--\r
--      if (Driver->testGLError())\r
--              os::Printer::log("Could not bind Texture", ELL_ERROR);\r
--\r
--      // mipmap handling for main texture\r
--      if (!level && newTexture)\r
--      {\r
--              // auto generate if possible and no mipmap data is given\r
--              if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
--              {\r
--                      if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
--                      else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
--                      else\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
-+      bool retry = false;\r
-+      \r
-+      do { \r
-+              if (retry) {\r
-+                      InternalFormat = GL_RGBA;\r
-+                      PixelFormat = GL_RGBA;\r
-+                      convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;\r
-+              }\r
-+              // make sure we don't change the internal format of existing images\r
-+              if (!newTexture)\r
-+                      InternalFormat = oldInternalFormat;\r
\r
--            glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
--                      AutomaticMipmapUpdate=true;\r
--              }\r
-+              Driver->setActiveTexture(0, this);\r
\r
--              // enable bilinear filter without mipmaps\r
--              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
--              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
--      }\r
-+              if (Driver->testGLError())\r
-+                      os::Printer::log("Could not bind Texture", ELL_ERROR);\r
\r
--      // now get image data and upload to GPU\r
-+              // mipmap handling for main texture\r
-+              if (!level && newTexture)\r
-+              {\r
-+                      // auto generate if possible and no mipmap data is given\r
-+                      if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
-+                      {\r
-+                              if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
-+                              else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
-+                              else\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
-+\r
-+                              glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
-+                              AutomaticMipmapUpdate=true;\r
-+                      }\r
-+\r
-+                      // enable bilinear filter without mipmaps\r
-+                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
-+                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+              }\r
\r
--      u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
-+              // now get image data and upload to GPU\r
\r
--      void* source = image->lock();\r
-+              u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
\r
--      IImage* tmpImage = 0;\r
-+              void* source = image->lock();\r
\r
--      if (convert)\r
--      {\r
--              tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
--              void* dest = tmpImage->lock();\r
--              convert(source, image->getDimension().getArea(), dest);\r
--              image->unlock();\r
--              source = dest;\r
--      }\r
-+              IImage* tmpImage = 0;\r
\r
--      if (newTexture)\r
--      {\r
--              if (IsCompressed)\r
-+              if (convert)\r
-               {\r
--                      glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
--                              image->getDimension().Height, 0, compressedImageSize, source);\r
-+                      tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
-+                      void* dest = tmpImage->lock();\r
-+                      convert(source, image->getDimension().getArea(), dest);\r
-+                      image->unlock();\r
-+                      source = dest;\r
-               }\r
--              else\r
--                      glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
--                              image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
--      }\r
--      else\r
--      {\r
--              if (IsCompressed)\r
-+\r
-+              if (newTexture)\r
-               {\r
--                      glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
--                              image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
-+                      if (IsCompressed)\r
-+                      {\r
-+                              glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
-+                                      image->getDimension().Height, 0, compressedImageSize, source);\r
-+                      }\r
-+                      else\r
-+                              glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
-+                                      image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
-               }\r
-               else\r
--                      glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
--                              image->getDimension().Height, PixelFormat, PixelType, source);\r
--      }\r
--\r
--      if (convert)\r
--      {\r
--              tmpImage->unlock();\r
--              tmpImage->drop();\r
--      }\r
--      else\r
--              image->unlock();\r
--\r
--      if (!level && newTexture)\r
--      {\r
--              if (IsCompressed && !mipmapData)\r
-               {\r
--                      if (image->hasMipMaps())\r
--                              mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
-+                      if (IsCompressed)\r
-+                      {\r
-+                              glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
-+                                      image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
-+                      }\r
-                       else\r
--                              HasMipMaps = false;\r
-+                              glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
-+                                      image->getDimension().Height, PixelFormat, PixelType, source);\r
-               }\r
\r
--              regenerateMipMapLevels(mipmapData);\r
--\r
--              if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
-+              if (convert)\r
-               {\r
--                      // enable bilinear mipmap filter\r
--                      GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
--\r
--                      if (filtering != GL_LINEAR)\r
--                              filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
-+                      tmpImage->unlock();\r
-+                      tmpImage->drop();\r
-+              }\r
-+              else\r
-+                      image->unlock();\r
-+              \r
-+              if (glGetError() != GL_NO_ERROR) {\r
-+                      static bool warned = false;\r
-+                      if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {\r
-+\r
-+                              if (!warned) {\r
-+                                      os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR);\r
-+                                      warned = true;\r
-+                              }\r
-+                      }\r
-+                      else if (retry) {\r
-+                              os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);\r
-+                      }\r
-+                      retry = !retry;\r
-+                      continue;\r
-+              } else {\r
-+                      retry = false;\r
-+              }\r
\r
--                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
--                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+              if (!level && newTexture)\r
-+              {\r
-+                      if (IsCompressed && !mipmapData)\r
-+                      {\r
-+                              if (image->hasMipMaps())\r
-+                                      mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
-+                              else\r
-+                                      HasMipMaps = false;\r
-+                      }\r
-+\r
-+                      regenerateMipMapLevels(mipmapData);\r
-+\r
-+                      if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
-+                      {\r
-+                              // enable bilinear mipmap filter\r
-+                              GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
-+\r
-+                              if (filtering != GL_LINEAR)\r
-+                                      filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
-+\r
-+                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
-+                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+                      }\r
-               }\r
--      }\r
\r
--      if (Driver->testGLError())\r
--              os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
-+              if (Driver->testGLError())\r
-+                      os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
-+      }\r
-+      while(retry);\r
- }\r
\r
\r
---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-25 00:28:50.820501856 +0200
-+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200
-@@ -422,6 +422,9 @@
-                       source = dest;\r
-               }\r
\r
-+              //clear old error\r
-+              glGetError();\r
-+\r
-               if (newTexture)\r
-               {\r
-                       if (IsCompressed)\r
diff --git a/build/android/irrlicht-touchcount.patch b/build/android/irrlicht-touchcount.patch
deleted file mode 100644 (file)
index d4e4b9c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- irrlicht.orig/include/IEventReceiver.h     2014-06-03 19:43:50.433713133 +0200
-+++ irrlicht/include/IEventReceiver.h  2014-06-03 19:44:36.993711489 +0200
-@@ -375,6 +375,9 @@
-         // Y position of simple touch.\r
-               s32 Y;\r
\r
-+              // number of current touches\r
-+              s32 touchedCount;\r
-+\r
-               //! Type of touch event.\r
-               ETOUCH_INPUT_EVENT Event;\r
-       };\r
---- irrlicht.orig/source/Irrlicht/Android/CIrrDeviceAndroid.cpp        2014-06-03 19:43:50.505713130 +0200
-+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2014-06-03 19:45:37.265709359 +0200
-@@ -315,6 +315,7 @@
-                                               event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i);\r
-                                               event.TouchInput.X = AMotionEvent_getX(androidEvent, i);\r
-                                               event.TouchInput.Y = AMotionEvent_getY(androidEvent, i);\r
-+                                              event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
-                                               device->postEventFromUser(event);\r
-                                       }\r
-@@ -326,6 +327,7 @@
-                                       event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, pointerIndex);\r
-                                       event.TouchInput.X = AMotionEvent_getX(androidEvent, pointerIndex);\r
-                                       event.TouchInput.Y = AMotionEvent_getY(androidEvent, pointerIndex);\r
-+                                      event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
-                                       device->postEventFromUser(event);\r
-                               }\r
index 92738e6cc616e15e4d050b52d397897f7426d52e..e8534eaacdaa8e1f4feef97e0ff987b565cfde05 100644 (file)
@@ -69,13 +69,13 @@ GPROF_DEF=-DGPROF
 endif
 
 LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_      \
-                               -DHAVE_TOUCHSCREENGUI         \
-                               -DUSE_CURL=1                  \
-                               -DUSE_SOUND=1                 \
-                               -DUSE_FREETYPE=1              \
-                               -DUSE_LEVELDB=$(HAVE_LEVELDB) \
-                               $(GPROF_DEF)                  \
-                               -pipe -fstrict-aliasing
+               -DHAVE_TOUCHSCREENGUI         \
+               -DUSE_CURL=1                  \
+               -DUSE_SOUND=1                 \
+               -DUSE_FREETYPE=1              \
+               -DUSE_LEVELDB=$(HAVE_LEVELDB) \
+               $(GPROF_DEF)                  \
+               -pipe -fstrict-aliasing
 
 ifndef NDEBUG
 LOCAL_CFLAGS += -g -D_DEBUG -O0 -fno-omit-frame-pointer
@@ -95,8 +95,8 @@ ifeq ($(TARGET_ARCH_ABI),x86)
 LOCAL_CFLAGS += -fno-stack-protector
 endif
 
-LOCAL_C_INCLUDES :=                               \
-               jni/src jni/src/sqlite                    \
+LOCAL_C_INCLUDES := \
+               jni/src                                   \
                jni/src/script                            \
                jni/src/lua/src                           \
                jni/src/json                              \
@@ -111,7 +111,7 @@ LOCAL_C_INCLUDES :=                               \
                deps/leveldb/include                      \
                deps/sqlite/
 
-LOCAL_SRC_FILES :=                                \
+LOCAL_SRC_FILES := \
                jni/src/ban.cpp                           \
                jni/src/camera.cpp                        \
                jni/src/cavegen.cpp                       \
@@ -261,7 +261,7 @@ LOCAL_SRC_FILES :=                                \
 # intentionally kept out (we already build openssl itself): jni/src/util/sha256.c
 
 # Network
-LOCAL_SRC_FILES +=                                \
+LOCAL_SRC_FILES += \
                jni/src/network/connection.cpp            \
                jni/src/network/networkpacket.cpp         \
                jni/src/network/clientopcodes.cpp         \
@@ -270,7 +270,7 @@ LOCAL_SRC_FILES +=                                \
                jni/src/network/serverpackethandler.cpp   \
 
 # lua api
-LOCAL_SRC_FILES +=                                \
+LOCAL_SRC_FILES += \
                jni/src/script/common/c_content.cpp       \
                jni/src/script/common/c_converter.cpp     \
                jni/src/script/common/c_internal.cpp      \
@@ -310,11 +310,10 @@ LOCAL_SRC_FILES +=                                \
                jni/src/script/scripting_mainmenu.cpp
 
 #freetype2 support
-LOCAL_SRC_FILES +=                                \
-               jni/src/cguittfont/xCGUITTFont.cpp
+LOCAL_SRC_FILES += jni/src/cguittfont/xCGUITTFont.cpp
 
-# lua
-LOCAL_SRC_FILES +=                                \
+# Lua
+LOCAL_SRC_FILES += \
                jni/src/lua/src/lapi.c                    \
                jni/src/lua/src/lauxlib.c                 \
                jni/src/lua/src/lbaselib.c                \
@@ -374,3 +373,4 @@ ifdef GPROF
 $(call import-module,android-ndk-profiler)
 endif
 $(call import-module,android/native_app_glue)
+
index b7ffc56a1a4e692210f712b52d85119951314602..53467059aabbc58e5a9b2cfb01ccae2588664858 100644 (file)
@@ -1,4 +1,4 @@
-# NDK_TOOLCHAIN_VERSION := clang3.3
+# NDK_TOOLCHAIN_VERSION := clang3.8
 
 APP_PLATFORM := android-9
 APP_MODULES := minetest
@@ -6,3 +6,4 @@ APP_STL := gnustl_static
 
 APP_CPPFLAGS += -fexceptions
 APP_GNUSTL_FORCE_CPP_FEATURES := rtti
+
diff --git a/build/android/libiconv_android.patch b/build/android/libiconv_android.patch
deleted file mode 100644 (file)
index 4eca0a4..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
---- a/libcharset/lib/localcharset.c    2015-06-10 11:55:25.933870724 +0200
-+++ b/libcharset/lib/localcharset.c    2015-06-10 11:55:39.578063493 +0200
-@@ -47,7 +47,7 @@
- #if !defined WIN32_NATIVE
- # include <unistd.h>
--# if HAVE_LANGINFO_CODESET
-+# if HAVE_LANGINFO_CODESET && !(defined __ANDROID__)
- #  include <langinfo.h>
- # else
- #  if 0 /* see comment below */
-@@ -124,7 +124,7 @@ get_charset_aliases (void)
-   cp = charset_aliases;
-   if (cp == NULL)
-     {
--#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
-+#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__ || defined __ANDROID__)
-       const char *dir;
-       const char *base = "charset.alias";
-       char *file_name;
-@@ -338,6 +338,9 @@ get_charset_aliases (void)
-            "CP54936" "\0" "GB18030" "\0"
-            "CP65001" "\0" "UTF-8" "\0";
- # endif
-+# if defined __ANDROID__
-+      cp = "*" "\0" "UTF-8" "\0";
-+# endif
- #endif
-       charset_aliases = cp;
-@@ -361,7 +364,7 @@ locale_charset (void)
-   const char *codeset;
-   const char *aliases;
--#if !(defined WIN32_NATIVE || defined OS2)
-+#if !(defined WIN32_NATIVE || defined OS2 || defined __ANDROID__)
- # if HAVE_LANGINFO_CODESET
diff --git a/build/android/libiconv_stdio.patch b/build/android/libiconv_stdio.patch
deleted file mode 100644 (file)
index 9fa50f7..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/srclib/stdio.in.h        2011-08-07 15:42:06.000000000 +0200
-+++ b/srclib/stdio.in.h        2015-06-10 09:27:58.129056262 +0200
-@@ -695,8 +696,9 @@ _GL_CXXALIASWARN (gets);
- /* It is very rare that the developer ever has full control of stdin,
-    so any use of gets warrants an unconditional warning.  Assume it is
-    always declared, since it is required by C89.  */
--_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
-+/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/
-+#define gets(a) fgets( a, sizeof(*(a)), stdin)
- #endif
-
-
-#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
diff --git a/build/android/libvorbis-libogg-fpu.patch b/build/android/libvorbis-libogg-fpu.patch
deleted file mode 100644 (file)
index 52ab397..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
---- libvorbis-libogg-android/jni/libvorbis-jni/Android.mk.orig 2014-06-17 19:22:50.621559073 +0200
-+++ libvorbis-libogg-android/jni/libvorbis-jni/Android.mk      2014-06-17 19:38:20.641581140 +0200
-@@ -4,9 +4,6 @@
- LOCAL_MODULE := vorbis-jni
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
- LOCAL_SHARED_LIBRARIES := libogg libvorbis
---- libvorbis-libogg-android/jni/libvorbis/Android.mk.orig     2014-06-17 19:22:39.077558797 +0200
-+++ libvorbis-libogg-android/jni/libvorbis/Android.mk  2014-06-17 19:38:52.121581887 +0200
-@@ -4,9 +4,6 @@
- LOCAL_MODULE := libvorbis
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
- LOCAL_SHARED_LIBRARIES := libogg
- LOCAL_SRC_FILES := \
---- libvorbis-libogg-android/jni/libogg/Android.mk.orig        2014-06-17 19:22:33.965558675 +0200
-+++ libvorbis-libogg-android/jni/libogg/Android.mk     2014-06-17 19:38:25.337581252 +0200
-@@ -4,10 +4,6 @@
- LOCAL_MODULE := libogg
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
--
- LOCAL_SRC_FILES := \
-       bitwise.c \
diff --git a/build/android/openssl_arch.patch b/build/android/openssl_arch.patch
deleted file mode 100644 (file)
index d15e2b1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- openssl-1.0.2e.orig/Configure      2015-12-03 15:04:23.000000000 +0100
-+++ openssl-1.0.2e/Configure   2015-12-14 21:01:40.351265968 +0100
-@@ -464,8 +464,10 @@
- # Android: linux-* but without pointers to headers and libs.
- "android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-arm","gcc:-march=armv4 -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-mips32","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- #### *BSD [do see comment about ${BSDthreads} above!]
- "BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
diff --git a/build/android/patches/irrlicht-back_button.patch b/build/android/patches/irrlicht-back_button.patch
new file mode 100644 (file)
index 0000000..227749b
--- /dev/null
@@ -0,0 +1,19 @@
+--- irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2014-06-03 20:56:21.289559503 +0200
++++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp.orig        2014-06-03 20:57:39.281556749 +0200
+@@ -423,6 +423,7 @@
+                       }\r
+                       \r
+                       device->postEventFromUser(event);\r
++                      status = 1;\r
+               }\r
+               break;\r
+               default:\r
+@@ -479,7 +480,7 @@
+     KeyMap[1] = KEY_LBUTTON; // AKEYCODE_SOFT_LEFT\r
+     KeyMap[2] = KEY_RBUTTON; // AKEYCODE_SOFT_RIGHT\r
+     KeyMap[3] = KEY_HOME; // AKEYCODE_HOME\r
+-    KeyMap[4] = KEY_BACK; // AKEYCODE_BACK\r
++    KeyMap[4] = KEY_CANCEL; // AKEYCODE_BACK\r
+     KeyMap[5] = KEY_UNKNOWN; // AKEYCODE_CALL\r
+     KeyMap[6] = KEY_UNKNOWN; // AKEYCODE_ENDCALL\r
+     KeyMap[7] = KEY_KEY_0; // AKEYCODE_0\r
diff --git a/build/android/patches/irrlicht-texturehack.patch b/build/android/patches/irrlicht-texturehack.patch
new file mode 100644 (file)
index 0000000..a458ede
--- /dev/null
@@ -0,0 +1,240 @@
+--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-22 17:01:13.266568869 +0200
++++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200
+@@ -366,112 +366,140 @@
+       void(*convert)(const void*, s32, void*) = 0;\r
+       getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);\r
\r
+-      // make sure we don't change the internal format of existing images\r
+-      if (!newTexture)\r
+-              InternalFormat = oldInternalFormat;\r
+-\r
+-    Driver->setActiveTexture(0, this);\r
+-\r
+-      if (Driver->testGLError())\r
+-              os::Printer::log("Could not bind Texture", ELL_ERROR);\r
+-\r
+-      // mipmap handling for main texture\r
+-      if (!level && newTexture)\r
+-      {\r
+-              // auto generate if possible and no mipmap data is given\r
+-              if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
+-              {\r
+-                      if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
+-                              glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
+-                      else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
+-                              glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
+-                      else\r
+-                              glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
++      bool retry = false;\r
++      \r
++      do { \r
++              if (retry) {\r
++                      InternalFormat = GL_RGBA;\r
++                      PixelFormat = GL_RGBA;\r
++                      convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;\r
++              }\r
++              // make sure we don't change the internal format of existing images\r
++              if (!newTexture)\r
++                      InternalFormat = oldInternalFormat;\r
\r
+-            glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
+-                      AutomaticMipmapUpdate=true;\r
+-              }\r
++              Driver->setActiveTexture(0, this);\r
\r
+-              // enable bilinear filter without mipmaps\r
+-              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
+-              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
+-      }\r
++              if (Driver->testGLError())\r
++                      os::Printer::log("Could not bind Texture", ELL_ERROR);\r
\r
+-      // now get image data and upload to GPU\r
++              // mipmap handling for main texture\r
++              if (!level && newTexture)\r
++              {\r
++                      // auto generate if possible and no mipmap data is given\r
++                      if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
++                      {\r
++                              if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
++                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
++                              else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
++                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
++                              else\r
++                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
++\r
++                              glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
++                              AutomaticMipmapUpdate=true;\r
++                      }\r
++\r
++                      // enable bilinear filter without mipmaps\r
++                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
++                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
++              }\r
\r
+-      u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
++              // now get image data and upload to GPU\r
\r
+-      void* source = image->lock();\r
++              u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
\r
+-      IImage* tmpImage = 0;\r
++              void* source = image->lock();\r
\r
+-      if (convert)\r
+-      {\r
+-              tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
+-              void* dest = tmpImage->lock();\r
+-              convert(source, image->getDimension().getArea(), dest);\r
+-              image->unlock();\r
+-              source = dest;\r
+-      }\r
++              IImage* tmpImage = 0;\r
\r
+-      if (newTexture)\r
+-      {\r
+-              if (IsCompressed)\r
++              if (convert)\r
+               {\r
+-                      glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
+-                              image->getDimension().Height, 0, compressedImageSize, source);\r
++                      tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
++                      void* dest = tmpImage->lock();\r
++                      convert(source, image->getDimension().getArea(), dest);\r
++                      image->unlock();\r
++                      source = dest;\r
+               }\r
+-              else\r
+-                      glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
+-                              image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
+-      }\r
+-      else\r
+-      {\r
+-              if (IsCompressed)\r
++\r
++              if (newTexture)\r
+               {\r
+-                      glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
+-                              image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
++                      if (IsCompressed)\r
++                      {\r
++                              glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
++                                      image->getDimension().Height, 0, compressedImageSize, source);\r
++                      }\r
++                      else\r
++                              glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
++                                      image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
+               }\r
+               else\r
+-                      glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
+-                              image->getDimension().Height, PixelFormat, PixelType, source);\r
+-      }\r
+-\r
+-      if (convert)\r
+-      {\r
+-              tmpImage->unlock();\r
+-              tmpImage->drop();\r
+-      }\r
+-      else\r
+-              image->unlock();\r
+-\r
+-      if (!level && newTexture)\r
+-      {\r
+-              if (IsCompressed && !mipmapData)\r
+               {\r
+-                      if (image->hasMipMaps())\r
+-                              mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
++                      if (IsCompressed)\r
++                      {\r
++                              glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
++                                      image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
++                      }\r
+                       else\r
+-                              HasMipMaps = false;\r
++                              glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
++                                      image->getDimension().Height, PixelFormat, PixelType, source);\r
+               }\r
\r
+-              regenerateMipMapLevels(mipmapData);\r
+-\r
+-              if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
++              if (convert)\r
+               {\r
+-                      // enable bilinear mipmap filter\r
+-                      GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
+-\r
+-                      if (filtering != GL_LINEAR)\r
+-                              filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
++                      tmpImage->unlock();\r
++                      tmpImage->drop();\r
++              }\r
++              else\r
++                      image->unlock();\r
++              \r
++              if (glGetError() != GL_NO_ERROR) {\r
++                      static bool warned = false;\r
++                      if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {\r
++\r
++                              if (!warned) {\r
++                                      os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR);\r
++                                      warned = true;\r
++                              }\r
++                      }\r
++                      else if (retry) {\r
++                              os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);\r
++                      }\r
++                      retry = !retry;\r
++                      continue;\r
++              } else {\r
++                      retry = false;\r
++              }\r
\r
+-                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
+-                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
++              if (!level && newTexture)\r
++              {\r
++                      if (IsCompressed && !mipmapData)\r
++                      {\r
++                              if (image->hasMipMaps())\r
++                                      mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
++                              else\r
++                                      HasMipMaps = false;\r
++                      }\r
++\r
++                      regenerateMipMapLevels(mipmapData);\r
++\r
++                      if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
++                      {\r
++                              // enable bilinear mipmap filter\r
++                              GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
++\r
++                              if (filtering != GL_LINEAR)\r
++                                      filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
++\r
++                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
++                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
++                      }\r
+               }\r
+-      }\r
\r
+-      if (Driver->testGLError())\r
+-              os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
++              if (Driver->testGLError())\r
++                      os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
++      }\r
++      while(retry);\r
+ }\r
\r
\r
+--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-25 00:28:50.820501856 +0200
++++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200
+@@ -422,6 +422,9 @@
+                       source = dest;\r
+               }\r
\r
++              //clear old error\r
++              glGetError();\r
++\r
+               if (newTexture)\r
+               {\r
+                       if (IsCompressed)\r
diff --git a/build/android/patches/irrlicht-touchcount.patch b/build/android/patches/irrlicht-touchcount.patch
new file mode 100644 (file)
index 0000000..d4e4b9c
--- /dev/null
@@ -0,0 +1,30 @@
+--- irrlicht.orig/include/IEventReceiver.h     2014-06-03 19:43:50.433713133 +0200
++++ irrlicht/include/IEventReceiver.h  2014-06-03 19:44:36.993711489 +0200
+@@ -375,6 +375,9 @@
+         // Y position of simple touch.\r
+               s32 Y;\r
\r
++              // number of current touches\r
++              s32 touchedCount;\r
++\r
+               //! Type of touch event.\r
+               ETOUCH_INPUT_EVENT Event;\r
+       };\r
+--- irrlicht.orig/source/Irrlicht/Android/CIrrDeviceAndroid.cpp        2014-06-03 19:43:50.505713130 +0200
++++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2014-06-03 19:45:37.265709359 +0200
+@@ -315,6 +315,7 @@
+                                               event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i);\r
+                                               event.TouchInput.X = AMotionEvent_getX(androidEvent, i);\r
+                                               event.TouchInput.Y = AMotionEvent_getY(androidEvent, i);\r
++                                              event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
+                                               device->postEventFromUser(event);\r
+                                       }\r
+@@ -326,6 +327,7 @@
+                                       event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, pointerIndex);\r
+                                       event.TouchInput.X = AMotionEvent_getX(androidEvent, pointerIndex);\r
+                                       event.TouchInput.Y = AMotionEvent_getY(androidEvent, pointerIndex);\r
++                                      event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
+                                       device->postEventFromUser(event);\r
+                               }\r
diff --git a/build/android/patches/libiconv_android.patch b/build/android/patches/libiconv_android.patch
new file mode 100644 (file)
index 0000000..4eca0a4
--- /dev/null
@@ -0,0 +1,39 @@
+--- a/libcharset/lib/localcharset.c    2015-06-10 11:55:25.933870724 +0200
++++ b/libcharset/lib/localcharset.c    2015-06-10 11:55:39.578063493 +0200
+@@ -47,7 +47,7 @@
+ #if !defined WIN32_NATIVE
+ # include <unistd.h>
+-# if HAVE_LANGINFO_CODESET
++# if HAVE_LANGINFO_CODESET && !(defined __ANDROID__)
+ #  include <langinfo.h>
+ # else
+ #  if 0 /* see comment below */
+@@ -124,7 +124,7 @@ get_charset_aliases (void)
+   cp = charset_aliases;
+   if (cp == NULL)
+     {
+-#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
++#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__ || defined __ANDROID__)
+       const char *dir;
+       const char *base = "charset.alias";
+       char *file_name;
+@@ -338,6 +338,9 @@ get_charset_aliases (void)
+            "CP54936" "\0" "GB18030" "\0"
+            "CP65001" "\0" "UTF-8" "\0";
+ # endif
++# if defined __ANDROID__
++      cp = "*" "\0" "UTF-8" "\0";
++# endif
+ #endif
+       charset_aliases = cp;
+@@ -361,7 +364,7 @@ locale_charset (void)
+   const char *codeset;
+   const char *aliases;
+-#if !(defined WIN32_NATIVE || defined OS2)
++#if !(defined WIN32_NATIVE || defined OS2 || defined __ANDROID__)
+ # if HAVE_LANGINFO_CODESET
diff --git a/build/android/patches/libiconv_stdio.patch b/build/android/patches/libiconv_stdio.patch
new file mode 100644 (file)
index 0000000..9fa50f7
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/srclib/stdio.in.h        2011-08-07 15:42:06.000000000 +0200
++++ b/srclib/stdio.in.h        2015-06-10 09:27:58.129056262 +0200
+@@ -695,8 +696,9 @@ _GL_CXXALIASWARN (gets);
+ /* It is very rare that the developer ever has full control of stdin,
+    so any use of gets warrants an unconditional warning.  Assume it is
+    always declared, since it is required by C89.  */
+-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
++/*_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/
++#define gets(a) fgets( a, sizeof(*(a)), stdin)
+ #endif
+
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
diff --git a/build/android/patches/libvorbis-libogg-fpu.patch b/build/android/patches/libvorbis-libogg-fpu.patch
new file mode 100644 (file)
index 0000000..52ab397
--- /dev/null
@@ -0,0 +1,37 @@
+--- libvorbis-libogg-android/jni/libvorbis-jni/Android.mk.orig 2014-06-17 19:22:50.621559073 +0200
++++ libvorbis-libogg-android/jni/libvorbis-jni/Android.mk      2014-06-17 19:38:20.641581140 +0200
+@@ -4,9 +4,6 @@
+ LOCAL_MODULE := vorbis-jni
+ LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -fsigned-char
+-ifeq ($(TARGET_ARCH),arm)
+-      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
+-endif
+ LOCAL_SHARED_LIBRARIES := libogg libvorbis
+--- libvorbis-libogg-android/jni/libvorbis/Android.mk.orig     2014-06-17 19:22:39.077558797 +0200
++++ libvorbis-libogg-android/jni/libvorbis/Android.mk  2014-06-17 19:38:52.121581887 +0200
+@@ -4,9 +4,6 @@
+ LOCAL_MODULE := libvorbis
+ LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
+-ifeq ($(TARGET_ARCH),arm)
+-      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
+-endif
+ LOCAL_SHARED_LIBRARIES := libogg
+ LOCAL_SRC_FILES := \
+--- libvorbis-libogg-android/jni/libogg/Android.mk.orig        2014-06-17 19:22:33.965558675 +0200
++++ libvorbis-libogg-android/jni/libogg/Android.mk     2014-06-17 19:38:25.337581252 +0200
+@@ -4,10 +4,6 @@
+ LOCAL_MODULE := libogg
+ LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
+-ifeq ($(TARGET_ARCH),arm)
+-      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
+-endif
+-
+ LOCAL_SRC_FILES := \
+       bitwise.c \
diff --git a/build/android/patches/openssl_arch.patch b/build/android/patches/openssl_arch.patch
new file mode 100644 (file)
index 0000000..d15e2b1
--- /dev/null
@@ -0,0 +1,13 @@
+--- openssl-1.0.2e.orig/Configure      2015-12-03 15:04:23.000000000 +0100
++++ openssl-1.0.2e/Configure   2015-12-14 21:01:40.351265968 +0100
+@@ -464,8 +464,10 @@
+ # Android: linux-* but without pointers to headers and libs.
+ "android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+ "android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"android-arm","gcc:-march=armv4 -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+ "android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+ "android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"android-mips32","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+ #### *BSD [do see comment about ${BSDthreads} above!]
+ "BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
diff --git a/build/android/project.properties b/build/android/project.properties
deleted file mode 100644 (file)
index cc2a7c5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-target=android-10
diff --git a/build/android/res/drawable-hdpi/irr_icon.png b/build/android/res/drawable-hdpi/irr_icon.png
deleted file mode 100644 (file)
index 0b6861a..0000000
Binary files a/build/android/res/drawable-hdpi/irr_icon.png and /dev/null differ
diff --git a/build/android/res/drawable-ldpi/irr_icon.png b/build/android/res/drawable-ldpi/irr_icon.png
deleted file mode 100644 (file)
index b8c5d01..0000000
Binary files a/build/android/res/drawable-ldpi/irr_icon.png and /dev/null differ
diff --git a/build/android/res/drawable-mdpi/irr_icon.png b/build/android/res/drawable-mdpi/irr_icon.png
deleted file mode 100644 (file)
index 951a7f8..0000000
Binary files a/build/android/res/drawable-mdpi/irr_icon.png and /dev/null differ
diff --git a/build/android/res/drawable-xhdpi/irr_icon.png b/build/android/res/drawable-xhdpi/irr_icon.png
deleted file mode 100644 (file)
index 2ec528e..0000000
Binary files a/build/android/res/drawable-xhdpi/irr_icon.png and /dev/null differ
diff --git a/build/android/res/layout/assetcopy.xml b/build/android/res/layout/assetcopy.xml
deleted file mode 100644 (file)
index 8ec14bd..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <ProgressBar
-        android:id="@+id/progressBar1"
-        style="?android:attr/progressBarStyleHorizontal"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical" />
-
-    <TextView
-        android:id="@+id/textView1"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:ellipsize="middle" 
-        android:singleLine="true"
-        android:layout_gravity="center_horizontal"
-        android:text="preparing media ..."
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-</LinearLayout>
diff --git a/build/android/res/values/styles.xml b/build/android/res/values/styles.xml
deleted file mode 100644 (file)
index 25b8df5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-       <style name="Theme.Transparent" parent="android:Theme">
-               <item name="android:windowIsTranslucent">true</item>
-               <item name="android:windowBackground">@android:color/transparent</item>
-               <item name="android:windowContentOverlay">@null</item>
-               <item name="android:windowNoTitle">true</item>
-               <item name="android:windowIsFloating">true</item>
-               <item name="android:backgroundDimEnabled">false</item>
-       </style>
-</resources>
\ No newline at end of file
diff --git a/build/android/settings.gradle b/build/android/settings.gradle
new file mode 100644 (file)
index 0000000..a6e60c4
--- /dev/null
@@ -0,0 +1,2 @@
+rootProject.name = "Minetest"
+
diff --git a/build/android/src/debug/AndroidManifest.xml b/build/android/src/debug/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..a3815b9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+       <uses-permission android:name="android.permission.SET_DEBUG_APP" />
+</manifest>
diff --git a/build/android/src/main/AndroidManifest.xml b/build/android/src/main/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..df218fb
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+               package="net.minetest.minetest"
+               android:installLocation="auto">
+       <uses-feature android:glEsVersion="0x00010000" android:required="true"/>
+       <uses-permission android:name="android.permission.INTERNET" />
+       <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+       <application android:icon="@drawable/irr_icon"
+                       android:label="${project}"
+                       android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
+                       android:allowBackup="true">
+               <activity android:name=".MtNativeActivity"
+                               android:label="${project}"
+                               android:launchMode="singleTask"
+                               android:configChanges="orientation|keyboard|keyboardHidden|navigation"
+                               android:screenOrientation="sensorLandscape"
+                               android:clearTaskOnLaunch="true">
+                       <intent-filter>
+                               <action android:name="android.intent.action.MAIN" />
+                               <category android:name="android.intent.category.LAUNCHER" />
+                       </intent-filter>
+                       <meta-data android:name="android.app.lib_name" android:value="minetest" />
+               </activity>
+               <activity android:name=".MinetestTextEntry"
+                               android:theme="@style/Theme.Transparent"
+                               android:excludeFromRecents="true">
+               </activity>
+               <activity android:name=".MinetestAssetCopy"
+                               android:theme="@style/Theme.Transparent"
+                               android:excludeFromRecents="true">
+               </activity>
+       </application>
+</manifest>
diff --git a/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java b/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java
new file mode 100644 (file)
index 0000000..eb92acb
--- /dev/null
@@ -0,0 +1,416 @@
+package net.minetest.minetest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Vector;
+import java.util.Iterator;
+import java.lang.Object;
+
+import android.app.Activity;
+import android.content.res.AssetFileDescriptor;
+
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+import android.view.Display;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.graphics.Rect;
+import android.graphics.Paint;
+import android.text.TextPaint;
+
+public class MinetestAssetCopy extends Activity
+{
+       @Override
+       public void onCreate(Bundle savedInstanceState)
+       {
+               super.onCreate(savedInstanceState);
+               
+               setContentView(R.layout.assetcopy);
+               
+               m_ProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
+               m_Filename = (TextView) findViewById(R.id.textView1);
+               
+               Display display = getWindowManager().getDefaultDisplay();
+               m_ProgressBar.getLayoutParams().width = (int) (display.getWidth() * 0.8);
+               m_ProgressBar.invalidate();
+               
+               /* check if there's already a copy in progress and reuse in case it is*/
+               MinetestAssetCopy prevActivity = 
+                               (MinetestAssetCopy) getLastNonConfigurationInstance();
+               if(prevActivity!= null) {
+                       m_AssetCopy = prevActivity.m_AssetCopy;
+               }
+               else {
+                       m_AssetCopy = new copyAssetTask();
+                       m_AssetCopy.execute();
+               }
+       }
+       
+       /* preserve asset copy background task to prevent restart of copying */
+       /* this way of doing it is not recommended for latest android version */
+       /* but the recommended way isn't available on android 2.x */
+       public Object onRetainNonConfigurationInstance()
+       {
+               return this;
+       }
+       
+       ProgressBar m_ProgressBar;
+       TextView m_Filename;
+       
+       copyAssetTask m_AssetCopy;
+       
+       private class copyAssetTask extends AsyncTask<String, Integer, String>
+       {
+               private long getFullSize(String filename)
+               {
+                       long size = 0;
+                       try {
+                               InputStream src = getAssets().open(filename);
+                               byte[] buf = new byte[4096];
+                               
+                               int len = 0;
+                               while ((len = src.read(buf)) > 0)
+                               {
+                                       size += len;
+                               }
+                       }
+                       catch (IOException e)
+                       {
+                               e.printStackTrace();
+                       }
+                       return size;
+               }
+
+               @Override
+               protected String doInBackground(String... files)
+               {
+                       m_foldernames  = new Vector<String>();
+                       m_filenames    = new Vector<String>();
+                       m_tocopy       = new Vector<String>();
+                       m_asset_size_unknown = new Vector<String>();
+                       String baseDir = 
+                                       Environment.getExternalStorageDirectory().getAbsolutePath()
+                                       + "/";
+                       
+                       
+                       // prepare temp folder
+                       File TempFolder = new File(baseDir + "Minetest/tmp/");
+                       
+                       if (!TempFolder.exists())
+                       {
+                               TempFolder.mkdir();
+                       }
+                       else {
+                               File[] todel = TempFolder.listFiles();
+                               
+                               for(int i=0; i < todel.length; i++)
+                               {
+                                       Log.v("MinetestAssetCopy","deleting: " + todel[i].getAbsolutePath());
+                                       todel[i].delete();
+                               }
+                       }
+                       
+                       // add a .nomedia file
+                       try {
+                               OutputStream dst = new FileOutputStream(baseDir + "Minetest/.nomedia");
+                               dst.close();
+                       } catch (IOException e) {
+                               Log.e("MinetestAssetCopy","Failed to create .nomedia file");
+                               e.printStackTrace();
+                       }
+                       
+                       
+                       // build lists from prepared data
+                       BuildFolderList();
+                       BuildFileList();
+                       
+                       // scan filelist
+                       ProcessFileList();
+                       
+                       // doing work
+                       m_copy_started = true;
+                       m_ProgressBar.setMax(m_tocopy.size());
+                       
+                       for (int i = 0; i < m_tocopy.size(); i++)
+                       {
+                               try
+                               {
+                                       String filename = m_tocopy.get(i);
+                                       publishProgress(i);
+                                       
+                                       boolean asset_size_unknown = false;
+                                       long filesize = -1;
+                                       
+                                       if (m_asset_size_unknown.contains(filename))
+                                       {
+                                               File testme = new File(baseDir + "/" + filename);
+                                               
+                                               if(testme.exists())
+                                               {
+                                                       filesize = testme.length();
+                                               }
+                                               asset_size_unknown = true;
+                                       }
+                                       
+                                       InputStream src;
+                                       try
+                                       {
+                                               src = getAssets().open(filename);
+                                       } catch (IOException e) {
+                                               Log.e("MinetestAssetCopy","Copying file: " + filename + " FAILED (not in assets)");
+                                               e.printStackTrace();
+                                               continue;
+                                       }
+                                       
+                                       // Transfer bytes from in to out
+                                       byte[] buf = new byte[1*1024];
+                                       int len = src.read(buf, 0, 1024);
+                                       
+                                       /* following handling is crazy but we need to deal with    */
+                                       /* compressed assets.Flash chips limited livetime due to   */
+                                       /* write operations, we can't allow large files to destroy */
+                                       /* users flash.                                            */
+                                       if (asset_size_unknown)
+                                       {
+                                               if ( (len > 0) && (len < buf.length) && (len == filesize))
+                                               {
+                                                       src.close();
+                                                       continue;
+                                               }
+                                               
+                                               if (len == buf.length)
+                                               {
+                                                       src.close();
+                                                       long size = getFullSize(filename);
+                                                       if ( size == filesize)
+                                                       {
+                                                               continue;
+                                                       }
+                                                       src = getAssets().open(filename);
+                                                       len = src.read(buf, 0, 1024);
+                                               }
+                                       }
+                                       if (len > 0)
+                                       {
+                                               int total_filesize = 0;
+                                               OutputStream dst;
+                                               try
+                                               {
+                                                       dst = new FileOutputStream(baseDir + "/" + filename);
+                                               } catch (IOException e) {
+                                                       Log.e("MinetestAssetCopy","Copying file: " + baseDir +
+                                                       "/" + filename + " FAILED (couldn't open output file)");
+                                                       e.printStackTrace();
+                                                       src.close();
+                                                       continue;
+                                               }
+                                               dst.write(buf, 0, len);
+                                               total_filesize += len;
+                                               
+                                               while ((len = src.read(buf)) > 0)
+                                               {
+                                                       dst.write(buf, 0, len);
+                                                       total_filesize += len;
+                                               }
+                                               
+                                               dst.close();
+                                               Log.v("MinetestAssetCopy","Copied file: " +
+                                                                       m_tocopy.get(i) + " (" + total_filesize +
+                                                                       " bytes)");
+                                       }
+                                       else if (len < 0)
+                                       {
+                                               Log.e("MinetestAssetCopy","Copying file: " +
+                                                               m_tocopy.get(i) + " failed, size < 0");
+                                       }
+                                       src.close();
+                               } 
+                               catch (IOException e)
+                               {
+                                       Log.e("MinetestAssetCopy","Copying file: " +
+                                                       m_tocopy.get(i) + " failed");
+                                       e.printStackTrace();
+                               }
+                       }
+                       return "";
+               }
+               
+               
+               /**
+                * update progress bar
+                */
+               protected void onProgressUpdate(Integer... progress)
+               {
+                       
+                       if (m_copy_started)
+                       {
+                               boolean shortened = false;
+                               String todisplay = m_tocopy.get(progress[0]);
+                               m_ProgressBar.setProgress(progress[0]);
+                               m_Filename.setText(todisplay);
+                       }
+                       else
+                       {
+                               boolean shortened = false;
+                               String todisplay = m_Foldername;
+                               String full_text = "scanning " + todisplay + " ...";
+                               m_Filename.setText(full_text);
+                       }
+               }
+               
+               /**
+                * check al files and folders in filelist
+                */
+               protected void ProcessFileList()
+               {
+                       String FlashBaseDir = 
+                                       Environment.getExternalStorageDirectory().getAbsolutePath();
+                       
+                       Iterator itr = m_filenames.iterator();
+                       
+                       while (itr.hasNext())
+                       {
+                               String current_path = (String) itr.next();
+                               String FlashPath = FlashBaseDir + "/" + current_path;
+                               
+                               if (isAssetFolder(current_path))
+                               {
+                                       /* store information and update gui */
+                                       m_Foldername = current_path;
+                                       publishProgress(0);
+                                       
+                                       /* open file in order to check if it's a folder */
+                                       File current_folder = new File(FlashPath);
+                                       if (!current_folder.exists())
+                                        {
+                                               if (!current_folder.mkdirs())
+                                               {
+                                                       Log.e("MinetestAssetCopy","\t failed create folder: " +
+                                                                       FlashPath);
+                                               }
+                                               else
+                                               {
+                                                       Log.v("MinetestAssetCopy","\t created folder: " +
+                                                                       FlashPath);
+                                               }
+                                       }
+                                       
+                                       continue;
+                               }
+                               
+                               /* if it's not a folder it's most likely a file */
+                               boolean refresh = true;
+                               
+                               File testme = new File(FlashPath);
+                               
+                               long asset_filesize = -1;
+                               long stored_filesize = -1;
+                               
+                               if (testme.exists())
+                               {
+                                       try
+                                       {
+                                               AssetFileDescriptor fd = getAssets().openFd(current_path);
+                                               asset_filesize         = fd.getLength();
+                                               fd.close();
+                                       } 
+                                       catch (IOException e)
+                                       {
+                                               refresh = true;
+                                               m_asset_size_unknown.add(current_path);
+                                               Log.e("MinetestAssetCopy","Failed to open asset file \"" +
+                                                               FlashPath + "\" for size check");
+                                       }
+                                       
+                                       stored_filesize = testme.length();
+                                       
+                                       if (asset_filesize == stored_filesize)
+                                       {
+                                               refresh = false;
+                                       }
+                                       
+                               }
+                               
+                               if (refresh)
+                               {
+                                       m_tocopy.add(current_path);
+                               }
+                       }
+               }
+               
+               /**
+                * read list of folders prepared on package build
+                */
+               protected void BuildFolderList()
+               {
+                       try
+                       {
+                               InputStream is = getAssets().open("index.txt");
+                               BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+               
+                               String line = reader.readLine();
+                               while (line != null)
+                               {
+                                       m_foldernames.add(line);
+                                       line = reader.readLine();
+                               }
+                               is.close();
+                       } catch (IOException e1)
+                       {
+                               Log.e("MinetestAssetCopy","Error on processing index.txt");
+                               e1.printStackTrace();
+                       }
+               }
+               
+               /**
+                * read list of asset files prepared on package build
+                */
+               protected void BuildFileList()
+               {
+                       long entrycount = 0;
+                       try
+                       {
+                               InputStream is = getAssets().open("filelist.txt");
+                               BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+               
+                               String line = reader.readLine();
+                               while (line != null)
+                               {
+                                       m_filenames.add(line);
+                                       line = reader.readLine();
+                                       entrycount ++;
+                               }
+                               is.close();
+                       }
+                       catch (IOException e1)
+                       {
+                               Log.e("MinetestAssetCopy","Error on processing filelist.txt");
+                               e1.printStackTrace();
+                       }
+               }
+               
+               protected void onPostExecute (String result)
+               {
+                       finish();
+               }
+               
+               protected boolean isAssetFolder(String path)
+               {
+                       return m_foldernames.contains(path);
+               }
+               
+               boolean m_copy_started = false;
+               String m_Foldername = "media";
+               Vector<String> m_foldernames;
+               Vector<String> m_filenames;
+               Vector<String> m_tocopy;
+               Vector<String> m_asset_size_unknown;
+       }
+}
diff --git a/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java b/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java
new file mode 100644 (file)
index 0000000..68dc732
--- /dev/null
@@ -0,0 +1,91 @@
+package net.minetest.minetest;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.InputType;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnKeyListener;
+import android.widget.EditText;
+
+public class MinetestTextEntry extends Activity {
+       public AlertDialog mTextInputDialog;
+       public EditText mTextInputWidget;
+       
+       private final int MultiLineTextInput              = 1;
+       private final int SingleLineTextInput             = 2;
+       private final int SingleLinePasswordInput         = 3;
+       
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               
+               Bundle b = getIntent().getExtras();
+               String acceptButton = b.getString("EnterButton");
+               String hint         = b.getString("hint");
+               String current      = b.getString("current");
+               int    editType     = b.getInt("editType");
+               
+               AlertDialog.Builder builder = new AlertDialog.Builder(this);
+               mTextInputWidget = new EditText(this);
+               mTextInputWidget.setHint(hint);
+               mTextInputWidget.setText(current);
+               mTextInputWidget.setMinWidth(300);
+               if (editType == SingleLinePasswordInput) {
+                       mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT | 
+                                       InputType.TYPE_TEXT_VARIATION_PASSWORD);
+               }
+               else {
+                       mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT);
+               }
+               
+               
+               builder.setView(mTextInputWidget);
+               
+               if (editType == MultiLineTextInput) {
+                       builder.setPositiveButton(acceptButton, new DialogInterface.OnClickListener() {
+                               public void onClick(DialogInterface dialog, int whichButton) 
+                               { pushResult(mTextInputWidget.getText().toString()); }
+                               });
+               }
+               
+               builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
+                       public void onCancel(DialogInterface dialog) {
+                               cancelDialog();
+                       }
+               });
+               
+               mTextInputWidget.setOnKeyListener(new OnKeyListener() {
+                       @Override
+                       public boolean onKey(View view, int KeyCode, KeyEvent event) {
+                               if ( KeyCode == KeyEvent.KEYCODE_ENTER){
+
+                                       pushResult(mTextInputWidget.getText().toString());
+                                       return true;
+                               }
+                               return false;
+                       }
+               });
+               
+               mTextInputDialog = builder.create();
+               mTextInputDialog.show();
+       }
+       
+       public void pushResult(String text) {
+               Intent resultData = new Intent();
+               resultData.putExtra("text", text);
+               setResult(Activity.RESULT_OK,resultData);
+               mTextInputDialog.dismiss();
+               finish();
+       }
+       
+       public void cancelDialog() {
+               setResult(Activity.RESULT_CANCELED);
+               mTextInputDialog.dismiss();
+               finish();
+       }
+}
diff --git a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
new file mode 100644 (file)
index 0000000..fc95a83
--- /dev/null
@@ -0,0 +1,100 @@
+package net.minetest.minetest;
+
+import android.app.NativeActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.WindowManager;
+
+public class MtNativeActivity extends NativeActivity {
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               m_MessagReturnCode = -1;
+               m_MessageReturnValue = "";
+
+       }
+
+       @Override
+       public void onDestroy() {
+               super.onDestroy();
+       }
+
+
+       public void copyAssets() {
+               Intent intent = new Intent(this, MinetestAssetCopy.class);
+               startActivity(intent);
+       }
+
+       public void showDialog(String acceptButton, String hint, String current,
+                       int editType) {
+
+               Intent intent = new Intent(this, MinetestTextEntry.class);
+               Bundle params = new Bundle();
+               params.putString("acceptButton", acceptButton);
+               params.putString("hint", hint);
+               params.putString("current", current);
+               params.putInt("editType", editType);
+               intent.putExtras(params);
+               startActivityForResult(intent, 101);
+               m_MessageReturnValue = "";
+               m_MessagReturnCode   = -1;
+       }
+
+       public static native void putMessageBoxResult(String text);
+
+       /* ugly code to workaround putMessageBoxResult not beeing found */
+       public int getDialogState() {
+               return m_MessagReturnCode;
+       }
+
+       public String getDialogValue() {
+               m_MessagReturnCode = -1;
+               return m_MessageReturnValue;
+       }
+
+       public float getDensity() {
+               return getResources().getDisplayMetrics().density;
+       }
+
+       public int getDisplayWidth() {
+               return getResources().getDisplayMetrics().widthPixels;
+       }
+
+       public int getDisplayHeight() {
+               return getResources().getDisplayMetrics().heightPixels;
+       }
+
+       @Override
+       protected void onActivityResult(int requestCode, int resultCode,
+                       Intent data) {
+               if (requestCode == 101) {
+                       if (resultCode == RESULT_OK) {
+                               String text = data.getStringExtra("text");
+                               m_MessagReturnCode = 0;
+                               m_MessageReturnValue = text;
+                       }
+                       else {
+                               m_MessagReturnCode = 1;
+                       }
+               }
+       }
+
+       static {
+               System.loadLibrary("openal");
+               System.loadLibrary("ogg");
+               System.loadLibrary("vorbis");
+               System.loadLibrary("ssl");
+               System.loadLibrary("crypto");
+               System.loadLibrary("gmp");
+               System.loadLibrary("iconv");
+
+               // We don't have to load libminetest.so ourselves,
+               // but if we do, we get nicer logcat errors when
+               // loading fails.
+               System.loadLibrary("minetest");
+       }
+
+       private int m_MessagReturnCode;
+       private String m_MessageReturnValue;
+}
diff --git a/build/android/src/main/res/drawable-hdpi/irr_icon.png b/build/android/src/main/res/drawable-hdpi/irr_icon.png
new file mode 100644 (file)
index 0000000..0b6861a
Binary files /dev/null and b/build/android/src/main/res/drawable-hdpi/irr_icon.png differ
diff --git a/build/android/src/main/res/drawable-ldpi/irr_icon.png b/build/android/src/main/res/drawable-ldpi/irr_icon.png
new file mode 100644 (file)
index 0000000..b8c5d01
Binary files /dev/null and b/build/android/src/main/res/drawable-ldpi/irr_icon.png differ
diff --git a/build/android/src/main/res/drawable-mdpi/irr_icon.png b/build/android/src/main/res/drawable-mdpi/irr_icon.png
new file mode 100644 (file)
index 0000000..951a7f8
Binary files /dev/null and b/build/android/src/main/res/drawable-mdpi/irr_icon.png differ
diff --git a/build/android/src/main/res/drawable-xhdpi/irr_icon.png b/build/android/src/main/res/drawable-xhdpi/irr_icon.png
new file mode 100644 (file)
index 0000000..2ec528e
Binary files /dev/null and b/build/android/src/main/res/drawable-xhdpi/irr_icon.png differ
diff --git a/build/android/src/main/res/layout/assetcopy.xml b/build/android/src/main/res/layout/assetcopy.xml
new file mode 100644 (file)
index 0000000..1fcfffd
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical" >
+
+    <ProgressBar
+        android:id="@+id/progressBar1"
+        style="?android:attr/progressBarStyleHorizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical" />
+
+    <TextView
+        android:id="@+id/textView1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ellipsize="middle" 
+        android:singleLine="true"
+        android:layout_gravity="center_horizontal"
+        android:text="@string/preparing_media"
+        android:textAppearance="?android:attr/textAppearanceSmall" />
+
+</LinearLayout>
diff --git a/build/android/src/main/res/values/strings.xml b/build/android/src/main/res/values/strings.xml
new file mode 100644 (file)
index 0000000..b407a77
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+       <string name="preparing_media">Preparing media...</string>
+</resources>
+
diff --git a/build/android/src/main/res/values/styles.xml b/build/android/src/main/res/values/styles.xml
new file mode 100644 (file)
index 0000000..25b8df5
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+       <style name="Theme.Transparent" parent="android:Theme">
+               <item name="android:windowIsTranslucent">true</item>
+               <item name="android:windowBackground">@android:color/transparent</item>
+               <item name="android:windowContentOverlay">@null</item>
+               <item name="android:windowNoTitle">true</item>
+               <item name="android:windowIsFloating">true</item>
+               <item name="android:backgroundDimEnabled">false</item>
+       </style>
+</resources>
\ No newline at end of file
diff --git a/build/android/src/net/minetest/minetest/MinetestAssetCopy.java b/build/android/src/net/minetest/minetest/MinetestAssetCopy.java
deleted file mode 100644 (file)
index eb92acb..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-package net.minetest.minetest;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.Vector;
-import java.util.Iterator;
-import java.lang.Object;
-
-import android.app.Activity;
-import android.content.res.AssetFileDescriptor;
-
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Environment;
-import android.util.Log;
-import android.view.Display;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.graphics.Rect;
-import android.graphics.Paint;
-import android.text.TextPaint;
-
-public class MinetestAssetCopy extends Activity
-{
-       @Override
-       public void onCreate(Bundle savedInstanceState)
-       {
-               super.onCreate(savedInstanceState);
-               
-               setContentView(R.layout.assetcopy);
-               
-               m_ProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
-               m_Filename = (TextView) findViewById(R.id.textView1);
-               
-               Display display = getWindowManager().getDefaultDisplay();
-               m_ProgressBar.getLayoutParams().width = (int) (display.getWidth() * 0.8);
-               m_ProgressBar.invalidate();
-               
-               /* check if there's already a copy in progress and reuse in case it is*/
-               MinetestAssetCopy prevActivity = 
-                               (MinetestAssetCopy) getLastNonConfigurationInstance();
-               if(prevActivity!= null) {
-                       m_AssetCopy = prevActivity.m_AssetCopy;
-               }
-               else {
-                       m_AssetCopy = new copyAssetTask();
-                       m_AssetCopy.execute();
-               }
-       }
-       
-       /* preserve asset copy background task to prevent restart of copying */
-       /* this way of doing it is not recommended for latest android version */
-       /* but the recommended way isn't available on android 2.x */
-       public Object onRetainNonConfigurationInstance()
-       {
-               return this;
-       }
-       
-       ProgressBar m_ProgressBar;
-       TextView m_Filename;
-       
-       copyAssetTask m_AssetCopy;
-       
-       private class copyAssetTask extends AsyncTask<String, Integer, String>
-       {
-               private long getFullSize(String filename)
-               {
-                       long size = 0;
-                       try {
-                               InputStream src = getAssets().open(filename);
-                               byte[] buf = new byte[4096];
-                               
-                               int len = 0;
-                               while ((len = src.read(buf)) > 0)
-                               {
-                                       size += len;
-                               }
-                       }
-                       catch (IOException e)
-                       {
-                               e.printStackTrace();
-                       }
-                       return size;
-               }
-
-               @Override
-               protected String doInBackground(String... files)
-               {
-                       m_foldernames  = new Vector<String>();
-                       m_filenames    = new Vector<String>();
-                       m_tocopy       = new Vector<String>();
-                       m_asset_size_unknown = new Vector<String>();
-                       String baseDir = 
-                                       Environment.getExternalStorageDirectory().getAbsolutePath()
-                                       + "/";
-                       
-                       
-                       // prepare temp folder
-                       File TempFolder = new File(baseDir + "Minetest/tmp/");
-                       
-                       if (!TempFolder.exists())
-                       {
-                               TempFolder.mkdir();
-                       }
-                       else {
-                               File[] todel = TempFolder.listFiles();
-                               
-                               for(int i=0; i < todel.length; i++)
-                               {
-                                       Log.v("MinetestAssetCopy","deleting: " + todel[i].getAbsolutePath());
-                                       todel[i].delete();
-                               }
-                       }
-                       
-                       // add a .nomedia file
-                       try {
-                               OutputStream dst = new FileOutputStream(baseDir + "Minetest/.nomedia");
-                               dst.close();
-                       } catch (IOException e) {
-                               Log.e("MinetestAssetCopy","Failed to create .nomedia file");
-                               e.printStackTrace();
-                       }
-                       
-                       
-                       // build lists from prepared data
-                       BuildFolderList();
-                       BuildFileList();
-                       
-                       // scan filelist
-                       ProcessFileList();
-                       
-                       // doing work
-                       m_copy_started = true;
-                       m_ProgressBar.setMax(m_tocopy.size());
-                       
-                       for (int i = 0; i < m_tocopy.size(); i++)
-                       {
-                               try
-                               {
-                                       String filename = m_tocopy.get(i);
-                                       publishProgress(i);
-                                       
-                                       boolean asset_size_unknown = false;
-                                       long filesize = -1;
-                                       
-                                       if (m_asset_size_unknown.contains(filename))
-                                       {
-                                               File testme = new File(baseDir + "/" + filename);
-                                               
-                                               if(testme.exists())
-                                               {
-                                                       filesize = testme.length();
-                                               }
-                                               asset_size_unknown = true;
-                                       }
-                                       
-                                       InputStream src;
-                                       try
-                                       {
-                                               src = getAssets().open(filename);
-                                       } catch (IOException e) {
-                                               Log.e("MinetestAssetCopy","Copying file: " + filename + " FAILED (not in assets)");
-                                               e.printStackTrace();
-                                               continue;
-                                       }
-                                       
-                                       // Transfer bytes from in to out
-                                       byte[] buf = new byte[1*1024];
-                                       int len = src.read(buf, 0, 1024);
-                                       
-                                       /* following handling is crazy but we need to deal with    */
-                                       /* compressed assets.Flash chips limited livetime due to   */
-                                       /* write operations, we can't allow large files to destroy */
-                                       /* users flash.                                            */
-                                       if (asset_size_unknown)
-                                       {
-                                               if ( (len > 0) && (len < buf.length) && (len == filesize))
-                                               {
-                                                       src.close();
-                                                       continue;
-                                               }
-                                               
-                                               if (len == buf.length)
-                                               {
-                                                       src.close();
-                                                       long size = getFullSize(filename);
-                                                       if ( size == filesize)
-                                                       {
-                                                               continue;
-                                                       }
-                                                       src = getAssets().open(filename);
-                                                       len = src.read(buf, 0, 1024);
-                                               }
-                                       }
-                                       if (len > 0)
-                                       {
-                                               int total_filesize = 0;
-                                               OutputStream dst;
-                                               try
-                                               {
-                                                       dst = new FileOutputStream(baseDir + "/" + filename);
-                                               } catch (IOException e) {
-                                                       Log.e("MinetestAssetCopy","Copying file: " + baseDir +
-                                                       "/" + filename + " FAILED (couldn't open output file)");
-                                                       e.printStackTrace();
-                                                       src.close();
-                                                       continue;
-                                               }
-                                               dst.write(buf, 0, len);
-                                               total_filesize += len;
-                                               
-                                               while ((len = src.read(buf)) > 0)
-                                               {
-                                                       dst.write(buf, 0, len);
-                                                       total_filesize += len;
-                                               }
-                                               
-                                               dst.close();
-                                               Log.v("MinetestAssetCopy","Copied file: " +
-                                                                       m_tocopy.get(i) + " (" + total_filesize +
-                                                                       " bytes)");
-                                       }
-                                       else if (len < 0)
-                                       {
-                                               Log.e("MinetestAssetCopy","Copying file: " +
-                                                               m_tocopy.get(i) + " failed, size < 0");
-                                       }
-                                       src.close();
-                               } 
-                               catch (IOException e)
-                               {
-                                       Log.e("MinetestAssetCopy","Copying file: " +
-                                                       m_tocopy.get(i) + " failed");
-                                       e.printStackTrace();
-                               }
-                       }
-                       return "";
-               }
-               
-               
-               /**
-                * update progress bar
-                */
-               protected void onProgressUpdate(Integer... progress)
-               {
-                       
-                       if (m_copy_started)
-                       {
-                               boolean shortened = false;
-                               String todisplay = m_tocopy.get(progress[0]);
-                               m_ProgressBar.setProgress(progress[0]);
-                               m_Filename.setText(todisplay);
-                       }
-                       else
-                       {
-                               boolean shortened = false;
-                               String todisplay = m_Foldername;
-                               String full_text = "scanning " + todisplay + " ...";
-                               m_Filename.setText(full_text);
-                       }
-               }
-               
-               /**
-                * check al files and folders in filelist
-                */
-               protected void ProcessFileList()
-               {
-                       String FlashBaseDir = 
-                                       Environment.getExternalStorageDirectory().getAbsolutePath();
-                       
-                       Iterator itr = m_filenames.iterator();
-                       
-                       while (itr.hasNext())
-                       {
-                               String current_path = (String) itr.next();
-                               String FlashPath = FlashBaseDir + "/" + current_path;
-                               
-                               if (isAssetFolder(current_path))
-                               {
-                                       /* store information and update gui */
-                                       m_Foldername = current_path;
-                                       publishProgress(0);
-                                       
-                                       /* open file in order to check if it's a folder */
-                                       File current_folder = new File(FlashPath);
-                                       if (!current_folder.exists())
-                                        {
-                                               if (!current_folder.mkdirs())
-                                               {
-                                                       Log.e("MinetestAssetCopy","\t failed create folder: " +
-                                                                       FlashPath);
-                                               }
-                                               else
-                                               {
-                                                       Log.v("MinetestAssetCopy","\t created folder: " +
-                                                                       FlashPath);
-                                               }
-                                       }
-                                       
-                                       continue;
-                               }
-                               
-                               /* if it's not a folder it's most likely a file */
-                               boolean refresh = true;
-                               
-                               File testme = new File(FlashPath);
-                               
-                               long asset_filesize = -1;
-                               long stored_filesize = -1;
-                               
-                               if (testme.exists())
-                               {
-                                       try
-                                       {
-                                               AssetFileDescriptor fd = getAssets().openFd(current_path);
-                                               asset_filesize         = fd.getLength();
-                                               fd.close();
-                                       } 
-                                       catch (IOException e)
-                                       {
-                                               refresh = true;
-                                               m_asset_size_unknown.add(current_path);
-                                               Log.e("MinetestAssetCopy","Failed to open asset file \"" +
-                                                               FlashPath + "\" for size check");
-                                       }
-                                       
-                                       stored_filesize = testme.length();
-                                       
-                                       if (asset_filesize == stored_filesize)
-                                       {
-                                               refresh = false;
-                                       }
-                                       
-                               }
-                               
-                               if (refresh)
-                               {
-                                       m_tocopy.add(current_path);
-                               }
-                       }
-               }
-               
-               /**
-                * read list of folders prepared on package build
-                */
-               protected void BuildFolderList()
-               {
-                       try
-                       {
-                               InputStream is = getAssets().open("index.txt");
-                               BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-               
-                               String line = reader.readLine();
-                               while (line != null)
-                               {
-                                       m_foldernames.add(line);
-                                       line = reader.readLine();
-                               }
-                               is.close();
-                       } catch (IOException e1)
-                       {
-                               Log.e("MinetestAssetCopy","Error on processing index.txt");
-                               e1.printStackTrace();
-                       }
-               }
-               
-               /**
-                * read list of asset files prepared on package build
-                */
-               protected void BuildFileList()
-               {
-                       long entrycount = 0;
-                       try
-                       {
-                               InputStream is = getAssets().open("filelist.txt");
-                               BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-               
-                               String line = reader.readLine();
-                               while (line != null)
-                               {
-                                       m_filenames.add(line);
-                                       line = reader.readLine();
-                                       entrycount ++;
-                               }
-                               is.close();
-                       }
-                       catch (IOException e1)
-                       {
-                               Log.e("MinetestAssetCopy","Error on processing filelist.txt");
-                               e1.printStackTrace();
-                       }
-               }
-               
-               protected void onPostExecute (String result)
-               {
-                       finish();
-               }
-               
-               protected boolean isAssetFolder(String path)
-               {
-                       return m_foldernames.contains(path);
-               }
-               
-               boolean m_copy_started = false;
-               String m_Foldername = "media";
-               Vector<String> m_foldernames;
-               Vector<String> m_filenames;
-               Vector<String> m_tocopy;
-               Vector<String> m_asset_size_unknown;
-       }
-}
diff --git a/build/android/src/net/minetest/minetest/MinetestTextEntry.java b/build/android/src/net/minetest/minetest/MinetestTextEntry.java
deleted file mode 100644 (file)
index 68dc732..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-package net.minetest.minetest;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.InputType;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnKeyListener;
-import android.widget.EditText;
-
-public class MinetestTextEntry extends Activity {
-       public AlertDialog mTextInputDialog;
-       public EditText mTextInputWidget;
-       
-       private final int MultiLineTextInput              = 1;
-       private final int SingleLineTextInput             = 2;
-       private final int SingleLinePasswordInput         = 3;
-       
-       @Override
-       public void onCreate(Bundle savedInstanceState) {
-               super.onCreate(savedInstanceState);
-               
-               Bundle b = getIntent().getExtras();
-               String acceptButton = b.getString("EnterButton");
-               String hint         = b.getString("hint");
-               String current      = b.getString("current");
-               int    editType     = b.getInt("editType");
-               
-               AlertDialog.Builder builder = new AlertDialog.Builder(this);
-               mTextInputWidget = new EditText(this);
-               mTextInputWidget.setHint(hint);
-               mTextInputWidget.setText(current);
-               mTextInputWidget.setMinWidth(300);
-               if (editType == SingleLinePasswordInput) {
-                       mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT | 
-                                       InputType.TYPE_TEXT_VARIATION_PASSWORD);
-               }
-               else {
-                       mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT);
-               }
-               
-               
-               builder.setView(mTextInputWidget);
-               
-               if (editType == MultiLineTextInput) {
-                       builder.setPositiveButton(acceptButton, new DialogInterface.OnClickListener() {
-                               public void onClick(DialogInterface dialog, int whichButton) 
-                               { pushResult(mTextInputWidget.getText().toString()); }
-                               });
-               }
-               
-               builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
-                       public void onCancel(DialogInterface dialog) {
-                               cancelDialog();
-                       }
-               });
-               
-               mTextInputWidget.setOnKeyListener(new OnKeyListener() {
-                       @Override
-                       public boolean onKey(View view, int KeyCode, KeyEvent event) {
-                               if ( KeyCode == KeyEvent.KEYCODE_ENTER){
-
-                                       pushResult(mTextInputWidget.getText().toString());
-                                       return true;
-                               }
-                               return false;
-                       }
-               });
-               
-               mTextInputDialog = builder.create();
-               mTextInputDialog.show();
-       }
-       
-       public void pushResult(String text) {
-               Intent resultData = new Intent();
-               resultData.putExtra("text", text);
-               setResult(Activity.RESULT_OK,resultData);
-               mTextInputDialog.dismiss();
-               finish();
-       }
-       
-       public void cancelDialog() {
-               setResult(Activity.RESULT_CANCELED);
-               mTextInputDialog.dismiss();
-               finish();
-       }
-}
diff --git a/build/android/src/net/minetest/minetest/MtNativeActivity.java b/build/android/src/net/minetest/minetest/MtNativeActivity.java
deleted file mode 100644 (file)
index fc95a83..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-package net.minetest.minetest;
-
-import android.app.NativeActivity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.WindowManager;
-
-public class MtNativeActivity extends NativeActivity {
-       @Override
-       public void onCreate(Bundle savedInstanceState) {
-               super.onCreate(savedInstanceState);
-               m_MessagReturnCode = -1;
-               m_MessageReturnValue = "";
-
-       }
-
-       @Override
-       public void onDestroy() {
-               super.onDestroy();
-       }
-
-
-       public void copyAssets() {
-               Intent intent = new Intent(this, MinetestAssetCopy.class);
-               startActivity(intent);
-       }
-
-       public void showDialog(String acceptButton, String hint, String current,
-                       int editType) {
-
-               Intent intent = new Intent(this, MinetestTextEntry.class);
-               Bundle params = new Bundle();
-               params.putString("acceptButton", acceptButton);
-               params.putString("hint", hint);
-               params.putString("current", current);
-               params.putInt("editType", editType);
-               intent.putExtras(params);
-               startActivityForResult(intent, 101);
-               m_MessageReturnValue = "";
-               m_MessagReturnCode   = -1;
-       }
-
-       public static native void putMessageBoxResult(String text);
-
-       /* ugly code to workaround putMessageBoxResult not beeing found */
-       public int getDialogState() {
-               return m_MessagReturnCode;
-       }
-
-       public String getDialogValue() {
-               m_MessagReturnCode = -1;
-               return m_MessageReturnValue;
-       }
-
-       public float getDensity() {
-               return getResources().getDisplayMetrics().density;
-       }
-
-       public int getDisplayWidth() {
-               return getResources().getDisplayMetrics().widthPixels;
-       }
-
-       public int getDisplayHeight() {
-               return getResources().getDisplayMetrics().heightPixels;
-       }
-
-       @Override
-       protected void onActivityResult(int requestCode, int resultCode,
-                       Intent data) {
-               if (requestCode == 101) {
-                       if (resultCode == RESULT_OK) {
-                               String text = data.getStringExtra("text");
-                               m_MessagReturnCode = 0;
-                               m_MessageReturnValue = text;
-                       }
-                       else {
-                               m_MessagReturnCode = 1;
-                       }
-               }
-       }
-
-       static {
-               System.loadLibrary("openal");
-               System.loadLibrary("ogg");
-               System.loadLibrary("vorbis");
-               System.loadLibrary("ssl");
-               System.loadLibrary("crypto");
-               System.loadLibrary("gmp");
-               System.loadLibrary("iconv");
-
-               // We don't have to load libminetest.so ourselves,
-               // but if we do, we get nicer logcat errors when
-               // loading fails.
-               System.loadLibrary("minetest");
-       }
-
-       private int m_MessagReturnCode;
-       private String m_MessageReturnValue;
-}
index 5ff69c8af7874be450796b3ee8d2fcc35d72a01c..948561ac325bd5be3a5803a3fb4442faacffbb22 100755 (executable)
@@ -32,12 +32,12 @@ cd ${0%/*}/..
 grep -q -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt"
 grep -q -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt"
 grep -q -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt || die "error: Could not find CMakeLists.txt"
-grep -q -E '^ANDROID_VERSION_CODE = [0-9]+$' build/android/Makefile || die "error: Could not find build/android/Makefile"
+grep -q -E 'versionCode [0-9]+$' build/android/build.gradle || die "error: Could not find Android version code"
 
 VERSION_MAJOR=$(grep -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9)
 VERSION_MINOR=$(grep -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9)
 VERSION_PATCH=$(grep -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt | tr -dC 0-9)
-ANDROID_VERSION_CODE=$(grep -E '^ANDROID_VERSION_CODE = [0-9]+$' build/android/Makefile | tr -dC 0-9)
+ANDROID_VERSION_CODE=$(grep -E 'versionCode [0-9]+$' build/android/build.gradle | tr -dC 0-9)
 
 echo "Current Minetest version: $VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH"
 echo "Current Android version code: $ANDROID_VERSION_CODE"
@@ -89,13 +89,13 @@ sed -i -re "s/^set\(VERSION_PATCH [0-9]+\)$/set(VERSION_PATCH $NEW_VERSION_PATCH
 
 sed -i -re "s/^set\(DEVELOPMENT_BUILD TRUE\)$/set(DEVELOPMENT_BUILD FALSE)/" CMakeLists.txt || die "Failed to unset DEVELOPMENT_BUILD"
 
-sed -i -re "s/^ANDROID_VERSION_CODE = [0-9]+$/ANDROID_VERSION_CODE = $NEW_ANDROID_VERSION_CODE/" build/android/Makefile || die "Failed to update ANDROID_VERSION_CODE"
+sed -i -re "s/versionCode [0-9]+$/versionCode $NEW_ANDROID_VERSION_CODE/" build/android/build.gradle || die "Failed to update Android version code"
 
 sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEW_VERSION/g" doc/lua_api.txt || die "Failed to update doc/lua_api.txt"
 
 sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEW_VERSION/g" doc/menu_lua_api.txt || die "Failed to update doc/menu_lua_api.txt"
 
-git add -f CMakeLists.txt build/android/Makefile doc/lua_api.txt doc/menu_lua_api.txt || die "git add failed"
+git add -f CMakeLists.txt build/android/build.gradle doc/lua_api.txt doc/menu_lua_api.txt || die "git add failed"
 
 git commit -m "Bump version to $NEW_VERSION" || die "git commit failed"