diff --git a/3dfx/3dfx-wrappers-3.4.9.iso b/3dfx/3dfx-wrappers-3.5.0.iso
similarity index 99%
rename from 3dfx/3dfx-wrappers-3.4.9.iso
rename to 3dfx/3dfx-wrappers-3.5.0.iso
index c16eb10..7595a48 100644
Binary files a/3dfx/3dfx-wrappers-3.4.9.iso and b/3dfx/3dfx-wrappers-3.5.0.iso differ
diff --git a/README.md b/README.md
index f157dbb..91bddf3 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,8 @@ We publish a **new beta release after every commit** — so you can always test
### Bootstraps
QEMU 9.2.4 - 3dfx:
-- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.4.9/base-vectras-vm-arm64-v8a.tar.gz)
+- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-nosve-vectras-vm-arm64-v8a.tar.gz)
+- [x86_64 (for PC)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.5.0/base-vectras-vm-x86_64.tar.gz)
QEMU 9.2.2 - 3dfx:
- [arm64 (for phone or tablet)](https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases/download/3.2.9/base-vectras-vm-arm64-v8a.tar.gz)
@@ -83,7 +84,7 @@ QEMU 8.2.0 - 3dfx:
### 3Dfx Wrappers
-- [For QEMU 9.2.2 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.4.7.iso)
+- [For QEMU 9.2.4 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.5.0.iso)
- [For QEMU 8.2.0 - 3dfx](https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-2.9.5.iso)
# Donate
diff --git a/app/build.gradle b/app/build.gradle
index 9fa981c..dd34246 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@ android {
applicationId "com.vectras.vm"
minSdk minApi
targetSdk targetApi
- versionCode 53
- versionName "3.4.9"
+ versionCode 54
+ versionName "3.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
@@ -110,7 +110,7 @@ dependencies {
implementation 'com.airbnb.android:lottie:6.7.1'
implementation 'org.apache.commons:commons-compress:1.28.0'
// implementation 'com.google.firebase:firebase-crashlytics-buildtools:3.0.6'
- implementation 'androidx.activity:activity-ktx:1.12.1'
+ implementation 'androidx.activity:activity-ktx:1.12.2'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation "androidx.documentfile:documentfile:1.1.0"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5f8108c..7d18432 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
+
@@ -23,7 +24,6 @@
-
@@ -49,6 +49,9 @@
android:requestLegacyExternalStorage="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
+ = 34) {
- params.add("-monitor");
- params.add("stdio");
- }
+ params.add(MainSettingsManager.getUseSdl(activity) ? "sdl" : "gtk");
+ params.add("-monitor");
+ params.add(MainSettingsManager.getRunQemuWithXterm(activity) ? "stdio" : "vc");
}
//params.add("-full-screen");
diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java
index 5d496f8..e7e60f2 100644
--- a/app/src/main/java/com/vectras/vm/VMManager.java
+++ b/app/src/main/java/com/vectras/vm/VMManager.java
@@ -37,6 +37,7 @@ import com.vectras.qemu.utils.QmpClient;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.main.core.MainStartVM;
import com.vectras.vm.settings.VNCSettingsActivity;
+import com.vectras.vm.settings.X11DisplaySettingsActivity;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.JSONUtils;
@@ -648,6 +649,22 @@ public class VMManager {
_activity.stopService(new Intent(_activity, MainService.class));
isQemuStopedWithError = true;
return true;
+ } else if (_result.contains("mesapt: invalid sdl display")) {
+ DialogUtils.twoDialog(_activity,
+ _activity.getResources().getString(R.string.problem_has_been_detected),
+ _activity.getResources().getString(R.string.you_need_to_switch_to_sdl_to_use_3dfx),
+ _activity.getString(R.string.go_to_settings),
+ _activity.getString(R.string.close),
+ true,
+ R.drawable.desktop_24px,
+ true,
+ () -> {
+ Intent intent = new Intent();
+ intent.setClass(_activity, X11DisplaySettingsActivity.class);
+ _activity.startActivity(intent);
+ },
+ null, null);
+ return false;
} else if (_command.contains("qemu-system") && _result.contains("qemu-system") && !_result.contains("warning:")) {
//Error code: UNKNOW_ERROR
DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.vm_could_not_be_run_content) + "\n\n" + _result, R.drawable.error_96px);
diff --git a/app/src/main/java/com/vectras/vm/WebViewActivity.java b/app/src/main/java/com/vectras/vm/WebViewActivity.java
new file mode 100644
index 0000000..4db4d7f
--- /dev/null
+++ b/app/src/main/java/com/vectras/vm/WebViewActivity.java
@@ -0,0 +1,87 @@
+package com.vectras.vm;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.StrictMode;
+import android.transition.TransitionManager;
+import android.view.View;
+import android.webkit.CookieManager;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.vectras.vm.databinding.ActivityWebViewBinding;
+import com.vectras.vm.utils.UIUtils;
+
+import java.util.Objects;
+
+public class WebViewActivity extends AppCompatActivity {
+ ActivityWebViewBinding binding;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ UIUtils.edgeToEdge(this);
+ binding = ActivityWebViewBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+ UIUtils.setOnApplyWindowInsetsListener(binding.main);
+
+ StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
+ StrictMode.setVmPolicy(builder.build());
+
+ binding.webview.getSettings().setJavaScriptEnabled(true);
+ CookieManager.getInstance().setAcceptCookie(true);
+ binding.webview.getSettings().setBuiltInZoomControls(true);
+ binding.webview.getSettings().setDisplayZoomControls(false);
+ binding.webview.getSettings().setAllowFileAccess(true);
+ binding.webview.getSettings().setDatabaseEnabled(true);
+ binding.webview.getSettings().setDomStorageEnabled(true);
+
+ if (getIntent().hasExtra("url") && getIntent().getStringExtra("url") != null)
+ binding.webview.loadUrl(Objects.requireNonNull(getIntent().getStringExtra("url")));
+ else
+ binding.webview.loadUrl(AppConfig.vectrasWebsite);
+
+ binding.webview.setWebViewClient(new WebViewClient() {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
+ Uri url = request.getUrl();
+ String scheme = url.getScheme();
+ if ("file".equals(scheme) || "http".equals(scheme) || "https".equals(scheme)) {
+ return false;
+ }
+ return true;
+ }
+ });
+
+ binding.webview.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
+ if (scrollY > oldScrollY) {
+ if (binding.btnClose.getVisibility() == View.VISIBLE) {
+ TransitionManager.beginDelayedTransition(binding.main);
+ binding.btnClose.setVisibility(View.GONE);
+ }
+ } else if (scrollY < oldScrollY) {
+ if (binding.btnClose.getVisibility() == View.GONE) {
+ TransitionManager.beginDelayedTransition(binding.main);
+ binding.btnClose.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+
+ binding.btnClose.setOnClickListener(v -> finish());
+
+ getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+ @Override
+ public void handleOnBackPressed() {
+ if (binding.webview.canGoBack()) {
+ binding.webview.goBack();
+ } else {
+ finish();
+ }
+ }
+ });
+ }
+}
\ No newline at end of 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 989794c..fa6eeff 100644
--- a/app/src/main/java/com/vectras/vm/main/MainActivity.java
+++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java
@@ -42,6 +42,7 @@ import com.vectras.vm.AppConfig;
import com.vectras.vm.VMCreatorActivity;
import com.vectras.vm.Minitools;
import com.vectras.vm.R;
+import com.vectras.vm.WebViewActivity;
import com.vectras.vm.databinding.ActivityMainBinding;
import com.vectras.vm.databinding.ActivityMainContentBinding;
import com.vectras.vm.main.softwarestore.SoftwareStoreFragment;
@@ -245,10 +246,7 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
public void handleOnBackPressed() {
if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
binding.drawerLayout.closeDrawer(GravityCompat.START);
- //Prevent apps from exiting after the drawer is closed.
- return;
- }
- if (binding.searchview.isShowing()) {
+ } else if (binding.searchview.isShowing()) {
binding.searchview.hide();
} else if (bindingContent.bottomNavigation.getSelectedItemId() != R.id.item_home) {
bindingContent.bottomNavigation.setSelectedItemId(R.id.item_home);
@@ -411,6 +409,16 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
Intent intent = new Intent();
intent.setClass(this, Minitools.class);
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");
+ intent.setClass(this, WebViewActivity.class);
+ } else {
+ intent.setAction(ACTION_VIEW);
+ intent.setData(Uri.parse("https://www.qemu.org/docs/master/"));
+ }
+ startActivity(intent);
}
return false;
});
diff --git a/app/src/main/java/com/vectras/vm/settings/X11DisplaySettingsActivity.java b/app/src/main/java/com/vectras/vm/settings/X11DisplaySettingsActivity.java
index 538016a..aa3fd6b 100644
--- a/app/src/main/java/com/vectras/vm/settings/X11DisplaySettingsActivity.java
+++ b/app/src/main/java/com/vectras/vm/settings/X11DisplaySettingsActivity.java
@@ -35,6 +35,7 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
private void initialize() {
binding.swEnabled.setChecked(MainSettingsManager.getVmUi(this).equals("X11"));
binding.swRunQemuWithXterm.setChecked(MainSettingsManager.getRunQemuWithXterm(this));
+ binding.swUseSdl.setChecked(MainSettingsManager.getUseSdl(this));
binding.swEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
MainSettingsManager.setVmUi(this, isChecked ? "X11" : "VNC");
@@ -58,6 +59,9 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
binding.swRunQemuWithXterm.setOnCheckedChangeListener((buttonView, isChecked) -> MainSettingsManager.setRunQemuWithXterm(this, isChecked));
binding.lnRunQemuWithXterm.setOnClickListener(v -> binding.swRunQemuWithXterm.toggle());
+ binding.swUseSdl.setOnCheckedChangeListener((buttonView, isChecked) -> MainSettingsManager.setUseSdl(this, isChecked));
+ binding.lnUseSdl.setOnClickListener(v -> binding.swUseSdl.toggle());
+
isInitialized = true;
uiController(binding.swEnabled.isChecked());
@@ -67,5 +71,6 @@ public class X11DisplaySettingsActivity extends AppCompatActivity {
binding.lnAllOptions.setAlpha(isEnabled ? 1f : 0.5f);
binding.lnPreferences.setEnabled(isEnabled);
binding.lnRunQemuWithXterm.setEnabled(isEnabled);
+ binding.lnUseSdl.setEnabled(isEnabled);
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java
index 9d4ecaf..c832578 100644
--- a/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java
+++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java
@@ -58,7 +58,7 @@ public class SetupFeatureCore {
if (isInstalledDistro(context)) return true;
if (Build.SUPPORTED_ABIS[0].contains("64")) {
- return extractSystemFiles(context, "alpine22", "distro");
+ return extractSystemFiles(context, "alpine19", "distro");
} else {
return extractSystemFiles(context, "alpine21", "distro");
}
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 5fba168..9e9b4fd 100644
--- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java
+++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java
@@ -458,7 +458,10 @@ public class SetupWizard2Activity extends AppCompatActivity {
" echo \"Starting setup...\";" +
" apk update;" +
" echo \"Installing packages...\";" +
- " apk add " + (DeviceUtils.is64bit() ? AppConfig.neededPkgs : AppConfig.neededPkgs32bit) + ";" +
+ " apk add " + (DeviceUtils.is64bit() ? (
+ DeviceUtils.isArm() ? AppConfig.neededPkgs :
+ AppConfig.neededPkgs.replace("mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno", ""))
+ : AppConfig.neededPkgs32bit) + ";" +
" echo \"Downloading Qemu...\";";
if (isCustomSetupMode) {
diff --git a/app/src/main/java/com/vectras/vm/utils/CommandUtils.java b/app/src/main/java/com/vectras/vm/utils/CommandUtils.java
index d822ef8..0b6d924 100644
--- a/app/src/main/java/com/vectras/vm/utils/CommandUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/CommandUtils.java
@@ -7,8 +7,8 @@ import com.vectras.vterm.Terminal;
public class CommandUtils {
public static String createForSelectedMirror(boolean _https, String _url, String _beforemain) {
- String command = "echo \"\" > /etc/apk/repositories && sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/edge/testing\" /etc/apk/repositories && sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/"
- + (DeviceUtils.is64bit() ? "v3.22" : "v3.21") + "/community\" /etc/apk/repositories && sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/v3.22/main\" /etc/apk/repositories";
+ String command = "echo \"\" > /etc/apk/repositories && " + (DeviceUtils.is64bit() ? "" : "sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/edge/testing\" /etc/apk/repositories && ") + "sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/"
+ + (DeviceUtils.is64bit() ? "v3.19" : "v3.21") + "/community\" /etc/apk/repositories && sed -i -e \"1ihttps://xssFjnj58Id/yttGkok69Je/" + (DeviceUtils.is64bit() ? "v3.19" : "v3.21") + "/main\" /etc/apk/repositories";
command = command.replaceAll("/yttGkok69Je", _beforemain);
if (!_https)
diff --git a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
index 6df0ffd..55924a0 100644
--- a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
@@ -61,7 +61,10 @@ public class DeviceUtils {
}
public static boolean is64bit() {
- return Build.SUPPORTED_ABIS[0].contains("arm64");
+ return Build.SUPPORTED_ABIS[0].contains("64");
+ }
+ public static boolean isArm() {
+ return Build.SUPPORTED_ABIS[0].contains("arm");
}
public static boolean isLargeScreen(Context context) {
diff --git a/app/src/main/res/drawable/docs_24px.xml b/app/src/main/res/drawable/docs_24px.xml
new file mode 100644
index 0000000..c6f7bc7
--- /dev/null
+++ b/app/src/main/res/drawable/docs_24px.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_web_view.xml b/app/src/main/res/layout/activity_web_view.xml
new file mode 100644
index 0000000..4e8416d
--- /dev/null
+++ b/app/src/main/res/layout/activity_web_view.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_x11_display_settings.xml b/app/src/main/res/layout/activity_x11_display_settings.xml
index 64e06f2..7bb0aba 100644
--- a/app/src/main/res/layout/activity_x11_display_settings.xml
+++ b/app/src/main/res/layout/activity_x11_display_settings.xml
@@ -75,7 +75,8 @@
android:id="@+id/ln_run_qemu_with_xterm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/object_shape_bottom_high"
+ android:layout_marginBottom="2dp"
+ android:background="@drawable/object_shape_middle_high"
android:padding="16dp" >
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/home_drawer_menu.xml b/app/src/main/res/menu/home_drawer_menu.xml
index bde9231..4a93552 100644
--- a/app/src/main/res/menu/home_drawer_menu.xml
+++ b/app/src/main/res/menu/home_drawer_menu.xml
@@ -35,6 +35,10 @@
android:id="@+id/navigation_item_help"
android:icon="@drawable/help_24px"
android:title="@string/help"/>
+ Shared by
System updateYou are using an older system, update now.
+ Use SDL
+ Turn it on if you want to use 3dfx and play old retro games.
+ QEMU documentation
+ You need to switch to SDL to use 3dfx.
diff --git a/build.gradle b/build.gradle
index f9888e1..d0bcbc0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
- kotlin_version = '2.2.21'
+ kotlin_version = '2.3.0'
}
repositories {
mavenCentral()
@@ -13,7 +13,7 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// Android Gradle plugin
// Add other classpaths like Google Services and Firebase Crashlytics if needed here.
- classpath 'com.google.gms:google-services:4.4.3' // assuming you need it for your project
+ classpath 'com.google.gms:google-services:4.4.4' // assuming you need it for your project
classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.6'
// assuming you need it for project
}
diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json
index 75b67d7..7878d83 100644
--- a/web/data/UpdateConfig.json
+++ b/web/data/UpdateConfig.json
@@ -1,15 +1,15 @@
{
- "versionCode":"44",
- "versionName":"3.4.0",
- "size": "55 MB",
+ "versionCode":"54",
+ "versionName":"3.5.0",
+ "size": "46 MB",
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases",
- "Message": "
3.4.0
\n- Fixed the issue of exporting rom with virtual machine ID.\n- New dialog for copying files in creating new virtual machine.\n- New dialog showing information after successful rom import.\n- Fixed no sound playing with Termux.\n- Fixed invalid file path error when using Manual setup.\n- Fixed dialog showing content without line breaks.\n- Fixed rom export error.\n- Added Processes to System monitor.\n- Improved interface.\n- Thinner fonts.\n- Fixed an issue with interaction in Rom store.\n- Fixed the External VNC Server switch being incorrect in certain cases.\n- Removed unnecessary resources.\n- Updated Chinese (Simplified) language (contributed by @WeiguangTWK).\n- Fixed issue with installing system files after not completing the first time.\n- New setup wizard.\n- Added auto return to Home after importing rom and creating virtual machine in Rom store.\n- Improved image viewer.\n- Fixed Unknow display error in architecture in rom info if it is PowerPC architecture.\n- New setup wizard interface that automatically changes according to screen size.\n- New ID generator for virtual machine.\n- Added dialog when deleting virtual machine.",
+ "Message": "