>>() {
- }.getType());
- return true;
- } catch (Exception e) {
- return false;
- }
+ return isValidFromString(FileUtils.readAFile(_filepath));
} else {
return false;
}
diff --git a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java
index a61858a..2692003 100644
--- a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java
+++ b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java
@@ -22,7 +22,7 @@ public class LibraryChecker {
public void checkMissingLibraries(Activity activity) {
// List of required libraries
- String[] requiredLibraries = AppConfig.neededPkgs.split(" ");
+ String[] requiredLibraries = DeviceUtils.is64bit() ? AppConfig.neededPkgs.split(" ") : AppConfig.neededPkgs32bit.split(" ");
// Get the list of installed packages
isPackageInstalled(null, (output, errors) -> {
@@ -61,7 +61,7 @@ public class LibraryChecker {
.setPositiveButton("Install", (dialog, which) -> {
// Create the install command
String installCommand = "apk add " + missingLibraries.replace("\n", " ");
- new Terminal(context).executeShellCommand(installCommand, true, activity);
+ new Terminal(context).executeShellCommand(installCommand, true, true, activity);
})
.setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss())
.show();
@@ -81,7 +81,7 @@ public class LibraryChecker {
String command = "apk info";
Terminal terminal = new Terminal(context);
- terminal.executeShellCommand(command, (Activity) context, (output, errors) -> {
+ terminal.executeShellCommand(command, (Activity) context, false, (output, errors) -> {
if (callback != null) {
callback.onCommandCompleted(output, errors);
}
@@ -93,7 +93,7 @@ public class LibraryChecker {
String command = "apk info";
Terminal terminal = new Terminal(activity);
- terminal.executeShellCommand(command, activity, (output, errors) -> {
+ terminal.executeShellCommand(command, activity, false, (output, errors) -> {
if (callback != null) {
callback.onCommandCompleted(output, errors);
}
@@ -134,7 +134,7 @@ public class LibraryChecker {
.setCancelable(false)
.setPositiveButton("Install", (dialog, which) -> {
String installCommand = "apk add " + packageName;
- new Terminal(context).executeShellCommand(installCommand, true, activity);
+ new Terminal(context).executeShellCommand(installCommand, true, true, activity);
})
.setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss())
.show();
diff --git a/app/src/main/java/com/vectras/vm/utils/NetworkUtils.java b/app/src/main/java/com/vectras/vm/utils/NetworkUtils.java
index 5512741..75d66cc 100644
--- a/app/src/main/java/com/vectras/vm/utils/NetworkUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/NetworkUtils.java
@@ -1,5 +1,9 @@
package com.vectras.vm.utils;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
@@ -20,4 +24,26 @@ public class NetworkUtils {
}
}
}
+
+ /**
+ * CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
+ */
+ public boolean checkConnection(Context context) {
+ final ConnectivityManager connMgr = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ if (connMgr != null) {
+ NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();
+
+ if (activeNetworkInfo != null) { // connected to the internet
+ // connected to the mobile provider's data plan
+ if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+ // connected to wifi
+ return true;
+ } else
+ return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
+ }
+ }
+ return false;
+ }
}
diff --git a/app/src/main/java/com/vectras/vm/utils/NotificationUtils.java b/app/src/main/java/com/vectras/vm/utils/NotificationUtils.java
new file mode 100644
index 0000000..2518867
--- /dev/null
+++ b/app/src/main/java/com/vectras/vm/utils/NotificationUtils.java
@@ -0,0 +1,11 @@
+package com.vectras.vm.utils;
+
+import android.app.NotificationManager;
+import android.content.Context;
+
+public class NotificationUtils {
+ public static void clearAll(Context context) {
+ NotificationManager notificationManager = (NotificationManager) context.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancelAll();
+ }
+}
diff --git a/app/src/main/java/com/vectras/vm/utils/NumberUtils.java b/app/src/main/java/com/vectras/vm/utils/NumberUtils.java
new file mode 100644
index 0000000..e2e4f92
--- /dev/null
+++ b/app/src/main/java/com/vectras/vm/utils/NumberUtils.java
@@ -0,0 +1,10 @@
+package com.vectras.vm.utils;
+
+public class NumberUtils {
+ public static int safeLongToInt(long l) {
+ if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
+ return 0;
+ }
+ return (int) l;
+ }
+}
diff --git a/app/src/main/java/com/vectras/vm/utils/ServiceUtils.java b/app/src/main/java/com/vectras/vm/utils/ServiceUtils.java
new file mode 100644
index 0000000..7d1474c
--- /dev/null
+++ b/app/src/main/java/com/vectras/vm/utils/ServiceUtils.java
@@ -0,0 +1,18 @@
+package com.vectras.vm.utils;
+
+import android.app.ActivityManager;
+import android.content.Context;
+
+public class ServiceUtils {
+ public static boolean isServiceRunning(Context context, Class> serviceClass) {
+ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ if (manager != null) {
+ for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
+ if (serviceClass.getName().equals(service.service.getClassName())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/app/src/main/java/com/vectras/vm/utils/UIUtils.java b/app/src/main/java/com/vectras/vm/utils/UIUtils.java
index 2d4a7fc..ee6c274 100644
--- a/app/src/main/java/com/vectras/vm/utils/UIUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/UIUtils.java
@@ -26,7 +26,6 @@ import android.text.Html;
import android.text.InputType;
import android.text.Spannable;
import android.text.SpannableString;
-import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.Display;
@@ -41,7 +40,6 @@ import android.widget.Toast;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.qemu.utils.FileUtils;
-import com.vectras.vm.MainActivity;
import com.vectras.vm.R;
import com.vectras.vm.logger.VectrasStatus;
@@ -461,4 +459,44 @@ public class UIUtils {
return insets;
});
}
+ public static void setOnApplyWindowInsetsListenerBottomOnly(View _view) {
+ int originalPaddingLeft = _view.getPaddingLeft();
+ int originalPaddingTop = _view.getPaddingTop();
+ int originalPaddingRight = _view.getPaddingRight();
+ int originalPaddingBottom = _view.getPaddingBottom();
+
+ ViewCompat.setOnApplyWindowInsetsListener(_view, (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() | WindowInsetsCompat.Type.ime());
+ v.setPadding(originalPaddingLeft, originalPaddingTop, originalPaddingRight, systemBars.bottom + originalPaddingBottom);
+ return insets;
+ });
+ }
+
+
+ public static void setOnApplyWindowInsetsListenerLeftOnly(View _view) {
+ int originalPaddingLeft = _view.getPaddingLeft();
+ int originalPaddingTop = _view.getPaddingTop();
+ int originalPaddingRight = _view.getPaddingRight();
+ int originalPaddingBottom = _view.getPaddingBottom();
+
+
+ ViewCompat.setOnApplyWindowInsetsListener(_view, (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() | WindowInsetsCompat.Type.ime());
+ v.setPadding(systemBars.left + originalPaddingLeft , originalPaddingTop, originalPaddingRight, originalPaddingBottom);
+ return insets;
+ });
+ }
+
+ public static void setOnApplyWindowInsetsListenerHorizontalOnly(View _view) {
+ int originalPaddingLeft = _view.getPaddingLeft();
+ int originalPaddingTop = _view.getPaddingTop();
+ int originalPaddingRight = _view.getPaddingRight();
+ int originalPaddingBottom = _view.getPaddingBottom();
+
+ ViewCompat.setOnApplyWindowInsetsListener(_view, (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() | WindowInsetsCompat.Type.ime());
+ v.setPadding(systemBars.left + originalPaddingLeft, originalPaddingTop, systemBars.right + originalPaddingRight, originalPaddingBottom);
+ return insets;
+ });
+ }
}
diff --git a/app/src/main/java/com/vectras/vm/widgets/JoystickView.java b/app/src/main/java/com/vectras/vm/widgets/JoystickView.java
index c0a2ed4..d3462fe 100644
--- a/app/src/main/java/com/vectras/vm/widgets/JoystickView.java
+++ b/app/src/main/java/com/vectras/vm/widgets/JoystickView.java
@@ -28,7 +28,7 @@ public class JoystickView extends View
/**
- * Interface definition for a callback to be invoked when a
+ * CallbackInterface definition for a callback to be invoked when a
* JoystickView's button is moved
*/
public interface OnMoveListener {
@@ -43,7 +43,7 @@ public class JoystickView extends View
/**
- * Interface definition for a callback to be invoked when a JoystickView
+ * CallbackInterface definition for a callback to be invoked when a JoystickView
* is touched and held by multiple pointers.
*/
public interface OnMultipleLongPressListener {
diff --git a/app/src/main/java/com/vectras/vm/widgets/RadioGroupPlus.java b/app/src/main/java/com/vectras/vm/widgets/RadioGroupPlus.java
index c4cd5c8..aede6ba 100644
--- a/app/src/main/java/com/vectras/vm/widgets/RadioGroupPlus.java
+++ b/app/src/main/java/com/vectras/vm/widgets/RadioGroupPlus.java
@@ -269,7 +269,7 @@ public class RadioGroupPlus extends LinearLayout {
}
/**
- * Interface definition for a callback to be invoked when the checked
+ *
CallbackInterface definition for a callback to be invoked when the checked
* radio button changed in this group.
*/
public interface OnCheckedChangeListener {
diff --git a/app/src/main/java/com/vectras/vm/x11/X11Activity.java b/app/src/main/java/com/vectras/vm/x11/X11Activity.java
index 0874ea1..8af99b7 100644
--- a/app/src/main/java/com/vectras/vm/x11/X11Activity.java
+++ b/app/src/main/java/com/vectras/vm/x11/X11Activity.java
@@ -599,7 +599,7 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow
// Stop the service
MainService.stopService();
//Terminal.killQemuProcess();
- VMManager.killcurrentqemuprocess(getApplicationContext());
+ VMManager.killcurrentqemuprocess(X11Activity.this);
finish();
})
.setNegativeButton(getString(R.string.no), null)
diff --git a/app/src/main/java/com/vectras/vm/x11/input/TouchInputHandler.java b/app/src/main/java/com/vectras/vm/x11/input/TouchInputHandler.java
index c3305ed..efabb68 100644
--- a/app/src/main/java/com/vectras/vm/x11/input/TouchInputHandler.java
+++ b/app/src/main/java/com/vectras/vm/x11/input/TouchInputHandler.java
@@ -757,7 +757,7 @@ public class TouchInputHandler {
/**
- * Interface with a set of functions to control the behavior of the remote host renderer.
+ * CallbackInterface with a set of functions to control the behavior of the remote host renderer.
*/
public interface RenderStub {
/**
diff --git a/app/src/main/java/com/vectras/vterm/Terminal.java b/app/src/main/java/com/vectras/vterm/Terminal.java
index c52f182..90cc451 100644
--- a/app/src/main/java/com/vectras/vterm/Terminal.java
+++ b/app/src/main/java/com/vectras/vterm/Terminal.java
@@ -1,9 +1,7 @@
package com.vectras.vterm;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
@@ -32,18 +30,18 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.vectras.qemu.MainVNCActivity;
-import com.vectras.vm.MainActivity;
-import com.vectras.vm.MainService;
import com.vectras.vm.R;
import com.vectras.vm.VMManager;
import com.vectras.vm.AppConfig;
+import com.vectras.vm.VectrasApp;
import com.vectras.vm.utils.ClipboardUltils;
import com.vectras.vm.utils.DialogUtils;
+import com.vectras.vm.utils.NotificationUtils;
public class Terminal {
private static final String TAG = "Vterm";
private Context context;
- private String user = "root";
+ private static String user = "root";
public static Process qemuProcess;
public static String DISPLAY = ":0";
@@ -74,12 +72,12 @@ public class Terminal {
if (VMManager.isExecutedCommandError(usercommand, message, activity))
return;
- DialogUtils.twoDialog(activity, "Execution Result", message, activity.getString(R.string.copy), activity.getString(R.string.close),true, R.drawable.round_terminal_24, true,
- () -> ClipboardUltils.copyToClipboard(activity, message), null,null);
+ DialogUtils.twoDialog(activity, "Execution Result", message, activity.getString(R.string.copy), activity.getString(R.string.close), true, R.drawable.round_terminal_24, true,
+ () -> ClipboardUltils.copyToClipboard(activity, message), null, null);
}
// Method to execute the shell command
- public void executeShellCommand(String userCommand, boolean showResultDialog, Activity dialogActivity) {
+ public void executeShellCommand(String userCommand, boolean showResultDialog, boolean showProgressDialog, Activity dialogActivity) {
StringBuilder output = new StringBuilder();
StringBuilder errors = new StringBuilder();
Log.d(TAG, userCommand);
@@ -94,7 +92,7 @@ public class Terminal {
.setCancelable(false)
.create();
- progressDialog.show();
+ if (showProgressDialog) progressDialog.show();
new Thread(() -> {
try {
@@ -272,7 +270,7 @@ public class Terminal {
} catch (IOException | InterruptedException e) {
output.append(e.getMessage());
errors.append(Log.getStackTraceString(e));
- MainActivity.clearNotifications();
+ NotificationUtils.clearAll(VectrasApp.getContext());
} finally {
// Switch to main thread after execution
new Handler(Looper.getMainLooper()).post(() -> {
@@ -289,6 +287,82 @@ public class Terminal {
}).start();
}
+ public static String executeShellCommandWithResult(String userCommand, Activity activity) {
+ StringBuilder output = new StringBuilder();
+ StringBuilder errors = new StringBuilder();
+ Log.d(TAG, userCommand);
+ com.vectras.vm.logger.VectrasStatus.logError("VTERM: >" + userCommand + "");
+
+ try {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+
+ String filesDir = Objects.requireNonNull(activity.getFilesDir().getAbsolutePath());
+ File tmpDir = new File(Objects.requireNonNull(activity.getFilesDir()), "usr/tmp");
+
+ processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath());
+ processBuilder.environment().put("HOME", "/root");
+ processBuilder.environment().put("USER", user);
+ processBuilder.environment().put("TERM", "xterm-256color");
+ processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath());
+ processBuilder.environment().put("SHELL", "/bin/sh");
+ processBuilder.environment().put("DISPLAY", DISPLAY);
+ processBuilder.environment().put("PULSE_SERVER", "127.0.0.1");
+
+ String[] prootCommand = {
+ TermuxService.PREFIX_PATH + "/bin/proot",
+ "--kill-on-exit",
+ "--link2symlink",
+ "-0",
+ "-r", filesDir + "/distro",
+ "-b", "/dev",
+ "-b", "/proc",
+ "-b", "/sys",
+ "-b", "/data/data/com.vectras.vm/files/distro/root:/dev/shm",
+ "-b", "/sdcard",
+ "-b", "/storage",
+ "-b", "/data",
+ "-b", "/data/data/com.vectras.vm/files/usr/tmp:/tmp",
+ "-w", "/root",
+ "/bin/sh",
+ "--login"
+ };
+
+ processBuilder.command(prootCommand);
+ qemuProcess = processBuilder.start();
+
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(qemuProcess.getOutputStream()));
+ BufferedReader reader = new BufferedReader(new InputStreamReader(qemuProcess.getInputStream()));
+ BufferedReader errorReader = new BufferedReader(new InputStreamReader(qemuProcess.getErrorStream()));
+
+ writer.write(userCommand);
+ writer.newLine();
+ writer.flush();
+ writer.close();
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ Log.d(TAG, line);
+ com.vectras.vm.logger.VectrasStatus.logError("VTERM: >" + line + "");
+ output.append(line).append("\n");
+ }
+
+ while ((line = errorReader.readLine()) != null) {
+ Log.w(TAG, line);
+ com.vectras.vm.logger.VectrasStatus.logError("VTERM ERROR: >" + line + "");
+ output.append(line).append("\n");
+ }
+
+ int exitCode = qemuProcess.waitFor();
+ if (exitCode != 0) {
+ output.append("Execution finished with exit code: ").append(exitCode).append("\n");
+ }
+ } catch (IOException | InterruptedException e) {
+ output.append(e.getMessage());
+ errors.append(Log.getStackTraceString(e));
+ }
+ return output.toString();
+ }
+
public void extractQemuVersion(String userCommand, boolean showResultDialog, Activity dialogActivity, CommandCallback callback) {
StringBuilder output = new StringBuilder();
StringBuilder errors = new StringBuilder();
@@ -396,7 +470,7 @@ public class Terminal {
void onCommandCompleted(String output, String errors);
}
- public String executeShellCommand(String userCommand, Activity dialogActivity, CommandCallback callback) {
+ public String executeShellCommand(String userCommand, Activity dialogActivity, boolean isShowProgressDialog, CommandCallback callback) {
StringBuilder output = new StringBuilder();
StringBuilder errors = new StringBuilder();
Log.d(TAG, userCommand);
@@ -412,7 +486,7 @@ public class Terminal {
.create();
// Make sure to show the dialog on the main thread
- new Handler(Looper.getMainLooper()).post(progressDialog::show);
+ if (isShowProgressDialog) new Handler(Looper.getMainLooper()).post(progressDialog::show);
new Thread(() -> {
try {
diff --git a/app/src/main/res/drawable/add_24px.xml b/app/src/main/res/drawable/add_24px.xml
new file mode 100644
index 0000000..d6fd3d3
--- /dev/null
+++ b/app/src/main/res/drawable/add_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/home_24px.xml b/app/src/main/res/drawable/home_24px.xml
new file mode 100644
index 0000000..16b0538
--- /dev/null
+++ b/app/src/main/res/drawable/home_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/home_filled_24px.xml b/app/src/main/res/drawable/home_filled_24px.xml
new file mode 100644
index 0000000..333f1ed
--- /dev/null
+++ b/app/src/main/res/drawable/home_filled_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/home_storage_filled_24px.xml b/app/src/main/res/drawable/home_storage_filled_24px.xml
new file mode 100644
index 0000000..eeea8b0
--- /dev/null
+++ b/app/src/main/res/drawable/home_storage_filled_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_selector.xml b/app/src/main/res/drawable/ic_home_selector.xml
new file mode 100644
index 0000000..7a31bcb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_home_storage_selector.xml b/app/src/main/res/drawable/ic_home_storage_selector.xml
new file mode 100644
index 0000000..027d3f2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_storage_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_monitor_heart_selector.xml b/app/src/main/res/drawable/ic_monitor_heart_selector.xml
new file mode 100644
index 0000000..23ece28
--- /dev/null
+++ b/app/src/main/res/drawable/ic_monitor_heart_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/monitor_heart_filled_24px.xml b/app/src/main/res/drawable/monitor_heart_filled_24px.xml
new file mode 100644
index 0000000..e0efd94
--- /dev/null
+++ b/app/src/main/res/drawable/monitor_heart_filled_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
new file mode 100644
index 0000000..947f86f
--- /dev/null
+++ b/app/src/main/res/layout/activity_home.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home_content.xml b/app/src/main/res/layout/activity_home_content.xml
new file mode 100644
index 0000000..5284bfe
--- /dev/null
+++ b/app/src/main/res/layout/activity_home_content.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_updater.xml b/app/src/main/res/layout/activity_updater.xml
new file mode 100644
index 0000000..297b704
--- /dev/null
+++ b/app/src/main/res/layout/activity_updater.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_home_rom_store.xml b/app/src/main/res/layout/fragment_home_rom_store.xml
new file mode 100644
index 0000000..645096d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home_rom_store.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home_system_monitor.xml b/app/src/main/res/layout/fragment_home_system_monitor.xml
new file mode 100644
index 0000000..1461043
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home_system_monitor.xml
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home_vms.xml b/app/src/main/res/layout/fragment_home_vms.xml
new file mode 100644
index 0000000..f4a2f5f
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home_vms.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/update_bottom_dialog_layout.xml b/app/src/main/res/layout/update_bottom_dialog_layout.xml
new file mode 100644
index 0000000..3d2053d
--- /dev/null
+++ b/app/src/main/res/layout/update_bottom_dialog_layout.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/bottom_navigation_home_menu.xml b/app/src/main/res/menu/bottom_navigation_home_menu.xml
new file mode 100644
index 0000000..898ea99
--- /dev/null
+++ b/app/src/main/res/menu/bottom_navigation_home_menu.xml
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/home_drawer_menu.xml b/app/src/main/res/menu/home_drawer_menu.xml
index 45a0260..1c14b46 100644
--- a/app/src/main/res/menu/home_drawer_menu.xml
+++ b/app/src/main/res/menu/home_drawer_menu.xml
@@ -8,11 +8,8 @@
-
+
-
-
-
+ android:visible="true"
+ app:showAsAction="always"/>
diff --git a/app/src/main/res/menu/searchbar_menu.xml b/app/src/main/res/menu/searchbar_menu.xml
new file mode 100644
index 0000000..68d4149
--- /dev/null
+++ b/app/src/main/res/menu/searchbar_menu.xml
@@ -0,0 +1,18 @@
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 42403c2..ceac2b1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3,7 +3,7 @@
Vectras VM
- v2.9.5.6-3dfx
+ v2.9.5.7-3dfx
Stable
Home
Logger
@@ -224,9 +224,9 @@
IMAGE NAME
MAKE IMAGE
IMPORTED ROMS WILL BE SHOWN HERE
- VERSION:
+ Version:
QEMU
- ARCH:
+ Arch:
Running
Stopped
SERVICE:
@@ -530,6 +530,27 @@
Unable to process thumbnail.
The available storage space on your device is too low. Please clean up.
The virtual machine list data is corrupted, do you want to repair it?
+ The virtual machine cache directory failed to create. Please try again later.
+ Checking for updates
+ Just a sec…
+ What\'s new?
+ New update available
+ You\'re up to date
+ Check for updates
+ See if there are any new updates.
+ Home
+ Skip this version
+ Update now to experience the latest features and fix issues.
+ More
+ Storage
+ System monitor
+ Status:
+ Port:
+ You can shut down this virtual machine by clicking the Stop button in the System monitor. To control it, connect to this port:
+ Action needed
+ Data about the virtual machines has been corrupted and needs to be repaired.
+ Start repair
+
diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml
index bade35b..97cacf0 100644
--- a/app/src/main/res/xml/settings.xml
+++ b/app/src/main/res/xml/settings.xml
@@ -26,16 +26,6 @@
android:title="@string/join_the_beta_channel"
app:icon="@drawable/science_24px" />
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json
index 764790d..a2039a8 100644
--- a/web/data/UpdateConfig.json
+++ b/web/data/UpdateConfig.json
@@ -1,15 +1,15 @@
{
"versionCode":"21",
- "versionName":"v2.9.5-3dfx,v2.9.5-3dfx-almondcake,v2.9.5-3dfx-bread,v2.9.5-3dfx-churro,v2.9.5-3dfx-doughnut,v2.9.5-3dfx-empanada,v2.9.5-3dfx-flan,v2.9.5-3dfx-gugelhupf,v2.9.5-3dfx-hamentaschen,v2.9.5-3dfx-italianice,v2.9.5-3dfx-ladyfingers,v2.9.5-3dfx-madeleine,v2.9.5-3dfx-neapolitanicecream,v2.9.5-3dfx-orangecake,v2.9.5-3dfx-profiterole,v2.9.5-3dfx-quincejelly,v2.9.5-3dfx-rugelach,v2.9.5-3dfx-scone,v2.9.5-3dfx-tart,v2.9.5-3dfx-ube-halaya,v2.9.5-3dfx-victoria-sponge,v2.9.5-3dfx-waffle,v2.9.5-3dfx-xangos,v2.9.5-3dfx-yorkshire-pudding,v2.9.5-3dfx-zeppole,v2.9.5.1-3dfx,v2.9.5.2-3dfx,v2.9.5.3-3dfx,v2.9.5.4-3dfx,v2.9.5.5-3dfx,v2.9.5.6-3dfx",
+ "versionName":"v2.9.5-3dfx,v2.9.5-3dfx-almondcake,v2.9.5-3dfx-bread,v2.9.5-3dfx-churro,v2.9.5-3dfx-doughnut,v2.9.5-3dfx-empanada,v2.9.5-3dfx-flan,v2.9.5-3dfx-gugelhupf,v2.9.5-3dfx-hamentaschen,v2.9.5-3dfx-italianice,v2.9.5-3dfx-ladyfingers,v2.9.5-3dfx-madeleine,v2.9.5-3dfx-neapolitanicecream,v2.9.5-3dfx-orangecake,v2.9.5-3dfx-profiterole,v2.9.5-3dfx-quincejelly,v2.9.5-3dfx-rugelach,v2.9.5-3dfx-scone,v2.9.5-3dfx-tart,v2.9.5-3dfx-ube-halaya,v2.9.5-3dfx-victoria-sponge,v2.9.5-3dfx-waffle,v2.9.5-3dfx-xangos,v2.9.5-3dfx-yorkshire-pudding,v2.9.5-3dfx-zeppole,v2.9.5.1-3dfx,v2.9.5.2-3dfx,v2.9.5.3-3dfx,v2.9.5.4-3dfx,v2.9.5.5-3dfx,v2.9.5.6-3dfx,v2.9.5.7-3dfx",
"size": "46 MB",
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases/v2.9.5",
"Message": "v2.9.5-3dfx
- Bring back 3dfx support.
- Enhance app execution.
- Added some linux programs in x11 display.
- Added alpine linux (x11).
- Russian language by @OFGING
New updates are live!",
"cancellable": true,
"versionCodeBeta":"21",
- "versionNameBeta":"v2.9.5.6-3dfx",
- "versionNameBetas":"v2.9.5-3dfx-madeleine,v2.9.5-3dfx-neapolitanicecream,v2.9.5-3dfx-orangecake,v2.9.5-3dfx-profiterole,v2.9.5-3dfx-quincejelly,v2.9.5-3dfx-rugelach,v2.9.5-3dfx-scone,v2.9.5-3dfx-tart,v2.9.5-3dfx-victoria-sponge,v2.9.5-3dfx-waffle,v2.9.5-3dfx-xangos,v2.9.5-3dfx-yorkshire-pudding,v2.9.5-3dfx-zeppole,v2.9.5.1-3dfx,v2.9.5.2-3dfx,v2.9.5.3-3dfx,v2.9.5.4-3dfx,v2.9.5.5-3dfx,v2.9.5.6-3dfx",
+ "versionNameBeta":"v2.9.5.7-3dfx",
+ "versionNameBetas":"v2.9.5-3dfx-madeleine,v2.9.5-3dfx-neapolitanicecream,v2.9.5-3dfx-orangecake,v2.9.5-3dfx-profiterole,v2.9.5-3dfx-quincejelly,v2.9.5-3dfx-rugelach,v2.9.5-3dfx-scone,v2.9.5-3dfx-tart,v2.9.5-3dfx-victoria-sponge,v2.9.5-3dfx-waffle,v2.9.5-3dfx-xangos,v2.9.5-3dfx-yorkshire-pudding,v2.9.5-3dfx-zeppole,v2.9.5.1-3dfx,v2.9.5.2-3dfx,v2.9.5.3-3dfx,v2.9.5.4-3dfx,v2.9.5.5-3dfx,v2.9.5.6-3dfx,v2.9.5.7-3dfx",
"sizeBeta": "50 MB",
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
- "MessageBeta": "v2.9.5.6-3dfx
Bugs fixed.",
+ "MessageBeta": "v2.9.5.7-3dfx
Bugs fixed.",
"cancellableBeta": true
}
diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json
index 3ddaf4a..3ecdd45 100644
--- a/web/data/vroms-store.json
+++ b/web/data/vroms-store.json
@@ -335,6 +335,22 @@
"creator": "Nguyen Bao An Bui",
"verified": true
},
+ {
+ "rom_name":"Windows 8 build 8432",
+ "rom_icon":"https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/09/17/windows-logo_1_926ed76111646acbbe332bc5af0cf2ce.png",
+ "rom_url":"https://youtu.be/wH8n87pPJ2k",
+ "rom_path":"Windows 8 build 8432.cvbi",
+ "rom_avail":true,
+ "rom_size":"Preview build",
+ "rom_arch":"X86_64",
+ "rom_kernel":"windows",
+ "rom_extra":"",
+ "final_rom_file_name":"",
+ "desc":"This Rom is from Nguyen Bao An Bui. You can get it on An Bui app: https://play.google.com/store/apps/details?id=com.anbui.app\n\nWindows 8.1 build 9431 is the official Preview build of Windows 8.1, also known as the Milestone Preview. This build was released on 26 June 2013 with the occasion of the Build 2013 conference taking place. At the time of its release, it was possible to upgrade to this build from a Windows 8 copy by using the Windows Store or by downloading an ISO from TechNet or MSDN. The ISOs were made publicly available the day after, on 27 June 2013 in multiple languages, when the day 2 keynote started. An ARM version of the build was also available, but it was only obtainable through the Microsoft Store (repair content packages were also made available).",
+ "file_size": "7 GB",
+ "creator": "Nguyen Bao An Bui",
+ "verified": true
+ },
{
"rom_name":"Windows 8",
"rom_icon":"https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/09/17/windows-logo_1_926ed76111646acbbe332bc5af0cf2ce.png",