diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2e9da1d..253711d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -136,5 +136,4 @@
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3568137780412047~1296857222"/>
-
diff --git a/app/src/main/java/android/androidVNC/ConnectionBean.java b/app/src/main/java/android/androidVNC/ConnectionBean.java
index 4158bd3..90df98e 100644
--- a/app/src/main/java/android/androidVNC/ConnectionBean.java
+++ b/app/src/main/java/android/androidVNC/ConnectionBean.java
@@ -29,8 +29,8 @@ public class ConnectionBean {
public ConnectionBean() {
setAddress(Config.defaultVNCHost);
setUserName(Config.defaultVNCUsername);
- setPassword(Config.defaultVNCPasswd);
- setPort(Config.defaultVNCPort + 5900);
+ setPassword("555555");
+ setPort(Config.defaultVNCPort + 5901);
setColorModel(Config.defaultVNCColorMode);
if (Config.enable_qemu_fullScreen)
setScaleMode(Config.defaultFullscreenScaleMode);
diff --git a/app/src/main/java/android/androidVNC/RfbProto.java b/app/src/main/java/android/androidVNC/RfbProto.java
index 26fcbf2..f7b9c2f 100644
--- a/app/src/main/java/android/androidVNC/RfbProto.java
+++ b/app/src/main/java/android/androidVNC/RfbProto.java
@@ -314,7 +314,7 @@ public class RfbProto {
//
LocalSocket localSocket = null;
- public static boolean allow_external = false;
+ public static boolean allow_external = true;
//-RfbProto(String h, int p, VncViewer v) throws IOException {
RfbProto(String h, int p) throws IOException{
diff --git a/app/src/main/java/com/vectras/qemu/Config.java b/app/src/main/java/com/vectras/qemu/Config.java
index 9132aec..bab729b 100644
--- a/app/src/main/java/com/vectras/qemu/Config.java
+++ b/app/src/main/java/com/vectras/qemu/Config.java
@@ -127,7 +127,7 @@ public class Config {
public static int MAX_DISPLAY_REFRESH_RATE = 100; //Hz
// VNC Defaults
- public static String defaultVNCHost = "127.0.0.1";
+ public static String defaultVNCHost = "localhost";
public static final String defaultVNCUsername = "vectras";
public static final String defaultVNCPasswd = "";
diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
index 028eafa..fdc5258 100644
--- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
+++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
@@ -753,6 +753,16 @@ public class MainSettingsManager extends AppCompatActivity
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
return prefs.getString("vmUi", "VNC");
}
+ public static void setResolution(Activity activity, String RESOLUTION) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ SharedPreferences.Editor edit = prefs.edit();
+ edit.putString("RESOLUTION", RESOLUTION);
+ edit.apply();
+ }
+ public static String getResolution(Activity activity) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ return prefs.getString("RESOLUTION", "800x600x32");
+ }
public static void setSoundCard(Activity activity, String soundCard) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor edit = prefs.edit();
diff --git a/app/src/main/java/com/vectras/vm/AppConfig.java b/app/src/main/java/com/vectras/vm/AppConfig.java
index 04c790e..e44f0fb 100644
--- a/app/src/main/java/com/vectras/vm/AppConfig.java
+++ b/app/src/main/java/com/vectras/vm/AppConfig.java
@@ -19,7 +19,7 @@ import java.util.Objects;
public class AppConfig {
// App Config
- public static final String vectrasVersion = "v2.8";
+ public static final String vectrasVersion = "2.9.1";
public static final String vectrasWebsite = "https://vectras.netlify.com/";
public static final String vectrasHelp = "https://vectras.netlify.app/how";
public static final String vectrasRaw = "https://raw.githubusercontent.com/epicstudios856/Vectras-windows-emulator/main/";
@@ -33,11 +33,11 @@ public class AppConfig {
public static final String storeJson = vectrasRaw + "store_list.json";
public static final String vectrasPkg = vectrasWebsite + "download";
- public static final String serverIP = "https://github.com/epicstudios856/Vectras-VM-Android";
+ public static final String releaseUrl = "https://vectrasvm.blackstorm.cc/vectras-vm/Releases/";
public static String getSetupFiles() {
String abi = Build.SUPPORTED_ABIS[0];
- return serverIP + "/releases/download/" + vectrasVersion + "/" + abi + "-vectras.tar.gz";
+ return releaseUrl + vectrasVersion + "/packages/vectras-vm-" + abi + ".tar.gz";
}
public static final String romsJson(Activity activity) {
diff --git a/app/src/main/java/com/vectras/vm/CustomRomActivity.java b/app/src/main/java/com/vectras/vm/CustomRomActivity.java
index c8ba861..53ba3d2 100644
--- a/app/src/main/java/com/vectras/vm/CustomRomActivity.java
+++ b/app/src/main/java/com/vectras/vm/CustomRomActivity.java
@@ -432,6 +432,7 @@ public class CustomRomActivity extends AppCompatActivity {
title.setText(current.itemName);
icon.setText(current.itemIcon);
drive.setText(current.itemPath);
+
Pattern pattern = Pattern.compile("-drive index=1,media=cdrom,file='([^']*)'");
Matcher matcher = pattern.matcher(current.itemExtra);
@@ -439,7 +440,18 @@ public class CustomRomActivity extends AppCompatActivity {
String cdromPath = matcher.group(1);
cdrom.setText(cdromPath);
}
+
qemu.setText(current.itemExtra);
+
+ File imgFile = new File(icon.getText().toString());
+
+ if(imgFile.exists()){
+ Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
+
+ ImageView ivIcon = findViewById(R.id.ivIcon);
+
+ ivIcon.setImageBitmap(myBitmap);
+ }
}
}
diff --git a/app/src/main/java/com/vectras/vm/MainActivity.java b/app/src/main/java/com/vectras/vm/MainActivity.java
index 6668163..54b7c9b 100644
--- a/app/src/main/java/com/vectras/vm/MainActivity.java
+++ b/app/src/main/java/com/vectras/vm/MainActivity.java
@@ -1,12 +1,8 @@
package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
-
import static com.vectras.vm.utils.UIUtils.UIAlert;
-import com.google.android.material.bottomsheet.BottomSheetDialog;
-import com.vectras.qemu.*;
-
import android.app.ActivityManager;
import android.app.Dialog;
import android.app.NotificationManager;
@@ -22,13 +18,13 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
+import android.os.Handler;
import android.provider.DocumentsContract;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
@@ -55,21 +51,21 @@ import com.google.android.gms.ads.initialization.OnInitializationCompleteListene
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
import com.google.android.material.bottomappbar.BottomAppBar;
+import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.elevation.SurfaceColors;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
-import com.google.android.material.textfield.TextInputEditText;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
+import com.vectras.qemu.MainVNCActivity;
import com.vectras.qemu.utils.RamInfo;
import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms;
+import com.vectras.vm.adapter.LogsAdapter;
import com.vectras.vm.logger.VectrasStatus;
import com.vectras.vm.utils.AppUpdater;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
-import com.vectras.vterm.Terminal;
-import com.vectras.vm.adapter.LogsAdapter;
import org.json.JSONArray;
import org.json.JSONException;
@@ -85,7 +81,6 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
@@ -396,8 +391,8 @@ public class MainActivity extends AppCompatActivity {
if (bufferedReader.readLine() != null || bufferedReader2.readLine() != null) {
String logLine = bufferedReader.readLine();
String logLine2 = bufferedReader2.readLine();
- VectrasStatus.logError("[E] "+logLine+"");
- VectrasStatus.logError("[W] "+logLine2+"");
+ VectrasStatus.logError("[E] " + logLine + "");
+ VectrasStatus.logError("[W] " + logLine2 + "");
}
} catch (IOException e) {
throw new RuntimeException(e);
@@ -525,6 +520,7 @@ public class MainActivity extends AppCompatActivity {
private void errorUpdateDialog(String error) {
VectrasStatus.logInfo(String.format(error));
}
+
public static void loadDataVbi() {
data = new ArrayList<>();
@@ -627,21 +623,30 @@ public class MainActivity extends AppCompatActivity {
public static void startVM(String vmName, String env) {
boolean isRunning = isMyServiceRunning(MainService.class);
-
- if (!isRunning) {
- Intent serviceIntent = new Intent(activity, MainService.class);
- MainService.env = env;
- MainService.CHANNEL_ID = vmName;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- activity.startForegroundService(serviceIntent);
- } else {
- activity.startService(serviceIntent);
+ Handler handler = new Handler();
+ handler.postDelayed(new Runnable() {
+ public void run() {
+ if (!isRunning) {
+ Intent serviceIntent = new Intent(activity, MainService.class);
+ if (MainSettingsManager.getVmUi(activity).equals("X11"))
+ MainService.env = "dwm; " + env;
+ else
+ MainService.env = env;
+ MainService.CHANNEL_ID = vmName;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ activity.startForegroundService(serviceIntent);
+ } else {
+ activity.startService(serviceIntent);
+ }
+ }
}
- }
+ }, 5000);
if (MainSettingsManager.getVmUi(activity).equals("VNC")) {
activity.startActivity(new Intent(activity, MainVNCActivity.class));
} else if (MainSettingsManager.getVmUi(activity).equals("SPICE")) {
//activity.startActivity(new Intent(activity, RemoteCanvasActivity.class));
+ } else if (MainSettingsManager.getVmUi(activity).equals("X11")) {
+ //activity.startActivity(new Intent(activity, X11Activity.class));
}
String[] params = env.split("\\s+");
VectrasStatus.logInfo("Params:");
@@ -709,6 +714,7 @@ public class MainActivity extends AppCompatActivity {
Log.d("TAG", "The interstitial ad wasn't ready yet.");
}
}
+
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
diff --git a/app/src/main/java/com/vectras/vm/MainService.java b/app/src/main/java/com/vectras/vm/MainService.java
index 04b1aef..93a7361 100644
--- a/app/src/main/java/com/vectras/vm/MainService.java
+++ b/app/src/main/java/com/vectras/vm/MainService.java
@@ -49,6 +49,7 @@ public class MainService extends Service {
Terminal vterm = new Terminal(this);
//vterm.executeShellCommand("chmod 770 /run/pulse -R");
//vterm.executeShellCommand("pulseaudio --system --disallow-exit --disallow-module-loading --daemonize --log-level=debug --log-time=1");
+ vterm.executeShellCommand("vncserver :1");
vterm.executeShellCommand(env);
}
} else
diff --git a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
index 742b62a..cc49940 100644
--- a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
+++ b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
@@ -1,17 +1,30 @@
package com.vectras.vm;
+import static android.content.Intent.ACTION_OPEN_DOCUMENT;
+
+import static com.vectras.vm.utils.UIUtils.UIAlert;
+
+import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
+import android.provider.DocumentsContract;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.preference.PreferenceManager;
import com.google.android.material.button.MaterialButton;
import com.vectras.vterm.view.ZoomableTextView;
@@ -19,6 +32,8 @@ import com.vectras.vterm.view.ZoomableTextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -29,11 +44,12 @@ import java.net.HttpURLConnection;
import java.net.URL;
public class SetupQemuActivity extends AppCompatActivity implements View.OnClickListener {
- SetupQemuActivity activity;
+ Activity activity;
private final String TAG = "SetupQemuActivity";
ZoomableTextView vterm;
MaterialButton inBtn;
ProgressBar progressBar;
+ AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -46,15 +62,41 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
vterm = findViewById(R.id.tvTerminalOutput);
inBtn = findViewById(R.id.btnInstall);
- inBtn.setOnClickListener(activity);
+ inBtn.setOnClickListener(this);
tarPath = getExternalFilesDir("data") + "/data.tar.gz";
+ alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
+ alertDialog.setTitle("BOOTSTRAP REQUIRED!");
+ alertDialog.setMessage("U can choose between auto download and setup or manual setup by choosing bootstrap file.");
+ alertDialog.setCancelable(false);
+ alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "AUTO SETUP", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ startDownload();
+ return;
+ }
+ });
+ alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "MANUAL SETUP", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("*/*");
+
+ // Optionally, specify a URI for the file that should appear in the
+ // system file picker when it loads.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
+ }
+
+ startActivityForResult(intent, 1001);
+ }
+ });
+
File tarGZ = new File(tarPath);
if (tarGZ.exists()) {
setupVectras();
} else {
- startDownload();
+ alertDialog.show();
}
}
@@ -63,10 +105,9 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
if (id == R.id.btnInstall) {
File tarGZ = new File(tarPath);
if (tarGZ.exists()) {
- setupVectras();
- } else {
- startDownload();
+ tarGZ.delete();
}
+ alertDialog.show();
}
}
@@ -109,8 +150,10 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
String filesDir = activity.getFilesDir().getAbsolutePath();
String nativeLibDir = activity.getApplicationInfo().nativeLibraryDir;
+ File tmpDir = new File(activity.getFilesDir(), "tmp");
+
// Setup environment for the PRoot process
- processBuilder.environment().put("PROOT_TMP_DIR", filesDir + "/tmp");
+ processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("PROOT_LOADER", nativeLibDir + "/libproot-loader.so");
processBuilder.environment().put("PROOT_LOADER_32", nativeLibDir + "/libproot-loader32.so");
@@ -118,7 +161,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
processBuilder.environment().put("USER", "root");
processBuilder.environment().put("PATH", "/bin:/usr/bin:/sbin:/usr/sbin");
processBuilder.environment().put("TERM", "xterm-256color");
- processBuilder.environment().put("TMPDIR", "/tmp");
+ processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("SHELL", "/bin/sh");
// Example PRoot command; replace 'libproot.so' and other paths as needed
@@ -308,12 +351,80 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
executeShellCommand("set -e;" +
" echo 'Starting setup...';" +
" apk update;" +
- " apk add 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 tar;" +
- " clear;" +
- " tar -xvzf " + tarPath + " -C " + filesDir + "/distro;" +
+ " apk add tar tigervnc dwm 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 libjack pipewire liburing;" +
+ " tar -xzvf " + tarPath + " -C /;" +
" rm " + tarPath + ";" +
- " clear;" +
+ " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd" +
" echo \"installation successful! xssFjnj58Id\"");
}
+ public String getPath(Uri uri) {
+ return com.vectras.vm.utils.FileUtils.getPath(this, uri);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent ReturnedIntent) {
+ super.onActivityResult(requestCode, resultCode, ReturnedIntent);
+ if (requestCode == 1001 && resultCode == RESULT_OK) {
+ Uri content_describer = ReturnedIntent.getData();
+ File selectedFilePath = new File(getPath(content_describer));
+ ProgressBar loading = progressBar;
+ String abi = Build.SUPPORTED_ABIS[0];
+ if (selectedFilePath.toString().endsWith(abi+".tar.gz")) {
+ loading.setVisibility(View.VISIBLE);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ FileInputStream File = null;
+ try {
+ File = (FileInputStream) getContentResolver().openInputStream(content_describer);
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ try {
+ try {
+ OutputStream out = new FileOutputStream(new File(tarPath));
+ try {
+ // Transfer bytes from in to out
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = File.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ } finally {
+ out.close();
+ }
+ } finally {
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ loading.setVisibility(View.GONE);
+ alertDialog.dismiss();
+ setupVectras();
+ }
+ };
+ activity.runOnUiThread(runnable);
+ File.close();
+ }
+ } catch (IOException e) {
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ loading.setVisibility(View.GONE);
+ UIAlert(activity, e.toString(), "error");
+ }
+ };
+ activity.runOnUiThread(runnable);
+ }
+ }
+ }).start();
+ } else {
+ alertDialog.show();
+ UIAlert(activity, "NOT VAILED FILE", "please select vectras-vm-" + abi + ".tar.gz file");
+ }
+ } else
+ alertDialog.show();
+ }
}
diff --git a/app/src/main/java/com/vectras/vm/SplashActivity.java b/app/src/main/java/com/vectras/vm/SplashActivity.java
index ff6a497..0cf882f 100644
--- a/app/src/main/java/com/vectras/vm/SplashActivity.java
+++ b/app/src/main/java/com/vectras/vm/SplashActivity.java
@@ -81,9 +81,10 @@ public class SplashActivity extends AppCompatActivity implements Runnable {
String filesDir = activity.getFilesDir().getAbsolutePath();
String nativeLibDir = activity.getApplicationInfo().nativeLibraryDir;
- File tmpDir = new File(filesDir + "/tmp/xdg");
- if (!tmpDir.exists()) {
+ File tmpDir = new File(context.getFilesDir(), "tmp");
+ if (!tmpDir.isDirectory()) {
tmpDir.mkdirs();
+ FileUtils.chmod(tmpDir, 0771);
}
File vDir = new File(com.vectras.vm.AppConfig.maindirpath);
diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java
index 58a91b5..ce55cac 100644
--- a/app/src/main/java/com/vectras/vm/StartVM.java
+++ b/app/src/main/java/com/vectras/vm/StartVM.java
@@ -1,6 +1,7 @@
package com.vectras.vm;
import android.app.Activity;
+import android.content.Intent;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
@@ -93,9 +94,6 @@ public class StartVM {
acclerationStr = "-accel tcg,thread=multi";
acclerationStr += ",tb-size=" + MainSettingsManager.getTbSize(activity);
- String spiceStr = "-spice ";
- spiceStr += "port=6999,disable-ticketing=on";
-
String boot = "-boot ";
boot += MainSettingsManager.getBoot(activity);
@@ -135,14 +133,19 @@ public class StartVM {
if (MainSettingsManager.getVmUi(activity).equals("VNC")) {
String vncStr = "-vnc ";
- params.add(vncStr);
+ //params.add(vncStr);
// Allow connections only from localhost using localsocket without a password
//params.add(Config.defaultVNCHost+":" + Config.defaultVNCPort);
String qmpParams = "unix:";
qmpParams += Config.getLocalVNCSocketPath();
- params.add(qmpParams);
- } else if (MainSettingsManager.getVmUi(activity).equals("SPICE"))
+ //params.add(qmpParams);
+ } else if (MainSettingsManager.getVmUi(activity).equals("SPICE")) {
+ String spiceStr = "-spice ";
+ spiceStr += "port=6999,disable-ticketing=on";
params.add(spiceStr);
+ } else if (MainSettingsManager.getVmUi(activity).equals("X11")) {
+
+ }
params.add("-monitor");
params.add("vc");
diff --git a/app/src/main/java/com/vectras/vterm/Terminal.java b/app/src/main/java/com/vectras/vterm/Terminal.java
index 2916ffd..24da3f7 100644
--- a/app/src/main/java/com/vectras/vterm/Terminal.java
+++ b/app/src/main/java/com/vectras/vterm/Terminal.java
@@ -39,7 +39,8 @@ public class Terminal {
private String user = "root";
public static Process qemuProcess;
-
+ public static String DISPLAY = ":1";
+
public Terminal(Context context) {
this.context = context;
}
@@ -73,8 +74,10 @@ public class Terminal {
String filesDir = context.getFilesDir().getAbsolutePath();
String nativeLibDir = context.getApplicationInfo().nativeLibraryDir;
+ File tmpDir = new File(context.getFilesDir(), "tmp");
+
// Setup environment for the PRoot qemuProcess
- processBuilder.environment().put("PROOT_TMP_DIR", filesDir + "/tmp");
+ processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("PROOT_LOADER", nativeLibDir + "/libproot-loader.so");
processBuilder.environment().put("PROOT_LOADER_32", nativeLibDir + "/libproot-loader32.so");
@@ -82,10 +85,13 @@ public class Terminal {
processBuilder.environment().put("USER", user);
processBuilder.environment().put("PATH", "/bin:/usr/bin:/sbin:/usr/sbin");
processBuilder.environment().put("TERM", "xterm-256color");
- processBuilder.environment().put("TMPDIR", filesDir + "/tmp");
+ processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("SHELL", "/bin/sh");
+ processBuilder.environment().put("DISPLAY", DISPLAY);
processBuilder.environment().put("PULSE_SERVER", "/run/pulse/native");
processBuilder.environment().put("XDG_RUNTIME_DIR", "/run");
+ processBuilder.environment().put("QEMU_AUDIO_DRV", "sdl");
+ processBuilder.environment().put("SDL_VIDEODRIVER", "x11");
// Example PRoot command; replace 'libproot.so' and other paths as needed
String[] prootCommand = {
diff --git a/app/src/main/java/com/vectras/vterm/TerminalBottomSheetDialog.java b/app/src/main/java/com/vectras/vterm/TerminalBottomSheetDialog.java
index d68c3ec..ede8b0e 100644
--- a/app/src/main/java/com/vectras/vterm/TerminalBottomSheetDialog.java
+++ b/app/src/main/java/com/vectras/vterm/TerminalBottomSheetDialog.java
@@ -102,7 +102,7 @@ public class TerminalBottomSheetDialog {
new Thread(() -> {
String username = null;
// Update the prompt on the UI thread
- String finalUsername = username != null ? username : "user";
+ String finalUsername = username != null ? username : "root";
activity.runOnUiThread(() -> {
promptView.setText(finalUsername + "@localhost:~$ ");
});
@@ -154,8 +154,10 @@ public class TerminalBottomSheetDialog {
String filesDir = activity.getFilesDir().getAbsolutePath();
String nativeLibDir = activity.getApplicationInfo().nativeLibraryDir;
+ File tmpDir = new File(activity.getFilesDir(), "tmp");
+
// Setup environment for the PRoot process
- processBuilder.environment().put("PROOT_TMP_DIR", filesDir + "/tmp");
+ processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("PROOT_LOADER", nativeLibDir + "/libproot-loader.so");
processBuilder.environment().put("PROOT_LOADER_32", nativeLibDir + "/libproot-loader32.so");
@@ -163,9 +165,13 @@ public class TerminalBottomSheetDialog {
processBuilder.environment().put("USER", "root");
processBuilder.environment().put("PATH", "/bin:/usr/bin:/sbin:/usr/sbin");
processBuilder.environment().put("TERM", "xterm-256color");
- processBuilder.environment().put("TMPDIR", "/tmp");
+ processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath());
processBuilder.environment().put("SHELL", "/bin/sh");
- processBuilder.environment().put("DISPLAY", getLocalIpAddress()+":0");
+ processBuilder.environment().put("DISPLAY", getLocalIpAddress()+":1");
+ processBuilder.environment().put("PULSE_SERVER", "/run/pulse/native");
+ processBuilder.environment().put("XDG_RUNTIME_DIR", "/run");
+ processBuilder.environment().put("QEMU_AUDIO_DRV", "sdl");
+ processBuilder.environment().put("SDL_VIDEODRIVER", "x11");
// Example PRoot command; replace 'libproot.so' and other paths as needed
String[] prootCommand = {
diff --git a/app/src/main/jniLibs/arm64-v8a/libvterm.so b/app/src/main/jniLibs/arm64-v8a/libvterm.so
deleted file mode 100644
index f0ddcb7..0000000
Binary files a/app/src/main/jniLibs/arm64-v8a/libvterm.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libvterm.so b/app/src/main/jniLibs/armeabi-v7a/libvterm.so
deleted file mode 100644
index 998cdc4..0000000
Binary files a/app/src/main/jniLibs/armeabi-v7a/libvterm.so and /dev/null differ
diff --git a/app/src/main/jniLibs/x86/libvterm.so b/app/src/main/jniLibs/x86/libvterm.so
deleted file mode 100644
index 21061a2..0000000
Binary files a/app/src/main/jniLibs/x86/libvterm.so and /dev/null differ
diff --git a/app/src/main/jniLibs/x86_64/libvterm.so b/app/src/main/jniLibs/x86_64/libvterm.so
deleted file mode 100644
index 13ca77b..0000000
Binary files a/app/src/main/jniLibs/x86_64/libvterm.so and /dev/null differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/round_aspect_ratio_24.xml b/app/src/main/res/drawable/round_aspect_ratio_24.xml
new file mode 100644
index 0000000..aed6621
--- /dev/null
+++ b/app/src/main/res/drawable/round_aspect_ratio_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/raw/apt_info_script.sh b/app/src/main/res/raw/apt_info_script.sh
deleted file mode 100644
index 220942e..0000000
--- a/app/src/main/res/raw/apt_info_script.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash
-
-subscribed_repositories() {
- local main_sources
- main_sources=$(grep -P '^\s*deb\s' "@VTERM_PREFIX@/etc/apt/sources.list")
-
- if [ -n "$main_sources" ]; then
- echo "#### sources.list"
- echo "\`$main_sources\`"
- fi
-
- local filename repo_package supl_sources
- while read -r filename; do
- repo_package=$(dpkg -S "$filename" 2>/dev/null | cut -d : -f 1)
- supl_sources=$(grep -P '^\s*deb\s' "$filename")
-
- if [ -n "$supl_sources" ]; then
- if [ -n "$repo_package" ]; then
- echo "#### $repo_package (sources.list.d/$(basename "$filename"))"
- else
- echo "#### sources.list.d/$(basename "$filename")"
- fi
- echo "\`$supl_sources\` "
- fi
- done < <(find "@VTERM_PREFIX@/etc/apt/sources.list.d" -maxdepth 1 ! -type d)
-}
-
-updatable_packages() {
- local updatable
-
- if [ "$(id -u)" = "0" ]; then
- echo "Running as root. Cannot check updatable packages."
- else
- apt update >/dev/null 2>&1
- updatable=$(apt list --upgradable 2>/dev/null | tail -n +2)
-
- if [ -z "$updatable" ];then
- echo "All packages up to date"
- else
- echo $'```\n'"$updatable"$'\n```\n'
- fi
- fi
-}
-
-output="
-### Subscribed Repositories
-
-$(subscribed_repositories)
-##
-
-
-### Updatable Packages
-
-$(updatable_packages)
-##
-
-"
-
-echo "$output"
diff --git a/app/src/main/res/raw/bell.ogg b/app/src/main/res/raw/bell.ogg
deleted file mode 100644
index 674f25d..0000000
Binary files a/app/src/main/res/raw/bell.ogg and /dev/null differ
diff --git a/app/src/main/res/raw/dualshock.raw b/app/src/main/res/raw/dualshock.raw
deleted file mode 100644
index 0ac779f..0000000
Binary files a/app/src/main/res/raw/dualshock.raw and /dev/null differ
diff --git a/app/src/main/res/raw/gba.raw b/app/src/main/res/raw/gba.raw
deleted file mode 100644
index afed1a1..0000000
Binary files a/app/src/main/res/raw/gba.raw and /dev/null differ
diff --git a/app/src/main/res/raw/keen.raw b/app/src/main/res/raw/keen.raw
deleted file mode 100644
index bf3aad2..0000000
Binary files a/app/src/main/res/raw/keen.raw and /dev/null differ
diff --git a/app/src/main/res/raw/n64.raw b/app/src/main/res/raw/n64.raw
deleted file mode 100644
index 2d1e6a1..0000000
Binary files a/app/src/main/res/raw/n64.raw and /dev/null differ
diff --git a/app/src/main/res/raw/psx.raw b/app/src/main/res/raw/psx.raw
deleted file mode 100644
index 5a08aa1..0000000
Binary files a/app/src/main/res/raw/psx.raw and /dev/null differ
diff --git a/app/src/main/res/raw/retro.raw b/app/src/main/res/raw/retro.raw
deleted file mode 100644
index 4cae6a8..0000000
Binary files a/app/src/main/res/raw/retro.raw and /dev/null differ
diff --git a/app/src/main/res/raw/simpletheme.raw b/app/src/main/res/raw/simpletheme.raw
deleted file mode 100644
index 83ec91a..0000000
Binary files a/app/src/main/res/raw/simpletheme.raw and /dev/null differ
diff --git a/app/src/main/res/raw/snes.raw b/app/src/main/res/raw/snes.raw
deleted file mode 100644
index 240263c..0000000
Binary files a/app/src/main/res/raw/snes.raw and /dev/null differ
diff --git a/app/src/main/res/raw/sun.raw b/app/src/main/res/raw/sun.raw
deleted file mode 100644
index c9dde59..0000000
Binary files a/app/src/main/res/raw/sun.raw and /dev/null differ
diff --git a/app/src/main/res/raw/ultimatedroid.raw b/app/src/main/res/raw/ultimatedroid.raw
deleted file mode 100644
index c86a540..0000000
Binary files a/app/src/main/res/raw/ultimatedroid.raw and /dev/null differ
diff --git a/app/src/main/res/raw/xsdl.raw b/app/src/main/res/raw/xsdl.raw
deleted file mode 100644
index a503873..0000000
Binary files a/app/src/main/res/raw/xsdl.raw and /dev/null differ
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index 6ed02b1..5d6de13 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -22,11 +22,13 @@
- VNC
- - SPICE
+
+ - X11 (XSDL)
- VNC
- - SPICE
+
+ - X11
- X86_64 QEMU
@@ -146,7 +148,7 @@
- exact
- custom
-
+
- 320x200
- 320x240
- 352x288
@@ -172,4 +174,30 @@
- 3840x2160
- 7680x4320
+
+ - 320x200x32
+ - 320x240x32
+ - 352x288x32
+ - 400x240x32
+ - 640x350x32
+ - 640x480x32
+ - 800x480x32
+ - 800x600x32
+ - 1024x768x32
+ - 1280x720x32
+ - 1280x960x32
+ - 1280x1024x32
+ - 1400x1050x32
+ - 1600x1024x32
+ - 1600x1200x32
+ - 1366x768x32
+ - 1680x1050x32
+ - 1920x1080x32
+ - 1920x1200x32
+ - 2048x1536x32
+ - 2560x1600x32
+ - 2560x2048x32
+ - 3840x2160x32
+ - 7680x4320x32
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d3a6d2..3a00344 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -280,4 +280,207 @@
TRY AGAIN
Logs
Options
+
+
+ Initializing
+ Please wait while data is being downloaded
+
+ Device configuration
+ Change device configuration
+
+ No need to download
+ Connecting to %s
+ Failed connecting to %s
+ Error connecting to %s
+ Downloading data from %s
+ Error downloading data from %s
+ Error writing to %s
+ %1$.0f%% done: file %2$s
+ Finished
+
+ Internal storage - %d MB free
+ SD card storage - %d MB free
+ Specify directory
+ Command line parameters, one argument per line
+ Data installation location
+ Permission to write to SD card
+ Downloads
+ Downloads
+ OK
+ Cancel
+
+ Arrows / joystick / dpad
+ Trackball
+ Accelerometer
+ Touchscreen only
+ What kind of navigation keys does your device have?
+
+ Additional controls
+ On-screen keyboard
+ Accelerometer
+
+ On-screen keyboard size
+ Size of button images
+ Large
+ Medium
+ Small
+ Tiny
+ Custom
+ On-screen keyboard theme
+ %1$s by %2$s
+ On-screen keyboard transparency
+ Invisible
+ Almost invisible
+ Transparent
+ Semi-transparent
+ Non-transparent
+
+ No dampening
+ Fast
+ Medium
+ Slow
+ Trackball dampening
+
+ Very fast
+ Fast
+ Medium
+ Slow
+ Very slow
+ Accelerometer sensitivity
+
+ Floating
+ Fixed when application starts
+ Fixed to table desk orientation
+ Accelerometer center position
+
+ Mouse emulation
+ Right mouse click
+ Menu key
+ Physical key
+ Touch screen with second finger
+ Touch screen with force
+ Disable right mouse click
+
+ Left mouse click
+ Normal
+ Touch near mouse cursor
+ Touch screen with second finger
+ Touch screen with force
+ Trackball click / joystick center
+ Hold at the same spot
+ Tap
+ Tap or hold
+ Holding timeout
+ 0.3 sec
+ 0.5 sec
+ 0.7 sec
+ 1 sec
+ 1.5 sec
+ Left mouse click with trackball / joystick center
+
+ Advanced features
+ Keep 4:3 screen aspect ratio
+ Show screen under finger in separate window
+ On-screen magnifying glass
+ Move mouse with joystick or trackball
+ Move mouse with joystick speed
+ Move mouse with joystick acceleration
+ Relative mouse movement (laptop mode)
+ Relative mouse movement speed
+ Relative mouse movement acceleration
+ Filter jitter for stylus/finger hover
+ Control mouse with gyroscope
+ Gyroscope sensitivity
+ Finger hover
+ Multiple touch events per video frame
+
+ None
+
+ Calibrate touchscreen pressure
+ Please slide finger across the screen for two seconds
+ Pressure %1$03d radius %2$03d
+
+ Very small (fast devices, less lag)
+ Small
+ Medium
+ Large (older devices, if sound is choppy)
+ Size of audio buffer
+
+ Remap physical keys
+ Press any key except HOME and POWER, you may use volume keys
+ Select SDL keycode
+ Select action
+ Show all keycodes
+
+ Remap on-screen controls
+ Joystick
+ Button
+ Text input button
+ Two-finger screen gestures
+ Two-finger screen gestures sensitivity
+ Zoom in two-finger gesture
+ Zoom out two-finger gesture
+ Rotate left two-finger gesture
+ Rotate right two-finger gesture
+
+ Customize on-screen keyboard layout
+ Press BACK when done. Resize buttons by sliding on empty space.
+ Floating joystick
+
+ Calibrate touchscreen
+ Touch all edges of the screen, press BACK when done
+
+ Video settings
+ Linear video filtering
+ Separate thread for video, it can increase FPS, it also can crash the app
+ Portrait/vertical screen orientation
+ Auto-detect screen orientation
+ 24 bpp screen color depth
+ Hide system navigation buttons / immersive mode
+ TV borders
+
+ Tap to start typing, press Back when done
+
+ Mouse emulation mode
+ Display size for mouse emulation
+ Desktop, no emulation
+ Large (tablets)
+ Small, magnifying glass
+ Small, touchpad mode
+ Tiny
+ Tiny, touchpad mode
+
+ Show more options
+
+ Hardware mouse detected, disabling mouse emulation
+
+ Not enough RAM
+ This app needs %1$d Mb RAM, your device has %2$d Mb
+ Ignore
+
+ Calibrate gyroscope
+ Put your device on a flat surface
+ Your device does not have gyroscope
+
+ Reset config to defaults
+ Reset all options to default values?
+
+ Cancel data downloading?
+ You can resume it later, the data will not be downloaded twice.
+ Yes
+ No
+
+
+ Failed to sign in. Please check your network connection and try again.
+ The application is incorrectly configured. Check that the package name and signing certificate match the client ID created in Developer Console. Also, if the application is not yet published, check that the account you are trying to sign in with is listed as a tester account. See logs for more information.
+ License check failed.
+ Unknown error.
+ Accessing network, please wait
+
+ ==GOOGLEPLAYGAMESERVICES_APP_ID==
+
+ Restarting, please wait.
+
+ %s is running
+ Stop
diff --git a/app/src/main/res/xml/qemu.xml b/app/src/main/res/xml/qemu.xml
index b072c4e..0f1a8dc 100644
--- a/app/src/main/res/xml/qemu.xml
+++ b/app/src/main/res/xml/qemu.xml
@@ -156,9 +156,20 @@
android:entryValues="@array/vmUiValues"
android:key="vmUi"
android:title="UI"
- app:isPreferenceVisible="false"
app:useSimpleSummaryProvider="true"
app:icon="@drawable/computer"/>
+
+
+
+