From bf49d40eb712f71f1c345f6aefc2457825be5ba0 Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Mon, 31 Aug 2020 11:52:54 +0700 Subject: [PATCH 01/33] Change lib --- .../net/kdt/pojavlaunch/BinaryExecutor.java | 10 +- .../net/kdt/pojavlaunch/MainActivity.java | 89 +++++------------- .../main/java/net/kdt/pojavlaunch/Tools.java | 7 ++ .../jniLibs/armeabi-v7a/libbinexecutor.so | Bin 22096 -> 22096 bytes app/src/main/jniLibs/armeabi-v7a/liblwjgl.so | Bin 239384 -> 239384 bytes .../jniLibs/armeabi-v7a/liblwjgl_opengl.so | Bin 288336 -> 288336 bytes 6 files changed, 35 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java b/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java index 91442bab0..f4e2b0538 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java +++ b/app/src/main/java/net/kdt/pojavlaunch/BinaryExecutor.java @@ -3,7 +3,7 @@ package net.kdt.pojavlaunch; import android.system.*; import java.io.*; -// This clads should be named as 'LoadMe' as original +// This class should be named as 'LoadMe' as original public class BinaryExecutor { private BinaryExecutor() {} @@ -18,15 +18,15 @@ public class BinaryExecutor dlopen(Tools.homeJreDir + "/lib/libawt.so"); dlopen(Tools.homeJreDir + "/lib/libawt_headless.so"); } - - public static FileDescriptor redirectStdio() throws ErrnoException { - File logFile = new File(Tools.MAIN_PATH, "v3log.txt"); + + public static void redirectStdio() throws ErrnoException { + File logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); FileDescriptor fd = Os.open(logFile.getAbsolutePath(), OsConstants.O_WRONLY | OsConstants.O_CREAT | OsConstants.O_TRUNC, 0666); Os.dup2(fd, OsConstants.STDERR_FILENO); Os.dup2(fd, OsConstants.STDOUT_FILENO); - return fd; + // return fd; } public static native int chdir(String path); diff --git a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 73bef549e..3d9e57a6d 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -110,6 +110,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, private Button[] controlButtons; + private File logFile; private PrintStream logStream; /* @@ -155,7 +156,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, setContentView(R.layout.main); try { - File logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); + logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); logFile.delete(); logFile.createNewFile(); logStream = new PrintStream(logFile.getAbsolutePath()); @@ -175,52 +176,6 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, } }); - ExitManager.setExitTrappedListener(new ExitManager.ExitTrappedListener(){ - @Override - public void onExitTrapped() - { - logStream.close(); - runOnUiThread(new Runnable(){ - - @Override - public void run() { - isExited = true; - - AlertDialog.Builder d = new AlertDialog.Builder(MainActivity.this); - d.setTitle(R.string.mcn_exit_title); - - try { - File crashLog = Tools.lastFileModified(Tools.crashPath); - if(crashLog != null && Tools.read(crashLog.getAbsolutePath()).startsWith("---- Minecraft Crash Report ----")){ - d.setMessage(R.string.mcn_exit_crash); - } else { - fullyExit(); - return; - } - } catch (Throwable th) { - d.setMessage(getStr(R.string.mcn_exit_errcrash) + "\n" + Log.getStackTraceString(th)); - } - d.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ - - @Override - public void onClick(DialogInterface p1, int p2) - { - fullyExit(); - } - }); - d.setCancelable(false); - d.show(); - } - }); - } - }); - - try { - ExitManager.disableSystemExit(); - } catch (Throwable th) { - Log.w(Tools.APP_NAME, "Could not disable System.exit() method!", th); - } - mProfile = PojavProfile.getCurrentProfileContent(this); mVersionInfo = Tools.getVersionInfo(mProfile.getVersion()); @@ -334,18 +289,14 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, ControlButton[] specialButtons = ControlButton.getSpecialButtons(); specialButtons[0].specialButtonListener = new View.OnClickListener(){ - @Override - public void onClick(View p1) - { + public void onClick(View view) { showKeyboard(); } }; specialButtons[1].specialButtonListener = new View.OnClickListener(){ - @Override - public void onClick(View view) - { + public void onClick(View view) { MainActivity.this.onClick(toggleControlButton); } }; @@ -884,11 +835,7 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, } public static void fullyExit() { - if (!ExitManager.isExiting()) { - ExitManager.enableSystemExit(); - System.exit(0); - } - ExitManager.stopExitLoop(); + System.exit(0); } public void forceUserHome(String s) throws Exception { @@ -1029,16 +976,11 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, // javaArgList.add("-Xms512m"); javaArgList.add("-Xmx512m"); - /* - javaArgList.add("-Djava.library.path=" + - // TODO lwjgl2 vs lwjgl3 native path - getApplicationInfo().nativeLibraryDir - ); - */ javaArgList.add("-Djava.home=" + Tools.homeJreDir); javaArgList.add("-Dos.name=Linux"); + // javaArgList.add("-Dorg.lwjgl.libname=liblwjgl3.so"); // javaArgList.add("-Dorg.lwjgl.system.jemalloc.libname=libjemalloc.so"); javaArgList.add("-Dorg.lwjgl.opengl.libname=libgl04es.so"); // javaArgList.add("-Dorg.lwjgl.opengl.libname=libRegal.so"); @@ -1052,6 +994,8 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, javaArgList.add("-Dglfwstub.windowWidth=" + AndroidDisplay.windowWidth); javaArgList.add("-Dglfwstub.windowHeight=" + AndroidDisplay.windowHeight); + javaArgList.add("-Dglfwstub.initEgl=false"); + if (mVersionInfo.arguments != null) { // Minecraft 1.13+ @@ -1130,8 +1074,21 @@ public class MainActivity extends AppCompatActivity implements OnTouchListener, Tools.showError(this, new ErrnoException("java", exitCode), false); } } else { // Type Invocation - final FileDescriptor logFile = BinaryExecutor.redirectStdio(); - + // Is it need? + /* + Os.dup2(FileDescriptor.err, OsConstants.STDERR_FILENO); + Os.dup2(FileDescriptor.out, OsConstants.STDOUT_FILENO); + */ + + BinaryExecutor.redirectStdio(); + // DEPRECATED constructor (String) api 29 + FileObserver fobs = new FileObserver(logFile.getAbsolutePath(), FileObserver.MODIFY){ + @Override + public void onEvent(int event, String str) { + + } + }; + fobs.startWatching(); new Thread(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/net/kdt/pojavlaunch/Tools.java b/app/src/main/java/net/kdt/pojavlaunch/Tools.java index 5b9a0278e..28e40407f 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -84,6 +84,7 @@ public final class Tools String[] classpath = generateLibClasspath(info); // Debug: LWJGL 3 override + File lwjgl2Folder = new File(Tools.MAIN_PATH, "lwjgl2"); File lwjgl3Folder = new File(Tools.MAIN_PATH, "lwjgl3"); if (info.arguments != null && lwjgl3Folder.exists()) { for (File file: lwjgl3Folder.listFiles()) { @@ -91,6 +92,12 @@ public final class Tools libStr.append(file.getAbsolutePath() + ":"); } } + } else if (lwjgl2Folder.exists()) { + for (File file: lwjgl2Folder.listFiles()) { + if (file.getName().endsWith(".jar")) { + libStr.append(file.getAbsolutePath() + ":"); + } + } } if (isClientFirst) { diff --git a/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so b/app/src/main/jniLibs/armeabi-v7a/libbinexecutor.so index a7c4104f6cf0a185feb043f3e4d3cd954d1c185a..75e5a50def864e5b9aac1e5fd2c64fe949d8d3b3 100644 GIT binary patch delta 6806 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 Pq8H;QV#~tiLBjt6f%5uy delta 6422 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 So`J2Au?XjH+kyweg#Q6YJCV=; diff --git a/app/src/main/jniLibs/armeabi-v7a/liblwjgl.so b/app/src/main/jniLibs/armeabi-v7a/liblwjgl.so index d027f70ed4298ce00a11d569d2f6b7633b5f8a08..8ba3c572da258a9554f8951f099161d1bcc466cd 100644 GIT binary patch delta 823 zcmXBSTS!z<7zN<9{VO^~=3z1sF`7n<6t7ei1w&w&B3Y;pHi`Favhk8yibR-rp^I3C zM>4DsF_8!f*@=jhiBu$nC1FSp(nDZ0I#lR`waka_{A>NN4~N6AMAfXG$(cgk3T})p! zaQ`0Q;H^dY0X{M(S%yOfOef@&JILdwLxkGoSRY7)zn)}Lwr^ZIk_JWy&Kij*kh7o(3BEf4FNcZ_dnk|t=J zUeel$Q5vCP(lkWRX^@`LQyQRt>Z4xjp~p1lww59#BCDCXks7F;uF+MhqguK`)l^9p zR7M^uAvYCM5#>-exhRWbwI@nORCM<_;0NvGU#a1oq+sR@&K~k-ZYlykQKOX^E%Wx7 zLf{MQZ+gKz$~j9N%w3#sbykdQQAQ;DExsbf^2AD=v7>;Ms{__ztQqI8jYRH_aObaU<0MT5t>yut?5Aldm-m3LSk!azlD<_9>UgIF``K-oKq1wWF9S&A jY^Q1FaLzm0eN>*LsstU>DvkiX|A9CSHLk0BrAPe(6(-|4 delta 826 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 P?=oD4TSwn*_`3fOqny|` delta 71214 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 G?*9V@K2P8P From 958e22f0a3f189559c4b3c8624201b917d7bfc9b Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Tue, 1 Sep 2020 07:32:54 +0700 Subject: [PATCH 02/33] Add mod installer (not implemented) --- app/src/main/AndroidManifest.xml | 5 + .../net/kdt/pojavlaunch/BinaryExecutor.java | 22 +- .../kdt/pojavlaunch/InstallModActivity.java | 98 ++++++++ .../kdt/pojavlaunch/MCLauncherActivity.java | 229 ++---------------- .../net/kdt/pojavlaunch/MainActivity.java | 33 +-- app/src/main/res/layout/install_mod.xml | 21 ++ app/src/main/res/values-id/strings.xml | 2 +- app/src/main/res/values/headings_array.xml | 4 +- app/src/main/res/values/strings.xml | 5 +- 9 files changed, 176 insertions(+), 243 deletions(-) create mode 100644 app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java create mode 100644 app/src/main/res/layout/install_mod.xml 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 @@ + + + + + +