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.
*.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
+
+++ /dev/null
-<?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>
# 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
################################################################################
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
################################################################################
#TARGET_TOOLCHAIN = mipsel-linux-android-
#TARGET_ARCH = mips32
#CROSS_PREFIX = mipsel-linux-android-
-#COMPILER_VERSION = 4.8
+#COMPILER_VERSION = 4.9
#HAVE_LEVELDB = 0
################################################################################
#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)
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" "); \
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
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 \
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
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 \
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)
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; \
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" "); \
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; \
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}; \
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
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 \
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)
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++; \
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
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 \
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; \
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; \
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; \
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++; \
$(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; \
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 \
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 {} \; ; \
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
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"; \
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"; \
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
+
--- /dev/null
+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
+ }
+ }
+ }
+}
+
+++ /dev/null
-<?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>
+++ /dev/null
---- 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
+++ /dev/null
---- 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
+++ /dev/null
---- 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
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
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 \
deps/leveldb/include \
deps/sqlite/
-LOCAL_SRC_FILES := \
+LOCAL_SRC_FILES := \
jni/src/ban.cpp \
jni/src/camera.cpp \
jni/src/cavegen.cpp \
# 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 \
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 \
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 \
$(call import-module,android-ndk-profiler)
endif
$(call import-module,android/native_app_glue)
+
-# NDK_TOOLCHAIN_VERSION := clang3.3
+# NDK_TOOLCHAIN_VERSION := clang3.8
APP_PLATFORM := android-9
APP_MODULES := minetest
APP_CPPFLAGS += -fexceptions
APP_GNUSTL_FORCE_CPP_FEATURES := rtti
+
+++ /dev/null
---- 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
-
+++ /dev/null
---- 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@
+++ /dev/null
---- 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 \
+++ /dev/null
---- 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)",
--- /dev/null
+--- 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
--- /dev/null
+--- 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
--- /dev/null
+--- 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
--- /dev/null
+--- 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
+
--- /dev/null
+--- 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@
--- /dev/null
+--- 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 \
--- /dev/null
+--- 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)",
+++ /dev/null
-target=android-10
+++ /dev/null
-<?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>
+++ /dev/null
-<?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
--- /dev/null
+rootProject.name = "Minetest"
+
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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();
+ }
+}
--- /dev/null
+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;
+}
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="preparing_media">Preparing media...</string>
+</resources>
+
--- /dev/null
+<?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
+++ /dev/null
-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;
- }
-}
+++ /dev/null
-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();
- }
-}
+++ /dev/null
-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;
-}
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"
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"