aboutsummaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
authorMaksim <MoNTE48@mail.ua>2020-04-15 16:27:40 +0200
committerGitHub <noreply@github.com>2020-04-15 16:27:40 +0200
commit62ae7adab2bebde04864c12543caefbffab24963 (patch)
tree1cad2b08c94c2de26a39124f3b3dd0d513cbcc99 /build
parent8ae8c1600a66c724565ce7a70e0e5f542f12e38e (diff)
downloadminetest-62ae7adab2bebde04864c12543caefbffab24963.tar.gz
minetest-62ae7adab2bebde04864c12543caefbffab24963.tar.bz2
minetest-62ae7adab2bebde04864c12543caefbffab24963.zip
Android: add Android Studio support, completely redone java part (#9066)
Diffstat (limited to 'build')
-rw-r--r--build/android/.gitignore11
-rw-r--r--build/android/Makefile763
-rw-r--r--build/android/app/build.gradle108
-rw-r--r--build/android/app/src/main/AndroidManifest.xml (renamed from build/android/src/main/AndroidManifest.xml)38
-rw-r--r--build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java82
-rw-r--r--build/android/app/src/main/java/net/minetest/minetest/GameActivity.java (renamed from build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java)104
-rw-r--r--build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java98
-rw-r--r--build/android/app/src/main/java/net/minetest/minetest/MainActivity.java139
-rw-r--r--build/android/app/src/main/java/net/minetest/minetest/UnzipService.java153
-rw-r--r--build/android/app/src/main/res/drawable/background.png (renamed from build/android/src/main/res/drawable/background.png)bin83 -> 83 bytes
-rw-r--r--build/android/app/src/main/res/drawable/bg.xml (renamed from build/android/src/main/res/drawable/bg.xml)2
-rw-r--r--build/android/app/src/main/res/layout/activity_main.xml30
-rw-r--r--build/android/app/src/main/res/mipmap/ic_launcher.png (renamed from build/android/src/main/res/mipmap/ic_launcher.png)bin5780 -> 5780 bytes
-rw-r--r--build/android/app/src/main/res/values/strings.xml10
-rw-r--r--build/android/app/src/main/res/values/styles.xml22
-rw-r--r--build/android/build.gradle175
-rw-r--r--build/android/gradle.properties11
-rw-r--r--build/android/gradle/wrapper/gradle-wrapper.jarbin54731 -> 55616 bytes
-rw-r--r--build/android/gradle/wrapper/gradle-wrapper.properties3
-rwxr-xr-xbuild/android/gradlew22
-rw-r--r--build/android/gradlew.bat18
-rw-r--r--build/android/jni/Android.mk448
-rw-r--r--build/android/jni/Application.mk9
-rw-r--r--build/android/jni/Deps.mk7
-rw-r--r--build/android/jni/Irrlicht.mk8
-rw-r--r--build/android/native/build.gradle59
-rw-r--r--build/android/native/jni/Android.mk218
-rw-r--r--build/android/native/jni/Application.mk32
-rw-r--r--build/android/native/src/main/AndroidManifest.xml1
-rw-r--r--build/android/patches/irrlicht-back_button.patch20
-rw-r--r--build/android/patches/irrlicht-native_activity.patch13
-rw-r--r--build/android/patches/irrlicht-texturehack.patch240
-rw-r--r--build/android/patches/irrlicht-touchcount.patch30
-rw-r--r--build/android/patches/libvorbis-libogg-fpu.patch37
-rw-r--r--build/android/patches/openssl_arch.patch13
-rw-r--r--build/android/settings.gradle1
-rw-r--r--build/android/src/main/java/net.minetest.minetest/MainActivity.java77
-rw-r--r--build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java371
-rw-r--r--build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java87
-rw-r--r--build/android/src/main/res/layout/assetcopy.xml24
-rw-r--r--build/android/src/main/res/values-v21/styles.xml17
-rw-r--r--build/android/src/main/res/values/strings.xml5
-rw-r--r--build/android/src/main/res/values/styles.xml14
43 files changed, 1107 insertions, 2413 deletions
diff --git a/build/android/.gitignore b/build/android/.gitignore
new file mode 100644
index 000000000..e0613f8b3
--- /dev/null
+++ b/build/android/.gitignore
@@ -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
index 9ec237a75..000000000
--- a/build/android/Makefile
+++ /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
index 000000000..6a34a6d70
--- /dev/null
+++ b/build/android/app/build.gradle
@@ -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/src/main/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml
index fb1de9cf0..3a5342751 100644
--- a/build/android/src/main/AndroidManifest.xml
+++ b/build/android/app/src/main/AndroidManifest.xml
@@ -4,28 +4,24 @@
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:allowBackup="false"
android:icon="@mipmap/ic_launcher"
- android:label="${project}"
+ android:label="@string/label"
android:resizeableActivity="false"
- tools:targetApi="n">
+ tools:ignore="UnusedAttribute">
<meta-data
android:name="android.max_aspect"
- android:value="2.4" />
+ android:value="3" />
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
- android:label="${project}"
- android:launchMode="singleTask"
+ android:maxAspectRatio="3"
android:screenOrientation="sensorLandscape"
android:theme="@style/AppTheme">
<intent-filter>
@@ -33,11 +29,13 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+
<activity
- android:name=".MtNativeActivity"
+ 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>
@@ -45,16 +43,18 @@
</intent-filter>
<meta-data
android:name="android.app.lib_name"
- android:value="minetest" />
+ 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" />
+ 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
index 000000000..770995502
--- /dev/null
+++ b/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java
@@ -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/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java
index f49d078fe..02b61b598 100644
--- a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
+++ b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java
@@ -1,3 +1,23 @@
+/*
+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;
@@ -7,19 +27,14 @@ import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
-public class MtNativeActivity extends NativeActivity {
-
+public class GameActivity extends NativeActivity {
static {
System.loadLibrary("c++_shared");
- System.loadLibrary("openal");
- System.loadLibrary("ogg");
- System.loadLibrary("vorbis");
- System.loadLibrary("iconv");
- System.loadLibrary("minetest");
+ System.loadLibrary("Minetest");
}
- private int m_MessagReturnCode;
- private String m_MessageReturnValue;
+ private int messageReturnCode;
+ private String messageReturnValue;
public static native void putMessageBoxResult(String text);
@@ -27,20 +42,16 @@ public class MtNativeActivity extends NativeActivity {
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();
+ 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);
+ View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
@Override
@@ -50,15 +61,31 @@ public class MtNativeActivity extends NativeActivity {
makeFullScreen();
}
- public void copyAssets() {
- Intent intent = new Intent(this, MinetestAssetCopy.class);
- startActivity(intent);
+ @Override
+ protected void onResume() {
+ super.onResume();
+ makeFullScreen();
}
- public void showDialog(String acceptButton, String hint, String current,
- int editType) {
+ @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;
+ }
+ }
- Intent intent = new Intent(this, MinetestTextEntry.class);
+ 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);
@@ -66,43 +93,28 @@ public class MtNativeActivity extends NativeActivity {
params.putInt("editType", editType);
intent.putExtras(params);
startActivityForResult(intent, 101);
- m_MessageReturnValue = "";
- m_MessagReturnCode = -1;
+ messageReturnValue = "";
+ messageReturnCode = -1;
}
- /* ugly code to workaround putMessageBoxResult not beeing found */
public int getDialogState() {
- return m_MessagReturnCode;
+ return messageReturnCode;
}
public String getDialogValue() {
- m_MessagReturnCode = -1;
- return m_MessageReturnValue;
+ messageReturnCode = -1;
+ return 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;
- }
- }
+ 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
index 000000000..7c6aa111d
--- /dev/null
+++ b/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java
@@ -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
index 000000000..f37ae6d4b
--- /dev/null
+++ b/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java
@@ -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
index 000000000..ac9116994
--- /dev/null
+++ b/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java
@@ -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/src/main/res/drawable/background.png b/build/android/app/src/main/res/drawable/background.png
index 43bd6089e..43bd6089e 100644
--- a/build/android/src/main/res/drawable/background.png
+++ b/build/android/app/src/main/res/drawable/background.png
Binary files differ
diff --git a/build/android/src/main/res/drawable/bg.xml b/build/android/app/src/main/res/drawable/bg.xml
index c76ec372d..903335ed9 100644
--- a/build/android/src/main/res/drawable/bg.xml
+++ b/build/android/app/src/main/res/drawable/bg.xml
@@ -1,4 +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" /> \ No newline at end of file
+ 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
index 000000000..e6f461f14
--- /dev/null
+++ b/build/android/app/src/main/res/layout/activity_main.xml
@@ -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/src/main/res/mipmap/ic_launcher.png b/build/android/app/src/main/res/mipmap/ic_launcher.png
index 88a83782c..88a83782c 100644
--- a/build/android/src/main/res/mipmap/ic_launcher.png
+++ b/build/android/app/src/main/res/mipmap/ic_launcher.png
Binary files 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
index 000000000..a6fba70d5
--- /dev/null
+++ b/build/android/app/src/main/res/values/strings.xml
@@ -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
index 000000000..618507e63
--- /dev/null
+++ b/build/android/app/src/main/res/values/styles.xml
@@ -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>
diff --git a/build/android/build.gradle b/build/android/build.gradle
index fa74cd497..b02e8c6df 100644
--- a/build/android/build.gradle
+++ b/build/android/build.gradle
@@ -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
}
diff --git a/build/android/gradle.properties b/build/android/gradle.properties
index 5465fec0e..53b475cf9 100644
--- a/build/android/gradle.properties
+++ b/build/android/gradle.properties
@@ -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
diff --git a/build/android/gradle/wrapper/gradle-wrapper.jar b/build/android/gradle/wrapper/gradle-wrapper.jar
index 6b6ea3ab4..5c2d1cf01 100644
--- a/build/android/gradle/wrapper/gradle-wrapper.jar
+++ b/build/android/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties
index 22ac96460..d612cf333 100644
--- a/build/android/gradle/wrapper/gradle-wrapper.properties
+++ b/build/android/gradle/wrapper/gradle-wrapper.properties
@@ -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
diff --git a/build/android/gradlew b/build/android/gradlew
index cccdd3d51..83f2acfdc 100755
--- a/build/android/gradlew
+++ b/build/android/gradlew
@@ -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"`
diff --git a/build/android/gradlew.bat b/build/android/gradlew.bat
index f9553162f..9618d8d96 100644
--- a/build/android/gradlew.bat
+++ b/build/android/gradlew.bat
@@ -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
index b67322d79..000000000
--- a/build/android/jni/Android.mk
+++ /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
index f5eb96ed1..000000000
--- a/build/android/jni/Application.mk
+++ /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
index 73db2353f..000000000
--- a/build/android/jni/Deps.mk
+++ /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
index cedfe3139..000000000
--- a/build/android/jni/Irrlicht.mk
+++ /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
index 000000000..f06e4e3f0
--- /dev/null
+++ b/build/android/native/build.gradle
@@ -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
index 000000000..a5cb099e6
--- /dev/null
+++ b/build/android/native/jni/Android.mk
@@ -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
index 000000000..82f0148f0
--- /dev/null
+++ b/build/android/native/jni/Application.mk
@@ -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
index 000000000..19451c7fd
--- /dev/null
+++ b/build/android/native/src/main/AndroidManifest.xml
@@ -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
index e17b81347..000000000
--- a/build/android/patches/irrlicht-back_button.patch
+++ /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;
- }
-
-- device->postEventFromUser(event);
-+ status = device->postEventFromUser(event);
- }
- break;
- default:
-@@ -543,7 +543,7 @@
- KeyMap[1] = KEY_LBUTTON; // AKEYCODE_SOFT_LEFT
- KeyMap[2] = KEY_RBUTTON; // AKEYCODE_SOFT_RIGHT
- KeyMap[3] = KEY_HOME; // AKEYCODE_HOME
-- KeyMap[4] = KEY_BACK; // AKEYCODE_BACK
-+ KeyMap[4] = KEY_CANCEL; // AKEYCODE_BACK
- KeyMap[5] = KEY_UNKNOWN; // AKEYCODE_CALL
- KeyMap[6] = KEY_UNKNOWN; // AKEYCODE_ENDCALL
- KeyMap[7] = KEY_KEY_0; // AKEYCODE_0
diff --git a/build/android/patches/irrlicht-native_activity.patch b/build/android/patches/irrlicht-native_activity.patch
deleted file mode 100644
index a9d2610c3..000000000
--- a/build/android/patches/irrlicht-native_activity.patch
+++ /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"
- #include "os.h"
-
-+#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
-+#include <android/native_activity.h>
-+#endif
-+
- namespace irr
- {
- namespace video
diff --git a/build/android/patches/irrlicht-texturehack.patch b/build/android/patches/irrlicht-texturehack.patch
deleted file mode 100644
index a458ede72..000000000
--- a/build/android/patches/irrlicht-texturehack.patch
+++ /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;
- getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);
-
-- // make sure we don't change the internal format of existing images
-- if (!newTexture)
-- InternalFormat = oldInternalFormat;
--
-- Driver->setActiveTexture(0, this);
--
-- if (Driver->testGLError())
-- os::Printer::log("Could not bind Texture", ELL_ERROR);
--
-- // mipmap handling for main texture
-- if (!level && newTexture)
-- {
-- // auto generate if possible and no mipmap data is given
-- if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
-- {
-- if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
-- glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
-- else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
-- glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
-- else
-- glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
-+ bool retry = false;
-+
-+ do {
-+ if (retry) {
-+ InternalFormat = GL_RGBA;
-+ PixelFormat = GL_RGBA;
-+ convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;
-+ }
-+ // make sure we don't change the internal format of existing images
-+ if (!newTexture)
-+ InternalFormat = oldInternalFormat;
-
-- glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
-- AutomaticMipmapUpdate=true;
-- }
-+ Driver->setActiveTexture(0, this);
-
-- // enable bilinear filter without mipmaps
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
-- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
-- }
-+ if (Driver->testGLError())
-+ os::Printer::log("Could not bind Texture", ELL_ERROR);
-
-- // now get image data and upload to GPU
-+ // mipmap handling for main texture
-+ if (!level && newTexture)
-+ {
-+ // auto generate if possible and no mipmap data is given
-+ if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
-+ {
-+ if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
-+ glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
-+ else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
-+ glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
-+ else
-+ glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
-+
-+ glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
-+ AutomaticMipmapUpdate=true;
-+ }
-+
-+ // enable bilinear filter without mipmaps
-+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
-+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
-+ }
-
-- u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
-+ // now get image data and upload to GPU
-
-- void* source = image->lock();
-+ u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
-
-- IImage* tmpImage = 0;
-+ void* source = image->lock();
-
-- if (convert)
-- {
-- tmpImage = new CImage(image->getColorFormat(), image->getDimension());
-- void* dest = tmpImage->lock();
-- convert(source, image->getDimension().getArea(), dest);
-- image->unlock();
-- source = dest;
-- }
-+ IImage* tmpImage = 0;
-
-- if (newTexture)
-- {
-- if (IsCompressed)
-+ if (convert)
- {
-- glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
-- image->getDimension().Height, 0, compressedImageSize, source);
-+ tmpImage = new CImage(image->getColorFormat(), image->getDimension());
-+ void* dest = tmpImage->lock();
-+ convert(source, image->getDimension().getArea(), dest);
-+ image->unlock();
-+ source = dest;
- }
-- else
-- glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
-- image->getDimension().Height, 0, PixelFormat, PixelType, source);
-- }
-- else
-- {
-- if (IsCompressed)
-+
-+ if (newTexture)
- {
-- glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
-- image->getDimension().Height, PixelFormat, compressedImageSize, source);
-+ if (IsCompressed)
-+ {
-+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
-+ image->getDimension().Height, 0, compressedImageSize, source);
-+ }
-+ else
-+ glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
-+ image->getDimension().Height, 0, PixelFormat, PixelType, source);
- }
- else
-- glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
-- image->getDimension().Height, PixelFormat, PixelType, source);
-- }
--
-- if (convert)
-- {
-- tmpImage->unlock();
-- tmpImage->drop();
-- }
-- else
-- image->unlock();
--
-- if (!level && newTexture)
-- {
-- if (IsCompressed && !mipmapData)
- {
-- if (image->hasMipMaps())
-- mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
-+ if (IsCompressed)
-+ {
-+ glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
-+ image->getDimension().Height, PixelFormat, compressedImageSize, source);
-+ }
- else
-- HasMipMaps = false;
-+ glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
-+ image->getDimension().Height, PixelFormat, PixelType, source);
- }
-
-- regenerateMipMapLevels(mipmapData);
--
-- if (HasMipMaps) // might have changed in regenerateMipMapLevels
-+ if (convert)
- {
-- // enable bilinear mipmap filter
-- GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
--
-- if (filtering != GL_LINEAR)
-- filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
-+ tmpImage->unlock();
-+ tmpImage->drop();
-+ }
-+ else
-+ image->unlock();
-+
-+ if (glGetError() != GL_NO_ERROR) {
-+ static bool warned = false;
-+ if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {
-+
-+ if (!warned) {
-+ 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);
-+ warned = true;
-+ }
-+ }
-+ else if (retry) {
-+ os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);
-+ }
-+ retry = !retry;
-+ continue;
-+ } else {
-+ retry = false;
-+ }
-
-- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
-- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
-+ if (!level && newTexture)
-+ {
-+ if (IsCompressed && !mipmapData)
-+ {
-+ if (image->hasMipMaps())
-+ mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
-+ else
-+ HasMipMaps = false;
-+ }
-+
-+ regenerateMipMapLevels(mipmapData);
-+
-+ if (HasMipMaps) // might have changed in regenerateMipMapLevels
-+ {
-+ // enable bilinear mipmap filter
-+ GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
-+
-+ if (filtering != GL_LINEAR)
-+ filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
-+
-+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
-+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
-+ }
- }
-- }
-
-- if (Driver->testGLError())
-- os::Printer::log("Could not glTexImage2D", ELL_ERROR);
-+ if (Driver->testGLError())
-+ os::Printer::log("Could not glTexImage2D", ELL_ERROR);
-+ }
-+ while(retry);
- }
-
-
---- 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;
- }
-
-+ //clear old error
-+ glGetError();
-+
- if (newTexture)
- {
- if (IsCompressed)
diff --git a/build/android/patches/irrlicht-touchcount.patch b/build/android/patches/irrlicht-touchcount.patch
deleted file mode 100644
index d4e4b9c3e..000000000
--- a/build/android/patches/irrlicht-touchcount.patch
+++ /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.
- s32 Y;
-
-+ // number of current touches
-+ s32 touchedCount;
-+
- //! Type of touch event.
- ETOUCH_INPUT_EVENT Event;
- };
---- 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);
- event.TouchInput.X = AMotionEvent_getX(androidEvent, i);
- event.TouchInput.Y = AMotionEvent_getY(androidEvent, i);
-+ event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);
-
- device->postEventFromUser(event);
- }
-@@ -326,6 +327,7 @@
- event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, pointerIndex);
- event.TouchInput.X = AMotionEvent_getX(androidEvent, pointerIndex);
- event.TouchInput.Y = AMotionEvent_getY(androidEvent, pointerIndex);
-+ event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);
-
- device->postEventFromUser(event);
- }
diff --git a/build/android/patches/libvorbis-libogg-fpu.patch b/build/android/patches/libvorbis-libogg-fpu.patch
deleted file mode 100644
index 52ab397ac..000000000
--- a/build/android/patches/libvorbis-libogg-fpu.patch
+++ /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
index d15e2b137..000000000
--- a/build/android/patches/openssl_arch.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- openssl-1.0.2e.orig/Configure 2015-12-03 15:04:23.000000000 +0100
-+++ openssl-1.0.2e/Configure 2015-12-14 21:01:40.351265968 +0100
-@@ -464,8 +464,10 @@
- # Android: linux-* but without pointers to headers and libs.
- "android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-arm","gcc:-march=armv4 -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
- "android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-+"android-mips32","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-
- #### *BSD [do see comment about ${BSDthreads} above!]
- "BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
diff --git a/build/android/settings.gradle b/build/android/settings.gradle
index b0cee5dad..b048fca7c 100644
--- a/build/android/settings.gradle
+++ b/build/android/settings.gradle
@@ -1 +1,2 @@
rootProject.name = "Minetest"
+include ':app', ':native'
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
index 71b0ce144..000000000
--- a/build/android/src/main/java/net.minetest.minetest/MainActivity.java
+++ /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
index 84cfca796..000000000
--- a/build/android/src/main/java/net.minetest.minetest/MinetestAssetCopy.java
+++ /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
index cb7ba8d3b..000000000
--- a/build/android/src/main/java/net.minetest.minetest/MinetestTextEntry.java
+++ /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/res/layout/assetcopy.xml b/build/android/src/main/res/layout/assetcopy.xml
deleted file mode 100644
index b3da2f027..000000000
--- a/build/android/src/main/res/layout/assetcopy.xml
+++ /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/values-v21/styles.xml b/build/android/src/main/res/values-v21/styles.xml
deleted file mode 100644
index 8b0777467..000000000
--- a/build/android/src/main/res/values-v21/styles.xml
+++ /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
index a5eaef5d1..000000000
--- a/build/android/src/main/res/values/strings.xml
+++ /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
index 1bd41ae76..000000000
--- a/build/android/src/main/res/values/styles.xml
+++ /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>