diff --git a/app/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index f418f8e7e..d96018fdf 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -119,7 +119,7 @@ public class BaseMainActivity extends LoggableActivity { // FIXME: is it safe fot multi thread? GLOBAL_CLIPBOARD = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); + logFile = new File(Tools.DIR_GAME_NEW, "latestlog.txt"); logFile.delete(); logFile.createNewFile(); logStream = new PrintStream(logFile.getAbsolutePath()); @@ -881,7 +881,7 @@ public class BaseMainActivity extends LoggableActivity { } private void checkLWJGL3Installed() { - File lwjgl3dir = new File(Tools.MAIN_PATH, "lwjgl3"); + File lwjgl3dir = new File(Tools.DIR_GAME_NEW, "lwjgl3"); if (!lwjgl3dir.exists() || lwjgl3dir.isFile() || lwjgl3dir.list().length == 0) { appendlnToLog("Error: LWJGL3 was not installed!"); throw new RuntimeException(getString(R.string.mcn_check_fail_lwjgl)); @@ -961,7 +961,7 @@ public class BaseMainActivity extends LoggableActivity { public String getMinecraftOption(String key) { try { - String[] options = Tools.read(Tools.MAIN_PATH + "/options.txt").split("\n"); + String[] options = Tools.read(Tools.DIR_GAME_NEW + "/options.txt").split("\n"); for (String option : options) { String[] optionKeyValue = option.split(":"); if (optionKeyValue[0].equals(key)) { diff --git a/app/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java index 153da19fa..fefae2af3 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -33,7 +33,7 @@ public class JavaGUILauncherActivity extends LoggableActivity { setContentView(R.layout.install_mod); try { - logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); + logFile = new File(Tools.DIR_GAME_NEW, "latestlog.txt"); logFile.delete(); logFile.createNewFile(); logStream = new PrintStream(logFile.getAbsolutePath()); @@ -185,7 +185,7 @@ public class JavaGUILauncherActivity extends LoggableActivity { try { List javaArgList = new ArrayList(); - File cacioAwtLibPath = new File(Tools.MAIN_PATH, "cacioawtlib"); + File cacioAwtLibPath = new File(Tools.DIR_GAME_NEW, "cacioawtlib"); if (cacioAwtLibPath.exists()) { StringBuilder libStr = new StringBuilder(); for (File file: cacioAwtLibPath.listFiles()) { diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java index a71f7c51f..6c5ff7521 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java @@ -24,9 +24,10 @@ public class PojavApplication extends Application @Override public void uncaughtException(Thread thread, Throwable th) { boolean storagePermAllowed = Build.VERSION.SDK_INT < 23 || ActivityCompat.checkSelfPermission(PojavApplication.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; - File crashFile = new File(storagePermAllowed ? Tools.MAIN_PATH : Tools.DIR_DATA, "latestcrash.txt"); + File crashFile = new File(storagePermAllowed ? Tools.DIR_GAME_NEW : Tools.DIR_DATA, "latestcrash.txt"); try { // Write to file, since some devices may not able to show error + crashFile.getParentFile().mkdirs(); crashFile.createNewFile(); PrintStream crashStream = new PrintStream(crashFile); crashStream.append("PojavLauncher crash report\n"); diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 9246d66de..63cea2e35 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -142,7 +142,12 @@ public class PojavLoginActivity extends BaseActivity } catch (InterruptedException e) {} } - initMain(); + try { + initMain(); + } catch (Throwable th) { + Tools.showError(PojavLoginActivity.this, th, true); + return 1; + } return 0; } @@ -168,30 +173,6 @@ public class PojavLoginActivity extends BaseActivity progressLog.setText(getResources().getString(R.string.error_checklog, "\n\n" + progressLog.getText())); } */ } -/* - private void appendlnToLog(String txt) { - publishProgress("", txt + "\n"); - } - - private void execCmd(String cmd) throws Exception { - appendlnToLog("> " + cmd); - ShellProcessOperation mainProcess = new ShellProcessOperation(new ShellProcessOperation.OnPrintListener(){ - - @Override - public void onPrintLine(String text) - { - publishProgress(text); - } - }, cmd); - mainProcess.initInputStream(MCLoginActivity.this); - String msgExit = cmd.split(" ")[0] + " has exited with code " + mainProcess.waitFor(); - if (mainProcess.exitCode() != 0) { - throw new Error("(ERROR) " + msgExit); - } else { - appendlnToLog("(SUCCESS) " + msgExit); - } - } - */ } private void uiInit() { @@ -315,27 +296,20 @@ public class PojavLoginActivity extends BaseActivity return prefValue; } } - - private boolean setPref(String prefName, boolean value) { - return firstLaunchPrefs.edit().putBoolean(prefName, value).commit(); - } - private boolean setPref(String prefName, String value) { - return firstLaunchPrefs.edit().putString(prefName, value).commit(); - } - - private void initMain() - { + + private void initMain() throws Throwable { mkdirs(Tools.DIR_HOME_VERSION); mkdirs(Tools.DIR_HOME_LIBRARY); - mkdirs(Tools.MAIN_PATH); - mkdirs(Tools.MAIN_PATH + "/config"); - mkdirs(Tools.MAIN_PATH + "/lwjgl3"); - mkdirs(Tools.MAIN_PATH + "/mods"); + mkdirs(Tools.DIR_GAME_NEW); + mkdirs(Tools.DIR_GAME_NEW + "/config"); + mkdirs(Tools.DIR_GAME_NEW + "/lwjgl3"); + mkdirs(Tools.DIR_GAME_NEW + "/mods"); PojavMigrator.migrateAccountData(this); + PojavMigrator.migrateGameDir(); - File forgeSplashFile = new File(Tools.MAIN_PATH, "config/splash.properties"); + File forgeSplashFile = new File(Tools.DIR_GAME_NEW, "config/splash.properties"); String forgeSplashContent = "enabled=true"; try { if (forgeSplashFile.exists()) { @@ -354,25 +328,23 @@ public class PojavLoginActivity extends BaseActivity try { new CustomControls(this).save(Tools.CTRLDEF_FILE); - Tools.copyAssetFile(this, "components/ForgeInstallerHeadless/forge-installer-headless-1.0.1.jar", Tools.MAIN_PATH + "/config", "forge-installer-headless.jar", true); - - Tools.copyAssetFile(this, "options.txt", Tools.MAIN_PATH, false); - - // Extract launcher_profiles.json + Tools.copyAssetFile(this, "components/ForgeInstallerHeadless/forge-installer-headless-1.0.1.jar", Tools.DIR_GAME_NEW + "/config", "forge-installer-headless.jar", true); + Tools.copyAssetFile(this, "options.txt", Tools.DIR_GAME_NEW, false); + Tools.copyAssetFile(this, "java_sandbox.policy", Tools.DIR_GAME_NEW, true); // TODO: Remove after implement. - Tools.copyAssetFile(this, "launcher_profiles.json", Tools.MAIN_PATH, false); + Tools.copyAssetFile(this, "launcher_profiles.json", Tools.DIR_GAME_NEW, false); AssetManager am = this.getAssets(); InputStream is = am.open("components/lwjgl3/version"); - if(!new File(Tools.MAIN_PATH + "/lwjgl3/version").exists()) { + if(!new File(Tools.DIR_GAME_NEW + "/lwjgl3/version").exists()) { Log.i("LWJGL3Prep","Pack was installed manually, or does not exist, unpacking new..."); String[] lwjglFileList = am.list("components/lwjgl3"); FileOutputStream fos; InputStream iis; for(String s : lwjglFileList) { iis = am.open("components/lwjgl3/"+s); - fos = new FileOutputStream(new File(Tools.MAIN_PATH+"/lwjgl3/"+s)); + fos = new FileOutputStream(new File(Tools.DIR_GAME_NEW+"/lwjgl3/"+s)); /* int i; byte[] buf = new byte[1024]; while((i = iis.read(buf)) != -1) { @@ -384,13 +356,13 @@ public class PojavLoginActivity extends BaseActivity iis.close(); } } else { - FileInputStream fis = new FileInputStream(new File(Tools.MAIN_PATH + "/lwjgl3/version")); + FileInputStream fis = new FileInputStream(new File(Tools.DIR_GAME_NEW + "/lwjgl3/version")); String release1 = Tools.read(is); String release2 = Tools.read(fis); if (!release1.equals(release2)) { String[] lwjglFileList = am.list("components/lwjgl3"); for (String s : lwjglFileList) { - Tools.copyAssetFile(this, "components/lwjgl3/" + s, Tools.MAIN_PATH+"/lwjgl3/",s, true); + Tools.copyAssetFile(this, "components/lwjgl3/" + s, Tools.DIR_GAME_NEW+"/lwjgl3/",s, true); } } else { Log.i("LWJGL3Prep","Pack is up-to-date with the launcher, continuing..."); @@ -401,7 +373,7 @@ public class PojavLoginActivity extends BaseActivity File jreTarFile = selectJreTarFile(); uncompressTarXZ(jreTarFile, new File(Tools.DIR_HOME_JRE)); } - setPref(PREF_IS_INSTALLED_JAVARUNTIME, true); + firstLaunchPrefs.edit().putBoolean(PREF_IS_INSTALLED_JAVARUNTIME, true).commit(); Tools.copyAssetFile(this, "components/jre/version", Tools.DIR_HOME_JRE + "/","version", true); } @@ -603,6 +575,7 @@ public class PojavLoginActivity extends BaseActivity private boolean mkdirs(String path) { File file = new File(path); + // check necessary??? if(file.getParentFile().exists()) return file.mkdir(); else return file.mkdirs(); diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavMigrator.java b/app/src/main/java/net/kdt/pojavlaunch/PojavMigrator.java index 693fb04c2..5fac2ac14 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavMigrator.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavMigrator.java @@ -31,4 +31,17 @@ public class PojavMigrator } } } + + public static void migrateGameDir() throws IOException, InterruptedException { + File oldGameDir = new File(Tools.DIR_GAME_OLD); + if (oldGameDir.exists() && oldGameDir.isDirectory()) { + Process p = Runtime.getRuntime().exec( + new String[]{"mv", Tools.DIR_GAME_OLD, Tools.DIR_GAME_NEW}); + int exitCode = p.waitFor(); + if (exitCode != 0) { + throw new IOException("Could not move game dir! Exit code " + exitCode + + ", message:\n" + Tools.read(p.getErrorStream())); + } + } + } } diff --git a/app/src/main/java/net/kdt/pojavlaunch/Tools.java b/app/src/main/java/net/kdt/pojavlaunch/Tools.java index ac165beab..a24272131 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -27,11 +27,7 @@ public final class Tools public static final boolean ENABLE_DEV_FEATURES = BuildConfig.DEBUG; public static String APP_NAME = "null"; - public static final String MAIN_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/games/.minecraft"; - public static final String ASSETS_PATH = MAIN_PATH + "/assets"; - public static final String CTRLMAP_PATH = MAIN_PATH + "/controlmap"; - public static final String CTRLDEF_FILE = MAIN_PATH + "/controlmap/default.json"; - + public static final Gson GLOBAL_GSON = new GsonBuilder().setPrettyPrinting().create(); public static final String URL_HOME = "https://pojavlauncherteam.github.io/PojavLauncher"; @@ -41,17 +37,23 @@ public final class Tools // New since 3.3.1 public static String DIR_ACCOUNT_OLD; public static String DIR_ACCOUNT_NEW; + public static final String DIR_GAME_NEW = Environment.getExternalStorageDirectory().getAbsolutePath() + "/games/PojavLauncher/.minecraft"; + public static final String DIR_GAME_OLD = Environment.getExternalStorageDirectory().getAbsolutePath() + "/games/.minecraft"; // New since 3.0.0 public static String DIR_HOME_JRE; public static String DIRNAME_HOME_JRE = "lib"; // New since 2.4.2 - public static final String DIR_HOME_VERSION = MAIN_PATH + "/versions"; - public static final String DIR_HOME_LIBRARY = MAIN_PATH + "/libraries"; + public static final String DIR_HOME_VERSION = DIR_GAME_NEW + "/versions"; + public static final String DIR_HOME_LIBRARY = DIR_GAME_NEW + "/libraries"; - public static final String DIR_HOME_CRASH = MAIN_PATH + "/crash-reports"; + public static final String DIR_HOME_CRASH = DIR_GAME_NEW + "/crash-reports"; + public static final String ASSETS_PATH = DIR_GAME_NEW + "/assets"; + public static final String CTRLMAP_PATH = DIR_GAME_NEW + "/controlmap"; + public static final String CTRLDEF_FILE = DIR_GAME_NEW + "/controlmap/default.json"; + public static final String LIBNAME_OPTIFINE = "optifine:OptiFine"; public static void launchMinecraft(final LoggableActivity ctx, MinecraftAccount profile, JMinecraftVersionList.Version versionInfo) throws Throwable { @@ -78,7 +80,7 @@ public final class Tools overrideableArgList.add("-Djava.home=" + Tools.DIR_HOME_JRE); overrideableArgList.add("-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath()); // overrideableArgList.add("-Djava.library.path=" + JREUtils.LD_LIBRARY_PATH); - overrideableArgList.add("-Duser.home=" + new File(Tools.MAIN_PATH).getParent()); + overrideableArgList.add("-Duser.home=" + new File(Tools.DIR_GAME_NEW).getParent()); overrideableArgList.add("-Duser.language=" + System.getProperty("user.language")); // overrideableArgList.add("-Duser.timezone=GMT"); @@ -135,7 +137,7 @@ public final class Tools String userType = "mojang"; - File gameDir = new File(Tools.MAIN_PATH); + File gameDir = new File(Tools.DIR_GAME_NEW); gameDir.mkdirs(); Map varArgMap = new ArrayMap(); @@ -217,7 +219,7 @@ public final class Tools private static String getLWJGL3ClassPath() { StringBuilder libStr = new StringBuilder(); - File lwjgl3Folder = new File(Tools.MAIN_PATH, "lwjgl3"); + File lwjgl3Folder = new File(Tools.DIR_GAME_NEW, "lwjgl3"); if (/* info.arguments != null && */ lwjgl3Folder.exists()) { for (File file: lwjgl3Folder.listFiles()) { if (file.getName().endsWith(".jar")) { diff --git a/app/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java b/app/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java index 318b093c2..3f7d1b59b 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java +++ b/app/src/main/java/net/kdt/pojavlaunch/authenticator/microsoft/Msa.java @@ -173,7 +173,7 @@ public class Msa { String uhs = jo.getJSONObject("DisplayClaims").getJSONArray("xui").getJSONObject(0).getString("uhs"); Log.i("MicroAuth","Xbl Xsts = "+jo.getString("Token")+"; Uhs = " + uhs); acquireMinecraftToken(uhs,jo.getString("Token")); - }else{; + }else{ throwResponseError(conn); } } @@ -208,7 +208,7 @@ public class Msa { checkMcProfile(jo.getString("access_token")); checkMcStore(jo.getString("access_token")); - }else{; + }else{ throwResponseError(conn); } } diff --git a/app/src/main/java/net/kdt/pojavlaunch/installers/NewForgeInstaller.java b/app/src/main/java/net/kdt/pojavlaunch/installers/NewForgeInstaller.java index ebc29a037..cb2d107f3 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/installers/NewForgeInstaller.java +++ b/app/src/main/java/net/kdt/pojavlaunch/installers/NewForgeInstaller.java @@ -16,6 +16,6 @@ public class NewForgeInstaller extends BaseInstaller ctx.appendlnToLog("Launching JVM"); return ctx.launchJavaRuntime(null, - "-cp " + Tools.MAIN_PATH + "/config/forge-installer-headless.jar:" + mFile.getAbsolutePath() + " me.xfl03.HeadlessInstaller --installClient ."); + "-cp " + Tools.DIR_GAME_NEW + "/config/forge-installer-headless.jar:" + mFile.getAbsolutePath() + " me.xfl03.HeadlessInstaller --installClient ."); } } diff --git a/app/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index e0f2b52be..6bf2740a4 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -192,7 +192,7 @@ public class JREUtils public static void setJavaEnvironment(LoggableActivity ctx, @Nullable ShellProcessOperation shell) throws Throwable { Map envMap = new ArrayMap<>(); envMap.put("JAVA_HOME", Tools.DIR_HOME_JRE); - envMap.put("HOME", Tools.MAIN_PATH); + envMap.put("HOME", Tools.DIR_GAME_NEW); envMap.put("TMPDIR", ctx.getCacheDir().getAbsolutePath()); envMap.put("LIBGL_MIPMAP", "3"); @@ -210,7 +210,7 @@ public class JREUtils envMap.put("AWTSTUB_WIDTH", Integer.toString(CallbackBridge.windowWidth)); envMap.put("AWTSTUB_HEIGHT", Integer.toString(CallbackBridge.windowHeight)); - File customEnvFile = new File(Tools.MAIN_PATH, "custom_env.txt"); + File customEnvFile = new File(Tools.DIR_GAME_NEW, "custom_env.txt"); if (customEnvFile.exists() && customEnvFile.isFile()) { BufferedReader reader = new BufferedReader(new FileReader(customEnvFile)); String line; @@ -260,7 +260,7 @@ public class JREUtils */ JREUtils.setJavaEnvironment(ctx, null); JREUtils.initJavaRuntime(); - JREUtils.chdir(Tools.MAIN_PATH); + JREUtils.chdir(Tools.DIR_GAME_NEW); final int exitCode = VMLauncher.launchJVM(javaArgList.toArray(new String[0])); ctx.appendlnToLog("Java Exit code: " + exitCode); diff --git a/app/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java b/app/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java index 25ad015b7..06dfeb519 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java +++ b/app/src/main/java/net/kdt/pojavlaunch/utils/MCOptionUtils.java @@ -17,7 +17,7 @@ public class MCOptionUtils } try { - BufferedReader reader = new BufferedReader(new FileReader(Tools.MAIN_PATH + "/options.txt")); + BufferedReader reader = new BufferedReader(new FileReader(Tools.DIR_GAME_NEW + "/options.txt")); String line; while ((line = reader.readLine()) != null) { mLineList.add(line); @@ -50,7 +50,7 @@ public class MCOptionUtils } try { - Tools.write(Tools.MAIN_PATH + "/options.txt", result.toString()); + Tools.write(Tools.DIR_GAME_NEW + "/options.txt", result.toString()); } catch (IOException e) { Log.w(Tools.APP_NAME, "Could not save options.txt", e); } diff --git a/app/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java b/app/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java index 937d74f0d..b4293b6c6 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java +++ b/app/src/main/java/net/kdt/pojavlaunch/value/launcherprofiles/LauncherProfiles.java @@ -6,7 +6,7 @@ import java.io.*; public class LauncherProfiles { public static MinecraftLauncherProfiles mainProfileJson; - public static File launcherProfilesFile = new File(Tools.MAIN_PATH + "/launcher_profiles.json"); + public static File launcherProfilesFile = new File(Tools.DIR_GAME_NEW + "/launcher_profiles.json"); public static MinecraftLauncherProfiles update() { try { if (mainProfileJson == null) {