From 55c3c3959faa3d34e4b9b9994f8a4d2dcdfd726d Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Sat, 9 May 2020 10:27:27 +0700 Subject: [PATCH] Backup OpenJDK, restore if failed to prevent lost old one --- app/src/main/AndroidManifest.xml | 4 +- .../kdt/pojavlaunch/PojavLoginActivity.java | 62 +++++++++++++------ .../kdt/pojavlaunch/SimpleShellProcess.java | 6 ++ 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index acf3d9dfc..ee62b0bfd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,8 +56,10 @@ android:name=".prefs.LauncherPreferenceActivity" android:configChanges="keyboardHidden|orientation|screenSize"/> - + diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 3b70060e6..9f78105ab 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -40,7 +40,7 @@ public class PojavLoginActivity extends MineActivity private SharedPreferences firstLaunchPrefs; private String PREF_IS_DONOTSHOWAGAIN_WARN = "isWarnDoNotShowAgain"; private String PREF_IS_INSTALLED_LIBRARIES = "isLibrariesExtracted"; - private String PREF_IS_INSTALLED_OPENJDK = "isOpenJDKV2Installed"; + private String PREF_IS_INSTALLED_OPENJDK = "isOpenJDKV3Installed"; private String PREF_OPENJDK_PATCH_VERSION = "latestOpenjdkPatchVersion"; private boolean isInitCalled = false; @@ -167,15 +167,18 @@ public class PojavLoginActivity extends MineActivity File openjdkTar = new File(Tools.MAIN_PATH, "OpenJDK.zip"); - oldOpenjdkFolder = new File(Tools.datapath, "openjdk"); + oldOpenjdkFolder = new File(Tools.datapath, "jre_old"); newOpenjdkFolder = new File(Tools.datapath, "jre"); + final StringBuilder shellLog = new StringBuilder(); + SimpleShellProcess shell = new SimpleShellProcess(new SimpleShellProcess.OnPrintListener(){ @Override public void onPrintLine(String text) { publishProgress(null, text); + shellLog.append(text); } }); @@ -187,13 +190,6 @@ public class PojavLoginActivity extends MineActivity // Install OpenJDK publishProgress(null); try { - try { - Tools.deleteRecursive(oldOpenjdkFolder); - Tools.deleteRecursive(newOpenjdkFolder); - } catch (Throwable th) { - // Nothing wrong if can't delete OpenJDK folders. - } - // BEGIN download openjdk URL url = new URL("https://github.com/khanhduytran0/PojavLauncher/releases/download/v3.0.1-preview1/net.kdt.pojavlaunch.openjdkv3.zip"); URLConnection connection = url.openConnection(); @@ -218,15 +214,15 @@ public class PojavLoginActivity extends MineActivity input.close(); } // END download openjdk - + publishProgress(null, getString(R.string.openjdk_install_unpack_main)); - + shellLog.setLength(0); unpackOpenJDK(shell, openjdkTar, false); openjdkTar.delete(); setPref(PREF_IS_INSTALLED_OPENJDK, true); } catch (Throwable e) { - Tools.dialogOnUiThread(PojavLoginActivity.this, "Error! Check your internet connection", Log.getStackTraceString(e)); + Tools.dialogOnUiThread(PojavLoginActivity.this, "Error!", Log.getStackTraceString(e) + "\n\nShell log:\n" + shellLog); // Tools.showError(PojavLoginActivity.this, e, true); } } @@ -250,7 +246,9 @@ public class PojavLoginActivity extends MineActivity // Auto download new OpenJDK patch DownloadUtils.downloadFile(patchUrl, openjdkTar); + shellLog.setLength(0); unpackOpenJDK(shell, openjdkTar, true); + openjdkTar.delete(); firstLaunchPrefs.edit().putInt(PREF_OPENJDK_PATCH_VERSION, latestOpenjdkPatchVerInt).commit(); } @@ -279,7 +277,39 @@ public class PojavLoginActivity extends MineActivity } private void unpackOpenJDK(SimpleShellProcess shell, File openjdkTar, boolean isPatch) throws Throwable { + // Backup Old OpenJDK + shell.writeToProcess("mv " + newOpenjdkFolder.getAbsolutePath() + " " + oldOpenjdkFolder.getAbsolutePath()); + shell.writeToProcess(Tools.homeJreDir + "/usr/bin/busybox tar xvzf " + openjdkTar.getAbsolutePath() + " -C " + Tools.homeJreDir); + File resultCodeFile = new File(getCacheDir(), "extractOpenJDKResult"); + shell.writeToProcess("echo $? > " + resultCodeFile.getAbsolutePath()); + try { + oldOpenjdkFolder.renameTo(newOpenjdkFolder); + } catch (Throwable th) { + // Ignore because may change to jre folder! + } + + try { + int exitCode = Integer.parseInt(Tools.read(resultCodeFile.getAbsolutePath())); + if (exitCode != 0) { + SimpleShellProcess.NonZeroError error = new SimpleShellProcess.NonZeroError(exitCode); + shell.writeToProcess("echo \"" + error.getMessage() + ".\""); + throw error; + } + + // Safety delete the old one if success + Tools.deleteRecursive(oldOpenjdkFolder); + } catch (Throwable th) { + // If failed, restore to the old one + Tools.deleteRecursive(newOpenjdkFolder); + shell.writeToProcess("mv " + oldOpenjdkFolder.getAbsolutePath() + " " + newOpenjdkFolder.getAbsolutePath()); + + throw th; + } + + + + // return Integer.parseInt(Tools.read(resultCodeFile.getAbsolutePath())); /* ZipFile zis = new ZipFile(openjdkTar); @@ -322,11 +352,7 @@ public class PojavLoginActivity extends MineActivity zis.close(); } */ - try { - oldOpenjdkFolder.renameTo(newOpenjdkFolder); - } catch (Throwable th) { - // Ignore because may change to jre folder! - } + } @Override @@ -395,7 +421,7 @@ public class PojavLoginActivity extends MineActivity private void uiInit() { setContentView(R.layout.launcher_login); - edit2 = (EditText) findViewById(R.id.launcherAccEmail); + edit2 = findViewById(R.id.launcherAccEmail); edit3 = (EditText) findViewById(R.id.launcherAccPassword); if(prb == null) prb = (ProgressBar) findViewById(R.id.launcherAccProgress); diff --git a/app/src/main/java/net/kdt/pojavlaunch/SimpleShellProcess.java b/app/src/main/java/net/kdt/pojavlaunch/SimpleShellProcess.java index 0125946fb..06b5578dd 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/SimpleShellProcess.java +++ b/app/src/main/java/net/kdt/pojavlaunch/SimpleShellProcess.java @@ -90,4 +90,10 @@ public class SimpleShellProcess public static interface OnPrintListener { public void onPrintLine(String text); } + + public static class NonZeroError extends Error { + public NonZeroError(int errorCode) { + super("Process exited with code " + errorCode); + } + } }