From 6c73672230ff125c017cbb23554b1d48370e25c0 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Thu, 7 May 2026 11:12:17 +0700 Subject: [PATCH] 4.1.5 - Added quick switching between running virtual machines to the VNC screen. - Removed the option button from the virtual machine list, replaced by a long press. - Fixed issues where other virtual machines would unexpectedly shut down when the first one was shut down. - Improved the interface. - Bugs fixed. --- app/build.gradle | 4 +- .../main/java/com/vectras/qemu/Config.java | 4 ++ .../com/vectras/qemu/MainVNCActivity.java | 1 - .../main/java/com/vectras/vm/VMManager.java | 3 + .../vm/main/core/RomOptionsDialog.java | 2 +- .../SoftwareStoreHomeAdapter.java | 2 +- .../vectras/vm/main/vms/VmsHomeAdapter.java | 6 +- .../vm/manager/VmControllerDialog.java | 38 +++++++++++ .../com/vectras/vm/manager/VmListManager.java | 67 +++++++++++++++++++ .../java/com/vectras/vm/manager/VmPicker.java | 49 ++++++++++++++ .../vectras/vm/manager/VmServiceManager.java | 18 +++++ .../main/res/drawable/compare_arrows_24px.xml | 11 +++ .../main/res/drawable/deployed_code_180px.xml | 10 +++ .../ic_deployed_code_180px_with_padding.xml | 3 + .../main/res/layout/container_main_roms.xml | 4 +- .../dialog_change_removable_devices.xml | 20 ++++++ app/src/main/res/values-vi/strings.xml | 4 ++ app/src/main/res/values/strings.xml | 4 ++ web/data/UpdateConfig.json | 8 +-- web/data/software-store.json | 4 +- web/data/vroms-store.json | 32 ++++----- 21 files changed, 262 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/vectras/vm/manager/VmListManager.java create mode 100644 app/src/main/java/com/vectras/vm/manager/VmPicker.java create mode 100644 app/src/main/java/com/vectras/vm/manager/VmServiceManager.java create mode 100644 app/src/main/res/drawable/compare_arrows_24px.xml create mode 100644 app/src/main/res/drawable/deployed_code_180px.xml create mode 100644 app/src/main/res/drawable/ic_deployed_code_180px_with_padding.xml diff --git a/app/build.gradle b/app/build.gradle index c99b68f..152d367 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 118 - versionName "4.1.4" + versionCode 119 + versionName "4.1.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/java/com/vectras/qemu/Config.java b/app/src/main/java/com/vectras/qemu/Config.java index 0b2751f..635f458 100644 --- a/app/src/main/java/com/vectras/qemu/Config.java +++ b/app/src/main/java/com/vectras/qemu/Config.java @@ -157,6 +157,10 @@ public class Config { return Config.getCacheDir()+ "/" + vmID + "/vncsocket"; } + public static String getLocalVNCSocketPath(String vmId) { + return Config.getCacheDir()+ "/" + vmId + "/vncsocket"; + } + public static String getCacheVMPath() { return Config.getCacheDir()+ "/" + vmID + "/"; } diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java index cc2a230..32444f9 100644 --- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java +++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java @@ -864,7 +864,6 @@ public class MainVNCActivity extends VncCanvasActivity { bindingSendKey.sendtextEdittext.setEnabled(false); QmpSender.quickShutdown(); Config.setDefault(); - MainService.stopService(); finish(); } diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index a90f9a5..e3bd66f 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -29,6 +29,7 @@ import com.vectras.vm.main.vms.DataMainRoms; import com.vectras.vm.manager.QmpSender; import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.manager.VmActions; +import com.vectras.vm.manager.VmServiceManager; import com.vectras.vm.settings.X11DisplaySettingsActivity; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; @@ -657,6 +658,8 @@ public class VMManager { return false; } + VmServiceManager.stopService(_activity); + if (_command.contains("qemu-system") && _result.contains("Killed")) { isQemuStopedWithError = true; return true; 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 e6adf31..95a391b 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 @@ -16,7 +16,7 @@ import com.vectras.vm.manager.VmAudioManager; import com.vectras.vm.manager.VmControllerDialog; public class RomOptionsDialog { - public static void showNow(Activity activity, int position, String vmID, String vmName) { + public static void show(Activity activity, int position, String vmID, String vmName) { if (VMManager.isVMRunning(activity, vmID)) { VmControllerDialog vmControllerDialog = new VmControllerDialog(); vmControllerDialog.streamAudio = VmAudioManager.streamAudio; diff --git a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java index 0387681..f159be1 100644 --- a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java @@ -55,7 +55,7 @@ public class SoftwareStoreHomeAdapter extends RecyclerView.Adapter RomOptionsDialog.showNow(activity, position, current.vmID, current.itemName)); myHolder.cdRoms.setOnClickListener(view -> { VMManager.setArch(current.itemArch, activity); @@ -96,8 +94,8 @@ public class VmsHomeAdapter extends RecyclerView.Adapter { - VMManager.deleteVMDialog(current.itemName, position, activity); - return false; + RomOptionsDialog.show(activity, position, current.vmID, current.itemName); + return true; }); } 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 f439633..3802660 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java +++ b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java @@ -2,6 +2,7 @@ package com.vectras.vm.manager; import android.androidVNC.ConnectionBean; import android.androidVNC.VncCanvas; +import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; @@ -36,6 +37,8 @@ import com.vectras.vm.utils.ProgressDialog; import com.vectras.vm.utils.StreamAudio; import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -109,6 +112,41 @@ public class VmControllerDialog extends DialogFragment { } dismiss(); }); + + binding.lnSwitch.setVisibility(View.GONE); + } else if (requireActivity() instanceof MainVNCActivity) { + ArrayList> list = VmListManager.getAllVmForPickRunningVncSocketOnly(requireActivity()); + + if (list.isEmpty() || (list.size() == 1 && Objects.requireNonNull(list.get(0).get("value")).toString().equals(Config.vmID))) { + binding.lnManage.setVisibility(View.GONE); + } else { + binding.lnSwitch.setOnClickListener(v -> { + if (isAdded()) { + VmPicker vmPicker = new VmPicker(requireActivity()); + vmPicker.currentVmId= Config.vmID; + vmPicker.listVm = list; + vmPicker.pick((position, name, value) -> { + if (Config.vmID.equals(value)) return; + + if (position < 0) { + DialogUtils.oopsDialog(requireActivity(), getString(R.string.no_vms_are_available)); + return; + } + + Config.vmID = value; + streamAudio.setCross(null); + streamAudio.stop(); + requireActivity().recreate(); + + dismiss(); + }); + } + }); + + binding.lnConnect.setVisibility(View.GONE); + binding.lnEdit.setVisibility(View.GONE); + binding.lnRemove.setVisibility(View.GONE); + } } else { binding.lnManage.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/vectras/vm/manager/VmListManager.java b/app/src/main/java/com/vectras/vm/manager/VmListManager.java new file mode 100644 index 0000000..e48199d --- /dev/null +++ b/app/src/main/java/com/vectras/vm/manager/VmListManager.java @@ -0,0 +1,67 @@ +package com.vectras.vm.manager; + +import android.content.Context; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.vectras.qemu.Config; +import com.vectras.vm.AppConfig; +import com.vectras.vm.creator.ListManager; +import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.FileUtils; + +import java.io.File; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +public class VmListManager { + public static ArrayList> getAllVmForPickRunningVncSocketOnly(Context context) { + ArrayList> listVm = getAllVmForPick(context); + ArrayList> list = new ArrayList<>(); + + for (int i = 0; i < listVm.size(); i++) { + if (FileUtils.isFileExists(Config.getLocalVNCSocketPath(Objects.requireNonNull(listVm.get(i).get("value")).toString()))) { + list.add(listVm.get(i)); + } + } + + return list; + } + + public static ArrayList> getAllVmForPickRunningOnly(Context context) { + ArrayList> listVm = getAllVmForPick(context); + ArrayList> list = new ArrayList<>(); + + for (int i = 0; i < listVm.size(); i++) { + if (FileUtils.isFileExists(Config.getLocalQMPSocketPath(Objects.requireNonNull(listVm.get(i).get("value")).toString()))) { + list.add(listVm.get(i)); + } + } + + return list; + } + + public static ArrayList> getAllVmForPick(Context context) { + ArrayList> list = new ArrayList<>(); + + List data = getAllVm(context); + + for (int i = 0; i < data.size(); i++) { + ListManager.putToList(list, data.get(i).itemName, data.get(i).vmID); + } + + return list; + } + + public static List getAllVm(Context context) { + Gson gson = new Gson(); + Type listType = new TypeToken>(){}.getType(); + + String json = FileUtils.readFromFile(context, new File(AppConfig.romsdatajson)); + + return gson.fromJson(json, listType); + } +} diff --git a/app/src/main/java/com/vectras/vm/manager/VmPicker.java b/app/src/main/java/com/vectras/vm/manager/VmPicker.java new file mode 100644 index 0000000..0fc3e37 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/manager/VmPicker.java @@ -0,0 +1,49 @@ +package com.vectras.vm.manager; + +import android.app.Activity; + +import com.vectras.vm.R; +import com.vectras.vm.creator.VMCreatorSelector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Objects; + +public class VmPicker { + public boolean isRunningOnly; + public String currentVmId = ""; + private Activity activity; + ArrayList> listVm; + + public interface VMPickerCallback { + void onSelected(int position, String name, String vmId); + } + + public VmPicker(Activity activity) { + this.activity = activity; + } + + public void pick(VMPickerCallback callback) { + ArrayList> list = listVm != null ? listVm : (isRunningOnly ? VmListManager.getAllVmForPickRunningOnly(activity) : VmListManager.getAllVmForPick(activity)); + + if (list.isEmpty()) callback.onSelected(-1, "", ""); + + int position = -1; + + if (!currentVmId.isEmpty()) { + for (int i = 0; i < list.size(); i++) { + if (Objects.equals(list.get(i).get("value"), currentVmId)) { + position = i; + break; + } + } + } + + VMCreatorSelector.showDialog( + activity, + list, + position, + (callback::onSelected), + activity.getString(R.string.switch_to)); + } +} diff --git a/app/src/main/java/com/vectras/vm/manager/VmServiceManager.java b/app/src/main/java/com/vectras/vm/manager/VmServiceManager.java new file mode 100644 index 0000000..6aba0e3 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/manager/VmServiceManager.java @@ -0,0 +1,18 @@ +package com.vectras.vm.manager; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import com.vectras.vm.MainService; +import com.vectras.vterm.Terminal; + +public class VmServiceManager { + public static void stopService(Context context) { + new Thread(() -> { + if (!Terminal.executeShellCommandWithResult("ps -e", context).contains("qemu-system-")) { + new Handler(Looper.getMainLooper()).post(MainService::stopService); + } + }).start(); + } +} diff --git a/app/src/main/res/drawable/compare_arrows_24px.xml b/app/src/main/res/drawable/compare_arrows_24px.xml new file mode 100644 index 0000000..d4a7f51 --- /dev/null +++ b/app/src/main/res/drawable/compare_arrows_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/deployed_code_180px.xml b/app/src/main/res/drawable/deployed_code_180px.xml new file mode 100644 index 0000000..2cc15b8 --- /dev/null +++ b/app/src/main/res/drawable/deployed_code_180px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_deployed_code_180px_with_padding.xml b/app/src/main/res/drawable/ic_deployed_code_180px_with_padding.xml new file mode 100644 index 0000000..62eb81a --- /dev/null +++ b/app/src/main/res/drawable/ic_deployed_code_180px_with_padding.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/container_main_roms.xml b/app/src/main/res/layout/container_main_roms.xml index 34acd39..841d494 100644 --- a/app/src/main/res/layout/container_main_roms.xml +++ b/app/src/main/res/layout/container_main_roms.xml @@ -73,7 +73,9 @@ android:clickable="true" android:focusable="true" android:padding="8dp" - android:src="@drawable/more_vert_24px" /> + android:src="@drawable/more_vert_24px" + android:visibility="gone" + tools:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_change_removable_devices.xml b/app/src/main/res/layout/dialog_change_removable_devices.xml index fdbae8e..573e896 100644 --- a/app/src/main/res/layout/dialog_change_removable_devices.xml +++ b/app/src/main/res/layout/dialog_change_removable_devices.xml @@ -90,6 +90,26 @@ android:textColor="?attr/colorError" android:text="@string/remove"/> + + + + + Tràn cạnh Tắt tràn cạnh Chụm ngón tay để thu phóng + Trình chọn máy ảo + Chuyển đổi + Chuyển sang + Không có máy ảo nào khả dụng. Vterm diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9aca313..4a0b81f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -580,6 +580,10 @@ Edge-to-edge Disable edge-to-edge Pinch to zoom + VM picker + Switch + Switch to + No virtual machines are available. diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index ff0d805..8236f30 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.1.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"118", - "versionNameBeta":"4.1.4", - "versionNameBetas":"4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.0,4.1.1,4.1.2,4.1.3,4.1.4", + "versionCodeBeta":"119", + "versionNameBeta":"4.1.5", + "versionNameBetas":"4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.0,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.1.4

Bugs fixed.", + "MessageBeta": "

4.1.5

Bugs fixed.", "cancellableBeta": true } diff --git a/web/data/software-store.json b/web/data/software-store.json index 012b710..2d86772 100644 --- a/web/data/software-store.json +++ b/web/data/software-store.json @@ -1,7 +1,7 @@ [ { "rom_name": "3Dfx wrappers driver", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/3dfx_logo.svg/1200px-3dfx_logo.svg.png", + "rom_icon": "https://static.wikia.nocookie.net/logopedia/images/a/aa/3dfx_logo.svg/revision/latest/scale-to-width-down/250?cb=20210710183633", "rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.5.0.iso", "rom_path": "3dfx-wrappers-3.5.0.iso", "rom_avail": true, @@ -91,7 +91,7 @@ }, { "rom_name": "CPU-Z", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/CPU-Z_Icon.svg/1200px-CPU-Z_Icon.svg.png", + "rom_icon": "https://img.utdstc.com/icon/5a8/811/5a8811931f7981d09d9105862ca78baf7326e9ec847594b219008c037bb82e1a:200", "rom_url": "https://archive.org/details/cpu-z_202512", "rom_path": "CPU-Z.iso", "rom_avail": true, diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index 964643d..836fef6 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -37,7 +37,7 @@ }, { "rom_name": "Android 4.4 r1", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Android_KitKat_logo.svg/1200px-Android_KitKat_logo.svg.png", + "rom_icon": "https://static.wikia.nocookie.net/android/images/f/f4/Android_Kitkat_Platform_Logo.png/revision/latest/scale-to-width-down/250?cb=20250617090400", "rom_url": "https://anbui.ovh/get/vec/community/android/44r1.html", "rom_path": "Android 4.4 r1.cvbi", "rom_avail": true, @@ -308,7 +308,7 @@ }, { "rom_name": "elementary OS 5.1", - "rom_icon": "https://static-00.iconduck.com/assets.00/elementary-os-icon-2048x2048-r076wdiz.png", + "rom_icon": "https://dashboard.snapcraft.io/site_media/appmedia/2025/06/distributor-logo-elementary.svg.png", "rom_url": "https://anbui.ovh/get/vec/community/linux/elementaryos51.html", "rom_path": "elementary OS 5.1.cvbi", "rom_avail": true, @@ -344,7 +344,7 @@ }, { "rom_name": "FreeBSD 14", - "rom_icon": "https://cdn.freebiesupply.com/logos/large/2x/freebsd-logo-png-transparent.png", + "rom_icon": "https://assets.streamlinehq.com/image/private/w_300,h_300,ar_1/f_auto/v1/icons/3/freebsd-8y7gucsndcusnf9xj4hjz.png/freebsd-vmjeunkuo75o39xenh9ie.png?_a=DATAiZAAZAA0", "rom_url": "https://anbui.ovh/get/vec/community/bsd/freebsd14cli.html", "rom_path": "FreeBSD.14.CLI.cvbi", "rom_avail": true, @@ -362,7 +362,7 @@ }, { "rom_name": "Gentoo Linux", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Gentoo_Linux_logo_matte.svg/1200px-Gentoo_Linux_logo_matte.svg.png", + "rom_icon": "https://avatars.githubusercontent.com/u/52242?s=280&v=4", "rom_url": "https://anbui.ovh/get/vec/community/linux/gentoo.html", "rom_path": "Gentoo Linux.cvbi", "rom_avail": true, @@ -542,7 +542,7 @@ }, { "rom_name": "Lubuntu 16.04", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Lubuntu.svg/1200px-Lubuntu.svg.png", + "rom_icon": "https://zeth.net/_images/Lubuntu_logo500.png", "rom_url": "https://youtu.be/usid0P7oePU", "rom_path": "Lubuntu 16.04.cvbi", "rom_avail": true, @@ -560,7 +560,7 @@ }, { "rom_name": "Lubuntu 18.04", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Lubuntu.svg/1200px-Lubuntu.svg.png", + "rom_icon": "https://zeth.net/_images/Lubuntu_logo500.png", "rom_url": "https://anbui.ovh/get/vec/community/linux/lubuntu1804.html", "rom_path": "Lubuntu 18.04.cvbi", "rom_avail": true, @@ -578,7 +578,7 @@ }, { "rom_name": "Mac OS 9.1", - "rom_icon": "https://www.macintoshrepository.org/_resize.php?w=640&h=480&bg_color=333333&imgenc=ZmlsZ8faXMvdXBsb2Fkcy9zY3JlZW5zaG90cy8xNjI4OTQ4MTE0LjUxNDFwMzU5MDBfMXUyLS0uLS1hLnBuZ3x3d3cubWFjaW50b3NocmVwb3NpdG9yeS5vcmcvMzU5MDAtbWFjLW9zLTktMS1zeXN0ZW0tZm9sZGVyLWZvci1tYWMtb3MteC1jbGFzc2ljLWVudmlyb25tZW50LQ%3D%3D", + "rom_icon": "https://w7.pngwing.com/pngs/305/751/png-transparent-macintosh-operating-systems-macos-mac-os-x-lion-apple-apple-angle-computer-os-x-thumbnail.png", "rom_url": "https://youtu.be/To_qgUH-RpM", "rom_path": "Mac OS 9.1.cvbi", "rom_avail": true, @@ -704,7 +704,7 @@ }, { "rom_name": "NetBSD", - "rom_icon": "https://media.licdn.com/dms/image/D4E12AQEdTG-WPc-GXg/article-cover_image-shrink_600_2000/0/1708992537786?e=2147483647&v=beta&t=3FDiRUhohJB7SsZ4YWSfn8A9UFQ3ESafOChHkJdaDXc", + "rom_icon": "https://www.shareicon.net/data/512x512/2015/09/11/99325_netbsd_512x512.png", "rom_url": "https://anbui.ovh/get/vec/community/bsd/netbsd.html", "rom_path": "NetBSD.cvbi", "rom_avail": true, @@ -848,7 +848,7 @@ }, { "rom_name": "ReactOS", - "rom_icon": "https://www.linuxinsider.com/wp-content/uploads/sites/2/2021/05/2016-react-os-1.jpg", + "rom_icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ0hxmjdOsICi4v1FOz3fBbCSUSkmGGyzeQ7g&s", "rom_url": "https://anbui.ovh/get/vec/community/linux/reactos.html", "rom_path": "ReactOS.cvbi", "rom_avail": true, @@ -866,7 +866,7 @@ }, { "rom_name": "Red Star OS", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Red_Star_OS_Logo.svg/263px-Red_Star_OS_Logo.svg.png", + "rom_icon": "https://images.seeklogo.com/logo-png/42/2/red-star-os-logo-png_seeklogo-427811.png", "rom_url": "https://anbui.ovh/get/vec/community/linux/redstaros.html", "rom_path": "RedStar OS.cvbi", "rom_avail": true, @@ -1766,7 +1766,7 @@ }, { "rom_name": "Windows 7 Starter", - "rom_icon": "https://upload.wikimedia.org/wikipedia/de/thumb/c/c2/Microsoft_Windows_7_logo.svg/2296px-Microsoft_Windows_7_logo.svg.png", + "rom_icon": "https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/10/15/windows_logo_2006_1_c0e5e8a8271301cfed289ab6118e38b2.png", "rom_url": "https://anbui.ovh/get/vec/community/win/nt6/7starter.html", "rom_path": "Windows 7 Starter.cvbi", "rom_avail": true, @@ -1784,7 +1784,7 @@ }, { "rom_name": "Windows 7 Super Nano Lite (x64)", - "rom_icon": "https://upload.wikimedia.org/wikipedia/de/thumb/c/c2/Microsoft_Windows_7_logo.svg/2296px-Microsoft_Windows_7_logo.svg.png", + "rom_icon": "https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/10/15/windows_logo_2006_1_c0e5e8a8271301cfed289ab6118e38b2.png", "rom_url": "https://anbui.ovh/get/vec/community/win/nt6/7snlx64.html", "rom_path": "Windows 7 Super Nano Lite (x64).cvbi", "rom_avail": true, @@ -1802,7 +1802,7 @@ }, { "rom_name": "Windows 7 Super Nano Lite (x86)", - "rom_icon": "https://upload.wikimedia.org/wikipedia/de/thumb/c/c2/Microsoft_Windows_7_logo.svg/2296px-Microsoft_Windows_7_logo.svg.png", + "rom_icon": "https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/10/15/windows_logo_2006_1_c0e5e8a8271301cfed289ab6118e38b2.png", "rom_url": "https://anbui.ovh/get/vec/community/win/nt6/7snlx86.html", "rom_path": "Windows 7 Super Nano Lite (x86).cvbi", "rom_avail": true, @@ -1982,7 +1982,7 @@ }, { "rom_name": "Windows 95", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Windows_Logo_%281992-2001%29.svg/2368px-Windows_Logo_%281992-2001%29.svg.png", + "rom_icon": "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/f4c4498f-f0a5-4c50-aed5-5ac63c62a584/dfh0l57-c8831536-3a32-4afa-991e-7d53b23c6e7d.png/v1/fill/w_970,h_824/windows_98_logo_by_itzzezzo_dfh0l57-pre.png?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTI4MiIsInBhdGgiOiIvZi9mNGM0NDk4Zi1mMGE1LTRjNTAtYWVkNS01YWM2M2M2MmE1ODQvZGZoMGw1Ny1jODgzMTUzNi0zYTMyLTRhZmEtOTkxZS03ZDUzYjIzYzZlN2QucG5nIiwid2lkdGgiOiI8PTE1MTAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.W6fmE2AyFTMXuc7rFBDGAuQEi36q7NlgoNPvu8aH0D0", "rom_url": "https://anbui.ovh/get/vec/community/win/msdos/w95.html", "rom_path": "Windows 95.cvbi", "rom_avail": true, @@ -2000,7 +2000,7 @@ }, { "rom_name": "Windows 98 Plus!", - "rom_icon": "https://www.getmyos.com/upload/files/2018/10/04/windows_logo_1995_1_21eb221818c6620a5391a14ce1b0fc51.png", + "rom_icon": "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/f4c4498f-f0a5-4c50-aed5-5ac63c62a584/dfh0l57-c8831536-3a32-4afa-991e-7d53b23c6e7d.png/v1/fill/w_970,h_824/windows_98_logo_by_itzzezzo_dfh0l57-pre.png?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTI4MiIsInBhdGgiOiIvZi9mNGM0NDk4Zi1mMGE1LTRjNTAtYWVkNS01YWM2M2M2MmE1ODQvZGZoMGw1Ny1jODgzMTUzNi0zYTMyLTRhZmEtOTkxZS03ZDUzYjIzYzZlN2QucG5nIiwid2lkdGgiOiI8PTE1MTAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.W6fmE2AyFTMXuc7rFBDGAuQEi36q7NlgoNPvu8aH0D0", "rom_url": "https://www.mediafire.com/file/8cndpbaaallbqws/98PLUS%2521.qcow2/file", "rom_path": "98PLUS!.qcow2", "rom_avail": true, @@ -2054,7 +2054,7 @@ }, { "rom_name": "Windows Longhorn build 4001", - "rom_icon": "https://ia903405.us.archive.org/5/items/winlonghorn/longhorn.png", + "rom_icon": "https://static.wikia.nocookie.net/windows-vista-dies/images/5/54/Windows_Longhorn.png/revision/latest?cb=20230924004845", "rom_url": "https://youtu.be/bVcPAdV3fk0", "rom_path": "Windows Longhorn build 4001.cvbi", "rom_avail": true,