diff --git a/adventure-editor/src/main/java/forge/adventure/Main.java b/adventure-editor/src/main/java/forge/adventure/Main.java index bec6ae5a4ca..946c88cae70 100644 --- a/adventure-editor/src/main/java/forge/adventure/Main.java +++ b/adventure-editor/src/main/java/forge/adventure/Main.java @@ -15,7 +15,7 @@ public class Main { public static void main(String[] args) { GuiBase.setInterface(new GuiMobile(Files.exists(Paths.get("./res"))?"./":"../forge-gui/")); - GuiBase.setDeviceInfo("", "", 0, 0); + GuiBase.setDeviceInfo(null, 0, 0); new EditorMainWindow(Config.instance()); } } diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 31a772f6700..d5bd2345faf 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -59,11 +59,11 @@ import com.badlogic.gdx.backends.android.AndroidAudio; import com.badlogic.gdx.backends.android.AsynchronousAndroidAudio; import com.getkeepsafe.relinker.ReLinker; import de.cketti.fileprovider.PublicFileProvider; +import forge.util.HWInfo; import forge.Forge; import forge.interfaces.IDeviceAdapter; import forge.util.FileUtil; import forge.util.ThreadUtil; -import io.sentry.Sentry; import io.sentry.protocol.Device; import io.sentry.protocol.OperatingSystem; import org.apache.commons.lang3.tuple.Pair; @@ -195,28 +195,24 @@ public class Main extends AndroidApplication { boolean permissiongranted = checkPermission(); Gadapter = new AndroidAdapter(getContext()); - // Get Basic Device and OS info for scope - Sentry.configureScope(scope -> { - // Device Info - Device device = new Device(); - device.setId(Build.ID); - device.setName(getDeviceName()); - device.setModel(Build.MODEL); - device.setBrand(Build.BRAND); - device.setManufacturer(Build.MANUFACTURER); - device.setMemorySize(memInfo.totalMem); - device.setChipset(Build.SOC_MANUFACTURER + " " + Build.SOC_MODEL); - // OS Info - OperatingSystem os = new OperatingSystem(); - os.setName("Android"); - os.setVersion(Build.VERSION.RELEASE); - os.setBuild(Build.DISPLAY); - // Set Contexts - scope.getContexts().setDevice(device); - scope.getContexts().setOperatingSystem(os); - }); + // Device Info + Device device = new Device(); + device.setId(Build.ID); + device.setName(getDeviceName()); + device.setModel(Build.MODEL); + device.setBrand(Build.BRAND); + device.setManufacturer(Build.MANUFACTURER); + device.setMemorySize(memInfo.totalMem); + String cpuDesc = Build.VERSION.SDK_INT > Build.VERSION_CODES.R ? Build.SOC_MANUFACTURER + " " + Build.SOC_MODEL : Build.UNKNOWN; + device.setCpuDescription(cpuDesc); + device.setChipset(Build.HARDWARE + " " + Build.BOARD); + // OS Info + OperatingSystem os = new OperatingSystem(); + os.setName("Android " + Build.VERSION.RELEASE); + os.setVersion(Build.VERSION.RELEASE); + os.setBuild(Build.DISPLAY); - initForge(Gadapter, permissiongranted, totalMemory, isTabletDevice(getContext())); + initForge(Gadapter, new HWInfo(device, os), permissiongranted, totalMemory, isTabletDevice(getContext())); } private void crossfade(View contentView, View previousView) { @@ -350,13 +346,13 @@ public class Main extends AndroidApplication { crossfade(TL, previousView); } - private void loadGame(final String title, final String steps, boolean isLandscape, AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice, AndroidApplicationConfiguration config, boolean exception, String msg) { + private void loadGame(final HWInfo hwInfo, final String title, final String steps, boolean isLandscape, AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice, AndroidApplicationConfiguration config, boolean exception, String msg) { try { final Handler handler = new Handler(); forgeLogo = findViewById(resId("id", "logo_id")); activeView = findViewById(resId("id", "mainview")); activeView.setBackgroundColor(Color.WHITE); - forgeView = initializeForView(Forge.getApp(getAndroidClipboard(), adapter, ASSETS_DIR, false, !isLandscape, totalRAM, isTabletDevice, Build.VERSION.SDK_INT, Build.VERSION.RELEASE, getDeviceName()), config); + forgeView = initializeForView(Forge.getApp(hwInfo, getAndroidClipboard(), adapter, ASSETS_DIR, false, !isLandscape, totalRAM, isTabletDevice, Build.VERSION.SDK_INT), config); getAnimator(ObjectAnimator.ofFloat(forgeLogo, "alpha", 1f, 1f).setDuration(800), ObjectAnimator.ofObject(activeView, "backgroundColor", new ArgbEvaluator(), Color.WHITE, Color.BLACK).setDuration(1600), new AnimatorListenerAdapter() { @Override @@ -490,7 +486,7 @@ public class Main extends AndroidApplication { } } - private void initForge(AndroidAdapter adapter, boolean permissiongranted, int totalRAM, boolean isTabletDevice) { + private void initForge(AndroidAdapter adapter, HWInfo hwInfo, boolean permissiongranted, int totalRAM, boolean isTabletDevice) { AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); config.useAccelerometer = false; config.useCompass = false; @@ -502,14 +498,14 @@ public class Main extends AndroidApplication { if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { String message = getDeviceName() + "\n" + "Android " + Build.VERSION.RELEASE + "\n" + "RAM " + totalRAM + "MB" + "\n" + "LibGDX " + Version.VERSION + "\n" + "Can't access external storage"; Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation); - loadGame("", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); + loadGame(hwInfo, "", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); return; } ASSETS_DIR = Build.VERSION.SDK_INT > Build.VERSION_CODES.Q ? getContext().getObbDir() + "/Forge/" : Environment.getExternalStorageDirectory() + "/Forge/"; if (!FileUtil.ensureDirectoryExists(ASSETS_DIR)) { String message = getDeviceName() + "\n" + "Android " + Build.VERSION.RELEASE + "\n" + "RAM " + totalRAM + "MB" + "\n" + "LibGDX " + Version.VERSION + "\n" + "Can't access external storage\nPath: " + ASSETS_DIR; Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation); - loadGame("", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); + loadGame(hwInfo, "", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); return; } //ensure .nomedia file exists in Forge directory so its images @@ -521,7 +517,7 @@ public class Main extends AndroidApplication { } catch (Exception e) { String message = getDeviceName() + "\n" + "Android " + Build.VERSION.RELEASE + "\n" + "RAM " + totalRAM + "MB" + "\n" + "LibGDX " + Version.VERSION + "\n" + "Can't read/write to storage"; Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation); - loadGame("", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); + loadGame(hwInfo, "", "", false, adapter, permissiongranted, totalRAM, isTabletDevice, config, true, message); return; } } @@ -538,7 +534,7 @@ public class Main extends AndroidApplication { if (landscapeMode && Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { //Android 11 onwards Main.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); } - loadGame(info, lowV + lowM, landscapeMode, adapter, permissiongranted, totalRAM, isTabletDevice, config, false, ""); + loadGame(hwInfo, info, lowV + lowM, landscapeMode, adapter, permissiongranted, totalRAM, isTabletDevice, config, false, ""); } @Override diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index d6cd55e69f5..4accc728cd7 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -30,7 +30,7 @@ public class Main extends IOSApplication.Delegate { final IOSApplicationConfiguration config = new IOSApplicationConfiguration(); config.useAccelerometer = false; config.useCompass = false; - final ApplicationListener app = Forge.getApp(new IOSClipboard(), new IOSAdapter(), assetsDir, false, false, 0, false, 0, "", ""); + final ApplicationListener app = Forge.getApp(null, new IOSClipboard(), new IOSAdapter(), assetsDir, false, false, 0, false, 0); final IOSApplication iosApp = new IOSApplication(app, config); return iosApp; } diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 8d5f2687992..1c287064cdb 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -239,5 +239,10 @@ 1.13.5 natives-desktop + + com.github.oshi + oshi-core + 6.8.3 + diff --git a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java index 33dcbecb6cd..90008d6db7b 100644 --- a/forge-gui-mobile-dev/src/forge/app/GameLauncher.java +++ b/forge-gui-mobile-dev/src/forge/app/GameLauncher.java @@ -7,9 +7,13 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Clipboard; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowAdapter; import com.badlogic.gdx.graphics.glutils.HdpiMode; import com.badlogic.gdx.utils.SharedLibraryLoader; +import forge.util.HWInfo; import forge.Forge; import forge.adventure.util.Config; +import io.sentry.protocol.Device; +import io.sentry.protocol.OperatingSystem; import org.lwjgl.system.Configuration; +import oshi.SystemInfo; import java.nio.file.Files; import java.nio.file.Paths; @@ -27,8 +31,31 @@ public class GameLauncher { //increase MemoryStack to 1MB, default is 64kb Configuration.STACK_SIZE.set(1024); Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); - ApplicationListener start = Forge.getApp(new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile),//todo get totalRAM && isTabletDevice - assetsDir, false, false, 0, false, 0, "", ""); + HWInfo hw = null; + int totalRAM = 0; + try { + SystemInfo si = new SystemInfo(); + // Device Info + Device device = new Device(); + device.setId(si.getHardware().getComputerSystem().getHardwareUUID()); + device.setName(si.getHardware().getComputerSystem().getManufacturer() + " - " + si.getHardware().getComputerSystem().getModel()); + device.setModel(si.getHardware().getComputerSystem().getModel()); + device.setManufacturer(si.getHardware().getComputerSystem().getManufacturer()); + device.setMemorySize(si.getHardware().getMemory().getTotal()); + device.setChipset(si.getHardware().getComputerSystem().getBaseboard().getManufacturer() + " " + si.getHardware().getComputerSystem().getBaseboard().getModel()); + device.setCpuDescription(si.getHardware().getProcessor().getProcessorIdentifier().getName()); + // OS Info + OperatingSystem os = new OperatingSystem(); + os.setName(si.getOperatingSystem() + " x" + si.getOperatingSystem().getBitness()); + os.setVersion(si.getOperatingSystem().getVersionInfo().getVersion()); + os.setBuild(si.getOperatingSystem().getVersionInfo().getBuildNumber()); + totalRAM = Math.round(si.getHardware().getMemory().getTotal() / 1024f / 1024f); + hw = new HWInfo(device, os); + } catch (Exception e) { + e.printStackTrace(); + } + ApplicationListener start = Forge.getApp(hw, new Lwjgl3Clipboard(), new Main.DesktopAdapter(switchOrientationFile), + assetsDir, false, false, totalRAM, false, 0); int windowWidth = Config.instance().getSettingData().width; int windowHeight = Config.instance().getSettingData().height; diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index fa1c18bffd7..db42c5c1de2 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -47,6 +47,8 @@ import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; import forge.toolbox.*; import forge.util.*; +import io.sentry.ScopeType; +import io.sentry.Sentry; import java.nio.file.Files; import java.nio.file.Paths; @@ -126,13 +128,14 @@ public class Forge implements ApplicationListener { public static boolean createNewAdventureMap = false; private static Localizer localizer; - public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean propertyConfig, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) { + public static ApplicationListener getApp(HWInfo hwInfo, Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean propertyConfig, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI) { if (app == null) { app = new Forge(); if (GuiBase.getInterface() == null) { clipboard = clipboard0; deviceAdapter = deviceAdapter0; - GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); //obb directory on android uses the package name as entrypoint + //obb directory on android uses the package name as entrypoint + GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); GuiBase.setInterface(new GuiMobile(assetDir0)); GuiBase.enablePropertyConfig(propertyConfig); isPortraitMode = androidOrientation; @@ -140,7 +143,20 @@ public class Forge implements ApplicationListener { isTabletDevice = isTablet; androidVersion = AndroidAPI; } - GuiBase.setDeviceInfo(deviceName, AndroidRelease, AndroidAPI, totalRAM); + if (hwInfo != null) { + Sentry.configureScope(ScopeType.GLOBAL, scope -> { + scope.getContexts().setDevice(hwInfo.device()); + scope.getContexts().setOperatingSystem(hwInfo.os()); + }); + //init hwInfo to log + System.out.println( + "---------------------------------------\n" + "APP: Forge v." + GuiBase.getInterface().getCurrentVersion() + + " (" + GuiBase.getInterface() + ")" + "\nDEV: " + hwInfo.device().getName() + + "\nCPU: " + hwInfo.device().getCpuDescription() + "\nRAM: " + totalRAM + " MB" + "\nOS: " + hwInfo.os().getName() + + "\n---------------------------------------" + ); + } + GuiBase.setDeviceInfo(hwInfo, AndroidAPI, totalRAM); } return app; } diff --git a/forge-gui/src/main/java/forge/gui/GuiBase.java b/forge-gui/src/main/java/forge/gui/GuiBase.java index 7532924be9f..27757308a5b 100644 --- a/forge-gui/src/main/java/forge/gui/GuiBase.java +++ b/forge-gui/src/main/java/forge/gui/GuiBase.java @@ -1,5 +1,6 @@ package forge.gui; +import forge.util.HWInfo; import forge.gui.interfaces.IGuiBase; import forge.localinstance.properties.ForgePreferences; @@ -10,12 +11,11 @@ public class GuiBase { private static boolean isAndroidport = false; private static boolean isAdventureMode = false; private static boolean interrupted = false; - private static String deviceName = ""; - private static String androidRelease = ""; private static int androidAPI = 0; private static int deviceRAM = 0; private static boolean usingAppDirectory = false; private static ForgePreferences forgePrefs; + private static HWInfo hwInfo; public static IGuiBase getInterface() { return guiInterface; } public static void setInterface(IGuiBase i0) { guiInterface = i0; } @@ -34,16 +34,14 @@ public class GuiBase { public static void setUsingAppDirectory(boolean value) { usingAppDirectory = value; } public static boolean isUsingAppDirectory() { return usingAppDirectory; } - public static void setDeviceInfo(String DeviceName, String AndroidName, int AndroidAPI, int RAM) { - deviceName = DeviceName; - androidRelease = AndroidName; + public static void setDeviceInfo(HWInfo hw, int AndroidAPI, int RAM) { + hwInfo = hw; androidAPI = AndroidAPI; deviceRAM = RAM; } - public static String getDeviceName() { return deviceName; } - public static String getAndroidRelease() { return androidRelease; } public static int getAndroidAPILevel() { return androidAPI; } public static int getDeviceRAM() { return deviceRAM; } + public static HWInfo getHWInfo() { return hwInfo; } 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 0e5541b3f23..c3500d92f0a 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -18,11 +18,8 @@ package forge.model; import com.google.common.collect.Maps; -import forge.CardStorageReader; +import forge.*; import forge.CardStorageReader.ProgressObserver; -import forge.ImageKeys; -import forge.MulliganDefs; -import forge.StaticData; import forge.ai.AiProfileUtil; import forge.card.CardRulesPredicates; import forge.card.CardType; @@ -107,14 +104,9 @@ public final class FModel { avatarPool, conspiracyPool, dungeonPool, attractionPool, contraptionPool; 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() + " (RAM: " + GuiBase.getDeviceRAM() + "MB, Android " + GuiBase.getAndroidRelease() + " API Level " + GuiBase.getAndroidAPILevel() + ")"); - else { - System.out.println(System.getProperty("os.name") + " (" + System.getProperty("os.version") + " " + System.getProperty("os.arch") + ")\n" + System.getProperty("java.vendor") + " (Java " + System.getProperty("java.runtime.version") + ", " + System.getProperty("java.vm.name") + ")"); - } + initialize(progressBar, adjustPrefs, false); + } + public static void initialize(final IProgressBar progressBar, Function adjustPrefs, boolean isSimTest) { ImageKeys.initializeDirs( ForgeConstants.CACHE_CARD_PICS_DIR, ForgeConstants.CACHE_CARD_PICS_SUBDIR, ForgeConstants.CACHE_TOKEN_PICS_DIR, ForgeConstants.CACHE_ICON_PICS_DIR, diff --git a/forge-gui/src/main/java/forge/util/HWInfo.java b/forge-gui/src/main/java/forge/util/HWInfo.java new file mode 100644 index 00000000000..b547c81aaf4 --- /dev/null +++ b/forge-gui/src/main/java/forge/util/HWInfo.java @@ -0,0 +1,7 @@ +package forge.util; + +import io.sentry.protocol.Device; +import io.sentry.protocol.OperatingSystem; + +public record HWInfo(Device device, OperatingSystem os) { +}