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 }