From cdf19ab17d4e8f64ed147f274a95cdc6a0c5dd9e Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:09:17 +0700 Subject: [PATCH 1/3] Honey Cake --- app/build.gradle | 2 +- .../com/vectras/qemu/MainSettingsManager.java | 5 + .../main/java/com/vectras/vm/AppConfig.java | 1 + .../com/vectras/vm/CustomRomActivity.java | 22 +- .../java/com/vectras/vm/MainActivity.java | 23 +- app/src/main/java/com/vectras/vm/StartVM.java | 7 +- .../main/java/com/vectras/vm/VMManager.java | 235 ++++++++++++++++-- .../main/java/com/vectras/vm/VectrasApp.java | 16 ++ .../main/java/com/vectras/vterm/Terminal.java | 59 +---- app/src/main/res/drawable/memory_alt_24px.xml | 10 + app/src/main/res/values-ar/strings.xml | 5 +- app/src/main/res/values/strings.xml | 7 +- app/src/main/res/xml/qemu.xml | 7 + shell-loader/release/output-metadata.json | 20 ++ web/data/UpdateConfig.json | 2 +- 15 files changed, 311 insertions(+), 110 deletions(-) create mode 100644 app/src/main/res/drawable/memory_alt_24px.xml create mode 100644 shell-loader/release/output-metadata.json diff --git a/app/build.gradle b/app/build.gradle index 87a2a92..13d4e56 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { minSdk minApi targetSdk targetApi versionCode 20 - versionName "v2.9.4-genoise" + versionName "v2.9.4-honeycake" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true } diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java index dec517b..ee325a3 100644 --- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java +++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java @@ -578,6 +578,11 @@ public class MainSettingsManager extends AppCompatActivity return prefs.getBoolean("useDefaultBios", true); } + public static boolean useMemoryOvercommit(Activity activity) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + return prefs.getBoolean("useMemoryOvercommit", true); + } + public static boolean useLocalTime(Activity activity) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); return prefs.getBoolean("useLocalTime", true); diff --git a/app/src/main/java/com/vectras/vm/AppConfig.java b/app/src/main/java/com/vectras/vm/AppConfig.java index c07b254..3c5b053 100644 --- a/app/src/main/java/com/vectras/vm/AppConfig.java +++ b/app/src/main/java/com/vectras/vm/AppConfig.java @@ -65,6 +65,7 @@ public class AppConfig { } public static String basefiledir = ""; public static String maindirpath = ""; + public static String recyclebin = ""; //public static String basefiledir = datadirpath(SplashActivity.activity) + "/.qemu/"; //public static String maindirpath = FileUtils.getExternalFilesDirectory(SplashActivity.activity).getPath() + "/"; public static String sharedFolder = maindirpath + "SharedFolder/"; diff --git a/app/src/main/java/com/vectras/vm/CustomRomActivity.java b/app/src/main/java/com/vectras/vm/CustomRomActivity.java index de00dd7..0f267d0 100644 --- a/app/src/main/java/com/vectras/vm/CustomRomActivity.java +++ b/app/src/main/java/com/vectras/vm/CustomRomActivity.java @@ -54,6 +54,7 @@ import com.vectras.vm.logger.VectrasStatus; import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.UIUtils; +import org.checkerframework.checker.units.qual.C; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -743,19 +744,7 @@ public class CustomRomActivity extends AppCompatActivity { private void checkJsonFile() { if (isFileExists(AppConfig.romsdatajson)) { - if (!VectrasApp.checkJSONIsNormal(AppConfig.romsdatajson)) { - alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); - alertDialog.setTitle(getResources().getString(R.string.oops)); - alertDialog.setMessage(getResources().getString(R.string.need_fix_json_before_create)); - alertDialog.setCancelable(true); - alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.delete_all), (dialog, which) -> { - VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); - }); - alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), (dialog, which) -> { - - }); - alertDialog.show(); - } else { + if (VMManager.isRomsDataJsonNormal(true, CustomRomActivity.this)) { startCreateNewVM(); } @@ -1064,8 +1053,9 @@ public class CustomRomActivity extends AppCompatActivity { setDefault(); } drive.setText(_getDiskFile); + VMManager.setArch("X86_64", CustomRomActivity.this); } - VMManager.setArch("X86_64", getApplicationContext()); + VectrasApp.oneDialog(getResources().getString(R.string.oops), getResources().getString(R.string.error_CR_CVBI2), true, false, CustomRomActivity.this); } else { //Error code: CR_CVBI3 @@ -1110,9 +1100,9 @@ public class CustomRomActivity extends AppCompatActivity { } if (jObj.has("arch") && !jObj.isNull("arch")) { - VMManager.setArch(jObj.getString("arch"), getApplicationContext()); + VMManager.setArch(jObj.getString("arch"), CustomRomActivity.this); } else { - VMManager.setArch("x86_64", getApplicationContext()); + VMManager.setArch("x86_64", CustomRomActivity.this); } VectrasApp.moveAFile(AppConfig.vmFolder + _filename.replace(".cvbi", ""), AppConfig.vmFolder + vmID); diff --git a/app/src/main/java/com/vectras/vm/MainActivity.java b/app/src/main/java/com/vectras/vm/MainActivity.java index d1f3f35..f24b3b1 100644 --- a/app/src/main/java/com/vectras/vm/MainActivity.java +++ b/app/src/main/java/com/vectras/vm/MainActivity.java @@ -5,6 +5,7 @@ import static android.content.Intent.ACTION_VIEW; import static android.os.Build.VERSION.SDK_INT; import com.termux.app.TermuxService; +import static com.vectras.vm.VectrasApp.getApp; import static com.vectras.vm.VectrasApp.getAppInfo; import static com.vectras.vm.utils.UIUtils.UIAlert; @@ -1364,21 +1365,7 @@ public class MainActivity extends AppCompatActivity { private void errorjsondialog() { if (VectrasApp.isFileExists(AppConfig.romsdatajson)) { - if (!VectrasApp.checkJSONIsNormal(AppConfig.romsdatajson)) { - alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); - alertDialog.setTitle(getResources().getString(R.string.oops)); - alertDialog.setMessage(getResources().getString(R.string.an_error_occurred_with_the_vm_list_data)); - alertDialog.setCancelable(true); - alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.delete_all), (dialog, which) -> { - VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); - loadDataVbi(); - mdatasize(); - }); - alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), (dialog, which) -> { - - }); - alertDialog.show(); - } else { + if (VMManager.isRomsDataJsonNormal(true, MainActivity.this)) { loadDataVbi(); mdatasize(); } @@ -1426,7 +1413,11 @@ public class MainActivity extends AppCompatActivity { } public static void mdatasize2() { - linearnothinghere.setVisibility(View.VISIBLE); + if (MainActivity.data.isEmpty()) { + linearnothinghere.setVisibility(View.VISIBLE); + } else { + linearnothinghere.setVisibility(View.GONE); + } } private void checkpermissions() { diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index c240570..eb851d3 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -193,8 +193,11 @@ public class StartVM { } } - params.add("-overcommit"); - params.add("mem-lock=off"); + if (MainSettingsManager.useMemoryOvercommit(MainActivity.activity)) { + params.add("-overcommit"); + params.add("mem-lock=off"); + } + if (MainSettingsManager.useLocalTime(MainActivity.activity)) { params.add("-rtc"); diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index bdc82ce..3b9b438 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -1,14 +1,22 @@ package com.vectras.vm; +import static com.vectras.vm.VectrasApp.isFileExists; + +import android.app.Activity; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.net.Uri; import android.util.Log; +import androidx.appcompat.app.AlertDialog; + import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.MainRoms.AdapterMainRoms; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Objects; @@ -77,11 +85,11 @@ public class VMManager { public static String idGenerator() { String _result = startRamdomVMID(); - if (VectrasApp.isFileExists(AppConfig.maindirpath + "/roms/" + _result)) { + if (isFileExists(AppConfig.maindirpath + "/roms/" + _result)) { _result = startRamdomVMID(); } - if (VectrasApp.isFileExists(AppConfig.maindirpath + "/roms/" + _result)) { + if (isFileExists(AppConfig.maindirpath + "/roms/" + _result)) { _result = startRamdomVMID(); } @@ -140,7 +148,7 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { _currentVMIDToScan = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.txt").replace("\n", ""); if (!_currentVMIDToScan.isEmpty()) { if (_currentVMIDToScan.equals(pendingVMID)) { @@ -169,7 +177,7 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { _currentVMIDToScan = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.txt").replace("\n", ""); if (!_currentVMIDToScan.isEmpty()) { if (_currentVMIDToScan.equals(_vmID)) { @@ -200,7 +208,7 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { _currentVMIDToScan = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.txt").replace("\n", ""); if (!_currentVMIDToScan.isEmpty()) { if (_currentVMIDToScan.equals(pendingVMID)) { @@ -224,7 +232,7 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (!VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (!isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { if (!finalJson.contains(_filelist.get((int) (_startRepeat)))) { VectrasApp.deleteDirectory(_filelist.get((int) (_startRepeat))); } @@ -246,8 +254,8 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (!VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/rom-data.json")) { + if (!isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/rom-data.json")) { if (VectrasApp.checkJSONMapIsNormalFromString(VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"))) { if (_resulttemp.contains("}")) { _resulttemp += "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); @@ -260,7 +268,7 @@ public class VMManager { } else { _result = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); } - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { enableVMID(VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")); } else { VectrasApp.writeToFile(_filelist.get((int)(_startRepeat)), "/vmID.txt", VMManager.idGenerator()); @@ -272,7 +280,7 @@ public class VMManager { } else { _result = "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); } - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { enableVMID(VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")); } else { VectrasApp.writeToFile(_filelist.get((int)(_startRepeat)), "/vmID.txt", VMManager.idGenerator()); @@ -289,7 +297,7 @@ public class VMManager { if (_startRepeat == _filelist.size()) { if (!_result.isEmpty()) { if (VectrasApp.checkJSONIsNormalFromString("[" + _result + "]")) { - if (VectrasApp.isFileExists(AppConfig.romsdatajson)) { + if (isFileExists(AppConfig.romsdatajson)) { if (VectrasApp.checkJSONIsNormal(AppConfig.romsdatajson)) { String _JSONcontent = VectrasApp.readFile(AppConfig.romsdatajson); String _JSONcontentnew = _JSONcontent.replaceAll("]", _result + "]"); @@ -317,6 +325,77 @@ public class VMManager { } } + public static void startFixRomsDataJson() { + int _startRepeat = 0; + String _resulttemp =""; + String _result =""; + restoredVMs = 0; + ArrayList _filelist = new ArrayList<>(); + VectrasApp.listDir(AppConfig.vmFolder, _filelist); + if (!_filelist.isEmpty()) { + for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { + if (_startRepeat < _filelist.size()) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/rom-data.json")) { + if (VectrasApp.checkJSONMapIsNormalFromString(VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"))) { + if (_resulttemp.contains("}")) { + _resulttemp += "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } else { + _resulttemp = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } + if (VectrasApp.checkJSONIsNormalFromString(VectrasApp.readFile(AppConfig.maindirpath + "/roms-data.json").replaceAll("]", _resulttemp + "]"))) { + if (_result.contains("}")) { + _result += "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } else { + _result = VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } + restoredVMs++; + } else if (VectrasApp.checkJSONIsNormalFromString(VectrasApp.readFile(AppConfig.maindirpath + "/roms-data.json").replaceAll("]", "," + _resulttemp + "]"))) { + if (_result.contains("}")) { + _result += "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } else { + _result = "," + VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/rom-data.json"); + } + restoredVMs++; + } else { + Log.i("CqcmActivity", VectrasApp.readFile(AppConfig.maindirpath + "/roms-data.json").replaceAll("]", _resulttemp + "]")); + } + } + } + } + + _startRepeat++; + if (_startRepeat == _filelist.size()) { + if (!_result.isEmpty()) { + if (VectrasApp.checkJSONIsNormalFromString("[" + _result + "]")) { + if (isFileExists(AppConfig.romsdatajson)) { + if (VectrasApp.checkJSONIsNormal(AppConfig.romsdatajson)) { + String _JSONcontent = VectrasApp.readFile(AppConfig.romsdatajson); + String _JSONcontentnew = _JSONcontent.replaceAll("]", _result + "]"); + if (VectrasApp.checkJSONIsNormalFromString(_JSONcontentnew.replaceAll("u003d", "="))) { + VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", _JSONcontentnew.replaceAll("u003d", "=")); + } else { + restoredVMs = 0; + } + } else { + restoredVMs = 0; + } + } else { + VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", "[" + _result + "]"); + } + } else { + restoredVMs = 0; + } + } else { + restoredVMs = 0; + } + } + } + } + + } + } + public static void enableVMID(String _vmID) { if (_vmID.isEmpty()) return; @@ -326,7 +405,7 @@ public class VMManager { if (!_filelist.isEmpty()) { for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { if (_startRepeat < _filelist.size()) { - if (VectrasApp.isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { + if (isFileExists(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt")) { if (VectrasApp.readFile(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt").equals(_vmID)) { VectrasApp.moveAFile(_filelist.get((int)(_startRepeat)) + "/vmID.old.txt", _filelist.get((int)(_startRepeat)) + "/vmID.txt"); } @@ -337,6 +416,31 @@ public class VMManager { } } + public static void movetoRecycleBin() { + File vDir = new File(AppConfig.recyclebin); + if (!vDir.exists()) { + if (!vDir.mkdirs()) { + return; + } + } + finalJson = VectrasApp.readFile(AppConfig.romsdatajson); + if (!finalJson.isEmpty()) { + int _startRepeat = 0; + ArrayList _filelist = new ArrayList<>(); + VectrasApp.listDir(AppConfig.vmFolder, _filelist); + if (!_filelist.isEmpty()) { + for (int _repeat = 0; _repeat < (int)(_filelist.size()); _repeat++) { + if (_startRepeat < _filelist.size()) { + if (!finalJson.contains(Uri.parse(_filelist.get((int) (_startRepeat))).getLastPathSegment())) { + VectrasApp.moveAFile(_filelist.get((int) (_startRepeat)), AppConfig.recyclebin + Uri.parse(_filelist.get((int) (_startRepeat))).getLastPathSegment()); + } + } + _startRepeat++; + } + } + } + } + public static String quickScanDiskFileInFolder(String _foderpath) { if (!_foderpath.isEmpty()) { int _startRepeat = 0; @@ -397,20 +501,117 @@ public class VMManager { return false; } - public static void setArch(String _arch, Context _context) { + public static void setArch(String _arch, Activity _activity) { switch (_arch) { case "I386": - MainSettingsManager.setArch(MainActivity.activity, "I386"); + MainSettingsManager.setArch(_activity, "I386"); break; case "ARM64": - MainSettingsManager.setArch(MainActivity.activity, "ARM64"); + MainSettingsManager.setArch(_activity, "ARM64"); break; case "PPC": - MainSettingsManager.setArch(MainActivity.activity, "PPC"); + MainSettingsManager.setArch(_activity, "PPC"); break; default: - MainSettingsManager.setArch(MainActivity.activity, "X86_64"); + MainSettingsManager.setArch(_activity, "X86_64"); break; } } + + public static boolean isExecutedCommandError(String _command, String _result, Activity _activity) { + if (!_command.contains("qemu-system") || _result.contains("Killed")) + return false; + //Error code: PROOT_IS_MISSING_0 + if (_result.contains("proot\": error=2,")) { + AlertDialog alertDialog = new AlertDialog.Builder(_activity, R.style.MainDialogTheme).create(); + alertDialog.setTitle(_activity.getResources().getString(R.string.problem_has_been_detected)); + alertDialog.setMessage(_activity.getResources().getString(R.string.error_PROOT_IS_MISSING_0)); + alertDialog.setCancelable(false); + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, _activity.getResources().getString(R.string.continuetext), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + MainActivity.isActivate = false; + VectrasApp.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/data"); + VectrasApp.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/distro"); + VectrasApp.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/usr"); + Intent intent = new Intent(); + intent.setClass(_activity, SplashActivity.class); + _activity.startActivity(intent); + _activity.finish(); + } + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, _activity.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + + } + }); + alertDialog.show(); + return true; + } else if (_result.contains(") exists") && _result.contains("drive with bus")) { + //Error code: DRIVE_INDEX_0_EXISTS + VectrasApp.oneDialog(_activity.getResources().getString(R.string.problem_has_been_detected), _activity.getResources().getString(R.string.error_DRIVE_INDEX_0_EXISTS), true, false, _activity); + return true; + } else if (_result.contains("gtk initialization failed") || _result.contains("x11 not available")) { + //Error code: X11_NOT_AVAILABLE + AlertDialog alertDialog = new AlertDialog.Builder(_activity, R.style.MainDialogTheme).create(); + alertDialog.setTitle(_activity.getResources().getString(R.string.problem_has_been_detected)); + alertDialog.setMessage(_activity.getResources().getString(R.string.error_X11_NOT_AVAILABLE)); + alertDialog.setCancelable(false); + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, _activity.getResources().getString(R.string.continuetext), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + MainSettingsManager.setVmUi(_activity, "VNC"); + VectrasApp.oneDialog(_activity.getResources().getString(R.string.done), _activity.getResources().getString(R.string.switched_to_VNC), true, false, _activity); + } + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, _activity.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + + } + }); + alertDialog.show(); + return true; + } else { + return false; + } + } + + public static boolean isRomsDataJsonNormal(Boolean _needfix, Context _context) { + if (isFileExists(AppConfig.romsdatajson)) { + if (!VectrasApp.checkJSONIsNormal(AppConfig.romsdatajson)) { + if (_needfix) { + AlertDialog alertDialog = new AlertDialog.Builder(_context, R.style.MainDialogTheme).create(); + alertDialog.setTitle(_context.getResources().getString(R.string.oops)); + alertDialog.setMessage(_context.getResources().getString(R.string.need_fix_json_before_create)); + alertDialog.setCancelable(true); + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, _context.getResources().getString(R.string.continuetext), (dialog, which) -> { + VectrasApp.moveAFile(AppConfig.maindirpath + "roms-data.json", AppConfig.maindirpath + "roms-data.old.json"); + VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); + startFixRomsDataJson(); + fixRomsDataJsonResult(_context); + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, _context.getResources().getString(R.string.cancel), (dialog, which) -> { + + }); + alertDialog.show(); + + } + return false; + } else { + return true; + } + } else { + VectrasApp.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); + return true; + } + } + + public static void fixRomsDataJsonResult(Context _context) { + if (restoredVMs == 0) { + VectrasApp.oneDialogWithContext(_context.getString(R.string.done), _context.getString(R.string.roms_data_json_fixed_unsuccessfully),true, _context); + } else { + VectrasApp.oneDialogWithContext(_context.getString(R.string.done), _context.getString(R.string.roms_data_json_fixed_successfully),true, _context); + } + MainActivity.loadDataVbi(); + MainActivity.mdatasize2(); + movetoRecycleBin(); + } } diff --git a/app/src/main/java/com/vectras/vm/VectrasApp.java b/app/src/main/java/com/vectras/vm/VectrasApp.java index 1b6f2a3..8c2f550 100644 --- a/app/src/main/java/com/vectras/vm/VectrasApp.java +++ b/app/src/main/java/com/vectras/vm/VectrasApp.java @@ -718,6 +718,21 @@ public class VectrasApp extends Application { alertDialog.show(); } + public static void oneDialogWithContext(String _title, String _message, boolean _cancel, Context _context) { + AlertDialog alertDialog = new AlertDialog.Builder(_context, R.style.MainDialogTheme).create(); + alertDialog.setTitle(_title); + alertDialog.setMessage(_message); + if (!_cancel) { + alertDialog.setCancelable(false); + } + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + + } + }); + alertDialog.show(); + } + public static void prepareDataForAppConfig(Activity _activity) { AppConfig.vectrasVersion = "2.9.4"; AppConfig.vectrasWebsite = "https://vectras.vercel.app/"; @@ -741,6 +756,7 @@ public class VectrasApp extends Application { AppConfig.downloadsFolder = AppConfig.maindirpath + "Downloads/"; AppConfig.romsdatajson = AppConfig.maindirpath + "roms-data.json"; AppConfig.vmFolder = AppConfig.maindirpath + "roms/"; + AppConfig.recyclebin = AppConfig.maindirpath + "recyclebin/"; } public static PackageInfo getAppInfo(Context context) { diff --git a/app/src/main/java/com/vectras/vterm/Terminal.java b/app/src/main/java/com/vectras/vterm/Terminal.java index 24cb288..feb951a 100644 --- a/app/src/main/java/com/vectras/vterm/Terminal.java +++ b/app/src/main/java/com/vectras/vterm/Terminal.java @@ -22,6 +22,7 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; +import java.util.Objects; import com.vectras.qemu.MainSettingsManager; import com.vectras.qemu.MainVNCActivity; @@ -29,6 +30,7 @@ import com.vectras.vm.MainActivity; import com.vectras.vm.MainService; import com.vectras.vm.R; import com.vectras.vm.SplashActivity; +import com.vectras.vm.VMManager; import com.vectras.vm.VectrasApp; public class Terminal { @@ -62,59 +64,8 @@ public class Terminal { } private void showDialog(String message, Activity activity, String usercommand) { - if (!usercommand.contains("qemu-system") || message.contains("Killed")) + if (VMManager.isExecutedCommandError(usercommand, message, activity)) return; - //Error code: PROOT_IS_MISSING_0 - if (message.contains("proot\": error=2,")) { - AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); - alertDialog.setTitle(activity.getResources().getString(R.string.problem_has_been_detected)); - alertDialog.setMessage(activity.getResources().getString(R.string.error_PROOT_IS_MISSING_0)); - alertDialog.setCancelable(false); - alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, activity.getResources().getString(R.string.continuetext), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - MainActivity.isActivate = false; - VectrasApp.deleteDirectory(activity.getFilesDir().getAbsolutePath() + "/data"); - VectrasApp.deleteDirectory(activity.getFilesDir().getAbsolutePath() + "/distro"); - VectrasApp.deleteDirectory(activity.getFilesDir().getAbsolutePath() + "/usr"); - Intent intent = new Intent(); - intent.setClass(activity, SplashActivity.class); - activity.startActivity(intent); - activity.finish(); - return; - } - }); - alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, activity.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - - } - }); - alertDialog.show(); - return; - } else if (message.contains(") exists") && message.contains("drive with bus")) { - //Error code: DRIVE_INDEX_0_EXISTS - VectrasApp.oneDialog(activity.getResources().getString(R.string.problem_has_been_detected), activity.getResources().getString(R.string.error_DRIVE_INDEX_0_EXISTS), true, false, activity); - return; - } else if (message.contains("gtk initialization failed") || message.contains("x11 not available")) { - //Error code: X11_NOT_AVAILABLE - AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); - alertDialog.setTitle(activity.getResources().getString(R.string.problem_has_been_detected)); - alertDialog.setMessage(activity.getResources().getString(R.string.error_X11_NOT_AVAILABLE)); - alertDialog.setCancelable(false); - alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, activity.getResources().getString(R.string.continuetext), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - MainSettingsManager.setVmUi(activity, "VNC"); - VectrasApp.oneDialog(activity.getResources().getString(R.string.done), activity.getResources().getString(R.string.switched_to_VNC), true, false, activity); - return; - } - }); - alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, activity.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - - } - }); - alertDialog.show(); - return; - } AlertDialog dialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); dialog.setTitle("Execution Result"); @@ -144,9 +95,9 @@ public class Terminal { ProcessBuilder processBuilder = new ProcessBuilder(); // Adjust these environment variables as necessary for your app - String filesDir = context.getFilesDir().getAbsolutePath(); + String filesDir = Objects.requireNonNull(context.getFilesDir().getAbsolutePath()); - File tmpDir = new File(context.getFilesDir(), "usr/tmp"); + File tmpDir = new File(Objects.requireNonNull(context.getFilesDir()), "usr/tmp"); // Setup environment for the PRoot qemuProcess processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath()); diff --git a/app/src/main/res/drawable/memory_alt_24px.xml b/app/src/main/res/drawable/memory_alt_24px.xml new file mode 100644 index 0000000..31b3cd7 --- /dev/null +++ b/app/src/main/res/drawable/memory_alt_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 12540ad..3704280 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -312,7 +312,7 @@ نظام Android أو وحدة المعالجة المركزية على جهازك لا تدعم 64 بت، مما يعني أن VM سيكون أداؤه ضعيفًا وغير مستقر عند التشغيل. حدث خطأ في بيانات قائمة الآلات الافتراضية. هل تريد حذف الكل؟ حذف الكل - حدث خطأ في بيانات قائمة الآلات الافتراضية ولا يمكن إنشاء آلة افتراضية جديدة في هذا الوقت. لإنشاء آلة افتراضية جديدة، تحتاج إلى حذف جميع بيانات قائمة الآلات الافتراضية. هل تريد حذف الكل؟ + بيانات قائمة الأجهزة الافتراضية تالفة وتحتاج إلى الإصلاح. هل تريد أن تبدأ الإصلاحات الآن؟ تم اكتشاف مشكلة لم تقم بإضافة أي أجهزة تخزين لبدء الاستخدام أو تثبيت نظام تشغيل. هل تريد متابعة الإنشاء؟ استمر @@ -379,6 +379,9 @@ يختار استخدم BIOS/UEFI الافتراضي استخدم التوقيت المحلي + تم إصلاح المشكلة بنجاح. ولكن قد تختفي بعض الأجهزة الافتراضية ويتم نقلها إلى مجلد سلة المحذوفات. + فشلت عملية الإصلاح ولم تعد كل الأجهزة الافتراضية الخاصة بك تظهر في قائمة الأجهزة الافتراضية. لقد تم نقلها إلى مجلد سلة المحذوفات. + استخدم ذاكرة overcommit Vterm diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 308f0ea..57c4c75 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ Vectras VM - v2.9.4 (Genoise) + v2.9.4 (Honey Cake) Stable Home Logger @@ -314,7 +314,7 @@ The Android OS or CPU on your device does not support 64 bit, which means the VM will have poor performance and be unstable when running. An error occurred with the virtual machine list data. Do you want to delete all? Delete all - An error occurred with the virtual machine list data and a new virtual machine cannot be created at this time. To create a new virtual machine, you need to delete all virtual machine list data. Do you want to delete all? + The virtual machine list data is corrupted and needs to be repaired. Do you want to start repairing now? Problem has been detected You have not added any storage devices to start using or install an operating system. Do you want to continue creating? Continue @@ -381,6 +381,9 @@ Select Use default BIOS/UEFI Use local time + Fixed successfully. But some virtual machines may disappear and they were moved to the Recycle bin folder. + The fix fails and all your virtual machines no longer appear in the virtual machine list. They were moved to the Recycle bin folder. + Use memory overcommit diff --git a/app/src/main/res/xml/qemu.xml b/app/src/main/res/xml/qemu.xml index 9692d43..33f15fe 100644 --- a/app/src/main/res/xml/qemu.xml +++ b/app/src/main/res/xml/qemu.xml @@ -93,6 +93,13 @@ android:key="useDefaultBios" android:title="@string/use_default_bios_uefi" app:icon="@drawable/hard_disk_24px" /> + v2.9.4
  • Now you can change locale in app settings.
  • Now you can access x11 settings.
  • New button to set full screen in x11 display.
  • Enhanced UI.
  • Chinese language by @adk23333


New updates are live!", From 532a8a6eec93c624ab298f832dde240b2eb89475 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 16 Dec 2024 14:43:29 +0700 Subject: [PATCH 2/3] Update vroms-store.json --- web/data/vroms-store.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index 6c1b325..f46355c 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -67,7 +67,7 @@ { "rom_name":"PonyOS", "rom_icon":"https://ponyos.org/assets/img/logo-new.png", - "rom_url":"https://www.mediafire.com/file/fzcjieuuw8uxb2m/PonyOS.cvbi/file", + "rom_url":"https://archive.org/download/blackberry-os/PonyOS.cvbi", "rom_path":"PonyOS.cvbi", "rom_avail":true, "rom_size":"6MB", From f1791a886eccde9c9727f7b30d6e294b2e582e36 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:04:01 +0700 Subject: [PATCH 3/3] Update vroms-store.json --- web/data/vroms-store.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index f46355c..9c492c6 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -80,7 +80,7 @@ { "rom_name":"BSDeviant", "rom_icon":"https://archiveos.org/wp-content/uploads/2019/03/bsdeviant.webp", - "rom_url":"https://www.mediafire.com/file/y6u4cg0t435scbf/BSDeviant.cvbi/file", + "rom_url":"https://archive.org/download/blackberry-os/BSDeviant.cvbi", "rom_path":"BSDeviant.cvbi", "rom_avail":true, "rom_size":"81MB", @@ -106,7 +106,7 @@ { "rom_name":"Anonym.OS", "rom_icon":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQlezHOdq-S2UjgmEoIcVxBA4jlDO6bPGsLA&usqp=CAU", - "rom_url":"https://www.mediafire.com/file/laparebxxunsztk/Anonym.OS.cvbi/file", + "rom_url":"https://archive.org/download/blackberry-os/Anonym.OS.cvbi", "rom_path":"Anonym.OS.cvbi", "rom_avail":true, "rom_size":"196MB", @@ -145,7 +145,7 @@ { "rom_name":"Android 3.2", "rom_icon":"https://static.wikia.nocookie.net/android/images/d/d2/Honeycomb-logo2-e1298681115525.png/revision/latest?cb=20111216204245", - "rom_url":"https://www.mediafire.com/file/4rj9x99jmog6u4d/Android_3.2.cvbi/file", + "rom_url":"https://archive.org/download/blackberry-os/Android%203.2.cvbi", "rom_path":"Android 3.2.cvbi", "rom_avail":true, "rom_size":"180MB",