From c967815df08ff336249f2999e7a91133d5685b7a Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 10 Aug 2021 11:40:17 +0200 Subject: [PATCH 01/28] Add java argument parser --- .../net/kdt/pojavlaunch/utils/JREUtils.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 95db566a9..1c9749974 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -346,6 +346,39 @@ public class JREUtils } return exitCode; } + + /** + * Parse and separate java arguments in a user friendly fashion + * It supports multi line and absence of spaces between arguments + * The function also supports auto-removal of improper arguments. + * + * @param args The un-parsed argument list. + * @return Parsed args as an ArrayList + */ + public static ArrayList parseJavaArguments(String args){ + ArrayList parsedArguments = new ArrayList<>(0); + args = args.trim().replace(" ", ""); + //For each prefixes, we separate args. + for(String prefix : new String[]{"-XX:-","-XX:+", "-XX:","-"}){ + while (true){ + int start = args.indexOf(prefix); + if(start == -1) break; + //Get the end of the current argument + int end = args.indexOf("-", start + prefix.length()); + if(end == -1) end = args.length(); + //Extract it + String parsedSubString = args.substring(start, end); + args = args.replace(parsedSubString, ""); + + //Check if two args aren't bundled together by mistake + if(parsedSubString.indexOf('=') == parsedSubString.lastIndexOf('=')) + parsedArguments.add(args.substring(start,end)); + else Log.w("JAVA ARGS PARSER", "Removed improper arguments: " + parsedSubString); + } + } + return parsedArguments; + } + private static void purgeArg(List argList, String argStart) { for(int i = 0; i < argList.size(); i++) { final String arg = argList.get(i); From eb3a5479740221694df0bdf7244c7a5dab1ec182 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 10 Aug 2021 11:43:18 +0200 Subject: [PATCH 02/28] Take advantage of the new arg parser --- app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 7ef93a944..bb9560b0d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -195,7 +195,7 @@ public final class Tools { overrideableArgList.add("-Dfml.earlyprogresswindow=false"); // Override args - for (String argOverride : LauncherPreferences.PREF_CUSTOM_JAVA_ARGS.split(" ")) { + for (String argOverride : JREUtils.parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS)) { for (int i = overrideableArgList.size() - 1; i >= 0; i--) { String arg = overrideableArgList.get(i); // Currently, only java property is supported overridable argument, other such as "-X:" are handled by the JVM. From a8f16d60eea953cb888e0340003dc49672f9ce93 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 10 Aug 2021 12:34:49 +0200 Subject: [PATCH 03/28] Fix outOfBoundsException --- .../src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 1c9749974..e93a7b469 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -372,7 +372,7 @@ public class JREUtils //Check if two args aren't bundled together by mistake if(parsedSubString.indexOf('=') == parsedSubString.lastIndexOf('=')) - parsedArguments.add(args.substring(start,end)); + parsedArguments.add(parsedSubString); else Log.w("JAVA ARGS PARSER", "Removed improper arguments: " + parsedSubString); } } From 54f2a1e464706feabdd51831b1a53733561241e2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 10 Aug 2021 20:54:22 +0200 Subject: [PATCH 04/28] Introduce Architecture Class --- .../net/kdt/pojavlaunch/Architecture.java | 60 +++++++++++++++++++ .../kdt/pojavlaunch/ArchitectureCheck.java | 21 ------- 2 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java delete mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ArchitectureCheck.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java new file mode 100644 index 000000000..6769afbb0 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -0,0 +1,60 @@ +package net.kdt.pojavlaunch; + +import android.os.Build; + +import java.util.Locale; + + +public class Architecture +{ + public static int ARCH_ARM64 = 0x1; + public static int ARCH_ARM = 0x2; + public static int ARCH_X86 = 0x4; + public static int ARCH_X86_64 = 0x8; + + /** + * Tell us if the device supports 64 bits architecture + * @return If the device supports 64 bits architecture + */ + public static boolean is64BitsDevice(){ + return Build.SUPPORTED_64_BIT_ABIS.length != 0; + } + + /** + * Tell us if the device supports 32 bits architecture + * Note, that a 64 bits device won't be reported as supporting 32 bits. + * @return If the device supports 32 bits architecture + */ + public static boolean is32BitsDevice(){ + return !is64BitsDevice(); + } + + /** + * Tells the device supported architecture + * As of now, the function may just fail to detect ARM emulation from zenfones + * + * @return ARCH_ARM || ARCH_ARM64 || ARCH_X86 || ARCH_86_64 + */ + public static int getDeviceArchitecture(){ + if(is64BitsDevice()){ + return archAsInt(Build.SUPPORTED_64_BIT_ABIS[0]); + } + return archAsInt(Build.SUPPORTED_32_BIT_ABIS[0]); + } + + /** + * Convert an architecture from a String to an int. + * @param arch The architecture as a String + * @return The architecture as an int. + */ + public static int archAsInt(String arch){ + arch = arch.toLowerCase(); + if(arch.equals("arm64-v8a") || arch.equals("aarch64")) return ARCH_ARM64; + if(arch.contains("armeabi")) return ARCH_ARM; + if(arch.equals("x86_64")) return ARCH_X86_64; + if(arch.equals("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; + //Shouldn't happen + return -1; + } + +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ArchitectureCheck.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ArchitectureCheck.java deleted file mode 100644 index 87e247a77..000000000 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ArchitectureCheck.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.kdt.pojavlaunch; - -public class ArchitectureCheck -{ - public static String getArch() { - String arch = System.getProperty("os.arch"); - String archConverted = null; - - if (arch.equals("aarch64") || - arch.endsWith("v8a") || - arch.startsWith("arm64")) { - archConverted = "arm64"; - } else if (arch.startsWith("arm") || arch.endsWith("v7a")) { - archConverted = "arm32"; - } else if (arch.startsWith("x86") || arch.startsWith("amd")) { - archConverted = "x86"; - } - - return archConverted; - } -} From baf48509c5cd84d8fe09de5cba66785c86f07251 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 14:28:32 +0200 Subject: [PATCH 05/28] Improved Architecture class. --- .../net/kdt/pojavlaunch/Architecture.java | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java index 6769afbb0..bc14657fd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -7,6 +7,7 @@ import java.util.Locale; public class Architecture { + public static int UNSUPPORTED_ARCH = -1; public static int ARCH_ARM64 = 0x1; public static int ARCH_ARM = 0x2; public static int ARCH_X86 = 0x4; @@ -31,17 +32,46 @@ public class Architecture /** * Tells the device supported architecture - * As of now, the function may just fail to detect ARM emulation from zenfones * * @return ARCH_ARM || ARCH_ARM64 || ARCH_X86 || ARCH_86_64 */ public static int getDeviceArchitecture(){ - if(is64BitsDevice()){ - return archAsInt(Build.SUPPORTED_64_BIT_ABIS[0]); + if(isx86Device()){ + return is64BitsDevice() ? ARCH_X86_64 : ARCH_X86; } - return archAsInt(Build.SUPPORTED_32_BIT_ABIS[0]); + return is64BitsDevice() ? ARCH_ARM64 : ARCH_ARM; } + /** + * Tell is the device is based on an x86 processor. + * It doesn't tell if the device is 64 or 32 bits. + * @return Whether or not the device is x86 based. + */ + public static boolean isx86Device(){ + //We check the whole range of supported ABIs, + //Since zenfones can place arm before their native instruction set. + if(is64BitsDevice()){ + for(String str : Build.SUPPORTED_64_BIT_ABIS){ + if(archAsInt(str) == ARCH_X86_64) return true; + } + }else{ + for(String str : Build.SUPPORTED_32_BIT_ABIS){ + if(archAsInt(str) == ARCH_X86) return true; + } + } + return false; + } + + /** + * Tell is the device is based on an arm processor. + * It doesn't tell if the device is 64 or 32 bits. + * @return Whether or not the device is arm based. + */ + public static boolean isArmDevice(){ + return !isx86Device(); + } + + /** * Convert an architecture from a String to an int. * @param arch The architecture as a String @@ -50,11 +80,11 @@ public class Architecture public static int archAsInt(String arch){ arch = arch.toLowerCase(); if(arch.equals("arm64-v8a") || arch.equals("aarch64")) return ARCH_ARM64; - if(arch.contains("armeabi")) return ARCH_ARM; + if(arch.contains("armeabi") ||arch.contains("armv7")) return ARCH_ARM; if(arch.equals("x86_64")) return ARCH_X86_64; if(arch.equals("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; //Shouldn't happen - return -1; + return UNSUPPORTED_ARCH; } } From 142e658299e17e8a836d1b87fd9db4f5851adcda Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 15:32:10 +0200 Subject: [PATCH 06/28] Clean up JREUtils a bit --- .../net/kdt/pojavlaunch/utils/JREUtils.java | 53 ++++++++----------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index e93a7b469..4ed1cb6ec 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -292,23 +292,24 @@ public class JREUtils } List javaArgList = new ArrayList(); + + + + //Remove arguments that can interfere with the good working of the launcher + purgeArg(javaArgList,"-Xms"); + purgeArg(javaArgList,"-Xmx"); + purgeArg(javaArgList,"-d32"); + purgeArg(javaArgList,"-d64"); + + //Add automatically generated args javaArgList.add(Tools.DIR_HOME_JRE + "/bin/java"); Tools.getJavaArgs(ctx, javaArgList,graphicsLib); - purgeArg(javaArgList,"-Xms"); - purgeArg(javaArgList,"-Xmx"); - /*if(Tools.CURRENT_ARCHITECTURE.contains("32") && ((mi.availMem / 1048576L)-50) > 300) { - javaArgList.add("-Xms300M"); - javaArgList.add("-Xmx300M"); - }else {*/ - javaArgList.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); - javaArgList.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); - //} - ctx.runOnUiThread(new Runnable() { - public void run() { - Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show(); - } - }); - System.out.println(javaArgList); + + javaArgList.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + javaArgList.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + + ctx.runOnUiThread(() -> Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show()); + System.out.println(javaArgList); javaArgList.addAll(args); // For debugging only! @@ -328,21 +329,13 @@ public class JREUtils final int exitCode = VMLauncher.launchJVM(javaArgList.toArray(new String[0])); ctx.appendlnToLog("Java Exit code: " + exitCode); if (exitCode != 0) { - ctx.runOnUiThread(new Runnable(){ - @Override - public void run() { - AlertDialog.Builder dialog = new AlertDialog.Builder(ctx); - dialog.setMessage(ctx.getString(R.string.mcn_exit_title, exitCode)); - dialog.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ + ctx.runOnUiThread(() -> { + AlertDialog.Builder dialog = new AlertDialog.Builder(ctx); + dialog.setMessage(ctx.getString(R.string.mcn_exit_title, exitCode)); - @Override - public void onClick(DialogInterface p1, int p2){ - BaseMainActivity.fullyExit(); - } - }); - dialog.show(); - } - }); + dialog.setPositiveButton(android.R.string.ok, (p1, p2) -> BaseMainActivity.fullyExit()); + dialog.show(); + }); } return exitCode; } @@ -350,7 +343,7 @@ public class JREUtils /** * Parse and separate java arguments in a user friendly fashion * It supports multi line and absence of spaces between arguments - * The function also supports auto-removal of improper arguments. + * The function also supports auto-removal of improper arguments, although it may miss some. * * @param args The un-parsed argument list. * @return Parsed args as an ArrayList From ea9c82167616a0a383b0df9e743e59c5a1ddec71 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 15:38:52 +0200 Subject: [PATCH 07/28] Reduce clutter through convenience function --- .../prefs/CustomSeekBarPreference.java | 18 ++++++++++--- .../prefs/LauncherPreferenceFragment.java | 26 ++++++++----------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java index 85f03cea7..f973c8813 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java @@ -44,9 +44,7 @@ public class CustomSeekBarPreference extends SeekBarPreference { public void setMin(int min) { //Note: since the max (setMax is a final function) is not taken into account properly, setting the min over the max may produce funky results super.setMin(min); - if (min != mMin) { - mMin = min; - } + if (min != mMin) mMin = min; } @@ -92,7 +90,21 @@ public class CustomSeekBarPreference extends SeekBarPreference { } + /** + * Set a suffix to be appended on the TextView associated to the value + * @param suffix The suffix to append as a String + */ public void setSuffix(String suffix) { this.suffix = suffix; } + + /** + * Convenience function to set both min and max at the same time. + * @param min The minimum value + * @param max The maximum value + */ + public void setRange(int min, int max){ + setMin(min); + setMax(max); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java index 723b8cc9c..019e7a117 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java @@ -22,37 +22,33 @@ public class LauncherPreferenceFragment extends PreferenceFragmentCompat impleme //Disable notch checking behavior on android 8.1 and below. findPreference("ignoreNotch").setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && PREF_NOTCH_SIZE != 0); - CustomSeekBarPreference seek2 = (CustomSeekBarPreference) findPreference("timeLongPressTrigger"); - seek2.setMin(100); - seek2.setMax(1000); + CustomSeekBarPreference seek2 = findPreference("timeLongPressTrigger"); + seek2.setRange(100, 1000); seek2.setValue(LauncherPreferences.PREF_LONGPRESS_TRIGGER); seek2.setSuffix(" ms"); - CustomSeekBarPreference seek3 = (CustomSeekBarPreference) findPreference("buttonscale"); - seek3.setMin(80); - seek3.setMax(250); + CustomSeekBarPreference seek3 = findPreference("buttonscale"); + seek3.setRange(80, 250); seek3.setValue((int) LauncherPreferences.PREF_BUTTONSIZE); seek3.setSuffix(" %"); - CustomSeekBarPreference seek4 = (CustomSeekBarPreference) findPreference("mousescale"); - seek4.setMin(25); - seek4.setMax(300); + CustomSeekBarPreference seek4 = findPreference("mousescale"); + seek4.setRange(25, 300); seek4.setValue((int) LauncherPreferences.PREF_MOUSESCALE); seek4.setSuffix(" %"); - CustomSeekBarPreference seek5 = (CustomSeekBarPreference) findPreference("resolutionRatio"); + CustomSeekBarPreference seek5 = findPreference("resolutionRatio"); seek5.setMin(25); seek5.setSuffix(" %"); - CustomSeekBarPreference seek6 = (CustomSeekBarPreference) findPreference("mousespeed"); - seek6.setMin(25); - seek6.setMax(300); - seek6.setValue((int)(LauncherPreferences.PREF_MOUSESPEED*100f)); + CustomSeekBarPreference seek6 = findPreference("mousespeed"); + seek6.setRange(25, 300); + seek6.setValue((int)(LauncherPreferences.PREF_MOUSESPEED*100f)); seek6.setSuffix(" %"); int freeMem = (int) (Runtime.getRuntime().freeMemory() / 1048576l); - CustomSeekBarPreference seek7 = (CustomSeekBarPreference) findPreference("allocation"); + CustomSeekBarPreference seek7 = findPreference("allocation"); seek7.setMin(256); if(Tools.CURRENT_ARCHITECTURE.contains("32")) seek7.setMax(1100); else seek7.setMax(freeMem > 4096 ? freeMem : 4096); From bcb9957e0cc201937ed5d692de3b3547097760d4 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 16:25:55 +0200 Subject: [PATCH 08/28] - Clean FontChanger - Put fonts in the res folder - Progressive transition towards a clean architecture detection system --- .../main/java/com/kdt/mcgui/MineButton.java | 2 +- .../net/kdt/pojavlaunch/Architecture.java | 6 +-- .../java/net/kdt/pojavlaunch/FontChanger.java | 33 -------------- .../java/net/kdt/pojavlaunch/JVersion.java | 43 ------------------ .../net/kdt/pojavlaunch/PojavApplication.java | 28 +++++------- .../kdt/pojavlaunch/PojavLoginActivity.java | 2 +- .../main/java/net/kdt/pojavlaunch/Tools.java | 4 +- .../font/minecraft_ten.ttf} | Bin .../font/noto_sans_bold.ttf} | Bin .../src/main/res/layout/start_screen.xml | 2 + 10 files changed, 20 insertions(+), 100 deletions(-) delete mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/FontChanger.java delete mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JVersion.java rename app_pojavlauncher/src/main/{assets/font/minecraft-ten.ttf => res/font/minecraft_ten.ttf} (100%) rename app_pojavlauncher/src/main/{assets/font/NotoSans-Bold.ttf => res/font/noto_sans_bold.ttf} (100%) diff --git a/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java b/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java index 6efdcfcda..9d1ff8c88 100644 --- a/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java +++ b/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java @@ -17,7 +17,7 @@ public class MineButton extends androidx.appcompat.widget.AppCompatButton } public void init() { - setTypeface(Typeface.createFromAsset(getContext().getAssets(), "font/NotoSans-Bold.ttf")); + setTypeface(Typeface.createFromAsset(getContext().getAssets(), "font/noto_sans_bold.ttf")); } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java index bc14657fd..3f62d9f1a 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -78,9 +78,9 @@ public class Architecture * @return The architecture as an int. */ public static int archAsInt(String arch){ - arch = arch.toLowerCase(); - if(arch.equals("arm64-v8a") || arch.equals("aarch64")) return ARCH_ARM64; - if(arch.contains("armeabi") ||arch.contains("armv7")) return ARCH_ARM; + arch = arch.toLowerCase().trim().replace(" ", ""); + if(arch.contains("arm64") || arch.equals("aarch64") || arch.equals("adm64")) return ARCH_ARM64; + if(arch.contains("arm")) return ARCH_ARM; if(arch.equals("x86_64")) return ARCH_X86_64; if(arch.equals("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; //Shouldn't happen diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/FontChanger.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/FontChanger.java deleted file mode 100644 index 354adab61..000000000 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/FontChanger.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.kdt.pojavlaunch; - -import android.graphics.*; -import android.view.*; -import android.widget.*; -import android.content.*; -import com.kdt.mcgui.*; - -public class FontChanger -{ - private static Typeface fNotoSans, fMinecraftTen; - - public static void initFonts(Context ctx) { - fNotoSans = Typeface.createFromAsset(ctx.getAssets(), "font/NotoSans-Bold.ttf"); - fMinecraftTen = Typeface.createFromAsset(ctx.getAssets(), "font/minecraft-ten.ttf"); - } - - public static void changeFonts(ViewGroup viewTree) { - View child; - for(int i = 0; i < viewTree.getChildCount(); ++i) { - child = viewTree.getChildAt(i); - if (child instanceof ViewGroup) { - changeFonts((ViewGroup) child); - } else if (child instanceof TextView) { - changeFont((TextView) child); - } - } - } - - public static void changeFont(TextView view) { - view.setTypeface(view instanceof MineButton ? fMinecraftTen : fNotoSans); - } -} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JVersion.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JVersion.java deleted file mode 100644 index 2b03b0cea..000000000 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JVersion.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.kdt.pojavlaunch; - -public class JVersion extends Object -{ - private String version; - private JVersion(String version) - { - this.version = version; - } - public static JVersion from(String version) - { - return new JVersion(version); - } - public boolean isVersionCode() - { - return !version.contains("."); - } - public JVersion toVersionCode() - { - if(!isVersionCode()){ - version = version.replace(".", ""); - return this; - } else throw new RuntimeException("Can't convert version code to itself"); - } - public JVersion toVersionName() - { - if(isVersionCode()){ - StringBuilder charList = new StringBuilder(); - for(int i=0; i Date: Wed, 11 Aug 2021 16:46:55 +0200 Subject: [PATCH 09/28] - Fix improper architecture detection - Progressive transition towards a new architecture system --- .../net/kdt/pojavlaunch/Architecture.java | 6 ++--- .../net/kdt/pojavlaunch/BaseMainActivity.java | 4 +++- .../kdt/pojavlaunch/PojavLoginActivity.java | 2 +- .../net/kdt/pojavlaunch/utils/JREUtils.java | 23 +++++++++---------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java index 3f62d9f1a..c0dee76c2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -79,10 +79,10 @@ public class Architecture */ public static int archAsInt(String arch){ arch = arch.toLowerCase().trim().replace(" ", ""); - if(arch.contains("arm64") || arch.equals("aarch64") || arch.equals("adm64")) return ARCH_ARM64; + if(arch.contains("arm64") || arch.equals("aarch64")) return ARCH_ARM64; if(arch.contains("arm")) return ARCH_ARM; - if(arch.equals("x86_64")) return ARCH_X86_64; - if(arch.equals("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; + if(arch.equals("x86_64") || arch.equals("amd64")) return ARCH_X86_64; + if(arch.contains("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; //Shouldn't happen return UNSUPPORTED_ARCH; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index df68a7f81..3fec98f93 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -1,5 +1,7 @@ package net.kdt.pojavlaunch; +import static net.kdt.pojavlaunch.Architecture.ARCH_X86; + import android.app.*; import android.content.*; import android.content.pm.PackageManager; @@ -763,7 +765,7 @@ public class BaseMainActivity extends LoggableActivity { } private void checkVulkanZinkIsSupported() { - if (Tools.CURRENT_ARCHITECTURE.equals("x86") + if (Tools.CURRENT_ARCHITECTURE == ARCH_X86 || Build.VERSION.SDK_INT < 25 || !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_LEVEL) || !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION)) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index b2b21dcc3..0dfbfb446 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -110,7 +110,7 @@ public class PojavLoginActivity extends BaseActivity LinearLayout startScr = new LinearLayout(PojavLoginActivity.this); LayoutInflater.from(PojavLoginActivity.this).inflate(R.layout.start_screen,startScr); PojavLoginActivity.this.setContentView(startScr); - + progress = (ProgressBar) findViewById(R.id.startscreenProgress); if(isStarting) progress.setVisibility(View.VISIBLE); startupTextView = (TextView) findViewById(R.id.startscreen_text); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 4ed1cb6ec..098fe95c6 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -23,8 +23,7 @@ import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; -public class JREUtils -{ +public class JREUtils { private JREUtils() {} public static String JRE_ARCHITECTURE; @@ -32,18 +31,18 @@ public class JREUtils public static String LD_LIBRARY_PATH; private static String nativeLibDir; - public static void checkJavaArchitecture(LoggableActivity act, String jreArch) throws Exception { - String[] argName = Tools.CURRENT_ARCHITECTURE.split("/"); + /** + * Checks if the java architecture is correct for the device architecture. + * @param act An Activity with logging capabilities + * @param jreArch The java architecture to compare as a String. + */ + public static void checkJavaArchitecture(LoggableActivity act, String jreArch) { act.appendlnToLog("Architecture: " + Tools.CURRENT_ARCHITECTURE); - if (!(jreArch.contains(argName[0]) || jreArch.contains(argName[1]))) { - // x86 check workaround - if (jreArch.startsWith("i") && jreArch.endsWith("86") && Tools.CURRENT_ARCHITECTURE.contains("x86") && !Tools.CURRENT_ARCHITECTURE.contains("64")) { - return; - } + if(Tools.CURRENT_ARCHITECTURE == Architecture.archAsInt(jreArch)) return; + + act.appendlnToLog("Architecture " + Tools.CURRENT_ARCHITECTURE + " is incompatible with Java Runtime " + jreArch); + throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, String.valueOf(Tools.CURRENT_ARCHITECTURE), jreArch)); - act.appendlnToLog("Architecture " + Tools.CURRENT_ARCHITECTURE + " is incompatible with Java Runtime " + jreArch); - throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, Tools.CURRENT_ARCHITECTURE, jreArch)); - } } public static String findInLdLibPath(String libName) { From 5d0dff0dca01e3de3a979ec7a84d36aba5b935fb Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 18:00:25 +0200 Subject: [PATCH 10/28] - Improve architecture detection - Add an archAsString function. --- .../net/kdt/pojavlaunch/Architecture.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java index c0dee76c2..71b7a15a3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -5,8 +5,7 @@ import android.os.Build; import java.util.Locale; -public class Architecture -{ +public class Architecture { public static int UNSUPPORTED_ARCH = -1; public static int ARCH_ARM64 = 0x1; public static int ARCH_ARM = 0x2; @@ -49,15 +48,11 @@ public class Architecture */ public static boolean isx86Device(){ //We check the whole range of supported ABIs, - //Since zenfones can place arm before their native instruction set. - if(is64BitsDevice()){ - for(String str : Build.SUPPORTED_64_BIT_ABIS){ - if(archAsInt(str) == ARCH_X86_64) return true; - } - }else{ - for(String str : Build.SUPPORTED_32_BIT_ABIS){ - if(archAsInt(str) == ARCH_X86) return true; - } + //Since asus zenfones can place arm before their native instruction set. + String[] ABI = is64BitsDevice() ? Build.SUPPORTED_64_BIT_ABIS : Build.SUPPORTED_32_BIT_ABIS; + int comparedArch = is64BitsDevice() ? ARCH_X86_64 : ARCH_X86; + for (String str : ABI) { + if (archAsInt(str) == comparedArch) return true; } return false; } @@ -75,16 +70,29 @@ public class Architecture /** * Convert an architecture from a String to an int. * @param arch The architecture as a String - * @return The architecture as an int. + * @return The architecture as an int, can be UNSUPPORTED_ARCH if unknown. */ public static int archAsInt(String arch){ arch = arch.toLowerCase().trim().replace(" ", ""); if(arch.contains("arm64") || arch.equals("aarch64")) return ARCH_ARM64; if(arch.contains("arm")) return ARCH_ARM; - if(arch.equals("x86_64") || arch.equals("amd64")) return ARCH_X86_64; + if(arch.contains("x86_64") || arch.contains("amd64")) return ARCH_X86_64; if(arch.contains("x86") || (arch.startsWith("i") && arch.endsWith("86"))) return ARCH_X86; //Shouldn't happen return UNSUPPORTED_ARCH; } + /** + * Convert to a string an architecture. + * @param arch The architecture as an int. + * @return "arm64" || "arm" || "x86_64" || "x86" || "UNSUPPORTED_ARCH" + */ + public static String archAsString(int arch){ + if(arch == ARCH_ARM64) return "arm64"; + if(arch == ARCH_ARM) return "arm"; + if(arch == ARCH_X86_64) return "x86_64"; + if(arch == ARCH_X86) return "x86"; + return "UNSUPPORTED_ARCH"; + } + } From 8ebfe0d5991541b4b63ef892b22eabef13b82cea Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 18:01:49 +0200 Subject: [PATCH 11/28] Make multiRT compatible with the new architecture system. --- .../src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 0dfbfb446..c23e33e74 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -1,5 +1,7 @@ package net.kdt.pojavlaunch; +import static net.kdt.pojavlaunch.Architecture.archAsString; + import android.Manifest; import android.app.Activity; import android.app.Dialog; @@ -387,7 +389,7 @@ public class PojavLoginActivity extends BaseActivity if(rt_version == null) return false; if(!rt_version.equals(current_rt_version)) { //If we already have an integrated one installed, check if it's up-to-date try { - MultiRTUtils.installRuntimeNamedBinpack(am.open("components/jre/universal.tar.xz"), am.open("components/jre/bin-" + Tools.CURRENT_ARCHITECTURE.split("/")[0] + ".tar.xz"), "Internal", rt_version, + MultiRTUtils.installRuntimeNamedBinpack(am.open("components/jre/universal.tar.xz"), am.open("components/jre/bin-" + archAsString(Tools.CURRENT_ARCHITECTURE) + ".tar.xz"), "Internal", rt_version, (resid, vararg) -> runOnUiThread(()->{if(startupTextView!=null)startupTextView.setText(getString(resid,vararg));})); MultiRTUtils.postPrepare(PojavLoginActivity.this,"Internal"); return true; From 346b5bf2c0a9db61de905c3702ccbc82a9a82b10 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 18:02:25 +0200 Subject: [PATCH 12/28] Tweaked max ram slider value. --- .../prefs/LauncherPreferenceFragment.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java index 019e7a117..481a8258f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java @@ -1,5 +1,6 @@ package net.kdt.pojavlaunch.prefs; +import android.app.ActivityManager; import android.os.*; import androidx.preference.*; @@ -9,6 +10,7 @@ import net.kdt.pojavlaunch.Tools; import android.content.*; +import static net.kdt.pojavlaunch.Architecture.is32BitsDevice; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE; public class LauncherPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener @@ -46,12 +48,20 @@ public class LauncherPreferenceFragment extends PreferenceFragmentCompat impleme seek6.setValue((int)(LauncherPreferences.PREF_MOUSESPEED*100f)); seek6.setSuffix(" %"); - int freeMem = (int) (Runtime.getRuntime().freeMemory() / 1048576l); + + int maxRAM; + int freeMem = (int) (Runtime.getRuntime().freeMemory() / 1048576L); + ActivityManager actManager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); + actManager.getMemoryInfo(memInfo); CustomSeekBarPreference seek7 = findPreference("allocation"); seek7.setMin(256); - if(Tools.CURRENT_ARCHITECTURE.contains("32")) seek7.setMax(1100); - else seek7.setMax(freeMem > 4096 ? freeMem : 4096); + + if(is32BitsDevice()) maxRAM = Math.min(1100, (int)(memInfo.totalMem /1024 /1024)); + else maxRAM = freeMem > 4096 ? freeMem : (int)(memInfo.totalMem /1024 /1024); + + seek7.setMax(maxRAM); seek7.setValue(LauncherPreferences.PREF_RAM_ALLOCATION); seek7.setSuffix(" MB"); From 93bb1663397a9970d6cdd3518dee212a7e8d9378 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 18:02:45 +0200 Subject: [PATCH 13/28] Cleaned up code with the new architecture system --- .../java/net/kdt/pojavlaunch/utils/JREUtils.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 098fe95c6..ce1a1c99c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -1,5 +1,9 @@ package net.kdt.pojavlaunch.utils; +import static net.kdt.pojavlaunch.Architecture.ARCH_X86; +import static net.kdt.pojavlaunch.Architecture.archAsString; +import static net.kdt.pojavlaunch.Architecture.is64BitsDevice; + import android.app.*; import android.content.*; import android.opengl.EGL14; @@ -37,11 +41,11 @@ public class JREUtils { * @param jreArch The java architecture to compare as a String. */ public static void checkJavaArchitecture(LoggableActivity act, String jreArch) { - act.appendlnToLog("Architecture: " + Tools.CURRENT_ARCHITECTURE); + act.appendlnToLog("Architecture: " + archAsString(Tools.CURRENT_ARCHITECTURE)); if(Tools.CURRENT_ARCHITECTURE == Architecture.archAsInt(jreArch)) return; - act.appendlnToLog("Architecture " + Tools.CURRENT_ARCHITECTURE + " is incompatible with Java Runtime " + jreArch); - throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, String.valueOf(Tools.CURRENT_ARCHITECTURE), jreArch)); + act.appendlnToLog("Architecture " + archAsString(Tools.CURRENT_ARCHITECTURE) + " is incompatible with Java Runtime " + jreArch); + throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, archAsString(Tools.CURRENT_ARCHITECTURE), jreArch)); } @@ -161,7 +165,7 @@ public class JREUtils { public static void relocateLibPath(final Context ctx) throws IOException { if (JRE_ARCHITECTURE == null) { JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH"); - if (JRE_ARCHITECTURE.startsWith("i") && JRE_ARCHITECTURE.endsWith("86") && Tools.CURRENT_ARCHITECTURE.contains("x86") && !Tools.CURRENT_ARCHITECTURE.contains("64")) { + if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){ JRE_ARCHITECTURE = "i386/i486/i586"; } } @@ -175,7 +179,7 @@ public class JREUtils { } } - String libName = Tools.CURRENT_ARCHITECTURE.contains("64") ? "lib64" : "lib"; + String libName = is64BitsDevice() ? "lib64" : "lib"; StringBuilder ldLibraryPath = new StringBuilder(); ldLibraryPath.append( Tools.DIR_HOME_JRE + "/" + Tools.DIRNAME_HOME_JRE + "/jli:" + From 8d2843889b7add4f3b0fc97de048e2d0734eceb2 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Wed, 11 Aug 2021 23:37:42 +0200 Subject: [PATCH 14/28] - Move getJavaArgs to the appropriate class - Deported loading a graphical library into its own function. - Clean up getJavaArgs implementation. --- .../main/java/net/kdt/pojavlaunch/Tools.java | 60 +------ .../net/kdt/pojavlaunch/utils/JREUtils.java | 168 +++++++++++------- 2 files changed, 108 insertions(+), 120 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index 846fb83ee..f29806f6c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -156,64 +156,6 @@ public final class Tools { javaArgList.add(cacioClasspath.toString()); } - public static void getJavaArgs(Context ctx, List javaArgList, String renderLib) { - List overrideableArgList = new ArrayList(); - - overrideableArgList.add("-Djava.home=" + Tools.DIR_HOME_JRE); - overrideableArgList.add("-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath()); - - overrideableArgList.add("-Duser.home=" + new File(Tools.DIR_GAME_NEW).getParent()); - overrideableArgList.add("-Duser.language=" + System.getProperty("user.language")); - // overrideableArgList.add("-Duser.timezone=GMT"); - - overrideableArgList.add("-Dos.name=Linux"); - overrideableArgList.add("-Dos.version=Android-" + Build.VERSION.RELEASE); - overrideableArgList.add("-Dpojav.path.minecraft=" + DIR_GAME_NEW); - overrideableArgList.add("-Dpojav.path.private.account=" + DIR_ACCOUNT_NEW); - - // javaArgList.add("-Dorg.lwjgl.libname=liblwjgl3.so"); - // javaArgList.add("-Dorg.lwjgl.system.jemalloc.libname=libjemalloc.so"); - - overrideableArgList.add("-Dorg.lwjgl.opengl.libname=" + renderLib); - // overrideableArgList.add("-Dorg.lwjgl.opengl.libname=libgl4es_115.so"); - - // javaArgList.add("-Dorg.lwjgl.opengl.libname=libRegal.so"); - - // Enable LWJGL3 debug - // overrideableArgList.add("-Dorg.lwjgl.util.Debug=true"); - // overrideableArgList.add("-Dorg.lwjgl.util.DebugFunctions=true"); - // overrideableArgList.add("-Dorg.lwjgl.util.DebugLoader=true"); - - // GLFW Stub width height - overrideableArgList.add("-Dglfwstub.windowWidth=" + CallbackBridge.windowWidth); - overrideableArgList.add("-Dglfwstub.windowHeight=" + CallbackBridge.windowHeight); - overrideableArgList.add("-Dglfwstub.initEgl=false"); - - overrideableArgList.add("-Dnet.minecraft.clientmodname=" + Tools.APP_NAME); - - // Disable FML Early Loading Screen to get Forge 1.14+ to work - overrideableArgList.add("-Dfml.earlyprogresswindow=false"); - - // Override args - for (String argOverride : JREUtils.parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS)) { - for (int i = overrideableArgList.size() - 1; i >= 0; i--) { - String arg = overrideableArgList.get(i); - // Currently, only java property is supported overridable argument, other such as "-X:" are handled by the JVM. - // Althought java properties are also handled by JVM, but duplicate bug from parser may occurs, so replace them. - if (arg.startsWith("-D") && argOverride.startsWith(arg.substring(0, arg.indexOf('=') + 1))) { - // Override the matched argument - overrideableArgList.set(i, argOverride); - break; - } else if (!argOverride.isEmpty() && i == 0) { - // Overridable argument has mismatched, so add the custom argument to overridable argument list - javaArgList.add(argOverride); - } - } - } - - javaArgList.addAll(overrideableArgList); - } - public static String[] getMinecraftArgs(MinecraftAccount profile, JMinecraftVersionList.Version versionInfo, String strGameDir) { String username = profile.username; String versionName = versionInfo.id; @@ -226,7 +168,7 @@ public final class Tools { File gameDir = new File(strGameDir); gameDir.mkdirs(); - Map varArgMap = new ArrayMap(); + Map varArgMap = new ArrayMap<>(); varArgMap.put("auth_access_token", profile.accessToken); varArgMap.put("auth_player_name", username); varArgMap.put("auth_uuid", profile.profileId); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index ce1a1c99c..fb41edf3b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -3,18 +3,15 @@ package net.kdt.pojavlaunch.utils; import static net.kdt.pojavlaunch.Architecture.ARCH_X86; import static net.kdt.pojavlaunch.Architecture.archAsString; import static net.kdt.pojavlaunch.Architecture.is64BitsDevice; +import static net.kdt.pojavlaunch.Tools.LOCAL_RENDERER; import android.app.*; import android.content.*; -import android.opengl.EGL14; -import android.opengl.EGLExt; -import android.opengl.GLES10; +import android.os.Build; import android.system.*; import android.util.*; import android.widget.Toast; -import androidx.annotation.Nullable; - import com.oracle.dalvik.*; import java.io.*; import java.util.*; @@ -29,9 +26,7 @@ import javax.microedition.khronos.egl.EGLDisplay; public class JREUtils { private JREUtils() {} - - public static String JRE_ARCHITECTURE; - + public static String LD_LIBRARY_PATH; private static String nativeLibDir; @@ -163,11 +158,9 @@ public class JREUtils { } public static void relocateLibPath(final Context ctx) throws IOException { - if (JRE_ARCHITECTURE == null) { - JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH"); - if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){ - JRE_ARCHITECTURE = "i386/i486/i586"; - } + String JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH"); + if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){ + JRE_ARCHITECTURE = "i386/i486/i586"; } nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir; @@ -218,8 +211,8 @@ public class JREUtils { envMap.put("REGAL_GL_VENDOR", "Android"); envMap.put("REGAL_GL_RENDERER", "Regal"); envMap.put("REGAL_GL_VERSION", "4.5"); - if(Tools.LOCAL_RENDERER != null) { - envMap.put("POJAV_RENDERER", Tools.LOCAL_RENDERER); + if(LOCAL_RENDERER != null) { + envMap.put("POJAV_RENDERER", LOCAL_RENDERER); } envMap.put("AWTSTUB_WIDTH", Integer.toString(CallbackBridge.windowWidth > 0 ? CallbackBridge.windowWidth : CallbackBridge.physicalWidth)); envMap.put("AWTSTUB_HEIGHT", Integer.toString(CallbackBridge.windowHeight > 0 ? CallbackBridge.windowHeight : CallbackBridge.physicalHeight)); @@ -235,15 +228,15 @@ public class JREUtils { } reader.close(); } - if(!envMap.containsKey("LIBGL_ES") && Tools.LOCAL_RENDERER != null) { + if(!envMap.containsKey("LIBGL_ES") && LOCAL_RENDERER != null) { int glesMajor = getDetectedVersion(); Log.i("glesDetect","GLES version detected: "+glesMajor); if (glesMajor < 3) { //fallback to 2 since it's the minimum for the entire app envMap.put("LIBGL_ES","2"); - } else if (Tools.LOCAL_RENDERER.startsWith("opengles")) { - envMap.put("LIBGL_ES", Tools.LOCAL_RENDERER.replace("opengles", "").replace("_5", "")); + } else if (LOCAL_RENDERER.startsWith("opengles")) { + envMap.put("LIBGL_ES", LOCAL_RENDERER.replace("opengles", "").replace("_5", "")); } else { // TODO if can: other backends such as Vulkan. // Sure, they should provide GLES 3 support. @@ -264,56 +257,26 @@ public class JREUtils { // return ldLibraryPath; } - public static int launchJavaVM(final LoggableActivity ctx, final List args) throws Throwable { + public static int launchJavaVM(final LoggableActivity ctx, List JVMArguments) throws Throwable { JREUtils.relocateLibPath(ctx); - // ctx.appendlnToLog("LD_LIBRARY_PATH = " + JREUtils.LD_LIBRARY_PATH); - final String graphicsLib; - if(Tools.LOCAL_RENDERER != null){ - switch (Tools.LOCAL_RENDERER) { - case "opengles2": - graphicsLib = "libgl4es_114.so"; - break; - case "opengles2_5": - graphicsLib = "libgl4es_115.so"; - break; - case "vulkan_zink": - graphicsLib = "libOSMesa_8.so"; - break; - case "opengles3_vgpu": - graphicsLib = "libvgpu.so"; - break; - default: - throw new RuntimeException("Undefined renderer: " + Tools.LOCAL_RENDERER); - } - if (!dlopen(graphicsLib) && !dlopen(findInLdLibPath(graphicsLib))) { - System.err.println("Failed to load renderer " + graphicsLib + ". Falling back to GL4ES 1.1.4"); - Tools.LOCAL_RENDERER = "opengles2"; - dlopen(nativeLibDir + "/libgl4es_114.so"); - } - }else{ - graphicsLib = null; - } - - List javaArgList = new ArrayList(); - - + final String graphicsLib = loadGraphicsLibrary(); + //List javaArgList = new ArrayList<>(); //Remove arguments that can interfere with the good working of the launcher - purgeArg(javaArgList,"-Xms"); - purgeArg(javaArgList,"-Xmx"); - purgeArg(javaArgList,"-d32"); - purgeArg(javaArgList,"-d64"); + purgeArg(JVMArguments,"-Xms"); + purgeArg(JVMArguments,"-Xmx"); + purgeArg(JVMArguments,"-d32"); + purgeArg(JVMArguments,"-d64"); //Add automatically generated args - javaArgList.add(Tools.DIR_HOME_JRE + "/bin/java"); - Tools.getJavaArgs(ctx, javaArgList,graphicsLib); + JVMArguments.add(Tools.DIR_HOME_JRE + "/bin/java"); + getJavaArgs(ctx, JVMArguments,graphicsLib); - javaArgList.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); - javaArgList.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + JVMArguments.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + JVMArguments.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); ctx.runOnUiThread(() -> Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show()); - System.out.println(javaArgList); - javaArgList.addAll(args); + System.out.println(JVMArguments); // For debugging only! /* @@ -329,7 +292,7 @@ public class JREUtils { setupExitTrap(ctx.getApplication()); chdir(Tools.DIR_GAME_NEW); - final int exitCode = VMLauncher.launchJVM(javaArgList.toArray(new String[0])); + final int exitCode = VMLauncher.launchJVM(JVMArguments.toArray(new String[0])); ctx.appendlnToLog("Java Exit code: " + exitCode); if (exitCode != 0) { ctx.runOnUiThread(() -> { @@ -343,6 +306,56 @@ public class JREUtils { return exitCode; } + /** + * Fills up the javaArgList passed in parameter with the user arguments + * and the auto-generated ones (eg. the window resolution). + * @param ctx The application context + * @param javaArgList The current list of arguments + * @param renderLib The name of the renderer used. + */ + public static void getJavaArgs(Context ctx, List javaArgList, String renderLib) { + List userArguments = parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS); + String[] overridableArguments = new String[]{ + "-Djava.home=" + Tools.DIR_HOME_JRE, + "-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath(), + "-Duser.home=" + new File(Tools.DIR_GAME_NEW).getParent(), + "-Duser.language=" + System.getProperty("user.language"), + "-Dos.name=Linux", + "-Dos.version=Android-" + Build.VERSION.RELEASE, + "-Dpojav.path.minecraft=" + Tools.DIR_GAME_NEW, + "-Dpojav.path.private.account=" + Tools.DIR_ACCOUNT_NEW, + "-Dorg.lwjgl.opengl.libname=" + renderLib, + + //LWJGL 3 DEBUG FLAGS + //"-Dorg.lwjgl.util.Debug=true", + //"-Dorg.lwjgl.util.DebugFunctions=true", + //"-Dorg.lwjgl.util.DebugLoader=true", + // GLFW Stub width height + "-Dglfwstub.windowWidth=" + CallbackBridge.windowWidth, + "-Dglfwstub.windowHeight=" + CallbackBridge.windowHeight, + "-Dglfwstub.initEgl=false", + + "-Dnet.minecraft.clientmodname=" + Tools.APP_NAME, + "-Dfml.earlyprogresswindow=false" //Forge 1.14+ workaround + }; + + + for (String userArgument : userArguments) { + for(int i=0; i < overridableArguments.length; ++i){ + String overridableArgument = overridableArguments[i]; + //Only java properties are considered overridable for now + if(userArgument.startsWith("-D") && userArgument.startsWith(overridableArgument.substring(0, overridableArgument.indexOf("=")))){ + overridableArguments[i] = ""; //Remove the argument since it is overridden + break; + } + } + } + + //Add all the arguments + javaArgList.addAll(userArguments); + javaArgList.addAll(Arrays.asList(overridableArguments)); + } + /** * Parse and separate java arguments in a user friendly fashion * It supports multi line and absence of spaces between arguments @@ -375,6 +388,39 @@ public class JREUtils { return parsedArguments; } + /** + * Open the render library in accordance to the settings. + * It will fallback if it fails to load the library. + * @return The name of the loaded library + */ + public static String loadGraphicsLibrary(){ + String renderLibrary; + switch (LOCAL_RENDERER){ + case "opengles2": renderLibrary = "libgl4es_114.so"; break; + case "opengles2_5": renderLibrary = "libgl4es_115.so"; break; + case "vulkan_zink": renderLibrary = "libOSMesa_8.so"; break; + case "opengles3_vgpu" : renderLibrary = "libvgpu.so"; break; + default: + Log.w("RENDER_LIBRARY", "No renderer selected, defaulting to opengles2"); + renderLibrary = "libgl4es_114.so"; + break; + } + + if (!dlopen(renderLibrary) && !dlopen(findInLdLibPath(renderLibrary))) { + Log.e("RENDER_LIBRARY","Failed to load renderer " + renderLibrary + ". Falling back to GL4ES 1.1.4"); + LOCAL_RENDERER = "opengles2"; + renderLibrary = "libgl4es_114.so"; + dlopen(nativeLibDir + "/libgl4es_114.so"); + } + return renderLibrary; + } + + /** + * Remove the argument from the list, if it exists + * If the argument exists multiple times, they will all be removed. + * @param argList The argument list to purge + * @param argStart The argument to purge from the list. + */ private static void purgeArg(List argList, String argStart) { for(int i = 0; i < argList.size(); i++) { final String arg = argList.get(i); From 42e07ea04e3c72484161e8ac5221bb4a952f6e32 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 00:06:27 +0200 Subject: [PATCH 15/28] Rename CURRENT_ARCH into DEVICE_ARCH --- .../main/java/net/kdt/pojavlaunch/BaseMainActivity.java | 2 +- .../main/java/net/kdt/pojavlaunch/PojavApplication.java | 4 ++-- .../main/java/net/kdt/pojavlaunch/PojavLoginActivity.java | 2 +- .../src/main/java/net/kdt/pojavlaunch/Tools.java | 2 +- .../src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 3fec98f93..6b5ec9e83 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -765,7 +765,7 @@ public class BaseMainActivity extends LoggableActivity { } private void checkVulkanZinkIsSupported() { - if (Tools.CURRENT_ARCHITECTURE == ARCH_X86 + if (Tools.DEVICE_ARCHITECTURE == ARCH_X86 || Build.VERSION.SDK_INT < 25 || !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_LEVEL) || !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION)) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavApplication.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavApplication.java index 4c93a31d7..8b27f901d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavApplication.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavApplication.java @@ -6,7 +6,7 @@ import android.content.pm.*; import android.content.res.*; import android.os.*; import androidx.core.app.*; -import androidx.preference.*; + import android.util.*; import java.io.*; import java.text.*; @@ -61,7 +61,7 @@ public class PojavApplication extends Application // Tools.FILE_ACCOUNT_JSON = getFilesDir().getAbsolutePath() + "/account_profiles.json"; - Tools.CURRENT_ARCHITECTURE = Architecture.getDeviceArchitecture(); + Tools.DEVICE_ARCHITECTURE = Architecture.getDeviceArchitecture(); //Force x86 lib directory for Asus x86 based zenfones if(Architecture.isx86Device() && Architecture.is32BitsDevice()){ String originalJNIDirectory = getApplicationInfo().nativeLibraryDir; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index c23e33e74..2268e7fd0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -389,7 +389,7 @@ public class PojavLoginActivity extends BaseActivity if(rt_version == null) return false; if(!rt_version.equals(current_rt_version)) { //If we already have an integrated one installed, check if it's up-to-date try { - MultiRTUtils.installRuntimeNamedBinpack(am.open("components/jre/universal.tar.xz"), am.open("components/jre/bin-" + archAsString(Tools.CURRENT_ARCHITECTURE) + ".tar.xz"), "Internal", rt_version, + MultiRTUtils.installRuntimeNamedBinpack(am.open("components/jre/universal.tar.xz"), am.open("components/jre/bin-" + archAsString(Tools.DEVICE_ARCHITECTURE) + ".tar.xz"), "Internal", rt_version, (resid, vararg) -> runOnUiThread(()->{if(startupTextView!=null)startupTextView.setText(getString(resid,vararg));})); MultiRTUtils.postPrepare(PojavLoginActivity.this,"Internal"); return true; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index f29806f6c..b5d83166a 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -45,7 +45,7 @@ public final class Tools { public static String DIR_DATA = "/data/data/" + BuildConfig.APPLICATION_ID; public static String MULTIRT_HOME = DIR_DATA+"/runtimes"; public static String LOCAL_RENDERER = null; - public static int CURRENT_ARCHITECTURE; + public static int DEVICE_ARCHITECTURE; // New since 3.3.1 public static String DIR_ACCOUNT_NEW; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index fb41edf3b..c43120551 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -36,11 +36,11 @@ public class JREUtils { * @param jreArch The java architecture to compare as a String. */ public static void checkJavaArchitecture(LoggableActivity act, String jreArch) { - act.appendlnToLog("Architecture: " + archAsString(Tools.CURRENT_ARCHITECTURE)); - if(Tools.CURRENT_ARCHITECTURE == Architecture.archAsInt(jreArch)) return; + act.appendlnToLog("Architecture: " + archAsString(Tools.DEVICE_ARCHITECTURE)); + if(Tools.DEVICE_ARCHITECTURE == Architecture.archAsInt(jreArch)) return; - act.appendlnToLog("Architecture " + archAsString(Tools.CURRENT_ARCHITECTURE) + " is incompatible with Java Runtime " + jreArch); - throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, archAsString(Tools.CURRENT_ARCHITECTURE), jreArch)); + act.appendlnToLog("Architecture " + archAsString(Tools.DEVICE_ARCHITECTURE) + " is incompatible with Java Runtime " + jreArch); + throw new RuntimeException(act.getString(R.string.mcn_check_fail_incompatiblearch, archAsString(Tools.DEVICE_ARCHITECTURE), jreArch)); } From c5765c39819d97d475f7f46692a421443a1a7fe8 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 18:06:46 +0200 Subject: [PATCH 16/28] Fix a small typeface related memory leak. --- .../src/main/java/com/kdt/mcgui/MineButton.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java b/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java index 9d1ff8c88..d5cbc7042 100644 --- a/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java +++ b/app_pojavlauncher/src/main/java/com/kdt/mcgui/MineButton.java @@ -4,6 +4,10 @@ import android.content.*; import android.graphics.*; import android.util.*; +import androidx.core.content.res.ResourcesCompat; + +import net.kdt.pojavlaunch.R; + public class MineButton extends androidx.appcompat.widget.AppCompatButton { @@ -17,7 +21,7 @@ public class MineButton extends androidx.appcompat.widget.AppCompatButton } public void init() { - setTypeface(Typeface.createFromAsset(getContext().getAssets(), "font/noto_sans_bold.ttf")); + setTypeface(ResourcesCompat.getFont(getContext(), R.font.noto_sans_bold)); } } From 50d822cca9c379229b58fb1e81dcd1e7de301d2f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 18:37:22 +0200 Subject: [PATCH 17/28] Fix transparent screen issue for dex and freeform --- .../src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java index e2af93b45..385f64711 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java @@ -12,6 +12,9 @@ public class MinecraftGLView extends TextureView public MinecraftGLView(Context context, AttributeSet attributeSet) { super(context, attributeSet); + //Fixes freeform and dex mode having transparent glass, + //since it forces android to used the background color of the view/layout behind it. + setOpaque(false); } From 29a96330aa434bfc5bc5a0b0ea1214413678c39f Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 18:37:59 +0200 Subject: [PATCH 18/28] Cleaned part of launchJVM implementation. --- .../net/kdt/pojavlaunch/utils/JREUtils.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index c43120551..570d07136 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -257,26 +257,25 @@ public class JREUtils { // return ldLibraryPath; } - public static int launchJavaVM(final LoggableActivity ctx, List JVMArguments) throws Throwable { + public static int launchJavaVM(final LoggableActivity ctx,final List JVMArgs) throws Throwable { JREUtils.relocateLibPath(ctx); final String graphicsLib = loadGraphicsLibrary(); + List userArgs = getJavaArgs(ctx,graphicsLib); - //List javaArgList = new ArrayList<>(); //Remove arguments that can interfere with the good working of the launcher - purgeArg(JVMArguments,"-Xms"); - purgeArg(JVMArguments,"-Xmx"); - purgeArg(JVMArguments,"-d32"); - purgeArg(JVMArguments,"-d64"); + purgeArg(userArgs,"-Xms"); + purgeArg(userArgs,"-Xmx"); + purgeArg(userArgs,"-d32"); + purgeArg(userArgs,"-d64"); //Add automatically generated args - JVMArguments.add(Tools.DIR_HOME_JRE + "/bin/java"); - getJavaArgs(ctx, JVMArguments,graphicsLib); + userArgs.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + userArgs.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); - JVMArguments.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); - JVMArguments.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M"); + userArgs.addAll(JVMArgs); ctx.runOnUiThread(() -> Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show()); - System.out.println(JVMArguments); + System.out.println(JVMArgs); // For debugging only! /* @@ -292,7 +291,7 @@ public class JREUtils { setupExitTrap(ctx.getApplication()); chdir(Tools.DIR_GAME_NEW); - final int exitCode = VMLauncher.launchJVM(JVMArguments.toArray(new String[0])); + final int exitCode = VMLauncher.launchJVM(userArgs.toArray(new String[0])); ctx.appendlnToLog("Java Exit code: " + exitCode); if (exitCode != 0) { ctx.runOnUiThread(() -> { @@ -307,13 +306,13 @@ public class JREUtils { } /** - * Fills up the javaArgList passed in parameter with the user arguments + * Gives an argument list filled with both the user args * and the auto-generated ones (eg. the window resolution). * @param ctx The application context - * @param javaArgList The current list of arguments * @param renderLib The name of the renderer used. + * @return A list filled with args. */ - public static void getJavaArgs(Context ctx, List javaArgList, String renderLib) { + public static List getJavaArgs(Context ctx, String renderLib) { List userArguments = parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS); String[] overridableArguments = new String[]{ "-Djava.home=" + Tools.DIR_HOME_JRE, @@ -352,8 +351,8 @@ public class JREUtils { } //Add all the arguments - javaArgList.addAll(userArguments); - javaArgList.addAll(Arrays.asList(overridableArguments)); + userArguments.addAll(Arrays.asList(overridableArguments)); + return userArguments; } /** From 4ccfe062638467c14bc7f560d250e7e202bb726e Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 19:49:56 +0200 Subject: [PATCH 19/28] Better use of the SRP for the 2.2 input system --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 19 -------------- .../net/kdt/pojavlaunch/MainActivity.java | 2 +- .../customcontrols/TouchCharInput.java | 26 +++++++++++++++++++ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 6b5ec9e83..bf5d01c7a 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -902,25 +902,6 @@ public class BaseMainActivity extends LoggableActivity { } - /** - * Toggle on and off the soft keyboard, depending of the state - * The condition is prone to errors if the keyboard is being hidden without the consent - * of the current TouchCharInput - */ - public void switchKeyboardState(){ - //If an hard keyboard is present, never trigger the soft one - if(touchCharInput.hasFocus() - || getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY){ - touchCharInput.clear(); - touchCharInput.disable(); - - }else{ - InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - touchCharInput.enable(); - touchCharInput.postDelayed(() -> imm.showSoftInput(touchCharInput, InputMethodManager.SHOW_IMPLICIT), 200); - } - } - protected void setRightOverride(boolean val) { this.rightOverride = val; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index eb82165a5..78352f9b9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -63,7 +63,7 @@ public class MainActivity extends BaseMainActivity { for(int keycode : button.getProperties().keycodes){ switch (keycode) { case ControlData.SPECIALBTN_KEYBOARD: - switchKeyboardState(); + touchCharInput.switchKeyboardState(); break; case ControlData.SPECIALBTN_TOGGLECTRL: diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/TouchCharInput.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/TouchCharInput.java index edcf1380f..0a9b93a3b 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/TouchCharInput.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/TouchCharInput.java @@ -1,8 +1,13 @@ package net.kdt.pojavlaunch.customcontrols; + +import static android.content.Context.INPUT_METHOD_SERVICE; + import android.content.Context; +import android.content.res.Configuration; import android.util.AttributeSet; import android.view.KeyEvent; +import android.view.inputmethod.InputMethodManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -87,6 +92,27 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText super.setSelection(5); } + /** + * Toggle on and off the soft keyboard, depending of the state + * + * @return if the keyboard is set to be shown. + */ + public boolean switchKeyboardState(){ + //If an hard keyboard is present, never trigger the soft one + if(hasFocus() + || getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY){ + clear(); + disable(); + return false; + }else{ + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE); + enable(); + postDelayed(() -> imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT), 200); + return true; + } + } + + /** * Clear the EditText from any leftover inputs * It does not affect the in-game input From 08aa9fa96cace2f99484b4773f8fe15dd80085de Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Thu, 12 Aug 2021 19:56:18 +0200 Subject: [PATCH 20/28] Clean up code a bit. --- .../net/kdt/pojavlaunch/Architecture.java | 7 ++-- .../net/kdt/pojavlaunch/BaseMainActivity.java | 33 ++----------------- .../net/kdt/pojavlaunch/MinecraftGLView.java | 2 -- 3 files changed, 7 insertions(+), 35 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java index 71b7a15a3..d3d38e482 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Architecture.java @@ -4,7 +4,9 @@ import android.os.Build; import java.util.Locale; - +/** + * This class aims at providing a simple and easy way to deal with the device architecture. + */ public class Architecture { public static int UNSUPPORTED_ARCH = -1; public static int ARCH_ARM64 = 0x1; @@ -30,7 +32,8 @@ public class Architecture { } /** - * Tells the device supported architecture + * Tells the device supported architecture. + * Since mips(/64) has been phased out long ago, is isn't checked here. * * @return ARCH_ARM || ARCH_ARM64 || ARCH_X86 || ARCH_86_64 */ diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index bf5d01c7a..1d45cf24d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -315,7 +315,7 @@ public class BaseMainActivity extends LoggableActivity { }); - minecraftGLView.setFocusable(true); + glTouchListener = new OnTouchListener(){ private boolean isTouchInHotbar = false; /* @@ -325,7 +325,7 @@ public class BaseMainActivity extends LoggableActivity { private boolean shouldBeDown = false; /* * When the android system has fingers really near to each other, it tends to - * either swap or remove a pointer. + * either swap or remove a pointer ! * This variable is here to mitigate the issue. */ private int lastPointerCount = 0; @@ -636,12 +636,6 @@ public class BaseMainActivity extends LoggableActivity { } - boolean isKeyboard(KeyEvent evt) { - System.out.println("Event:" +evt); - return EfficientAndroidLWJGLKeycode.containsKey(evt.getKeyCode()); - } - - @Override public boolean dispatchKeyEvent(KeyEvent event) { /* @@ -917,29 +911,6 @@ public class BaseMainActivity extends LoggableActivity { public static void sendKeyPress(int keyCode, char keyChar, int scancode, int modifiers, boolean status) { CallbackBridge.sendKeycode(keyCode, keyChar, scancode, modifiers, status); } - public static boolean doesObjectContainField(Class objectClass, String fieldName) { - for (Field field : objectClass.getFields()) { - if (field.getName().equals(fieldName)) { - return true; - } - } - return false; - } - public void sendKeyPress(char keyChar) { - if(doesObjectContainField(KeyEvent.class,"KEYCODE_" + Character.toUpperCase(keyChar))) { - try { - int keyCode = KeyEvent.class.getField("KEYCODE_" + Character.toUpperCase(keyChar)).getInt(null); - sendKeyPress(EfficientAndroidLWJGLKeycode.getValue(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), true); - sendKeyPress(EfficientAndroidLWJGLKeycode.getValue(keyCode), keyChar, 0, CallbackBridge.getCurrentMods(), false); - } catch (IllegalAccessException | NoSuchFieldException e) { - - } - return; - } - - sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), true); - sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), false); - } public static void sendKeyPress(int keyCode) { sendKeyPress(keyCode, CallbackBridge.getCurrentMods(), true); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java index 385f64711..24b6eb3c2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLView.java @@ -16,6 +16,4 @@ public class MinecraftGLView extends TextureView //since it forces android to used the background color of the view/layout behind it. setOpaque(false); } - - } From 35f0bf327712d28729b660777559bbfa91795533 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 13 Aug 2021 12:14:40 +0200 Subject: [PATCH 21/28] Removed freeform from the options, since it is useless. --- .../net/kdt/pojavlaunch/prefs/LauncherPreferences.java | 5 +---- app_pojavlauncher/src/main/res/xml/pref_main.xml | 7 ------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java index eccfdfe56..b5bdfa6ac 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java @@ -13,16 +13,14 @@ public class LauncherPreferences public static boolean PREF_VERTYPE_SNAPSHOT = false; public static boolean PREF_VERTYPE_OLDALPHA = false; public static boolean PREF_VERTYPE_OLDBETA = false; - public static boolean PREF_FREEFORM = false; public static boolean PREF_HIDE_SIDEBAR = false; public static boolean PREF_IGNORE_NOTCH = false; public static int PREF_NOTCH_SIZE = 0; public static float PREF_BUTTONSIZE = 100f; public static float PREF_MOUSESCALE = 100f; - public static int PREF_LONGPRESS_TRIGGER = 500; + public static int PREF_LONGPRESS_TRIGGER = 300; public static String PREF_DEFAULTCTRL_PATH = Tools.CTRLDEF_FILE; public static String PREF_CUSTOM_JAVA_ARGS; - public static String PREF_CUSTOM_OPENGL_LIBNAME = "libgl4es_114.so"; public static String PREF_LANGUAGE = "default"; public static String PREF_VERSION_REPOS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; public static boolean PREF_CHECK_LIBRARY_SHA = true; @@ -36,7 +34,6 @@ public class LauncherPreferences PREF_BUTTONSIZE = DEFAULT_PREF.getInt("buttonscale", 100); PREF_MOUSESCALE = DEFAULT_PREF.getInt("mousescale", 100); PREF_MOUSESPEED = ((float)DEFAULT_PREF.getInt("mousespeed",100))/100f; - PREF_FREEFORM = DEFAULT_PREF.getBoolean("freeform", false); PREF_HIDE_SIDEBAR = DEFAULT_PREF.getBoolean("hideSidebar", false); PREF_IGNORE_NOTCH = DEFAULT_PREF.getBoolean("ignoreNotch", false); PREF_VERTYPE_RELEASE = DEFAULT_PREF.getBoolean("vertype_release", true); diff --git a/app_pojavlauncher/src/main/res/xml/pref_main.xml b/app_pojavlauncher/src/main/res/xml/pref_main.xml index 989a04d8a..d0abccd94 100644 --- a/app_pojavlauncher/src/main/res/xml/pref_main.xml +++ b/app_pojavlauncher/src/main/res/xml/pref_main.xml @@ -31,13 +31,6 @@ android:key="disableGestures" android:summary="@string/mcl_disable_gestures_subtitle" android:title="@string/mcl_disable_gestures" /> - - Date: Fri, 13 Aug 2021 12:17:20 +0200 Subject: [PATCH 22/28] - The default RAM value is now device aware - Hide notch setting defaults to false. --- .../net/kdt/pojavlaunch/MainActivity.java | 2 +- .../kdt/pojavlaunch/PojavLoginActivity.java | 2 +- .../main/java/net/kdt/pojavlaunch/Tools.java | 15 ++++++++- .../prefs/LauncherPreferenceFragment.java | 14 ++++---- .../prefs/LauncherPreferences.java | 32 +++++++++++++++---- .../kdt/pojavlaunch/utils/LocaleUtils.java | 2 +- .../src/main/res/xml/pref_main.xml | 2 +- 7 files changed, 50 insertions(+), 19 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 78352f9b9..dac6a7cc7 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -194,7 +194,7 @@ public class MainActivity extends BaseMainActivity { if (requestCode == 1 && resultCode == Activity.RESULT_OK) { // Reload PREF_DEFAULTCTRL_PATH - LauncherPreferences.loadPreferences(); + LauncherPreferences.loadPreferences(getApplicationContext()); try { mControlLayout.loadLayout(LauncherPreferences.PREF_DEFAULTCTRL_PATH); } catch (IOException e) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 2268e7fd0..471c537f3 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -346,7 +346,7 @@ public class PojavLoginActivity extends BaseActivity mLockSelectJRE.wait(); } } - LauncherPreferences.loadPreferences(); + LauncherPreferences.loadPreferences(getApplicationContext()); } catch(Throwable e){ Tools.showError(this, e); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index b5d83166a..22e49370e 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -814,5 +814,18 @@ public final class Tools { Tools.updateWindowSize(ctx); } } - + + public static int getTotalDeviceMemory(Context ctx){ + ActivityManager actManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); + actManager.getMemoryInfo(memInfo); + return (int) (memInfo.totalMem / 1048576L); + } + + public static int getFreeDeviceMemory(Context ctx){ + ActivityManager actManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); + actManager.getMemoryInfo(memInfo); + return (int) (memInfo.availMem / 1048576L); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java index 481a8258f..951bb0624 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java @@ -11,6 +11,8 @@ import net.kdt.pojavlaunch.Tools; import android.content.*; import static net.kdt.pojavlaunch.Architecture.is32BitsDevice; +import static net.kdt.pojavlaunch.Tools.getFreeDeviceMemory; +import static net.kdt.pojavlaunch.Tools.getTotalDeviceMemory; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE; public class LauncherPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener @@ -50,16 +52,14 @@ public class LauncherPreferenceFragment extends PreferenceFragmentCompat impleme int maxRAM; - int freeMem = (int) (Runtime.getRuntime().freeMemory() / 1048576L); - ActivityManager actManager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE); - ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); - actManager.getMemoryInfo(memInfo); + int deviceRam = getTotalDeviceMemory(getContext()); + CustomSeekBarPreference seek7 = findPreference("allocation"); seek7.setMin(256); - if(is32BitsDevice()) maxRAM = Math.min(1100, (int)(memInfo.totalMem /1024 /1024)); - else maxRAM = freeMem > 4096 ? freeMem : (int)(memInfo.totalMem /1024 /1024); + if(is32BitsDevice()) maxRAM = Math.min(1100, deviceRam); + else maxRAM = deviceRam - (deviceRam < 3064 ? 800 : 1024); //To have a minimum for the device to breathe seek7.setMax(maxRAM); seek7.setValue(LauncherPreferences.PREF_RAM_ALLOCATION); @@ -90,6 +90,6 @@ public class LauncherPreferenceFragment extends PreferenceFragmentCompat impleme @Override public void onSharedPreferenceChanged(SharedPreferences p, String s) { - LauncherPreferences.loadPreferences(); + LauncherPreferences.loadPreferences(getContext()); } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java index b5bdfa6ac..1e09e486c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java @@ -3,6 +3,7 @@ package net.kdt.pojavlaunch.prefs; import android.content.*; import net.kdt.pojavlaunch.*; import net.kdt.pojavlaunch.multirt.MultiRTUtils; +import net.kdt.pojavlaunch.utils.JREUtils; public class LauncherPreferences { @@ -26,9 +27,9 @@ public class LauncherPreferences public static boolean PREF_CHECK_LIBRARY_SHA = true; public static boolean PREF_DISABLE_GESTURES = false; public static float PREF_MOUSESPEED = 1f; - public static int PREF_RAM_ALLOCATION=300; + public static int PREF_RAM_ALLOCATION; public static String PREF_DEFAULT_RUNTIME; - public static void loadPreferences() { + public static void loadPreferences(Context ctx) { PREF_RENDERER = DEFAULT_PREF.getString("renderer", "opengles2"); PREF_BUTTONSIZE = DEFAULT_PREF.getInt("buttonscale", 100); @@ -45,10 +46,7 @@ public class LauncherPreferences PREF_LANGUAGE = DEFAULT_PREF.getString("language", "default"); PREF_CHECK_LIBRARY_SHA = DEFAULT_PREF.getBoolean("checkLibraries",true); PREF_DISABLE_GESTURES = DEFAULT_PREF.getBoolean("disableGestures",false); - PREF_RAM_ALLOCATION = DEFAULT_PREF.getInt("allocation",300); - // Get double of max Android heap to set default heap size - int androidHeap = (int) (Runtime.getRuntime().maxMemory() / 1024l / 512l); - int doubleAndroidHeap = androidHeap * 2; + PREF_RAM_ALLOCATION = DEFAULT_PREF.getInt("allocation", findBestRAMAllocation(ctx)); PREF_CUSTOM_JAVA_ARGS = DEFAULT_PREF.getString("javaArgs", ""); /* if (PREF_CUSTOM_JAVA_ARGS.isEmpty()) { @@ -82,7 +80,7 @@ public class LauncherPreferences PREF_RENDERER = "opengles" + PREF_RENDERER; } String argLwjglLibname = "-Dorg.lwjgl.opengl.libname="; - for (String arg : PREF_CUSTOM_JAVA_ARGS.split(" ")) { + for (String arg : JREUtils.parseJavaArguments(PREF_CUSTOM_JAVA_ARGS)) { if (arg.startsWith(argLwjglLibname)) { // purge arg DEFAULT_PREF.edit().putString("javaArgs", @@ -100,4 +98,24 @@ public class LauncherPreferences LauncherPreferences.DEFAULT_PREF.edit().putString("defaultRuntime",LauncherPreferences.PREF_DEFAULT_RUNTIME).apply(); } } + + /** + * This functions aims at finding the best default RAM amount, + * according to the RAM amount of the physical device. + * Put not enough RAM ? Minecraft will lag and crash. + * Put too much RAM ? + * The GC will lag, android won't be able to breathe properly. + * @param ctx Context needed to get the total memory of the device. + * @return The best default value found. + */ + private static int findBestRAMAllocation(Context ctx){ + int deviceRam = Tools.getTotalDeviceMemory(ctx); + if (deviceRam < 1024) return 300; + if (deviceRam < 1536) return 450; + if (deviceRam < 2048) return 600; + if (deviceRam < 3064) return 936; + if (deviceRam < 4096) return 1148; + if (deviceRam < 6144) return 1536; + return 2048; //Default RAM allocation for 64 bits + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/LocaleUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/LocaleUtils.java index 3ec66f5cb..5804d9f08 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/LocaleUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/LocaleUtils.java @@ -16,7 +16,7 @@ public class LocaleUtils { public static Context setLocale(Context context) { if (LauncherPreferences.DEFAULT_PREF == null) { LauncherPreferences.DEFAULT_PREF = PreferenceManager.getDefaultSharedPreferences(context); - LauncherPreferences.loadPreferences(); + LauncherPreferences.loadPreferences(context); } Locale locale; diff --git a/app_pojavlauncher/src/main/res/xml/pref_main.xml b/app_pojavlauncher/src/main/res/xml/pref_main.xml index d0abccd94..9c811585d 100644 --- a/app_pojavlauncher/src/main/res/xml/pref_main.xml +++ b/app_pojavlauncher/src/main/res/xml/pref_main.xml @@ -46,7 +46,7 @@ app2:showSeekBarValue="true" app2:selectable="false"/> Date: Fri, 13 Aug 2021 12:38:04 +0200 Subject: [PATCH 23/28] Remove freeform launch part --- .../pojavlaunch/tasks/MinecraftDownloaderTask.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java index b79333a30..5c77ef336 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java @@ -353,17 +353,8 @@ public class MinecraftDownloaderTask extends AsyncTask Date: Fri, 13 Aug 2021 17:52:11 +0200 Subject: [PATCH 24/28] - Update LauncherPreferenceFragment.java - Clean up some code --- .../prefs/LauncherPreferenceFragment.java | 23 +++++++++++++------ .../tasks/MinecraftDownloaderTask.java | 11 --------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java index 951bb0624..fca26f1c9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferenceFragment.java @@ -1,28 +1,37 @@ package net.kdt.pojavlaunch.prefs; -import android.app.ActivityManager; + +import android.graphics.Color; import android.os.*; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.*; - import net.kdt.pojavlaunch.R; -import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.fragments.LauncherFragment; import android.content.*; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import static net.kdt.pojavlaunch.Architecture.is32BitsDevice; -import static net.kdt.pojavlaunch.Tools.getFreeDeviceMemory; import static net.kdt.pojavlaunch.Tools.getTotalDeviceMemory; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE; public class LauncherPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + view.setBackgroundColor(Color.parseColor("#44000000")); + super.onViewCreated(view, savedInstanceState); + } + @Override public void onCreatePreferences(Bundle b, String str) { addPreferencesFromResource(R.xml.pref_main); - - // Disable freeform mode in Android 6.0 and below. - findPreference("freeform").setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N); + //Disable notch checking behavior on android 8.1 and below. findPreference("ignoreNotch").setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && PREF_NOTCH_SIZE != 0); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java index 5c77ef336..6a6c9a9a8 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java @@ -344,26 +344,15 @@ public class MinecraftDownloaderTask extends AsyncTask jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments(); - jvmArgs.add("-Xms128M"); - jvmArgs.add("-Xmx1G"); - */ Intent mainIntent = new Intent(mActivity, MainActivity.class /* MainActivity.class */); // mainIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); mainIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); mActivity.startActivity(mainIntent); - } catch (Throwable e) { Tools.showError(mActivity, e); } - - /* - FloatingIntent maini = new FloatingIntent(PojavLauncherActivity.this, MainActivity.class); - maini.startFloatingActivity(); - */ } mActivity.mTask = null; From 19291433374175b571a3905c3229180c6b3b2266 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 13 Aug 2021 20:43:11 +0200 Subject: [PATCH 25/28] 300 ms is now default for the gesture speed --- .../java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java index 1e09e486c..d64024b53 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java @@ -41,7 +41,7 @@ public class LauncherPreferences PREF_VERTYPE_SNAPSHOT = DEFAULT_PREF.getBoolean("vertype_snapshot", false); PREF_VERTYPE_OLDALPHA = DEFAULT_PREF.getBoolean("vertype_oldalpha", false); PREF_VERTYPE_OLDBETA = DEFAULT_PREF.getBoolean("vertype_oldbeta", false); - PREF_LONGPRESS_TRIGGER = DEFAULT_PREF.getInt("timeLongPressTrigger", 500); + PREF_LONGPRESS_TRIGGER = DEFAULT_PREF.getInt("timeLongPressTrigger", 300); PREF_DEFAULTCTRL_PATH = DEFAULT_PREF.getString("defaultCtrl", Tools.CTRLDEF_FILE); PREF_LANGUAGE = DEFAULT_PREF.getString("language", "default"); PREF_CHECK_LIBRARY_SHA = DEFAULT_PREF.getBoolean("checkLibraries",true); From 17f78bed034e47cf0f710a556423da389a19f890 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 13 Aug 2021 20:47:06 +0200 Subject: [PATCH 26/28] Swipeable buttons are a bit faster now --- .../pojavlaunch/customcontrols/ControlLayout.java | 10 ++++------ .../customcontrols/buttons/ControlButton.java | 14 ++++++-------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index dc74c7ca2..621486469 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -260,7 +260,7 @@ public class ControlLayout extends FrameLayout //Check if the action is cancelling, reset the lastControl button associated to the view if(ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL){ - if(lastControlButton != null) lastControlButton.onTouchEvent(ev); + if(lastControlButton != null) lastControlButton.sendKeyPresses(false); mapTable.put(v, null); return true; } @@ -275,9 +275,8 @@ public class ControlLayout extends FrameLayout } } - //Release the last key - ev.setAction(MotionEvent.ACTION_POINTER_UP); - if (lastControlButton != null) lastControlButton.onTouchEvent(ev); + //Release last keys + if (lastControlButton != null) lastControlButton.sendKeyPresses(false); mapTable.put(v, null); //Look for another SWIPEABLE button @@ -289,8 +288,7 @@ public class ControlLayout extends FrameLayout //Press the new key if(!button.equals(lastControlButton)){ - ev.setAction(MotionEvent.ACTION_POINTER_DOWN); - button.onTouchEvent(ev); + button.sendKeyPresses(true); mapTable.put(v, button); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 90960bb4c..8290efe24 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -269,7 +269,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isSwipeable && !isPointerOutOfBounds){ //Remove keys if(!triggerToggle(event)) { - sendKeyPresses(event, false); + sendKeyPresses(false); } } isPointerOutOfBounds = true; @@ -282,7 +282,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).onTouch(this, event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ - sendKeyPresses(event, true); + sendKeyPresses(true); } } isPointerOutOfBounds = false; @@ -291,7 +291,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 if(!mProperties.isToggle){ - sendKeyPresses(event, true); + sendKeyPresses(true); } break; @@ -306,7 +306,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp isPointerOutOfBounds = false; if(!triggerToggle(event)) { - sendKeyPresses(event, false); + sendKeyPresses(false); } break; @@ -465,19 +465,17 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isToggle){ isToggled = !isToggled; invalidate(); - sendKeyPresses(event, isToggled); + sendKeyPresses(isToggled); return true; } return false; } - public void sendKeyPresses(MotionEvent event, boolean isDown){ + public void sendKeyPresses(boolean isDown){ for(int keycode : mProperties.keycodes){ if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); CallbackBridge.setModifiers(keycode, isDown); - }else { - super.onTouchEvent(event); } } } From 0d45a4e170b565432a46c53eeabececa0381509b Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Fri, 13 Aug 2021 23:18:50 +0200 Subject: [PATCH 27/28] Fix broken special buttons introduced in the previous commit --- .../pojavlaunch/customcontrols/ControlLayout.java | 6 +++--- .../customcontrols/buttons/ControlButton.java | 14 ++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 621486469..6dacb6746 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -260,7 +260,7 @@ public class ControlLayout extends FrameLayout //Check if the action is cancelling, reset the lastControl button associated to the view if(ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL){ - if(lastControlButton != null) lastControlButton.sendKeyPresses(false); + if(lastControlButton != null) lastControlButton.sendKeyPresses(ev,false); mapTable.put(v, null); return true; } @@ -276,7 +276,7 @@ public class ControlLayout extends FrameLayout } //Release last keys - if (lastControlButton != null) lastControlButton.sendKeyPresses(false); + if (lastControlButton != null) lastControlButton.sendKeyPresses(ev,false); mapTable.put(v, null); //Look for another SWIPEABLE button @@ -288,7 +288,7 @@ public class ControlLayout extends FrameLayout //Press the new key if(!button.equals(lastControlButton)){ - button.sendKeyPresses(true); + button.sendKeyPresses(ev,true); mapTable.put(v, button); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 8290efe24..20a85ca6d 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -269,7 +269,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isSwipeable && !isPointerOutOfBounds){ //Remove keys if(!triggerToggle(event)) { - sendKeyPresses(false); + sendKeyPresses(event,false); } } isPointerOutOfBounds = true; @@ -282,7 +282,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).onTouch(this, event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ - sendKeyPresses(true); + sendKeyPresses(event,true); } } isPointerOutOfBounds = false; @@ -291,7 +291,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 if(!mProperties.isToggle){ - sendKeyPresses(true); + sendKeyPresses(event,true); } break; @@ -306,7 +306,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp isPointerOutOfBounds = false; if(!triggerToggle(event)) { - sendKeyPresses(false); + sendKeyPresses(event,false); } break; @@ -465,17 +465,19 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isToggle){ isToggled = !isToggled; invalidate(); - sendKeyPresses(isToggled); + sendKeyPresses(event, isToggled); return true; } return false; } - public void sendKeyPresses(boolean isDown){ + public void sendKeyPresses(MotionEvent event, boolean isDown){ for(int keycode : mProperties.keycodes){ if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); CallbackBridge.setModifiers(keycode, isDown); + }else{ + super.onTouchEvent(event); } } } From c939b5dcc7b5cd24c129196d3a8b077b8ae3ff94 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Sat, 14 Aug 2021 22:18:38 +0200 Subject: [PATCH 28/28] The drop hotbar item is now excluded from gestures --- .../net/kdt/pojavlaunch/BaseMainActivity.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 1d45cf24d..5082d46ee 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -59,22 +59,22 @@ public class BaseMainActivity extends LoggableActivity { private static boolean triggeredLeftMouseButton = false; private final Handler theHandler = new Handler() { public void handleMessage(Message msg) { - if (!LauncherPreferences.PREF_DISABLE_GESTURES) { - switch (msg.what) { - case MSG_LEFT_MOUSE_BUTTON_CHECK: { - int x = CallbackBridge.mouseX; - int y = CallbackBridge.mouseY; - if (CallbackBridge.isGrabbing() && - Math.abs(initialX - x) < fingerStillThreshold && - Math.abs(initialY - y) < fingerStillThreshold) { - triggeredLeftMouseButton = true; - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, true); - } - } break; - case MSG_DROP_ITEM_BUTTON_CHECK: { - sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_Q, 0, true); - } break; - } + switch (msg.what) { + case MSG_LEFT_MOUSE_BUTTON_CHECK: + if(LauncherPreferences.PREF_DISABLE_GESTURES) break; + int x = CallbackBridge.mouseX; + int y = CallbackBridge.mouseY; + if (CallbackBridge.isGrabbing() && + Math.abs(initialX - x) < fingerStillThreshold && + Math.abs(initialY - y) < fingerStillThreshold) { + triggeredLeftMouseButton = true; + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, true); + } + break; + case MSG_DROP_ITEM_BUTTON_CHECK: + sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_Q, 0, true); + break; + } } };