diff --git a/ADVANCED.md b/ADVANCED.md index eab4adc..91bc4c4 100644 --- a/ADVANCED.md +++ b/ADVANCED.md @@ -33,10 +33,15 @@ QEMU 11.0.0 (for Vectras VM 4.0.8+): - [See more at the Internet Archive](https://archive.org/details/qemu-11-0-0-for-vectras-vm-nbab) QEMU 9.2.4 - 3dfx (only for Vectras VM 3.5.0): -- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-nosve-vectras-vm-arm64-v8a.tar.gz) -- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-vectras-vm-x86_64.tar.gz) +- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-9.2.2-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz) +- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-9.2.2-3dfx-july-2026-vectras-vm-x86_64.tar.gz) - [See them at the Internet Archive](https://archive.org/details/qemu-9-2-4-3dfx-for-vectras-vm-nbab) +QEMU 9.2.2 - 3dfx (recommended and for Vectras VM 4.4.7+): +- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.1/base-genegic-nosve-vectras-vm-arm64-v8a.tar.gz) +- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.1/base-generic-vectras-vm-x86_64.tar.gz) +- [See them at the Internet Archive](https://archive.org/details/qemu-9-2-2-3dfx-for-vectras-vm-nbab) + QEMU 9.2.2 - 3dfx (recommended and for Vectras VM 4.1.1+): - [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.1.1/base-may-2026-vectras-vm-arm64-v8a.tar.gz) - [See them at the Internet Archive](https://archive.org/details/qemu-9-2-2-3dfx-for-vectras-vm-nbab) @@ -59,6 +64,14 @@ QEMU 8.2.0 - 3dfx (only for Vectras VM 2.9.5): - [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.2.9/vectras-vm-x86_64.tar.gz) - [See them at the Internet Archive](https://archive.org/details/vectras-vm-x86_64.tar_202603nbab) +QEMU 7.2.22 - 3dfx (for Vectras VM 4.4.7+): +- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz) +- [For Android ARM (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-armeabi-v7a.tar.gz) +- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-x86_64.tar.gz) +- [For Android x86 (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-x86.tar.gz) +- [See more at the Internet Archive (64-bit)](https://archive.org/details/qemu-7-2-22-for-vectras-vm-nbab) +- [See more at the Internet Archive (32-bit)](https://archive.org/details/qemu-7-2-22-for-vectras-vm-nbab0) + QEMU 7.2.22 - 3dfx (for Vectras VM 4.2.2+): - [For Android ARM (64-bit)](https://archive.org/download/qemu-7-2-22-for-vectras-vm-nbab/base-june-2026-vectras-vm-arm64-v8a.tar.gz) - [See more at the Internet Archive](https://archive.org/details/qemu-7-2-22-for-vectras-vm-nbab) diff --git a/README.md b/README.md index f695562..8cc2856 100644 --- a/README.md +++ b/README.md @@ -77,12 +77,12 @@ We publish a **new beta release after every commit** — so you can always test [![Download Beta](https://img.shields.io/badge/Download-Beta-blue?style=for-the-badge&logo=github)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases) ### ⚙️ Bootstraps -QEMU 9.2.2 - 3dfx is here! +QEMU 7.2.22 - 3dfx is here! -- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.1.1/base-may-2026-vectras-vm-arm64-v8a.tar.gz) -- [For Android ARM (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.4/base-vectras-vm-armeabi-v7a.tar.gz) -- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.1/base-generic-vectras-vm-x86_64.tar.gz) -- [For Android x86 (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.4/base-vectras-vm-x86.tar.gz) +- [For Android ARM (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz) +- [For Android ARM (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-armeabi-v7a.tar.gz) +- [For Android x86 (64-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-x86_64.tar.gz) +- [For Android x86 (32-bit)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-x86.tar.gz) ### 💽 3Dfx Wrappers Play classic games with 3Dfx support on Windows 95, 98, ME, 2000, and XP! Turnip & Zink will help improve performance if your device has a supported Adreno GPU. Note: It may be unstable and have low performance. diff --git a/app/build.gradle b/app/build.gradle index 336824f..fab6ad2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 153 - versionName "4.4.6" + versionCode 154 + versionName "4.4.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/assets/roms/battery.asl b/app/src/main/assets/asl/battery.asl similarity index 100% rename from app/src/main/assets/roms/battery.asl rename to app/src/main/assets/asl/battery.asl diff --git a/app/src/main/assets/roms/wifi.asl b/app/src/main/assets/asl/wifi.asl similarity index 100% rename from app/src/main/assets/roms/wifi.asl rename to app/src/main/assets/asl/wifi.asl diff --git a/app/src/main/assets/roms/3dfx-wrappers.iso b/app/src/main/assets/driver/3dfx-wrappers-i686.iso similarity index 100% rename from app/src/main/assets/roms/3dfx-wrappers.iso rename to app/src/main/assets/driver/3dfx-wrappers-i686.iso diff --git a/app/src/main/assets/roms/QEMU_EFI.img b/app/src/main/assets/firmware/QEMU_EFI.img similarity index 100% rename from app/src/main/assets/roms/QEMU_EFI.img rename to app/src/main/assets/firmware/QEMU_EFI.img diff --git a/app/src/main/assets/roms/QEMU_VARS.img b/app/src/main/assets/firmware/QEMU_VARS.img similarity index 100% rename from app/src/main/assets/roms/QEMU_VARS.img rename to app/src/main/assets/firmware/QEMU_VARS.img diff --git a/app/src/main/assets/roms/bios-vectras.bin b/app/src/main/assets/firmware/bios-vectras.bin similarity index 100% rename from app/src/main/assets/roms/bios-vectras.bin rename to app/src/main/assets/firmware/bios-vectras.bin diff --git a/app/src/main/assets/roms/RELEASEX64_OVMF.fd b/app/src/main/assets/firmware/edk2-i386-code.fd similarity index 61% rename from app/src/main/assets/roms/RELEASEX64_OVMF.fd rename to app/src/main/assets/firmware/edk2-i386-code.fd index d22484b..016b8b3 100644 Binary files a/app/src/main/assets/roms/RELEASEX64_OVMF.fd and b/app/src/main/assets/firmware/edk2-i386-code.fd differ diff --git a/app/src/main/assets/roms/RELEASEX64_OVMF_VARS.fd b/app/src/main/assets/firmware/edk2-i386-vars.fd similarity index 100% rename from app/src/main/assets/roms/RELEASEX64_OVMF_VARS.fd rename to app/src/main/assets/firmware/edk2-i386-vars.fd diff --git a/app/src/main/assets/firmware/edk2-x86_64-code.fd b/app/src/main/assets/firmware/edk2-x86_64-code.fd new file mode 100644 index 0000000..f030500 Binary files /dev/null and b/app/src/main/assets/firmware/edk2-x86_64-code.fd differ diff --git a/app/src/main/assets/firmware/edk2-x86_64-vars.fd b/app/src/main/assets/firmware/edk2-x86_64-vars.fd new file mode 100644 index 0000000..efb4f46 Binary files /dev/null and b/app/src/main/assets/firmware/edk2-x86_64-vars.fd differ diff --git a/app/src/main/java/com/vectras/vm/AppConfig.java b/app/src/main/java/com/vectras/vm/AppConfig.java index c34c60e..b20378a 100644 --- a/app/src/main/java/com/vectras/vm/AppConfig.java +++ b/app/src/main/java/com/vectras/vm/AppConfig.java @@ -18,11 +18,11 @@ public class AppConfig { // App Config public static String vectrasVersion; public static int vectrasVersionCode; - public static final int standardSetupVersion = 922202606; + public static final int standardSetupVersion = 922202607; public static final int coreSetupVersion = 0; public static String vectrasWebsite = "https://vectras.vercel.app/"; public static String vectrasWebsiteRaw = "https://raw.githubusercontent.com/AnBui2004/Vectras-VM-Emu-Android/refs/heads/master/web/"; - public static String bootstrapfileslink = vectrasWebsiteRaw + "/data/setupfiles3.json"; + public static String bootstrapfileslink = vectrasWebsiteRaw + "/data/setupfiles4.json"; public static String vectrasHelp = vectrasWebsite + "how.html"; public static String community = vectrasWebsite + "community.html"; public static String vectrasRaw = vectrasWebsiteRaw + "data/"; diff --git a/app/src/main/java/com/vectras/vm/ExportRomActivity.java b/app/src/main/java/com/vectras/vm/ExportRomActivity.java index 38171aa..12b0588 100644 --- a/app/src/main/java/com/vectras/vm/ExportRomActivity.java +++ b/app/src/main/java/com/vectras/vm/ExportRomActivity.java @@ -208,6 +208,8 @@ public class ExportRomActivity extends AppCompatActivity { vmConfigMap.put("wifi", current.wifi); + vmConfigMap.put("soundCard", current.soundCard); + vmConfigMap.put("bootFrom", current.bootFrom); vmConfigMap.put("isShowBootMenu", current.isShowBootMenu); vmConfigMap.put("isUseLocalTime", current.isUseLocalTime); diff --git a/app/src/main/java/com/vectras/vm/MainService.java b/app/src/main/java/com/vectras/vm/MainService.java index d35e940..079a3ce 100644 --- a/app/src/main/java/com/vectras/vm/MainService.java +++ b/app/src/main/java/com/vectras/vm/MainService.java @@ -18,6 +18,7 @@ import androidx.core.app.NotificationCompat; import com.vectras.vm.main.core.MainStartVM; import com.vectras.vm.manager.VmServiceManager; +import com.vectras.vm.settings.SettingsData; import com.vectras.vm.utils.ClipboardUltils; import com.vectras.vm.utils.DialogUtils; import com.vectras.vterm.Terminal2; @@ -132,6 +133,8 @@ public class MainService extends Service { MainStartVM.dismissDialog(); if (!VMManager.isExecutedCommandError(command, log, context)) { + if (!SettingsData.alwaysShowLog(context) && status == terminal2.SUCCESS) return; + String finalLog = log.contains(MainStartVM.TAG_FINISHED_WITHOUT_ERROR) ? log.substring(0, log.lastIndexOf(MainStartVM.TAG_FINISHED_WITHOUT_ERROR) - 1) : log; DialogUtils.twoDialog(context, vmName, finalLog, context.getString(R.string.copy), context.getString(R.string.close), true, R.drawable.stack_24px, true, diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index 4677d45..7aaa7ad 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -66,7 +66,7 @@ public class StartVM { if ( vmConfigs.nvirt && !MainSettingsManager.getArch(activity).equals(MainSettingsManager.PPC_ARCH) && - MainSettingsManager.getArch(activity).equals(MainSettingsManager.ARM64_ARCH) + MainSettingsManager.getArch(activity).equals(MainSettingsManager.ARM64_ARCH) ) { machineParams += ",virtualization=true"; } @@ -129,23 +129,43 @@ public class StartVM { } } - if (!memoryParams.isEmpty()) memoryParams += " "; - String networkParams = ""; String network = Objects.requireNonNull(VMCreatorSelector.getNetworkCard(activity, vmData.networkCard).get("value")).toString(); if (!network.isEmpty()) { - networkParams = " -device " + network + ",netdev=net0 -netdev user,id=net0"; + String netDevId = "netdev" + System.currentTimeMillis(); + + networkParams = " -device " + network + ",netdev=" + netDevId + " -netdev user,id=" + netDevId; + } + + String soundParams = ""; + String sound = Objects.requireNonNull(VMCreatorSelector.getSoundCard(activity, vmData.soundCard).get("value")).toString(); + if (!sound.isEmpty()) { + String audioDevId = "audiodev" + System.currentTimeMillis(); + + soundParams = " -device " + + sound + + ( + sound.contains("intel-hda") ? + " -device hda-duplex" : + "" + ) + + ",audiodev=" + + audioDevId + + " -audiodev wav,id=" + + audioDevId + + ",out.frequency=48000,path=" + + VmFileManager.getAudioRaw(VectrasApp.getContext(), vmConfigs.vmID); } String bootFromParams = Objects.requireNonNull(VMCreatorSelector.getBootFrom(activity, vmData.bootFrom).get("value")).toString(); String showBootMenuParams = vmData.isShowBootMenu ? "menu=on" : ""; String bootParams = ""; if (!bootFromParams.isEmpty() || !showBootMenuParams.isEmpty()) { - bootParams = "-boot " + bootFromParams + (!bootFromParams.isEmpty() && !showBootMenuParams.isEmpty() ? "," : "") + showBootMenuParams + " "; + bootParams = " -boot " + bootFromParams + (!bootFromParams.isEmpty() && !showBootMenuParams.isEmpty() ? "," : "") + showBootMenuParams + " "; } - extraParams = machineParams + cpuParams + memoryParams + bootParams + networkParams + " " + extraParams; + extraParams = machineParams + cpuParams + memoryParams + bootParams + networkParams + soundParams + " " + extraParams; return env(activity, extraParams, vmData.itemPath, false); } @@ -204,21 +224,10 @@ public class StartVM { } if (!vmConfigs.hd1.isEmpty()) { - if (ifType.isEmpty()) { - hdd0 = "-hdb"; - hdd0 += " '" + vmConfigs.hd1 + "'"; - } else { - hdd0 = "-drive"; - hdd0 += " media=disk"; - hdd0 += ",if=" + ifType; - hdd0 += ",file='" + vmConfigs.hd1 + "'"; + hdd0 = "-drive"; + hdd0 += " media=disk"; + hdd0 += ",file='" + vmConfigs.hd1 + "'"; - if ((MainSettingsManager.getArch(activity).equals("ARM64") && ifType.equals("ide")) || MainSettingsManager.getArch(activity).equals("PPC")) { - hdd0 = "-drive"; - hdd0 += " media=disk"; - hdd0 += ",file='" + vmConfigs.hd1 + "'"; - } - } params.add(hdd0); } @@ -255,14 +264,9 @@ public class StartVM { cdromParams += " -drive"; cdromParams += " if=none,id=cdromdrive1,format=raw,media=cdrom,file='" + vmConfigs.cdrom1 + "'"; } else { - if (vmConfigs.imgCdrom.isEmpty() && !extras.contains("-cdrom ")) { - cdromParams = "-cdrom"; - cdromParams += " '" + vmConfigs.cdrom1 + "'"; - } else { - cdromParams = "-drive"; - cdromParams += " media=cdromdrive1"; - cdromParams += ",file='" + vmConfigs.cdrom1 + "'"; - } + cdromParams = "-drive"; + cdromParams += " media=cdromdrive1"; + cdromParams += ",file='" + vmConfigs.cdrom1 + "'"; } params.add(cdromParams); } @@ -270,44 +274,19 @@ public class StartVM { File hdd1File = new File(filesDir + "/data/Vectras/hdd1.qcow2"); if (hdd1File.exists()) { - if (ifType.isEmpty()) { - hdd1 = "-hdb"; - hdd1 += " '" + hdd1File.getPath() + "'"; - } else { - hdd1 = "-drive"; - hdd1 += " media=disk"; - hdd1 += ",if=" + ifType; - hdd1 += ",file='" + hdd1File.getPath() + "'"; - } + hdd1 = "-drive"; + hdd1 += " media=disk"; + hdd1 += ",file='" + hdd1File.getPath() + "'"; params.add(hdd1); } if (!vmConfigs.fda.isEmpty() && !MainSettingsManager.getArch(activity).equals("ARM64")) { - if (extras.contains("-fda ")) { - params.add("-drive if=floppy,file='" + vmConfigs.fda + "'"); - } else { - params.add("-fda"); - params.add("'" + vmConfigs.fda + "'"); - } + params.add("-drive if=floppy,file='" + vmConfigs.fda + "'"); } if (!vmConfigs.fdb.isEmpty() && !MainSettingsManager.getArch(activity).equals("ARM64")) { - if (vmConfigs.fda.isEmpty()) { - if (extras.contains("-fda ")) { - params.add("-drive if=floppy,file='" + vmConfigs.fdb + "'"); - } else { - params.add("-fda"); - params.add("'" + vmConfigs.fdb + "'"); - } - } else { - if (extras.contains("-fdb ")) { - params.add("-drive if=floppy,file='" + vmConfigs.fdb + "'"); - } else { - params.add("-fdb"); - params.add("'" + vmConfigs.fdb + "'"); - } - } + params.add("-drive if=floppy,file='" + vmConfigs.fdb + "'"); } if (vmConfigs.sharedFolder) { @@ -317,90 +296,43 @@ public class StartVM { params.add(driveParams); } -// String boot = "-boot "; -// if (extras.contains(".iso ")) { -// -// boot += MainSettingsManager.getBoot(activity); -// } else { -// boot += "c"; -// } - - //String soundDevice = "-audiodev pa,id=pa -device AC97,audiodev=pa"; - - //params.add(soundDevice); - if (vmConfigs.isUseDefaultBios) { + extractFirmware(activity); + if (MainSettingsManager.getArch(activity).equals("PPC")) { bios = "-L "; bios += "pc-bios"; } else if (MainSettingsManager.getArch(activity).equals("ARM64")) { + if (!FileUtils.isFileExists(VmFileManager.getPath(vmConfigs.vmID, "QEMU_VARS.img"))) + FileUtils.copyFile(AppConfig.basefiledir + "QEMU_VARS.img", VmFileManager.getPath(vmConfigs.vmID)); + bios = "-drive "; bios += "file=" + AppConfig.basefiledir + "QEMU_EFI.img,format=raw,readonly=on,if=pflash"; bios += " -drive "; - bios += "file=" + AppConfig.basefiledir + "QEMU_VARS.img,format=raw,if=pflash"; + bios += "file=" + VmFileManager.getPath(vmConfigs.vmID, "QEMU_VARS.img") + ",format=raw,if=pflash"; } else if (vmConfigs.isUseUefi) { + String codeFile = "edk2-" + MainSettingsManager.getArch(activity).toLowerCase() + "-code.fd"; + String varsFile = "edk2-" + MainSettingsManager.getArch(activity).toLowerCase() + "-vars.fd"; + + if (!FileUtils.isFileExists(VmFileManager.getPath(vmConfigs.vmID, varsFile))) + FileUtils.copyFile(AppConfig.basefiledir + varsFile, VmFileManager.getPath(vmConfigs.vmID)); + bios = "-drive "; - bios += "file=" + AppConfig.basefiledir + "RELEASEX64_OVMF.fd,format=raw,readonly=on,if=pflash"; + bios += "file=" + AppConfig.basefiledir + codeFile + ",format=raw,readonly=on,if=pflash"; bios += " -drive "; - bios += "file=" + AppConfig.basefiledir + "RELEASEX64_OVMF_VARS.fd,format=raw,if=pflash"; + bios += "file=" + VmFileManager.getPath(vmConfigs.vmID, varsFile) + ",format=raw,if=pflash"; } else { bios = "-bios "; bios += AppConfig.basefiledir + "bios-vectras.bin"; } - - extractFirmware(activity); } -// String machine = "-M "; -// if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) { -// machine += "pc"; -// params.add(machine); -// } else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) { -// machine += "virt"; -// params.add(machine); -// } - - // This is the default in Qemu, so no need to set it. -// if (MainSettingsManager.useMemoryOvercommit(activity)) { -// params.add("-overcommit"); -// params.add("mem-lock=off"); -// } - - if (vmConfigs.isUseLocalTime) { params.add("-rtc"); params.add("base=localtime"); } - //if (!MainSettingsManager.getArch(activity).equals("PPC")) { - //params.add("-nodefaults"); - //} - - //if (!Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) { params.add(bios); - //} - -// params.add(boot); - -// if (!ParamManager.hasMemory(extras)) { -// String memoryStr = "-m "; -// if (MainSettingsManager.getArch(activity).equals("PPC") && RamInfo.vectrasMemory(activity) > 2048) { -// memoryStr += 2048; -// } else { -// memoryStr += RamInfo.vectrasMemory(activity); -// } -// params.add(memoryStr); -// } - - if (ifType.isEmpty()) { - if (extras.contains("-drive media=cdrom,file=")) { - finalextra = extras.replace("-drive media=cdrom,file=", "-cdrom "); - } - } else { - if (extras.contains("-cdrom ")) { - finalextra = extras.replace("-cdrom ", "-drive media=cdrom,file="); - } - } } params.add(finalextra); diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index 1227cf7..d8ea0bb 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -705,16 +705,16 @@ public class VMManager { }, null, null); isQemuStopedWithError = true; -// } else if (_result.contains("Couldn't connect to XServer")) { -// if (isTryAgain) { -// DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.x11_display_cannot_be_used_at_this_time_content) + "\n\n" + _result, R.drawable.cast_warning_24px); -// _activity.stopService(new Intent(_activity, MainService.class)); -// isQemuStopedWithError = true; -// isTryAgain = false; -// } else { -// MainStartVM.startTryAgain(_activity); -// isTryAgain = true; -// } + } else if (_result.contains("Couldn't connect to XServer")) { + if (isTryAgain) { + DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.x11_display_cannot_be_used_at_this_time_content) + "\n\n" + _result, R.drawable.cast_warning_24px); + _activity.stopService(new Intent(_activity, MainService.class)); + isQemuStopedWithError = true; + isTryAgain = false; + } else { + MainStartVM.startTryAgain(_activity); + isTryAgain = true; + } } else if (_result.contains("No such file or directory")) { //Error code: NO_SUCH_FILE_OR_DIRECTORY DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.error_NO_SUCH_FILE_OR_DIRECTORY) + "\n\n" + _result, R.drawable.file_copy_24px); @@ -1176,7 +1176,7 @@ public class VMManager { } public static String addAudioDevWav(String vmID, String env) { - final String audioDevParam = ",audiodev=snd0 -audiodev wav,id=snd0,out.frequency=48000,path=" + VmFileManager.getAudioRaw(VectrasApp.getContext(), vmID); + final String audioDevParam = ",audiodev=audiodev" + System.currentTimeMillis() + " -audiodev wav,id=audiodev" + System.currentTimeMillis() + ",out.frequency=48000,path=" + VmFileManager.getAudioRaw(VectrasApp.getContext(), vmID); String result = env; if (env.startsWith("-device hda-duplex ") || env.contains(" -device hda-duplex ") || env.endsWith(" -device hda-duplex")) { result = result.replaceFirst(" -device hda-duplex", " -device hda-duplex" + audioDevParam); diff --git a/app/src/main/java/com/vectras/vm/adapter/LogsAdapter.java b/app/src/main/java/com/vectras/vm/adapter/LogsAdapter.java index ac57c30..253de75 100644 --- a/app/src/main/java/com/vectras/vm/adapter/LogsAdapter.java +++ b/app/src/main/java/com/vectras/vm/adapter/LogsAdapter.java @@ -143,7 +143,7 @@ public class LogsAdapter extends RecyclerView.Adapter LogItem logItem = currentLevelEntries.get(position); String msg = logItem.getString(mContext); String time = getTime(logItem, mTimeFormat); - text = (!time.isEmpty() ? String.format("[%s] ", time) : "") + msg; + text = (!time.isEmpty() ? String.format("%s | ", time) : "") + msg; if (forceLightText) viewHolder.textLog.setTextColor(android.graphics.Color.WHITE); viewHolder.textLog.setText(Html.fromHtml(text)); } catch (Exception e) { diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index 512e6bb..b0aacc4 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -33,6 +33,7 @@ import com.vectras.vm.creator.configs.ListManager; import com.vectras.vm.creator.editor.AdvancedConfigsDialog; import com.vectras.vm.creator.editor.BoardConfigsDialog; import com.vectras.vm.creator.editor.NetworkConfigsDialog; +import com.vectras.vm.creator.editor.SoundConfigsDialog; import com.vectras.vm.creator.utils.CreatorUtils; import com.vectras.vm.creator.editor.FirmwareConfigsDialog; import com.vectras.vm.creator.editor.StorageConfigsDialog; @@ -235,6 +236,15 @@ public class VMCreatorActivity extends AppCompatActivity { dialog.show(getSupportFragmentManager(), "network_configs_dialog"); }); + binding.lnSound.setOnClickListener(v -> { + save(); + + SoundConfigsDialog dialog = new SoundConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "sound_configs_dialog"); + }); + binding.lnAdvanced.setOnClickListener(v -> { save(); @@ -473,7 +483,7 @@ public class VMCreatorActivity extends AppCompatActivity { } ArrayList> listCpuCores = ListManager.cores(MainSettingsManager.getArch(this)); - if (current.cores > listCpuCores.size() - 1) + if (current.cores >= listCpuCores.size()) current.cores = listCpuCores.size() - 1; if (current.itemIcon != null && !current.itemIcon.isEmpty()) { @@ -527,16 +537,22 @@ public class VMCreatorActivity extends AppCompatActivity { String currentArch = MainSettingsManager.getArch(this); - if (currentArch.equals(MainSettingsManager.X86_64_ARCH)) { - current.cores = Math.min(1, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); - } else if (currentArch.equals(MainSettingsManager.ARM64_ARCH)) { - current.cores = Math.min(2, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); - current.nvirt = true; + switch (currentArch) { + case MainSettingsManager.X86_64_ARCH -> + current.cores = Math.min(1, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); + case MainSettingsManager.ARM64_ARCH -> { + current.cores = Math.min(2, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); + current.nvirt = true; + } + case MainSettingsManager.PPC_ARCH -> current.cores = 0; } current.memory = 512; current.networkCard = 3; // Intel E1000 (82540EM) + + // ENSONIQ AudioPCI ES1370 : Intel HD Audio Controller (ich6) + current.soundCard = currentArch.equals(MainSettingsManager.PPC_ARCH) ? 5 : 2; } private void checkVMID() { diff --git a/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java index 948cc9a..430aebf 100644 --- a/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java +++ b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java @@ -251,4 +251,17 @@ public class ListManager { UniversalPickerDialog.putToList(list, 8192); return list; } + + public static ArrayList> soundCards(Context context) { + ArrayList> list = new ArrayList<>(); + UniversalPickerDialog.putToList(list, context.getString(R.string.none), ""); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_hd_audio_controller_ich9), "ich9-intel-hda"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_hd_audio_controller_ich6), "intel-hda"); + UniversalPickerDialog.putToList(list, context.getString(R.string.crystal_semiconductor_cs4231a), "cs4231a"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_82801aa_ac97_audio), "ac97"); + UniversalPickerDialog.putToList(list, context.getString(R.string.ensoniq_audiopci_es1370), "ES1370"); + UniversalPickerDialog.putToList(list, context.getString(R.string.creative_sound_blaster_16), "sb16"); + UniversalPickerDialog.putToList(list, context.getString(R.string.yamaha_ym3812_opl2), "adlib"); + return list; + } } diff --git a/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java index d4fe809..540e54a 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java @@ -104,7 +104,7 @@ public class FirmwareConfigsDialog extends BottomSheetDialogFragment { binding.cbvUselocaltime.setOnCheckedChangeListener((v, isChecked) -> configs.isUseLocalTime = isChecked); - if (!MainSettingsManager.getArch(requireContext()).equals("X86_64")) { + if (!MainSettingsManager.getArch(requireContext()).equals(MainSettingsManager.X86_64_ARCH) && !MainSettingsManager.getArch(requireContext()).equals(MainSettingsManager.I386_ARCH)) { binding.cbvUseuefi.setVisibility(View.GONE); binding.cbvUseDefaultBios.setBackground(AppCompatResources.getDrawable(requireContext(), R.drawable.object_shape_single_high)); } else { diff --git a/app/src/main/java/com/vectras/vm/creator/editor/SoundConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/SoundConfigsDialog.java new file mode 100644 index 0000000..c2fe445 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/SoundConfigsDialog.java @@ -0,0 +1,113 @@ +package com.vectras.vm.creator.editor; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.vm.R; +import com.vectras.vm.creator.utils.EditorUtils; +import com.vectras.vm.creator.utils.VMCreatorSelector; +import com.vectras.vm.databinding.CreatorNetworkDialogBinding; +import com.vectras.vm.databinding.CreatorSoundDialogBinding; +import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.DialogUtils; + +import java.util.Objects; + +public class SoundConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "SoundConfigsDialog"; + + String vmId; + DataMainRoms configs; + + boolean isSave = true; + + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + } + } + + CreatorSoundDialogBinding binding; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + if (savedInstanceState == null) DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + + binding = CreatorSoundDialogBinding.inflate(getLayoutInflater()); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + NetworkConfigsDialogCallback callback; + + public void setOnDismiss(NetworkConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface NetworkConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null && isSave) { + save(); + callback.onDismiss(configs); + } + } + + // Auto save. + public void onPause() { + super.onPause(); + if (callback != null && isSave) { + save(); + callback.onDismiss(configs); + } + } + + private void initialize() { + if (!isAdded()) return; + + binding.sbvCardType.setOnClickListener(v -> VMCreatorSelector.soundCard(requireActivity(), configs.soundCard, ((position, name, value) -> { + configs.soundCard = position; + binding.sbvCardType.setSubtitle(name); + }))); + + load(); + } + + private void load() { + if (!isAdded()) return; + + binding.sbvCardType.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getSoundCard(requireActivity(), configs.soundCard).get("name")).toString()); + } + + private void save() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java b/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java index c338262..e4afd75 100644 --- a/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java +++ b/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java @@ -55,13 +55,21 @@ public class VMCreatorSelector { } public static void networkCard(Activity activity, int position, UniversalPickerDialog.UniversalPickerDialogCallback callback) { - showDialog(activity, ListManager.networkCards(activity), position, callback, activity.getString(R.string.network_card)); + showDialog(activity, ListManager.networkCards(activity), position, callback, activity.getString(R.string.cards)); } public static HashMap getNetworkCard(Context context, int position) { return ListManager.networkCards(context).get(position); } + public static void soundCard(Activity activity, int position, UniversalPickerDialog.UniversalPickerDialogCallback callback) { + showDialog(activity, ListManager.soundCards(activity), position, callback, activity.getString(R.string.cards)); + } + + public static HashMap getSoundCard(Context context, int position) { + return ListManager.soundCards(context).get(position); + } + public static HashMap getBootFrom(Context context, int position) { return ListManager.bootFrom(context).get(position); } diff --git a/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java b/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java index c290d35..11398f3 100644 --- a/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java +++ b/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java @@ -291,7 +291,7 @@ public class FilePickerDialog extends DialogFragment { case ".conf", ".ini" -> CONFIG_FILE; case ".zip", ".7z", ".rar" -> ZIP_FILE; case ".java", ".kt", ".js", ".py", ".c", ".cpp", ".h", ".xml", ".html", ".css", ".lua", ".go", ".asl" -> DEV_FILE; - case ".dll" -> SYSTEM_FILE; + case ".dll", ".fd" -> SYSTEM_FILE; case ".deb", ".rpm" -> PACKAGE_FILE; case ".ttf", ".otf" -> FONT_FILE; case ".jks" -> KEY_FILE; diff --git a/app/src/main/java/com/vectras/vm/main/MainActivity.java b/app/src/main/java/com/vectras/vm/main/MainActivity.java index 98a0486..072bea3 100644 --- a/app/src/main/java/com/vectras/vm/main/MainActivity.java +++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java @@ -535,8 +535,8 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment. startActivity(intent); } else if (id == R.id.navigation_qemu_doc) { Intent intent = new Intent(); - if (FileUtils.isFileExists(getFilesDir().getPath() + "/distro/usr/local/share/qemu/doc/index.html")) { - intent.putExtra("url", "file://" + getFilesDir().getPath() + "/distro/usr/local/share/qemu/doc/index.html"); + if (FileUtils.isFileExists(getFilesDir().getPath() + "/distro/usr/local/share/doc/qemu/index.html")) { + intent.putExtra("url", "file://" + getFilesDir().getPath() + "/distro/usr/local/share/doc/qemu/index.html"); intent.setClass(this, WebViewActivity.class); } else { intent.setAction(ACTION_VIEW); diff --git a/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java index ecbed76..2a17952 100644 --- a/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java +++ b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java @@ -17,6 +17,7 @@ import com.vectras.vm.R; import com.vectras.vm.VectrasApp; import com.vectras.vm.core.ShellExecutor; import com.vectras.vm.core.TermuxX11; +import com.vectras.vm.main.MainActivity; import com.vectras.vm.setupwizard.SetupFeatureCore; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; @@ -118,12 +119,12 @@ public class DisplaySystem { null ); } else { - if (!isUseBuiltInX11() ) { - if (!PackageUtils.isInstalled("com.termux.x11", context)) { - DialogUtils.needInstallTermuxX11(context); - return; - } + if (!PackageUtils.isInstalled("com.termux.x11", context)) { + DialogUtils.needInstallTermuxX11(context); + return; + } + if (!isUseBuiltInX11()) { Log.d(TAG, "launchX11: Opened: com.termux.x11.MainActivity."); Intent intent = new Intent(); intent.setClassName("com.termux.x11", "com.termux.x11.MainActivity"); @@ -133,7 +134,10 @@ public class DisplaySystem { startTermuxX11(context); } else { - context.startActivity(new Intent(context, X11Activity.class)); + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + intent.setClass(context, X11Activity.class); + context.startActivity(intent); } startDesktop(context); } diff --git a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java index 6901ed0..a867efe 100644 --- a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java +++ b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java @@ -165,7 +165,7 @@ public class MainStartVM { if (MainSettingsManager.getVmUi(context).equals("X11") && !VMManager.isVMRunning(context, vmID)) { if (MainSettingsManager.getRunQemuWithXterm(context)) { String logFilePath = VmFileManager.getLog(context, vmID); - runCommandFormat = String.format(runCommandFormat, "mkdir -p \"" + new File(logFilePath).getParent() + "\"; echo \"\" > " + logFilePath + "; xterm -e bash -c \"%s 2>&1 | tee " + logFilePath + "\"; cat " + logFilePath + "; rm " + logFilePath); + runCommandFormat = String.format(runCommandFormat, "mkdir -p \"" + new File(logFilePath).getParent() + "\"; xterm -e bash -c \"%s 2>&1 | tee " + logFilePath + "\"; cat " + logFilePath + "; rm " + logFilePath); } else { runCommandFormat = String.format(runCommandFormat, "bash -c \"%s\""); } @@ -314,9 +314,10 @@ public class MainStartVM { ) { VMManager.isQemuStopedWithError = false; - String cleanUpCommand = " && echo \"" + TAG_FINISHED_WITHOUT_ERROR + "\"\nrm -r " + Config.getCacheVMPath(vmID); + String cleanUpCommand = " && echo '" + TAG_FINISHED_WITHOUT_ERROR + "'\nrm -r " + Config.getCacheVMPath(vmID); - String finalCommand = VMManager.addAudioDevWav(vmID, String.format(runCommandFormat, env + cleanUpCommand)); + String finalCommand = VMManager.addAudioDevWav(vmID, String.format(runCommandFormat, env)); + finalCommand = "echo ===== COMMAND =====\necho\necho \"" + finalCommand + "\"\necho\necho ===== LOGS =====\necho\n" + finalCommand + cleanUpCommand; if (MainSettingsManager.getVmUi(context).equals("X11")) { finalCommand = "export DISPLAY=:0 && " + finalCommand; diff --git a/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java index b9e15f5..1bad31c 100644 --- a/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java +++ b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java @@ -1,5 +1,7 @@ package com.vectras.vm.main.core; +import static android.view.View.GONE; + import android.app.Activity; import android.content.Intent; import android.view.View; @@ -15,14 +17,19 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.vectras.qemu.Config; +import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.creator.VMCreatorActivity; import com.vectras.vm.ExportRomActivity; import com.vectras.vm.R; import com.vectras.vm.VMManager; +import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.manager.FirmwareManager; import com.vectras.vm.manager.VmAudioManager; import com.vectras.vm.manager.VmControllerDialog; import com.vectras.vm.manager.VmFileManager; +import com.vectras.vm.settings.Minitools; +import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.ProgressDialog; @@ -110,6 +117,50 @@ public class RomOptionsDialog { }).start(); }); + if (vmConfig.isUseDefaultBios && FirmwareManager.isAVarFileExist(VmFileManager.getPath(vmConfig.vmID)) && !VMManager.isNeedLoadMigrate()) { + v.findViewById(R.id.ln_reset_uefi_bios).setOnClickListener(v7 -> { + DialogUtils.twoDialog( + activity, + activity.getString(R.string.reset_uefi_bios), + activity.getString(R.string.reset_uefi_bios_note), + activity.getString(R.string.reset), + activity.getString(R.string.cancel), + true, + R.drawable.restore_page_24px, + true, + () -> { + ProgressDialog progressDialog = new ProgressDialog(activity); + progressDialog.show(); + + new Thread(() -> { + FirmwareManager.erase(); + activity.runOnUiThread(() -> { + progressDialog.dismiss(); + Toast.makeText(activity, activity.getString(R.string.done), Toast.LENGTH_LONG).show(); + }); + }).start(); + }, + null, + null); + + bottomSheetDialog.cancel(); + }); + } else { + v.findViewById(R.id.ln_reset_uefi_bios).setVisibility(GONE); + } + + v.findViewById(R.id.ln_show_in_folder).setOnClickListener(v6 -> { + if (MainSettingsManager.getBuiltInFilePicker(activity)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.setHomeName(vmConfig.itemName); + filePickerDialog.setLockHome(true); + filePickerDialog.browse(activity, VmFileManager.getPath(vmConfig.vmID)); + } else { + FileUtils.openFolder(activity, VmFileManager.getPath(vmConfig.vmID)); + } + bottomSheetDialog.cancel(); + }); + v.findViewById(R.id.ln_remove).setOnClickListener(v1 -> { VMManager.deleteVMDialog(vmConfig.itemName, position, activity); bottomSheetDialog.cancel(); diff --git a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java index 7c01092..f9a8732 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java +++ b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java @@ -26,14 +26,14 @@ public class DataMainRoms { public String itemName = ""; // Board - public int machine = 0; + public int machine; public boolean nvirt; // Nested virtualization - public int cpu = 0; - public int cores = 0; - public int threads = 0; + public int cpu; + public int cores; + public int threads; - public int memory = 0; + public int memory; // Dummy devices @@ -69,11 +69,15 @@ public class DataMainRoms { // Network - public int networkCard = 0; + public int networkCard; + + // Sound + + public int soundCard; // Firmware - public int bootFrom = 0; + public int bootFrom; public boolean isShowBootMenu; @@ -94,5 +98,5 @@ public class DataMainRoms { // Deprecated @Deprecated - public int qmpPort = 0; + public int qmpPort; } diff --git a/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java b/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java index a8cb185..53f83ae 100644 --- a/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java +++ b/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java @@ -33,7 +33,7 @@ public class BatteryEmulatorManager { File vmTemp = new File(VmFileManager.getTempPath(context, vmId)); try { - String batteryAsl = SetupFeatureCore.readTextFromAssets(context, "roms/battery.asl"); + String batteryAsl = SetupFeatureCore.readTextFromAssets(context, "asl/battery.asl"); int remainingCapacity; int lastFullChargeCapacity = (int) (DESIGN_CAPACITY - ((double) (DESIGN_CAPACITY / 100) * (batteryCycleCount * PROPERTY_CAPACITY_DEPLETED_EACH_CYCLE))); diff --git a/app/src/main/java/com/vectras/vm/manager/FirmwareManager.java b/app/src/main/java/com/vectras/vm/manager/FirmwareManager.java index 8ceec81..9b6a43c 100644 --- a/app/src/main/java/com/vectras/vm/manager/FirmwareManager.java +++ b/app/src/main/java/com/vectras/vm/manager/FirmwareManager.java @@ -24,28 +24,44 @@ public class FirmwareManager { if (arch.equals("ARM64")) { if (!FileUtils.isFileExists(AppConfig.basefiledir + "QEMU_EFI.img")) - SetupFeatureCore.copyAssetToFile(context, "roms/QEMU_EFI.img", AppConfig.basefiledir + "QEMU_EFI.img"); + SetupFeatureCore.copyAssetToFile(context, "firmware/QEMU_EFI.img", AppConfig.basefiledir + "QEMU_EFI.img"); if (!FileUtils.isFileExists(AppConfig.basefiledir + "QEMU_VARS.img")) - SetupFeatureCore.copyAssetToFile(context, "roms/QEMU_VARS.img", AppConfig.basefiledir + "QEMU_VARS.img"); + SetupFeatureCore.copyAssetToFile(context, "firmware/QEMU_VARS.img", AppConfig.basefiledir + "QEMU_VARS.img"); } else if (arch.equals("X86_64") && (MainSettingsManager.getuseUEFI(context) || isUseUefi)) { - if (!FileUtils.isFileExists(AppConfig.basefiledir + "RELEASEX64_OVMF.fd")) - SetupFeatureCore.copyAssetToFile(context, "roms/RELEASEX64_OVMF.fd", AppConfig.basefiledir + "RELEASEX64_OVMF.fd"); + if (!FileUtils.isFileExists(AppConfig.basefiledir + "edk2-x86_64-code.fd")) + SetupFeatureCore.copyAssetToFile(context, "firmware/edk2-x86_64-code.fd", AppConfig.basefiledir + "edk2-x86_64-code.fd"); - if (!FileUtils.isFileExists(AppConfig.basefiledir + "RELEASEX64_OVMF_VARS.fd")) - SetupFeatureCore.copyAssetToFile(context, "roms/RELEASEX64_OVMF_VARS.fd", AppConfig.basefiledir + "RELEASEX64_OVMF_VARS.fd"); + if (!FileUtils.isFileExists(AppConfig.basefiledir + "edk2-x86_64-vars.fd")) + SetupFeatureCore.copyAssetToFile(context, "firmware/edk2-x86_64-vars.fd", AppConfig.basefiledir + "edk2-x86_64-vars.fd"); + } else if (arch.equals(MainSettingsManager.I386_ARCH) && (MainSettingsManager.getuseUEFI(context) || isUseUefi)) { + if (!FileUtils.isFileExists(AppConfig.basefiledir + "edk2-i386-code.fd")) + SetupFeatureCore.copyAssetToFile(context, "firmware/edk2-i386-code.fd", AppConfig.basefiledir + "edk2-i386-code.fd"); + + if (!FileUtils.isFileExists(AppConfig.basefiledir + "edk2-i386-vars.fd")) + SetupFeatureCore.copyAssetToFile(context, "firmware/edk2-i386-vars.fd", AppConfig.basefiledir + "edk2-i386-vars.fd"); } else { if (!FileUtils.isFileExists(AppConfig.basefiledir + "bios-vectras.bin")) - SetupFeatureCore.copyAssetToFile(context, "roms/bios-vectras.bin", AppConfig.basefiledir + "bios-vectras.bin"); + SetupFeatureCore.copyAssetToFile(context, "firmware/bios-vectras.bin", AppConfig.basefiledir + "bios-vectras.bin"); } } } - public static void deleteAll() { - FileUtils.delete(AppConfig.basefiledir + "bios-vectras.bin"); - FileUtils.delete(AppConfig.basefiledir + "QEMU_EFI.img"); + public static void erase() { FileUtils.delete(AppConfig.basefiledir + "QEMU_VARS.img"); - FileUtils.delete(AppConfig.basefiledir + "RELEASEX64_OVMF.fd"); - FileUtils.delete(AppConfig.basefiledir + "RELEASEX64_OVMF_VARS.fd"); + FileUtils.delete(AppConfig.basefiledir + "edk2-i386-vars.fd"); + FileUtils.delete(AppConfig.basefiledir + "edk2-x86_64-vars.fd"); + } + + public static boolean isAVarFileExist(String folderPath) { + return FileUtils.isFileExists(AppConfig.basefiledir + "QEMU_VARS.img") || + FileUtils.isFileExists(AppConfig.basefiledir + "edk2-i386-vars.fd") || + FileUtils.isFileExists(AppConfig.basefiledir + "edk2-x86_64-vars.fd"); + } + + public static void erase(String folderPath) { + FileUtils.delete(folderPath + "QEMU_VARS.img"); + FileUtils.delete(folderPath + "edk2-i386-vars.fd"); + FileUtils.delete(folderPath + "edk2-x86_64-vars.fd"); } } diff --git a/app/src/main/java/com/vectras/vm/manager/ToolsManager.java b/app/src/main/java/com/vectras/vm/manager/ToolsManager.java index fecd900..46d1214 100644 --- a/app/src/main/java/com/vectras/vm/manager/ToolsManager.java +++ b/app/src/main/java/com/vectras/vm/manager/ToolsManager.java @@ -22,10 +22,10 @@ import java.io.File; public class ToolsManager { public static void mount3dfxWrappers(Activity activity) { new Thread(() -> { - if (!FileUtils.isFileExists(AppConfig.basefiledir + "3dfx-wrappers.iso")) - SetupFeatureCore.copyAssetToFile(activity, "roms/3dfx-wrappers.iso", AppConfig.basefiledir + "3dfx-wrappers.iso"); + if (!FileUtils.isFileExists(AppConfig.basefiledir + "3dfx-wrappers-i686.iso")) + SetupFeatureCore.copyAssetToFile(activity, "driver/3dfx-wrappers-i686.iso", AppConfig.basefiledir + "3dfx-wrappers-i686.iso"); - activity.runOnUiThread(() -> QmpSender.changeDynamicSecondaryOpticalDisc(activity, AppConfig.basefiledir + "3dfx-wrappers.iso", "")); + activity.runOnUiThread(() -> QmpSender.changeDynamicSecondaryOpticalDisc(activity, AppConfig.basefiledir + "3dfx-wrappers-i686.iso", "")); }).start(); } diff --git a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java index 3870680..2adf72d 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java +++ b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java @@ -284,11 +284,11 @@ public class VmControllerDialog extends DialogFragment { binding.lnSecondaryCdrom.setVisibility(View.GONE); } - if (!infoBlock.contains(AppConfig.basefiledir + "3dfx-wrappers.iso")) + if (!infoBlock.contains(AppConfig.basefiledir + "3dfx-wrappers-i686.iso")) binding.ivEject3dfx.setVisibility(View.GONE); binding.ln3dfx.setOnClickListener(v -> { - if (infoBlock.contains(AppConfig.basefiledir + "3dfx-wrappers.iso")) { + if (infoBlock.contains(AppConfig.basefiledir + "3dfx-wrappers-i686.iso")) { QmpSender.ejectDynamicSecondaryOpticalDisc(requireActivity(), infoBlock); } else { ToolsManager.mount3dfxWrappers(requireActivity()); diff --git a/app/src/main/java/com/vectras/vm/manager/WifiCardEmulatorManager.java b/app/src/main/java/com/vectras/vm/manager/WifiCardEmulatorManager.java index e29458c..89c5343 100644 --- a/app/src/main/java/com/vectras/vm/manager/WifiCardEmulatorManager.java +++ b/app/src/main/java/com/vectras/vm/manager/WifiCardEmulatorManager.java @@ -17,7 +17,7 @@ public class WifiCardEmulatorManager { File vmTemp = new File(VmFileManager.getTempPath(context, vmId)); try { - String wifiAsl = SetupFeatureCore.readTextFromAssets(context, "roms/wifi.asl"); + String wifiAsl = SetupFeatureCore.readTextFromAssets(context, "asl/wifi.asl"); FileUtils.writeToFile(vmTemp.getAbsolutePath(), "wifi.asl", wifiAsl); diff --git a/app/src/main/java/com/vectras/vm/settings/Minitools.java b/app/src/main/java/com/vectras/vm/settings/Minitools.java index 0b8c9e9..3149d5f 100644 --- a/app/src/main/java/com/vectras/vm/settings/Minitools.java +++ b/app/src/main/java/com/vectras/vm/settings/Minitools.java @@ -113,51 +113,51 @@ public class Minitools extends AppCompatActivity { binding.reinstallsystem.setOnClickListener(v -> DialogUtils.twoDialog(Minitools.this, getResources().getString(R.string.reinstall_system), getResources().getString(R.string.reinstall_system_content), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.system_update_24px, true, this::eraserSystem, null, null)); - if (FirmwareManager.isExistOne()) { - binding.lnResetUefiBios.setOnClickListener(v -> { - ProgressDialog progressDialog = new ProgressDialog(this); - progressDialog.setText(getString(R.string.just_a_sec)); - progressDialog.show(); - - new Thread(() -> { - boolean isQemuRunning = ProcessManager.isQemuRunning(this); - runOnUiThread(() -> { - progressDialog.dismiss(); - - if (isQemuRunning) { - DialogUtils.oopsDialog(Minitools.this, getString(R.string.need_to_shut_down_all_running_vm_note)); - } else { - DialogUtils.twoDialog( - Minitools.this, - getString(R.string.reset_uefi_bios), - getString(R.string.reset_uefi_bios_note), - getString(R.string.reset), - getString(R.string.cancel), - true, - R.drawable.restore_page_24px, - true, - () -> { - progressDialog.show(); - - new Thread(() -> { - FirmwareManager.deleteAll(); - runOnUiThread(() -> { - progressDialog.dismiss(); - - binding.lnResetUefiBios.setVisibility(GONE); - Toast.makeText(Minitools.this, getString(R.string.done), Toast.LENGTH_LONG).show(); - }); - }).start(); - }, - null, - null); - } - }); - }).start(); - }); - } else { - binding.lnResetUefiBios.setVisibility(GONE); - } +// if (FirmwareManager.isExistOne()) { +// binding.lnResetUefiBios.setOnClickListener(v -> { +// ProgressDialog progressDialog = new ProgressDialog(this); +// progressDialog.setText(getString(R.string.just_a_sec)); +// progressDialog.show(); +// +// new Thread(() -> { +// boolean isQemuRunning = ProcessManager.isQemuRunning(this); +// runOnUiThread(() -> { +// progressDialog.dismiss(); +// +// if (isQemuRunning) { +// DialogUtils.oopsDialog(Minitools.this, getString(R.string.need_to_shut_down_all_running_vm_note)); +// } else { +// DialogUtils.twoDialog( +// Minitools.this, +// getString(R.string.reset_uefi_bios), +// getString(R.string.reset_uefi_bios_note), +// getString(R.string.reset), +// getString(R.string.cancel), +// true, +// R.drawable.restore_page_24px, +// true, +// () -> { +// progressDialog.show(); +// +// new Thread(() -> { +// FirmwareManager.erase(); +// runOnUiThread(() -> { +// progressDialog.dismiss(); +// +// binding.lnResetUefiBios.setVisibility(GONE); +// Toast.makeText(Minitools.this, getString(R.string.done), Toast.LENGTH_LONG).show(); +// }); +// }).start(); +// }, +// null, +// null); +// } +// }); +// }).start(); +// }); +// } else { +// binding.lnResetUefiBios.setVisibility(GONE); +// } ListUtils.setupMirrorListForListmap(mirrorlist); } diff --git a/app/src/main/java/com/vectras/vm/settings/SettingsData.java b/app/src/main/java/com/vectras/vm/settings/SettingsData.java new file mode 100644 index 0000000..5ce5c41 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/settings/SettingsData.java @@ -0,0 +1,28 @@ +package com.vectras.vm.settings; + +import android.content.Context; +import android.content.SharedPreferences; + +import androidx.preference.PreferenceManager; + +public class SettingsData { + public static boolean alwaysShowLog(Context context) { + return get(context, "alwaysShowLog"); + } + + public static void alwaysShowLog(Context context, boolean value) { + set(context, "alwaysShowLog", value); + } + + public static boolean get(Context context, String key) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return prefs.getBoolean(key, false); + } + + public static void set(Context context, String key, boolean value) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor edit = prefs.edit(); + edit.putBoolean(key, value); + edit.apply(); + } +} diff --git a/app/src/main/java/com/vectras/vm/settings/SystemSettingsActivity.java b/app/src/main/java/com/vectras/vm/settings/SystemSettingsActivity.java index 02752d6..a958cd3 100644 --- a/app/src/main/java/com/vectras/vm/settings/SystemSettingsActivity.java +++ b/app/src/main/java/com/vectras/vm/settings/SystemSettingsActivity.java @@ -36,8 +36,12 @@ public class SystemSettingsActivity extends AppCompatActivity { binding.swQuickStart.setOnCheckedChangeListener((buttonView, isChecked) -> MainSettingsManager.setQuickStart(this, isChecked)); binding.lnQuickStart.setOnClickListener(v -> binding.swQuickStart.toggle()); + binding.swAlwaysShowLogs.setOnCheckedChangeListener((buttonView, isChecked) -> SettingsData.alwaysShowLog(this, isChecked)); + binding.lnAlwaysShowLogs.setOnClickListener(v -> binding.swAlwaysShowLogs.toggle()); + binding.swCopyFile.setChecked(MainSettingsManager.copyFile(this)); binding.swQuickStart.setChecked(MainSettingsManager.getQuickStart(this)); + binding.swAlwaysShowLogs.setChecked(SettingsData.alwaysShowLog(this)); binding.lnLanguage.setOnClickListener(v -> { ItemSettingsSelector.language(this, ItemSettingsSelector.getLanguagePosition(this, MainSettingsManager.getLang(this)), (position, name, value) -> { diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java index 41d9da2..27014e7 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java @@ -462,10 +462,26 @@ public class SetupWizard2Activity extends AppCompatActivity { if (ACTION == ACTION_SYSTEM_UPDATE) { cmd += "echo \"Uninstalling...\";" + + "set +e;" + + " rm -f /usr/local/bin/elf2dmp;" + " rm -f /usr/local/bin/qemu-*;" + - " rm -f /usr/share/applications/qemu.desktop;" + - " rm -f /usr/share/icons/hicolor/*/qemu.png;" + - " rm -rf /usr/share/qemu;" + + " rm -f /usr/local/include/qemu-*;" + + " rm -f /usr/local/libexec/qemu-*;" + + " rm -f /usr/local/libexec/vhost-user-gpu;" + + " rm -f /usr/local/libexec/virtfs-proxy-helper;" + + " rm -f /usr/local/libexec/virtiofsd;" + + " rm -rf /usr/local/share/doc/qemu;" + + " rm -f /usr/local/share/applications/qemu.desktop;" + + " rm -f /usr/local/share/icons/hicolor/*/qemu.png;" + + " rm -f /usr/local/share/locale/*/qemu.mo;" + + " rm -f /usr/local/share/man/man1/qemu*;" + + " rm -f /usr/local/share/man/man1/virtfs-proxy-helper.1;" + + " rm -f /usr/local/share/man/man1/virtiofsd.1;" + + " rm -f /usr/local/share/man/man7/qemu*;" + + " rm -f /usr/local/share/man/man8/qemu*;" + + " rm -rf /usr/local/share/qemu;" + + " set -e;" + + " echo \"Downloading Qemu...\";" + downloadBootstrapsCommand + ";" + " echo \"Installing Qemu...\";" + " tar -xzvf setup.tar.gz -C /;" + diff --git a/app/src/main/java/com/vectras/vm/setupwizard/TurnipZinkSetupWizardActivity.java b/app/src/main/java/com/vectras/vm/setupwizard/TurnipZinkSetupWizardActivity.java index 514806f..9396c40 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/TurnipZinkSetupWizardActivity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/TurnipZinkSetupWizardActivity.java @@ -97,7 +97,7 @@ public class TurnipZinkSetupWizardActivity extends AppCompatActivity { return; } - if (FileUtils.isFileExists(AppConfig.internalDataDirPath + "/distro/usr/share/drirc.d/00-mesa-defaults.conf")) { + if (FileUtils.isFileExists(AppConfig.internalDataDirPath + "/distro/usr/lib/dri/zink_dri.so")) { new Handler(Looper.getMainLooper()).postDelayed(() -> uiControllder(STEP_INSTALLED), 1000); return; } @@ -169,7 +169,7 @@ public class TurnipZinkSetupWizardActivity extends AppCompatActivity { if (isFinishing() || isDestroyed()) return; runOnUiThread(() -> { - if (log.contains(COMPLETED_MARK) && FileUtils.isFileExists(AppConfig.internalDataDirPath + "/distro/usr/share/drirc.d/00-mesa-defaults.conf")) { + if (log.contains(COMPLETED_MARK) && FileUtils.isFileExists(AppConfig.internalDataDirPath + "/distro/usr/lib/dri/zink_dri.so")) { uiControllder(STEP_INSTALLED); } else { logs = log; diff --git a/app/src/main/java/com/vectras/vm/utils/FileUtils.java b/app/src/main/java/com/vectras/vm/utils/FileUtils.java index 2af04aa..4fb4ef9 100644 --- a/app/src/main/java/com/vectras/vm/utils/FileUtils.java +++ b/app/src/main/java/com/vectras/vm/utils/FileUtils.java @@ -39,6 +39,8 @@ import androidx.core.content.FileProvider; import androidx.documentfile.provider.DocumentFile; import com.vectras.vm.R; +import com.vectras.vm.file.FilePickerDialog; +import com.vectras.vm.manager.VmFileManager; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; @@ -899,17 +901,24 @@ public class FileUtils { try { context.startActivity(intent); } catch (Exception e) { - DialogUtils.oneDialog( - context, - context.getString(R.string.oops), - context.getString(R.string.there_is_no_app_to_perform_this_action), - context.getString(R.string.ok), - true, - R.drawable.error_96px, - true, - null, - null - ); + if (context instanceof Activity activity) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.setLockHome(true); + filePickerDialog.browse(activity, folderPath); + } else { + DialogUtils.oneDialog( + context, + context.getString(R.string.oops), + context.getString(R.string.there_is_no_app_to_perform_this_action), + context.getString(R.string.ok), + true, + R.drawable.error_96px, + true, + null, + null + ); + } + Log.e(TAG, "openFolder: " + e.getMessage()); } } diff --git a/app/src/main/res/layout/activity_minitools.xml b/app/src/main/res/layout/activity_minitools.xml index 408eab3..5597f7c 100644 --- a/app/src/main/res/layout/activity_minitools.xml +++ b/app/src/main/res/layout/activity_minitools.xml @@ -165,26 +165,26 @@ android:text="@string/delete_all" /> - + + + + + + + + - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rom_options_dialog.xml b/app/src/main/res/layout/rom_options_dialog.xml index 2a4b7a2..b7b2cfb 100644 --- a/app/src/main/res/layout/rom_options_dialog.xml +++ b/app/src/main/res/layout/rom_options_dialog.xml @@ -147,6 +147,52 @@ android:text="@string/clean_up"/> + + + + + + + + + + Các bộ lọc Tìm kiếm với nhiều sự kiểm soát hơn và duyệt nhanh hơn. Đặt lại UEFI/BIOS - Tất cả các cài đặt của UEFI/BIOS mặc định sẽ được đặt lại. Bạn có muốn tiếp tục? + Tất cả các cài đặt của UEFI/BIOS sẽ được đặt lại. Bạn có muốn tiếp tục? Bạn cần tắt tất cả máy ảo đang chạy để thực hiện hành động này. Tự động chuyển sang chuột ngoài Tự động chuyển đổi khi kết nối và ngắt chuột rời. @@ -671,6 +671,11 @@ Thiết bị của bạn không đáp ứng đủ các điều kiện để tiếp tục. Một tính năng cốt lõi của ứng dụng vừa xảy ra sự cố. Bạn có thể cần đóng ứng dụng và mở lại để các tính năng hoạt động bình thường trở lại. Buộc dừng + Ấm thanh + Thẻ âm thanh,… + Các thẻ + Luôn hiện nhật ký + Hộp thoại hiển thị nhật ký sẽ xuất hiện dù máy ảo không có sự cố nghiêm trọng nào xảy ra sau khi tắt nguồn. Vterm diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b13f2f..2241b6f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -623,7 +623,7 @@ Filters Search with more control and browse faster. Reset UEFI/BIOS - All default UEFI/BIOS settings will be reset. Do you want to continue? + All UEFI/BIOS settings will be reset. Do you want to continue? You need to shut down all running virtual machines to perform this action. Auto switch to external mouse Automatically switches when the mouse is connected and disconnected. @@ -692,6 +692,11 @@ Your device does not meet the requirements to continue. A core feature of the app has just experienced an issue. You may need to close and reopen the app for the features to work properly again. Force stop + Sound + Sound card,... + Cards + Always show logs + The log display dialog will appear even if no serious problems occurred with the virtual machine after it was powered off. @@ -1057,6 +1062,15 @@ E.g. META for META key, \n Eyetech AmigaOne aCube Sam460ex + + Intel HD Audio Controller (ich9) + Intel HD Audio Controller (ich6) + Crystal Semiconductor CS4231A + Intel 82801AA AC97 Audio + ENSONIQ AudioPCI ES1370 + Creative Sound Blaster 16 + Yamaha YM3812 (OPL2) + diff --git a/qemu/11.0.0/upgrade.sh b/qemu/11.0.0/upgrade.sh index df9ed51..0910690 100644 --- a/qemu/11.0.0/upgrade.sh +++ b/qemu/11.0.0/upgrade.sh @@ -37,10 +37,23 @@ pkill -9 -f qemu-system- || true clear echo -e "\e[1;37m[i] Uninstalling current Qemu..." +rm -f /usr/local/bin/elf2dmp rm -f /usr/local/bin/qemu-* -rm -f /usr/share/applications/qemu.desktop -rm -f /usr/share/icons/hicolor/*/qemu.png -rm -rf /usr/share/qemu +rm -f /usr/local/include/qemu-* +rm -f /usr/local/libexec/qemu-* +rm -f /usr/local/libexec/vhost-user-gpu +rm -f /usr/local/libexec/virtfs-proxy-helper +rm -f /usr/local/libexec/virtiofsd +rm -rf /usr/local/share/doc/qemu +rm -f /usr/local/share/applications/qemu.desktop +rm -f /usr/local/share/icons/hicolor/*/qemu.png +rm -f /usr/local/share/locale/*/qemu.mo +rm -f /usr/local/share/man/man1/qemu* +rm -f /usr/local/share/man/man1/virtfs-proxy-helper.1 +rm -f /usr/local/share/man/man1/virtiofsd.1 +rm -f /usr/local/share/man/man7/qemu* +rm -f /usr/local/share/man/man8/qemu* +rm -rf /usr/local/share/qemu clear echo -e "\e[1;37m[i] Downloading..." diff --git a/qemu/7.2.22/upgrade.sh b/qemu/7.2.22/upgrade.sh index f4771b2..5a3b132 100644 --- a/qemu/7.2.22/upgrade.sh +++ b/qemu/7.2.22/upgrade.sh @@ -1,17 +1,24 @@ #!/bin/bash clear +unset qemuurl architecture=$(uname -m) -if [[ ! "$architecture" =~ "aarch64" ]]; then - rm -f setup.sh +if [[ "$architecture" =~ "aarch64" ]]; then + qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz" +elif [[ "$architecture" =~ "x86_64" ]]; then + qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-x86_64.tar.gz" +fi + +if [[ -z "$qemuurl" ]]; then echo -e "\e[1;37m[!] Unsupported architecture!" echo -e "\e[1;37m-\e[0m" - echo -e "\e[1;37mYour device's is not supported. Your device needs to be AArch64 to install this version of Qemu." + echo -e "\e[1;37mYour device's is not supported." echo -e "\e[1;37m-\e[0m" echo -e "\e[1;37mSetup was canceled." + rm -f setup.sh exit fi -echo -e "\e[1;37m[!] Qemu 7.2.22 upgrade tool. Warning and do not ignore!" +echo -e "\e[1;37m[!] Qemu 7.2.2 upgrade tool. Warning and do not ignore!" echo -e "\e[1;37m-\e[0m" echo -e "\e[1;37mPlease do not run any other commands when this setup begins. If you're running other commands, they haven't finished executing yet or don't want some packages to be forced to be updated when setting up. Any existing installed version of Qemu will be uninstalled. Press Ctrl + C now to cancel the setup immediately." echo -e "\e[1;37m\e[0m" @@ -27,7 +34,7 @@ clear echo -e "\e[1;37m[i] Installing packages..." apk update -apk add perl aria2 +apk add aria2 clear echo -e "\e[1;37m[i] Killing process..." @@ -37,14 +44,27 @@ pkill -9 -f qemu-system- || true clear echo -e "\e[1;37m[i] Uninstalling current Qemu..." +rm -f /usr/local/bin/elf2dmp rm -f /usr/local/bin/qemu-* -rm -f /usr/share/applications/qemu.desktop -rm -f /usr/share/icons/hicolor/*/qemu.png -rm -rf /usr/share/qemu +rm -f /usr/local/include/qemu-* +rm -f /usr/local/libexec/qemu-* +rm -f /usr/local/libexec/vhost-user-gpu +rm -f /usr/local/libexec/virtfs-proxy-helper +rm -f /usr/local/libexec/virtiofsd +rm -rf /usr/local/share/doc/qemu +rm -f /usr/local/share/applications/qemu.desktop +rm -f /usr/local/share/icons/hicolor/*/qemu.png +rm -f /usr/local/share/locale/*/qemu.mo +rm -f /usr/local/share/man/man1/qemu* +rm -f /usr/local/share/man/man1/virtfs-proxy-helper.1 +rm -f /usr/local/share/man/man1/virtiofsd.1 +rm -f /usr/local/share/man/man7/qemu* +rm -f /usr/local/share/man/man8/qemu* +rm -rf /usr/local/share/qemu clear echo -e "\e[1;37m[i] Downloading..." -aria2c -x 4 --async-dns=false --disable-ipv6 --check-certificate=false -o setup.tar.gz https://archive.org/download/qemu-7-2-22-for-vectras-vm-nbab/base-june-2026-vectras-vm-arm64-v8a.tar.gz +aria2c -x 4 --async-dns=false --disable-ipv6 --check-certificate=false -o setup.tar.gz "$qemuurl" clear echo -e "\e[1;37m[i] Installing..." diff --git a/qemu/9.2.2/upgrade.sh b/qemu/9.2.2/upgrade.sh index d448c53..d2c58f3 100644 --- a/qemu/9.2.2/upgrade.sh +++ b/qemu/9.2.2/upgrade.sh @@ -3,9 +3,9 @@ clear unset qemuurl architecture=$(uname -m) if [[ "$architecture" =~ "aarch64" ]]; then - qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.1.1/base-may-2026-vectras-vm-arm64-v8a.tar.gz" + qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-9.2.2-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz" elif [[ "$architecture" =~ "x86_64" ]]; then - qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.1/base-generic-vectras-vm-x86_64.tar.gz" + qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-9.2.2-3dfx-july-2026-vectras-vm-x86_64.tar.gz" elif [[ "$architecture" =~ "arm" ]]; then qemuurl="https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.4/base-vectras-vm-armeabi-v7a.tar.gz" elif [[ "$architecture" =~ "x86" ]]; then @@ -50,10 +50,23 @@ pkill -9 -f qemu-system- || true clear echo -e "\e[1;37m[i] Uninstalling current Qemu..." +rm -f /usr/local/bin/elf2dmp rm -f /usr/local/bin/qemu-* -rm -f /usr/share/applications/qemu.desktop -rm -f /usr/share/icons/hicolor/*/qemu.png -rm -rf /usr/share/qemu +rm -f /usr/local/include/qemu-* +rm -f /usr/local/libexec/qemu-* +rm -f /usr/local/libexec/vhost-user-gpu +rm -f /usr/local/libexec/virtfs-proxy-helper +rm -f /usr/local/libexec/virtiofsd +rm -rf /usr/local/share/doc/qemu +rm -f /usr/local/share/applications/qemu.desktop +rm -f /usr/local/share/icons/hicolor/*/qemu.png +rm -f /usr/local/share/locale/*/qemu.mo +rm -f /usr/local/share/man/man1/qemu* +rm -f /usr/local/share/man/man1/virtfs-proxy-helper.1 +rm -f /usr/local/share/man/man1/virtiofsd.1 +rm -f /usr/local/share/man/man7/qemu* +rm -f /usr/local/share/man/man8/qemu* +rm -rf /usr/local/share/qemu clear echo -e "\e[1;37m[i] Downloading..." diff --git a/qemu/9.2.4/upgrade.sh b/qemu/9.2.4/upgrade.sh index daffb5c..1ffcc30 100644 --- a/qemu/9.2.4/upgrade.sh +++ b/qemu/9.2.4/upgrade.sh @@ -44,10 +44,23 @@ pkill -9 -f qemu-system- || true clear echo -e "\e[1;37m[i] Uninstalling current Qemu..." +rm -f /usr/local/bin/elf2dmp rm -f /usr/local/bin/qemu-* -rm -f /usr/share/applications/qemu.desktop -rm -f /usr/share/icons/hicolor/*/qemu.png -rm -rf /usr/share/qemu +rm -f /usr/local/include/qemu-* +rm -f /usr/local/libexec/qemu-* +rm -f /usr/local/libexec/vhost-user-gpu +rm -f /usr/local/libexec/virtfs-proxy-helper +rm -f /usr/local/libexec/virtiofsd +rm -rf /usr/local/share/doc/qemu +rm -f /usr/local/share/applications/qemu.desktop +rm -f /usr/local/share/icons/hicolor/*/qemu.png +rm -f /usr/local/share/locale/*/qemu.mo +rm -f /usr/local/share/man/man1/qemu* +rm -f /usr/local/share/man/man1/virtfs-proxy-helper.1 +rm -f /usr/local/share/man/man1/virtiofsd.1 +rm -f /usr/local/share/man/man7/qemu* +rm -f /usr/local/share/man/man8/qemu* +rm -rf /usr/local/share/qemu clear echo -e "\e[1;37m[i] Downloading..." diff --git a/web/data/setupfiles3.json b/web/data/setupfiles3.json index 16d478b..46c4b5a 100644 --- a/web/data/setupfiles3.json +++ b/web/data/setupfiles3.json @@ -1,7 +1,7 @@ { "aarch64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.1.1/base-may-2026-vectras-vm-arm64-v8a.tar.gz", "armhf": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.4/base-vectras-vm-armeabi-v7a.tar.gz", - "amd64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.1/base-generic-vectras-vm-x86_64.tar.gz", + "amd64":"https://archive.org/download/qemu-9-2-2-3dfx-for-vectras-vm-nbab/base-july-2026-vectras-vm-x86_64.tar.gz", "x86": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.4/base-vectras-vm-x86.tar.gz", "aarch64_adreno": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.5/mesa-26.1.0-devel-20260404_alpine_3-19_aarch64.tar.gz", "aarch64_libglvnd": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.5/libglvnd-1.7.0_alpine_3-19_aarch64.tar.gz" diff --git a/web/data/setupfiles4.json b/web/data/setupfiles4.json new file mode 100644 index 0000000..ee05d19 --- /dev/null +++ b/web/data/setupfiles4.json @@ -0,0 +1,8 @@ +{ + "aarch64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-arm64-v8a.tar.gz", + "armhf": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-armeabi-v7a.tar.gz", + "amd64":"https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-3dfx-july-2026-vectras-vm-x86_64.tar.gz", + "x86": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.7/base-qemu-7.2.22-july-2026-vectras-vm-x86.tar.gz", + "aarch64_adreno": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.5/mesa-26.1.0-devel-20260404_alpine_3-19_aarch64.tar.gz", + "aarch64_libglvnd": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/4.4.5/libglvnd-1.7.0_alpine_3-19_aarch64.tar.gz" +} \ No newline at end of file