Android: add Android Studio support, completely redone java part (#9066)
authorMaksim <MoNTE48@mail.ua>
Wed, 15 Apr 2020 14:27:40 +0000 (16:27 +0200)
committerGitHub <noreply@github.com>
Wed, 15 Apr 2020 14:27:40 +0000 (16:27 +0200)
55 files changed:
.gitignore
build/android/.gitignore [new file with mode: 0644]
build/android/Makefile [deleted file]
build/android/app/build.gradle [new file with mode: 0644]
build/android/app/src/main/AndroidManifest.xml [new file with mode: 0644]
build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java [new file with mode: 0644]
build/android/app/src/main/java/net/minetest/minetest/GameActivity.java [new file with mode: 0644]
build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java [new file with mode: 0644]
build/android/app/src/main/java/net/minetest/minetest/MainActivity.java [new file with mode: 0644]
build/android/app/src/main/java/net/minetest/minetest/UnzipService.java [new file with mode: 0644]
build/android/app/src/main/res/drawable/background.png [new file with mode: 0644]
build/android/app/src/main/res/drawable/bg.xml [new file with mode: 0644]
build/android/app/src/main/res/layout/activity_main.xml [new file with mode: 0644]
build/android/app/src/main/res/mipmap/ic_launcher.png [new file with mode: 0644]
build/android/app/src/main/res/values/strings.xml [new file with mode: 0644]
build/android/app/src/main/res/values/styles.xml [new file with mode: 0644]
build/android/build.gradle
build/android/gradle.properties
build/android/gradle/wrapper/gradle-wrapper.jar
build/android/gradle/wrapper/gradle-wrapper.properties
build/android/gradlew
build/android/gradlew.bat
build/android/jni/Android.mk [deleted file]
build/android/jni/Application.mk [deleted file]
build/android/jni/Deps.mk [deleted file]
build/android/jni/Irrlicht.mk [deleted file]
build/android/native/build.gradle [new file with mode: 0644]
build/android/native/jni/Android.mk [new file with mode: 0644]
build/android/native/jni/Application.mk [new file with mode: 0644]
build/android/native/src/main/AndroidManifest.xml [new file with mode: 0644]
build/android/patches/irrlicht-back_button.patch [deleted file]
build/android/patches/irrlicht-native_activity.patch [deleted file]
build/android/patches/irrlicht-texturehack.patch [deleted file]
build/android/patches/irrlicht-touchcount.patch [deleted file]
build/android/patches/libvorbis-libogg-fpu.patch [deleted file]
build/android/patches/openssl_arch.patch [deleted file]
build/android/settings.gradle
build/android/src/main/AndroidManifest.xml [deleted file]
build/android/src/main/java/net.minetest.minetest/MainActivity.java [deleted file]
build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java [deleted file]
build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java [deleted file]
build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java [deleted file]
build/android/src/main/res/drawable/background.png [deleted file]
build/android/src/main/res/drawable/bg.xml [deleted file]
build/android/src/main/res/layout/assetcopy.xml [deleted file]
build/android/src/main/res/mipmap/ic_launcher.png [deleted file]
build/android/src/main/res/values-v21/styles.xml [deleted file]
build/android/src/main/res/values/strings.xml [deleted file]
build/android/src/main/res/values/styles.xml [deleted file]
doc/README.android
src/config.h
src/main.cpp
src/porting_android.cpp
src/porting_android.h
src/version.cpp

index aae9bf437c0040a22fe9453921fb9e94eb6106f3..9ab69b30e271c4d4cebe1ff99d666cacfb23d10a 100644 (file)
@@ -3,6 +3,7 @@
 *.swp
 *.bak*
 *.orig
+.DS_Store
 # Vim
 *.vim
 # Kate
@@ -77,17 +78,11 @@ doc/mkdocs/mkdocs.yml
 ## Build files
 CMakeFiles
 Makefile
-!build/android/Makefile
-build/android/path.cfg
-build/android/*.apk
-build/android/.externalNativeBuild
 cmake_install.cmake
 CMakeCache.txt
 CPackConfig.cmake
 CPackSourceConfig.cmake
 src/test_config.h
-src/android_version.h
-src/android_version_githash.h
 src/cmake_config.h
 src/cmake_config_githash.h
 src/unittest/test_world/world.mt
@@ -109,16 +104,3 @@ cmake_config.h
 cmake_config_githash.h
 CMakeDoxy*
 compile_commands.json
-
-## Android build files
-build/android/src/main/assets
-build/android/build
-build/android/deps
-build/android/libs
-build/android/jni/lib
-build/android/jni/src
-build/android/src/main/jniLibs
-build/android/obj
-build/android/local.properties
-build/android/.gradle
-timestamp
diff --git a/build/android/.gitignore b/build/android/.gitignore
new file mode 100644 (file)
index 0000000..e0613f8
--- /dev/null
@@ -0,0 +1,11 @@
+*.iml
+.externalNativeBuild
+.gradle
+app/build
+app/release
+app/src/main/assets
+build
+local.properties
+native/.*
+native/build
+native/deps
diff --git a/build/android/Makefile b/build/android/Makefile
deleted file mode 100644 (file)
index 9ec237a..0000000
+++ /dev/null
@@ -1,763 +0,0 @@
-# build options
-
-OS := $(shell uname)
-
-# compile with GPROF
-# GPROF = 1
-
-# build for build platform
-API = 14
-APP_PLATFORM = android-$(API)
-
-ANDR_ROOT = $(shell pwd)
-PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..)
-APP_ROOT = $(ANDR_ROOT)/src/main
-
-VERSION_MAJOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
-       grep ^set\(VERSION_MAJOR\ | sed 's/)/ /' | cut -f2 -d' ')
-VERSION_MINOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
-       grep ^set\(VERSION_MINOR\ | sed 's/)/ /' | cut -f2 -d' ')
-VERSION_PATCH := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
-       grep ^set\(VERSION_PATCH\ | sed 's/)/ /' | cut -f2 -d' ')
-
-################################################################################
-# toolchain config for arm new processors
-################################################################################
-TARGET_HOST = arm-linux
-TARGET_ABI = armeabi-v7a
-TARGET_LIBDIR = armeabi-v7a
-TARGET_TOOLCHAIN = arm-linux-androideabi-
-TARGET_CFLAGS_ADDON = -mfloat-abi=softfp -mfpu=vfpv3 -O3
-TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON)
-TARGET_ARCH = armv7
-CROSS_CC = clang
-CROSS_CXX = clang++
-COMPILER_VERSION = clang
-HAVE_LEVELDB = 0
-
-################################################################################
-# toolchain config for little endian mips
-################################################################################
-#TARGET_HOST = mipsel-linux
-#TARGET_ABI = mips
-#TARGET_LIBDIR = mips
-#TARGET_TOOLCHAIN = mipsel-linux-android-
-#TARGET_ARCH = mips32
-#CROSS_CC = mipsel-linux-android-gcc
-#CROSS_CXX = mipsel-linux-android-g++
-#COMPILER_VERSION = 4.9
-#HAVE_LEVELDB = 0
-
-################################################################################
-# toolchain config for x86
-################################################################################
-#TARGET_HOST = x86-linux
-#TARGET_ABI = x86
-#TARGET_LIBDIR = x86
-#TARGET_TOOLCHAIN = x86-
-#TARGET_ARCH = x86
-#CROSS_CC = clang
-#CROSS_CXX = clang++
-#COMPILER_VERSION = clang
-#HAVE_LEVELDB = 0
-
-################################################################################
-ASSETS_TIMESTAMP = deps/assets_timestamp
-
-LEVELDB_DIR = $(ANDR_ROOT)/deps/leveldb/
-LEVELDB_LIB = $(LEVELDB_DIR)libleveldb.a
-LEVELDB_TIMESTAMP = $(LEVELDB_DIR)/timestamp
-LEVELDB_TIMESTAMP_INT = $(ANDR_ROOT)/deps/leveldb_timestamp
-LEVELDB_URL_GIT = https://github.com/google/leveldb
-LEVELDB_COMMIT = 2d0320a458d0e6a20fff46d5f80b18bfdcce7018
-
-OPENAL_DIR = $(ANDR_ROOT)/deps/openal-soft/
-OPENAL_LIB = $(OPENAL_DIR)libs/$(TARGET_ABI)/libopenal.so
-OPENAL_TIMESTAMP = $(OPENAL_DIR)/timestamp
-OPENAL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openal_timestamp
-OPENAL_URL_GIT = https://github.com/apportable/openal-soft
-
-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 = $(ANDR_ROOT)/deps/ogg_timestamp
-OGG_URL_GIT = https://gitlab.com/minetest/libvorbis-libogg-android
-
-IRRLICHT_REVISION = 5150
-IRRLICHT_DIR = $(ANDR_ROOT)/deps/irrlicht/
-IRRLICHT_LIB = $(IRRLICHT_DIR)lib/Android/libIrrlicht.a
-IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp
-IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp
-IRRLICHT_URL_SVN = https://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION)
-
-OPENSSL_VERSION = 1.0.2n
-OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION)
-OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/
-OPENSSL_LIB = $(OPENSSL_DIR)/libssl.a
-OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp
-OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp
-OPENSSL_URL = https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz
-
-CURL_VERSION = 7.60.0
-CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION)
-CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a
-CURL_TIMESTAMP = $(CURL_DIR)/timestamp
-CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp
-CURL_URL_HTTP = https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2
-
-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 = $(ANDR_ROOT)/deps/freetype_timestamp
-FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
-
-ICONV_VERSION = 1.16
-ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/
-ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so
-ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
-ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp
-ICONV_URL_HTTP = https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
-
-SQLITE3_FOLDER = sqlite-amalgamation-3240000
-SQLITE3_URL = https://www.sqlite.org/2018/$(SQLITE3_FOLDER).zip
-
-ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
-ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
-
-#use interim target variable to switch leveldb on or off
-ifeq ($(HAVE_LEVELDB),1)
-       LEVELDB_TARGET = $(LEVELDB_LIB)
-endif
-
-.PHONY : debug release reconfig delconfig \
-       leveldb_download clean_leveldb leveldb\
-       irrlicht_download clean_irrlicht irrlicht \
-       clean_assets assets sqlite3_download \
-       freetype_download clean_freetype freetype \
-       apk clean_apk \
-       clean_all clean prep_srcdir \
-       install_debug install_release envpaths all \
-       $(ASSETS_TIMESTAMP) $(LEVELDB_TIMESTAMP) \
-       $(OPENAL_TIMESTAMP) $(OGG_TIMESTAMP) \
-       $(IRRLICHT_TIMESTAMP) $(CURL_TIMESTAMP) \
-       $(OPENSSL_TIMESTAMP) \
-       $(ANDR_ROOT)/jni/src/android_version.h \
-       $(ANDR_ROOT)/jni/src/android_version_githash.h
-
-debug : local.properties
-       export NDEBUG=;                                                            \
-       export BUILD_TYPE=debug;                                                   \
-       $(MAKE) apk
-
-all : debug release
-
-release : local.properties
-       @export NDEBUG=1;                                                          \
-       export BUILD_TYPE=release;                                                 \
-       $(MAKE) apk
-
-reconfig: delconfig
-       @$(MAKE) local.properties
-
-delconfig:
-       $(RM) local.properties
-
-local.properties:
-       @echo "Please specify path of ANDROID NDK";                                \
-       echo "e.g. $$HOME/Android/Sdk/ndk-bundle/";                                \
-       read ANDROID_NDK ;                                                         \
-       if [ ! -d $$ANDROID_NDK ] ; then                                           \
-               echo "$$ANDROID_NDK is not a valid folder";                            \
-               exit 1;                                                                \
-       fi;                                                                        \
-       echo "ndk.dir = $$ANDROID_NDK" > local.properties;                         \
-       echo "Please specify path of ANDROID SDK";                                 \
-       echo "e.g. $$HOME/Android/Sdk/";                                           \
-       read SDKFLDR ;                                                             \
-       if [ ! -d $$SDKFLDR ] ; then                                               \
-               echo "$$SDKFLDR is not a valid folder";                                \
-               exit 1;                                                                \
-       fi;                                                                        \
-       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" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${OPENAL_TIMESTAMP};                                            \
-       fi
-
-openal_download :
-       @if [ ! -d ${OPENAL_DIR} ] ; then                                          \
-               echo "openal sources missing, downloading...";                         \
-               mkdir -p ${ANDR_ROOT}/deps;                                            \
-               cd ${ANDR_ROOT}/deps ;                                                 \
-               git clone ${OPENAL_URL_GIT} || exit 1;                                 \
-       fi
-
-openal : $(OPENAL_LIB)
-
-$(OPENAL_LIB): $(OPENAL_TIMESTAMP)
-       + @REFRESH=0;                                                                \
-       if [ ! -e ${OPENAL_TIMESTAMP_INT} ] ; then                                 \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${OPENAL_TIMESTAMP} -nt ${OPENAL_TIMESTAMP_INT} ] ; then              \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       echo "changed timestamp for openal detected building...";                  \
-       cd ${OPENAL_DIR};                                                          \
-       export APP_PLATFORM=${APP_PLATFORM};                                       \
-       export TARGET_ABI=${TARGET_ABI};                                           \
-       export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}";                       \
-       export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}";                   \
-       export COMPILER_VERSION=${COMPILER_VERSION};                               \
-       ${ANDROID_NDK}/ndk-build                                                   \
-               NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1;                 \
-       touch ${OPENAL_TIMESTAMP};                                                 \
-       touch ${OPENAL_TIMESTAMP_INT};                                             \
-       else                                                                       \
-               echo "nothing to be done for openal";                                  \
-       fi
-
-clean_openal :
-       $(RM) -rf ${OPENAL_DIR}
-
-$(OGG_TIMESTAMP) : ogg_download
-       @LAST_MODIF=$$(find ${OGG_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${OGG_TIMESTAMP};                                                \
-       fi
-
-ogg_download :
-       @if [ ! -d ${OGG_DIR} ] ; then                                             \
-               echo "ogg sources missing, downloading...";                            \
-               mkdir -p ${ANDR_ROOT}/deps;                                            \
-               cd ${ANDR_ROOT}/deps ;                                                 \
-               git clone ${OGG_URL_GIT}|| exit 1;                                     \
-               cd libvorbis-libogg-android ;                                          \
-               patch -p1 < ${ANDR_ROOT}/patches/libvorbis-libogg-fpu.patch || exit 1; \
-       fi
-
-ogg : $(OGG_LIB)
-
-$(OGG_LIB): $(OGG_TIMESTAMP)
-       + @REFRESH=0;                                                                \
-       if [ ! -e ${OGG_TIMESTAMP_INT} ] ; then                                    \
-               echo "${OGG_TIMESTAMP_INT} doesn't exist";                             \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${OGG_TIMESTAMP} -nt ${OGG_TIMESTAMP_INT} ] ; then                    \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       echo "changed timestamp for ogg detected building...";                     \
-       cd ${OGG_DIR};                                                             \
-       export APP_PLATFORM=${APP_PLATFORM};                                       \
-       export TARGET_ABI=${TARGET_ABI};                                           \
-       ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
-               --platform=${APP_PLATFORM}                                             \
-               --install-dir=$${TOOLCHAIN};                                           \
-       touch ${OGG_TIMESTAMP};                                                    \
-       touch ${OGG_TIMESTAMP_INT};                                                \
-       else                                                                       \
-               echo "nothing to be done for libogg/libvorbis";                        \
-       fi
-
-clean_ogg :
-       $(RM) -rf ${OGG_DIR}
-
-$(OPENSSL_TIMESTAMP) : openssl_download
-       @LAST_MODIF=$$(find ${OPENSSL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${OPENSSL_TIMESTAMP};                                            \
-       fi
-
-openssl_download :
-       @if [ ! -d ${OPENSSL_DIR} ] ; then                                         \
-               echo "openssl sources missing, downloading...";                        \
-               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 < ${ANDR_ROOT}/patches/openssl_arch.patch;                   \
-               sed -i 's/-mandroid //g' Configure;                                    \
-       fi
-
-openssl : $(OPENSSL_LIB)
-
-$(OPENSSL_LIB): $(OPENSSL_TIMESTAMP)
-       @REFRESH=0;                                                                \
-       if [ ! -e ${OPENSSL_TIMESTAMP_INT} ] ; then                                \
-               echo "${OPENSSL_TIMESTAMP_INT} doesn't exist";                         \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${OPENSSL_TIMESTAMP} -nt ${OPENSSL_TIMESTAMP_INT} ] ; then            \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       echo "changed timestamp for openssl detected building...";                 \
-       cd ${OPENSSL_DIR};                                                         \
-       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}                     \
-               --platform=${APP_PLATFORM}                                             \
-               --stl=libc++                                                           \
-               --install-dir=$${TOOLCHAIN};                                           \
-       export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
-       export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}";                         \
-       export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}";                      \
-       CC=${CROSS_CC} ./Configure -DL_ENDIAN no-asm android-${TARGET_ARCH}        \
-               -D__ANDROID_API__=$(API);                                          \
-       CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make depend;            \
-       CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make build_libs;        \
-       touch ${OPENSSL_TIMESTAMP};                                                \
-       touch ${OPENSSL_TIMESTAMP_INT};                                            \
-       $(RM) -rf $${TOOLCHAIN};                                                   \
-       else                                                                       \
-               echo "nothing to be done for openssl";                        \
-       fi
-
-clean_openssl :
-       $(RM) -rf ${OPENSSL_DIR};                                                  \
-       $(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" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${LEVELDB_TIMESTAMP};                                            \
-       fi
-
-leveldb_download :
-       @if [ ! -d ${LEVELDB_DIR} ] ; then                                         \
-               echo "leveldb sources missing, downloading...";                        \
-               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;                              \
-       fi
-
-leveldb : $(LEVELDB_LIB)
-ifeq ($(HAVE_LEVELDB),1)
-$(LEVELDB_LIB): $(LEVELDB_TIMESTAMP)
-       @REFRESH=0;                                                                \
-       if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then                                \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${LEVELDB_TIMESTAMP} -nt ${LEVELDB_TIMESTAMP_INT} ] ; then            \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       echo "changed timestamp for leveldb detected building...";                 \
-       cd deps/leveldb;                                                           \
-       export CROSS_PREFIX=${TARGET_TOOLCHAIN};                                   \
-       export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb;                          \
-       ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
-               --platform=${APP_PLATFORM}                                             \
-               --stl=libc++                                                           \
-               --install-dir=$${TOOLCHAIN};                                           \
-       export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
-       export CC=${CROSS_CC};                                                     \
-       export CXX=${CROSS_CXX};                                                   \
-       export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}";                         \
-       export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}";                   \
-       export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}";                      \
-       export TARGET_OS=OS_ANDROID_CROSSCOMPILE;                                  \
-       $(MAKE) || exit 1;                                                      \
-       touch ${LEVELDB_TIMESTAMP};                                                \
-       touch ${LEVELDB_TIMESTAMP_INT};                                            \
-       $(RM) -rf $${TOOLCHAIN};                                                   \
-       else                                                                       \
-               echo "nothing to be done for leveldb";                                 \
-       fi
-endif
-
-clean_leveldb :
-       ./gradlew cleanLevelDB
-
-$(FREETYPE_TIMESTAMP) : freetype_download
-       @LAST_MODIF=$$(find ${FREETYPE_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${FREETYPE_TIMESTAMP};                                           \
-       fi
-
-freetype_download :
-       @if [ ! -d ${FREETYPE_DIR} ] ; then                                        \
-               echo "freetype sources missing, downloading...";                       \
-               mkdir -p ${ANDR_ROOT}/deps;                                            \
-               cd deps;                                                               \
-               git clone ${FREETYPE_URL_GIT} || exit 1;                               \
-       fi
-
-freetype : $(FREETYPE_LIB)
-
-$(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP)
-       + @REFRESH=0;                                                                \
-       if [ ! -e ${FREETYPE_TIMESTAMP_INT} ] ; then                               \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ! -e ${FREETYPE_LIB} ] ; then                                         \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${FREETYPE_TIMESTAMP} -nt ${FREETYPE_TIMESTAMP_INT} ] ; then          \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       mkdir -p ${FREETYPE_DIR};                                                  \
-       echo "changed timestamp for freetype detected building...";                \
-       cd ${FREETYPE_DIR}/Android/jni;                                            \
-       export APP_PLATFORM=${APP_PLATFORM};                                       \
-       export TARGET_ABI=${TARGET_ABI};                                           \
-       export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}";                       \
-       export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}";                   \
-       export COMPILER_VERSION=${COMPILER_VERSION};                               \
-       ${ANDROID_NDK}/ndk-build                                                   \
-               NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1;                 \
-       touch ${FREETYPE_TIMESTAMP};                                               \
-       touch ${FREETYPE_TIMESTAMP_INT};                                           \
-       else                                                                       \
-               echo "nothing to be done for freetype";                                \
-       fi
-
-clean_freetype :
-       ./gradlew cleanFreetype
-
-$(ICONV_TIMESTAMP) : iconv_download
-       @LAST_MODIF=$$(find ${ICONV_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${ICONV_TIMESTAMP};                                           \
-       fi
-
-iconv_download :
-       @if [ ! -d ${ICONV_DIR} ] ; then                                           \
-               echo "iconv sources missing, downloading...";                      \
-               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;                          \
-       fi
-
-iconv : $(ICONV_LIB)
-
-$(ICONV_LIB) : $(ICONV_TIMESTAMP)
-       @REFRESH=0;                                                                \
-       if [ ! -e ${ICONV_TIMESTAMP_INT} ] ; then                                  \
-               REFRESH=1;                                                         \
-       fi;                                                                        \
-       if [ ! -e ${ICONV_LIB} ] ; then                                            \
-               REFRESH=1;                                                         \
-       fi;                                                                        \
-       if [ ${ICONV_TIMESTAMP} -nt ${ICONV_TIMESTAMP_INT} ] ; then                \
-               REFRESH=1;                                                         \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       mkdir -p ${ICONV_DIR};                                                     \
-       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}                     \
-               --platform=${APP_PLATFORM}                                             \
-               --stl=libc++                                                           \
-               --install-dir=$${TOOLCHAIN};                                           \
-       export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
-       export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}";                         \
-       export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON} -lstdc++";             \
-       export CC=${CROSS_CC};                                                     \
-       export CXX=${CROSS_CXX};                                                   \
-       export TARGET_OS=OS_ANDROID_CROSSCOMPILE;                                  \
-       ./configure --host=${TARGET_HOST} || exit 1;                               \
-       sed -i 's/LIBICONV_VERSION_INFO) /LIBICONV_VERSION_INFO) -avoid-version /g' lib/Makefile; \
-       grep "iconv_LDFLAGS" src/Makefile;                                         \
-       $(MAKE) -s || exit 1;                                                      \
-       touch ${ICONV_TIMESTAMP};                                                  \
-       touch ${ICONV_TIMESTAMP_INT};                                              \
-       rm -rf ${TOOLCHAIN};                                                       \
-       else                                                                       \
-               echo "nothing to be done for iconv";                               \
-       fi
-
-clean_iconv :
-       ./gradlew cleanIconv
-
-#Note: Texturehack patch is required for gpu's not supporting color format
-#      correctly. Known bad GPU:
-#      -geforce on emulator
-#      -Vivante Corporation GC1000 core (e.g. Galaxy Tab 3)
-
-irrlicht_download :
-       @if [ ! -d "deps/irrlicht" ] ; then                                        \
-               echo "irrlicht sources missing, downloading...";                       \
-               mkdir -p ${ANDR_ROOT}/deps;                                            \
-               cd deps;                                                               \
-               svn co ${IRRLICHT_URL_SVN} irrlicht || exit 1;                         \
-               cd irrlicht;                                                           \
-               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; \
-               patch -p1 < ${ANDR_ROOT}/patches/irrlicht-native_activity.patch || exit 1; \
-       fi
-
-$(IRRLICHT_TIMESTAMP) : irrlicht_download
-       @LAST_MODIF=$$(find ${IRRLICHT_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${IRRLICHT_TIMESTAMP};                                           \
-       fi
-
-irrlicht : $(IRRLICHT_LIB)
-
-$(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB)
-       + @REFRESH=0;                                                                \
-       if [ ! -e ${IRRLICHT_TIMESTAMP_INT} ] ; then                               \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ! -e ${IRRLICHT_LIB} ] ; then                                         \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${IRRLICHT_TIMESTAMP} -nt ${IRRLICHT_TIMESTAMP_INT} ] ; then          \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       mkdir -p ${IRRLICHT_DIR};                                                  \
-       echo "changed timestamp for irrlicht detected building...";                \
-       cd deps/irrlicht/source/Irrlicht/Android;                                  \
-       export APP_PLATFORM=${APP_PLATFORM};                                       \
-       export TARGET_ABI=${TARGET_ABI};                                           \
-       export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}";                       \
-       export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}";                   \
-       export COMPILER_VERSION=${COMPILER_VERSION};                               \
-       ${ANDROID_NDK}/ndk-build                                                   \
-               NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1;                 \
-       touch ${IRRLICHT_TIMESTAMP};                                               \
-       touch ${IRRLICHT_TIMESTAMP_INT};                                           \
-       else                                                                       \
-               echo "nothing to be done for irrlicht";                                \
-       fi
-
-clean_irrlicht :
-       ./gradlew cleanIrrlicht
-
-$(CURL_TIMESTAMP) : curl_download
-       @LAST_MODIF=$$(find ${CURL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${CURL_TIMESTAMP};                                               \
-       fi
-
-curl_download :
-       @if [ ! -d "deps/curl-${CURL_VERSION}" ] ; then                            \
-               echo "curl sources missing, downloading...";                           \
-               mkdir -p ${ANDR_ROOT}/deps;                                            \
-               cd deps;                                                               \
-               wget ${CURL_URL_HTTP} || exit 1;                                       \
-               tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1;                       \
-               rm curl-${CURL_VERSION}.tar.bz2;                                       \
-               ln -s curl-${CURL_VERSION} curl;                                       \
-       fi
-
-curl : $(CURL_LIB)
-
-$(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB)
-       @REFRESH=0;                                                                \
-       if [ ! -e ${CURL_TIMESTAMP_INT} ] ; then                                   \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ! -e ${CURL_LIB} ] ; then                                             \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${CURL_TIMESTAMP} -nt ${CURL_TIMESTAMP_INT} ] ; then                  \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       mkdir -p ${CURL_DIR};                                                      \
-       echo "changed timestamp for curl detected building...";                    \
-       cd deps/curl-${CURL_VERSION};                                              \
-       export CROSS_PREFIX=${TARGET_TOOLCHAIN};                                   \
-       export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl;                             \
-       ${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
-               --toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
-               --platform=${APP_PLATFORM}                                             \
-               --stl=libc++                                                           \
-               --install-dir=$${TOOLCHAIN};                                           \
-       export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
-       export CC=${CROSS_CC};                                                     \
-       export CXX=${CROSS_CXX};                                                   \
-       export TARGET_OS=OS_ANDROID_CROSSCOMPILE;                                  \
-       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;  \
-       $(MAKE) -s || exit 1;                                                      \
-       touch ${CURL_TIMESTAMP};                                                   \
-       touch ${CURL_TIMESTAMP_INT};                                               \
-       $(RM) -rf $${TOOLCHAIN};                                                   \
-       else                                                                       \
-               echo "nothing to be done for curl";                                    \
-       fi
-
-clean_curl :
-       ./gradlew cleanCURL
-
-sqlite3_download: deps/${SQLITE3_FOLDER}/sqlite3.c
-
-deps/${SQLITE3_FOLDER}/sqlite3.c :
-       cd deps;                                                                    \
-       wget ${SQLITE3_URL};                                                        \
-       unzip ${SQLITE3_FOLDER}.zip;                                                \
-       ln -s ${SQLITE3_FOLDER} sqlite;                                             \
-       cd ${SQLITE3_FOLDER};
-
-clean_sqlite3:
-       ./gradlew cleanSQLite3
-
-$(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB)
-       @mkdir -p ${ANDR_ROOT}/deps;                                                \
-       for DIRNAME in {builtin,client,doc,fonts,games,mods,po,textures}; do        \
-               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 ${PROJ_ROOT}/${DIRNAME}/timestamp;                   \
-                       touch ${ASSETS_TIMESTAMP};                                  \
-                       echo ${DIRNAME} changed $$LAST_MODIF;                       \
-               fi;                                                                 \
-       done;                                                                       \
-       LAST_MODIF=$$(find ${IRRLICHT_DIR}/media -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
-       if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then                     \
-               touch ${IRRLICHT_DIR}/media/timestamp;                                 \
-               touch ${ASSETS_TIMESTAMP};                                             \
-       fi;                                                                        \
-       if [ ${PROJ_ROOT}/minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then   \
-               echo "conf changed";                                                   \
-               touch ${ASSETS_TIMESTAMP};                                             \
-       fi;                                                                        \
-       if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then              \
-               touch ${ASSETS_TIMESTAMP};                                             \
-       fi;                                                                        \
-       if [ ! -e $(ASSETS_TIMESTAMP) ] ; then                                     \
-               touch $(ASSETS_TIMESTAMP);                                             \
-       fi
-
-assets : $(ASSETS_TIMESTAMP)
-       @REFRESH=0;                                                                \
-       if [ ! -e ${ASSETS_TIMESTAMP}.old ] ; then                                 \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then              \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ ! -d ${APP_ROOT}/assets ] ; then                                      \
-               REFRESH=1;                                                             \
-       fi;                                                                        \
-       if [ $$REFRESH -ne 0 ] ; then                                              \
-       echo "assets changed, refreshing...";                                      \
-       $(MAKE) clean_assets;                                                      \
-       ./gradlew copyAssets;                                                      \
-       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 "*.git" -exec rm -rf {} \; ;                          \
-       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 -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 :
-       ./gradlew cleanAssets
-
-apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_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
-       + @export TARGET_LIBDIR=${TARGET_LIBDIR};                                  \
-       export HAVE_LEVELDB=${HAVE_LEVELDB};                                       \
-       export APP_PLATFORM=${APP_PLATFORM};                                       \
-       export TARGET_ABI=${TARGET_ABI};                                           \
-       export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}";                       \
-       export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}";                   \
-       export COMPILER_VERSION=${COMPILER_VERSION};                               \
-       export GPROF=${GPROF};                                                     \
-       ${ANDROID_NDK}/ndk-build || 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&/') &&          \
-       ./gradlew assemble$$BUILD_TYPE_C &&                                           \
-       echo "APK stored at: build/outputs/apk/$$BUILD_TYPE/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/debug/Minetest-debug.apk
-
-install_release:
-       ${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/release/Minetest-release.apk
-
-prep_srcdir :
-       @if [ ! -e ${ANDR_ROOT}/jni/src ]; then                                    \
-               ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src;                           \
-       fi;                                                                        \
-       if [ ! -e ${ANDR_ROOT}/jni/lib ]; then                                     \
-               ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib;                           \
-       fi
-
-clean_apk :
-       ./gradlew clean
-
-clean_all :
-       ./gradlew cleanAll
-
-$(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";                               \
-       echo "#define ANDROID_MT_VERSION_GITHASH_H";                               \
-       export GITHASH=$$(git rev-parse --short=8 HEAD);                           \
-       export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}";   \
-       echo "#define VERSION_GITHASH \"$$VERSION_STR-$$GITHASH-Android\"";        \
-       echo "#endif";                                                             \
-       } > "$${VERSION_FILE_NEW}";                                                \
-       if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then                    \
-               echo "android_version_githash.h changed, updating...";             \
-               mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}";                      \
-       else                                                                       \
-               rm "$${VERSION_FILE_NEW}";                                         \
-       fi
-
-
-$(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";                                       \
-       echo "#define ANDROID_MT_VERSION_H";                                       \
-       echo "#define VERSION_MAJOR ${VERSION_MAJOR}";                             \
-       echo "#define VERSION_MINOR ${VERSION_MINOR}";                             \
-       echo "#define VERSION_PATCH ${VERSION_PATCH}";                             \
-       echo "#define VERSION_STRING STR(VERSION_MAJOR) \".\" STR(VERSION_MINOR) \
-       \".\" STR(VERSION_PATCH)";                                                 \
-       echo "#endif";                                                             \
-       } > $${VERSION_FILE_NEW};                                                  \
-       if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then                    \
-               echo "android_version.h changed, updating...";                     \
-               mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}";                      \
-       else                                                                       \
-               rm "$${VERSION_FILE_NEW}";                                         \
-       fi
-
-clean : clean_apk clean_assets
diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle
new file mode 100644 (file)
index 0000000..6a34a6d
--- /dev/null
@@ -0,0 +1,108 @@
+apply plugin: 'com.android.application'
+android {
+       compileSdkVersion 29
+       buildToolsVersion '29.0.3'
+       ndkVersion '21.0.6113669'
+       defaultConfig {
+               applicationId 'net.minetest.minetest'
+               minSdkVersion 16
+               //noinspection OldTargetApi
+               targetSdkVersion 28 // Workaround for using `/sdcard` instead of the `data` patch for assets
+               versionName "${versionMajor}.${versionMinor}.${versionPatch}"
+               versionCode project.versionCode
+       }
+
+       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 {
+                               minifyEnabled true
+                               signingConfig signingConfigs.release
+                       }
+               }
+       }
+
+       // for multiple APKs
+       splits {
+               abi {
+                       enable true
+                       reset()
+                       include 'armeabi-v7a', 'arm64-v8a'
+               }
+       }
+
+       compileOptions {
+               sourceCompatibility JavaVersion.VERSION_1_8
+               targetCompatibility JavaVersion.VERSION_1_8
+       }
+}
+
+task prepareAssets() {
+       def assetsFolder = "build/assets"
+       def projRoot = "../../.."
+       def gameToCopy = "minetest_game"
+
+       copy {
+               from "${projRoot}/minetest.conf.example", "${projRoot}/README.md" into assetsFolder
+       }
+       copy {
+               from "${projRoot}/doc/lgpl-2.1.txt" into "${assetsFolder}"
+               rename("lgpl-2.1.txt", "LICENSE.txt")
+       }
+       copy {
+               from "${projRoot}/builtin" into "${assetsFolder}/builtin"
+       }
+       copy {
+               from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders"
+       }
+       copy {
+               from "${projRoot}/fonts" include "*.ttf" into "${assetsFolder}/fonts"
+       }
+       copy {
+               from "${projRoot}/games/${gameToCopy}" into "${assetsFolder}/games/${gameToCopy}"
+       }
+       /*copy {
+               // locales broken right now
+               // ToDo: fix it!
+               from "${projRoot}/po" into "${assetsFolder}/po"
+       }*/
+       copy {
+               from "${projRoot}/textures" into "${assetsFolder}/textures"
+       }
+
+       task zipAssets(type: Zip) {
+               archiveName "Minetest.zip"
+               from "${assetsFolder}"
+               destinationDir file("src/main/assets")
+       }
+}
+
+preBuild.dependsOn zipAssets
+
+// Map for the version code that gives each ABI a value.
+import com.android.build.OutputFile
+
+def abiCodes = ['armeabi-v7a': 0, 'arm64-v8a': 1]
+android.applicationVariants.all { variant ->
+       variant.outputs.each {
+               output ->
+                       def abiName = output.getFilter(OutputFile.ABI)
+                       output.versionCodeOverride = abiCodes.get(abiName, 0) + variant.versionCode
+       }
+}
+
+dependencies {
+       implementation project(':native')
+       implementation 'androidx.appcompat:appcompat:1.1.0'
+}
diff --git a/build/android/app/src/main/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..3a53427
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:tools="http://schemas.android.com/tools"
+       package="net.minetest.minetest"
+       android:installLocation="auto">
+
+       <uses-permission android:name="android.permission.INTERNET" />
+       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+       <application
+               android:allowBackup="false"
+               android:icon="@mipmap/ic_launcher"
+               android:label="@string/label"
+               android:resizeableActivity="false"
+               tools:ignore="UnusedAttribute">
+
+               <meta-data
+                       android:name="android.max_aspect"
+                       android:value="3" />
+
+               <activity
+                       android:name=".MainActivity"
+                       android:configChanges="orientation|keyboardHidden|navigation|screenSize"
+                       android:maxAspectRatio="3"
+                       android:screenOrientation="sensorLandscape"
+                       android:theme="@style/AppTheme">
+                       <intent-filter>
+                               <action android:name="android.intent.action.MAIN" />
+                               <category android:name="android.intent.category.LAUNCHER" />
+                       </intent-filter>
+               </activity>
+
+               <activity
+                       android:name=".GameActivity"
+                       android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize|smallestScreenSize"
+                       android:hardwareAccelerated="true"
+                       android:launchMode="singleTask"
+                       android:maxAspectRatio="3"
+                       android:screenOrientation="sensorLandscape"
+                       android:theme="@style/AppTheme">
+                       <intent-filter>
+                               <action android:name="android.intent.action.MAIN" />
+                       </intent-filter>
+                       <meta-data
+                               android:name="android.app.lib_name"
+                               android:value="Minetest" />
+               </activity>
+
+               <activity
+                       android:name=".InputDialogActivity"
+                       android:maxAspectRatio="3"
+                       android:theme="@style/InputTheme" />
+
+               <service
+                       android:name=".UnzipService"
+                       android:enabled="true"
+                       android:exported="false" />
+       </application>
+
+</manifest>
diff --git a/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java b/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java
new file mode 100644 (file)
index 0000000..7709955
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+Minetest
+Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
+Copyright (C) 2014-2020 ubulem,  Bektur Mambetov <berkut87@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+package net.minetest.minetest;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.util.Log;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.ref.WeakReference;
+
+public class CopyZipTask extends AsyncTask<String, Void, String> {
+
+       private final WeakReference<Context> contextRef;
+
+       CopyZipTask(Context context) {
+               contextRef = new WeakReference<>(context);
+       }
+
+       protected String doInBackground(String... params) {
+               copyAssets(params);
+               return params[0];
+       }
+
+       @Override
+       protected void onPostExecute(String result) {
+               startUnzipService(result);
+       }
+
+       private void copyAsset(String zipName) throws IOException {
+               String filename = zipName.substring(zipName.lastIndexOf("/") + 1);
+               try (InputStream in = contextRef.get().getAssets().open(filename);
+                    OutputStream out = new FileOutputStream(zipName)) {
+                       copyFile(in, out);
+               }
+       }
+
+       private void copyAssets(String[] zips) {
+               try {
+                       for (String zipName : zips)
+                               copyAsset(zipName);
+               } catch (IOException e) {
+                       Log.e("CopyZipTask", e.getLocalizedMessage());
+                       cancel(true);
+               }
+       }
+
+       private void copyFile(InputStream in, OutputStream out) throws IOException {
+               byte[] buffer = new byte[1024];
+               int read;
+               while ((read = in.read(buffer)) != -1)
+                       out.write(buffer, 0, read);
+       }
+
+       private void startUnzipService(String file) {
+               Intent intent = new Intent(contextRef.get(), UnzipService.class);
+               intent.putExtra(UnzipService.EXTRA_KEY_IN_FILE, file);
+               contextRef.get().startService(intent);
+       }
+}
diff --git a/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java
new file mode 100644 (file)
index 0000000..02b61b5
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+Minetest
+Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
+Copyright (C) 2014-2020 ubulem,  Bektur Mambetov <berkut87@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+package net.minetest.minetest;
+
+import android.app.NativeActivity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+
+public class GameActivity extends NativeActivity {
+       static {
+               System.loadLibrary("c++_shared");
+               System.loadLibrary("Minetest");
+       }
+
+       private int messageReturnCode;
+       private String messageReturnValue;
+
+       public static native void putMessageBoxResult(String text);
+
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+               messageReturnCode = -1;
+               messageReturnValue = "";
+       }
+
+       private void makeFullScreen() {
+               if (Build.VERSION.SDK_INT >= 19)
+                       this.getWindow().getDecorView().setSystemUiVisibility(
+                                       View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+                                       View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+                                       View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+       }
+
+       @Override
+       public void onWindowFocusChanged(boolean hasFocus) {
+               super.onWindowFocusChanged(hasFocus);
+               if (hasFocus)
+                       makeFullScreen();
+       }
+
+       @Override
+       protected void onResume() {
+               super.onResume();
+               makeFullScreen();
+       }
+
+       @Override
+       public void onBackPressed() {
+               // Ignore the back press so Minetest can handle it
+       }
+
+       @Override
+       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+               if (requestCode == 101) {
+                       if (resultCode == RESULT_OK) {
+                               String text = data.getStringExtra("text");
+                               messageReturnCode = 0;
+                               messageReturnValue = text;
+                       } else
+                               messageReturnCode = 1;
+               }
+       }
+
+       public void showDialog(String acceptButton, String hint, String current, int editType) {
+               Intent intent = new Intent(this, InputDialogActivity.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);
+               messageReturnValue = "";
+               messageReturnCode = -1;
+       }
+
+       public int getDialogState() {
+               return messageReturnCode;
+       }
+
+       public String getDialogValue() {
+               messageReturnCode = -1;
+               return messageReturnValue;
+       }
+
+       public float getDensity() {
+               return getResources().getDisplayMetrics().density;
+       }
+
+       public int getDisplayHeight() {
+               return getResources().getDisplayMetrics().heightPixels;
+       }
+
+       public int getDisplayWidth() {
+               return getResources().getDisplayMetrics().widthPixels;
+       }
+}
diff --git a/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java b/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java
new file mode 100644 (file)
index 0000000..7c6aa11
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+Minetest
+Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
+Copyright (C) 2014-2020 ubulem,  Bektur Mambetov <berkut87@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+package net.minetest.minetest;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+
+import java.util.Objects;
+
+public class InputDialogActivity extends AppCompatActivity {
+       private AlertDialog alertDialog;
+
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               Bundle b = getIntent().getExtras();
+               int editType = Objects.requireNonNull(b).getInt("editType");
+               String hint = b.getString("hint");
+               String current = b.getString("current");
+               final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+               EditText editText = new EditText(this);
+               builder.setView(editText);
+               editText.requestFocus();
+               editText.setHint(hint);
+               editText.setText(current);
+               final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
+               Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED,
+                               InputMethodManager.HIDE_IMPLICIT_ONLY);
+               if (editType == 3)
+                       editText.setInputType(InputType.TYPE_CLASS_TEXT |
+                                       InputType.TYPE_TEXT_VARIATION_PASSWORD);
+               else
+                       editText.setInputType(InputType.TYPE_CLASS_TEXT);
+               editText.setOnKeyListener((view, KeyCode, event) -> {
+                       if (KeyCode == KeyEvent.KEYCODE_ENTER) {
+                               imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
+                               pushResult(editText.getText().toString());
+                               return true;
+                       }
+                       return false;
+               });
+               alertDialog = builder.create();
+               if (!this.isFinishing())
+                       alertDialog.show();
+               alertDialog.setOnCancelListener(dialog -> {
+                       pushResult(editText.getText().toString());
+                       setResult(Activity.RESULT_CANCELED);
+                       alertDialog.dismiss();
+                       makeFullScreen();
+                       finish();
+               });
+       }
+
+       private void pushResult(String text) {
+               Intent resultData = new Intent();
+               resultData.putExtra("text", text);
+               setResult(AppCompatActivity.RESULT_OK, resultData);
+               alertDialog.dismiss();
+               makeFullScreen();
+               finish();
+       }
+
+       private void makeFullScreen() {
+               if (Build.VERSION.SDK_INT >= 19)
+                       this.getWindow().getDecorView().setSystemUiVisibility(
+                                       View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+                                                       View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+                                                       View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+       }
+}
diff --git a/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java b/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java
new file mode 100644 (file)
index 0000000..f37ae6d
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+Minetest
+Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
+Copyright (C) 2014-2020 ubulem,  Bektur Mambetov <berkut87@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+package net.minetest.minetest;
+
+import android.Manifest;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity {
+       private final static int versionCode = BuildConfig.VERSION_CODE;
+       private final static int PERMISSIONS = 1;
+       private static final String[] REQUIRED_SDK_PERMISSIONS =
+                       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
+       private static final String SETTINGS = "MinetestSettings";
+       private static final String TAG_VERSION_CODE = "versionCode";
+       private ProgressBar mProgressBar;
+       private TextView mTextView;
+       private SharedPreferences sharedPreferences;
+       private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
+               @Override
+               public void onReceive(Context context, Intent intent) {
+                       int progress = 0;
+                       if (intent != null)
+                               progress = intent.getIntExtra(UnzipService.ACTION_PROGRESS, 0);
+                       if (progress >= 0) {
+                               if (mProgressBar != null) {
+                                       mProgressBar.setVisibility(View.VISIBLE);
+                                       mProgressBar.setProgress(progress);
+                               }
+                               mTextView.setVisibility(View.VISIBLE);
+                       } else
+                               startNative();
+               }
+       };
+
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               setContentView(R.layout.activity_main);
+               IntentFilter filter = new IntentFilter(UnzipService.ACTION_UPDATE);
+               registerReceiver(myReceiver, filter);
+               mProgressBar = findViewById(R.id.progressBar);
+               mTextView = findViewById(R.id.textView);
+               sharedPreferences = getSharedPreferences(SETTINGS, Context.MODE_PRIVATE);
+               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+                       checkPermission();
+               else
+                       checkAppVersion();
+       }
+
+       private void checkPermission() {
+               final List<String> missingPermissions = new ArrayList<>();
+               for (final String permission : REQUIRED_SDK_PERMISSIONS) {
+                       final int result = ContextCompat.checkSelfPermission(this, permission);
+                       if (result != PackageManager.PERMISSION_GRANTED)
+                               missingPermissions.add(permission);
+               }
+               if (!missingPermissions.isEmpty()) {
+                       final String[] permissions = missingPermissions
+                                       .toArray(new String[0]);
+                       ActivityCompat.requestPermissions(this, permissions, PERMISSIONS);
+               } else {
+                       final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
+                       Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
+                       onRequestPermissionsResult(PERMISSIONS, REQUIRED_SDK_PERMISSIONS, grantResults);
+               }
+       }
+
+       @Override
+       public void onRequestPermissionsResult(int requestCode,
+                                                                       @NonNull String[] permissions, @NonNull int[] grantResults) {
+               if (requestCode == PERMISSIONS) {
+                       for (int grantResult : grantResults) {
+                               if (grantResult != PackageManager.PERMISSION_GRANTED) {
+                                       Toast.makeText(this, R.string.not_granted, Toast.LENGTH_LONG).show();
+                                       finish();
+                               }
+                       }
+                       checkAppVersion();
+               }
+       }
+
+       private void checkAppVersion() {
+               if (sharedPreferences.getInt(TAG_VERSION_CODE, 0) == versionCode)
+                       startNative();
+               else
+                       new CopyZipTask(this).execute(getCacheDir() + "/Minetest.zip");
+       }
+
+       private void startNative() {
+               sharedPreferences.edit().putInt(TAG_VERSION_CODE, versionCode).apply();
+               Intent intent = new Intent(this, GameActivity.class);
+               intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+               startActivity(intent);
+       }
+
+       @Override
+       protected void onDestroy() {
+               super.onDestroy();
+               unregisterReceiver(myReceiver);
+       }
+}
diff --git a/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java
new file mode 100644 (file)
index 0000000..ac91169
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+Minetest
+Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
+Copyright (C) 2014-2020 ubulem,  Bektur Mambetov <berkut87@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+package net.minetest.minetest;
+
+import android.app.IntentService;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Environment;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+public class UnzipService extends IntentService {
+       public static final String ACTION_UPDATE = "net.minetest.minetest.UPDATE";
+       public static final String ACTION_PROGRESS = "net.minetest.minetest.PROGRESS";
+       public static final String EXTRA_KEY_IN_FILE = "file";
+       private static final String TAG = "UnzipService";
+       private final int id = 1;
+       private NotificationManager mNotifyManager;
+
+       public UnzipService() {
+               super("net.minetest.minetest.UnzipService");
+       }
+
+       private void isDir(String dir, String location) {
+               File f = new File(location + dir);
+               if (!f.isDirectory())
+                       f.mkdirs();
+       }
+
+       @Override
+       protected void onHandleIntent(Intent intent) {
+               createNotification();
+               unzip(intent);
+       }
+
+       private void createNotification() {
+               String name = "net.minetest.minetest";
+               String channelId = "Minetest channel";
+               String description = "notifications from Minetest";
+               Notification.Builder builder;
+               if (mNotifyManager == null)
+                       mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                       int importance = NotificationManager.IMPORTANCE_LOW;
+                       NotificationChannel mChannel = null;
+                       if (mNotifyManager != null)
+                               mChannel = mNotifyManager.getNotificationChannel(channelId);
+                       if (mChannel == null) {
+                               mChannel = new NotificationChannel(channelId, name, importance);
+                               mChannel.setDescription(description);
+                               // Configure the notification channel, NO SOUND
+                               mChannel.setSound(null, null);
+                               mChannel.enableLights(false);
+                               mChannel.enableVibration(false);
+                               mNotifyManager.createNotificationChannel(mChannel);
+                       }
+                       builder = new Notification.Builder(this, channelId);
+               } else {
+                       builder = new Notification.Builder(this);
+               }
+               builder.setContentTitle(getString(R.string.notification_title))
+                               .setSmallIcon(R.mipmap.ic_launcher)
+                               .setContentText(getString(R.string.notification_description));
+               mNotifyManager.notify(id, builder.build());
+       }
+
+       private void unzip(Intent intent) {
+               String zip = intent.getStringExtra(EXTRA_KEY_IN_FILE);
+               String location = Environment.getExternalStorageDirectory() + "/Minetest/";
+               int per = 0;
+               int size = getSummarySize(zip);
+               File zipFile = new File(zip);
+               int readLen;
+               byte[] readBuffer = new byte[8192];
+               try (FileInputStream fileInputStream = new FileInputStream(zipFile);
+                    ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)) {
+                       ZipEntry ze;
+                       while ((ze = zipInputStream.getNextEntry()) != null) {
+                               if (ze.isDirectory()) {
+                                       ++per;
+                                       isDir(ze.getName(), location);
+                               } else {
+                                       publishProgress(100 * ++per / size);
+                                       try (OutputStream outputStream = new FileOutputStream(location + ze.getName())) {
+                                               while ((readLen = zipInputStream.read(readBuffer)) != -1) {
+                                                       outputStream.write(readBuffer, 0, readLen);
+                                               }
+                                       }
+                               }
+                               zipFile.delete();
+                       }
+               } catch (FileNotFoundException e) {
+                       Log.e(TAG, e.getLocalizedMessage());
+               } catch (IOException e) {
+                       Log.e(TAG, e.getLocalizedMessage());
+               }
+       }
+
+       private void publishProgress(int progress) {
+               Intent intentUpdate = new Intent(ACTION_UPDATE);
+               intentUpdate.putExtra(ACTION_PROGRESS, progress);
+               sendBroadcast(intentUpdate);
+       }
+
+       private int getSummarySize(String zip) {
+               int size = 0;
+               try {
+                       ZipFile zipSize = new ZipFile(zip);
+                       size += zipSize.size();
+               } catch (IOException e) {
+                       Log.e(TAG, e.getLocalizedMessage());
+               }
+               return size;
+       }
+
+       @Override
+       public void onDestroy() {
+               super.onDestroy();
+               mNotifyManager.cancel(id);
+               publishProgress(-1);
+       }
+}
diff --git a/build/android/app/src/main/res/drawable/background.png b/build/android/app/src/main/res/drawable/background.png
new file mode 100644 (file)
index 0000000..43bd608
Binary files /dev/null and b/build/android/app/src/main/res/drawable/background.png differ
diff --git a/build/android/app/src/main/res/drawable/bg.xml b/build/android/app/src/main/res/drawable/bg.xml
new file mode 100644 (file)
index 0000000..903335e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+       android:src="@drawable/background"
+       android:tileMode="repeat" />
diff --git a/build/android/app/src/main/res/layout/activity_main.xml b/build/android/app/src/main/res/layout/activity_main.xml
new file mode 100644 (file)
index 0000000..e6f461f
--- /dev/null
@@ -0,0 +1,30 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+       android:id="@+id/activity_main"
+       android:layout_width="match_parent"
+       android:layout_height="match_parent"
+       android:background="@drawable/bg">
+
+       <ProgressBar
+               android:id="@+id/progressBar"
+               style="@style/CustomProgressBar"
+               android:layout_width="match_parent"
+               android:layout_height="30dp"
+               android:layout_centerInParent="true"
+               android:layout_marginLeft="90dp"
+               android:layout_marginRight="90dp"
+               android:indeterminate="false"
+               android:max="100"
+               android:visibility="gone" />
+
+       <TextView
+               android:id="@+id/textView"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:layout_below="@id/progressBar"
+               android:layout_centerInParent="true"
+               android:background="@android:color/transparent"
+               android:text="@string/loading"
+               android:textColor="#FEFEFE"
+               android:visibility="gone" />
+
+</RelativeLayout>
diff --git a/build/android/app/src/main/res/mipmap/ic_launcher.png b/build/android/app/src/main/res/mipmap/ic_launcher.png
new file mode 100644 (file)
index 0000000..88a8378
Binary files /dev/null and b/build/android/app/src/main/res/mipmap/ic_launcher.png differ
diff --git a/build/android/app/src/main/res/values/strings.xml b/build/android/app/src/main/res/values/strings.xml
new file mode 100644 (file)
index 0000000..a6fba70
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+       <string name="label">Minetest</string>
+       <string name="loading">Loading&#8230;</string>
+       <string name="not_granted">Required permission wasn\'t granted, Minetest can\'t run without it</string>
+       <string name="notification_title">Loading Minetest</string>
+       <string name="notification_description">Less than 1 minute&#8230;</string>
+
+</resources>
diff --git a/build/android/app/src/main/res/values/styles.xml b/build/android/app/src/main/res/values/styles.xml
new file mode 100644 (file)
index 0000000..618507e
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+
+       <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
+               <item name="windowActionBar">false</item>
+               <item name="android:windowFullscreen">true</item>
+               <item name="android:windowBackground">@drawable/bg</item>
+               <item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="p">shortEdges</item>
+       </style>
+
+       <style name="InputTheme" parent="Theme.AppCompat.DayNight.Dialog">
+               <item name="windowNoTitle">true</item>
+               <item name="android:windowBackground">@android:color/transparent</item>
+       </style>
+
+       <style name="CustomProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
+               <item name="android:indeterminateOnly">false</item>
+               <item name="android:minHeight">10dip</item>
+               <item name="android:maxHeight">20dip</item>
+       </style>
+
+</resources>
index fa74cd497105c525a02c5bcee2a22ee77cf95b4f..b02e8c6df61f961bf2d8cc98b51f07276010ba90 100644 (file)
@@ -1,10 +1,24 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+project.ext.set("versionMajor", 5)      // Version Major
+project.ext.set("versionMinor", 3)      // Version Minor
+project.ext.set("versionPatch", 0)      // Version Patch
+project.ext.set("versionExtra", "-dev") // Version Extra
+project.ext.set("versionCode", 26)      // Android Version Code
+// NOTE: +2 after each release!
+// +1 for ARM and +1 for ARM64 APK's, because
+// each APK must have a larger `versionCode` than the previous
+
 buildscript {
        repositories {
                google()
                jcenter()
        }
        dependencies {
-               classpath 'com.android.tools.build:gradle:3.5.1'
+               classpath 'com.android.tools.build:gradle:3.6.2'
+               classpath 'org.ajoberstar.grgit:grgit-gradle:4.0.2'
+               // NOTE: Do not place your application dependencies here; they belong
+               // in the individual module build.gradle files
        }
 }
 
@@ -15,161 +29,6 @@ allprojects {
        }
 }
 
-def curl_version = "7.60.0"
-def irrlicht_revision = "5150"
-def openal_version = "1.18.2"
-def openssl_version = "1.0.2n"
-def sqlite3_version = "3240000"
-
-apply plugin: "com.android.application"
-
-android {
-       compileSdkVersion 29
-       buildToolsVersion '29.0.2'
-
-       defaultConfig {
-               versionCode 26
-               versionName "${System.env.VERSION_STR}.${versionCode}"
-               minSdkVersion 14
-               targetSdkVersion 29
-               applicationId "net.minetest.minetest"
-               manifestPlaceholders = [package: "net.minetest.minetest", project: project.name]
-               ndk {
-                       // Specifies the ABI configurations of your native
-                       // libraries Gradle should build and package with your APK.
-                       // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
-                       abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
-               }
-       }
-
-       compileOptions {
-               sourceCompatibility JavaVersion.VERSION_1_8
-               targetCompatibility JavaVersion.VERSION_1_8
-       }
-
-       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
-                       }
-               }
-       }
-}
-
-task cleanAssets(type: Delete) {
-       delete 'src/main/assets'
-}
-
-task copyAssets {
-       dependsOn 'cleanAssets'
-       mkdir "src/main/assets"
-
-       def mtAssetsFolder = "src/main/assets/Minetest"
-       def projRoot = "../.."
-       def gameToCopy = "minetest_game"
-
-       doLast {
-               mkdir "${mtAssetsFolder}"
-               mkdir "${mtAssetsFolder}/client"
-               mkdir "${mtAssetsFolder}/fonts"
-               mkdir "${mtAssetsFolder}/games"
-               mkdir "${mtAssetsFolder}/media"
-
-               copy {
-                       from "${projRoot}/minetest.conf.example", "${projRoot}/README.md" into mtAssetsFolder
-               }
-               copy {
-                       from "${projRoot}/doc/lgpl-2.1.txt" into "${mtAssetsFolder}/LICENSE.txt"
-               }
-               copy {
-                       from "${projRoot}/builtin" into "${mtAssetsFolder}/builtin"
-               }
-               copy {
-                       from "${projRoot}/client/shaders" into "${mtAssetsFolder}/client/shaders"
-               }
-               copy {
-                       from "${projRoot}/fonts" include "*.ttf" into "${mtAssetsFolder}/fonts"
-               }
-               copy {
-                       from "${projRoot}/games/${gameToCopy}" into "${mtAssetsFolder}/games/${gameToCopy}"
-               }
-               copy {
-                       from "${projRoot}/po" into "${mtAssetsFolder}/po"
-               }
-               copy {
-                       from "${projRoot}/textures" into "${mtAssetsFolder}/textures"
-               }
-       }
-}
-
-task cleanIconv(type: Delete) {
-       delete 'deps/libiconv'
-}
-
-task cleanIrrlicht(type: Delete) {
-       delete 'deps/irrlicht'
-}
-
-task cleanLevelDB(type: Delete) {
-       delete 'deps/leveldb'
-}
-
-task cleanCURL(type: Delete) {
-       delete 'deps/curl'
-       delete 'deps/curl-' + curl_version
-}
-
-task cleanOpenSSL(type: Delete) {
-       delete 'deps/openssl'
-       delete 'deps/openssl-' + openssl_version
-       delete 'deps/openssl-' + openssl_version + '.tar.gz'
-}
-
-task cleanOpenAL(type: Delete) {
-       delete 'deps/openal-soft'
-}
-
-task cleanFreetype(type: Delete) {
-       delete 'deps/freetype2-android'
-}
-
-task cleanOgg(type: Delete) {
-       delete 'deps/libvorbis-libogg-android'
-}
-
-task cleanSQLite3(type: Delete) {
-       delete 'deps/sqlite-amalgamation-' + sqlite3_version
-       delete 'deps/sqlite-amalgamation-' + sqlite3_version + '.zip'
-}
-
-task cleanAll(type: Delete, dependsOn: [clean, cleanAssets, cleanIconv,
-               cleanFreetype, cleanIrrlicht, cleanLevelDB, cleanSQLite3, cleanCURL,
-               cleanOpenSSL, cleanOpenAL, cleanOgg]) {
-       delete 'deps'
-       delete 'gen'
-       delete 'libs'
-       delete 'obj'
-       delete 'bin'
-       delete 'Debug'
-       delete 'and_env'
-}
-
-dependencies {
-       implementation 'androidx.core:core:1.1.0'
+task clean(type: Delete) {
+       delete rootProject.buildDir
 }
index 5465fec0ecadbf086fce0db92293c8f1d5f720ff..53b475cf9d6cadae2b97a81c61b18378737b819f 100644 (file)
@@ -1,2 +1,11 @@
+<#if isLowMemory>
+org.gradle.jvmargs=-Xmx4G -XX:MaxPermSize=2G -XX:+HeapDumpOnOutOfMemoryError
+<#else>
+org.gradle.jvmargs=-Xmx16G -XX:MaxPermSize=8G -XX:+HeapDumpOnOutOfMemoryError
+</#if>
+org.gradle.daemon=true
+org.gradle.parallel=true
+org.gradle.parallel.threads=8
+org.gradle.configureondemand=true
 android.enableJetifier=true
-android.useAndroidX=true
\ No newline at end of file
+android.useAndroidX=true
index 6b6ea3ab4ff4f69d55c5fd9c0a6ac70f47d41008..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644 (file)
Binary files a/build/android/gradle/wrapper/gradle-wrapper.jar and b/build/android/gradle/wrapper/gradle-wrapper.jar differ
index 22ac96460eab2576ee1f72ec0538c345edd5b5e6..d612cf3334b517640b1e6d873445f6c09c2f9c3e 100644 (file)
@@ -1 +1,2 @@
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
+#Mon Apr 06 00:06:16 CEST 2020
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
index cccdd3d517fc5249beaefa600691cf150f2fa3e6..83f2acfdc319a24e8766cca78f32474ad7a22dd6 100755 (executable)
@@ -1,5 +1,21 @@
 #!/usr/bin/env sh
 
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
 ##############################################################################
 ##
 ##  Gradle start up script for UN*X
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
@@ -109,8 +125,8 @@ if $darwin; then
     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 fi
 
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
     JAVACMD=`cygpath --unix "$JAVACMD"`
index f9553162f122c71b34635112e717c3e733b5b212..9618d8d9607cd91a0efb866bcac4810064ba6fac 100644 (file)
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
 @if "%DEBUG%" == "" @echo off
 @rem ##########################################################################
 @rem
@@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk
deleted file mode 100644 (file)
index b67322d..0000000
+++ /dev/null
@@ -1,448 +0,0 @@
-LOCAL_PATH := $(call my-dir)/..
-
-#LOCAL_ADDRESS_SANITIZER:=true
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := Irrlicht
-LOCAL_SRC_FILES := deps/irrlicht/lib/Android/libIrrlicht.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-ifeq ($(HAVE_LEVELDB), 1)
-       include $(CLEAR_VARS)
-       LOCAL_MODULE := LevelDB
-       LOCAL_SRC_FILES := deps/leveldb/libleveldb.a
-       include $(PREBUILT_STATIC_LIBRARY)
-endif
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := curl
-LOCAL_SRC_FILES := deps/curl/lib/.libs/libcurl.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := freetype
-LOCAL_SRC_FILES := deps/freetype2-android/Android/obj/local/$(TARGET_ARCH_ABI)/libfreetype2-static.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := iconv
-LOCAL_SRC_FILES := deps/libiconv/lib/.libs/libiconv.so
-include $(PREBUILT_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := openal
-LOCAL_SRC_FILES := deps/openal-soft/libs/$(TARGET_LIBDIR)/libopenal.so
-include $(PREBUILT_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := ogg
-LOCAL_SRC_FILES := deps/libvorbis-libogg-android/libs/$(TARGET_LIBDIR)/libogg.so
-include $(PREBUILT_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := vorbis
-LOCAL_SRC_FILES := deps/libvorbis-libogg-android/libs/$(TARGET_LIBDIR)/libvorbis.so
-include $(PREBUILT_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := ssl
-LOCAL_SRC_FILES := deps/openssl/libssl.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := crypto
-LOCAL_SRC_FILES := deps/openssl/libcrypto.a
-include $(PREBUILT_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := minetest
-
-LOCAL_CPP_FEATURES += exceptions
-
-ifdef GPROF
-GPROF_DEF=-DGPROF
-endif
-
-LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_      \
-               -DHAVE_TOUCHSCREENGUI         \
-               -DENABLE_GLES=1               \
-               -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
-else
-LOCAL_CFLAGS += $(TARGET_CFLAGS_ADDON)
-endif
-
-ifdef GPROF
-PROFILER_LIBS := android-ndk-profiler
-LOCAL_CFLAGS += -pg
-endif
-
-# LOCAL_CFLAGS += -fsanitize=address
-# LOCAL_LDFLAGS += -fsanitize=address
-
-ifeq ($(TARGET_ABI),x86)
-LOCAL_CFLAGS += -fno-stack-protector
-endif
-
-LOCAL_C_INCLUDES := \
-               jni/src                                   \
-               jni/src/script                            \
-               jni/lib/gmp                               \
-               jni/lib/lua/src                           \
-               jni/lib/jsoncpp                           \
-               jni/src/cguittfont                        \
-               deps/irrlicht/include                     \
-               deps/libiconv/include                     \
-               deps/freetype2-android/include            \
-               deps/curl/include                         \
-               deps/openal-soft/jni/OpenAL/include       \
-               deps/libvorbis-libogg-android/jni/include \
-               deps/leveldb/include                      \
-               deps/sqlite/
-
-LOCAL_SRC_FILES := \
-               jni/src/ban.cpp                           \
-               jni/src/chat.cpp                          \
-               jni/src/client/activeobjectmgr.cpp        \
-               jni/src/client/camera.cpp                 \
-               jni/src/client/client.cpp                 \
-               jni/src/client/clientenvironment.cpp      \
-               jni/src/client/clientlauncher.cpp         \
-               jni/src/client/clientmap.cpp              \
-               jni/src/client/clientmedia.cpp            \
-               jni/src/client/clientobject.cpp           \
-               jni/src/client/clouds.cpp                 \
-               jni/src/client/content_cao.cpp            \
-               jni/src/client/content_cso.cpp            \
-               jni/src/client/content_mapblock.cpp       \
-               jni/src/client/filecache.cpp              \
-               jni/src/client/fontengine.cpp             \
-               jni/src/client/game.cpp                   \
-               jni/src/client/gameui.cpp                 \
-               jni/src/client/guiscalingfilter.cpp       \
-               jni/src/client/hud.cpp                    \
-               jni/src/clientiface.cpp                   \
-               jni/src/client/imagefilters.cpp           \
-               jni/src/client/inputhandler.cpp           \
-               jni/src/client/joystick_controller.cpp    \
-               jni/src/client/keycode.cpp                \
-               jni/src/client/localplayer.cpp            \
-               jni/src/client/mapblock_mesh.cpp          \
-               jni/src/client/mesh.cpp                   \
-               jni/src/client/meshgen/collector.cpp      \
-               jni/src/client/mesh_generator_thread.cpp  \
-               jni/src/client/minimap.cpp                \
-               jni/src/client/particles.cpp              \
-               jni/src/client/render/anaglyph.cpp        \
-               jni/src/client/render/core.cpp            \
-               jni/src/client/render/factory.cpp         \
-               jni/src/client/renderingengine.cpp        \
-               jni/src/client/render/interlaced.cpp      \
-               jni/src/client/render/pageflip.cpp        \
-               jni/src/client/render/plain.cpp           \
-               jni/src/client/render/sidebyside.cpp      \
-               jni/src/client/render/stereo.cpp          \
-               jni/src/client/shader.cpp                 \
-               jni/src/client/sky.cpp                    \
-               jni/src/client/sound.cpp                  \
-               jni/src/client/sound_openal.cpp           \
-               jni/src/client/tile.cpp                   \
-               jni/src/client/wieldmesh.cpp              \
-               jni/src/collision.cpp                     \
-               jni/src/content/content.cpp               \
-               jni/src/content_mapnode.cpp               \
-               jni/src/content/mods.cpp                  \
-               jni/src/content_nodemeta.cpp              \
-               jni/src/content/packages.cpp              \
-               jni/src/content/subgames.cpp              \
-               jni/src/convert_json.cpp                  \
-               jni/src/craftdef.cpp                      \
-               jni/src/database/database.cpp             \
-               jni/src/database/database-dummy.cpp       \
-               jni/src/database/database-files.cpp       \
-               jni/src/database/database-leveldb.cpp     \
-               jni/src/database/database-sqlite3.cpp     \
-               jni/src/debug.cpp                         \
-               jni/src/defaultsettings.cpp               \
-               jni/src/emerge.cpp                        \
-               jni/src/environment.cpp                   \
-               jni/src/face_position_cache.cpp           \
-               jni/src/filesys.cpp                       \
-               jni/src/gettext.cpp                       \
-               jni/src/gui/guiAnimatedImage.cpp          \
-               jni/src/gui/guiBackgroundImage.cpp        \
-               jni/src/gui/guiBox.cpp                    \
-               jni/src/gui/guiButton.cpp                 \
-               jni/src/gui/guiButtonImage.cpp            \
-               jni/src/gui/guiButtonItemImage.cpp        \
-               jni/src/gui/guiChatConsole.cpp            \
-               jni/src/gui/guiConfirmRegistration.cpp    \
-               jni/src/gui/guiEditBoxWithScrollbar.cpp   \
-               jni/src/gui/guiEngine.cpp                 \
-               jni/src/gui/guiFormSpecMenu.cpp           \
-               jni/src/gui/guiHyperText.cpp              \
-               jni/src/gui/guiInventoryList.cpp          \
-               jni/src/gui/guiItemImage.cpp              \
-               jni/src/gui/guiKeyChangeMenu.cpp          \
-               jni/src/gui/guiPasswordChange.cpp         \
-               jni/src/gui/guiPathSelectMenu.cpp         \
-               jni/src/gui/guiScrollBar.cpp              \
-               jni/src/gui/guiScrollContainer.cpp        \
-               jni/src/gui/guiSkin.cpp                   \
-               jni/src/gui/guiTable.cpp                  \
-               jni/src/gui/guiVolumeChange.cpp           \
-               jni/src/gui/intlGUIEditBox.cpp            \
-               jni/src/gui/modalMenu.cpp                 \
-               jni/src/gui/profilergraph.cpp             \
-               jni/src/gui/touchscreengui.cpp            \
-               jni/src/httpfetch.cpp                     \
-               jni/src/hud.cpp                           \
-               jni/src/inventory.cpp                     \
-               jni/src/inventorymanager.cpp              \
-               jni/src/irrlicht_changes/CGUITTFont.cpp   \
-               jni/src/irrlicht_changes/static_text.cpp  \
-               jni/src/itemdef.cpp                       \
-               jni/src/itemstackmetadata.cpp             \
-               jni/src/light.cpp                         \
-               jni/src/log.cpp                           \
-               jni/src/main.cpp                          \
-               jni/src/mapblock.cpp                      \
-               jni/src/map.cpp                           \
-               jni/src/mapgen/cavegen.cpp                \
-               jni/src/mapgen/dungeongen.cpp             \
-               jni/src/mapgen/mapgen_carpathian.cpp      \
-               jni/src/mapgen/mapgen.cpp                 \
-               jni/src/mapgen/mapgen_flat.cpp            \
-               jni/src/mapgen/mapgen_fractal.cpp         \
-               jni/src/mapgen/mapgen_singlenode.cpp      \
-               jni/src/mapgen/mapgen_v5.cpp              \
-               jni/src/mapgen/mapgen_v6.cpp              \
-               jni/src/mapgen/mapgen_v7.cpp              \
-               jni/src/mapgen/mapgen_valleys.cpp         \
-               jni/src/mapgen/mg_biome.cpp               \
-               jni/src/mapgen/mg_decoration.cpp          \
-               jni/src/mapgen/mg_ore.cpp                 \
-               jni/src/mapgen/mg_schematic.cpp           \
-               jni/src/mapgen/treegen.cpp                \
-               jni/src/mapnode.cpp                       \
-               jni/src/mapsector.cpp                     \
-               jni/src/map_settings_manager.cpp          \
-               jni/src/metadata.cpp                      \
-               jni/src/modchannels.cpp                   \
-               jni/src/nameidmapping.cpp                 \
-               jni/src/nodedef.cpp                       \
-               jni/src/nodemetadata.cpp                  \
-               jni/src/nodetimer.cpp                     \
-               jni/src/noise.cpp                         \
-               jni/src/objdef.cpp                        \
-               jni/src/object_properties.cpp             \
-               jni/src/pathfinder.cpp                    \
-               jni/src/player.cpp                        \
-               jni/src/porting_android.cpp               \
-               jni/src/porting.cpp                       \
-               jni/src/profiler.cpp                      \
-               jni/src/raycast.cpp                       \
-               jni/src/reflowscan.cpp                    \
-               jni/src/remoteplayer.cpp                  \
-               jni/src/rollback.cpp                      \
-               jni/src/rollback_interface.cpp            \
-               jni/src/serialization.cpp                 \
-               jni/src/server/activeobjectmgr.cpp        \
-               jni/src/server.cpp                        \
-               jni/src/serverenvironment.cpp             \
-               jni/src/serverlist.cpp                    \
-               jni/src/server/luaentity_sao.cpp          \
-               jni/src/server/mods.cpp                   \
-               jni/src/server/player_sao.cpp             \
-               jni/src/server/serveractiveobject.cpp     \
-               jni/src/server/unit_sao.cpp               \
-               jni/src/settings.cpp                      \
-               jni/src/staticobject.cpp                  \
-               jni/src/tileanimation.cpp                 \
-               jni/src/tool.cpp                          \
-               jni/src/translation.cpp                   \
-               jni/src/unittest/test_authdatabase.cpp    \
-               jni/src/unittest/test_collision.cpp       \
-               jni/src/unittest/test_compression.cpp     \
-               jni/src/unittest/test_connection.cpp      \
-               jni/src/unittest/test.cpp                 \
-               jni/src/unittest/test_filepath.cpp        \
-               jni/src/unittest/test_gameui.cpp          \
-               jni/src/unittest/test_inventory.cpp       \
-               jni/src/unittest/test_mapnode.cpp         \
-               jni/src/unittest/test_map_settings_manager.cpp \
-               jni/src/unittest/test_nodedef.cpp         \
-               jni/src/unittest/test_noderesolver.cpp    \
-               jni/src/unittest/test_noise.cpp           \
-               jni/src/unittest/test_objdef.cpp          \
-               jni/src/unittest/test_profiler.cpp        \
-               jni/src/unittest/test_random.cpp          \
-               jni/src/unittest/test_schematic.cpp       \
-               jni/src/unittest/test_serialization.cpp   \
-               jni/src/unittest/test_settings.cpp        \
-               jni/src/unittest/test_socket.cpp          \
-               jni/src/unittest/test_utilities.cpp       \
-               jni/src/unittest/test_voxelalgorithms.cpp \
-               jni/src/unittest/test_voxelmanipulator.cpp \
-               jni/src/util/areastore.cpp                \
-               jni/src/util/auth.cpp                     \
-               jni/src/util/base64.cpp                   \
-               jni/src/util/directiontables.cpp          \
-               jni/src/util/enriched_string.cpp          \
-               jni/src/util/ieee_float.cpp               \
-               jni/src/util/numeric.cpp                  \
-               jni/src/util/pointedthing.cpp             \
-               jni/src/util/quicktune.cpp                \
-               jni/src/util/serialize.cpp                \
-               jni/src/util/sha1.cpp                     \
-               jni/src/util/srp.cpp                      \
-               jni/src/util/string.cpp                   \
-               jni/src/util/timetaker.cpp                \
-               jni/src/version.cpp                       \
-               jni/src/voxelalgorithms.cpp               \
-               jni/src/voxel.cpp
-
-
-# intentionally kept out (we already build openssl itself): jni/src/util/sha256.c
-
-# Network
-LOCAL_SRC_FILES += \
-               jni/src/network/address.cpp               \
-               jni/src/network/connection.cpp            \
-               jni/src/network/networkpacket.cpp         \
-               jni/src/network/clientopcodes.cpp         \
-               jni/src/network/clientpackethandler.cpp   \
-               jni/src/network/connectionthreads.cpp     \
-               jni/src/network/serveropcodes.cpp         \
-               jni/src/network/serverpackethandler.cpp   \
-               jni/src/network/socket.cpp                \
-
-# lua api
-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/common/c_types.cpp         \
-               jni/src/script/common/helper.cpp          \
-               jni/src/script/cpp_api/s_async.cpp        \
-               jni/src/script/cpp_api/s_base.cpp         \
-               jni/src/script/cpp_api/s_client.cpp       \
-               jni/src/script/cpp_api/s_entity.cpp       \
-               jni/src/script/cpp_api/s_env.cpp          \
-               jni/src/script/cpp_api/s_inventory.cpp    \
-               jni/src/script/cpp_api/s_item.cpp         \
-               jni/src/script/cpp_api/s_mainmenu.cpp     \
-               jni/src/script/cpp_api/s_modchannels.cpp  \
-               jni/src/script/cpp_api/s_node.cpp         \
-               jni/src/script/cpp_api/s_nodemeta.cpp     \
-               jni/src/script/cpp_api/s_player.cpp       \
-               jni/src/script/cpp_api/s_security.cpp     \
-               jni/src/script/cpp_api/s_server.cpp       \
-               jni/src/script/lua_api/l_areastore.cpp    \
-               jni/src/script/lua_api/l_auth.cpp         \
-               jni/src/script/lua_api/l_base.cpp         \
-               jni/src/script/lua_api/l_camera.cpp       \
-               jni/src/script/lua_api/l_client.cpp       \
-               jni/src/script/lua_api/l_craft.cpp        \
-               jni/src/script/lua_api/l_env.cpp          \
-               jni/src/script/lua_api/l_inventory.cpp    \
-               jni/src/script/lua_api/l_item.cpp         \
-               jni/src/script/lua_api/l_itemstackmeta.cpp\
-               jni/src/script/lua_api/l_localplayer.cpp  \
-               jni/src/script/lua_api/l_mainmenu.cpp     \
-               jni/src/script/lua_api/l_mapgen.cpp       \
-               jni/src/script/lua_api/l_metadata.cpp     \
-               jni/src/script/lua_api/l_minimap.cpp      \
-               jni/src/script/lua_api/l_modchannels.cpp  \
-               jni/src/script/lua_api/l_nodemeta.cpp     \
-               jni/src/script/lua_api/l_nodetimer.cpp    \
-               jni/src/script/lua_api/l_noise.cpp        \
-               jni/src/script/lua_api/l_object.cpp       \
-               jni/src/script/lua_api/l_playermeta.cpp   \
-               jni/src/script/lua_api/l_particles.cpp    \
-               jni/src/script/lua_api/l_particles_local.cpp\
-               jni/src/script/lua_api/l_rollback.cpp     \
-               jni/src/script/lua_api/l_server.cpp       \
-               jni/src/script/lua_api/l_settings.cpp     \
-               jni/src/script/lua_api/l_sound.cpp        \
-               jni/src/script/lua_api/l_http.cpp         \
-               jni/src/script/lua_api/l_storage.cpp      \
-               jni/src/script/lua_api/l_util.cpp         \
-               jni/src/script/lua_api/l_vmanip.cpp       \
-               jni/src/script/scripting_client.cpp       \
-               jni/src/script/scripting_server.cpp       \
-               jni/src/script/scripting_mainmenu.cpp
-
-#freetype2 support
-#LOCAL_SRC_FILES += jni/src/cguittfont/xCGUITTFont.cpp
-
-# GMP
-LOCAL_SRC_FILES += jni/lib/gmp/mini-gmp.c
-
-# Lua
-LOCAL_SRC_FILES += \
-               jni/lib/lua/src/lapi.c                    \
-               jni/lib/lua/src/lauxlib.c                 \
-               jni/lib/lua/src/lbaselib.c                \
-               jni/lib/lua/src/lcode.c                   \
-               jni/lib/lua/src/ldblib.c                  \
-               jni/lib/lua/src/ldebug.c                  \
-               jni/lib/lua/src/ldo.c                     \
-               jni/lib/lua/src/ldump.c                   \
-               jni/lib/lua/src/lfunc.c                   \
-               jni/lib/lua/src/lgc.c                     \
-               jni/lib/lua/src/linit.c                   \
-               jni/lib/lua/src/liolib.c                  \
-               jni/lib/lua/src/llex.c                    \
-               jni/lib/lua/src/lmathlib.c                \
-               jni/lib/lua/src/lmem.c                    \
-               jni/lib/lua/src/loadlib.c                 \
-               jni/lib/lua/src/lobject.c                 \
-               jni/lib/lua/src/lopcodes.c                \
-               jni/lib/lua/src/loslib.c                  \
-               jni/lib/lua/src/lparser.c                 \
-               jni/lib/lua/src/lstate.c                  \
-               jni/lib/lua/src/lstring.c                 \
-               jni/lib/lua/src/lstrlib.c                 \
-               jni/lib/lua/src/ltable.c                  \
-               jni/lib/lua/src/ltablib.c                 \
-               jni/lib/lua/src/ltm.c                     \
-               jni/lib/lua/src/lundump.c                 \
-               jni/lib/lua/src/lvm.c                     \
-               jni/lib/lua/src/lzio.c                    \
-               jni/lib/lua/src/print.c
-
-# SQLite3
-LOCAL_SRC_FILES += deps/sqlite/sqlite3.c
-
-# Threading
-LOCAL_SRC_FILES += \
-               jni/src/threading/event.cpp \
-               jni/src/threading/semaphore.cpp \
-               jni/src/threading/thread.cpp
-
-# JSONCPP
-LOCAL_SRC_FILES += jni/lib/jsoncpp/jsoncpp.cpp
-
-LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis
-LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
-
-ifeq ($(HAVE_LEVELDB), 1)
-       LOCAL_STATIC_LIBRARIES += LevelDB
-endif
-LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid
-
-include $(BUILD_SHARED_LIBRARY)
-
-# at the end of Android.mk
-ifdef GPROF
-$(call import-module,android-ndk-profiler)
-endif
-$(call import-module,android/native_app_glue)
diff --git a/build/android/jni/Application.mk b/build/android/jni/Application.mk
deleted file mode 100644 (file)
index f5eb96e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-APP_PLATFORM := ${APP_PLATFORM}
-APP_ABI := ${TARGET_ABI}
-APP_STL := c++_shared
-APP_MODULES := minetest
-ifndef NDEBUG
-APP_OPTIM := debug
-endif
-
-APP_CPPFLAGS += -fexceptions -std=c++11 -frtti
diff --git a/build/android/jni/Deps.mk b/build/android/jni/Deps.mk
deleted file mode 100644 (file)
index 73db235..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-APP_PLATFORM := ${APP_PLATFORM}
-APP_ABI := ${TARGET_ABI}
-APP_STL := c++_shared
-APP_DEPRECATED_HEADERS := true
-
-APP_CFLAGS += ${TARGET_CFLAGS_ADDON}
-APP_CPPFLAGS += ${TARGET_CXXFLAGS_ADDON} -fexceptions -std=c++11
diff --git a/build/android/jni/Irrlicht.mk b/build/android/jni/Irrlicht.mk
deleted file mode 100644 (file)
index cedfe31..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-APP_PLATFORM := ${APP_PLATFORM}
-APP_ABI := ${TARGET_ABI}
-APP_STL := c++_shared
-APP_DEPRECATED_HEADERS := true
-APP_MODULES := Irrlicht
-
-APP_CLAFGS += ${TARGET_CFLAGS_ADDON}
-APP_CPPFLAGS += ${TARGET_CXXFLAGS_ADDON} -fexceptions
diff --git a/build/android/native/build.gradle b/build/android/native/build.gradle
new file mode 100644 (file)
index 0000000..f06e4e3
--- /dev/null
@@ -0,0 +1,59 @@
+apply plugin: 'com.android.library'
+import org.ajoberstar.grgit.Grgit
+
+android {
+       compileSdkVersion 29
+       buildToolsVersion '29.0.3'
+       ndkVersion '21.0.6113669'
+       defaultConfig {
+               minSdkVersion 16
+               targetSdkVersion 29
+               externalNativeBuild {
+                       ndkBuild {
+                               arguments '-j8',
+                                               "versionMajor=${versionMajor}",
+                                               "versionMinor=${versionMinor}",
+                                               "versionPatch=${versionPatch}",
+                                               "versionExtra=${versionExtra}"
+                       }
+               }
+       }
+
+       externalNativeBuild {
+               ndkBuild {
+                       path file('jni/Android.mk')
+               }
+       }
+
+       // supported architectures
+       splits {
+               abi {
+                       enable true
+                       reset()
+                       include 'armeabi-v7a', 'arm64-v8a'//, 'x86'
+               }
+       }
+
+       buildTypes {
+               release {
+                       externalNativeBuild {
+                               ndkBuild {
+                                       arguments 'NDEBUG=1'
+                               }
+                       }
+               }
+       }
+}
+
+task cloneGitRepo() {
+       def destination = file('deps')
+       if(!destination.exists()) {
+               def grgit = Grgit.clone(
+                               dir: destination,
+                               uri: 'https://github.com/minetest/minetest_android_deps_binaries'
+               )
+               grgit.close()
+       }
+}
+
+preBuild.dependsOn cloneGitRepo
diff --git a/build/android/native/jni/Android.mk b/build/android/native/jni/Android.mk
new file mode 100644 (file)
index 0000000..a5cb099
--- /dev/null
@@ -0,0 +1,218 @@
+LOCAL_PATH := $(call my-dir)/..
+
+#LOCAL_ADDRESS_SANITIZER:=true
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Curl
+LOCAL_SRC_FILES := deps/Android/Curl/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcurl.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Freetype
+LOCAL_SRC_FILES := deps/Android/Freetype/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libfreetype.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Irrlicht
+LOCAL_SRC_FILES := deps/Android/Irrlicht/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libIrrlicht.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+#include $(CLEAR_VARS)
+#LOCAL_MODULE := LevelDB
+#LOCAL_SRC_FILES := deps/Android/LevelDB/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libleveldb.a
+#include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := LuaJIT
+LOCAL_SRC_FILES := deps/Android/LuaJIT/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libluajit.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := mbedTLS
+LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedtls.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := mbedx509
+LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedx509.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := mbedcrypto
+LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedcrypto.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := OpenAL
+LOCAL_SRC_FILES := deps/Android/OpenAL-Soft/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libopenal.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+# You can use `OpenSSL and Crypto` instead `mbedTLS mbedx509 mbedcrypto`,
+#but it increase APK size on ~0.7MB
+#include $(CLEAR_VARS)
+#LOCAL_MODULE := OpenSSL
+#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libssl.a
+#include $(PREBUILT_STATIC_LIBRARY)
+
+#include $(CLEAR_VARS)
+#LOCAL_MODULE := Crypto
+#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcrypto.a
+#include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Vorbis
+LOCAL_SRC_FILES := deps/Android/Vorbis/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libvorbis.a
+include $(PREBUILT_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := Minetest
+
+LOCAL_CFLAGS += \
+       -DJSONCPP_NO_LOCALE_SUPPORT     \
+       -DHAVE_TOUCHSCREENGUI           \
+       -DENABLE_GLES=1                 \
+       -DUSE_CURL=1                    \
+       -DUSE_SOUND=1                   \
+       -DUSE_FREETYPE=1                \
+       -DUSE_LEVELDB=0                 \
+       -DUSE_LUAJIT=1                  \
+       -DVERSION_MAJOR=${versionMajor} \
+       -DVERSION_MINOR=${versionMinor} \
+       -DVERSION_PATCH=${versionPatch} \
+       -DVERSION_EXTRA=${versionExtra} \
+       $(GPROF_DEF)
+
+ifdef NDEBUG
+       LOCAL_CFLAGS += -DNDEBUG=1
+endif
+
+ifdef GPROF
+       GPROF_DEF := -DGPROF
+       PROFILER_LIBS := android-ndk-profiler
+       LOCAL_CFLAGS += -pg
+endif
+
+LOCAL_C_INCLUDES := \
+       ../../../src                                    \
+       ../../../src/script                             \
+       ../../../lib/gmp                                \
+       ../../../lib/jsoncpp                            \
+       deps/Android/Curl/include                       \
+       deps/Android/Freetype/include                   \
+       deps/Android/Irrlicht/include                   \
+       deps/Android/LevelDB/include                    \
+       deps/Android/libiconv/include                   \
+       deps/Android/libiconv/libcharset/include        \
+       deps/Android/LuaJIT/src                         \
+       deps/Android/OpenAL-Soft/include                \
+       deps/Android/sqlite                             \
+       deps/Android/Vorbis/include
+
+LOCAL_SRC_FILES := \
+       $(wildcard ../../../src/client/*.cpp)           \
+       $(wildcard ../../../src/client/*/*.cpp)         \
+       $(wildcard ../../../src/content/*.cpp)          \
+       ../../../src/database/database.cpp              \
+       ../../../src/database/database-dummy.cpp        \
+       ../../../src/database/database-files.cpp        \
+       ../../../src/database/database-sqlite3.cpp      \
+       $(wildcard ../../../src/gui/*.cpp)              \
+       $(wildcard ../../../src/irrlicht_changes/*.cpp) \
+       $(wildcard ../../../src/mapgen/*.cpp)           \
+       $(wildcard ../../../src/network/*.cpp)          \
+       $(wildcard ../../../src/script/*.cpp)           \
+       $(wildcard ../../../src/script/*/*.cpp)         \
+       $(wildcard ../../../src/server/*.cpp)           \
+       $(wildcard ../../../src/threading/*.cpp)        \
+       $(wildcard ../../../src/util/*.c)               \
+       $(wildcard ../../../src/util/*.cpp)             \
+       ../../../src/ban.cpp                            \
+       ../../../src/chat.cpp                           \
+       ../../../src/clientiface.cpp                    \
+       ../../../src/collision.cpp                      \
+       ../../../src/content_mapnode.cpp                \
+       ../../../src/content_nodemeta.cpp               \
+       ../../../src/convert_json.cpp                   \
+       ../../../src/craftdef.cpp                       \
+       ../../../src/debug.cpp                          \
+       ../../../src/defaultsettings.cpp                \
+       ../../../src/emerge.cpp                         \
+       ../../../src/environment.cpp                    \
+       ../../../src/face_position_cache.cpp            \
+       ../../../src/filesys.cpp                        \
+       ../../../src/gettext.cpp                        \
+       ../../../src/httpfetch.cpp                      \
+       ../../../src/hud.cpp                            \
+       ../../../src/inventory.cpp                      \
+       ../../../src/inventorymanager.cpp               \
+       ../../../src/itemdef.cpp                        \
+       ../../../src/itemstackmetadata.cpp              \
+       ../../../src/light.cpp                          \
+       ../../../src/log.cpp                            \
+       ../../../src/main.cpp                           \
+       ../../../src/map.cpp                            \
+       ../../../src/map_settings_manager.cpp           \
+       ../../../src/mapblock.cpp                       \
+       ../../../src/mapnode.cpp                        \
+       ../../../src/mapsector.cpp                      \
+       ../../../src/metadata.cpp                       \
+       ../../../src/modchannels.cpp                    \
+       ../../../src/nameidmapping.cpp                  \
+       ../../../src/nodedef.cpp                        \
+       ../../../src/nodemetadata.cpp                   \
+       ../../../src/nodetimer.cpp                      \
+       ../../../src/noise.cpp                          \
+       ../../../src/objdef.cpp                         \
+       ../../../src/object_properties.cpp              \
+       ../../../src/pathfinder.cpp                     \
+       ../../../src/player.cpp                         \
+       ../../../src/porting.cpp                        \
+       ../../../src/porting_android.cpp                \
+       ../../../src/profiler.cpp                       \
+       ../../../src/raycast.cpp                        \
+       ../../../src/reflowscan.cpp                     \
+       ../../../src/remoteplayer.cpp                   \
+       ../../../src/rollback.cpp                       \
+       ../../../src/rollback_interface.cpp             \
+       ../../../src/serialization.cpp                  \
+       ../../../src/server.cpp                         \
+       ../../../src/serverenvironment.cpp              \
+       ../../../src/serverlist.cpp                     \
+       ../../../src/settings.cpp                       \
+       ../../../src/staticobject.cpp                   \
+       ../../../src/texture_override.cpp               \
+       ../../../src/tileanimation.cpp                  \
+       ../../../src/tool.cpp                           \
+       ../../../src/translation.cpp                    \
+       ../../../src/version.cpp                        \
+       ../../../src/voxel.cpp                          \
+       ../../../src/voxelalgorithms.cpp
+
+# LevelDB backend is disabled
+#      ../../../src/database/database-leveldb.cpp
+
+# GMP
+LOCAL_SRC_FILES += ../../../lib/gmp/mini-gmp.c
+
+# JSONCPP
+LOCAL_SRC_FILES += ../../../lib/jsoncpp/jsoncpp.cpp
+
+# iconv
+LOCAL_SRC_FILES += \
+       deps/Android/libiconv/lib/iconv.c               \
+       deps/Android/libiconv/libcharset/lib/localcharset.c
+
+# SQLite3
+LOCAL_SRC_FILES += deps/Android/sqlite/sqlite3.c
+
+LOCAL_STATIC_LIBRARIES += Curl Freetype Irrlicht OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS) #LevelDB
+#OpenSSL Crypto
+
+LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
+
+include $(BUILD_SHARED_LIBRARY)
+
+ifdef GPROF
+$(call import-module,android-ndk-profiler)
+endif
+$(call import-module,android/native_app_glue)
diff --git a/build/android/native/jni/Application.mk b/build/android/native/jni/Application.mk
new file mode 100644 (file)
index 0000000..82f0148
--- /dev/null
@@ -0,0 +1,32 @@
+APP_PLATFORM := ${APP_PLATFORM}
+APP_ABI := ${TARGET_ABI}
+APP_STL := c++_shared
+NDK_TOOLCHAIN_VERSION := clang
+APP_SHORT_COMMANDS := true
+APP_MODULES := Minetest
+
+APP_CPPFLAGS := -Ofast -fvisibility=hidden -fexceptions -Wno-deprecated-declarations -Wno-extra-tokens
+
+ifeq ($(APP_ABI),armeabi-v7a)
+APP_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb
+endif
+
+#ifeq ($(APP_ABI),x86)
+#APP_CPPFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops
+#endif
+
+ifndef NDEBUG
+APP_CPPFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer -fexceptions
+endif
+
+APP_CFLAGS   := $(APP_CPPFLAGS) -Wno-parentheses-equality #-Werror=shorten-64-to-32
+APP_CXXFLAGS := $(APP_CPPFLAGS) -frtti -std=gnu++17
+APP_LDFLAGS  := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe
+
+ifeq ($(APP_ABI),arm64-v8a)
+APP_LDFLAGS  := -Wl,--no-warn-mismatch,--gc-sections
+endif
+
+ifndef NDEBUG
+APP_LDFLAGS  :=
+endif
diff --git a/build/android/native/src/main/AndroidManifest.xml b/build/android/native/src/main/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..19451c7
--- /dev/null
@@ -0,0 +1 @@
+<manifest package="net.minetest" />
diff --git a/build/android/patches/irrlicht-back_button.patch b/build/android/patches/irrlicht-back_button.patch
deleted file mode 100644 (file)
index e17b813..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
---- irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp.orig        2015-08-29 15:43:09.000000000 +0300
-+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2016-05-13 21:36:22.880388505 +0300
-@@ -486,7 +486,7 @@
-                               event.KeyInput.Char = 0;\r
-                       }\r
\r
--                      device->postEventFromUser(event);\r
-+                      status = device->postEventFromUser(event);\r
-               }\r
-               break;\r
-               default:\r
-@@ -543,7 +543,7 @@
-     KeyMap[1] = KEY_LBUTTON; // AKEYCODE_SOFT_LEFT\r
-     KeyMap[2] = KEY_RBUTTON; // AKEYCODE_SOFT_RIGHT\r
-     KeyMap[3] = KEY_HOME; // AKEYCODE_HOME\r
--    KeyMap[4] = KEY_BACK; // AKEYCODE_BACK\r
-+    KeyMap[4] = KEY_CANCEL; // AKEYCODE_BACK\r
-     KeyMap[5] = KEY_UNKNOWN; // AKEYCODE_CALL\r
-     KeyMap[6] = KEY_UNKNOWN; // AKEYCODE_ENDCALL\r
-     KeyMap[7] = KEY_KEY_0; // AKEYCODE_0\r
diff --git a/build/android/patches/irrlicht-native_activity.patch b/build/android/patches/irrlicht-native_activity.patch
deleted file mode 100644 (file)
index a9d2610..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- irrlicht/source/Irrlicht/CEGLManager.cpp.orig      2018-09-11 18:19:51.453403631 +0300
-+++ irrlicht/source/Irrlicht/CEGLManager.cpp   2018-09-11 18:36:24.603471869 +0300
-@@ -9,6 +9,10 @@
- #include "irrString.h"\r
- #include "os.h"\r
\r
-+#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)\r
-+#include <android/native_activity.h>\r
-+#endif\r
-+\r
- namespace irr\r
- {\r
- namespace video\r
diff --git a/build/android/patches/irrlicht-texturehack.patch b/build/android/patches/irrlicht-texturehack.patch
deleted file mode 100644 (file)
index a458ede..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-22 17:01:13.266568869 +0200
-+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200
-@@ -366,112 +366,140 @@
-       void(*convert)(const void*, s32, void*) = 0;\r
-       getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);\r
\r
--      // make sure we don't change the internal format of existing images\r
--      if (!newTexture)\r
--              InternalFormat = oldInternalFormat;\r
--\r
--    Driver->setActiveTexture(0, this);\r
--\r
--      if (Driver->testGLError())\r
--              os::Printer::log("Could not bind Texture", ELL_ERROR);\r
--\r
--      // mipmap handling for main texture\r
--      if (!level && newTexture)\r
--      {\r
--              // auto generate if possible and no mipmap data is given\r
--              if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
--              {\r
--                      if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
--                      else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
--                      else\r
--                              glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
-+      bool retry = false;\r
-+      \r
-+      do { \r
-+              if (retry) {\r
-+                      InternalFormat = GL_RGBA;\r
-+                      PixelFormat = GL_RGBA;\r
-+                      convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;\r
-+              }\r
-+              // make sure we don't change the internal format of existing images\r
-+              if (!newTexture)\r
-+                      InternalFormat = oldInternalFormat;\r
\r
--            glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
--                      AutomaticMipmapUpdate=true;\r
--              }\r
-+              Driver->setActiveTexture(0, this);\r
\r
--              // enable bilinear filter without mipmaps\r
--              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
--              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
--      }\r
-+              if (Driver->testGLError())\r
-+                      os::Printer::log("Could not bind Texture", ELL_ERROR);\r
\r
--      // now get image data and upload to GPU\r
-+              // mipmap handling for main texture\r
-+              if (!level && newTexture)\r
-+              {\r
-+                      // auto generate if possible and no mipmap data is given\r
-+                      if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))\r
-+                      {\r
-+                              if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);\r
-+                              else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);\r
-+                              else\r
-+                                      glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);\r
-+\r
-+                              glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);\r
-+                              AutomaticMipmapUpdate=true;\r
-+                      }\r
-+\r
-+                      // enable bilinear filter without mipmaps\r
-+                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);\r
-+                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+              }\r
\r
--      u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
-+              // now get image data and upload to GPU\r
\r
--      void* source = image->lock();\r
-+              u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);\r
\r
--      IImage* tmpImage = 0;\r
-+              void* source = image->lock();\r
\r
--      if (convert)\r
--      {\r
--              tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
--              void* dest = tmpImage->lock();\r
--              convert(source, image->getDimension().getArea(), dest);\r
--              image->unlock();\r
--              source = dest;\r
--      }\r
-+              IImage* tmpImage = 0;\r
\r
--      if (newTexture)\r
--      {\r
--              if (IsCompressed)\r
-+              if (convert)\r
-               {\r
--                      glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
--                              image->getDimension().Height, 0, compressedImageSize, source);\r
-+                      tmpImage = new CImage(image->getColorFormat(), image->getDimension());\r
-+                      void* dest = tmpImage->lock();\r
-+                      convert(source, image->getDimension().getArea(), dest);\r
-+                      image->unlock();\r
-+                      source = dest;\r
-               }\r
--              else\r
--                      glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
--                              image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
--      }\r
--      else\r
--      {\r
--              if (IsCompressed)\r
-+\r
-+              if (newTexture)\r
-               {\r
--                      glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
--                              image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
-+                      if (IsCompressed)\r
-+                      {\r
-+                              glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,\r
-+                                      image->getDimension().Height, 0, compressedImageSize, source);\r
-+                      }\r
-+                      else\r
-+                              glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,\r
-+                                      image->getDimension().Height, 0, PixelFormat, PixelType, source);\r
-               }\r
-               else\r
--                      glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
--                              image->getDimension().Height, PixelFormat, PixelType, source);\r
--      }\r
--\r
--      if (convert)\r
--      {\r
--              tmpImage->unlock();\r
--              tmpImage->drop();\r
--      }\r
--      else\r
--              image->unlock();\r
--\r
--      if (!level && newTexture)\r
--      {\r
--              if (IsCompressed && !mipmapData)\r
-               {\r
--                      if (image->hasMipMaps())\r
--                              mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
-+                      if (IsCompressed)\r
-+                      {\r
-+                              glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
-+                                      image->getDimension().Height, PixelFormat, compressedImageSize, source);\r
-+                      }\r
-                       else\r
--                              HasMipMaps = false;\r
-+                              glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,\r
-+                                      image->getDimension().Height, PixelFormat, PixelType, source);\r
-               }\r
\r
--              regenerateMipMapLevels(mipmapData);\r
--\r
--              if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
-+              if (convert)\r
-               {\r
--                      // enable bilinear mipmap filter\r
--                      GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
--\r
--                      if (filtering != GL_LINEAR)\r
--                              filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
-+                      tmpImage->unlock();\r
-+                      tmpImage->drop();\r
-+              }\r
-+              else\r
-+                      image->unlock();\r
-+              \r
-+              if (glGetError() != GL_NO_ERROR) {\r
-+                      static bool warned = false;\r
-+                      if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {\r
-+\r
-+                              if (!warned) {\r
-+                                      os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR);\r
-+                                      warned = true;\r
-+                              }\r
-+                      }\r
-+                      else if (retry) {\r
-+                              os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);\r
-+                      }\r
-+                      retry = !retry;\r
-+                      continue;\r
-+              } else {\r
-+                      retry = false;\r
-+              }\r
\r
--                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
--                      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+              if (!level && newTexture)\r
-+              {\r
-+                      if (IsCompressed && !mipmapData)\r
-+                      {\r
-+                              if (image->hasMipMaps())\r
-+                                      mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;\r
-+                              else\r
-+                                      HasMipMaps = false;\r
-+                      }\r
-+\r
-+                      regenerateMipMapLevels(mipmapData);\r
-+\r
-+                      if (HasMipMaps) // might have changed in regenerateMipMapLevels\r
-+                      {\r
-+                              // enable bilinear mipmap filter\r
-+                              GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;\r
-+\r
-+                              if (filtering != GL_LINEAR)\r
-+                                      filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;\r
-+\r
-+                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);\r
-+                              glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);\r
-+                      }\r
-               }\r
--      }\r
\r
--      if (Driver->testGLError())\r
--              os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
-+              if (Driver->testGLError())\r
-+                      os::Printer::log("Could not glTexImage2D", ELL_ERROR);\r
-+      }\r
-+      while(retry);\r
- }\r
\r
\r
---- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig    2014-06-25 00:28:50.820501856 +0200
-+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200
-@@ -422,6 +422,9 @@
-                       source = dest;\r
-               }\r
\r
-+              //clear old error\r
-+              glGetError();\r
-+\r
-               if (newTexture)\r
-               {\r
-                       if (IsCompressed)\r
diff --git a/build/android/patches/irrlicht-touchcount.patch b/build/android/patches/irrlicht-touchcount.patch
deleted file mode 100644 (file)
index d4e4b9c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- irrlicht.orig/include/IEventReceiver.h     2014-06-03 19:43:50.433713133 +0200
-+++ irrlicht/include/IEventReceiver.h  2014-06-03 19:44:36.993711489 +0200
-@@ -375,6 +375,9 @@
-         // Y position of simple touch.\r
-               s32 Y;\r
\r
-+              // number of current touches\r
-+              s32 touchedCount;\r
-+\r
-               //! Type of touch event.\r
-               ETOUCH_INPUT_EVENT Event;\r
-       };\r
---- irrlicht.orig/source/Irrlicht/Android/CIrrDeviceAndroid.cpp        2014-06-03 19:43:50.505713130 +0200
-+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp     2014-06-03 19:45:37.265709359 +0200
-@@ -315,6 +315,7 @@
-                                               event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i);\r
-                                               event.TouchInput.X = AMotionEvent_getX(androidEvent, i);\r
-                                               event.TouchInput.Y = AMotionEvent_getY(androidEvent, i);\r
-+                                              event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
-                                               device->postEventFromUser(event);\r
-                                       }\r
-@@ -326,6 +327,7 @@
-                                       event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, pointerIndex);\r
-                                       event.TouchInput.X = AMotionEvent_getX(androidEvent, pointerIndex);\r
-                                       event.TouchInput.Y = AMotionEvent_getY(androidEvent, pointerIndex);\r
-+                                      event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);\r
\r
-                                       device->postEventFromUser(event);\r
-                               }\r
diff --git a/build/android/patches/libvorbis-libogg-fpu.patch b/build/android/patches/libvorbis-libogg-fpu.patch
deleted file mode 100644 (file)
index 52ab397..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
---- libvorbis-libogg-android/jni/libvorbis-jni/Android.mk.orig 2014-06-17 19:22:50.621559073 +0200
-+++ libvorbis-libogg-android/jni/libvorbis-jni/Android.mk      2014-06-17 19:38:20.641581140 +0200
-@@ -4,9 +4,6 @@
- LOCAL_MODULE := vorbis-jni
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
- LOCAL_SHARED_LIBRARIES := libogg libvorbis
---- libvorbis-libogg-android/jni/libvorbis/Android.mk.orig     2014-06-17 19:22:39.077558797 +0200
-+++ libvorbis-libogg-android/jni/libvorbis/Android.mk  2014-06-17 19:38:52.121581887 +0200
-@@ -4,9 +4,6 @@
- LOCAL_MODULE := libvorbis
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
- LOCAL_SHARED_LIBRARIES := libogg
- LOCAL_SRC_FILES := \
---- libvorbis-libogg-android/jni/libogg/Android.mk.orig        2014-06-17 19:22:33.965558675 +0200
-+++ libvorbis-libogg-android/jni/libogg/Android.mk     2014-06-17 19:38:25.337581252 +0200
-@@ -4,10 +4,6 @@
- LOCAL_MODULE := libogg
- LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
--ifeq ($(TARGET_ARCH),arm)
--      LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
--endif
--
- LOCAL_SRC_FILES := \
-       bitwise.c \
diff --git a/build/android/patches/openssl_arch.patch b/build/android/patches/openssl_arch.patch
deleted file mode 100644 (file)
index d15e2b1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- openssl-1.0.2e.orig/Configure      2015-12-03 15:04:23.000000000 +0100
-+++ openssl-1.0.2e/Configure   2015-12-14 21:01:40.351265968 +0100
-@@ -464,8 +464,10 @@
- # Android: linux-* but without pointers to headers and libs.
- "android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-arm","gcc:-march=armv4 -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-mips32","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- #### *BSD [do see comment about ${BSDthreads} above!]
- "BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
index b0cee5dad4b351e99960ebe9bb75bb229bb8070e..b048fca7cd2a5d5bc915c2a7bbb0de493864b37c 100644 (file)
@@ -1 +1,2 @@
 rootProject.name = "Minetest"
+include ':app', ':native'
diff --git a/build/android/src/main/AndroidManifest.xml b/build/android/src/main/AndroidManifest.xml
deleted file mode 100644 (file)
index fb1de9c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-       xmlns:tools="http://schemas.android.com/tools"
-       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.WRITE_EXTERNAL_STORAGE" />
-
-       <application
-               android:icon="@mipmap/ic_launcher"
-               android:label="${project}"
-               android:resizeableActivity="false"
-               tools:targetApi="n">
-
-               <meta-data
-                       android:name="android.max_aspect"
-                       android:value="2.4" />
-
-               <activity
-                       android:name=".MainActivity"
-                       android:configChanges="orientation|keyboardHidden|navigation|screenSize"
-                       android:label="${project}"
-                       android:launchMode="singleTask"
-                       android:screenOrientation="sensorLandscape"
-                       android:theme="@style/AppTheme">
-                       <intent-filter>
-                               <action android:name="android.intent.action.MAIN" />
-                               <category android:name="android.intent.category.LAUNCHER" />
-                       </intent-filter>
-               </activity>
-               <activity
-                       android:name=".MtNativeActivity"
-                       android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize|smallestScreenSize"
-                       android:hardwareAccelerated="true"
-                       android:launchMode="singleTask"
-                       android:screenOrientation="sensorLandscape"
-                       android:theme="@style/AppTheme">
-                       <intent-filter>
-                               <action android:name="android.intent.action.MAIN" />
-                       </intent-filter>
-                       <meta-data
-                               android:name="android.app.lib_name"
-                               android:value="minetest" />
-               </activity>
-               <activity
-                       android:name=".MinetestTextEntry"
-                       android:configChanges="keyboardHidden|orientation|screenSize"
-                       android:theme="@style/Theme.Dialog"
-                       android:windowSoftInputMode="stateAlwaysHidden" />
-               <activity
-                       android:name=".MinetestAssetCopy"
-                       android:screenOrientation="sensorLandscape"
-                       android:theme="@style/AppTheme" />
-       </application>
-</manifest>
diff --git a/build/android/src/main/java/net.minetest.minetest/MainActivity.java b/build/android/src/main/java/net.minetest.minetest/MainActivity.java
deleted file mode 100644 (file)
index 71b0ce1..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-package net.minetest.minetest;
-
-import android.Manifest;
-import android.app.Activity;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class MainActivity extends Activity {
-       private final static int PERMISSIONS = 1;
-       private static final String[] REQUIRED_SDK_PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
-
-       @Override
-       public void onCreate(Bundle savedInstanceState) {
-               super.onCreate(savedInstanceState);
-               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                       checkPermission();
-               } else {
-                       next();
-               }
-       }
-
-       private void checkPermission() {
-               final List<String> missingPermissions = new ArrayList<>();
-               // check required permission
-               for (final String permission : REQUIRED_SDK_PERMISSIONS) {
-                       final int result = ContextCompat.checkSelfPermission(this, permission);
-                       if (result != PackageManager.PERMISSION_GRANTED) {
-                               missingPermissions.add(permission);
-                       }
-               }
-               if (!missingPermissions.isEmpty()) {
-                       // request permission
-                       final String[] permissions = missingPermissions
-                                       .toArray(new String[0]);
-                       ActivityCompat.requestPermissions(this, permissions, PERMISSIONS);
-               } else {
-                       final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
-                       Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
-                       onRequestPermissionsResult(PERMISSIONS, REQUIRED_SDK_PERMISSIONS,
-                                       grantResults);
-               }
-       }
-
-       @Override
-       public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
-                                                                                  @NonNull int[] grantResults) {
-               if (requestCode == PERMISSIONS) {
-                       for (int index = 0; index < permissions.length; index++) {
-                               if (grantResults[index] != PackageManager.PERMISSION_GRANTED) {
-                                       // permission not granted - toast and exit
-                                       Toast.makeText(this, R.string.not_granted, Toast.LENGTH_LONG).show();
-                                       finish();
-                                       return;
-                               }
-                       }
-                       // permission were granted - run
-                       next();
-               }
-       }
-
-       private void next() {
-               Intent intent = new Intent(this, MtNativeActivity.class);
-               intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-               startActivity(intent);
-       }
-}
diff --git a/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java b/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java
deleted file mode 100644 (file)
index 84cfca7..0000000
+++ /dev/null
@@ -1,371 +0,0 @@
-package net.minetest.minetest;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.res.AssetFileDescriptor;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-import android.util.Log;
-import android.view.Display;
-import android.view.View;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-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;
-
-public class MinetestAssetCopy extends Activity {
-       private ProgressBar m_ProgressBar;
-       private TextView m_Filename;
-       private copyAssetTask m_AssetCopy;
-
-       @Override
-       public void onCreate(Bundle savedInstanceState) {
-               super.onCreate(savedInstanceState);
-               setContentView(R.layout.assetcopy);
-               m_ProgressBar = findViewById(R.id.progressBar1);
-               m_Filename = 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();
-               }
-       }
-
-       @Override
-       protected void onResume() {
-               super.onResume();
-               makeFullScreen();
-       }
-
-       @Override
-       protected void onDestroy() {
-               super.onDestroy();
-               if (m_AssetCopy != null) {
-                       m_AssetCopy.cancel(true);
-               }
-       }
-
-       private void makeFullScreen() {
-               if (Build.VERSION.SDK_INT >= 19)
-                       this.getWindow().getDecorView().setSystemUiVisibility(
-                                       View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
-       }
-
-       @Override
-       public void onWindowFocusChanged(boolean hasFocus) {
-               super.onWindowFocusChanged(hasFocus);
-               if (hasFocus)
-                       makeFullScreen();
-       }
-
-       /* 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;
-       }
-
-       @SuppressLint("StaticFieldLeak")
-       private class copyAssetTask extends AsyncTask<String, Integer, String> {
-               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;
-
-               private long getFullSize(String filename) {
-                       long size = 0;
-                       try {
-                               InputStream src = getAssets().open(filename);
-                               byte[] buf = new byte[4096];
-
-                               int len;
-                               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<>();
-                       m_filenames = new Vector<>();
-                       m_tocopy = new Vector<>();
-                       m_asset_size_unknown = new Vector<>();
-                       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 (File file : todel) {
-                                       Log.v("MinetestAssetCopy", "deleting: " + file.getAbsolutePath());
-                                       file.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[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) {
-                               String todisplay = m_tocopy.get(progress[0]);
-                               m_ProgressBar.setProgress(progress[0]);
-                               m_Filename.setText(todisplay);
-                       } else {
-                               String todisplay = m_Foldername;
-                               String full_text = "scanning " + todisplay + " ...";
-                               m_Filename.setText(full_text);
-                       }
-               }
-
-               /**
-                * check all files and folders in filelist
-                */
-               void ProcessFileList() {
-                       String FlashBaseDir =
-                                       Environment.getExternalStorageDirectory().getAbsolutePath();
-
-                       for (String current_path : m_filenames) {
-                               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;
-
-                               if (testme.exists()) {
-                                       try {
-                                               AssetFileDescriptor fd = getAssets().openFd(current_path);
-                                               asset_filesize = fd.getLength();
-                                               fd.close();
-                                       } catch (IOException e) {
-                                               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
-                */
-               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
-                */
-               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();
-               }
-
-               boolean isAssetFolder(String path) {
-                       return m_foldernames.contains(path);
-               }
-       }
-}
diff --git a/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java b/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java
deleted file mode 100644 (file)
index cb7ba8d..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-package net.minetest.minetest;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.InputType;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnKeyListener;
-import android.widget.EditText;
-
-public class MinetestTextEntry extends Activity {
-       private final int MultiLineTextInput = 1;
-       private final int SingleLineTextInput = 2;
-       private final int SingleLinePasswordInput = 3;
-       private AlertDialog mTextInputDialog;
-       private EditText mTextInputWidget;
-
-       @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();
-       }
-
-       private void pushResult(String text) {
-               Intent resultData = new Intent();
-               resultData.putExtra("text", text);
-               setResult(Activity.RESULT_OK, resultData);
-               mTextInputDialog.dismiss();
-               finish();
-       }
-
-       private void cancelDialog() {
-               setResult(Activity.RESULT_CANCELED);
-               mTextInputDialog.dismiss();
-               finish();
-       }
-}
diff --git a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
deleted file mode 100644 (file)
index f49d078..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-package net.minetest.minetest;
-
-import android.app.NativeActivity;
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import android.view.View;
-import android.view.WindowManager;
-
-public class MtNativeActivity extends NativeActivity {
-
-       static {
-               System.loadLibrary("c++_shared");
-               System.loadLibrary("openal");
-               System.loadLibrary("ogg");
-               System.loadLibrary("vorbis");
-               System.loadLibrary("iconv");
-               System.loadLibrary("minetest");
-       }
-
-       private int m_MessagReturnCode;
-       private String m_MessageReturnValue;
-
-       public static native void putMessageBoxResult(String text);
-
-       @Override
-       public void onCreate(Bundle savedInstanceState) {
-               super.onCreate(savedInstanceState);
-               getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-               m_MessagReturnCode = -1;
-               m_MessageReturnValue = "";
-       }
-
-       @Override
-       protected void onResume() {
-               super.onResume();
-               makeFullScreen();
-       }
-
-       private void makeFullScreen() {
-               if (Build.VERSION.SDK_INT >= 19)
-                       this.getWindow().getDecorView().setSystemUiVisibility(
-                                       View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
-       }
-
-       @Override
-       public void onWindowFocusChanged(boolean hasFocus) {
-               super.onWindowFocusChanged(hasFocus);
-               if (hasFocus)
-                       makeFullScreen();
-       }
-
-       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;
-       }
-
-       /* 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;
-                       }
-               }
-       }
-}
diff --git a/build/android/src/main/res/drawable/background.png b/build/android/src/main/res/drawable/background.png
deleted file mode 100644 (file)
index 43bd608..0000000
Binary files a/build/android/src/main/res/drawable/background.png and /dev/null differ
diff --git a/build/android/src/main/res/drawable/bg.xml b/build/android/src/main/res/drawable/bg.xml
deleted file mode 100644 (file)
index c76ec37..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-       android:src="@drawable/background"
-       android:tileMode="repeat" />
\ No newline at end of file
diff --git a/build/android/src/main/res/layout/assetcopy.xml b/build/android/src/main/res/layout/assetcopy.xml
deleted file mode 100644 (file)
index b3da2f0..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-       android:id="@+id/activity_main"
-       android:layout_width="match_parent"
-       android:layout_height="match_parent">
-
-       <ProgressBar
-               android:id="@+id/progressBar1"
-               style="?android:attr/progressBarStyleHorizontal"
-               android:layout_width="match_parent"
-               android:layout_height="30dp"
-               android:layout_centerInParent="true"
-               android:layout_marginLeft="90dp"
-               android:layout_marginRight="90dp" />
-
-       <TextView
-               android:id="@+id/textView1"
-               android:layout_width="wrap_content"
-               android:layout_height="wrap_content"
-               android:layout_below="@+id/progressBar1"
-               android:layout_centerInParent="true"
-               android:text="@string/preparing_media" />
-
-</RelativeLayout>
diff --git a/build/android/src/main/res/mipmap/ic_launcher.png b/build/android/src/main/res/mipmap/ic_launcher.png
deleted file mode 100644 (file)
index 88a8378..0000000
Binary files a/build/android/src/main/res/mipmap/ic_launcher.png and /dev/null differ
diff --git a/build/android/src/main/res/values-v21/styles.xml b/build/android/src/main/res/values-v21/styles.xml
deleted file mode 100644 (file)
index 8b07774..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:tools="http://schemas.android.com/tools">
-
-       <style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
-               <item name="android:windowNoTitle">true</item>
-               <item name="android:windowBackground">@drawable/bg</item>
-               <item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi" tools:targetApi="o_mr1">
-                       shortEdges
-               </item>
-       </style>
-
-       <style name="Theme.Dialog" parent="@android:style/Theme.Material.Light.Dialog.NoActionBar">
-               <item name="android:windowNoTitle">true</item>
-               <item name="android:windowBackground">@android:color/transparent</item>
-       </style>
-
-</resources>
diff --git a/build/android/src/main/res/values/strings.xml b/build/android/src/main/res/values/strings.xml
deleted file mode 100644 (file)
index a5eaef5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-       <string name="preparing_media">Preparing media&#8230;</string>
-       <string name="not_granted">Required permission wasn\'t granted, Minetest can\'t run without it</string>
-</resources>
\ No newline at end of file
diff --git a/build/android/src/main/res/values/styles.xml b/build/android/src/main/res/values/styles.xml
deleted file mode 100644 (file)
index 1bd41ae..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-       <style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar.Fullscreen">
-               <item name="android:windowNoTitle">true</item>
-               <item name="android:windowBackground">@drawable/bg</item>
-       </style>
-
-       <style name="Theme.Dialog" parent="android:Theme.Holo.Light.Dialog.NoActionBar">
-               <item name="android:windowNoTitle">true</item>
-               <item name="android:windowBackground">@android:color/transparent</item>
-       </style>
-
-</resources>
index c21279583454c7134454ac06bccf6e991d0a8d04..f6b67978f911d9e712633ba5d9a74dbbc16c3fb2 100644 (file)
@@ -1,6 +1,5 @@
-Minetest Android port
-=====================
-Date: 2014 06 28
+Minetest: Android version
+=========================
 
 Controls
 --------
@@ -40,25 +39,6 @@ file can usually be found at /mnt/sdcard/Minetest.
                main menu is too big or small on your device, try changing this
                value.
 
-Known issues
-------------
-Not all issues are fixed by now:
-
-* Unable to exit from volume menu -- don't use the volume menu, use Android's
-  volume controls instead.
-* 512 MB RAM seems to be inadequate -- this depends on the server you join.
-  Try to play on more lightweight servers.
-
-Versioning
-----------
-Android version numbers are 4 digits instead of Minetest's 3 digits.  The last
-number of Android's version represents the Android internal version code. This
-version code is strictly incremental. It's incremented for each official
-Minetest Android build.
-
-E.g. prerelease Minetest Android builds have been 0.4.9.3, while the first
-official version most likely will be 0.4.10.4
-
 Requirements
 ------------
 
@@ -69,9 +49,9 @@ following software packages. The version number in parenthesis denotes the
 version that was tested at the time this README was drafted; newer/older
 versions may or may not work.
 
-* android SDK (api-26)
-* android NDK (r17c)
-* wget (1.13.4)
+* Android SDK 29
+* Android NDK r21
+* Android Studio 3 [optional]
 
 Additionally, you'll need to have an Internet connection available on the
 build system, as the Android build will download some source packages.
@@ -79,16 +59,15 @@ build system, as the Android build will download some source packages.
 Build
 -----
 
-Debug build:
-* Enter "build/android" subdirectory
-* Execute "make"
-* Answer the questions about where SDK and NDK are located on your filesystem
-* Wait for build to finish
-
-After the build is finished, the resulting apk can be fond in
-build/android/bin/. It will be called Minetest-debug.apk
+The new build system Minetest Android is fully functional and is designed to
+speed up and simplify the work, as well as adding the possibility of
+cross-platform build.
+You can use `./gradlew assemblerelease` or `./gradlew assembledebug` from the
+command line or use Android Studio and click the build button.
 
-Release build:
+When using gradlew, the newest NDK will be downloaded and installed
+automatically. Or you can create a `local.properties` file and specify
+`sdk.dir` and `ndk.dir` yourself.
 
 * In order to make a release build you'll have to have a keystore setup to sign
   the resulting apk package. How this is done is not part of this README. There
@@ -97,32 +76,6 @@ Release build:
 
 * Once your keystore is setup, enter build/android subdirectory and create a new
   file "ant.properties" there. Add following lines to that file:
-  
+
   > key.store=<path to your keystore>
   > key.alias=Minetest
-
-* Execute "make release"
-* Enter your keystore as well as your Mintest key password once asked. Be
-  careful it's shown on console in clear text!
-* The result can be found at "bin/Minetest-release.apk"
-
-Other things that may be nice to know
-------------
-* The environment for Android development tools is saved within Android build
-  build folder. If you want direct access to it do:
-  
-  > make envpaths
-  > . and_env
-  
-  After you've done this you'll have your path and path variables set correct
-  to use adb and all other Android development tools
-
-* You can build a single dependency by calling make and the dependency's name,
-  e.g.:
-
-  > make irrlicht
-
-* You can completely cleanup a dependency by calling make and the "clean" target,
-  e.g.:
-
-  > make clean_irrlicht
index 039100914499464da3cb7a80294eafdc443f17d9..9d58a8cc1740675c3bf39e99edd7c74adb9b8fdd 100644 (file)
 
 #if defined USE_CMAKE_CONFIG_H
        #include "cmake_config.h"
-#elif defined (__ANDROID__) || defined (ANDROID)
+#elif defined (__ANDROID__)
        #define PROJECT_NAME "minetest"
        #define PROJECT_NAME_C "Minetest"
        #define STATIC_SHAREDIR ""
-       #include "android_version.h"
-       #ifdef NDEBUG
+       #define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) STR(VERSION_EXTRA)
+#ifdef NDEBUG
                #define BUILD_TYPE "Release"
        #else
                #define BUILD_TYPE "Debug"
index 8df2fe7d3de8b7055e79f595ba12f2618bb556dd..db020661a7c4b97269617750bd7e212ed361111a 100644 (file)
@@ -457,7 +457,6 @@ static bool create_userdata_path()
        } else {
                success = true;
        }
-       porting::copyAssets();
 #else
        // Create user data directory
        success = fs::CreateDir(porting::path_user);
index 7c74f7b5b22dda0d4d3e7fa1a16fc3e09d4f0e9c..4130bdb6d2045f4eaac4a4da80142fc9016f57c1 100644 (file)
@@ -69,10 +69,10 @@ void android_main(android_app *app)
 /* TODO this doesn't work as expected, no idea why but there's a workaround   */
 /* for it right now */
 extern "C" {
-       JNIEXPORT void JNICALL Java_net_minetest_MtNativeActivity_putMessageBoxResult(
+       JNIEXPORT void JNICALL Java_net_minetest_minetest_GameActivity_putMessageBoxResult(
                        JNIEnv * env, jclass thiz, jstring text)
        {
-               errorstream << "Java_net_minetest_MtNativeActivity_putMessageBoxResult got: "
+               errorstream << "Java_net_minetest_minetest_GameActivity_putMessageBoxResult got: "
                                << std::string((const char*)env->GetStringChars(text,0))
                                << std::endl;
        }
@@ -107,17 +107,6 @@ jclass findClass(std::string classname)
        return (jclass) jnienv->CallObjectMethod(cls, findClass, strClassName);
 }
 
-void copyAssets()
-{
-       jmethodID assetcopy = jnienv->GetMethodID(nativeActivity,"copyAssets","()V");
-
-       if (assetcopy == 0) {
-               assert("porting::copyAssets unable to find copy assets method" == 0);
-       }
-
-       jnienv->CallVoidMethod(app_global->activity->clazz, assetcopy);
-}
-
 void initAndroid()
 {
        porting::jnienv = NULL;
@@ -136,7 +125,7 @@ void initAndroid()
                exit(-1);
        }
 
-       nativeActivity = findClass("net/minetest/minetest/MtNativeActivity");
+       nativeActivity = findClass("net/minetest/minetest/GameActivity");
        if (nativeActivity == 0) {
                errorstream <<
                        "porting::initAndroid unable to find java native activity class" <<
index 0b3f2575eaf7b760d2c66d64f5f5a5a88f786d9e..60eb2a9c0794ca145d60661e10f938ac1d9963a7 100644 (file)
@@ -48,11 +48,6 @@ void cleanupAndroid();
  */
 void initializePathsAndroid();
 
-/**
- * use java function to copy media from assets to external storage
- */
-void copyAssets();
-
 /**
  * show text input dialog in java
  * @param acceptButton text to display on accept button
index c0c59ee99f089c23bae257614c2777fcfd056a95..ae5ca34125ffe49d2d9894018d390df2482d43f5 100644 (file)
@@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "version.h"
 #include "config.h"
 
-#if defined(__ANDROID__)
-       #include "android_version.h"
-       #include "android_version_githash.h"
-#elif defined(USE_CMAKE_CONFIG_H)
+#if USE_CMAKE_CONFIG_H
        #include "cmake_config_githash.h"
 #endif