diff --git a/README.md b/README.md
index 25288c2..8c9e4f5 100644
--- a/README.md
+++ b/README.md
@@ -109,7 +109,7 @@ QEMU 8.2.0 - 3dfx (only for Vectras VM 2.9.5):
Vectras VM is on the Play Store with the new Qemu 10, it runs natively on Android instead of requiring proot like the version on GitHub. Try it now!
-
+
# 💕 Donate
diff --git a/app/build.gradle b/app/build.gradle
index 5aaceaa..2d824dd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "com.vectras.vm"
minSdk minApi
targetSdk targetApi
- versionCode 99
- versionName "3.9.5"
+ versionCode 100
+ versionName "3.9.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
diff --git a/app/src/main/java/com/vectras/qemu/utils/RamInfo.java b/app/src/main/java/com/vectras/qemu/utils/RamInfo.java
index c8857b2..c61826b 100644
--- a/app/src/main/java/com/vectras/qemu/utils/RamInfo.java
+++ b/app/src/main/java/com/vectras/qemu/utils/RamInfo.java
@@ -28,6 +28,13 @@ public class RamInfo {
int freeRamInt = safeLongToInt(freeMem);
int totalRamInt = safeLongToInt(totalMem);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+
+ try {
+ String temp = prefs.getString("memory", "256");
+ } catch (ClassCastException e) {
+ prefs.edit().putString("memory", String.valueOf(prefs.getInt("memory", 256))).apply();
+ }
+
if (prefs.getBoolean("customMemory", false) && TextUtils.isNumberOnly(prefs.getString("memory", "256"))) {
if (Long.parseLong(prefs.getString("memory", "256")) > totalMem) {
prefs.edit().putString("memory", String.valueOf(totalRamInt / 2)).apply();
diff --git a/app/src/main/java/com/vectras/vm/AppConfig.java b/app/src/main/java/com/vectras/vm/AppConfig.java
index 4d089bc..95e8032 100644
--- a/app/src/main/java/com/vectras/vm/AppConfig.java
+++ b/app/src/main/java/com/vectras/vm/AppConfig.java
@@ -74,7 +74,6 @@ public class AppConfig {
public static String vmFolder = maindirpath + "roms/";
public static String importedDriveFolder = maindirpath + "drive/";
public static String cvbiFolder = maindirpath + "cvbi/";
- public static String pendingCommand = "";
public static String lastCrashLogPath = internalDataDirPath + "logs/lastcrash.txt";
public static String neededPkgs() {
diff --git a/app/src/main/java/com/vectras/vm/CqcmActivity.java b/app/src/main/java/com/vectras/vm/CqcmActivity.java
index e817440..8730d75 100644
--- a/app/src/main/java/com/vectras/vm/CqcmActivity.java
+++ b/app/src/main/java/com/vectras/vm/CqcmActivity.java
@@ -15,6 +15,7 @@ import androidx.core.app.ActivityCompat;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.vectras.vm.main.MainActivity;
+import com.vectras.vm.main.core.PendingCommand;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.JSONUtils;
import com.vectras.vm.utils.PermissionUtils;
@@ -24,6 +25,8 @@ import java.util.HashMap;
import java.util.Objects;
public class CqcmActivity extends AppCompatActivity {
+ private final String TAG = "CqcmActivity";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -133,7 +136,9 @@ public class CqcmActivity extends AppCompatActivity {
}
private void runCommand(String _command) {
- AppConfig.pendingCommand = _command;
+ Log.i(TAG, "runCommand: " + _command);
+
+ PendingCommand.command = _command;
if (!MainActivity.isActivate) {
startActivity(new Intent(this, SplashActivity.class));
diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java
index b1e409f..86a89a1 100644
--- a/app/src/main/java/com/vectras/vm/VMManager.java
+++ b/app/src/main/java/com/vectras/vm/VMManager.java
@@ -24,6 +24,8 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.NotificationCompat;
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 563f95a..c71a275 100644
--- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java
+++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java
@@ -243,7 +243,8 @@ public class VMCreatorActivity extends AppCompatActivity {
binding.cbvShowbootmenu.setOnCheckedChangeListener((v, isChecked) -> isShowBootMenu = isChecked);
binding.cbvUseuefi.setOnCheckedChangeListener((v, isChecked) -> isUseUefi = isChecked);
- if (!MainSettingsManager.getArch(this).equals("X86_64")) binding.cbvUseuefi.setVisibility(View.GONE);
+ if (!MainSettingsManager.getArch(this).equals("X86_64"))
+ binding.cbvUseuefi.setVisibility(View.GONE);
binding.sbvBootfrom.setOnClickListener(v -> VMCreatorSelector.bootFrom(this, bootFrom, ((position, name, value) -> {
bootFrom = position;
@@ -363,7 +364,7 @@ public class VMCreatorActivity extends AppCompatActivity {
if (isProcessingFile) return;
if (!created && !modify) {
- new Thread(() -> FileUtils.delete(new File (AppConfig.vmFolder + vmID))).start();
+ new Thread(() -> FileUtils.delete(new File(AppConfig.vmFolder + vmID))).start();
}
modify = false;
finish();
@@ -431,32 +432,36 @@ public class VMCreatorActivity extends AppCompatActivity {
}
});
} else {
- if (!FileUtils.isValidFilePath(this, FileUtils.getPath(this, uri), false)) {
- DialogUtils.oneDialog(this,
- getString(R.string.problem_has_been_detected),
- getString(R.string.invalid_file_path_content),
- getString(R.string.ok),
- true,
- R.drawable.warning_48px,
- true,
- null,
- null);
- return;
- }
- File selectedFilePath = new File(getPath(uri));
- if (selectedFilePath.getName().endsWith(".iso")) {
- binding.cdrom.setText(selectedFilePath.getPath());
- } else {
- DialogUtils.oneDialog(this,
- getString(R.string.problem_has_been_detected),
- getString(R.string.invalid_iso_file_path_content),
- getString(R.string.ok),
- true,
- R.drawable.warning_48px,
- true,
- null,
- null);
- }
+ executor.execute(() -> {
+ if (!FileUtils.isValidFilePath(this, FileUtils.getPath(this, uri), false)) {
+ runOnUiThread(() -> DialogUtils.oneDialog(this,
+ getString(R.string.problem_has_been_detected),
+ getString(R.string.invalid_file_path_content),
+ getString(R.string.ok),
+ true,
+ R.drawable.warning_48px,
+ true,
+ null,
+ null)
+ );
+ return;
+ }
+ File selectedFilePath = new File(getPath(uri));
+ if (selectedFilePath.getName().endsWith(".iso")) {
+ runOnUiThread(() -> binding.cdrom.setText(selectedFilePath.getPath()));
+ } else {
+ runOnUiThread(() -> DialogUtils.oneDialog(this,
+ getString(R.string.problem_has_been_detected),
+ getString(R.string.invalid_iso_file_path_content),
+ getString(R.string.ok),
+ true,
+ R.drawable.warning_48px,
+ true,
+ null,
+ null)
+ );
+ }
+ });
}
});
@@ -778,7 +783,7 @@ public class VMCreatorActivity extends AppCompatActivity {
}
});
} else {
- runOnUiThread(() ->startProcessingHardDriveFile(_content_describer, _addtodrive));
+ runOnUiThread(() -> startProcessingHardDriveFile(_content_describer, _addtodrive));
}
}).start();
}
@@ -1026,7 +1031,8 @@ public class VMCreatorActivity extends AppCompatActivity {
}
//It can be deleted because there are few users of the old version.
- if (!_filename.replace(".cvbi", "").isEmpty()) FileUtils.move(AppConfig.vmFolder + _filename.replace(".cvbi", ""), AppConfig.vmFolder + vmID);
+ if (!_filename.replace(".cvbi", "").isEmpty())
+ FileUtils.move(AppConfig.vmFolder + _filename.replace(".cvbi", ""), AppConfig.vmFolder + vmID);
if (!jObj.has("drive") && !jObj.has("cdrom") && !jObj.has("qemu")) {
DialogUtils.oneDialog(this, getResources().getString(R.string.problem_has_been_detected), getResources().getString(R.string.this_rom_is_missing_too_much_information), R.drawable.warning_24px);
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 0843839..3b437f4 100644
--- a/app/src/main/java/com/vectras/vm/main/MainActivity.java
+++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java
@@ -11,7 +11,6 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.os.StrictMode;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
@@ -110,7 +109,12 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
private SoftwareStoreHomeAdapter adapterSoftwareStore;
private final List listSearchData = new ArrayList<>();
private LinearLayoutManager layoutManager;
- private final VmsFragment vmsFragment = new VmsFragment();
+ private VmsFragment vmsFragment() {
+ VmsFragment fragment = (VmsFragment) getSupportFragmentManager()
+ .findFragmentByTag(TAG_VMS_FRAGMENT);
+ if (fragment == null) fragment = new VmsFragment();
+ return fragment;
+ }
private Fragment currentFragment;
private boolean isInVmsFragment = true;
@@ -176,7 +180,8 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
- .replace(bindingContent.containerView.getId(), vmsFragment, TAG_VMS_FRAGMENT)
+ .replace(bindingContent.containerView.getId(),
+ new VmsFragment(), TAG_VMS_FRAGMENT)
.commit();
}
@@ -201,6 +206,7 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
bindingContent.bottomNavigation.setOnItemSelectedListener(item -> {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
+ VmsFragment vms = vmsFragment();
String selectedTag;
int id = item.getItemId();
@@ -213,11 +219,11 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
}
if (id == R.id.item_home) {
- if (!vmsFragment.isAdded()) {
- fragmentTransaction.add(bindingContent.containerView.getId(), vmsFragment, TAG_VMS_FRAGMENT);
+ if (!vms.isAdded()) {
+ fragmentTransaction.add(bindingContent.containerView.getId(), vms, TAG_VMS_FRAGMENT);
}
- fragmentTransaction.show(vmsFragment);
+ fragmentTransaction.show(vms);
if (!isInVmsFragment && currentFragment != null) {
fragmentTransaction.remove(currentFragment);
}
@@ -226,7 +232,7 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
bindingContent.searchbar.setHint(getText(R.string.home));
bindingContent.searchbar.setEnabled(false);
} else {
- fragmentTransaction.hide(vmsFragment);
+ fragmentTransaction.hide(vms);
Fragment selectedFragment;
if (id == R.id.item_romstore) {
diff --git a/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java
index 2833128..7e70a67 100644
--- a/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java
+++ b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java
@@ -1,6 +1,7 @@
package com.vectras.vm.main.core;
import android.app.Activity;
+import android.util.Log;
import android.widget.Toast;
import com.vectras.qemu.Config;
@@ -12,10 +13,15 @@ import com.vectras.vm.utils.DialogUtils;
import com.vectras.vterm.Terminal;
public class PendingCommand {
+ private static final String TAG = "PendingCommand";
+ public static String command = "";
+
public static void runNow(Activity activity) {
- if (!AppConfig.pendingCommand.isEmpty()) {
- if (!VMManager.isthiscommandsafe(AppConfig.pendingCommand, activity)) {
- AppConfig.pendingCommand = "";
+ Log.i(TAG, command);
+
+ if (!command.isEmpty()) {
+ if (!VMManager.isthiscommandsafe(command, activity)) {
+ command = "";
DialogUtils.oneDialog(
activity,
activity.getString(R.string.problem_has_been_detected),
@@ -28,8 +34,8 @@ public class PendingCommand {
null
);
} else {
- if (AppConfig.pendingCommand.startsWith("qemu-img")) {
- if (!VMManager.isthiscommandsafeimg(AppConfig.pendingCommand, activity)) {
+ if (command.startsWith("qemu-img")) {
+ if (!VMManager.isthiscommandsafeimg(command, activity)) {
DialogUtils.oneDialog(activity,
activity.getString(R.string.problem_has_been_detected),
activity.getString(R.string.size_too_large_try_qcow2_format),
@@ -42,22 +48,26 @@ public class PendingCommand {
);
} else {
Terminal _vterm = new Terminal(activity);
- _vterm.executeShellCommand2(AppConfig.pendingCommand, false, activity);
+ _vterm.executeShellCommand2(command, false, activity);
Toast.makeText(activity, activity.getResources().getString(R.string.done), Toast.LENGTH_LONG).show();
}
+
+ command = "";
} else {
+ Log.i(TAG, "Run VM...");
+
com.vectras.vm.StartVM.cdrompath = "";
Config.vmID = VMManager.idGenerator();
new Thread(() -> {
- String env = StartVM.env(activity, AppConfig.pendingCommand, "", true);
+ String env = StartVM.env(activity, command, "", true);
activity.runOnUiThread(() -> {
MainStartVM.startNow(activity, "Quick run", env, Config.vmID, null);
- VMManager.lastQemuCommand = AppConfig.pendingCommand;
+ VMManager.lastQemuCommand = command;
+ command = "";
});
}).start();
}
}
- AppConfig.pendingCommand = "";
}
}
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5e578f8..ffb7a1a 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,7 +1,7 @@
[versions]
activityKtx = "1.13.0"
-agp = "9.1.0"
-annotation = "1.9.1"
+agp = "9.1.1"
+annotation = "1.10.0"
appcompat = "1.7.1"
comGoogleFirebase = "firebase-crashlytics"
commonsCompress = "1.28.0"
@@ -11,15 +11,15 @@ coreKtx = "1.18.0"
documentfile = "1.1.0"
drawerlayout = "1.2.0"
espressoCore = "3.7.0"
-firebaseBom = "34.11.0"
-firebaseCrashlyticsGradle = "3.0.6"
+firebaseBom = "34.12.0"
+firebaseCrashlyticsGradle = "3.0.7"
firebaseMessaging = "25.0.1"
glide = "5.0.5"
googleFirebase = "firebase-analytics"
-googleFirebaseCrashlytics = "3.0.6"
+googleFirebaseCrashlytics = "3.0.7"
googleGmsGoogleServices = "4.4.4"
googleServices = "4.4.4"
-gradle = "9.1.0"
+gradle = "9.1.1"
gradleToolchainsFoojayResolverConvention = "1.0.0"
gson = "2.13.2"
guava = "33.5.0-jre"
@@ -27,7 +27,7 @@ junit = "4.13.2"
junitVersion = "1.3.0"
kotlinGradlePlugin = "2.3.20"
lottie = "6.7.1"
-material = "1.14.0-alpha10"
+material = "1.14.0-beta01"
preferenceKtx = "1.2.1"
retrofit2 = "3.0.0"
swiperefreshlayout = "1.2.0"
diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json
index 4943365..ce8fa7b 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": "3.9.0
\nBugs fixed.",
"cancellable": true,
- "versionCodeBeta":"99",
- "versionNameBeta":"3.9.5",
- "versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,3.7.8,3.7.9,3.8.0,3.8.1,3.8.2,3.8.3,3.8.4,3.8.5,3.8.6,3.8.7,3.8.8,3.8.9,3.9.0,3.9.1,3.9.2,3.9.3,3.9.4,3.9.5",
+ "versionCodeBeta":"100",
+ "versionNameBeta":"3.9.6",
+ "versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,3.7.8,3.7.9,3.8.0,3.8.1,3.8.2,3.8.3,3.8.4,3.8.5,3.8.6,3.8.7,3.8.8,3.8.9,3.9.0,3.9.1,3.9.2,3.9.3,3.9.4,3.9.5,3.9.6",
"sizeBeta": "45 MB",
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
- "MessageBeta": "3.9.5
Bugs fixed.",
+ "MessageBeta": "3.9.6
Bugs fixed.",
"cancellableBeta": true
}