diff --git a/app/build.gradle b/app/build.gradle
index 1903722..cf5dbc9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "com.vectras.vm"
minSdk minApi
targetSdk targetApi
- versionCode 133
- versionName "4.2.9"
+ versionCode 134
+ versionName "4.3.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
diff --git a/app/src/main/java/android/androidVNC/RfbProto.java b/app/src/main/java/android/androidVNC/RfbProto.java
index 1a4fb7e..fb77fc1 100644
--- a/app/src/main/java/android/androidVNC/RfbProto.java
+++ b/app/src/main/java/android/androidVNC/RfbProto.java
@@ -339,14 +339,14 @@ public class RfbProto {
localSocket.connect(localSocketAddr);
//localSocket.setSoTimeout(10_000);
is = new DataInputStream(new BufferedInputStream(localSocket.getInputStream(),
- 32768));
+ 65536));
sos = localSocket.getOutputStream();
} else {
sock = new Socket(host, port);
//sock.setSoTimeout(10_000);
is = new DataInputStream(new BufferedInputStream(sock.getInputStream(),
- 16384));
+ 32768));
sos = sock.getOutputStream();
}
diff --git a/app/src/main/java/android/androidVNC/VncCanvas.java b/app/src/main/java/android/androidVNC/VncCanvas.java
index c65b323..1301006 100644
--- a/app/src/main/java/android/androidVNC/VncCanvas.java
+++ b/app/src/main/java/android/androidVNC/VncCanvas.java
@@ -50,10 +50,15 @@ import android.view.View;
import com.antlersoft.android.bc.BCFactory;
import com.vectras.qemu.Config;
import com.vectras.vm.R;
+import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.UIUtils;
import java.io.IOException;
import java.util.Objects;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.zip.Inflater;
import androidx.appcompat.widget.AppCompatImageView;
@@ -1955,6 +1960,8 @@ public class VncCanvas extends AppCompatImageView {
for (int i = 0; i < count; i++) {
dst[i] = (int) readPixelsBuffer[i] & 0xFF;
}
+
+ totalBytesReceived.addAndGet(count);
} else {
final int l = count * 3;
if (l > readPixelsBuffer.length) {
@@ -1967,6 +1974,8 @@ public class VncCanvas extends AppCompatImageView {
| ((readPixelsBuffer[idx + 2] & 0xFF) << 16 | (readPixelsBuffer[idx + 1] & 0xFF) << 8
| (readPixelsBuffer[idx] & 0xFF));
}
+
+ totalBytesReceived.addAndGet(l);
}
}
@@ -2104,15 +2113,53 @@ public class VncCanvas extends AppCompatImageView {
// Request initial framebuffer update
isNeedWriteFullUpdateRequest = true;
+ startDeadCheck();
+
VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext();
activity.onConnected();
}
public void disconnected() {
+ stopDeadCheck();
+
VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext();
activity.onDisconnected();
}
+ private final AtomicLong totalBytesReceived = new AtomicLong(0);
+ private long lastCheckedBytes = 0;
+ ScheduledExecutorService deadCheckScheduler;
+
+ boolean isNeedDeadCheck = DeviceUtils.isColorOS(getContext());
+
+ private void startDeadCheck() {
+ if (!isNeedDeadCheck) return;
+
+ totalBytesReceived.set(0);
+ lastCheckedBytes = totalBytesReceived.get();
+ deadCheckScheduler = Executors.newSingleThreadScheduledExecutor();
+
+ deadCheckScheduler.scheduleWithFixedDelay(() -> {
+ long currentBytes = totalBytesReceived.get();
+
+ if (currentBytes == lastCheckedBytes) {
+ isNeedWriteFullUpdateRequest = true;
+ Log.d(TAG, "No response was detected and a WriteFullUpdateRequest was sent.");
+ } else {
+ lastCheckedBytes = currentBytes;
+ }
+ }, 5000, 5000, TimeUnit.SECONDS);
+ }
+
+ private void stopDeadCheck() {
+ if (!isNeedDeadCheck) return;
+
+ if (deadCheckScheduler != null) {
+ deadCheckScheduler.shutdownNow();
+ deadCheckScheduler = null;
+ }
+ }
+
public float getFramebufferWidth() {
return bitmapData.framebufferwidth;
}
diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
index 1b45cfc..1e38d2a 100644
--- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
+++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java
@@ -531,7 +531,7 @@ public class MainVNCActivity extends VncCanvasActivity {
}
- private void setUIModeMobile(boolean fitToScreen) {
+ public void setUIModeMobile(boolean fitToScreen) {
try {
MotionEvent a = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
@@ -586,7 +586,7 @@ public class MainVNCActivity extends VncCanvasActivity {
}
- private void setUIModeDesktop() {
+ public void setUIModeDesktop() {
try {
MotionEvent a = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
diff --git a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java
index 420d79c..54b2540 100644
--- a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java
+++ b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java
@@ -84,6 +84,11 @@ public class VmControllerDialog extends DialogFragment {
infoBlock = "";
}
+ if (!isAdded()) {
+ progressDialog.reset();
+ return;
+ }
+
long audioFileSize = FileUtils.getFileSize(VmFileManager.findAudioRaw(requireContext(), Config.vmID));
isGotInfo.set(true);
@@ -332,7 +337,7 @@ public class VmControllerDialog extends DialogFragment {
});
- if (isAdded() && requireActivity() instanceof MainVNCActivity) {
+ if (isAdded() && requireActivity() instanceof MainVNCActivity mainVNCActivity) {
binding.lnRefresh.setOnClickListener(v -> {
requireActivity().startActivity(new Intent(requireActivity(), MainVNCActivity.class));
requireActivity().overridePendingTransition(0, 0);
@@ -349,10 +354,10 @@ public class VmControllerDialog extends DialogFragment {
binding.lnVirtualmouse.setOnClickListener(v -> binding.swVirtualmouse.toggle());
- binding.lnMouse.setOnClickListener(v -> {
- MainVNCActivity.getContext.onMouseMode();
- dismiss();
- });
+// binding.lnMouse.setOnClickListener(v -> {
+// MainVNCActivity.getContext.onMouseMode();
+// dismiss();
+// });
binding.lnSettings.setOnClickListener(v -> {
requireActivity().startActivity(new Intent(requireActivity(), VNCSettingsActivity.class));
@@ -362,6 +367,7 @@ public class VmControllerDialog extends DialogFragment {
TypedValue typedValue = new TypedValue();
requireActivity().getTheme().resolveAttribute(androidx.appcompat.R.attr.colorPrimary, typedValue, true);
int colorPrimary = typedValue.data;
+ int colorControlNormal = binding.tvMute.getCurrentTextColor();
if (MainSettingsManager.getVNCScaleMode(requireActivity()) == VNCConfig.oneToOne) {
binding.ivScreenOneToOne.setBackgroundResource(R.drawable.dialog_shape_single_button);
@@ -434,6 +440,32 @@ public class VmControllerDialog extends DialogFragment {
});
binding.lnPinchToZoom.setOnClickListener(v -> binding.swPinchToZoom.toggle());
+
+ if (Config.mouseMode == Config.MouseMode.Trackpad) {
+ binding.ivTrackpadMode.setBackgroundResource(R.drawable.dialog_shape_single_button);
+ binding.ivTrackpadMode.setColorFilter(colorPrimary);
+ } else {
+ binding.ivExternalMouseMode.setBackgroundResource(R.drawable.dialog_shape_single_button);
+ binding.ivExternalMouseMode.setColorFilter(colorPrimary);
+ }
+
+ binding.ivTrackpadMode.setOnClickListener(v -> {
+ if (Config.mouseMode == Config.MouseMode.Trackpad) return;
+ mainVNCActivity.setUIModeMobile(false);
+ binding.ivTrackpadMode.setBackgroundResource(R.drawable.dialog_shape_single_button);
+ binding.ivTrackpadMode.setColorFilter(colorPrimary);
+ binding.ivExternalMouseMode.setBackgroundResource(R.drawable.dialog_shape_click_effect_button);
+ binding.ivExternalMouseMode.setColorFilter(colorControlNormal);
+ });
+
+ binding.ivExternalMouseMode.setOnClickListener(v -> {
+ if (Config.mouseMode == Config.MouseMode.External) return;
+ mainVNCActivity.setUIModeDesktop();
+ binding.ivTrackpadMode.setBackgroundResource(R.drawable.dialog_shape_click_effect_button);
+ binding.ivTrackpadMode.setColorFilter(colorControlNormal);
+ binding.ivExternalMouseMode.setBackgroundResource(R.drawable.dialog_shape_single_button);
+ binding.ivExternalMouseMode.setColorFilter(colorPrimary);
+ });
} else {
binding.lnUserInterface.setVisibility(View.GONE);
}
diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java
index 478983a..54cc9bb 100644
--- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java
+++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java
@@ -214,8 +214,7 @@ public class SetupWizard2Activity extends AppCompatActivity {
edit.apply();
} else if (currentStep == STEP_PATERON) {
uiControllerFinalSteps(currentStep + 1);
- Intent intent = new Intent(ACTION_VIEW, Uri.parse(AppConfig.patreonLink));
- startActivity(intent);
+ IntentUtils.openUrl(this, AppConfig.patreonLink);
} else {
startActivity(new Intent(this, MainActivity.class));
finish();
diff --git a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
index 6ca4b15..1216e11 100644
--- a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java
@@ -1,7 +1,5 @@
package com.vectras.vm.utils;
-import static androidx.core.content.ContextCompat.registerReceiver;
-
import android.app.Activity;
import android.app.ActivityManager;
import android.app.usage.StorageStatsManager;
@@ -20,12 +18,8 @@ import android.util.Log;
import android.view.Display;
import android.view.InputDevice;
-import com.vectras.vm.VectrasApp;
-
import java.io.BufferedReader;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.UUID;
@@ -159,4 +153,8 @@ public class DeviceUtils {
return (sources & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE
|| (sources & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE;
}
+
+ public static boolean isColorOS(Context context) {
+ return PackageUtils.isInstalled("com.nearme.themespace", context);
+ }
}
diff --git a/app/src/main/java/com/vectras/vm/utils/IntentUtils.java b/app/src/main/java/com/vectras/vm/utils/IntentUtils.java
index 83d917a..80829af 100644
--- a/app/src/main/java/com/vectras/vm/utils/IntentUtils.java
+++ b/app/src/main/java/com/vectras/vm/utils/IntentUtils.java
@@ -2,6 +2,7 @@ package com.vectras.vm.utils;
import static android.content.Intent.ACTION_VIEW;
+import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -30,8 +31,21 @@ public class IntentUtils {
PackageManager packagemanager = context.getPackageManager();
if (intent.resolveActivity(packagemanager) != null) {
- context.startActivity(intent);
- return true;
+ try {
+ context.startActivity(intent);
+ return true;
+ } catch (SecurityException e) {
+ try {
+ Intent chooserIntent = Intent.createChooser(intent, null);
+ if (!(context instanceof Activity)) {
+ chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ context.startActivity(chooserIntent);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
+ }
} else {
return false;
}
diff --git a/app/src/main/res/drawable/mouse_24px.xml b/app/src/main/res/drawable/mouse_24px.xml
new file mode 100644
index 0000000..521544e
--- /dev/null
+++ b/app/src/main/res/drawable/mouse_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/trackpad_input_24px.xml b/app/src/main/res/drawable/trackpad_input_24px.xml
new file mode 100644
index 0000000..c3b6dce
--- /dev/null
+++ b/app/src/main/res/drawable/trackpad_input_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/dialog_change_removable_devices.xml b/app/src/main/res/layout/dialog_change_removable_devices.xml
index 8cf7fb4..b500b1e 100644
--- a/app/src/main/res/layout/dialog_change_removable_devices.xml
+++ b/app/src/main/res/layout/dialog_change_removable_devices.xml
@@ -553,6 +553,33 @@
android:background="@drawable/dialog_shape_click_effect_button"/>
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.1.0\nBugs fixed.",
+ "Message": "4.3.0
\nBugs fixed.",
"cancellable": true,
- "versionCodeBeta":"133",
- "versionNameBeta":"4.2.9",
- "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.0,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9",
+ "versionCodeBeta":"134",
+ "versionNameBeta":"4.3.0",
+ "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.0,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0",
"sizeBeta": "45 MB",
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
- "MessageBeta": "4.2.9
Bugs fixed.",
+ "MessageBeta": "4.3.0
Bugs fixed.",
"cancellableBeta": true
}
diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json
index 4c37b86..96362da 100644
--- a/web/data/vroms-store.json
+++ b/web/data/vroms-store.json
@@ -1601,6 +1601,26 @@
"vecid": "windows1122h2rcvbi",
"id": "99661"
},
+ {
+ "rom_name": "Windows 11 22H2 ARM64",
+ "rom_icon": "https://www.getmyos.com/app_public/files/t/1/2021/06/windows_11_logo_by_getmyos.png",
+ "rom_url": "https://youtu.be/k5svU6Lqvmw",
+ "rom_path": "Windows 11 22H2 ARM64.cvbi",
+ "rom_avail": true,
+ "gui": true,
+ "rom_size": "Sun Valley 2",
+ "rom_arch": "ARM64",
+ "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 11 is the latest major release of Microsoft's Windows NT operating system, released on October 5, 2021 as the successor to Windows 10 (2015). It is provided free for any Windows 10 devices that meet the new Windows 11 system requirements. A server version, Windows Server 2025, was released in 2024. Windows 11 is the first major version of Windows NT without a companion mobile version following the discontinuations of Windows Phone with Windows 10 Mobile.",
+ "file_size": "13 GB",
+ "containsAds": true,
+ "creator": "Nguyen Bao An Bui",
+ "verified": true,
+ "vecid": "windows1122h2arm64cvbi",
+ "id": "99628"
+ },
{
"rom_name": "Windows 11 23H2",
"rom_icon": "https://www.getmyos.com/app_public/files/t/1/2021/06/windows_11_logo_by_getmyos.png",