diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index afda11161..77b8b5412 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,6 +41,11 @@ android:name=".MCLauncherActivity" android:configChanges="keyboardHidden|orientation|screenSize"/> + + javaArgList = new ArrayList(); + + javaArgList.add(Tools.homeJreDir + "/bin/java"); + + // javaArgList.add("-Xms512m"); + javaArgList.add("-Xmx512m"); + + javaArgList.add("-Djava.home=" + Tools.homeJreDir); + javaArgList.add("-Dos.name=Linux"); + javaArgList.add("-Djava.library.path="); + javaArgList.add("-jar"); + javaArgList.add(modFile.getAbsolutePath()); + + String libName = System.getProperty("os.arch").contains("64") ? "lib64" : "lib"; + String ldLibraryPath = ( + // To make libjli.so ignore re-execute + Tools.homeJreDir + "/lib/server:" + + + "/system/" + libName + ":" + + "/vendor/" + libName + ":" + + "/vendor/" + libName + "/hw:" + + + getApplicationInfo().nativeLibraryDir + ":" + + + Tools.homeJreDir + "/lib/jli:" + + Tools.homeJreDir + "/lib" + ); + + BinaryExecutor.setJavaEnvironment(); + BinaryExecutor.redirectStdio(); + BinaryExecutor.setLdLibraryPath(ldLibraryPath); + BinaryExecutor.initJavaRuntime(); + BinaryExecutor.chdir(Tools.MAIN_PATH); + + VMLauncher.launchJVM(javaArgList.toArray(new String[0])); + } catch (Throwable th) { + Tools.showError(this, th, true); + } + } +} diff --git a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java index 181740891..160263ef1 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java @@ -773,21 +773,18 @@ public class MCLauncherActivity extends AppCompatActivity @Override public void onClick(DialogInterface p1, int p2) { - switch(p2){ - case 0:{ // Mods manager - modManager(); - } break; - case 1:{ // OptiFine installer - installOptiFine(); - } break; - case 2:{ // Custom controls - if (Tools.enableDevFeatures) { - startActivity(new Intent(MCLauncherActivity.this, CustomControlsActivity.class)); - } - } break; - case 3:{ // Settings - startActivity(new Intent(MCLauncherActivity.this, LauncherPreferenceActivity.class)); - } break; + switch (p2) { + case 1: // Mod installer + installMod(); + break; + case 2: // Custom controls + if (Tools.enableDevFeatures) { + startActivity(new Intent(MCLauncherActivity.this, CustomControlsActivity.class)); + } + break; + case 3: // Settings + startActivity(new Intent(MCLauncherActivity.this, LauncherPreferenceActivity.class)); + break; case 4:{ // About final AlertDialog.Builder aboutB = new AlertDialog.Builder(MCLauncherActivity.this); aboutB.setTitle(R.string.mcl_option_about); @@ -810,70 +807,11 @@ public class MCLauncherActivity extends AppCompatActivity builder.show(); } - public void modManager() - { - /* - File file1 = new File(Tools.mpModEnable); - File file2 = new File(Tools.mpModDisable); - File file3 = new File(Tools.mpModAddNewMo); - file1.mkdirs(); - file2.mkdir(); - try - { - file3.createNewFile(); - } - catch (IOException e){} - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Mods manager (Forge)"); - builder.setPositiveButton(android.R.string.cancel, null); - - AlertDialog dialog = builder.create(); - - MFileListView flv = new MFileListView(this, dialog); - flv.listFileAt(Tools.datapath + "/ModsManager"); - flv.setFileSelectedListener(new MFileSelectedListener(){ - - @Override - public void onFileLongClick(File file, String path, String nane, String extension) - { - // TODO: Implement this method - } - @Override - public void onFileSelected(File file, String path, String nane, String extension) - { - // TODO: Implement this method - if(extension.equals(".jar")) { - - } else { - openSelectMod(); - } - } - }); - dialog.setView(flv); - dialog.show(); - */ - - Tools.dialogOnUiThread(this, "Mods manager", "This feature is not yet supported!"); - } - - public void openSelectMod() - { + private void installMod() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.alerttitle_installmod); builder.setPositiveButton(android.R.string.cancel, null); - AlertDialog dialog = builder.create(); - FileListView flv = new FileListView(this); - - dialog.setView(flv); - dialog.show(); - } - - private void installOptiFine() { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.alerttitle_installoptifine); - builder.setPositiveButton(android.R.string.cancel, null); - final AlertDialog dialog = builder.create(); FileListView flv = new FileListView(this); flv.setFileSelectedListener(new FileSelectedListener(){ @@ -881,7 +819,9 @@ public class MCLauncherActivity extends AppCompatActivity @Override public void onFileSelected(File file, String path, String name) { if (name.endsWith(".jar")) { - doInstallOptiFine(file); + Intent intent = new Intent(MCLauncherActivity.this, InstallModActivity.class); + intent.putExtra("modFile", file); + startActivity(intent); dialog.dismiss(); } } @@ -890,143 +830,6 @@ public class MCLauncherActivity extends AppCompatActivity dialog.show(); } - private void doInstallOptiFine(File optifineFile) { - new OptiFineInstaller().execute(optifineFile); - } - - private class OptiFineInstaller extends AsyncTask - { - private ProgressDialog dialog; - @Override - protected void onPreExecute() { - super.onPreExecute(); - dialog = new ProgressDialog(MCLauncherActivity.this); - dialog.setTitle("Installing OptiFine"); - dialog.setMessage("Preparing"); - dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - dialog.setMax(5); - dialog.setCancelable(false); - dialog.show(); - } - - @Override - protected Throwable doInBackground(File[] file) { - final StringBuilder currentLog = new StringBuilder(); - LoggerJava.LoggerOutputStream logOut = new LoggerJava.LoggerOutputStream(System.out, new LoggerJava.OnStringPrintListener(){ - @Override - public void onCharPrint(char c) - { - currentLog.append(c); - } - }); - LoggerJava.LoggerOutputStream logErr = new LoggerJava.LoggerOutputStream(System.err, new LoggerJava.OnStringPrintListener(){ - @Override - public void onCharPrint(char c) - { - currentLog.append(c); - } - }); - Throwable throwable = null; - File convertedFile = null; - try { - publishProgress("Preparing", "5"); - - String origMd5 = OptiFinePatcher.calculateMD5(file[0]); - convertedFile = new File(Tools.optifineDir, origMd5 + ".jar"); - if (!convertedFile.exists()) { - publishProgress("Patching OptiFine Installer", null, "1", "true"); - - Tools.extractAssetFolder(MCLauncherActivity.this, "optifine_patch", Tools.optifineDir, true); - - new File(Tools.optifineDir + "/optifine_patch/AndroidOptiFineUtilities.class.patch").delete(); - - String[] output = Tools.patchOptifineInstaller(MCLauncherActivity.this, file[0]); - File patchedFile = new File(output[1]); - - publishProgress("Converting OptiFine", null, null, "false"); - - System.setOut(new PrintStream(logOut)); - System.setErr(new PrintStream(logErr)); - - if (!convertedFile.exists()) { - RuntimeException dxError = new RuntimeException(getResources().getString(R.string.error_convert_lib, "OptiFine") + "\n" + currentLog.toString()); - dxError.setStackTrace(new StackTraceElement[0]); - throw dxError; - } - - patchedFile.delete(); - } - - publishProgress("Launching OptiFine installer", null, null, "true"); - - File optDir = getDir("dalvik-cache", 0); - optDir.mkdir(); - - DexClassLoader loader = new DexClassLoader(convertedFile.getAbsolutePath(), optDir.getAbsolutePath(), getApplicationInfo().nativeLibraryDir, getClass().getClassLoader()); - // AndroidOptiFineUtilities.originalOptifineJar = convertedFile.getAbsolutePath(); - - Class installerClass = loader.loadClass("optifine.AndroidInstaller"); - Method installerMethod = installerClass.getDeclaredMethod("doInstall", File.class); - installerMethod.invoke(null, new File(Tools.MAIN_PATH)); - - publishProgress("(4/5) Patching OptiFine Tweaker", null, null); - File optifineLibFile = new File("unimpl"); - if (!optifineLibFile.exists()) { - throw new FileNotFoundException(optifineLibFile.getAbsolutePath() + "\n\n--- OptiFine installer log ---\n" + currentLog.toString()); - } - new OptiFinePatcher(optifineLibFile).saveTweaker(); - convertedFile.delete(); - - publishProgress("(5/5) Done!", null, null); - Thread.sleep(500); - } catch (Throwable th) { - throwable = th; - } finally { - System.setOut(logOut.getRootStream()); - System.setErr(logErr.getRootStream()); - /* - if (throwable != null && convertedFile != null) { - convertedFile.delete(); - } - */ - return throwable; - } - } -/* - private Object fromConfig(DexClassLoader loader, String name) throws ReflectiveOperationException { - Field f = loader.loadClass("Config").getDeclaredField(name); - f.setAccessible(true); - return f.get(null); - } -*/ - @Override - protected void onProgressUpdate(String[] text) { - super.onProgressUpdate(text); - dialog.setMessage(text[0]); - if (text.length > 1 && text[1] != null) { - dialog.setMax(Integer.valueOf(text[1])); - } if (text.length > 2) { - dialog.setProgress(dialog.getProgress() + 1); - } if (text.length > 3 && text[3] != null) { - dialog.setIndeterminate(Boolean.getBoolean(text[3])); - } - } - - @Override - protected void onPostExecute(Throwable th) { - super.onPostExecute(th); - dialog.dismiss(); - - new RefreshVersionListTask().execute(); - - if (th == null) { - Toast.makeText(MCLauncherActivity.this, R.string.toast_optifine_success, Toast.LENGTH_SHORT).show(); - } else { - Tools.showError(MCLauncherActivity.this, th); - } - } - } - private class ViewPagerAdapter extends FragmentPagerAdapter { List fragmentList = new ArrayList<>(); diff --git a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 3d9e57a6d..d78995b8a 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -123,10 +123,10 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, private boolean isLogAllow = false; // private int navBarHeight = 40; - private static final int LTYPE_PROCESS = 0; - private static final int LTYPE_INVOCATION = 1; - private static final int LTYPE_CREATEJAVAVM = 2; - private static final int LAUNCH_TYPE; + public static final int LTYPE_PROCESS = 0; + public static final int LTYPE_INVOCATION = 1; + public static final int LTYPE_CREATEJAVAVM = 2; + public static final int LAUNCH_TYPE; static { int launchTypeFinal = LTYPE_INVOCATION; @@ -214,7 +214,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { - case R.id.nav_forceclose: dialogForceClose(); + case R.id.nav_forceclose: dialogForceClose(MainActivity.this); break; case R.id.nav_viewlog: openLogOutput(); break; @@ -949,13 +949,6 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, } private ShellProcessOperation mLaunchShell; - private void setEnvironment(String name, String value) throws ErrnoException, IOException { - if (LAUNCH_TYPE == LTYPE_PROCESS) { - mLaunchShell.writeToProcess("export " + name + "=" + value); - } else { - Os.setenv(name, value, true); - } - } private static void startStrace(int pid) throws Exception { String[] straceArgs = new String[] {"/system/bin/strace", @@ -1054,13 +1047,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, // "$JAVA_HOME/lib:$JAVA_HOME/lib/jli:$JAVA_HOME/lib/server" ); - setEnvironment("JAVA_HOME", Tools.homeJreDir); - setEnvironment("HOME", Tools.MAIN_PATH); - setEnvironment("TMPDIR", getCacheDir().getAbsolutePath()); - // setEnvironment("LIBGL_MIPMAP", "3"); - setEnvironment("MESA_GLSL_CACHE_DIR", getCacheDir().getAbsolutePath()); - setEnvironment("LD_LIBRARY_PATH", ldLibraryPath); - setEnvironment("PATH", Tools.homeJreDir + "/bin:" + Os.getenv("PATH")); + BinaryExecutor.setJavaEnvironment(); // can fix java? // setEnvironment("ORIGIN", Tools.homeJreDir + "/lib"); @@ -1082,6 +1069,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, BinaryExecutor.redirectStdio(); // DEPRECATED constructor (String) api 29 + /* FileObserver fobs = new FileObserver(logFile.getAbsolutePath(), FileObserver.MODIFY){ @Override public void onEvent(int event, String str) { @@ -1089,6 +1077,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, } }; fobs.startWatching(); + */ new Thread(new Runnable() { @Override public void run() { @@ -1271,9 +1260,8 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, ((Button) view).setText(isVis ? R.string.control_mouseoff: R.string.control_mouseon); } - public void dialogForceClose() - { - new AlertDialog.Builder(this) + public static void dialogForceClose(Context ctx) { + new AlertDialog.Builder(ctx) .setMessage(R.string.mcn_exit_confirm) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ @@ -1307,6 +1295,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, @Override public void onBackPressed() { // Prevent back + // Catch back as Esc keycode at another place } public void hideKeyboard() { diff --git a/app/src/main/res/layout/install_mod.xml b/app/src/main/res/layout/install_mod.xml new file mode 100644 index 000000000..6a67d53f0 --- /dev/null +++ b/app/src/main/res/layout/install_mod.xml @@ -0,0 +1,21 @@ + + + + + +