mirror of
https://github.com/xoureldeen/Vectras-VM-Android.git
synced 2026-07-09 17:28:54 +00:00
3.7.1
- Bugs fixed.
This commit is contained in:
parent
1828e39c78
commit
9038a15e5e
24 changed files with 216 additions and 155 deletions
|
|
@ -1,8 +1,5 @@
|
|||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'com.google.gms.google-services'
|
||||
id 'com.google.firebase.crashlytics'
|
||||
}
|
||||
|
|
@ -15,8 +12,8 @@ android {
|
|||
applicationId "com.vectras.vm"
|
||||
minSdk minApi
|
||||
targetSdk targetApi
|
||||
versionCode 74
|
||||
versionName "3.7.0"
|
||||
versionCode 75
|
||||
versionName "3.7.1"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
multiDexEnabled true
|
||||
|
||||
|
|
@ -56,6 +53,7 @@ android {
|
|||
viewBinding true
|
||||
buildConfig true
|
||||
aidl true
|
||||
resValues = true
|
||||
}
|
||||
|
||||
splits {
|
||||
|
|
@ -64,11 +62,6 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
checkReleaseBuilds false
|
||||
abortOnError false
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_21
|
||||
targetCompatibility JavaVersion.VERSION_21
|
||||
|
|
@ -77,10 +70,9 @@ android {
|
|||
buildToolsVersion '36.1.0'
|
||||
ndkVersion '21'
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
jvmTarget.set(JvmTarget.JVM_21)
|
||||
}
|
||||
lint {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -94,7 +86,7 @@ dependencies {
|
|||
implementation "androidx.preference:preference-ktx:1.2.1"
|
||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0"
|
||||
implementation "androidx.viewpager:viewpager:1.1.0"
|
||||
implementation platform('com.google.firebase:firebase-bom:34.7.0')
|
||||
implementation platform('com.google.firebase:firebase-bom:34.8.0')
|
||||
implementation 'com.google.firebase:firebase-analytics'
|
||||
// implementation("com.google.firebase:firebase-auth")
|
||||
// implementation("com.google.firebase:firebase-database")
|
||||
|
|
|
|||
|
|
@ -274,14 +274,6 @@
|
|||
<meta-data
|
||||
android:name="android.max_aspect"
|
||||
android:value="10.0" />
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.ads.APPLICATION_ID"
|
||||
android:value="ca-app-pub-3568137780412047~1296857222" />
|
||||
|
||||
<property
|
||||
android:name="android.adservices.AD_SERVICES_CONFIG"
|
||||
android:resource="@xml/gma_ad_services_config"
|
||||
tools:replace="android:resource" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
@ -137,7 +137,7 @@ abstract class AbstractBitmapData {
|
|||
drawable = createDrawable();
|
||||
|
||||
if (drawable != null) {
|
||||
if (Build.VERSION.SDK_INT >= 34) {
|
||||
if (Build.VERSION.SDK_INT >= 32) {
|
||||
v.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
|
||||
}
|
||||
v.setImageDrawable(drawable);
|
||||
|
|
|
|||
|
|
@ -1314,18 +1314,30 @@ public class VncCanvas extends AppCompatImageView {
|
|||
}
|
||||
|
||||
public int getImageWidth() {
|
||||
if (bitmapData == null) {
|
||||
return 0;
|
||||
}
|
||||
return bitmapData.framebufferwidth;
|
||||
}
|
||||
|
||||
public int getImageHeight() {
|
||||
if (bitmapData == null) {
|
||||
return 0;
|
||||
}
|
||||
return bitmapData.framebufferheight;
|
||||
}
|
||||
|
||||
public int getCenteredXOffset() {
|
||||
if (bitmapData == null) {
|
||||
return 0;
|
||||
}
|
||||
return (bitmapData.framebufferwidth - getWidth()) / 2;
|
||||
}
|
||||
|
||||
public int getCenteredYOffset() {
|
||||
if (bitmapData == null) {
|
||||
return 0;
|
||||
}
|
||||
return (bitmapData.framebufferheight - getHeight()) / 2;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -817,7 +817,7 @@ public class VMManager {
|
|||
|
||||
public static boolean isRomsDataJsonValid(Boolean _needfix, Activity _context) {
|
||||
if (isFileExists(AppConfig.romsdatajson)) {
|
||||
if (!JSONUtils.isValidFromFile(AppConfig.romsdatajson)) {
|
||||
if (!JSONUtils.isValidVmList()) {
|
||||
if (_needfix) {
|
||||
DialogUtils.twoDialog(_context, _context.getString(R.string.problem_has_been_detected), _context.getString(R.string.need_fix_json_before_create), _context.getString(R.string.continuetext), _context.getString(R.string.cancel), true, R.drawable.build_24px, true,
|
||||
() -> {
|
||||
|
|
|
|||
|
|
@ -773,8 +773,8 @@ public class VMCreatorActivity extends AppCompatActivity {
|
|||
}
|
||||
|
||||
private void selectedDiskFile(Uri _content_describer, boolean _addtodrive) {
|
||||
if (FileUtils.isValidFilePath(this, FileUtils.getPath(this, _content_describer), false)) {
|
||||
new Thread(() -> {
|
||||
new Thread(() -> {
|
||||
if (FileUtils.isValidFilePath(this, FileUtils.getPath(this, _content_describer), false)) {
|
||||
File selectedFilePath = new File(getPath(_content_describer));
|
||||
runOnUiThread(() -> {
|
||||
if (VMManager.isADiskFile(selectedFilePath.getPath())) {
|
||||
|
|
@ -784,10 +784,10 @@ public class VMCreatorActivity extends AppCompatActivity {
|
|||
() -> startProcessingHardDriveFile(_content_describer, _addtodrive), null, null);
|
||||
}
|
||||
});
|
||||
}).start();
|
||||
} else {
|
||||
startProcessingHardDriveFile(_content_describer, _addtodrive);
|
||||
}
|
||||
} else {
|
||||
runOnUiThread(() ->startProcessingHardDriveFile(_content_describer, _addtodrive));
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
|
|
|
|||
|
|
@ -258,11 +258,17 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment.
|
|||
} else if (bindingContent.bottomNavigation.getSelectedItemId() != R.id.item_home) {
|
||||
bindingContent.bottomNavigation.setSelectedItemId(R.id.item_home);
|
||||
showBottomBarAndFab();
|
||||
} else if (bindingContent.efabCreate.getTranslationX() != 0f) {
|
||||
showBottomBarAndFab();
|
||||
} else if (MainSettingsManager.getQuickStart(MainActivity.this)) {
|
||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||
intent.addCategory(Intent.CATEGORY_HOME);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
try {
|
||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||
intent.addCategory(Intent.CATEGORY_HOME);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
} catch (Exception e) {
|
||||
finish();
|
||||
}
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import static android.os.Build.VERSION.SDK_INT;
|
|||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
||||
|
|
@ -16,6 +17,8 @@ import android.os.Environment;
|
|||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.StatFs;
|
||||
import android.os.storage.StorageManager;
|
||||
import android.os.storage.StorageVolume;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
|
@ -31,6 +34,7 @@ import com.vectras.vm.utils.CommandUtils;
|
|||
import com.vectras.vm.utils.DialogUtils;
|
||||
import com.vectras.vterm.Terminal;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
|
@ -178,21 +182,40 @@ public class SystemMonitorFragment extends Fragment {
|
|||
}
|
||||
|
||||
|
||||
StatFs externalStatFs = new StatFs( Environment.getExternalStorageDirectory().getAbsolutePath() );
|
||||
try {
|
||||
StatFs externalStatFs;
|
||||
if (SDK_INT >= 30) {
|
||||
if(!isAdded()) return;
|
||||
StorageManager sm =
|
||||
(StorageManager) requireContext().getSystemService(Context.STORAGE_SERVICE);
|
||||
|
||||
double totalStorage = (externalStatFs.getBlockCountLong() * externalStatFs.getBlockSizeLong()) * Math.pow(10, -9);
|
||||
double freeStorage = (externalStatFs.getAvailableBlocksLong() * externalStatFs.getBlockSizeLong()) * Math.pow(10, -9);
|
||||
double usedStorage = totalStorage - freeStorage;
|
||||
double percentageOfStorage = (100 / totalStorage) * usedStorage;
|
||||
StorageVolume volume = sm.getPrimaryStorageVolume();
|
||||
File dir = volume.getDirectory();
|
||||
assert dir != null;
|
||||
externalStatFs = new StatFs(dir.getAbsolutePath());
|
||||
} else {
|
||||
externalStatFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
|
||||
}
|
||||
|
||||
binding.tvTotalstorage.setText(getString(R.string.total_memory) + " " + String.format(Locale.US, "%.1f", totalStorage) + " GB");
|
||||
binding.tvUsedstorage.setText(getString(R.string.used_memory) + " " + String.format(Locale.US, "%.1f", usedStorage) + " GB");
|
||||
binding.tvFreestorage.setText(getString(R.string.free_memory) + " " + String.format(Locale.US, "%.1f", freeStorage) + " GB");
|
||||
binding.tvPercentageofstorage.setText((int) percentageOfStorage + "%");
|
||||
if (SDK_INT >= Build.VERSION_CODES.N) {
|
||||
binding.cpiStorage.setProgress((int) percentageOfStorage, true);
|
||||
} else {
|
||||
binding.cpiStorage.setProgress((int) percentageOfStorage);
|
||||
double totalStorage = (externalStatFs.getBlockCountLong() * externalStatFs.getBlockSizeLong()) * Math.pow(10, -9);
|
||||
double freeStorage = (externalStatFs.getAvailableBlocksLong() * externalStatFs.getBlockSizeLong()) * Math.pow(10, -9);
|
||||
double usedStorage = totalStorage - freeStorage;
|
||||
double percentageOfStorage = (100 / totalStorage) * usedStorage;
|
||||
|
||||
binding.tvTotalstorage.setText(getString(R.string.total_memory) + " " + String.format(Locale.US, "%.1f", totalStorage) + " GB");
|
||||
binding.tvUsedstorage.setText(getString(R.string.used_memory) + " " + String.format(Locale.US, "%.1f", usedStorage) + " GB");
|
||||
binding.tvFreestorage.setText(getString(R.string.free_memory) + " " + String.format(Locale.US, "%.1f", freeStorage) + " GB");
|
||||
binding.tvPercentageofstorage.setText((int) percentageOfStorage + "%");
|
||||
if (SDK_INT >= Build.VERSION_CODES.N) {
|
||||
binding.cpiStorage.setProgress((int) percentageOfStorage, true);
|
||||
} else {
|
||||
binding.cpiStorage.setProgress((int) percentageOfStorage);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
binding.tvTotalstorage.setText(getString(R.string.total_memory) + " " + getString(R.string.unknow));
|
||||
binding.tvUsedstorage.setText(getString(R.string.used_memory) + " " + getString(R.string.unknow));
|
||||
binding.tvFreestorage.setText(getString(R.string.free_memory) + " " + getString(R.string.unknow));
|
||||
binding.tvPercentageofstorage.setText(getString(R.string.unknow));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -208,8 +231,9 @@ public class SystemMonitorFragment extends Fragment {
|
|||
String qemuVersionName = CommandUtils.getQemuVersionName();
|
||||
if (!isAdded()) return;
|
||||
String result = Terminal.executeShellCommandWithResult("ps -e command && echo \"psendhere\" && cat /proc/cpuinfo", requireActivity());
|
||||
if (!isAdded()) return;
|
||||
requireActivity().runOnUiThread(() -> {
|
||||
binding.tvProcesses.setText(result.isEmpty() && !result.contains("\npsendhere") ? getString(R.string.nothing_here) : result.substring(0, result.indexOf("\npsendhere")));
|
||||
binding.tvProcesses.setText(!result.contains("\npsendhere") ? getString(R.string.nothing_here) : result.substring(0, result.indexOf("\npsendhere")));
|
||||
binding.tvQemuversion.setText(getString(R.string.version) + " " + (qemuVersionName.isEmpty() ? getString(R.string.unknow) : qemuVersionName) + ".");
|
||||
|
||||
if (!result.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -706,20 +706,25 @@ public class FileUtils {
|
|||
|
||||
public static String getFileNameFromUri(Context context, Uri uri) {
|
||||
String result = null;
|
||||
|
||||
Cursor cursor = context.getContentResolver().query(
|
||||
uri,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
cursor = context.getContentResolver().query(
|
||||
uri,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
|
||||
result = cursor.getString(nameIndex);
|
||||
}
|
||||
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
} catch (SecurityException ignored) {
|
||||
|
||||
} finally {
|
||||
|
|
@ -909,7 +914,7 @@ public class FileUtils {
|
|||
public static void openFolder(Context context, String folderPath) {
|
||||
File folder = new File(folderPath);
|
||||
|
||||
if (!folder.exists() || !folder.isDirectory()) {
|
||||
if (!folder.exists() || !folder.isDirectory() || folderPath.equals(Environment.getExternalStorageDirectory().toString())) {
|
||||
DialogUtils.oneDialog(
|
||||
context,
|
||||
context.getString(R.string.oops),
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import com.google.gson.Gson;
|
|||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.vectras.vm.AppConfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
|
@ -26,4 +27,14 @@ public class JSONUtils {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isValidVmList() {
|
||||
try {
|
||||
ArrayList<HashMap<String, Object>> vmList = new Gson().fromJson(FileUtils.readAFile(AppConfig.romsdatajson), new TypeToken<ArrayList<HashMap<String, Object>>>() {
|
||||
}.getType());
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ import java.util.Objects;
|
|||
|
||||
public class NetworkUtils {
|
||||
public static boolean isPortOpen(String host, int port, int timeout) {
|
||||
if (port > 65535) return false;
|
||||
|
||||
Socket socket = new Socket();
|
||||
try {
|
||||
socket.connect(new InetSocketAddress(host, port), timeout);
|
||||
|
|
|
|||
|
|
@ -49,4 +49,14 @@ public class PackageUtils {
|
|||
}
|
||||
return AppConfig.vectrasVersion;
|
||||
}
|
||||
|
||||
public static boolean isClassAvailable(String className) {
|
||||
try {
|
||||
Class.forName(className);
|
||||
return true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import android.view.SurfaceView;
|
|||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.vectras.vm.utils.PackageUtils;
|
||||
import com.vectras.vm.x11.input.InputStub;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
|
@ -200,6 +201,7 @@ public class LorieView extends SurfaceView implements InputStub {
|
|||
|
||||
@Override
|
||||
public void sendMouseWheelEvent(float deltaX, float deltaY) {
|
||||
if (!PackageUtils.isClassAvailable("com.termux.x11.CmdEntryPoint")) return;
|
||||
sendMouseEvent(deltaX, deltaY, BUTTON_SCROLL, false, true);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import android.app.Activity;
|
|||
import android.app.Dialog;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Looper;
|
||||
import static android.view.InputDevice.KEYBOARD_TYPE_ALPHABETIC;
|
||||
import static android.view.KeyEvent.*;
|
||||
|
|
@ -435,7 +437,7 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow
|
|||
Dialog dialog = new Dialog(activity);
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
dialog.setContentView(R.layout.dialog_programs);
|
||||
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
|
||||
Objects.requireNonNull(dialog.getWindow()).setBackgroundDrawableResource(android.R.color.transparent);
|
||||
|
||||
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
|
||||
layoutParams.alpha = 1f;
|
||||
|
|
@ -460,80 +462,68 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow
|
|||
dialog.dismiss();
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
if (!isFinishing() && !isDestroyed()) dialog.show();
|
||||
});
|
||||
|
||||
upGameBtn.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_UP, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_UP, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
upGameBtn.setOnTouchListener((v, event) -> {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_UP, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_UP, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
leftGameBtn.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_LEFT, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_LEFT, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
leftGameBtn.setOnTouchListener((v, event) -> {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_LEFT, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_LEFT, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
downGameBtn.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_DOWN, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_DOWN, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
downGameBtn.setOnTouchListener((v, event) -> {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_DOWN, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_DOWN, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
rightGameBtn.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_RIGHT, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_RIGHT, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
rightGameBtn.setOnTouchListener((v, event) -> {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
sendKey(KEYCODE_DPAD_RIGHT, false);
|
||||
v.animate().scaleXBy(-0.2f).setDuration(200).start();
|
||||
v.animate().scaleYBy(-0.2f).setDuration(200).start();
|
||||
return true;
|
||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
sendKey(KEYCODE_DPAD_RIGHT, true);
|
||||
v.animate().cancel();
|
||||
v.animate().scaleX(1f).setDuration(200).start();
|
||||
v.animate().scaleY(1f).setDuration(200).start();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
JoystickView joystick = findViewById(R.id.joyStick);
|
||||
joystick.setVisibility(View.GONE);
|
||||
|
|
@ -1388,7 +1378,8 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow
|
|||
super.onUserLeaveHint();
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
if (preferences.getBoolean("PIP", false) && hasPipPermission(this)) {
|
||||
if (SDK_INT >= VERSION_CODES.N) {
|
||||
if (SDK_INT >= VERSION_CODES.N &&
|
||||
getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
|
||||
enterPictureInPictureMode();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ad-services-config>
|
||||
<!-- Attribution API -->
|
||||
<attribution allowAllToAccess="true" />
|
||||
|
||||
<!-- Topics API -->
|
||||
<topics allowAllToAccess="true" />
|
||||
|
||||
<!-- Protected Audience on Android API -->
|
||||
<custom-audiences allowAllToAccess="true" />
|
||||
</ad-services-config>
|
||||
|
|
@ -9,7 +9,7 @@ buildscript {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.13.2'
|
||||
classpath 'com.android.tools.build:gradle:9.0.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
// Android Gradle plugin
|
||||
// Add other classpaths like Google Services and Firebase Crashlytics if needed here.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8
|
||||
#org.gradle.daemon=false
|
||||
SDK_VERSION=21
|
||||
android.useAndroidX=true
|
||||
android.useAndroidX=true
|
||||
android.uniquePackageNames=false
|
||||
android.dependency.useConstraints=true
|
||||
android.r8.strictFullModeForKeepRules=false
|
||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
|
@ -1,7 +1,7 @@
|
|||
#Mon Dec 08 19:38:26 ICT 2025
|
||||
#Sat Jan 17 10:24:16 ICT 2026
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
plugins {
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
|
||||
}
|
||||
rootProject.name = "Vectras VM"
|
||||
|
||||
include ':app', ':terminal-emulator', ':terminal-view', ':shell-loader:stub', ':shell-loader'
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ apply plugin: 'com.android.application'
|
|||
|
||||
android {
|
||||
|
||||
buildToolsVersion '35.0.0'
|
||||
compileSdk 35
|
||||
buildToolsVersion '36.1.0'
|
||||
compileSdk 36
|
||||
}
|
||||
|
||||
android.namespace 'com.vectras.vm'
|
||||
|
|
@ -14,7 +14,13 @@ android.buildFeatures.buildConfig true
|
|||
android.compileOptions.sourceCompatibility SDK_VERSION
|
||||
android.compileOptions.targetCompatibility SDK_VERSION
|
||||
dependencies.compileOnly project(':shell-loader:stub')
|
||||
android.applicationVariants.configureEach { outputs.configureEach { outputFileName = "loader.apk" } }
|
||||
androidComponents {
|
||||
onVariants(selector().all()) { variant ->
|
||||
variant.outputs.forEach { output ->
|
||||
output.outputFileName.set("loader.apk")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def signingConfig = project(':app').android.signingConfigs.debug
|
||||
def keyStore = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType())
|
||||
|
|
|
|||
|
|
@ -4,12 +4,11 @@ plugins {
|
|||
|
||||
android {
|
||||
namespace 'com.termux.x11.stub'
|
||||
buildToolsVersion "35.0.0"
|
||||
compileSdkVersion 35
|
||||
buildToolsVersion "36.1.0"
|
||||
compileSdkVersion 36
|
||||
defaultConfig {
|
||||
minSdkVersion 24
|
||||
//noinspection ExpiredTargetSdkVersion
|
||||
targetSdkVersion 28
|
||||
}
|
||||
buildFeatures {
|
||||
buildConfig false
|
||||
|
|
@ -23,6 +22,12 @@ android {
|
|||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
lint {
|
||||
targetSdk 28
|
||||
}
|
||||
testOptions {
|
||||
targetSdk 28
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
|
|
|||
|
|
@ -8,14 +8,13 @@ android {
|
|||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
//noinspection ExpiredTargetSdkVersion
|
||||
targetSdkVersion 28
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
|
|
@ -26,6 +25,10 @@ android {
|
|||
|
||||
testOptions {
|
||||
unitTests.returnDefaultValues = true
|
||||
targetSdk 28
|
||||
}
|
||||
lint {
|
||||
targetSdk 28
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,14 +13,13 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
//noinspection ExpiredTargetSdkVersion
|
||||
targetSdkVersion 28
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -28,6 +27,12 @@ android {
|
|||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
lint {
|
||||
targetSdk 28
|
||||
}
|
||||
testOptions {
|
||||
targetSdk 28
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases",
|
||||
"Message": "<h2>3.7.0</h2>\nBugs fixed.",
|
||||
"cancellable": true,
|
||||
"versionCodeBeta":"74",
|
||||
"versionNameBeta":"3.7.0",
|
||||
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.0",
|
||||
"sizeBeta": "43 MB",
|
||||
"versionCodeBeta":"75",
|
||||
"versionNameBeta":"3.7.1",
|
||||
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.0,3.7.1",
|
||||
"sizeBeta": "45 MB",
|
||||
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
|
||||
"MessageBeta": "<h2>3.7.0</h2>Bugs fixed.",
|
||||
"MessageBeta": "<h2>3.7.1</h2>Bugs fixed.",
|
||||
"cancellableBeta": true
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue