This commit is contained in:
An Bui 2025-05-05 12:44:27 +07:00
parent 12f03e21ab
commit 4c5d534e10
48 changed files with 332 additions and 294 deletions

View file

@ -23,7 +23,7 @@ public class AppConfig {
public static int vectrasVersionCode = 21;
public static String vectrasWebsite = "https://vectras.vercel.app/";
public static String vectrasWebsiteRaw = "https://raw.githubusercontent.com/xoureldeen/Vectras-VM-Android/refs/heads/master/web/";
public static String bootstrapfileslink = vectrasWebsite + "/data/setupfiles.json";
public static String bootstrapfileslink = vectrasWebsiteRaw + "/data/setupfiles.json";
public static String vectrasHelp = vectrasWebsite + "how.html";
public static String community = vectrasWebsite + "community.html";
public static String vectrasRaw = vectrasWebsiteRaw + "data/";
@ -75,7 +75,7 @@ public class AppConfig {
public static String vmFolder = maindirpath + "roms/";
public static String pendingCommand = "";
public static String neededPkgs = "tar dwm xfce4-terminal libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" +
public static String neededPkgs = "aria2 tar dwm xfce4-terminal libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" +
" libusbredirparser usbredir-dev libiscsi-dev sdl2 sdl2-dev libepoxy-dev virglrenderer-dev rdma-core" +
" libusb ncurses-libs curl libnfs sdl2 gtk+3.0 fuse libpulse libseccomp jack pipewire liburing" +
" mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl mesa-gbm mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno mesa-vulkan-panfrost";
@ -84,4 +84,8 @@ public class AppConfig {
public static String temporaryLastedTerminalOutput = "";
public static String telegramLink = "https://t.me/vectras_os";
public static String patreonLink = "https://www.patreon.com/VectrasTeam";
}

View file

@ -2,6 +2,7 @@ package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import static android.content.Intent.ACTION_VIEW;
import static android.view.View.GONE;
import com.termux.app.TermuxService;
import static com.vectras.vm.utils.UIUtils.UIAlert;
@ -15,12 +16,14 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.opengl.Visibility;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -38,6 +41,7 @@ import android.widget.BaseAdapter;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
@ -108,6 +112,8 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
private ArrayList<HashMap<String, String>> listmapForSelectMirrors = new ArrayList<>();
private String selectedMirrorCommand = "";
private String selectedMirrorLocation = "";
private String downloadBootstrapsCommand = "";
private boolean aria2Error = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -173,7 +179,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
_net_request_listener = new RequestNetwork.RequestListener() {
@Override
public void onResponse(String tag, String response, HashMap<String, Object> responseHeaders) {
linearload.setVisibility(View.GONE);
linearload.setVisibility(GONE);
contentJSON = response;
if (JSONUtils.isMapValidFromString(contentJSON)) {
mmap.clear();
@ -184,28 +190,29 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
} else {
bootstrapfilelink = mmap.get("x86_64").toString();
}
linearcannotconnecttoserver.setVisibility(View.GONE);
}
if (AppConfig.needreinstallsystem) {
AppConfig.needreinstallsystem = false;
if (!MainSettingsManager.getsetUpWithManualSetupBefore(SetupQemuActivity.this)) {
if (AppConfig.getSetupFiles().contains("arm64-v8a") || AppConfig.getSetupFiles().contains("x86_64")) {
setupVectras64();
} else {
setupVectras32();
}
textviewsettingup.setText(getResources().getString(R.string.reinstalling));
simpleSetupUIControler(1);
downloadBootstrapsCommand = " aria2c -x 4 -o setup.tar.gz " + bootstrapfilelink;
if (!bootstrapfilelink.isEmpty()) {
linearcannotconnecttoserver.setVisibility(GONE);
}
}
} else {
linearload.setVisibility(View.GONE);
// if (AppConfig.needreinstallsystem) {
// AppConfig.needreinstallsystem = false;
// if (!MainSettingsManager.getsetUpWithManualSetupBefore(SetupQemuActivity.this)) {
// if (AppConfig.getSetupFiles().contains("arm64-v8a") || AppConfig.getSetupFiles().contains("x86_64")) {
// setupVectras64();
// } else {
// setupVectras32();
// }
// textviewsettingup.setText(getResources().getString(R.string.reinstalling));
// simpleSetupUIControler(1);
// }
// }
}
}
@Override
public void onErrorResponse(String tag, String message) {
linearload.setVisibility(View.GONE);
linearload.setVisibility(GONE);
}
};
@ -216,6 +223,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
extractBootstraps();
}
setupOnClick();
}
public void extractBootstraps() {
@ -362,9 +370,9 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
} else if (id == R.id.buttonsetuptryagain) {
simpleSetupUIControler(0);
} else if (id == R.id.buttonsetupshowlog) {
linearsimplesetupui.setVisibility(View.GONE);
linearsimplesetupui.setVisibility(GONE);
} else if (id == R.id.textviewshowadvancedsetup) {
linearsimplesetupui.setVisibility(View.GONE);
linearsimplesetupui.setVisibility(GONE);
if (linearstartsetup.getVisibility() == View.VISIBLE) {
alertDialog.show();
}
@ -375,7 +383,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
linearsimplesetupui.setVisibility(View.VISIBLE);
alertDialog.dismiss();
} else if (id == R.id.buttonletstart) {
linearwelcome.setVisibility(View.GONE);
linearwelcome.setVisibility(GONE);
net.startRequestNetwork(RequestNetworkController.GET,AppConfig.bootstrapfileslink,"anbui",_net_request_listener);
}
}
@ -391,10 +399,13 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
vterm.append(textToAdd);
if (textToAdd.contains("xssFjnj58Id")) {
startActivity(new Intent(this, MainActivity.class));
finish();
linearsimplesetupui.setVisibility(GONE);
CardView advancedsetup = findViewById(R.id.advancedsetup);
advancedsetup.setVisibility(GONE);
} else if (textToAdd.contains("libproot.so --help")){
libprooterror = true;
} else if (textToAdd.contains("not complete: /root/setup.tar.gz")){
aria2Error = true;
}
if (textToAdd.contains("Starting setup...")) {
@ -520,14 +531,16 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
// Check if the exit value indicates an error
if (exitValue != 0) {
// If exit value is not zero, display a toast message
String toastMessage = "Command failed with exit code: " + exitValue;
activity.runOnUiThread(() -> {
appendTextAndScroll("Error: " + toastMessage + "\n");
Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show();
inBtn.setVisibility(View.VISIBLE);
title.setText("Failed!");
simpleSetupUIControler(2);
});
if (!aria2Error) {
String toastMessage = "Command failed with exit code: " + exitValue;
activity.runOnUiThread(() -> {
appendTextAndScroll("Error: " + toastMessage + "\n");
Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show();
inBtn.setVisibility(View.VISIBLE);
title.setText("Failed!");
simpleSetupUIControler(2);
});
}
if (libprooterror) {
AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
alertDialog.setTitle(getResources().getString(R.string.oops));
@ -548,6 +561,14 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
});
alertDialog.show();
} else if (aria2Error && downloadBootstrapsCommand.contains("aria2c")) {
downloadBootstrapsCommand = " curl -o setup.tar.gz -L " + bootstrapfilelink;
if (AppConfig.getSetupFiles().contains("arm64-v8a") || AppConfig.getSetupFiles().contains("x86_64")) {
setupVectras64();
} else {
setupVectras32();
}
inBtn.setVisibility(GONE);
}
}
} catch (IOException | InterruptedException e) {
@ -668,7 +689,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
private void setupVectras() {
simpleSetupUIControler(1);
inBtn.setVisibility(View.GONE);
inBtn.setVisibility(GONE);
progressBar.setVisibility(View.VISIBLE);
String filesDir = activity.getFilesDir().getAbsolutePath();
String neededPkgs = AppConfig.neededPkgs;
@ -694,7 +715,8 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
}
private void setupVectras32() {
inBtn.setVisibility(View.GONE);
aria2Error = false;
inBtn.setVisibility(GONE);
progressBar.setVisibility(View.VISIBLE);
String filesDir = activity.getFilesDir().getAbsolutePath();
String cmd = "";
@ -716,7 +738,8 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
}
private void setupVectras64() {
inBtn.setVisibility(View.GONE);
aria2Error = false;
inBtn.setVisibility(GONE);
progressBar.setVisibility(View.VISIBLE);
String filesDir = activity.getFilesDir().getAbsolutePath();
String cmd = "";
@ -728,7 +751,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
" echo \"Installing packages...\";" +
" apk add " + AppConfig.neededPkgs + ";" +
" echo \"Downloading Qemu...\";" +
" curl -o setup.tar.gz -L " + bootstrapfilelink + ";" +
downloadBootstrapsCommand + ";" +
" echo \"Installing Qemu...\";" +
" tar -xzvf setup.tar.gz -C /;" +
" rm setup.tar.gz;" +
@ -789,7 +812,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
if (tarGZ.exists()) {
setupVectras();
} else {
if (linearsimplesetupui.getVisibility() == View.GONE) {
if (linearsimplesetupui.getVisibility() == GONE) {
alertDialog.show();
}
}
@ -800,15 +823,15 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
private void simpleSetupUIControler(int status) {
if (status == 0) {
linearstartsetup.setVisibility(View.VISIBLE);
linearsettingup.setVisibility(View.GONE);
linearsetupfailed.setVisibility(View.GONE);
linearsettingup.setVisibility(GONE);
linearsetupfailed.setVisibility(GONE);
} else if (status == 1) {
linearstartsetup.setVisibility(View.GONE);
linearstartsetup.setVisibility(GONE);
linearsettingup.setVisibility(View.VISIBLE);
linearsetupfailed.setVisibility(View.GONE);
linearsetupfailed.setVisibility(GONE);
} else if (status == 2) {
linearstartsetup.setVisibility(View.GONE);
linearsettingup.setVisibility(View.GONE);
linearstartsetup.setVisibility(GONE);
linearsettingup.setVisibility(GONE);
linearsetupfailed.setVisibility(View.VISIBLE);
}
}
@ -853,7 +876,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
Runnable runnable = new Runnable() {
@Override
public void run() {
loading.setVisibility(View.GONE);
loading.setVisibility(GONE);
alertDialog.dismiss();
setupVectras();
MainSettingsManager.setsetUpWithManualSetupBefore(SetupQemuActivity.this, true);
@ -866,7 +889,7 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
Runnable runnable = new Runnable() {
@Override
public void run() {
loading.setVisibility(View.GONE);
loading.setVisibility(GONE);
UIAlert(activity, e.toString(), "error");
}
};
@ -875,13 +898,13 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
}
}).start();
} else {
if (linearsimplesetupui.getVisibility() == View.GONE) {
if (linearsimplesetupui.getVisibility() == GONE) {
alertDialog.show();
}
UIAlert(activity, "INVALID FILE", "please select vectras-vm-" + abi + ".tar.gz file");
}
} else
if (linearsimplesetupui.getVisibility() == View.GONE) {
if (linearsimplesetupui.getVisibility() == GONE) {
alertDialog.show();
}
}
@ -893,6 +916,65 @@ public class SetupQemuActivity extends AppCompatActivity implements View.OnClick
spinnerselectmirror.setSelection(MainSettingsManager.getSelectedMirror(activity));
}
private void setupOnClick() {
LinearLayout linearcommunity = findViewById(R.id.linearcommunity);
LinearLayout lineardonate = findViewById(R.id.lineardonate);
Button dontjointtelegrambutton = findViewById(R.id.dontjointtelegrambutton);
dontjointtelegrambutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linearcommunity.setVisibility(View.GONE);
}
});
Button jointelegrambutton = findViewById(R.id.jointelegrambutton);
jointelegrambutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linearcommunity.setVisibility(GONE);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(AppConfig.telegramLink));
startActivity(intent);
//Don't show join Telegram dialog again
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean("tgDialog", true);
edit.apply();
}
});
Button dontdonatebutton = findViewById(R.id.dontdonatebutton);
dontdonatebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
lineardonate.setVisibility(View.GONE);
}
});
Button donatebuuton = findViewById(R.id.donatebutton);
donatebuuton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
lineardonate.setVisibility(View.GONE);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(AppConfig.patreonLink));
startActivity(intent);
}
});
Button done100 = findViewById(R.id.done100);
done100.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!AppConfig.needreinstallsystem) {
startActivity(new Intent(SetupQemuActivity.this, MainActivity.class));
} else {
AppConfig.needreinstallsystem = false;
}
finish();
}
});
}
public class SpinnerSelectMirrorAdapter extends BaseAdapter {
ArrayList<HashMap<String, String>> _data;