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 @@ + + + + + +