diff --git a/app/build.gradle b/app/build.gradle index 9ae0a6d..65ed3b9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk minApi targetSdk targetApi versionCode 17 - versionName "v2.9.1-thunderbird" + versionName "v2.9.1-firefox" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true } diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index a2e9aef..7888bc9 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 17, - "versionName": "v2.9.1-thunderbird", + "versionName": "v2.9.1-firefox", "outputFile": "app-universal-release.apk" }, { @@ -25,7 +25,7 @@ ], "attributes": [], "versionCode": 17, - "versionName": "v2.9.1-thunderbird", + "versionName": "v2.9.1-firefox", "outputFile": "app-x86_64-release.apk" }, { @@ -38,7 +38,7 @@ ], "attributes": [], "versionCode": 17, - "versionName": "v2.9.1-thunderbird", + "versionName": "v2.9.1-firefox", "outputFile": "app-arm64-v8a-release.apk" } ], diff --git a/app/src/main/java/com/vectras/vm/CustomRomActivity.java b/app/src/main/java/com/vectras/vm/CustomRomActivity.java index b006f48..3e928f7 100644 --- a/app/src/main/java/com/vectras/vm/CustomRomActivity.java +++ b/app/src/main/java/com/vectras/vm/CustomRomActivity.java @@ -93,6 +93,8 @@ public class CustomRomActivity extends AppCompatActivity { public static DataMainRoms current; + private SharedPreferences getAppConfigData; + public void onStart() { super.onStart(); } @@ -143,6 +145,7 @@ public class CustomRomActivity extends AppCompatActivity { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); setTitle("Rom Options"); + getAppConfigData = getSharedPreferences("appconfig", MODE_PRIVATE); AdView mAdView = findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); @@ -331,7 +334,7 @@ public class CustomRomActivity extends AppCompatActivity { if (modify) { int position = getIntent().getIntExtra("POS", 0); - final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json"); + final File jsonFile = new File(getAppConfigData.getString("maindirpath","") + "roms-data" + ".json"); current.itemDrv1 = drive.getText().toString(); current.itemExtra = qemu.getText().toString(); try { @@ -364,7 +367,7 @@ public class CustomRomActivity extends AppCompatActivity { editor.putBoolean("isFirstLaunch", Boolean.TRUE); editor.apply(); loadingPb.setVisibility(View.VISIBLE); - final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json"); + final File jsonFile = new File(getAppConfigData.getString("maindirpath","") + "roms-data" + ".json"); RomsJso obj = new RomsJso(); if (jsonFile.exists()) { try { @@ -549,7 +552,7 @@ public class CustomRomActivity extends AppCompatActivity { super.onActivityResult(requestCode, resultCode, ReturnedIntent); if (title.getText().toString().length() > 0) { - File romDir = new File(AppConfig.maindirpath + title.getText().toString()); + File romDir = new File(getAppConfigData.getString("maindirpath","") + title.getText().toString()); romDir.mkdirs(); } @@ -581,13 +584,13 @@ public class CustomRomActivity extends AppCompatActivity { } finally { try { try { - SaveImage(selectedImage, new File(AppConfig.maindirpath + "icons"), title.getText().toString() + "-" + selectedFilePath.getName()); + SaveImage(selectedImage, new File(getAppConfigData.getString("maindirpath","") + "icons"), title.getText().toString() + "-" + selectedFilePath.getName()); } finally { Runnable runnable = new Runnable() { @Override public void run() { loadingPb.setVisibility(View.GONE); - icon.setText(AppConfig.maindirpath + "icons" + "/" + title.getText().toString() + "-" + selectedFilePath.getName()); + icon.setText(getAppConfigData.getString("maindirpath","") + "icons" + "/" + title.getText().toString() + "-" + selectedFilePath.getName()); } }; activity.runOnUiThread(runnable); @@ -610,7 +613,7 @@ public class CustomRomActivity extends AppCompatActivity { } else if (requestCode == 1002 && resultCode == RESULT_OK) { Uri content_describer = ReturnedIntent.getData(); File selectedFilePath = new File(getPath(content_describer)); - drive.setText(AppConfig.maindirpath + title.getText().toString() + "/" + selectedFilePath.getName()); + drive.setText(getAppConfigData.getString("maindirpath","") + title.getText().toString() + "/" + selectedFilePath.getName()); loadingPb.setVisibility(View.VISIBLE); custom.setVisibility(View.GONE); new Thread(new Runnable() { @@ -624,7 +627,7 @@ public class CustomRomActivity extends AppCompatActivity { } try { try { - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + title.getText().toString() + "/" + selectedFilePath.getName())); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + title.getText().toString() + "/" + selectedFilePath.getName())); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; @@ -665,7 +668,7 @@ public class CustomRomActivity extends AppCompatActivity { Uri content_describer = ReturnedIntent.getData(); File selectedFilePath = new File(getPath(content_describer)); if (selectedFilePath.getName().endsWith(".iso")) { - String cdromPath = AppConfig.maindirpath + title.getText().toString() + "/" + selectedFilePath.getName(); + String cdromPath = getAppConfigData.getString("maindirpath","") + title.getText().toString() + "/" + selectedFilePath.getName(); cdrom.setText(cdromPath); String qemuText = qemu.getText().toString(); @@ -695,7 +698,7 @@ public class CustomRomActivity extends AppCompatActivity { } try { try { - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + title.getText().toString() + "/" + selectedFilePath.getName())); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + title.getText().toString() + "/" + selectedFilePath.getName())); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; @@ -746,7 +749,7 @@ public class CustomRomActivity extends AppCompatActivity { FileInputStream zipFile = null; try { zipFile = (FileInputStream) getContentResolver().openInputStream(content_describer); - File targetDirectory = new File(AppConfig.maindirpath + selectedFilePath.getName().replace(".cvbi", "")); + File targetDirectory = new File(getAppConfigData.getString("maindirpath","") + selectedFilePath.getName().replace(".cvbi", "")); ZipInputStream zis = null; zis = new ZipInputStream( new BufferedInputStream(zipFile)); @@ -788,17 +791,17 @@ public class CustomRomActivity extends AppCompatActivity { custom.setVisibility(View.VISIBLE); try { - JSONObject jObj = new JSONObject(FileUtils.readFromFile(MainActivity.activity, new File(AppConfig.maindirpath + JSONObject jObj = new JSONObject(FileUtils.readFromFile(MainActivity.activity, new File(getAppConfigData.getString("maindirpath","") + selectedFilePath.getName().replace(".cvbi", "") + "/rom-data.json"))); title.setText(jObj.getString("title")); - icon.setText(AppConfig.maindirpath + icon.setText(getAppConfigData.getString("maindirpath","") + selectedFilePath.getName().replace(".cvbi", "") + "/" + jObj.getString("icon")); - drive.setText(AppConfig.maindirpath + drive.setText(getAppConfigData.getString("maindirpath","") + selectedFilePath.getName().replace(".cvbi", "") + "/" + jObj.getString("drive")); qemu.setText(jObj.getString("qemu")); ImageView ivIcon = findViewById(R.id.ivIcon); - Bitmap bmImg = BitmapFactory.decodeFile(AppConfig.maindirpath + Bitmap bmImg = BitmapFactory.decodeFile(getAppConfigData.getString("maindirpath","") + selectedFilePath.getName().replace(".cvbi", "") + "/" + jObj.getString("icon")); ivIcon.setImageBitmap(bmImg); UIUtils.UIAlert(activity, "rom by:\n" + jObj.getString("author") + "\n\n" + Html.fromHtml(jObj.getString("desc")), "DESCRIPTION"); @@ -851,7 +854,7 @@ public class CustomRomActivity extends AppCompatActivity { public void onDestroy() { super.onDestroy(); - File lol = new File(AppConfig.maindirpath + drive.getText().toString()); + File lol = new File(getAppConfigData.getString("maindirpath","") + drive.getText().toString()); try { lol.delete(); } catch (Exception e) { diff --git a/app/src/main/java/com/vectras/vm/MainActivity.java b/app/src/main/java/com/vectras/vm/MainActivity.java index 82fd257..dc2f033 100644 --- a/app/src/main/java/com/vectras/vm/MainActivity.java +++ b/app/src/main/java/com/vectras/vm/MainActivity.java @@ -1,6 +1,7 @@ package com.vectras.vm; import static android.content.Intent.ACTION_OPEN_DOCUMENT; +import static android.content.Intent.ACTION_VIEW; import static android.os.Build.VERSION.SDK_INT; import static com.vectras.vm.utils.UIUtils.UIAlert; @@ -9,6 +10,8 @@ import android.app.Dialog; import android.app.NotificationManager; import android.app.ProgressDialog; import android.content.ActivityNotFoundException; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -228,17 +231,17 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(activity, AboutActivity.class)); } if (id == R.id.navigation_item_help) { - String tw = AppConfig.vectrasWebsite; - Intent w = new Intent(Intent.ACTION_VIEW); + String tw = getAppConfigData.getString("vectrasWebsite",""); + Intent w = new Intent(ACTION_VIEW); w.setData(Uri.parse(tw)); startActivity(w); } else if (id == R.id.navigation_item_website) { - String tw = AppConfig.vectrasHelp; - Intent w = new Intent(Intent.ACTION_VIEW); + String tw = getAppConfigData.getString("vectrasHelp",""); + Intent w = new Intent(ACTION_VIEW); w.setData(Uri.parse(tw)); startActivity(w); } else if (id == R.id.navigation_item_import_iso) { - if (new File(AppConfig.maindirpath + "/drive.iso").exists()) { + if (new File(getAppConfigData.getString("maindirpath","") + "/drive.iso").exists()) { AlertDialog ad; ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); ad.setTitle("REPLACE ISO"); @@ -261,7 +264,7 @@ public class MainActivity extends AppCompatActivity { }); ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - File isoFile = new File(AppConfig.maindirpath + "/drive.iso"); + File isoFile = new File(getAppConfigData.getString("maindirpath","") + "/drive.iso"); try { isoFile.delete(); } catch (Exception e) { @@ -285,7 +288,7 @@ public class MainActivity extends AppCompatActivity { startActivityForResult(intent, 1004); } } else if (id == R.id.navigation_item_hdd1) { - if (new File(AppConfig.maindirpath + "/hdd1.qcow2").exists()) { + if (new File(getAppConfigData.getString("maindirpath","") + "/hdd1.qcow2").exists()) { AlertDialog ad; ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); ad.setTitle("REPLACE HDD1"); @@ -308,7 +311,7 @@ public class MainActivity extends AppCompatActivity { }); ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - File isoFile = new File(AppConfig.maindirpath + "/hdd1.qcow2"); + File isoFile = new File(getAppConfigData.getString("maindirpath","") + "/hdd1.qcow2"); try { isoFile.delete(); } catch (Exception e) { @@ -321,11 +324,11 @@ public class MainActivity extends AppCompatActivity { @Override public void onClick(DialogInterface dialog, int which) { Intent intentShareFile = new Intent(Intent.ACTION_SEND); - File fileWithinMyDir = new File(AppConfig.maindirpath + "/hdd1.qcow2"); + File fileWithinMyDir = new File(getAppConfigData.getString("maindirpath","") + "/hdd1.qcow2"); if (fileWithinMyDir.exists()) { intentShareFile.setType("*/*"); - intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + AppConfig.maindirpath + "/hdd1.qcow2")); + intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + getAppConfigData.getString("maindirpath","") + "/hdd1.qcow2")); intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "Sharing File..."); @@ -350,7 +353,7 @@ public class MainActivity extends AppCompatActivity { startActivityForResult(intent, 1005); } } else if (id == R.id.navigation_item_hdd2) { - if (new File(AppConfig.maindirpath + "/hdd2.qcow2").exists()) { + if (new File(getAppConfigData.getString("maindirpath","") + "/hdd2.qcow2").exists()) { AlertDialog ad; ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); ad.setTitle("REPLACE HDD2"); @@ -373,7 +376,7 @@ public class MainActivity extends AppCompatActivity { }); ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - File isoFile = new File(AppConfig.maindirpath + "/hdd2.qcow2"); + File isoFile = new File(getAppConfigData.getString("maindirpath","") + "/hdd2.qcow2"); try { isoFile.delete(); } catch (Exception e) { @@ -386,11 +389,11 @@ public class MainActivity extends AppCompatActivity { @Override public void onClick(DialogInterface dialog, int which) { Intent intentShareFile = new Intent(Intent.ACTION_SEND); - File fileWithinMyDir = new File(AppConfig.maindirpath + "/hdd2.qcow2"); + File fileWithinMyDir = new File(getAppConfigData.getString("maindirpath","") + "/hdd2.qcow2"); if (fileWithinMyDir.exists()) { intentShareFile.setType("*/*"); - intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + AppConfig.maindirpath + "/hdd2.qcow2")); + intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + getAppConfigData.getString("maindirpath","") + "/hdd2.qcow2")); intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "Sharing File..."); @@ -474,9 +477,55 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(activity, DataExplorerActivity.class)); } else if (id == R.id.navigation_item_donate) { String tw = "https://www.buymeacoffee.com/vectrasvm/"; - Intent w = new Intent(Intent.ACTION_VIEW); + Intent w = new Intent(ACTION_VIEW); w.setData(Uri.parse(tw)); startActivity(w); + } else if (id== R.id.setup_sound) { + if (VectrasApp.isAppInstalled("com.termux", getApplicationContext())) { + AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); + alertDialog.setTitle(getResources().getString(R.string.setup_sound)); + alertDialog.setMessage(getResources().getString(R.string.setup_sound_guide_content)); + alertDialog.setCancelable(false); + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.start_setup), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("Setup", "curl -o setup.sh https://raw.githubusercontent.com/AnBui2004/termux/refs/heads/main/installpulseaudio.sh && chmod +rwx setup.sh && ./setup.sh && rm setup.sh"); + clipboard.setPrimaryClip(clip); + Intent intent = new Intent(); + intent.setAction(ACTION_VIEW); + intent.setData(Uri.parse("android-app://com.termux")); + startActivity(intent); + Toast.makeText(getApplicationContext(), getResources().getString(R.string.copied), Toast.LENGTH_LONG).show(); + return; + } + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + alertDialog.dismiss(); + } + }); + alertDialog.show(); + } else { + AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); + alertDialog.setTitle(getResources().getString(R.string.termux_is_not_installed)); + alertDialog.setMessage(getResources().getString(R.string.you_need_to_install_termux)); + alertDialog.setCancelable(false); + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.install), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + Intent intent = new Intent(); + intent.setAction(ACTION_VIEW); + intent.setData(Uri.parse("https://github.com/termux/termux-app/releases")); + startActivity(intent); + return; + } + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + alertDialog.dismiss(); + } + }); + alertDialog.show(); + } } return false; } @@ -510,7 +559,7 @@ public class MainActivity extends AppCompatActivity { alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "JOIN", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String tg = "https://t.me/vectras_os"; - Intent f = new Intent(Intent.ACTION_VIEW); + Intent f = new Intent(ACTION_VIEW); f.setData(Uri.parse(tg)); startActivity(f); return; @@ -629,7 +678,7 @@ public class MainActivity extends AppCompatActivity { .setNegativeButton("Update", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(obj.getString("url")))); + startActivity(new Intent(ACTION_VIEW, Uri.parse(obj.getString("url")))); } catch (JSONException e) { } @@ -657,7 +706,6 @@ public class MainActivity extends AppCompatActivity { try { SharedPreferences dataAppConfig = activity.getSharedPreferences("appconfig", activity.MODE_PRIVATE); - jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, new File(dataAppConfig.getString("maindirpath","") + "roms-data.json"))); @@ -771,7 +819,8 @@ public class MainActivity extends AppCompatActivity { } public static boolean checkSharedFolder() { //TODO: not work idk why - File folder = new File(AppConfig.sharedFolder); + SharedPreferences dataAppConfig = activity.getSharedPreferences("appconfig", activity.MODE_PRIVATE); + File folder = new File(dataAppConfig.getString("sharedFolder","")); File[] listOfFiles = folder.listFiles(); if (listOfFiles != null) { @@ -965,7 +1014,7 @@ public class MainActivity extends AppCompatActivity { } try { try { - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + "/drive.iso")); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + "/drive.iso")); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; @@ -1016,7 +1065,7 @@ public class MainActivity extends AppCompatActivity { } try { try { - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + "/hdd1.qcow2")); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + "/hdd1.qcow2")); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; @@ -1065,7 +1114,7 @@ public class MainActivity extends AppCompatActivity { } try { try { - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + "/hdd2.qcow2")); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + "/hdd2.qcow2")); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; @@ -1114,11 +1163,11 @@ public class MainActivity extends AppCompatActivity { } try { try { - File romDir = new File(AppConfig.maindirpath + curRomName + "/"); + File romDir = new File(getAppConfigData.getString("maindirpath","") + curRomName + "/"); if (!romDir.exists()) { romDir.mkdirs(); } - OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + curRomName + "/" + "drv1-" + selectedFilePath.getName())); + OutputStream out = new FileOutputStream(new File(getAppConfigData.getString("maindirpath","") + curRomName + "/" + "drv1-" + selectedFilePath.getName())); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; diff --git a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java index 0d25a72..6386b92 100644 --- a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java +++ b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java @@ -84,7 +84,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick alertDialog.setCancelable(false); alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "AUTO SETUP", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - startDownload(); + setupVectrasStable(); return; } }); @@ -413,6 +413,27 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick " libusb ncurses-libs curl libnfs sdl2 gtk+3.0 fuse libpulse libseccomp jack pipewire liburing awesome lxterminal font-terminus xkeyboard-config fluxbox;" + " tar -xzvf " + tarPath + " -C /;" + " rm " + tarPath + ";" + + " apk add qemu-audio-sdl pulseaudio;" + + " echo export PULSE_SERVER=127.0.0.1 >> /etc/profile;" + + " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;" + + " echo \"installation successful! xssFjnj58Id\""); + } + + private void setupVectrasStable() { + inBtn.setVisibility(View.GONE); + progressBar.setVisibility(View.VISIBLE); + String filesDir = activity.getFilesDir().getAbsolutePath(); + String cmd = ""; + cmd += "echo \"http://dl-cdn.alpinelinux.org/alpine/edge/testing\" >> /etc/apk/repositories;"; + executeShellCommand(cmd); + executeShellCommand("set -e;" + + " echo 'Starting setup...';" + + " apk update;" + + " apk add tar libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + + " libusbredirparser usbredir-dev libiscsi-dev sdl2 sdl2-dev libepoxy-dev virglrenderer-dev rdma-core" + + " libusb ncurses-libs curl libnfs sdl2 gtk+3.0 fuse libpulse libseccomp jack pipewire liburing awesome lxterminal font-terminus xkeyboard-config fluxbox;" + + " apk add qemu-system-x86_64 qemu-system-ppc qemu-system-i386 qemu-system-aarch64 qemu-pr-helper qemu-img qemu-audio-sdl qemu-ui-gtk pulseaudio;" + + " echo export PULSE_SERVER=127.0.0.1 >> /etc/profile;" + " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;" + " echo \"installation successful! xssFjnj58Id\""); } diff --git a/app/src/main/java/com/vectras/vm/SplashActivity.java b/app/src/main/java/com/vectras/vm/SplashActivity.java index 9d24c14..bd85bf7 100644 --- a/app/src/main/java/com/vectras/vm/SplashActivity.java +++ b/app/src/main/java/com/vectras/vm/SplashActivity.java @@ -363,7 +363,7 @@ public class SplashActivity extends AppCompatActivity implements Runnable { public void run() { String filesDir = activity.getFilesDir().getAbsolutePath(); SharedPreferences prefs = getSharedPreferences(CREDENTIAL_SHARED_PREF, Context.MODE_PRIVATE); - if (new File(filesDir, "/distro/usr/local/bin/qemu-system-x86_64").exists()) + if ((new File(filesDir, "/distro/usr/local/bin/qemu-system-x86_64").exists()) || (new File(filesDir, "/distro/usr/bin/qemu-system-x86_64").exists())) startActivity(new Intent(this, MainActivity.class)); else startActivity(new Intent(this, SetupQemuActivity.class)); diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index aecd50e..af992d5 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -157,7 +157,8 @@ public class StartVM { spiceStr += "port=6999,disable-ticketing=on"; params.add(spiceStr); } else if (MainSettingsManager.getVmUi(activity).equals("X11")) { - + params.add("-display"); + params.add("gtk"); } params.add(extras); diff --git a/app/src/main/java/com/vectras/vm/VectrasApp.java b/app/src/main/java/com/vectras/vm/VectrasApp.java index 350c831..3d397a4 100644 --- a/app/src/main/java/com/vectras/vm/VectrasApp.java +++ b/app/src/main/java/com/vectras/vm/VectrasApp.java @@ -9,6 +9,7 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Typeface; import android.os.Build; @@ -454,12 +455,12 @@ public class VectrasApp extends Application { public static void disablerunsh(Context context) { Terminal vterm = new Terminal(context); - vterm.executeShellCommand("chmod -x /home/run.sh", false, MainActivity.activity); + vterm.executeShellCommand("sed -i '/run.sh/d' /etc/profile && chmod -x /home/run.sh", false, MainActivity.activity); } public static void createrunsh(String env,Context context) { Terminal vterm = new Terminal(context); - vterm.executeShellCommand("echo 'fluxbox &' > /home/run.sh && echo 'chmod -x /home/run.sh' >> /home/run.sh && echo '"+ env +"' >> /home/run.sh && echo 'pkill -SIGKILL -u root' >> /home/run.sh && chmod +rwx /home/run.sh", true, MainActivity.activity); + vterm.executeShellCommand("echo '/home/run.sh' >> /etc/profile && echo 'sed -i '/run.sh/d' /etc/profile' > /home/run.sh && echo 'fluxbox &' >> /home/run.sh && echo 'chmod -x /home/run.sh' >> /home/run.sh && echo '"+ env +"' >> /home/run.sh && echo 'pkill -SIGKILL -u root' >> /home/run.sh && chmod +rwx /home/run.sh", true, MainActivity.activity); } public static void addrunshtostartup(Context context) { @@ -483,10 +484,22 @@ public class VectrasApp extends Application { data.edit().putString("maindirpath", AppConfig.maindirpath).commit(); data.edit().putString("sharedFolder", AppConfig.sharedFolder).commit(); data.edit().putString("downloadsFolder", AppConfig.downloadsFolder).commit(); + data.edit().putString("sharedFolder", AppConfig.vectrasWebsite).commit(); + data.edit().putString("downloadsFolder", AppConfig.vectrasHelp).commit(); } catch (ExceptionInInitializerError e) { } catch (NoClassDefFoundError e) { } } + + public static boolean isAppInstalled(String packagename, Context context) { + PackageManager pm = context.getPackageManager(); + try { + pm.getPackageInfo(packagename,PackageManager.GET_ACTIVITIES); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } } diff --git a/app/src/main/res/drawable/volume_up_24px.xml b/app/src/main/res/drawable/volume_up_24px.xml new file mode 100644 index 0000000..bc9c5c8 --- /dev/null +++ b/app/src/main/res/drawable/volume_up_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/menu/home_drawer_menu.xml b/app/src/main/res/menu/home_drawer_menu.xml index d08a1ae..f32a3e9 100644 --- a/app/src/main/res/menu/home_drawer_menu.xml +++ b/app/src/main/res/menu/home_drawer_menu.xml @@ -38,6 +38,10 @@ android:id="@+id/navigation_item_settings" android:icon="@drawable/round_settings_24" android:title="@string/settings"/> + فيكترا - v2.9.1 (Thunderbird) - qemu-8.2.1-3dfx + v2.9.1 (Firefox) + مستقر الرئيسية سجل بدء المحاكاة @@ -511,4 +511,10 @@ المعالج حفظ التغييرات إنشاء أمر QEMU + إعداد الصوت لـ Termux + تحذير: غير مخصص للاستخدام مع X11! يتيح هذا للآلات الافتراضية التي تعمل على VM Vectras تشغيل الصوت باستخدام Termux. إذا لم تقم بإعداد Termux بعد، فحدد بدء الإعداد، وسيتم نسخ الأمر تلقائيًا إلى الحافظة، تحتاج إلى لصق هذا الأمر وتشغيله في Termux لإكمال الإعداد. في المرة القادمة، تأكد من تشغيل Termux لتشغيل الصوت. + تم نسخها + بدء الإعداد + لم يتم تثبيت Termux + تحتاج إلى تثبيت Termux قبل الإعداد. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d45c2dc..007cce7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,8 @@ Vectras VM - v2.9.1 (Thunderbird) - qemu-8.2.1-3dfx + v2.9.1 (Firefox) + Stable Home Logger Start Emulation @@ -523,4 +523,10 @@ CPU SAVE CHANGES QEMU CREATE CMD + Setup sound for Termux + WARNING: NOT FOR USE WITH X11! This enables virtual machines running on the Vectras VM to play audio using Termux. If you have not set up Termux yet, select Start setup, the command will be automatically copied to the clipboard, you need paste that command and run it in Termux to complete the setup. Next times, make sure Termux is running to play sound. + Copied. + Start setup + Termux is not installed + You need to install Termux before setting up.