diff --git a/app/build.gradle b/app/build.gradle
index 1b2f135..6f2e575 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,7 +11,7 @@ android {
minSdk minApi
targetSdk targetApi
versionCode 21
- versionName "v2.9.5-3dfx-ladyfingers"
+ versionName "v2.9.5-3dfx-madeleine"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
@@ -79,20 +79,20 @@ dependencies {
implementation "androidx.preference:preference:1.2.1"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "androidx.viewpager:viewpager:1.1.0"
- implementation platform('com.google.firebase:firebase-bom:33.10.0')
+ implementation platform('com.google.firebase:firebase-bom:33.11.0')
implementation 'com.google.firebase:firebase-analytics'
implementation("com.google.firebase:firebase-auth")
implementation("com.google.firebase:firebase-database")
implementation 'com.google.firebase:firebase-storage'
implementation("com.google.android.gms:play-services-auth:21.3.0")
implementation("com.google.firebase:firebase-crashlytics")
- implementation 'com.google.android.gms:play-services-ads:24.0.0'
+ implementation 'com.google.android.gms:play-services-ads:24.1.0'
implementation 'com.github.bumptech.glide:glide:4.16.0'
implementation 'com.google.guava:guava:33.1.0-jre'
implementation 'com.google.code.gson:gson:2.11.0'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation "androidx.window:window:1.3.0"
- implementation "commons-io:commons-io:2.13.0"
+ implementation "commons-io:commons-io:2.16.1"
implementation 'org.zeroturnaround:zt-zip:1.16'
implementation 'com.airbnb.android:lottie:6.5.2'
implementation 'org.apache.commons:commons-compress:1.25.0'
diff --git a/app/src/main/java/android/androidVNC/ConnectionBean.java b/app/src/main/java/android/androidVNC/ConnectionBean.java
index 1e6702c..0ead11d 100644
--- a/app/src/main/java/android/androidVNC/ConnectionBean.java
+++ b/app/src/main/java/android/androidVNC/ConnectionBean.java
@@ -26,6 +26,8 @@ public class ConnectionBean {
private String userName;
private long id = 0;
+ public static boolean pause = false;
+
public ConnectionBean() {
setAddress(Config.defaultVNCHost);
setUserName(Config.defaultVNCUsername);
diff --git a/app/src/main/java/android/androidVNC/VncCanvasActivity.java b/app/src/main/java/android/androidVNC/VncCanvasActivity.java
index 612eee4..3658538 100644
--- a/app/src/main/java/android/androidVNC/VncCanvasActivity.java
+++ b/app/src/main/java/android/androidVNC/VncCanvasActivity.java
@@ -48,6 +48,7 @@ import android.widget.Toast;
import android.widget.ZoomControls;
import com.antlersoft.android.bc.BCFactory;
+import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.R;
import com.vectras.qemu.Config;
import com.vectras.vm.MainActivity;
@@ -59,7 +60,7 @@ import java.util.logging.Logger;
import androidx.appcompat.app.AppCompatActivity;
-public class VncCanvasActivity extends AppCompatActivity {
+public abstract class VncCanvasActivity extends AppCompatActivity {
static Display display = null;
public static Activity activity;
@@ -1087,7 +1088,7 @@ public class VncCanvasActivity extends AppCompatActivity {
return inputHandler.onTrackballEvent(event);
}
- @Override
+ @Override
public boolean onTouchEvent(MotionEvent event) {
// MK
if (event.getAction() == MotionEvent.ACTION_CANCEL)
diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
index 34d3830..2d16b9b 100644
--- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
+++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java
@@ -788,4 +788,16 @@ public class MainSettingsManager extends AppCompatActivity
return prefs.getInt("SelectedMirror", 0);
}
+ public static void setDontShowAgainJoinBetaUpdateChannelDialog(Context context, Boolean _boolean) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences.Editor edit = prefs.edit();
+ edit.putBoolean("dontShowAgainJoinBetaUpdateChannelDialog", _boolean);
+ edit.commit();
+ }
+
+ public static Boolean getDontShowAgainJoinBetaUpdateChannelDialog(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ return prefs.getBoolean("dontShowAgainJoinBetaUpdateChannelDialog", false);
+ }
+
}
diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
index 7e46c4b..fd39880 100644
--- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
+++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
@@ -1,15 +1,10 @@
package com.vectras.qemu;
import android.androidVNC.AbstractScaling;
-import android.androidVNC.RfbProto;
import android.androidVNC.VncCanvasActivity;
import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
-import androidx.core.view.GravityCompat;
-import androidx.core.view.MenuItemCompat;
-import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentTransaction;
import android.annotation.SuppressLint;
@@ -28,7 +23,6 @@ import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -39,8 +33,6 @@ import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -59,28 +51,20 @@ import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import android.text.TextWatcher;
import com.vectras.vm.*;
-import com.vectras.qemu.utils.FileUtils;
import com.vectras.vm.Fragment.ControlersOptionsFragment;
import com.vectras.vm.Fragment.LoggerDialogFragment;
-import com.vectras.vm.MainActivity;
import com.vectras.vm.R;
-import com.vectras.qemu.utils.QmpClient;
import com.vectras.vm.utils.UIUtils;
import com.vectras.vm.widgets.JoystickView;
-import com.vectras.vterm.Terminal;
-import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import org.json.JSONObject;
@@ -1442,6 +1426,7 @@ public class MainVNCActivity extends VncCanvasActivity {
}
private void shutdownthisvm() {
+ sendtextEdittext.setEnabled(false);
vncCanvas.sendMetaKey1(50, 6);
timerTask = new TimerTask() {
@Override
diff --git a/app/src/main/java/com/vectras/vm/CustomRomActivity.java b/app/src/main/java/com/vectras/vm/CustomRomActivity.java
index da9ef68..98f8958 100644
--- a/app/src/main/java/com/vectras/vm/CustomRomActivity.java
+++ b/app/src/main/java/com/vectras/vm/CustomRomActivity.java
@@ -459,7 +459,7 @@ public class CustomRomActivity extends AppCompatActivity {
public void onTextChanged(CharSequence s, int start, int before, int count) {
textName.setText(Objects.requireNonNull(title.getText()).toString());
- if (!Objects.requireNonNull(icon.getText()).toString().isEmpty())
+ if (!thumbnailPath.isEmpty())
return;
VectrasApp.setIconWithName(ivIcon, title.getText().toString());
diff --git a/app/src/main/java/com/vectras/vm/MainActivity.java b/app/src/main/java/com/vectras/vm/MainActivity.java
index 0099640..3dc2932 100644
--- a/app/src/main/java/com/vectras/vm/MainActivity.java
+++ b/app/src/main/java/com/vectras/vm/MainActivity.java
@@ -747,6 +747,28 @@ public class MainActivity extends AppCompatActivity {
String versionName = pinfo.versionName;
String versionNameonUpdate;
+ if (obj.getString("versionNameBetas").equals(versionName) && !MainSettingsManager.getcheckforupdatesfromthebetachannel(activity) && !MainSettingsManager.getDontShowAgainJoinBetaUpdateChannelDialog(activity)) {
+ AlertDialog _alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
+ _alertDialog.setTitle(getResources().getString(R.string.you_are_using_beta_version));
+ _alertDialog.setMessage(getResources().getString(R.string.switch_to_check_for_updates_on_the_Beta_channel_now));
+ _alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ MainSettingsManager.setcheckforupdatesfromthebetachannel(activity, true);
+ }
+ });
+ _alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ _alertDialog.dismiss();
+ }
+ });
+ _alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, getResources().getString(R.string.dont_show_again), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ MainSettingsManager.setDontShowAgainJoinBetaUpdateChannelDialog(activity, true);
+ }
+ });
+ _alertDialog.show();
+ }
+
if (MainSettingsManager.getcheckforupdatesfromthebetachannel(activity)) {
versionNameonUpdate = obj.getString("versionNameBeta");
diff --git a/app/src/main/java/com/vectras/vm/Minitools.java b/app/src/main/java/com/vectras/vm/Minitools.java
index 3d05010..e2bff2f 100644
--- a/app/src/main/java/com/vectras/vm/Minitools.java
+++ b/app/src/main/java/com/vectras/vm/Minitools.java
@@ -4,12 +4,14 @@ import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import static android.content.Intent.ACTION_VIEW;
import static android.view.View.GONE;
+import android.app.ProgressDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
@@ -33,9 +35,16 @@ import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
+import com.termux.app.TermuxService;
import com.vectras.qemu.MainSettingsManager;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
@@ -310,4 +319,30 @@ public class Minitools extends AppCompatActivity {
return _view;
}
}
+
+ public void extractLoaderApk() {
+ String apkLoaderAssetPath = "bootstrap/loader.apk";
+ String apkLoaderextractedFilePath = TermuxService.PREFIX_PATH + "/libexec/termux-x11/loader.apk";
+
+ VectrasApp.deleteDirectory(apkLoaderextractedFilePath);
+ if (copyAssetToFile(apkLoaderAssetPath, apkLoaderextractedFilePath)) {
+ VectrasApp.copyAFile(TermuxService.PREFIX_PATH + "/libexec/termux-x11/loader.apk", AppConfig.maindirpath);
+ }
+ }
+
+ private boolean copyAssetToFile(String assetPath, String outputPath) {
+ try (InputStream in = getAssets().open(assetPath);
+ OutputStream out = new FileOutputStream(outputPath)) {
+ byte[] buffer = new byte[1024];
+ int read;
+ while ((read = in.read(buffer)) != -1) {
+ out.write(buffer, 0, read);
+ }
+ out.flush();
+ return true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
index 09b8823..39dfccd 100644
--- a/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
+++ b/app/src/main/java/com/vectras/vm/SetupQemuActivity.java
@@ -217,7 +217,9 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
String filesDir = getFilesDir().getAbsolutePath();
String abi = getDeviceAbi();
String assetPath = "bootstrap/" + abi + ".tar";
+ //String apkLoaderAssetPath = "bootstrap/loader.apk";
String extractedFilePath = filesDir + "/" + abi + ".tar";
+ //String apkLoaderextractedFilePath = TermuxService.PREFIX_PATH + "/libexec/termux-x11/loader.apk";
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Extracting data...");
@@ -270,6 +272,10 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
if (process != null) {
process.destroy();
}
+ //VectrasApp.deleteDirectory(apkLoaderextractedFilePath);
+ //if (!copyAssetToFile(apkLoaderAssetPath, apkLoaderextractedFilePath)) {
+ //errorMessage = "Failed to copy loader.apk file.";
+ //}
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2f693d5..2813ed5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3,7 +3,7 @@
+ * This way we can make this loader version-agnostic and keep it secure. All application logic is located in target apk.
+ *
+ * @param args The command-line arguments
+ */
+ public static void main(String[] args) {
+ String cls = System.getenv("TERMUX_X11_LOADER_OVERRIDE_CMDENTRYPOINT_CLASS");
+ cls = cls != null ? cls : BuildConfig.CLASS_ID;
+ try {
+ android.content.pm.PackageInfo targetInfo = (android.os.Build.VERSION.SDK_INT <= 32) ?
+ android.app.ActivityThread.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, android.content.pm.PackageManager.GET_SIGNATURES, 0) :
+ android.app.ActivityThread.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, (long) android.content.pm.PackageManager.GET_SIGNATURES, 0);
+ assert targetInfo != null : BuildConfig.packageNotInstalledErrorText.replace("ARCH", android.os.Build.SUPPORTED_ABIS[0]);
+ assert targetInfo.signatures.length == 1 && BuildConfig.SIGNATURE == targetInfo.signatures[0].hashCode() : BuildConfig.packageSignatureMismatchErrorText;
+
+ android.util.Log.i(BuildConfig.logTag, "loading " + targetInfo.applicationInfo.sourceDir + "::" + BuildConfig.CLASS_ID + "::main of " + BuildConfig.APPLICATION_ID + " application (commit " + BuildConfig.COMMIT + ")");
+ Class> targetClass = Class.forName(cls, true,
+ new dalvik.system.PathClassLoader(targetInfo.applicationInfo.sourceDir, null, ClassLoader.getSystemClassLoader()));
+ targetClass.getMethod("main", String[].class).invoke(null, (Object) args);
+ } catch (AssertionError e) {
+ System.err.println(e.getMessage());
+ } catch (java.lang.reflect.InvocationTargetException e) {
+ e.getCause().printStackTrace(System.err);
+ } catch (Throwable e) {
+ android.util.Log.e(BuildConfig.logTag, "Loader error", e);
+ e.printStackTrace(System.err);
+ }
+ }
+}
diff --git a/shell-loader2/stub/build.gradle b/shell-loader2/stub/build.gradle
new file mode 100644
index 0000000..cbbec9a
--- /dev/null
+++ b/shell-loader2/stub/build.gradle
@@ -0,0 +1,29 @@
+plugins {
+ id('com.android.library')
+}
+
+android {
+ namespace 'com.termux.x11.stub'
+ compileSdkVersion 30
+ defaultConfig {
+ minSdkVersion 24
+ //noinspection ExpiredTargetSdkVersion
+ targetSdkVersion 28
+ }
+ buildFeatures {
+ buildConfig false
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation 'androidx.annotation:annotation:1.9.1'
+}
diff --git a/shell-loader2/stub/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/shell-loader2/stub/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/shell-loader2/stub/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/shell-loader2/stub/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/shell-loader2/stub/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/shell-loader2/stub/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/shell-loader2/stub/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/shell-loader2/stub/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 0000000..1d6940e
Binary files /dev/null and b/shell-loader2/stub/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/shell-loader2/stub/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/shell-loader2/stub/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar
new file mode 100644
index 0000000..1d6940e
Binary files /dev/null and b/shell-loader2/stub/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ
diff --git a/shell-loader2/stub/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/shell-loader2/stub/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 0000000..c7480c3
Binary files /dev/null and b/shell-loader2/stub/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/shell-loader2/stub/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/shell-loader2/stub/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar
new file mode 100644
index 0000000..c7480c3
Binary files /dev/null and b/shell-loader2/stub/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ
diff --git a/shell-loader2/stub/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/shell-loader2/stub/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 0000000..e69de29
diff --git a/shell-loader2/stub/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/shell-loader2/stub/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt
new file mode 100644
index 0000000..e69de29
diff --git a/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 0000000..32959f1
--- /dev/null
+++ b/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sun Mar 23 16:07:05 ICT 2025
diff --git a/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 0000000..f149593
--- /dev/null
+++ b/shell-loader2/stub/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,2 @@
+
+