diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml
index f581ef4fd60..b90e075ae91 100644
--- a/forge-gui-android/pom.xml
+++ b/forge-gui-android/pom.xml
@@ -102,7 +102,7 @@
com.badlogicgames.gdx
gdx-backend-android
- 1.9.10
+ 1.9.13
diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java
index 0ef2368a6a6..295d4e72c22 100644
--- a/forge-gui-android/src/forge/app/Main.java
+++ b/forge-gui-android/src/forge/app/Main.java
@@ -68,7 +68,7 @@ public class Main extends AndroidApplication {
boolean permissiongranted = checkPermission();
Gadapter = new AndroidAdapter(this.getContext());
- initForge(Gadapter, permissiongranted, totalMemory, isTabletDevice(this.getContext()), android.os.Build.VERSION.SDK_INT);
+ initForge(Gadapter, permissiongranted, totalMemory, isTabletDevice(this.getContext()), Build.VERSION.SDK_INT, Build.VERSION.RELEASE);
//permission
if(!permissiongranted){
@@ -207,7 +207,7 @@ public class Main extends AndroidApplication {
builder.show();
}
- private void initForge(AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice, int AndroidVersion){
+ private void initForge(AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice, int AndroidAPI, String AndroidRelease){
boolean isPortrait;
if (permissiongranted){
//establish assets directory
@@ -247,12 +247,12 @@ public class Main extends AndroidApplication {
Main.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
- initialize(Forge.getApp(new AndroidClipboard(), adapter, assetsDir, propertyConfig, isPortrait, totalRAM, isTabletDevice, AndroidVersion));
+ initialize(Forge.getApp(new AndroidClipboard(), adapter, assetsDir, propertyConfig, isPortrait, totalRAM, isTabletDevice, AndroidAPI, AndroidRelease, getDeviceName()));
} else {
isPortrait = true;
//set current orientation
Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation);
- initialize(Forge.getApp(new AndroidClipboard(), adapter, "", false, isPortrait, totalRAM, isTabletDevice, AndroidVersion));
+ initialize(Forge.getApp(new AndroidClipboard(), adapter, "", false, isPortrait, totalRAM, isTabletDevice, AndroidAPI, AndroidRelease, getDeviceName()));
}
}
@@ -291,6 +291,19 @@ public class Main extends AndroidApplication {
private class AndroidClipboard implements com.badlogic.gdx.utils.Clipboard {
private final ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+ @Override
+ public boolean hasContents() {
+ if (cm.getPrimaryClip().getItemCount() > 0) {
+ try {
+ return cm.getPrimaryClip().getItemAt(0).coerceToText(getContext()).length() > 0;
+ }
+ catch (Exception ex) {
+ return false;
+ }
+ }
+ return false;
+ }
+
@Override
public String getContents() {
if (cm.getPrimaryClip().getItemCount() > 0) {
@@ -440,4 +453,26 @@ public class Main extends AndroidApplication {
bmp.compress(Bitmap.CompressFormat.JPEG, 100, output);
}
}
+
+ public String getDeviceName() {
+ String manufacturer = Build.MANUFACTURER;
+ String model = Build.MODEL;
+ if (model.toLowerCase().startsWith(manufacturer.toLowerCase())) {
+ return capitalize(model);
+ } else {
+ return capitalize(manufacturer) + " " + model;
+ }
+ }
+
+ private String capitalize(String s) {
+ if (s == null || s.length() == 0) {
+ return "";
+ }
+ char first = s.charAt(0);
+ if (Character.isUpperCase(first)) {
+ return s;
+ } else {
+ return Character.toUpperCase(first) + s.substring(1);
+ }
+ }
}
diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml
index a34a6d9e8fd..7860157367f 100644
--- a/forge-gui-ios/pom.xml
+++ b/forge-gui-ios/pom.xml
@@ -73,7 +73,7 @@
com.badlogicgames.gdx
gdx-backend-robovm
- 1.9.10
+ 1.9.13
diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java
index 1e9562f2ecb..05ac5e1197d 100644
--- a/forge-gui-ios/src/forge/ios/Main.java
+++ b/forge-gui-ios/src/forge/ios/Main.java
@@ -33,7 +33,7 @@ public class Main extends IOSApplication.Delegate {
config.useCompass = false;
ForgePreferences prefs = FModel.getPreferences();
boolean propertyConfig = prefs != null && prefs.getPrefBoolean(ForgePreferences.FPref.UI_NETPLAY_COMPAT);//todo get totalRAM && isTabletDevice
- final ApplicationListener app = Forge.getApp(new IOSClipboard(), new IOSAdapter(), assetsDir, propertyConfig, false, 0, false, 0);
+ final ApplicationListener app = Forge.getApp(new IOSClipboard(), new IOSAdapter(), assetsDir, propertyConfig, false, 0, false, 0, "", "");
final IOSApplication iosApp = new IOSApplication(app, config);
return iosApp;
}
@@ -46,6 +46,11 @@ public class Main extends IOSApplication.Delegate {
//special clipboard that works on iOS
private static final class IOSClipboard implements com.badlogic.gdx.utils.Clipboard {
+ @Override
+ public boolean hasContents() {
+ return UIPasteboard.getGeneralPasteboard().toString().length() > 0;
+ }
+
@Override
public String getContents() {
return UIPasteboard.getGeneralPasteboard().getString();
diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml
index 14aacfe4a26..c8047b833ab 100644
--- a/forge-gui-mobile-dev/pom.xml
+++ b/forge-gui-mobile-dev/pom.xml
@@ -60,18 +60,18 @@
com.badlogicgames.gdx
gdx-backend-lwjgl
- 1.9.10
+ 1.9.13
com.badlogicgames.gdx
gdx-platform
- 1.9.10
+ 1.9.13
natives-desktop
com.badlogicgames.gdx
gdx-freetype-platform
- 1.9.10
+ 1.9.13
natives-desktop
diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java
index ce513cb5f5c..fb86479e7c3 100644
--- a/forge-gui-mobile-dev/src/forge/app/Main.java
+++ b/forge-gui-mobile-dev/src/forge/app/Main.java
@@ -97,7 +97,7 @@ public class Main {
ForgePreferences prefs = FModel.getPreferences();
boolean propertyConfig = prefs != null && prefs.getPrefBoolean(ForgePreferences.FPref.UI_NETPLAY_COMPAT);
new LwjglApplication(Forge.getApp(new LwjglClipboard(), new DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice
- desktopMode ? desktopModeAssetsDir : assetsDir, propertyConfig, false, 0, false, 0), config);
+ desktopMode ? desktopModeAssetsDir : assetsDir, propertyConfig, false, 0, false, 0, "", ""), config);
}
private static class DesktopAdapter implements IDeviceAdapter {
diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml
index 339886fa293..a769695db45 100644
--- a/forge-gui-mobile/pom.xml
+++ b/forge-gui-mobile/pom.xml
@@ -63,12 +63,12 @@
com.badlogicgames.gdx
gdx
- 1.9.10
+ 1.9.13
com.badlogicgames.gdx
gdx-freetype
- 1.9.10
+ 1.9.13
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java
index 4dd2ed5771d..50ee87a5e33 100644
--- a/forge-gui-mobile/src/forge/Forge.java
+++ b/forge-gui-mobile/src/forge/Forge.java
@@ -75,10 +75,9 @@ public class Forge implements ApplicationListener {
public static boolean gameInProgress = false;
public static int cacheSize = 400;
public static int totalDeviceRAM = 0;
- public static int androidVersion = 0;
public static boolean autoCache = false;
- public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean value, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidVersion) {
+ public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean value, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) {
if (GuiBase.getInterface() == null) {
clipboard = clipboard0;
deviceAdapter = deviceAdapter0;
@@ -87,8 +86,8 @@ public class Forge implements ApplicationListener {
isPortraitMode = androidOrientation;
totalDeviceRAM = totalRAM;
isTabletDevice = isTablet;
- androidVersion = AndroidVersion;
}
+ GuiBase.setDeviceInfo(deviceName, AndroidRelease, AndroidAPI);
return app;
}
@@ -877,19 +876,19 @@ public class Forge implements ApplicationListener {
}
@Override
- public boolean scrolled(int amount) {
+ public boolean scrolled(float amountX, float amountY) {
updatePotentialListeners(mouseMovedX, mouseMovedY);
if (KeyInputAdapter.isCtrlKeyDown()) { //zoom in or out based on amount
- return zoom(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amount);
+ return zoom(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountY);
}
boolean handled;
if (KeyInputAdapter.isShiftKeyDown()) {
- handled = pan(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amount, 0, false);
+ handled = pan(mouseMovedX, mouseMovedY, -Utils.AVG_FINGER_WIDTH * amountX, 0, false);
}
else {
- handled = pan(mouseMovedX, mouseMovedY, 0, -Utils.AVG_FINGER_HEIGHT * amount, true);
+ handled = pan(mouseMovedX, mouseMovedY, 0, -Utils.AVG_FINGER_HEIGHT * amountY, true);
}
if (panStop(mouseMovedX, mouseMovedY)) {
handled = true;
diff --git a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java
index 5d60a50690f..5cfeec369e3 100644
--- a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java
+++ b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java
@@ -5,6 +5,7 @@ import com.badlogic.gdx.Gdx;
import com.google.common.collect.ImmutableList;
import forge.FThreads;
import forge.Forge;
+import forge.GuiBase;
import forge.download.GuiDownloadZipService;
import forge.properties.ForgeConstants;
import forge.screens.SplashScreen;
@@ -50,7 +51,7 @@ public class AssetsDownloader {
"https://releases.cardforge.org/forge/forge-gui-android/" + version + "/" + filename,
Forge.getDeviceAdapter().getDownloadsDir(), null, splashScreen.getProgressBar()).download(filename);
if (apkFile != null) {
- if (Forge.androidVersion < 29) { //Android 9 and below...
+ if (GuiBase.getAndroidAPILevel() < 29) { //Android 9 and below...
Forge.getDeviceAdapter().openFile(apkFile);
Forge.exit(true);
return;
diff --git a/forge-gui-mobile/src/forge/toolbox/FGestureAdapter.java b/forge-gui-mobile/src/forge/toolbox/FGestureAdapter.java
index 3f443f7188d..ec4d73f8cb5 100644
--- a/forge-gui-mobile/src/forge/toolbox/FGestureAdapter.java
+++ b/forge-gui-mobile/src/forge/toolbox/FGestureAdapter.java
@@ -20,6 +20,7 @@ public abstract class FGestureAdapter extends InputAdapter {
public abstract boolean pan(float x, float y, float deltaX, float deltaY, boolean moreVertical);
public abstract boolean panStop(float x, float y);
public abstract boolean zoom(float x, float y, float amount);
+ public abstract boolean scrolled(float amountX, float amountY);
private float tapSquareSize, longPressDelay, lastTapX, lastTapY, tapSquareCenterX, tapSquareCenterY;
private long tapCountInterval, flingDelay, lastTapTime;
diff --git a/forge-gui/src/main/java/forge/GuiBase.java b/forge-gui/src/main/java/forge/GuiBase.java
index 52d487a467c..56fc0ead768 100644
--- a/forge-gui/src/main/java/forge/GuiBase.java
+++ b/forge-gui/src/main/java/forge/GuiBase.java
@@ -8,6 +8,9 @@ public class GuiBase {
private static boolean networkplay = false;
private static boolean isAndroidport = false;
private static boolean interrupted = false;
+ private static String deviceName = "";
+ private static String androidRelease = "";
+ private static int androidAPI = 0;
public static IGuiBase getInterface() { return guiInterface; }
public static void setInterface(IGuiBase i0) { guiInterface = i0; }
@@ -15,6 +18,11 @@ public class GuiBase {
public static void setIsAndroid(boolean value) { isAndroidport = value; }
public static boolean isAndroid() { return isAndroidport; }
+ public static void setDeviceInfo(String device, String androidName, int androidAPI) { deviceName = device; androidRelease = androidName; androidAPI = androidAPI; }
+ public static String getDeviceName() { return deviceName; }
+ public static String getAndroidRelease() { return androidRelease; }
+ public static int getAndroidAPILevel() { return androidAPI; }
+
public static boolean isNetworkplay() { return networkplay; }
public static void setNetworkplay(boolean value) { networkplay = value; }
diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java
index 1c1a621b8c1..34314141577 100644
--- a/forge-gui/src/main/java/forge/model/FModel.java
+++ b/forge-gui/src/main/java/forge/model/FModel.java
@@ -98,6 +98,14 @@ public final class FModel {
private static GameFormat.Collection formats;
public static void initialize(final IProgressBar progressBar, Function adjustPrefs) {
+ //init version to log
+ System.out.println("Forge v." + GuiBase.getInterface().getCurrentVersion() + " (" + GuiBase.getInterface() + ")");
+ //Device
+ if (GuiBase.isAndroid()) //todo get device on other mobile platforms
+ System.out.println(GuiBase.getDeviceName() + " (Android " + GuiBase.getAndroidRelease() + " API Level " + GuiBase.getAndroidAPILevel() + ")");
+ else
+ System.out.println(System.getProperty("os.name") + " (" + System.getProperty("os.version") + " " + System.getProperty("os.arch") + ")");
+
ImageKeys.initializeDirs(
ForgeConstants.CACHE_CARD_PICS_DIR, ForgeConstants.CACHE_CARD_PICS_SUBDIR,
ForgeConstants.CACHE_TOKEN_PICS_DIR, ForgeConstants.CACHE_ICON_PICS_DIR,