diff --git a/build.sh b/build.sh
index 42f371830..1bc762ce3 100755
--- a/build.sh
+++ b/build.sh
@@ -142,6 +142,9 @@ strip_libs() {
return 0
}
+# Fix Gradle compilation error
+[ -z "$ANDROID_NDK_HOME" ] && export ANDROID_NDK_HOME="`which ndk-build | sed 's@/ndk-build@@'`"
+
cd project && env PATH=$NDKBUILDPATH BUILD_NUM_CPUS=$NCPU ndk-build -j$NCPU V=1 $QUICK_REBUILD_ARGS && \
strip_libs && \
cd .. && ./copyAssets.sh && cd project && \
diff --git a/project/AndroidManifestTemplate.xml b/project/AndroidManifestTemplate.xml
index 225970e3b..bf94d6f7f 100644
--- a/project/AndroidManifestTemplate.xml
+++ b/project/AndroidManifestTemplate.xml
@@ -60,9 +60,6 @@
/>
-
-
-
diff --git a/project/app/build-template.gradle b/project/app/build-template.gradle
index 2953ce993..0a071b1f3 100644
--- a/project/app/build-template.gradle
+++ b/project/app/build-template.gradle
@@ -2,6 +2,7 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 29
+ buildToolsVersion "29.0.3"
defaultConfig {
applicationId "net.olofson.ballfield"
@@ -12,11 +13,11 @@ android {
buildTypes {
release {
minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), '../proguard-local.cfg', '../proguard.cfg'
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../proguard-local.cfg', '../proguard.cfg'
}
}
- dependencies { compile 'com.google.android.gms:play-services-games:11.4.0' } // ==GOOGLEPLAYGAMESERVICES==
- dependencies { compile 'com.google.android.gms:play-services-drive:11.4.0' } // ==GOOGLEPLAYGAMESERVICES==
+ dependencies { compile 'com.google.android.gms:play-services-games:19.0.0' } // ==GOOGLEPLAYGAMESERVICES==
+ dependencies { compile 'com.google.android.gms:play-services-drive:17.0.0' } // ==GOOGLEPLAYGAMESERVICES==
}
diff --git a/project/build.gradle b/project/build.gradle
index cc37952b0..24bb03929 100644
--- a/project/build.gradle
+++ b/project/build.gradle
@@ -5,9 +5,10 @@ buildscript {
repositories {
google()
jcenter()
+
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'com.android.tools.build:gradle:3.6.2'
// NOTE: Do not place your application dependencies here; they belong
@@ -19,6 +20,7 @@ allprojects {
repositories {
google()
jcenter()
+
}
}
diff --git a/project/gradle.properties b/project/gradle.properties
new file mode 100644
index 000000000..199d16ede
--- /dev/null
+++ b/project/gradle.properties
@@ -0,0 +1,20 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+
diff --git a/project/gradle/wrapper/gradle-wrapper.properties b/project/gradle/wrapper/gradle-wrapper.properties
index 558870dad..30b240978 100644
--- a/project/gradle/wrapper/gradle-wrapper.properties
+++ b/project/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,6 @@
+#Thu Apr 16 21:28:37 EEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/project/java/googleplaygameservices/CloudSave.java b/project/java/googleplaygameservices/CloudSave.java
index 5983c8d55..abad8f065 100644
--- a/project/java/googleplaygameservices/CloudSave.java
+++ b/project/java/googleplaygameservices/CloudSave.java
@@ -364,10 +364,6 @@ public class CloudSave implements GameHelper.GameHelperListener {
mHelper.enableDebugLog(enabled);
}
- public String getInvitationId() {
- return mHelper.getInvitationId();
- }
-
public void reconnectClient() {
mHelper.reconnectClient();
}
diff --git a/project/java/googleplaygameservices/GameHelper.java b/project/java/googleplaygameservices/GameHelper.java
index ce25b114f..d56c97808 100644
--- a/project/java/googleplaygameservices/GameHelper.java
+++ b/project/java/googleplaygameservices/GameHelper.java
@@ -37,12 +37,6 @@ import com.google.android.gms.drive.Drive;
import com.google.android.gms.games.Games;
import com.google.android.gms.games.Games.GamesOptions;
import com.google.android.gms.games.GamesActivityResultCodes;
-import com.google.android.gms.games.multiplayer.Invitation;
-import com.google.android.gms.games.multiplayer.Multiplayer;
-import com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatch;
-import com.google.android.gms.games.request.GameRequest;
-//import com.google.android.gms.plus.Plus;
-//import com.google.android.gms.plus.Plus.PlusOptions;
public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
@@ -121,11 +115,9 @@ public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
// Client request flags
public final static int CLIENT_NONE = 0x00;
public final static int CLIENT_GAMES = 0x01;
- //public final static int CLIENT_PLUS = 0x02;
public final static int CLIENT_APPSTATE = 0x04;
public final static int CLIENT_SNAPSHOT = 0x05;
- public final static int CLIENT_ALL = CLIENT_GAMES //| CLIENT_PLUS
- | CLIENT_APPSTATE | CLIENT_SNAPSHOT;
+ public final static int CLIENT_ALL = CLIENT_GAMES | CLIENT_APPSTATE | CLIENT_SNAPSHOT;
// What clients were requested? (bit flags)
int mRequestedClients = CLIENT_NONE;
@@ -157,24 +149,6 @@ public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
Handler mHandler;
- /*
- * If we got an invitation when we connected to the games client, it's here.
- * Otherwise, it's null.
- */
- Invitation mInvitation;
-
- /*
- * If we got turn-based match when we connected to the games client, it's
- * here. Otherwise, it's null.
- */
- TurnBasedMatch mTurnBasedMatch;
-
- /*
- * If we have incoming requests when we connected to the games client, they
- * are here. Otherwise, it's null.
- */
- ArrayList mRequests;
-
// Listener
GameHelperListener mListener = null;
@@ -414,101 +388,6 @@ public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
mActivity = null;
}
- /**
- * Returns the invitation ID received through an invitation notification.
- * This should be called from your GameHelperListener's
- *
- * @link{GameHelperListener#onSignInSucceeded method, to check if there's an
- * invitation available. In that
- * case, accept the invitation.
- * @return The id of the invitation, or null if none was received.
- */
- public String getInvitationId() {
- if (!mGoogleApiClient.isConnected()) {
- Log.w(TAG,
- "Warning: getInvitationId() should only be called when signed in, "
- + "that is, after getting onSignInSuceeded()");
- }
- return mInvitation == null ? null : mInvitation.getInvitationId();
- }
-
- /**
- * Returns the invitation received through an invitation notification. This
- * should be called from your GameHelperListener's
- *
- * @link{GameHelperListener#onSignInSucceeded method, to check if there's an
- * invitation available. In that
- * case, accept the invitation.
- * @return The invitation, or null if none was received.
- */
- public Invitation getInvitation() {
- if (!mGoogleApiClient.isConnected()) {
- Log.w(TAG,
- "Warning: getInvitation() should only be called when signed in, "
- + "that is, after getting onSignInSuceeded()");
- }
- return mInvitation;
- }
-
- public boolean hasInvitation() {
- return mInvitation != null;
- }
-
- public boolean hasTurnBasedMatch() {
- return mTurnBasedMatch != null;
- }
-
- public boolean hasRequests() {
- return mRequests != null;
- }
-
- public void clearInvitation() {
- mInvitation = null;
- }
-
- public void clearTurnBasedMatch() {
- mTurnBasedMatch = null;
- }
-
- public void clearRequests() {
- mRequests = null;
- }
-
- /**
- * Returns the tbmp match received through an invitation notification. This
- * should be called from your GameHelperListener's
- *
- * @link{GameHelperListener#onSignInSucceeded method, to check if there's a
- * match available.
- * @return The match, or null if none was received.
- */
- public TurnBasedMatch getTurnBasedMatch() {
- if (!mGoogleApiClient.isConnected()) {
- Log.w(TAG,
- "Warning: getTurnBasedMatch() should only be called when signed in, "
- + "that is, after getting onSignInSuceeded()");
- }
- return mTurnBasedMatch;
- }
-
- /**
- * Returns the requests received through the onConnected bundle. This should
- * be called from your GameHelperListener's
- *
- * @link{GameHelperListener#onSignInSucceeded method, to check if there are
- * incoming requests that must be
- * handled.
- * @return The requests, or null if none were received.
- */
- public ArrayList getRequests() {
- if (!mGoogleApiClient.isConnected()) {
- Log.w(TAG, "Warning: getRequests() should only be called "
- + "when signed in, "
- + "that is, after getting onSignInSuceeded()");
- }
- return mRequests;
- }
-
/** Enables debug logging */
public void enableDebugLog(boolean enabled) {
mDebugLog = enabled;
@@ -686,8 +565,6 @@ public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
}
debugLog("Starting connection.");
mConnecting = true;
- mInvitation = null;
- mTurnBasedMatch = null;
mGoogleApiClient.connect();
}
@@ -712,27 +589,6 @@ public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
if (connectionHint != null) {
debugLog("onConnected: connection hint provided. Checking for invite.");
- Invitation inv = connectionHint
- .getParcelable(Multiplayer.EXTRA_INVITATION);
- if (inv != null && inv.getInvitationId() != null) {
- // retrieve and cache the invitation ID
- debugLog("onConnected: connection hint has a room invite!");
- mInvitation = inv;
- debugLog("Invitation ID: " + mInvitation.getInvitationId());
- }
-
- // Do we have any requests pending?
- mRequests = Games.Requests
- .getGameRequestsFromBundle(connectionHint);
- if (!mRequests.isEmpty()) {
- // We have requests in onConnected's connectionHint.
- debugLog("onConnected: connection hint has " + mRequests.size()
- + " request(s)");
- }
-
- debugLog("onConnected: connection hint provided. Checking for TBMP game.");
- mTurnBasedMatch = connectionHint
- .getParcelable(Multiplayer.EXTRA_TURN_BASED_MATCH);
}
// we're good to go
diff --git a/project/jni/application/biniax2/AndroidAppSettings.cfg b/project/jni/application/biniax2/AndroidAppSettings.cfg
index fca5f4de8..a2aa3f30f 100644
--- a/project/jni/application/biniax2/AndroidAppSettings.cfg
+++ b/project/jni/application/biniax2/AndroidAppSettings.cfg
@@ -13,11 +13,13 @@ AppVersionCode=1406
AppVersionName="1.4.06"
# 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
+# If you'll start Description with '!' symbol it will be enabled by default, '!!' will also hide the entry from the menu, so it cannot be disabled
# If the URL in in the form ':dir/file.dat:http://URL/' it will be downloaded as binary BLOB to the application dir and not unzipped
-# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir -
-# these files are put inside .apk package by build system
-# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS
+# If the URL does not contain 'http://' or 'https://', it is treated as file from 'project/jni/application/src/AndroidData' dir -
+# these files are put inside .apk package by the build system
+# You can specify Google Play expansion files in the form 'obb:main.12345' or 'obb:patch.12345' where 12345 is the app version for obb file
+# You can use .zip.xz archives for better compression, but you need to add 'lzma' to CompiledLibraries
+# Generate .zip.xz files like this: zip -0 -r data.zip your-data/* ; xz -8 data.zip
AppDataDownloadUrl="!Game data|data3.zip"
# Reset SDL config when updating application to the new version (y) / (n)
@@ -46,10 +48,17 @@ NeedDepthBuffer=n
# Enable OpenGL stencil buffer (needed only for 3-d applications, small speed decrease) (y) or (n)
NeedStencilBuffer=n
-# Try to use GLES 2.x context - will revert to GLES 1.X if unsupported by device
+# Use GLES 2.x context
# you need this option only if you're developing 3-d app (y) or (n)
NeedGles2=n
+# Use GLES 3.x context
+# you need this option only if you're developing 3-d app (y) or (n)
+NeedGles3=n
+
+# Use gl4es library for provide OpenGL 1.x functionality to OpenGL ES accelerated cards (y) or (n)
+UseGl4es=
+
# Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL,
# this will allow small speed optimization. Enable this even when you're using SDL_HWSURFACE. (y) or (n)
SwVideoMode=y
@@ -80,6 +89,14 @@ CompatibilityHacksStaticInit=n
# On-screen Android soft text input emulates hardware keyboard, this will only work with Hackers Keyboard app (y)/(n)
CompatibilityHacksTextInputEmulatesHwKeyboard=n
+# Built-in text input keyboards with custom layouts for emulators, requires CompatibilityHacksTextInputEmulatesHwKeyboard=y
+# 0 or empty - standard Android keyboard
+# 1 - Simple QWERTY keyboard, no function keys, no arrow keys
+# 2 - Commodore 64 keyboard
+# 3 - Amiga keyboard
+# 4 - Atari800 keyboard
+TextInputKeyboard=
+
# Hack for broken devices: prevent audio chopping, by sleeping a bit after pushing each audio chunk (y)/(n)
CompatibilityHacksPreventAudioChopping=n
@@ -113,6 +130,9 @@ RightMouseButtonLongPress=
# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n)
ShowMouseCursor=n
+# Screen follows mouse cursor, when it's covered by soft keyboard, this works only in software video mode (y) or (n)
+ScreenFollowsMouse=
+
# Generate more touch events, by default SDL generates one event per one video frame, this is useful for drawing apps (y) or (n)
GenerateSubframeTouchEvents=
@@ -145,6 +165,9 @@ AppUsesAccelerometer=n
# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4
AppUsesGyroscope=n
+# Application uses orientation sensor (y) or (n), reported as joystick 1 axes 8-10
+AppUsesOrientationSensor=
+
# Use gyroscope to move mouse cursor (y) or (n), it eats battery, and can be disabled in settings, do not use with AppUsesGyroscope setting
MoveMouseWithGyroscope=
@@ -156,15 +179,21 @@ AppUsesMultitouch=n
# This option will add additional permission to Android manifest (y)/(n)
AppRecordsAudio=n
-# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n)
+# Application needs read/write access SD card. Always disable it, unless you want to access user photos and downloads. (y) / (n)
AccessSdCard=
+# Application needs to read it's own OBB file. Enable this if you are using Play Store expansion files. (y) / (n)
+ReadObbFile=
+
# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n)
AccessInternet=
# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n)
ImmersiveMode=
+# Hide Android system mouse cursor image when USB mouse is attached (y) or (n) - the app must draw it's own mouse cursor
+HideSystemMousePointer=
+
# Application implements Android-specific routines to put to background, and will not draw anything to screen
# between SDL_ACTIVEEVENT lost / gained notifications - you should check for them
# rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n)
@@ -188,38 +217,62 @@ RedefinedKeysScreenKb="RETURN SPACE"
RedefinedKeysScreenKbNames="RETURN SPACE"
# On-screen keys theme
-# 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick)
-# 1 = Simple Theme by Beholder (white, with gamepad joystick)
+# 0 = Ultimate Droid by Sean Stieber (green, with cross joystick)
+# 1 = Simple Theme by Beholder (white, with cross joystick)
# 2 = Sun by Sirea (yellow, with round joystick)
# 3 = Keen by Gerstrong (multicolor, with round joystick)
+# 4 = Retro by Santiago Radeff (red/white, with cross joystick)
+# 5 = GameBoy from RetroArch
+# 6 = PlayStation from RetroArch
+# 7 = SuperNintendo from RetroArch
+# 8 = DualShock from RetroArch
+# 9 = Nintendo64 from RetroArch
TouchscreenKeysTheme=2
# Redefine gamepad keys to SDL keysyms, button order is:
-# A B X Y L1 R1 L2 R2 LThumb RThumb
+# A B X Y L1 R1 L2 R2 LThumb RThumb Start Select Up Down Left Right LThumbUp LThumbDown LThumbLeft LThumbRight RThumbUp RThumbDown RThumbLeft RThumbRight
RedefinedKeysGamepad="RETURN ESCAPE SPACE SPACE"
+# Redefine keys for the second gamepad, same as the first gamepad if not set:
+RedefinedKeysSecondGamepad=""
+
+# Redefine keys for the third gamepad, same as the first gamepad if not set:
+RedefinedKeysThirdGamepad=""
+
+# Redefine keys for the fourth gamepad, same as the first gamepad if not set:
+RedefinedKeysFourthGamepad=""
+
# How long to show startup menu button, in msec, 0 to disable startup menu
StartupMenuButtonTimeout=0
# Menu items to hide from startup menu, available menu items:
-# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced
+# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.StorageAccessConfig SettingsMenuMisc.CommandlineConfig SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced
HiddenMenuOptions='SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.MouseConfigMainMenu'
# Menu items to show at startup - this is Java code snippet, leave empty for default
# new SettingsMenuMisc.ShowReadme(), (AppUsesMouse \&\& \! ForceRelativeMouseMode \? new SettingsMenuMouse.DisplaySizeConfig(true) : new SettingsMenu.DummyMenu()), new SettingsMenuMisc.OptionalDownloadConfig(true), new SettingsMenuMisc.GyroscopeCalibration()
# Available menu items:
-# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced
+# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.StorageAccessConfig SettingsMenuMisc.CommandlineConfig SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced
FirstStartMenuOptions=''
-# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
-# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips
-MultiABI='armeabi-v7a x86'
-
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=0
+# GCC version, or 'clang' for CLANG
+NDK_TOOLCHAIN_VERSION=
+
+# Android platform version.
+# android-16 = Android 4.1, the earliest supported version in NDK r18.
+# android-18 = Android 4.3, the first version supporting GLES3.
+# android-21 = Android 5.1, the first version with SO_REUSEPORT defined.
+APP_PLATFORM=
+
+# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
+# Available architectures: armeabi-v7a arm64-v8a x86 x86_64
+MultiABI='arm64-v8a'
+
# 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
+# MP3 patents are expired, but libmad license is GPL, not LGPL
# 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="sdl_image sdl_mixer"
@@ -229,6 +282,9 @@ CustomBuildScript=n
# Aditional CFLAGS for application
AppCflags=''
+# Aditional C++-specific compiler flags for application, added after AppCflags
+AppCppflags=''
+
# Additional LDFLAGS for application
AppLdflags=''
@@ -260,3 +316,6 @@ AdmobBannerSize=
# Google Play Game Services application ID, required for cloud saves to work
GooglePlayGameServicesId=520035027247
+# The app will open files with following extension, file path will be added to commandline params
+AppOpenFileExtension=''
+
diff --git a/project/jni/application/openttd/AndroidAppSettings.cfg b/project/jni/application/openttd/AndroidAppSettings.cfg
index a0dc14973..6966b2307 100644
--- a/project/jni/application/openttd/AndroidAppSettings.cfg
+++ b/project/jni/application/openttd/AndroidAppSettings.cfg
@@ -7,10 +7,10 @@ AppName="OpenTTD"
AppFullName=org.openttd.sdl
# Application version code (integer)
-AppVersionCode=110086
+AppVersionCode=110186
# Application user-visible version name (string)
-AppVersionName="1.10.0.86"
+AppVersionName="1.10.1.86"
# 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, '!!' will also hide the entry from the menu, so it cannot be disabled
diff --git a/project/jni/application/openttd/src b/project/jni/application/openttd/src
index 907d22046..7b72277db 160000
--- a/project/jni/application/openttd/src
+++ b/project/jni/application/openttd/src
@@ -1 +1 @@
-Subproject commit 907d22046ad05865e0f1be7a0e4b8d9d6664b33b
+Subproject commit 7b72277dbee58d44fe77df5fe7444a9350027a2c
diff --git a/project/res/layout-v28/notification.xml b/project/res/layout-v28/notification.xml
new file mode 100644
index 000000000..862653fb8
--- /dev/null
+++ b/project/res/layout-v28/notification.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+