This commit is contained in:
An Bui 2025-03-13 10:46:27 +07:00
parent e8559457e4
commit aa9e285f2b
13 changed files with 109 additions and 35 deletions

View file

@ -104,7 +104,7 @@ public class CqcmActivity extends AppCompatActivity {
if (mapForCreateNewVM.containsKey("imgExtra")) {
imgExtra = Objects.requireNonNull(mapForCreateNewVM.get("imgExtra")).toString();
}
VMManager.createNewVM(imgName, imgIcon, imgPath, imgArch, imgCdrom, imgExtra, vmID);
VMManager.createNewVM(imgName, imgIcon, imgPath, imgArch, imgCdrom, imgExtra, vmID, VMManager.startRandomPort());
} else {
Toast.makeText(getApplicationContext(), "The data for the new virtual machine is corrupted and cannot be created.", Toast.LENGTH_LONG).show();
}

View file

@ -99,6 +99,7 @@ public class CustomRomActivity extends AppCompatActivity {
public String secondVMdirectory = "";
public boolean addromnowdone = false;
public String vmID = VMManager.idGenerator();
public int port = VMManager.startRandomPort();
private boolean created = false;
public static CustomRomActivity activity;
@ -1034,7 +1035,7 @@ public class CustomRomActivity extends AppCompatActivity {
if (modify) {
VMManager.editVM(Objects.requireNonNull(title.getText()).toString(), thumbnailPath, Objects.requireNonNull(drive.getText()).toString(), MainSettingsManager.getArch(activity), Objects.requireNonNull(cdrom.getText()).toString(), Objects.requireNonNull(qemu.getText()).toString(), getIntent().getIntExtra("POS", 0));
} else {
VMManager.createNewVM(Objects.requireNonNull(title.getText()).toString(), thumbnailPath, Objects.requireNonNull(drive.getText()).toString(), MainSettingsManager.getArch(activity), Objects.requireNonNull(cdrom.getText()).toString(), Objects.requireNonNull(qemu.getText()).toString(), vmID);
VMManager.createNewVM(Objects.requireNonNull(title.getText()).toString(), thumbnailPath, Objects.requireNonNull(drive.getText()).toString(), MainSettingsManager.getArch(activity), Objects.requireNonNull(cdrom.getText()).toString(), Objects.requireNonNull(qemu.getText()).toString(), vmID, port);
}
created = true;

View file

@ -170,7 +170,7 @@ public class MainActivity extends AppCompatActivity {
linearnothinghere = findViewById(R.id.linearnothinghere);
TextView tvLogin = findViewById(R.id.tvLogin);
tvLogin.setText("LOGIN --> " + Config.defaultVNCHost + ":" + (5900 + Config.defaultVNCPort)/* + "\nPASSWORD --> " + Config.defaultVNCPasswd*/);
tvLogin.setText("LOGIN --> " + Config.defaultVNCHost + ":" + (5901)/* + "\nPASSWORD --> " + Config.defaultVNCPasswd*/);
Button stopBtn = findViewById(R.id.stopBtn);
stopBtn.setOnClickListener(new View.OnClickListener() {
@ -747,25 +747,42 @@ public class MainActivity extends AppCompatActivity {
if (MainSettingsManager.getcheckforupdatesfromthebetachannel(activity)) {
versionNameonUpdate = obj.getString("versionNameBeta");
if (versionCode < obj.getInt("versionCode") || !versionNameonUpdate.equals(versionName)) {
AlertDialog.Builder alert = new AlertDialog.Builder(activity, R.style.MainDialogTheme);
alert.setTitle("Install the latest version")
.setMessage(Html.fromHtml(obj.getString("MessageBeta") + "<br><br>Update size:<br>" + obj.getString("sizeBeta")))
.setCancelable(obj.getBoolean("cancellableBeta"))
.setNegativeButton("Update", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
startActivity(new Intent(ACTION_VIEW, Uri.parse(obj.getString("urlBeta"))));
} catch (JSONException e) {
}
}
}).show();
}
} else {
versionNameonUpdate = obj.getString("versionName");
}
if (versionCode < obj.getInt("versionCode") || !versionNameonUpdate.contains(versionName)) {
AlertDialog.Builder alert = new AlertDialog.Builder(activity, R.style.MainDialogTheme);
alert.setTitle("Install the latest version")
.setMessage(Html.fromHtml(obj.getString("Message") + "<br><br>update size:<br>" + obj.getString("size")))
.setCancelable(obj.getBoolean("cancellable"))
.setNegativeButton("Update", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
startActivity(new Intent(ACTION_VIEW, Uri.parse(obj.getString("url"))));
} catch (JSONException e) {
if (versionCode < obj.getInt("versionCode") || !versionNameonUpdate.contains(versionName)) {
AlertDialog.Builder alert = new AlertDialog.Builder(activity, R.style.MainDialogTheme);
alert.setTitle("Install the latest version")
.setMessage(Html.fromHtml(obj.getString("Message") + "<br><br>Update size:<br>" + obj.getString("size")))
.setCancelable(obj.getBoolean("cancellable"))
.setNegativeButton("Update", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
startActivity(new Intent(ACTION_VIEW, Uri.parse(obj.getString("url"))));
} catch (JSONException e) {
}
}
}
}).show();
}).show();
}
}
} else if (result.contains("Error on getting data") && showDialog) {
errorUpdateDialog(result);
@ -811,6 +828,11 @@ public class MainActivity extends AppCompatActivity {
} catch (JSONException ignored) {
romsMainData.vmID = "";
}
try {
romsMainData.qmpPort = json_data.getInt("qmpPort");
} catch (JSONException ignored) {
romsMainData.qmpPort= 0;
}
try {
romsMainData.itemDrv1 = json_data.getString("imgDrv1");
} catch (JSONException ignored) {
@ -930,6 +952,9 @@ public class MainActivity extends AppCompatActivity {
public static void startVM(String vmName, String env, String itemExtra, String itemPath) {
File romDir = new File(Config.getCacheDir()+ "/" + Config.vmID);
romDir.mkdirs();
if (!VMManager.isthiscommandsafe(env)) {
VectrasApp.oneDialog(activity.getResources().getString(R.string.problem_has_been_detected), activity.getResources().getString(R.string.harmful_command_was_detected), true, false, activity);
return;
@ -995,15 +1020,20 @@ public class MainActivity extends AppCompatActivity {
handler.postDelayed(
new Runnable() {
public void run() {
Intent serviceIntent = new Intent(activity, MainService.class);
MainService.env = env;
MainService.CHANNEL_ID = vmName;
if (SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(serviceIntent);
if (isRunning) {
MainService.startCommand(env, activity);
} else {
activity.startService(serviceIntent);
Intent serviceIntent = new Intent(activity, MainService.class);
MainService.env = env;
MainService.CHANNEL_ID = vmName;
if (SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(serviceIntent);
} else {
activity.startService(serviceIntent);
}
}
if (MainSettingsManager.getVmUi(activity).equals("VNC")) {
if (MainSettingsManager.getVncExternal(MainActivity.activity)) {
extVncLayout.setVisibility(View.VISIBLE);

View file

@ -36,6 +36,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.qemu.MainVNCActivity;
import com.vectras.vm.AppConfig;
@ -151,6 +152,12 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
public void onClick(View view) {
VMManager.setArch(current.itemArch, MainActivity.activity);
StartVM.cdrompath = current.imgCdrom;
if (current.qmpPort == 0) {
Config.setDefault();
} else {
Config.QMPPort = current.qmpPort;
}
Config.vmID = current.vmID;
String env = StartVM.env(MainActivity.activity, current.itemExtra, current.itemPath, "");
MainActivity.startVM(current.itemName, env, current.itemExtra, current.itemPath);
}

View file

@ -9,4 +9,5 @@ public class DataMainRoms {
public String itemExtra;
public String imgCdrom;
public String vmID;
public int qmpPort;
}

View file

@ -1,10 +1,12 @@
package com.vectras.vm;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
@ -107,4 +109,10 @@ public class MainService extends Service {
manager.createNotificationChannel(serviceChannel);
}
}
public static void startCommand(String _env, Activity _activity) {
Terminal vterm = new Terminal(_activity);
vterm.executeShellCommand2("dwm", false, _activity);
vterm.executeShellCommand2(_env, true, _activity);
}
}

View file

@ -257,7 +257,7 @@ public class StartVM {
//params.add("-full-screen");
params.add("-qmp");
params.add("tcp:localhost:4444,server,nowait");
params.add("tcp:localhost:" + Config.QMPPort + ",server,nowait");
return String.join(" ", params);
}

View file

@ -43,7 +43,7 @@ public class VMManager {
public static int restoredVMs = 0;
public static boolean isKeptSomeFiles = false;
public static void createNewVM(String name, String thumbnail, String drive, String arch, String cdrom, String params, String vmID) {
public static void createNewVM(String name, String thumbnail, String drive, String arch, String cdrom, String params, String vmID, int port) {
mapForCreateNewVM.clear();
mapForCreateNewVM.put("imgName", name);
mapForCreateNewVM.put("imgIcon", thumbnail);
@ -52,6 +52,7 @@ public class VMManager {
mapForCreateNewVM.put("imgExtra", params);
mapForCreateNewVM.put("imgArch", arch);
mapForCreateNewVM.put("vmID", vmID);
mapForCreateNewVM.put("qmpPort", port);
listmapForCreateNewVM.clear();
listmapForCreateNewVM = new Gson().fromJson(VectrasApp.readFile(AppConfig.romsdatajson), new TypeToken<ArrayList<HashMap<String, Object>>>(){}.getType());
@ -76,6 +77,11 @@ public class VMManager {
mapForCreateNewVM.put("imgCdrom", cdrom);
mapForCreateNewVM.put("imgExtra", params);
mapForCreateNewVM.put("imgArch", arch);
if (listmapForCreateNewVM.get(position).containsKey("qmpPort")) {
mapForCreateNewVM.put("qmpPort", listmapForCreateNewVM.get(position).get("qmpPort"));
} else {
mapForCreateNewVM.put("qmpPort", startRandomPort());
}
if (listmapForCreateNewVM.get(position).containsKey("vmID")) {
mapForCreateNewVM.put("vmID", Objects.requireNonNull(listmapForCreateNewVM.get(position).get("vmID")).toString());
@ -195,6 +201,13 @@ public class VMManager {
return addAdb + String.valueOf((long)(random.nextInt(10001)));
}
public static int startRandomPort() {
Random _random = new Random();
int _min = 10000;
int _max = 65535;
return _random.nextInt(_max - _min + 1) + _min;
}
public static void deleteVM() {
listmapForRemoveVM.clear();
listmapForRemoveVM = new Gson().fromJson(pendingJsonContent, new TypeToken<ArrayList<HashMap<String, Object>>>(){}.getType());
@ -638,7 +651,7 @@ public class VMManager {
});
alertDialog.show();
return true;
} else if (_result.contains("No such file or directory")) {
} else if (_result.contains("No such file or directory1")) {
//Error code: NO_SUCH_FILE_OR_DIRECTORY
VectrasApp.oneDialog(_activity.getResources().getString(R.string.problem_has_been_detected), _activity.getResources().getString(R.string.error_NO_SUCH_FILE_OR_DIRECTORY), true, false, _activity);
_activity.stopService(new Intent(_activity, MainService.class));