From 3a2d1525738f962da9196d980d6f6b54c0b63dcd Mon Sep 17 00:00:00 2001 From: Gerhard Stein Date: Sat, 25 Jun 2016 18:13:43 +0200 Subject: [PATCH 1/7] Banner for Commander Genius --- .../commandergenius/AndroidAppSettings.cfg | 6 +++--- .../jni/application/commandergenius/banner.png | Bin 0 -> 35644 bytes .../application/commandergenius/commandergenius | 2 +- project/jni/application/vice/vice | 2 +- project/jni/boost/src | 2 +- .../jni/openssl/include/openssl/opensslconf.h | 4 ++-- project/jni/shmem | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 project/jni/application/commandergenius/banner.png diff --git a/project/jni/application/commandergenius/AndroidAppSettings.cfg b/project/jni/application/commandergenius/AndroidAppSettings.cfg index 156a35808..e1bc76522 100644 --- a/project/jni/application/commandergenius/AndroidAppSettings.cfg +++ b/project/jni/application/commandergenius/AndroidAppSettings.cfg @@ -7,10 +7,10 @@ AppName="Commander Genius" AppFullName=net.sourceforge.clonekeenplus # Application version code (integer) -AppVersionCode=193000 +AppVersionCode=195000 # Application user-visible version name (string) -AppVersionName="1.9.3.0 Beta" +AppVersionName="1.9.5.0 Beta" # Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...' # If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu @@ -220,7 +220,7 @@ AppCflags='-frtti -fexceptions -finline-functions -DOGG=1 -DANDROID=1 -DREFKEEN_ # Additional LDFLAGS for application #AppLdflags='-ltremor' -AppLdflags='-lvorbis -logg' +AppLdflags='-lvorbis -logg -lcrypto -lssl -lcurl' # If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable AppOverlapsSystemHeaders= diff --git a/project/jni/application/commandergenius/banner.png b/project/jni/application/commandergenius/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..436168fdf760924a1773f1e69409b28028926323 GIT binary patch literal 35644 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%0AOy!22 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 AivR!s literal 0 HcmV?d00001 diff --git a/project/jni/application/commandergenius/commandergenius b/project/jni/application/commandergenius/commandergenius index c5210b0c4..b0b321ad4 160000 --- a/project/jni/application/commandergenius/commandergenius +++ b/project/jni/application/commandergenius/commandergenius @@ -1 +1 @@ -Subproject commit c5210b0c4209d6c9b6a49350057877448882a776 +Subproject commit b0b321ad47f2bd6c06d9c0cf85d7b93b08bc4661 diff --git a/project/jni/application/vice/vice b/project/jni/application/vice/vice index 18d3739b3..0b817c357 160000 --- a/project/jni/application/vice/vice +++ b/project/jni/application/vice/vice @@ -1 +1 @@ -Subproject commit 18d3739b3368581ade39fd69767ab5fa321a4ccc +Subproject commit 0b817c357e5a25d37df98d97930469bd485ebb4c diff --git a/project/jni/boost/src b/project/jni/boost/src index bc9ea9d30..5824acb45 160000 --- a/project/jni/boost/src +++ b/project/jni/boost/src @@ -1 +1 @@ -Subproject commit bc9ea9d3032eb1e2b095484e2052aa2bc2e91767 +Subproject commit 5824acb451e671205afeb188576be1dd9a2674bd diff --git a/project/jni/openssl/include/openssl/opensslconf.h b/project/jni/openssl/include/openssl/opensslconf.h index 7817a54d9..b7704fb7f 100644 --- a/project/jni/openssl/include/openssl/opensslconf.h +++ b/project/jni/openssl/include/openssl/opensslconf.h @@ -118,8 +118,8 @@ extern "C" { #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) -#define ENGINESDIR "/home/pelya/src/endless_space/SDL-android/project/jni/openssl/build/armeabi-v7a/dist/lib/engines" -#define OPENSSLDIR "/home/pelya/src/endless_space/SDL-android/project/jni/openssl/build/armeabi-v7a/dist/ssl" +#define ENGINESDIR "/home/gerstrong/workspace/SDLAndroid/project/jni/openssl/build/armeabi-v7a/dist/lib/engines" +#define OPENSSLDIR "/home/gerstrong/workspace/SDLAndroid/project/jni/openssl/build/armeabi-v7a/dist/ssl" #endif #endif diff --git a/project/jni/shmem b/project/jni/shmem index f6b49516c..c2a28f528 160000 --- a/project/jni/shmem +++ b/project/jni/shmem @@ -1 +1 @@ -Subproject commit f6b49516cf4b13f455a19ec989626be5472830c5 +Subproject commit c2a28f528d0b1b2528dda125e8fe8018609e7e9a From cd9247551622c6318d3b18969732b9f1916ad0df Mon Sep 17 00:00:00 2001 From: Gerhard Stein Date: Sat, 25 Jun 2016 19:39:36 +0200 Subject: [PATCH 2/7] Updated Commander Genius version --- .../jni/application/commandergenius/AndroidAppSettings.cfg | 6 +++--- project/jni/application/commandergenius/commandergenius | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/project/jni/application/commandergenius/AndroidAppSettings.cfg b/project/jni/application/commandergenius/AndroidAppSettings.cfg index e1bc76522..19c2afc4c 100644 --- a/project/jni/application/commandergenius/AndroidAppSettings.cfg +++ b/project/jni/application/commandergenius/AndroidAppSettings.cfg @@ -209,18 +209,18 @@ AppMinimumRAM=64 # Optional shared libraries to compile - removing some of them will save space # MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed # Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2 -CompiledLibraries="ogg sdl_image boost_system" +CompiledLibraries="sdl_image boost_system crypto ssl curl vorbis ogg" # Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n) CustomBuildScript=n # Aditional CFLAGS for application -AppCflags='-frtti -fexceptions -finline-functions -DOGG=1 -DANDROID=1 -DREFKEEN_VER_KDREAMS -DGRMODE=EGAGR -DREFKEEN_VER_KDREAMS_ANYEGA_ALL -DBUILD_TYPE=LINUX -DTARGET_LNX=1 -DNOTYPESAVE -Werror=strict-aliasing -Werror=cast-align -Werror=pointer-arith -Werror=address -std=c++11 -Ijni/../jni/application/commandergenius/commandergenius/lib/GsKit -Ijni/vorbis/include/vorbis' +AppCflags='-frtti -fexceptions -finline-functions -DOGG=1 -DDOWNLOADER=1 -DANDROID=1 -DREFKEEN_VER_KDREAMS -DGRMODE=EGAGR -DREFKEEN_VER_KDREAMS_ANYEGA_ALL -DBUILD_TYPE=LINUX -DTARGET_LNX=1 -DNOTYPESAVE -Werror=strict-aliasing -Werror=cast-align -Werror=pointer-arith -Werror=address -std=c++11 -Ijni/../jni/application/commandergenius/commandergenius/lib/GsKit -Ijni/vorbis/include/vorbis -Ijni/curl/include' # Additional LDFLAGS for application #AppLdflags='-ltremor' -AppLdflags='-lvorbis -logg -lcrypto -lssl -lcurl' +#AppLdflags='-lvorbis -logg -lcrypto -lssl -lcurl' # If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable AppOverlapsSystemHeaders= diff --git a/project/jni/application/commandergenius/commandergenius b/project/jni/application/commandergenius/commandergenius index b0b321ad4..c1b9169b9 160000 --- a/project/jni/application/commandergenius/commandergenius +++ b/project/jni/application/commandergenius/commandergenius @@ -1 +1 @@ -Subproject commit b0b321ad47f2bd6c06d9c0cf85d7b93b08bc4661 +Subproject commit c1b9169b9fba8cf7374498964f392fd322be0403 From 29f07b59a53d765ec2508159c6d50b1f5fd139ee Mon Sep 17 00:00:00 2001 From: Gerhard Stein Date: Sun, 26 Jun 2016 19:56:06 +0200 Subject: [PATCH 3/7] Commander Genius update --- .../jni/application/commandergenius/AndroidAppSettings.cfg | 5 +++-- project/jni/application/commandergenius/commandergenius | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/project/jni/application/commandergenius/AndroidAppSettings.cfg b/project/jni/application/commandergenius/AndroidAppSettings.cfg index 19c2afc4c..ae6e947cd 100644 --- a/project/jni/application/commandergenius/AndroidAppSettings.cfg +++ b/project/jni/application/commandergenius/AndroidAppSettings.cfg @@ -201,7 +201,7 @@ FirstStartMenuOptions='' # Enable multi-ABI binary, with hardware FPU support - it will also work on old devices, # but .apk size is 2x bigger (y) / (n) / (x86) / (all) -MultiABI='all' +MultiABI='n' # Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower AppMinimumRAM=64 @@ -215,12 +215,13 @@ CompiledLibraries="sdl_image boost_system crypto ssl curl vorbis ogg" CustomBuildScript=n # Aditional CFLAGS for application -AppCflags='-frtti -fexceptions -finline-functions -DOGG=1 -DDOWNLOADER=1 -DANDROID=1 -DREFKEEN_VER_KDREAMS -DGRMODE=EGAGR -DREFKEEN_VER_KDREAMS_ANYEGA_ALL -DBUILD_TYPE=LINUX -DTARGET_LNX=1 -DNOTYPESAVE -Werror=strict-aliasing -Werror=cast-align -Werror=pointer-arith -Werror=address -std=c++11 -Ijni/../jni/application/commandergenius/commandergenius/lib/GsKit -Ijni/vorbis/include/vorbis -Ijni/curl/include' +AppCflags='-frtti -fexceptions -finline-functions -DOGG=1 -DDOWNLOADER=1 -DANDROID=1 -DREFKEEN_VER_KDREAMS -DGRMODE=EGAGR -DREFKEEN_VER_KDREAMS_ANYEGA_ALL -DIOAPI_NO_64 -DBUILD_TYPE=LINUX -DTARGET_LNX=1 -DNOTYPESAVE -Werror=strict-aliasing -Werror=cast-align -Werror=pointer-arith -Werror=address -std=c++11 -Ijni/../jni/application/commandergenius/commandergenius/lib/GsKit -Ijni/vorbis/include/vorbis -Ijni/curl/include' # Additional LDFLAGS for application #AppLdflags='-ltremor' #AppLdflags='-lvorbis -logg -lcrypto -lssl -lcurl' +AppLdflags='-lz -lvorbis -logg' # If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable AppOverlapsSystemHeaders= diff --git a/project/jni/application/commandergenius/commandergenius b/project/jni/application/commandergenius/commandergenius index c1b9169b9..72483aa8c 160000 --- a/project/jni/application/commandergenius/commandergenius +++ b/project/jni/application/commandergenius/commandergenius @@ -1 +1 @@ -Subproject commit c1b9169b9fba8cf7374498964f392fd322be0403 +Subproject commit 72483aa8c1f681e1528f1918a0afcd1c7b60602e From dd90b7ec96d3403409b802ea4e8de478fb190451 Mon Sep 17 00:00:00 2001 From: pelya Date: Sun, 26 Jun 2016 23:12:01 +0300 Subject: [PATCH 4/7] XSDL: fixed compilation with NDK r12 --- project/jni/application/xserver/AndroidBuild.sh | 6 +++--- project/jni/application/xserver/pulseaudio | 2 +- project/jni/application/xserver/xserver | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/project/jni/application/xserver/AndroidBuild.sh b/project/jni/application/xserver/AndroidBuild.sh index 7e4d2175c..1a8d7280a 100755 --- a/project/jni/application/xserver/AndroidBuild.sh +++ b/project/jni/application/xserver/AndroidBuild.sh @@ -4,13 +4,13 @@ CURDIR=`pwd` PACKAGE_NAME=`grep AppFullName AndroidAppSettings.cfg | sed 's/.*=//'` -[ -e pulseaudio/android-build.sh ] && { +if [ -e pulseaudio/android-build.sh ]; then [ -e pulseaudio/$1/install/bin/pulseaudio ] || { cd pulseaudio ./android-build.sh || exit 1 cd .. } || exit 1 -} || exit 1 +fi ../setEnvironment-$1.sh sh -c '\ $CC $CFLAGS -Werror=format -c main.c -o main-'"$1.o" || exit 1 @@ -72,7 +72,7 @@ xkb/.libs/libxkbstubs.a \ composite/.libs/libcomposite.a \ os/.libs/libos.a \ hw/kdrive/linux/.libs/liblinux.a \ --lpixman-1 -lXfont -lXau -lXdmcp -lfontenc -lts -lfreetype -landroid-shmem -lcrypto' \ +-lpixman-1 -lXfont -lXau -lXdmcp -lfontenc -lts -lfreetype -landroid-shmem -l:libcrypto.so.sdl.0.so' \ || exit 1 rm -rf $CURDIR/tmp-$1 diff --git a/project/jni/application/xserver/pulseaudio b/project/jni/application/xserver/pulseaudio index f04d54127..37ce31ed3 160000 --- a/project/jni/application/xserver/pulseaudio +++ b/project/jni/application/xserver/pulseaudio @@ -1 +1 @@ -Subproject commit f04d541277106e3310e4da6f84ebf4a8d2cb54ef +Subproject commit 37ce31ed32cf34fcb2f2fdbda40b6f24a9dd3424 diff --git a/project/jni/application/xserver/xserver b/project/jni/application/xserver/xserver index ad7ad4873..6ea1ce707 160000 --- a/project/jni/application/xserver/xserver +++ b/project/jni/application/xserver/xserver @@ -1 +1 @@ -Subproject commit ad7ad4873dcf38f8581145e4578a011d0cda6483 +Subproject commit 6ea1ce707be8ae1b5260bf7c5e36db568c7431c9 From 58558aa89205b31ca62c0212cdb5e9b1ab38fe31 Mon Sep 17 00:00:00 2001 From: pelya Date: Sun, 26 Jun 2016 23:50:53 +0300 Subject: [PATCH 5/7] SDL: timestamping debug builds makes no sense --- build.sh | 4 ++-- changeAppSettings.sh | 2 +- project/jni/Application.mk | 2 +- project/jni/application/ballfield/AndroidAppSettings.cfg | 2 +- project/jni/application/commandergenius/commandergenius | 2 +- project/jni/application/openarena/engine | 2 +- project/jni/application/openarena/vm | 2 +- project/jni/application/supertux/supertux | 2 +- project/jni/application/vice/vice | 2 +- project/jni/boost/src | 2 +- project/jni/shmem | 2 +- sign.sh | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 7e230e81d..b0bb43977 100755 --- a/build.sh +++ b/build.sh @@ -187,14 +187,14 @@ cd project && env PATH=$NDKBUILDPATH BUILD_NUM_CPUS=$NCPU nice -n19 ndk-build -j ./AndroidPostBuild.sh `pwd`/../../../bin/MainActivity-release-unsigned.apk || exit 1 ; \ cd ../../.. ; \ } || exit 1 ; \ - jarsigner -tsa http://timestamp.digicert.com -verbose -keystore ~/.android/debug.keystore -storepass android -sigalg MD5withRSA -digestalg SHA1 bin/MainActivity-release-unsigned.apk androiddebugkey || exit 1 ; \ + jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -sigalg MD5withRSA -digestalg SHA1 bin/MainActivity-release-unsigned.apk androiddebugkey || exit 1 ; \ rm -f bin/MainActivity-debug.apk ; \ zipalign 4 bin/MainActivity-release-unsigned.apk bin/MainActivity-debug.apk || exit 1 ; \ else \ $quick_rebuild && { \ ln -s -f libs lib ; \ zip -u -r bin/MainActivity-debug-unaligned.apk lib assets || exit 1 ; \ - jarsigner -tsa http://timestamp.digicert.com -verbose -keystore ~/.android/debug.keystore -storepass android -sigalg MD5withRSA -digestalg SHA1 bin/MainActivity-debug-unaligned.apk androiddebugkey || exit 1 ; \ + jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -sigalg MD5withRSA -digestalg SHA1 bin/MainActivity-debug-unaligned.apk androiddebugkey || exit 1 ; \ rm -f bin/MainActivity-debug.apk ; \ zipalign 4 bin/MainActivity-debug-unaligned.apk bin/MainActivity-debug.apk || exit 1 ; \ } || ant debug || exit 1 ; \ diff --git a/changeAppSettings.sh b/changeAppSettings.sh index bc4441acf..2b4660fd8 100755 --- a/changeAppSettings.sh +++ b/changeAppSettings.sh @@ -373,7 +373,7 @@ echo "# GCC version, 4.6 (default) or 4.8, CLANG is not supported yet" >> Androi echo NDK_TOOLCHAIN_VERSION=$NDK_TOOLCHAIN_VERSION >> AndroidAppSettings.cfg echo >> AndroidAppSettings.cfg echo "# Specify architectures to compile, 'all' or 'y' to compile for all architectures." >> AndroidAppSettings.cfg -echo "# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips" >> AndroidAppSettings.cfg +echo "# Available architectures: armeabi armeabi-v7a x86 mips" >> AndroidAppSettings.cfg echo MultiABI=\'$MultiABI\' >> AndroidAppSettings.cfg echo >> AndroidAppSettings.cfg echo "# Optional shared libraries to compile - removing some of them will save space" >> AndroidAppSettings.cfg diff --git a/project/jni/Application.mk b/project/jni/Application.mk index ea9e2e0ee..acf40500f 100644 --- a/project/jni/Application.mk +++ b/project/jni/Application.mk @@ -5,4 +5,4 @@ include jni/Settings.mk APP_STL := gnustl_static APP_CFLAGS := -O3 -DNDEBUG -g # arm-linux-androideabi-4.4.3 crashes in -O0 mode on SDL sources APP_PLATFORM := android-14 # Android 4.0, it should be backward compatible to previous versions -APP_PIE := false # This feature makes executables incompatible to Android API 15 or lower +APP_PIE := true # This feature makes executables incompatible to Android API 15 or lower, but executables without PIE will not run on Android 5.0 and newer diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index f386c57e0..3241236f0 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -247,7 +247,7 @@ CustomBuildScript=n AppCflags='-O2 -finline-functions' # Additional LDFLAGS for application -AppLdflags='-fuse-ld=bfd' +AppLdflags='' # If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable AppOverlapsSystemHeaders= diff --git a/project/jni/application/commandergenius/commandergenius b/project/jni/application/commandergenius/commandergenius index 72483aa8c..c5210b0c4 160000 --- a/project/jni/application/commandergenius/commandergenius +++ b/project/jni/application/commandergenius/commandergenius @@ -1 +1 @@ -Subproject commit 72483aa8c1f681e1528f1918a0afcd1c7b60602e +Subproject commit c5210b0c4209d6c9b6a49350057877448882a776 diff --git a/project/jni/application/openarena/engine b/project/jni/application/openarena/engine index acd190733..35b97d2c9 160000 --- a/project/jni/application/openarena/engine +++ b/project/jni/application/openarena/engine @@ -1 +1 @@ -Subproject commit acd190733ec13c64ee2f46b36c4a66b5b5272e32 +Subproject commit 35b97d2c9eb9306dc73d234aa25e70b68c4e74ab diff --git a/project/jni/application/openarena/vm b/project/jni/application/openarena/vm index 3c58263af..67598fad8 160000 --- a/project/jni/application/openarena/vm +++ b/project/jni/application/openarena/vm @@ -1 +1 @@ -Subproject commit 3c58263af7f8831df6e81d5a3bb0a2e487bcc807 +Subproject commit 67598fad8d277f4f5f3c68507af93860bbe52e4f diff --git a/project/jni/application/supertux/supertux b/project/jni/application/supertux/supertux index 0f0c1a2c9..b417ddc7e 160000 --- a/project/jni/application/supertux/supertux +++ b/project/jni/application/supertux/supertux @@ -1 +1 @@ -Subproject commit 0f0c1a2c954f839eb516dfe10896669b15f6d0b6 +Subproject commit b417ddc7efbab9fd634265ba4fdea36b9236b7cd diff --git a/project/jni/application/vice/vice b/project/jni/application/vice/vice index 0b817c357..18d3739b3 160000 --- a/project/jni/application/vice/vice +++ b/project/jni/application/vice/vice @@ -1 +1 @@ -Subproject commit 0b817c357e5a25d37df98d97930469bd485ebb4c +Subproject commit 18d3739b3368581ade39fd69767ab5fa321a4ccc diff --git a/project/jni/boost/src b/project/jni/boost/src index 5824acb45..bc9ea9d30 160000 --- a/project/jni/boost/src +++ b/project/jni/boost/src @@ -1 +1 @@ -Subproject commit 5824acb451e671205afeb188576be1dd9a2674bd +Subproject commit bc9ea9d3032eb1e2b095484e2052aa2bc2e91767 diff --git a/project/jni/shmem b/project/jni/shmem index c2a28f528..f6b49516c 160000 --- a/project/jni/shmem +++ b/project/jni/shmem @@ -1 +1 @@ -Subproject commit c2a28f528d0b1b2528dda125e8fe8018609e7e9a +Subproject commit f6b49516cf4b13f455a19ec989626be5472830c5 diff --git a/sign.sh b/sign.sh index 0e1d3a903..c7e4d258e 100755 --- a/sign.sh +++ b/sign.sh @@ -15,7 +15,7 @@ zip -d Signed.apk "META-INF/*" # Sign with the new certificate echo Using keystore $ANDROID_KEYSTORE_FILE and alias $ANDROID_KEYSTORE_ALIAS stty -echo -jarsigner -verbose -keystore $ANDROID_KEYSTORE_FILE -sigalg MD5withRSA -digestalg SHA1 Signed.apk $ANDROID_KEYSTORE_ALIAS || exit 1 +jarsigner -verbose -tsa http://timestamp.digicert.com -keystore $ANDROID_KEYSTORE_FILE -sigalg MD5withRSA -digestalg SHA1 Signed.apk $ANDROID_KEYSTORE_ALIAS || exit 1 stty echo echo rm -f MainActivity-debug.apk From 7e032dd40ad12bc30e2c02db8af6c5d1584f9854 Mon Sep 17 00:00:00 2001 From: pelya Date: Mon, 27 Jun 2016 01:11:18 +0300 Subject: [PATCH 6/7] SDL: request Marshmallow SD card runtime permission using SDL_ANDROID_RequestExternalStorageRuntimePermission() --- project/java/DataDownloader.java | 16 ++++++++++++++++ project/java/MainActivity.java | 6 ++++++ project/java/Video.java | 14 ++++++++++++++ .../application/ballfield/AndroidAppSettings.cfg | 2 +- project/jni/application/ballfield/ballfield.cpp | 4 ++++ .../application/openarena/AndroidAppSettings.cfg | 2 +- project/jni/sdl-1.2/include/SDL_android.h | 3 +++ .../sdl-1.2/src/video/android/SDL_androidvideo.c | 7 +++++++ 8 files changed, 52 insertions(+), 2 deletions(-) diff --git a/project/java/DataDownloader.java b/project/java/DataDownloader.java index e0484228d..5fa4a6a74 100644 --- a/project/java/DataDownloader.java +++ b/project/java/DataDownloader.java @@ -53,6 +53,9 @@ import android.text.SpannedString; import android.app.AlertDialog; import android.content.DialogInterface; +import android.Manifest; +import android.content.pm.PackageManager; + class CountingInputStream extends BufferedInputStream { @@ -328,6 +331,19 @@ class DataDownloader extends Thread Status.setText( downloadCount + "/" + downloadTotal + ": " + res.getString(R.string.connecting_to, url) ); if( url.indexOf("obb:") == 0 ) // APK expansion file provided by Google Play { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) + { + int permissionCheck = Parent.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (permissionCheck != PackageManager.PERMISSION_GRANTED && !Parent.writeExternalStoragePermissionDialogAnswered) + { + Parent.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); + while( !Parent.writeExternalStoragePermissionDialogAnswered ) + { + try{ Thread.sleep(300); } catch (InterruptedException e) {} + } + } + } + url = getObbFilePath(url); InputStream stream1 = null; try { diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java index b3c0a880c..007cd8d2d 100644 --- a/project/java/MainActivity.java +++ b/project/java/MainActivity.java @@ -1580,6 +1580,11 @@ public class MainActivity extends Activity { Log.i("SDL", "libSDL: Record audio permission: " + (grantResults[0] == PackageManager.PERMISSION_GRANTED ? "GRANTED" : "DENIED")); } + if (Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permissions[0])) + { + Log.i("SDL", "libSDL: Write external storage permission: " + (grantResults[0] == PackageManager.PERMISSION_GRANTED ? "GRANTED" : "DENIED")); + writeExternalStoragePermissionDialogAnswered = true; + } } public FrameLayout getVideoLayout() { return _videoLayout; } @@ -1620,6 +1625,7 @@ public class MainActivity extends Activity public LinkedList textInput = new LinkedList (); public static MainActivity instance = null; + public boolean writeExternalStoragePermissionDialogAnswered = false; } // *** HONEYCOMB / ICS FIX FOR FULLSCREEN MODE, by lmak *** diff --git a/project/java/Video.java b/project/java/Video.java index 55b8bea00..9b54c4386 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -63,6 +63,8 @@ import android.content.Intent; import android.view.View; import android.view.Display; import android.net.Uri; +import android.Manifest; +import android.content.pm.PackageManager; class Mouse @@ -947,6 +949,18 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer Settings.setConfigOptionFromSDL(option, value); } + public void requestExternalStorageRuntimePermissionFromSDL() + { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) + { + int permissionCheck = context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (permissionCheck != PackageManager.PERMISSION_GRANTED && !context.writeExternalStoragePermissionDialogAnswered) + { + context.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); + } + } + } + private int PowerOf2(int i) { int value = 1; diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index 3241236f0..5f7c557fe 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -170,7 +170,7 @@ AppUsesMultitouch=y AppRecordsAudio=n # Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n) -AccessSdCard= +AccessSdCard=y # Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n) AccessInternet= diff --git a/project/jni/application/ballfield/ballfield.cpp b/project/jni/application/ballfield/ballfield.cpp index c50770387..d74dc789b 100644 --- a/project/jni/application/ballfield/ballfield.cpp +++ b/project/jni/application/ballfield/ballfield.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #define fprintf(X, ...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) #define printf(...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) @@ -686,7 +687,10 @@ int main(int argc, char* argv[]) if(evt.key.keysym.sym == SDLK_0) SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, 1); if(evt.key.keysym.sym == SDLK_1) + { SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, 0); + SDL_ANDROID_RequestExternalStorageRuntimePermission(); + } if(evt.key.keysym.sym == SDLK_2) { SDL_ANDROID_SetScreenKeyboardButtonShown(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, 1); diff --git a/project/jni/application/openarena/AndroidAppSettings.cfg b/project/jni/application/openarena/AndroidAppSettings.cfg index 407336b0a..f37113a19 100644 --- a/project/jni/application/openarena/AndroidAppSettings.cfg +++ b/project/jni/application/openarena/AndroidAppSettings.cfg @@ -64,7 +64,7 @@ SdlVideoResize=y SdlVideoResizeKeepAspect=n # Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer -InhibitSuspend=n +InhibitSuspend=y # Create Android service, so the app is less likely to be killed while in background CreateService= diff --git a/project/jni/sdl-1.2/include/SDL_android.h b/project/jni/sdl-1.2/include/SDL_android.h index f7e268a46..5c1f284a8 100644 --- a/project/jni/sdl-1.2/include/SDL_android.h +++ b/project/jni/sdl-1.2/include/SDL_android.h @@ -134,6 +134,9 @@ enum { /* Set SDL Android-specifc option, such as video depth or mouse emulation mode. Most options require restarting the app. */ extern DECLSPEC void SDLCALL SDL_ANDROID_SetConfigOption(int option, int value); +/* Show runtime permission dialog for accessing SD card on Android 6.0 and above */ +extern DECLSPEC void SDLCALL SDL_ANDROID_RequestExternalStorageRuntimePermission(); + #ifdef __cplusplus } #endif diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c index d72741986..876c3a220 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c @@ -88,6 +88,7 @@ static jmethodID JavaRequestCloudLoad = NULL; static jmethodID JavaRequestOpenExternalApp = NULL; static jmethodID JavaRequestRestartMyself = NULL; static jmethodID JavaRequestSetConfigOption = NULL; +static jmethodID JavaRequestExternalStorageRuntimePermission = NULL; static int glContextLost = 0; static int showScreenKeyboardDeferred = 0; static const char * showScreenKeyboardOldText = ""; @@ -361,6 +362,7 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv* env, jobject t JavaRequestOpenExternalApp = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "openExternalApp", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); JavaRequestRestartMyself = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "restartMyself", "(Ljava/lang/String;)V"); JavaRequestSetConfigOption = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "setConfigOptionFromSDL", "(II)V"); + JavaRequestExternalStorageRuntimePermission = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "requestExternalStorageRuntimePermissionFromSDL", "()V"); ANDROID_InitOSKeymap(); } @@ -607,6 +609,11 @@ void SDLCALL SDL_ANDROID_OpenExternalWebBrowser(const char *url) SDL_ANDROID_OpenExternalApp(NULL, NULL, url); } +void SDLCALL SDL_ANDROID_RequestExternalStorageRuntimePermission() +{ + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestExternalStorageRuntimePermission ); +} + // Dummy callback for SDL2 to satisfy linker extern void SDL_Android_Init(JNIEnv* env, jclass cls); void SDL_Android_Init(JNIEnv* env, jclass cls) From 33623855a898cb169b6490368692dd7c0ad66f1c Mon Sep 17 00:00:00 2001 From: pelya Date: Mon, 27 Jun 2016 01:52:43 +0300 Subject: [PATCH 7/7] OpenArena: show SD card permission dialog when extracting data from .obb file --- .../jni/application/openarena/AndroidBuild.sh | 1 + project/jni/application/openarena/engine | 2 +- project/jni/application/openarena/vm | 2 +- project/jni/application/pkg-config | 20 ++++++++++++++----- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/project/jni/application/openarena/AndroidBuild.sh b/project/jni/application/openarena/AndroidBuild.sh index d9068af31..21a71c74c 100755 --- a/project/jni/application/openarena/AndroidBuild.sh +++ b/project/jni/application/openarena/AndroidBuild.sh @@ -21,6 +21,7 @@ env NO_SHARED_LIBS=1 V=1 ../setEnvironment-$1.sh make -C vm -j8 PLATFORM=android # Do not generate shared game logic libs - QVM files are used instead # ../setEnvironment-armeabi.sh sh -c "cd vm/build/release-android-$1/baseq3 && \$STRIP --strip-unneeded *.so && zip ../../../../AndroidData/binaries.zip *.so" +env PATH=`pwd`/..:$PATH \ ../setEnvironment-$1.sh make -j8 -C engine release \ PLATFORM=android ARCH=$1 USE_GLES=1 USE_LOCAL_HEADERS=0 BUILD_CLIENT_SMP=0 \ USE_OPENAL=1 USE_OPENAL_DLOPEN=0 USE_VOIP=1 USE_CURL=1 USE_CURL_DLOPEN=0 USE_CODEC_VORBIS=1 USE_MUMBLE=0 USE_FREETYPE=1 \ diff --git a/project/jni/application/openarena/engine b/project/jni/application/openarena/engine index 35b97d2c9..9c91a7bd6 160000 --- a/project/jni/application/openarena/engine +++ b/project/jni/application/openarena/engine @@ -1 +1 @@ -Subproject commit 35b97d2c9eb9306dc73d234aa25e70b68c4e74ab +Subproject commit 9c91a7bd694ccd05f74cd4dfb72991aa93526a30 diff --git a/project/jni/application/openarena/vm b/project/jni/application/openarena/vm index 67598fad8..ed024e7fc 160000 --- a/project/jni/application/openarena/vm +++ b/project/jni/application/openarena/vm @@ -1 +1 @@ -Subproject commit 67598fad8d277f4f5f3c68507af93860bbe52e4f +Subproject commit ed024e7fcf04b0345c3ff861fa6c8f11a2f3a912 diff --git a/project/jni/application/pkg-config b/project/jni/application/pkg-config index 174e49ac8..3662fd779 100755 --- a/project/jni/application/pkg-config +++ b/project/jni/application/pkg-config @@ -88,11 +88,21 @@ while test $# -gt 0; do --cflags) echo -I${prefix}/include ;; - --libs) - echo -l$PKG - ;; - --static-libs) - echo -l$PKG + --libs|--static-libs) + case $PKG in + curl|libcurl) + echo -lcurl-sdl -l:libssl.so.sdl.0.so -l:libcrypto.so.sdl.0.so + ;; + crypto|libcrypto) + echo -l:libcrypto.so.sdl.0.so + ;; + openssl|ssl|libssl) + echo -l:libssl.so.sdl.0.so -l:libcrypto.so.sdl.0.so + ;; + *) + echo -l$PKG + ;; + esac ;; *) ;;