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 a581b5d..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
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">
+ {
+ 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/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/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/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": "