- Bugs fixed.
This commit is contained in:
An Bui 2026-01-17 12:29:21 +07:00
parent 1828e39c78
commit 9038a15e5e
24 changed files with 216 additions and 155 deletions

View file

@ -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")

View file

@ -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>

View file

@ -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);

View file

@ -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;
}

View file

@ -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,
() -> {

View file

@ -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")

View file

@ -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();
}

View file

@ -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()) {

View file

@ -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),

View file

@ -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;
}
}
}

View file

@ -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);

View file

@ -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;
}
}
}

View file

@ -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);
}

View file

@ -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();
}
}

View file

@ -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>

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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())

View file

@ -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 {

View file

@ -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
}
}

View file

@ -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 {

View file

@ -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
}