- Added software and drivers.
- Fixed the issue of virtual machines not running with X11.
This commit is contained in:
An Bui 2025-12-20 12:53:05 +07:00
parent bcc3abdf79
commit 9ae5548f52
56 changed files with 789 additions and 2104 deletions

Binary file not shown.

View file

@ -15,10 +15,12 @@ android {
applicationId "com.vectras.vm"
minSdk minApi
targetSdk targetApi
versionCode 50
versionName "3.4.6"
versionCode 51
versionName "3.4.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
resValue "string", "app_version", versionName
}
signingConfigs {

View file

@ -23,6 +23,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
@ -69,7 +70,7 @@
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"
android:exported="false" />
<activity
android:name=".home.HomeActivity"
android:name=".main.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"
android:exported="false"
android:windowSoftInputMode="adjustResize" />
@ -137,12 +138,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"
android:exported="true"
android:hardwareAccelerated="true"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".setupwizard.SetupWizardActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout"

View file

@ -14,7 +14,7 @@ import androidx.core.app.ActivityCompat;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.JSONUtils;
import com.vectras.vm.utils.PermissionUtils;
@ -115,7 +115,7 @@ public class CqcmActivity extends AppCompatActivity {
} else {
Toast.makeText(getApplicationContext(), "The virtual machine list data is corrupted and new virtual machines cannot be added right now.", Toast.LENGTH_LONG).show();
}
if(!HomeActivity.isActivate) {
if(!MainActivity.isActivate) {
Log.i("CqcmActivity", "Vectras VM is not opening.");
gotoActivity.setClass(getApplicationContext(), SplashActivity.class);
startActivity(gotoActivity);
@ -133,7 +133,7 @@ public class CqcmActivity extends AppCompatActivity {
private void runCommand(String _command) {
AppConfig.pendingCommand = _command;
if(!HomeActivity.isActivate) {
if(!MainActivity.isActivate) {
Log.i("CqcmActivity", "Vectras VM is not opening.");
gotoActivity.setClass(getApplicationContext(), SplashActivity.class);
startActivity(gotoActivity);
@ -142,7 +142,7 @@ public class CqcmActivity extends AppCompatActivity {
Log.i("CqcmActivity", "Vectras VM is opening.");
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClass(this, HomeActivity.class);
intent.setClass(this, MainActivity.class);
startActivity(intent);
Log.i("CqcmActivity", "Opened HomeActivity.");
}

View file

@ -1,49 +0,0 @@
package com.vectras.vm.Fragment;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.material.navigation.NavigationView;
import com.vectras.vm.R;
public class DialogSettingsFragment extends Fragment {
public View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.content_settings_dialog, container, false);
NavigationView navView = view.findViewById(R.id.navView);
View fragment = view.findViewById(R.id.fragment);
navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger on item Click of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
//Check to see which item was being clicked and perform appropriate action
int id = menuItem.getItemId();
if (id == R.id.uiInterface) {
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment, new UiSettingsFragment(), "UiSettingsFragmentTag");
ft.commit();
}
return false;
}
});
return view;
}
}

View file

@ -1,43 +0,0 @@
package com.vectras.vm.Fragment;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.qemu.MainVNCActivity;
import com.vectras.vm.R;
public class UiSettingsFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_ui_settings, container, false);
TextView btnMouseMode = v.findViewById(R.id.btnMouseMode);
btnMouseMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MainSettingsManager.getVmUi(getActivity()).equals("SDL")) {
//MainSDLActivity.activity.onMouseMode();
} else if (MainSettingsManager.getVmUi(getActivity()).equals("VNC")) {
MainVNCActivity.activity.onMouseMode();
}
}
});
// Inflate the layout for this fragment
return v;
}
}

File diff suppressed because it is too large Load diff

View file

@ -21,7 +21,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.vectras.qemu.Config;
import com.vectras.vm.VMCreatorActivity;
import com.vectras.vm.ExportRomActivity;
import com.vectras.vm.MainActivity;
import com.vectras.vm.R;
import com.vectras.vm.StartVM;
import com.vectras.vm.VMManager;
@ -110,7 +109,7 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
}
Config.vmID = current.vmID;
String env = StartVM.env(activity, current.itemExtra, current.itemPath, false);
MainActivity.startVM(current.itemName, env, current.itemExtra, current.itemPath);
//MainActivity.startVM(current.itemName, env, current.itemExtra, current.itemPath);
});
myHolder.cdRoms.setOnLongClickListener(v -> {

View file

@ -29,9 +29,8 @@ import androidx.appcompat.widget.Toolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.termux.app.TermuxService;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.setupwizard.SetupWizard2Activity;
import com.vectras.vm.setupwizard.SetupWizardActivity;
import com.vectras.vm.utils.CommandUtils;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
@ -292,7 +291,7 @@ public class Minitools extends AppCompatActivity {
progressDialog.show();
new Thread(() -> {
HomeActivity.isActivate = false;
MainActivity.isActivate = false;
AppConfig.needreinstallsystem = true;
VMManager.killallqemuprocesses(this);
FileUtils.deleteDirectory(getFilesDir().getAbsolutePath() + "/data");

View file

@ -70,42 +70,6 @@ public class RomInfo extends AppCompatActivity {
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
binding.toolbar.setNavigationOnClickListener(v -> finish());
binding.btnDownload.setOnClickListener(v -> {
Intent openurl = new Intent();
openurl.setAction(Intent.ACTION_VIEW);
openurl.setData(Uri.parse(getIntent().getStringExtra("getrom")));
startActivity(openurl);
});
binding.btnPick.setOnClickListener(v -> romPicker.launch("*/*"));
if (getIntent().hasExtra("title")) {
binding.textName.setText(getIntent().getStringExtra("title"));
}
if (getIntent().hasExtra("shortdesc")) {
binding.textSize.setText(getIntent().getStringExtra("shortdesc"));
}
if (getIntent().hasExtra("desc")) {
binding.descTxt.setText(getIntent().getStringExtra("desc"));
}
if (getIntent().hasExtra("icon")) {
Glide.with(this).load(getIntent().getStringExtra("icon")).placeholder(R.drawable.ic_computer_180dp_with_padding).error(R.drawable.ic_computer_180dp_with_padding).into(binding.ivIcon);
}
if (getIntent().hasExtra("id") &&
!Objects.requireNonNull(getIntent().getStringExtra("id")).isEmpty()) {
isAnBuiID = true;
contentID = getIntent().getStringExtra("id");
} else if (getIntent().hasExtra("vecid") &&
!Objects.requireNonNull(getIntent().getStringExtra("vecid")).isEmpty()) {
contentID = getIntent().getStringExtra("vecid");
}
initialize();
}
@ -206,6 +170,47 @@ public class RomInfo extends AppCompatActivity {
}
private void initialize() {
binding.toolbar.setNavigationOnClickListener(v -> finish());
binding.btnDownload.setOnClickListener(v -> {
Intent openurl = new Intent();
openurl.setAction(Intent.ACTION_VIEW);
openurl.setData(Uri.parse(getIntent().getStringExtra("getrom")));
startActivity(openurl);
});
if (getIntent().hasExtra("isRomInfo") && getIntent().getBooleanExtra("isRomInfo", false)) {
binding.btnPick.setOnClickListener(v -> romPicker.launch("*/*"));
} else {
binding.btnPick.setVisibility(View.GONE);
}
if (getIntent().hasExtra("title")) {
binding.textName.setText(getIntent().getStringExtra("title"));
}
if (getIntent().hasExtra("shortdesc")) {
binding.textSize.setText(getIntent().getStringExtra("shortdesc"));
}
if (getIntent().hasExtra("desc")) {
binding.descTxt.setText(getIntent().getStringExtra("desc"));
}
if (getIntent().hasExtra("icon")) {
Glide.with(this).load(getIntent().getStringExtra("icon")).placeholder(R.drawable.ic_computer_180dp_with_padding).error(R.drawable.ic_computer_180dp_with_padding).into(binding.ivIcon);
}
if (getIntent().hasExtra("id") &&
!Objects.requireNonNull(getIntent().getStringExtra("id")).isEmpty()) {
isAnBuiID = true;
contentID = getIntent().getStringExtra("id");
} else if (getIntent().hasExtra("vecid") &&
!Objects.requireNonNull(getIntent().getStringExtra("vecid")).isEmpty()) {
contentID = getIntent().getStringExtra("vecid");
}
int currentVerifyIcon = R.drawable.verified_user_24px;
String currentVerifyText = getString(R.string.verified);
String currentVerifyContent = getString(R.string.verified_content);
@ -271,7 +276,7 @@ public class RomInfo extends AppCompatActivity {
binding.lnCreator.setOnClickListener((v -> DialogUtils.oneDialog(
RomInfo.this,
getString(R.string.who_created_this_rom),
getString(getIntent().hasExtra("isRomInfo") && getIntent().getBooleanExtra("isRomInfo", false) ? R.string.who_created_this_rom : R.string.shared_by),
getIntent().getStringExtra("creator") + ".",
getString(R.string.ok),
true,

View file

@ -17,7 +17,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.vectras.vm.databinding.ActivityRomStoreBinding;
import com.vectras.vm.home.romstore.RomStoreHomeAdapterSearch;
import com.vectras.vm.main.romstore.RomStoreHomeAdapterSearch;
import com.vectras.vm.Roms.AdapterRoms;
import com.vectras.vm.Roms.DataRoms;
import com.vectras.vm.network.RequestNetwork;

View file

@ -15,7 +15,7 @@ import androidx.appcompat.app.AppCompatActivity;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.databinding.ActivitySetArchBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
@ -47,7 +47,7 @@ public class SetArchActivity extends AppCompatActivity implements View.OnClickLi
binding.toolbar.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.roms_store) {
HomeActivity.isOpenRomStore = true;
MainActivity.isOpenRomStore = true;
finish();
return true;
}

View file

@ -12,9 +12,8 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.setupwizard.SetupWizard2Activity;
import com.vectras.vm.setupwizard.SetupWizardActivity;
import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
@ -127,7 +126,7 @@ public class SplashActivity extends AppCompatActivity implements Runnable {
@Override
public void run() {
if ((new File(AppConfig.internalDataDirPath, "distro/usr/local/bin/qemu-system-x86_64").exists()) || (new File(AppConfig.internalDataDirPath, "distro/usr/bin/qemu-system-x86_64").exists())) {
startActivity(new Intent(this, HomeActivity.class));
startActivity(new Intent(this, MainActivity.class));
} else {
startActivity(new Intent(this, SetupWizard2Activity.class));
//For Android 14+

View file

@ -29,7 +29,7 @@ import com.vectras.vm.Fragment.CreateImageDialogFragment;
import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.databinding.ActivityVmCreatorBinding;
import com.vectras.vm.databinding.DialogProgressStyleBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
@ -562,16 +562,16 @@ public class VMCreatorActivity extends AppCompatActivity {
if (getIntent().hasExtra("addromnow")) {
RomInfo.isFinishNow = true;
HomeActivity.isOpenHome = true;
MainActivity.isOpenHome = true;
}
modify = false;
if (!HomeActivity.isActivate) {
if (!MainActivity.isActivate) {
startActivity(new Intent(this, SplashActivity.class));
} else {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClass(this, HomeActivity.class);
intent.setClass(this, MainActivity.class);
startActivity(intent);
}
finish();

View file

@ -34,8 +34,8 @@ import com.vectras.qemu.MainSettingsManager;
import com.vectras.qemu.MainVNCActivity;
import com.vectras.qemu.VNCConfig;
import com.vectras.qemu.utils.QmpClient;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.home.core.HomeStartVM;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.main.core.MainStartVM;
import com.vectras.vm.settings.VNCSettingsActivity;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
@ -50,13 +50,11 @@ import org.json.JSONArray;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import java.util.Random;
import java.util.Vector;
public class VMManager {
@ -191,7 +189,7 @@ public class VMManager {
}
UIUtils.toastLong(_activity, _vmName + _activity.getString(R.string.are_removed_successfully));
HomeActivity.refeshVMListNow();
MainActivity.refeshVMListNow();
}
public static String idGenerator() {
@ -601,7 +599,7 @@ public class VMManager {
if (_result.contains("proot\": error=2,")) {
DialogUtils.twoDialog(_activity, _activity.getResources().getString(R.string.problem_has_been_detected), _activity.getResources().getString(R.string.error_PROOT_IS_MISSING_0), _activity.getString(R.string.continuetext), _activity.getString(R.string.cancel), true, R.drawable.build_24px, true,
() -> {
HomeActivity.isActivate = false;
MainActivity.isActivate = false;
FileUtils.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/data");
FileUtils.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/distro");
FileUtils.deleteDirectory(_activity.getFilesDir().getAbsolutePath() + "/usr");
@ -634,7 +632,7 @@ public class VMManager {
isQemuStopedWithError = true;
isTryAgain = false;
} else {
HomeStartVM.startTryAgain(_activity);
MainStartVM.startTryAgain(_activity);
isTryAgain = true;
}
return true;
@ -692,7 +690,7 @@ public class VMManager {
restoredVMs == 0 ? _context.getString(R.string.roms_data_json_fixed_unsuccessfully) : _context.getString(R.string.roms_data_json_fixed_successfully),
R.drawable.error_96px
);
HomeActivity.refeshVMListNow();
MainActivity.refeshVMListNow();
movetoRecycleBin();
}

View file

@ -5,26 +5,9 @@ import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.widget.ListView;
import android.widget.RemoteViews;
import android.widget.Toast;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.utils.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.vectras.vm.main.MainActivity;
public class WidgetProvider extends AppWidgetProvider {
@ -34,7 +17,7 @@ public class WidgetProvider extends AppWidgetProvider {
for (int i=0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, HomeActivity.class);
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
/* context = */ context,
/* requestCode = */ 0,

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home;
package com.vectras.vm.main;
import static android.content.Intent.ACTION_VIEW;
import static com.vectras.vm.VectrasApp.getApp;
@ -16,16 +16,13 @@ import android.os.StrictMode;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.fragment.app.Fragment;
@ -33,7 +30,6 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.color.MaterialColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.termux.app.TermuxActivity;
import com.vectras.qemu.Config;
import com.vectras.qemu.MainSettingsManager;
@ -42,24 +38,26 @@ import com.vectras.vm.AppConfig;
import com.vectras.vm.VMCreatorActivity;
import com.vectras.vm.Minitools;
import com.vectras.vm.R;
import com.vectras.vm.databinding.ActivityMainBinding;
import com.vectras.vm.databinding.ActivityMainContentBinding;
import com.vectras.vm.main.softwarestore.SoftwareStoreFragment;
import com.vectras.vm.main.softwarestore.SoftwareStoreHomeAdapterSearch;
import com.vectras.vm.network.RequestNetwork;
import com.vectras.vm.network.RequestNetworkController;
import com.vectras.vm.databinding.BottomsheetdialogLoggerBinding;
import com.vectras.vm.databinding.UpdateBottomDialogLayoutBinding;
import com.vectras.vm.home.romstore.RomStoreHomeAdapterSearch;
import com.vectras.vm.main.romstore.RomStoreHomeAdapterSearch;
import com.vectras.vm.Roms.DataRoms;
import com.vectras.vm.SetArchActivity;
import com.vectras.vm.VMManager;
import com.vectras.vm.adapter.LogsAdapter;
import com.vectras.vm.databinding.ActivityHomeBinding;
import com.vectras.vm.databinding.ActivityHomeContentBinding;
import com.vectras.vm.home.core.CallbackInterface;
import com.vectras.vm.home.core.DisplaySystem;
import com.vectras.vm.home.core.PendingCommand;
import com.vectras.vm.home.core.SharedData;
import com.vectras.vm.home.monitor.SystemMonitorFragment;
import com.vectras.vm.home.romstore.RomStoreFragment;
import com.vectras.vm.home.vms.VmsFragment;
import com.vectras.vm.main.core.CallbackInterface;
import com.vectras.vm.main.core.DisplaySystem;
import com.vectras.vm.main.core.PendingCommand;
import com.vectras.vm.main.core.SharedData;
import com.vectras.vm.main.monitor.SystemMonitorFragment;
import com.vectras.vm.main.romstore.RomStoreFragment;
import com.vectras.vm.main.vms.VmsFragment;
import com.vectras.vm.logger.VectrasStatus;
import com.vectras.vm.settings.UpdaterActivity;
import com.vectras.vm.utils.DeviceUtils;
@ -79,21 +77,22 @@ import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
public class HomeActivity extends AppCompatActivity implements RomStoreFragment.RomStoreCallToHomeListener, VmsFragment.VmsCallToHomeListener {
public class MainActivity extends AppCompatActivity implements RomStoreFragment.RomStoreCallToHomeListener, VmsFragment.VmsCallToHomeListener, SoftwareStoreFragment.SoftwareStoreCallToHomeListener {
private final String TAG = "HomeActivity";
private final int SEARCH_ROM_STORE = 0;
private final int SEARCH_SOFTWARE_STORE = 1;
private int currentSearchMode = 0;
public static boolean isActivate = false;
public static boolean isNeedRecreate = false;
public static boolean isOpenHome = false;
public static boolean isOpenRomStore = false;
private final ExecutorService executor = Executors.newSingleThreadExecutor();
ActivityHomeBinding binding;
ActivityHomeContentBinding bindingContent;
ActivityMainBinding binding;
ActivityMainContentBinding bindingContent;
private RomStoreHomeAdapterSearch adapterRomStoreSearch;
private SoftwareStoreHomeAdapterSearch adapterSoftwareStoreSearch;
private final List<DataRoms> dataRomStoreSearch = new ArrayList<>();
public static CallbackInterface.HomeCallToVmsListener homeCallToVmsListener;
@ -103,7 +102,7 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
}
@Override
public void updateDataStatus(boolean isReady) {
public void updateSearchStatus(boolean isReady) {
bindingContent.searchbar.setEnabled(isReady);
}
@ -126,9 +125,10 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
VmsFragment.vmsCallToHomeListener = this;
RomStoreFragment.romStoreCallToHomeListener = this;
SoftwareStoreFragment.softwareStoreCallToHomeListener = this;
// EdgeToEdge.enable(this);
binding = ActivityHomeBinding.inflate(getLayoutInflater());
binding = ActivityMainBinding.inflate(getLayoutInflater());
bindingContent = binding.maincontent;
setContentView(binding.getRoot());
isActivate = true;
@ -195,6 +195,17 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
bindingContent.efabCreate.setVisibility(View.GONE);
bindingContent.searchbar.setEnabled(true);
bindingContent.searchbar.setHint(getText(R.string.search));
currentSearchMode = SEARCH_ROM_STORE;
adapterRomStoreSearch = new RomStoreHomeAdapterSearch(this, dataRomStoreSearch);
binding.rvRomstoresearch.setAdapter(adapterRomStoreSearch);
} else if (id == R.id.item_softwarestore) {
selectedFragment = new SoftwareStoreFragment();
bindingContent.efabCreate.setVisibility(View.GONE);
bindingContent.searchbar.setEnabled(true);
bindingContent.searchbar.setHint(getText(R.string.search));
currentSearchMode = SEARCH_SOFTWARE_STORE;
adapterSoftwareStoreSearch = new SoftwareStoreHomeAdapterSearch(this, dataRomStoreSearch);
binding.rvRomstoresearch.setAdapter(adapterSoftwareStoreSearch);
} else if (id == R.id.item_monitor) {
selectedFragment = new SystemMonitorFragment();
bindingContent.efabCreate.setVisibility(View.GONE);
@ -220,11 +231,12 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
binding.drawerLayout.closeDrawer(GravityCompat.START);
//Prevent apps from exiting after the drawer is closed.
return;
} if (binding.searchview.isShowing()) {
}
if (binding.searchview.isShowing()) {
binding.searchview.hide();
} else if (bindingContent.bottomNavigation.getSelectedItemId() != R.id.item_home) {
bindingContent.bottomNavigation.setSelectedItemId(R.id.item_home);
} else if (MainSettingsManager.getQuickStart(HomeActivity.this)) {
} 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);
@ -235,13 +247,7 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
}
});
adapterRomStoreSearch = new
RomStoreHomeAdapterSearch(this, dataRomStoreSearch);
binding.rvRomstoresearch.setAdapter(adapterRomStoreSearch);
binding.rvRomstoresearch.setLayoutManager(new
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
binding.rvRomstoresearch.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
binding.searchview.getEditText().
@ -260,11 +266,8 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
}
});
new
LibraryChecker(this).
checkMissingLibraries(this);
new LibraryChecker(this).
checkMissingLibraries(this);
setupDrawer();
DialogUtils.joinTelegram(this);
@ -411,7 +414,7 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
// String message;
// String size;
if (MainSettingsManager.getcheckforupdatesfromthebetachannel(HomeActivity.this)) {
if (MainSettingsManager.getcheckforupdatesfromthebetachannel(MainActivity.this)) {
versionNameonUpdate = obj.getString("versionNameBeta");
versionCodeonUpdate = obj.getInt("versionCodeBeta");
// message = obj.getString("MessageBeta");
@ -424,9 +427,9 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
}
if ((versionCode < versionCodeonUpdate &&
!MainSettingsManager.getSkipVersion(HomeActivity.this).equals(versionNameonUpdate))) {
!MainSettingsManager.getSkipVersion(MainActivity.this).equals(versionNameonUpdate))) {
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(HomeActivity.this);
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(MainActivity.this);
UpdateBottomDialogLayoutBinding updateBottomDialogLayoutBinding = UpdateBottomDialogLayoutBinding.inflate(getLayoutInflater());
bottomSheetDialog.setContentView(updateBottomDialogLayoutBinding.getRoot());
@ -436,14 +439,14 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
// tvContent.setText(Html.fromHtml(message + "<br><br>Update size:<br>" + size));
updateBottomDialogLayoutBinding.bnSkip.setOnClickListener(view -> {
MainSettingsManager.setSkipVersion(HomeActivity.this, versionNameonUpdate);
MainSettingsManager.setSkipVersion(MainActivity.this, versionNameonUpdate);
bottomSheetDialog.dismiss();
});
updateBottomDialogLayoutBinding.bnLater.setOnClickListener(view -> bottomSheetDialog.dismiss());
updateBottomDialogLayoutBinding.bnUpdate.setOnClickListener(view -> {
startActivity(new Intent(HomeActivity.this, UpdaterActivity.class));
startActivity(new Intent(MainActivity.this, UpdaterActivity.class));
bottomSheetDialog.dismiss();
});
@ -471,7 +474,7 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
List<DataRoms> filteredData = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
filteredData = SharedData.dataRomStore.stream()
filteredData = (currentSearchMode == SEARCH_ROM_STORE ? SharedData.dataRomStore.stream() : SharedData.dataSoftwareStore.stream())
.filter(rom -> {
String romName = (rom.romName != null) ? rom.romName : "";
String romKernel = (rom.romKernel != null) ? rom.romKernel : "";
@ -481,7 +484,7 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
})
.collect(Collectors.toList());
} else {
for (DataRoms rom : SharedData.dataRomStore) {
for (DataRoms rom : (currentSearchMode == SEARCH_ROM_STORE ? SharedData.dataRomStore : SharedData.dataSoftwareStore)) {
if (rom.romName.toLowerCase().contains(keyword.toLowerCase()) ||
rom.romKernel.toLowerCase().contains(keyword.toLowerCase())) {
filteredData.add(rom);
@ -503,44 +506,6 @@ public class HomeActivity extends AppCompatActivity implements RomStoreFragment.
adapterRomStoreSearch.notifyDataSetChanged();
}
private void importFile(Uri uri, String copyTo) {
if (uri == null) return;
View progressView = LayoutInflater.from(this).inflate(R.layout.dialog_progress_style, null);
TextView progress_text = progressView.findViewById(R.id.progress_text);
progress_text.setText(getString(R.string.importing_file));
AlertDialog progressDialog = new MaterialAlertDialogBuilder(this, R.style.CenteredDialogTheme)
.setView(progressView)
.setCancelable(false)
.create();
progressDialog.show();
AtomicBoolean isCompleted = new AtomicBoolean(false);
executor.execute(() -> {
try {
FileUtils.copyFileFromUri(this, uri, copyTo);
isCompleted.set(true);
} catch (Exception e) {
isCompleted.set(false);
} finally {
runOnUiThread(() -> {
progressDialog.dismiss();
DialogUtils.oneDialog(
this,
isCompleted.get() ? getString(R.string.imported) : getString(R.string.oops),
isCompleted.get() ? getString(R.string.file_imported_successfully) : getString(R.string.file_import_failed),
getString(R.string.ok),
true,
isCompleted.get() ? R.drawable.check_24px : R.drawable.error_96px,
true,
null,
null
);
});
}
});
}
private void showLogsDialog() {
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this);
BottomsheetdialogLoggerBinding bottomsheetdialogLoggerBinding = BottomsheetdialogLoggerBinding.inflate(getLayoutInflater());

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
public class CallbackInterface {
//Fix Cyclic.

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
import static android.os.Build.VERSION.SDK_INT;
import static com.vectras.vm.utils.LibraryChecker.isPackageInstalled2;

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
import static android.os.Build.VERSION.SDK_INT;
@ -36,7 +36,7 @@ import com.vectras.vterm.Terminal;
import java.io.File;
public class HomeStartVM {
public class MainStartVM {
public static final String TAG = "HomeStartVM";
public static AlertDialog progressDialog;
public static boolean skipIDEwithARM64DialogInStartVM = false;
@ -74,12 +74,10 @@ public class HomeStartVM {
lastThumbnailFile = thumbnailFile;
if (MainSettingsManager.getVmUi(context).equals("X11")) {
if (!(env.contains("(") || env.contains(")"))) {
if (MainSettingsManager.getRunQemuWithXterm(context)) {
runCommandFormat = String.format(runCommandFormat, "xterm -e bash -c '%s'");
} else {
runCommandFormat = String.format(runCommandFormat, "bash -c '%s'");
}
if (MainSettingsManager.getRunQemuWithXterm(context)) {
runCommandFormat = String.format(runCommandFormat, "xterm -e bash -c \"%s\"");
} else {
runCommandFormat = String.format(runCommandFormat, "bash -c \"%s\"");
}
if (SDK_INT < 34) {

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
import android.app.Activity;
import android.widget.Toast;
@ -49,7 +49,7 @@ public class PendingCommand {
com.vectras.vm.StartVM.cdrompath = "";
Config.vmID = VMManager.idGenerator();
String env = StartVM.env(activity, AppConfig.pendingCommand, "", true);
HomeStartVM.startNow(activity, "Quick run", env, Config.vmID, null);
MainStartVM.startNow(activity, "Quick run", env, Config.vmID, null);
VMManager.lastQemuCommand = AppConfig.pendingCommand;
}
}

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
import android.app.Activity;
import android.content.Intent;

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.core;
package com.vectras.vm.main.core;
import com.vectras.vm.Roms.DataRoms;
@ -7,4 +7,5 @@ import java.util.List;
public class SharedData {
public static List<DataRoms> dataRomStore = new ArrayList<>();
public static List<DataRoms> dataSoftwareStore = new ArrayList<>();
}

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.monitor;
package com.vectras.vm.main.monitor;
import static android.content.Context.ACTIVITY_SERVICE;
import static android.os.Build.VERSION.SDK_INT;

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.romstore;
package com.vectras.vm.main.romstore;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.romstore;
package com.vectras.vm.main.romstore;
import android.os.Bundle;
@ -20,7 +20,7 @@ import com.vectras.vm.network.RequestNetwork;
import com.vectras.vm.network.RequestNetworkController;
import com.vectras.vm.Roms.DataRoms;
import com.vectras.vm.databinding.FragmentHomeRomStoreBinding;
import com.vectras.vm.home.core.SharedData;
import com.vectras.vm.main.core.SharedData;
import java.lang.reflect.Type;
import java.util.ArrayList;
@ -39,7 +39,7 @@ public class RomStoreFragment extends Fragment {
public static RomStoreCallToHomeListener romStoreCallToHomeListener;
public interface RomStoreCallToHomeListener {
void updateDataStatus(boolean isReady);
void updateSearchStatus(boolean isReady);
}
@Override
@ -80,7 +80,7 @@ public class RomStoreFragment extends Fragment {
}
private void loadFromServer() {
romStoreCallToHomeListener.updateDataStatus(false);
romStoreCallToHomeListener.updateSearchStatus(false);
net = new RequestNetwork(requireActivity());
_net_request_listener = new RequestNetwork.RequestListener() {
@ -124,6 +124,6 @@ public class RomStoreFragment extends Fragment {
data.addAll(dataRoms);
mAdapter.notifyDataSetChanged();
SharedData.dataRomStore.addAll(dataRoms);
romStoreCallToHomeListener.updateDataStatus(true);
romStoreCallToHomeListener.updateSearchStatus(true);
}
}

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.romstore;
package com.vectras.vm.main.romstore;
import android.annotation.SuppressLint;
import android.content.Context;
@ -76,6 +76,7 @@ public class RomStoreHomeAdapterSearch extends RecyclerView.Adapter<RecyclerView
intent.putExtra("size", current.fileSize);
intent.putExtra("id", current.id);
intent.putExtra("vecid", current.vecid);
intent.putExtra("isRomInfo", false);
context.startActivity(intent);
});
} else {

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.romstore;
package com.vectras.vm.main.romstore;
import android.annotation.SuppressLint;
import android.content.Context;
@ -73,6 +73,7 @@ public class RomStoreHomeAdpater extends RecyclerView.Adapter<RecyclerView.ViewH
intent.putExtra("size", current.fileSize);
intent.putExtra("id", current.id);
intent.putExtra("vecid", current.vecid);
intent.putExtra("isRomInfo", true);
context.startActivity(intent);
});
} else {

View file

@ -0,0 +1,131 @@
package com.vectras.vm.main.softwarestore;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.material.transition.MaterialFadeThrough;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.vectras.vm.AppConfig;
import com.vectras.vm.Roms.DataRoms;
import com.vectras.vm.databinding.FragmentHomeSoftwareStoreBinding;
import com.vectras.vm.main.core.SharedData;
import com.vectras.vm.main.romstore.RomStoreFragment;
import com.vectras.vm.main.romstore.RomStoreHomeAdpater;
import com.vectras.vm.network.RequestNetwork;
import com.vectras.vm.network.RequestNetworkController;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class SoftwareStoreFragment extends Fragment {
FragmentHomeSoftwareStoreBinding binding;
private RequestNetwork net;
private RequestNetwork.RequestListener _net_request_listener;
private String contentJSON = "[]";
SoftwareStoreViewModel homeSoftwareStoreViewModel;
SoftwareStoreHomeAdapter mAdapter;
List<DataRoms> data = new ArrayList<>();
public static RomStoreFragment.RomStoreCallToHomeListener softwareStoreCallToHomeListener;
public interface SoftwareStoreCallToHomeListener {
void updateSearchStatus(boolean isReady);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setEnterTransition(new MaterialFadeThrough());
setReturnTransition(new MaterialFadeThrough());
setExitTransition(new MaterialFadeThrough());
setReenterTransition(new MaterialFadeThrough());
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
binding = FragmentHomeSoftwareStoreBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new SoftwareStoreHomeAdapter(getContext(), data);
binding.rvSoftwarelist.setAdapter(mAdapter);
binding.rvSoftwarelist.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
homeSoftwareStoreViewModel = new ViewModelProvider(requireActivity()).get(SoftwareStoreViewModel.class);
homeSoftwareStoreViewModel.getSoftwareList().observe(getViewLifecycleOwner(), roms -> {
if (roms == null || roms.isEmpty()) {
loadFromServer();
} else {
binding.linearload.setVisibility(View.GONE);
data.clear();
data.addAll(roms);
mAdapter.notifyDataSetChanged();
}
});
}
private void loadFromServer() {
softwareStoreCallToHomeListener.updateSearchStatus(false);
net = new RequestNetwork(requireActivity());
_net_request_listener = new RequestNetwork.RequestListener() {
@Override
public void onResponse(String tag, String response, HashMap<String, Object> responseHeaders) {
if (!response.isEmpty())
contentJSON = response;
loadData();
binding.linearload.setVisibility(View.GONE);
}
@Override
public void onErrorResponse(String tag, String message) {
binding.linearload.setVisibility(View.GONE);
binding.linearnothinghere.setVisibility(View.VISIBLE);
}
};
binding.buttontryagain.setOnClickListener(v -> {
binding.linearload.setVisibility(View.VISIBLE);
net.startRequestNetwork(RequestNetworkController.GET, AppConfig.vectrasRaw + "software-store.json","",_net_request_listener);
});
net.startRequestNetwork(RequestNetworkController.GET, AppConfig.vectrasRaw + "software-store.json","",_net_request_listener);
}
private void loadData() {
List<DataRoms> dataSoftware = new ArrayList<>();
try {
Gson gson = new Gson();
Type listType = new TypeToken<List<DataRoms>>() {}.getType();
dataSoftware = gson.fromJson(contentJSON, listType);
} catch (Exception e) {
binding.linearload.setVisibility(View.GONE);
binding.linearnothinghere.setVisibility(View.VISIBLE);
}
homeSoftwareStoreViewModel.setSoftwareList(dataSoftware);
data.clear();
data.addAll(dataSoftware);
mAdapter.notifyDataSetChanged();
SharedData.dataSoftwareStore.addAll(dataSoftware);
softwareStoreCallToHomeListener.updateSearchStatus(true);
}
}

View file

@ -0,0 +1,119 @@
package com.vectras.vm.main.softwarestore;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.vectras.vm.R;
import com.vectras.vm.RomInfo;
import com.vectras.vm.Roms.DataRoms;
import java.util.Collections;
import java.util.List;
public class SoftwareStoreHomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
private final LayoutInflater inflater;
static List<DataRoms> dataRom = Collections.emptyList();
public SoftwareStoreHomeAdapter(Context context, List<DataRoms> data) {
this.context = context;
inflater = LayoutInflater.from(context);
dataRom = data;
}
// Inflate the layout when viewholder created
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.container_roms, parent, false);
return new MyHolder(view);
}
// Bind data
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
// Get current position of item in recyclerview to bind data and assign values from list
final MyHolder myHolder = (MyHolder) holder;
final DataRoms current = dataRom.get(position);
Glide.with(context).load(current.romIcon).placeholder(R.drawable.ic_computer_180dp_with_padding).error(R.drawable.ic_computer_180dp_with_padding).into(myHolder.ivIcon);
myHolder.textName.setText(current.romName);
myHolder.textSize.setText(current.romSize);
if (current.romAvail) {
myHolder.linearItem.setOnClickListener(v -> {
notifyItemRangeChanged(0, dataRom.size());
Intent intent = new Intent();
intent.setClass(context, RomInfo.class);
intent.putExtra("title", current.romName);
intent.putExtra("shortdesc", current.romSize);
intent.putExtra("getrom", current.romUrl);
intent.putExtra("desc", current.desc);
intent.putExtra("icon", current.romIcon);
intent.putExtra("filename", current.romPath);
intent.putExtra("finalromfilename", current.finalromfilename);
intent.putExtra("extra", current.romExtra);
intent.putExtra("arch", current.romArch);
intent.putExtra("verified", current.verified);
intent.putExtra("creator", current.creator);
intent.putExtra("size", current.fileSize);
intent.putExtra("id", current.id);
intent.putExtra("vecid", current.vecid);
intent.putExtra("isRomInfo", false);
context.startActivity(intent);
});
} else {
myHolder.textAvail.setText(context.getString(R.string.unavailable));
myHolder.textAvail.setTextColor(Color.RED);
}
if (dataRom.size() == 1) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_single));
} else if (position == 0) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_top));
} else if (position == dataRom.size() - 1) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_bottom));
} else {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_middle));
}
}
// return total item from List
@Override
public int getItemCount() {
return dataRom == null ? 0 : dataRom.size();
}
static class MyHolder extends RecyclerView.ViewHolder {
TextView textName, textAvail, textSize;
ImageView ivIcon;
LinearLayout linearItem;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
textName = itemView.findViewById(R.id.textName);
ivIcon = itemView.findViewById(R.id.ivIcon);
textSize = itemView.findViewById(R.id.textSize);
textAvail = itemView.findViewById(R.id.textAvail);
linearItem = itemView.findViewById(R.id.linearItem);
}
}
}

View file

@ -0,0 +1,123 @@
package com.vectras.vm.main.softwarestore;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.vectras.vm.RomInfo;
import com.vectras.vm.R;
import com.vectras.vm.Roms.DataRoms;
import java.util.Collections;
import java.util.List;
public class SoftwareStoreHomeAdapterSearch extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
private final LayoutInflater inflater;
static List<DataRoms> dataRom = Collections.emptyList();
private final String TAG = "RomStoreHomeAdapterSearch";
public SoftwareStoreHomeAdapterSearch(Context context, List<DataRoms> data) {
this.context = context;
inflater = LayoutInflater.from(context);
dataRom = data;
}
// Inflate the layout when viewholder created
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.container_roms, parent, false);
return new MyHolder(view);
}
// Bind data
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
// Get current position of item in recyclerview to bind data and assign values from list
final MyHolder myHolder = (MyHolder) holder;
final DataRoms current = dataRom.get(position);
Glide.with(context).load(current.romIcon).placeholder(R.drawable.ic_computer_180dp_with_padding).error(R.drawable.ic_computer_180dp_with_padding).into(myHolder.ivIcon);
myHolder.textName.setText(current.romName);
myHolder.textSize.setText(current.romSize);
if (current.romAvail) {
myHolder.linearItem.setOnClickListener(v -> {
notifyItemRangeChanged(0, dataRom.size());
Intent intent = new Intent();
intent.setClass(context, RomInfo.class);
intent.putExtra("title", current.romName);
intent.putExtra("shortdesc", current.romSize);
intent.putExtra("getrom", current.romUrl);
intent.putExtra("desc", current.desc);
intent.putExtra("icon", current.romIcon);
intent.putExtra("filename", current.romPath);
intent.putExtra("finalromfilename", current.finalromfilename);
intent.putExtra("extra", current.romExtra);
intent.putExtra("arch", current.romArch);
intent.putExtra("verified", current.verified);
intent.putExtra("creator", current.creator);
intent.putExtra("size", current.fileSize);
intent.putExtra("id", current.id);
intent.putExtra("vecid", current.vecid);
intent.putExtra("isRomInfo", false);
context.startActivity(intent);
});
} else {
myHolder.textAvail.setText(context.getString(R.string.unavailable));
myHolder.textAvail.setTextColor(Color.RED);
}
if (dataRom.size() == 1) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_single_on_surface));
} else if (position == 0) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_top_on_surface));
} else if (position == dataRom.size() - 1) {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_bottom_on_surface));
} else {
myHolder.linearItem.setBackground(AppCompatResources.getDrawable(context, R.drawable.object_shape_middle_on_surface));
}
}
// return total item from List
@Override
public int getItemCount() {
return dataRom.size();
}
static class MyHolder extends RecyclerView.ViewHolder {
TextView textName, textAvail, textSize;
ImageView ivIcon;
LinearLayout linearItem;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
textName = itemView.findViewById(R.id.textName);
ivIcon = itemView.findViewById(R.id.ivIcon);
textSize = itemView.findViewById(R.id.textSize);
textAvail = itemView.findViewById(R.id.textAvail);
linearItem = itemView.findViewById(R.id.linearItem);
}
}
}

View file

@ -0,0 +1,22 @@
package com.vectras.vm.main.softwarestore;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.vectras.vm.Roms.DataRoms;
import java.util.ArrayList;
import java.util.List;
public class SoftwareStoreViewModel extends ViewModel {
private final MutableLiveData<List<DataRoms>> softwareList = new MutableLiveData<>(new ArrayList<>());
public LiveData<List<DataRoms>> getSoftwareList() {
return softwareList;
}
public void setSoftwareList(List<DataRoms> data) {
softwareList.setValue(data);
}
}

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.vms;
package com.vectras.vm.main.vms;
import androidx.recyclerview.widget.DiffUtil;

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.vms;
package com.vectras.vm.main.vms;
import android.content.res.Configuration;
import android.os.Bundle;
@ -19,8 +19,8 @@ import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.R;
import com.vectras.vm.VMManager;
import com.vectras.vm.databinding.FragmentHomeVmsBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.home.core.CallbackInterface;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.main.core.CallbackInterface;
import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
@ -78,7 +78,7 @@ public class VmsFragment extends Fragment implements CallbackInterface.HomeCallT
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
HomeActivity.homeCallToVmsListener = this;
MainActivity.homeCallToVmsListener = this;
binding.rvRomlist.setLayoutManager(new GridLayoutManager(getContext(), spanCount));
vmsHomeAdapter = new VmsHomeAdapter(requireActivity(), data);

View file

@ -1,4 +1,4 @@
package com.vectras.vm.home.vms;
package com.vectras.vm.main.vms;
import android.app.Activity;
import android.graphics.Bitmap;
@ -20,8 +20,8 @@ import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.R;
import com.vectras.vm.StartVM;
import com.vectras.vm.VMManager;
import com.vectras.vm.home.core.HomeStartVM;
import com.vectras.vm.home.core.RomOptionsDialog;
import com.vectras.vm.main.core.MainStartVM;
import com.vectras.vm.main.core.RomOptionsDialog;
import java.util.Collections;
import java.util.List;
@ -75,7 +75,7 @@ public class VmsHomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
}
Config.vmID = current.vmID;
String env = StartVM.env(activity, current.itemExtra, current.itemPath, false);
HomeStartVM.startNow(activity, current.itemName, env, current.vmID, current.itemIcon);
MainStartVM.startNow(activity, current.itemName, env, current.vmID, current.itemIcon);
});
myHolder.cdRoms.setOnLongClickListener(v -> {

View file

@ -13,7 +13,7 @@ import com.google.android.material.color.DynamicColors;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.R;
import com.vectras.vm.databinding.ActivityThemeBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.UIUtils;
import java.util.Objects;
@ -54,7 +54,7 @@ public class ThemeActivity extends AppCompatActivity {
public void onStop() {
super.onStop();
if (!(oldDynamicColorData == newDynamicColorData))
HomeActivity.isNeedRecreate = true;
MainActivity.isNeedRecreate = true;
}
private void initialize() {

View file

@ -39,7 +39,7 @@ import com.vectras.vm.databinding.ActivitySetupWizard2Binding;
import com.vectras.vm.databinding.ListViewBinding;
import com.vectras.vm.databinding.SetupQemuDoneBinding;
import com.vectras.vm.databinding.SimpleLayoutListViewWithCheckBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.utils.FileUtils;
@ -211,7 +211,7 @@ public class SetupWizard2Activity extends AppCompatActivity {
Intent intent = new Intent(ACTION_VIEW, Uri.parse(AppConfig.patreonLink));
startActivity(intent);
} else {
startActivity(new Intent(this, HomeActivity.class));
startActivity(new Intent(this, MainActivity.class));
finish();
}
});

View file

@ -41,7 +41,7 @@ import com.vectras.vm.databinding.ActivitySetupWizardBinding;
import com.vectras.vm.databinding.SetupQemuAdvancedBinding;
import com.vectras.vm.databinding.SetupQemuDoneBinding;
import com.vectras.vm.databinding.SimpleLayoutForSpinerBinding;
import com.vectras.vm.home.HomeActivity;
import com.vectras.vm.main.MainActivity;
import com.vectras.vm.utils.ClipboardUltils;
import com.vectras.vm.utils.DeviceUtils;
import com.vectras.vm.utils.DialogUtils;
@ -496,7 +496,7 @@ public class SetupWizardActivity extends AppCompatActivity {
Intent intent = new Intent(ACTION_VIEW, Uri.parse(AppConfig.patreonLink));
startActivity(intent);
} else {
startActivity(new Intent(SetupWizardActivity.this, HomeActivity.class));
startActivity(new Intent(SetupWizardActivity.this, MainActivity.class));
finish();
}
});

View file

@ -23,7 +23,7 @@ import com.vectras.vm.Fragment.ControlersOptionsFragment;
import com.vectras.vm.Fragment.LoggerDialogFragment;
import com.vectras.vm.MainService;
import com.vectras.vm.VMManager;
import com.vectras.vm.home.core.HomeStartVM;
import com.vectras.vm.main.core.MainStartVM;
import com.vectras.vm.utils.DialogUtils;
import com.vectras.vm.widgets.JoystickView;
import static com.vectras.vm.x11.CmdEntryPoint.ACTION_START;
@ -740,7 +740,7 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow
}
});
HomeStartVM.startPending(this);
MainStartVM.startPending(this);
}
private void keyDownUp(int keyEventCode) {

View file

@ -0,0 +1,4 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/package_filled_24px" android:state_checked="true"/>
<item android:drawable="@drawable/package_24px" android:state_checked="false"/>
</selector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M400,390L480,350L560,390L560,200L400,200L400,390ZM280,680L280,600L480,600L480,680L280,680ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L640,200L640,520L480,440L320,520L320,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760Z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM280,680L480,680L480,600L280,600L280,680ZM320,520L480,440L640,520L640,200L320,200L320,520Z"/>
</vector>

View file

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:background="?attr/colorSurface"
tools:openDrawer="start"
tools:context=".home.HomeActivity" >
<include
android:id="@+id/maincontent"
layout="@layout/activity_home_content"/>
<com.google.android.material.search.SearchView
android:id="@+id/searchview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/search">
<LinearLayout
android:id="@+id/ln_searchempty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/search_96px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="@string/no_matching_results_found" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_romstoresearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurfaceContainerHigh"
android:paddingVertical="8dp"
android:clipToPadding="false"/>
</com.google.android.material.search.SearchView>
<!--Place NavigationView here to avoid interaction errors affected by other objects and cause unwanted effects to other objects.-->
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/home_drawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -1,24 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true"
tools:openDrawer="start" >
<include layout="@layout/main_content"/>
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/home_drawer_menu" />
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:background="?attr/colorSurface"
tools:openDrawer="start"
tools:context=".main.MainActivity" >
<include
android:id="@+id/maincontent"
layout="@layout/activity_main_content"/>
<com.google.android.material.search.SearchView
android:id="@+id/searchview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/search">
<LinearLayout
android:id="@+id/ln_searchempty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/search_96px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="@string/no_matching_results_found" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_romstoresearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurfaceContainerHigh"
android:paddingVertical="8dp"
android:clipToPadding="false"/>
</com.google.android.material.search.SearchView>
<!--Place NavigationView here to avoid interaction errors affected by other objects and cause unwanted effects to other objects.-->
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/home_drawer_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_margin="8dp"
android:background="?attr/colorSurface"
android:minHeight="150dp"
app:cardCornerRadius="10dp"
app:cardElevation="2dp"
app:cardUseCompatPadding="false"
app:layout_anchorGravity="center">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.google.android.material.navigation.NavigationView
android:id="@+id/navView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
app:menu="@menu/settings_dialog" />
<fragment
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
class="com.vectras.vm.Fragment.UiSettingsFragment"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>

View file

@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionGroup="true"
tools:context=".home.romstore.RomStoreFragment">
tools:context=".main.romstore.RomStoreFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_romlist"

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionGroup="true"
tools:context=".main.softwarestore.SoftwareStoreFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_softwarelist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="8dp"
android:clipToPadding="false"
android:fillViewport="true" />
<LinearLayout
android:id="@+id/linearload"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="80dp"
android:background="?attr/colorSurface"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">
<com.google.android.material.loadingindicator.LoadingIndicator
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearnothinghere"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="80dp"
android:background="?attr/colorSurface"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/cloud_off_96px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:gravity="center"
android:text="@string/oops"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="@string/unable_to_connect_to_server" />
<com.google.android.material.button.MaterialButton
android:id="@+id/buttontryagain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:padding="8dp"
android:text="@string/try_again" />
</LinearLayout>
</FrameLayout>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionGroup="true"
tools:context=".home.monitor.SystemMonitorFragment">
tools:context=".main.monitor.SystemMonitorFragment">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transitionGroup="true"
tools:context=".home.vms.VmsFragment">
tools:context=".main.vms.VmsFragment">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/wrl_romlist"

View file

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragment.UiSettingsFragment">
<TextView
android:id="@+id/btnMouseMode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:textColor="?attr/colorControlNormal"
android:drawableStart="@drawable/round_mouse_24"
android:gravity="center_vertical"
android:text="@string/mouse_mode" />
</FrameLayout>

View file

@ -1,356 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/main_ctl"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="8dp"
android:padding="3dp"
android:orientation="horizontal">
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:layout_weight="1.0"
app:cardUseCompatPadding="false"
app:cardBackgroundColor="?attr/colorSurfaceContainer"
style="@style/Widget.Material3.CardView.Filled">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="190dp"
android:padding="4dp"
android:text="@string/memory_usage" />
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/totalRam"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:textSize="10sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/usedRam"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:textSize="10sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/freeRam"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:textSize="10sp"
tools:ignore="SmallSp" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
app:showAnimationBehavior="inward"
app:indeterminateAnimationType="disjoint"
app:wavelength="20dp"
app:waveAmplitude="1dp"
app:waveSpeed="10dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="4dp"
android:layout_weight="1.0"
app:cardUseCompatPadding="false"
app:cardBackgroundColor="?attr/colorSurfaceContainer"
style="@style/Widget.Material3.CardView.Filled">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="190dp"
android:padding="4dp"
android:text="@string/qemu" />
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:text="@string/version"
android:textSize="10sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/qemuVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:text="@string/qemu_version"
android:textSize="10sp"
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:text="@string/arch"
android:textSize="10sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/qemuArch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:textSize="10sp"
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:text="@string/service"
android:textSize="10sp"
tools:ignore="SmallSp" />
<TextView
android:id="@+id/tvIsRunning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:padding="2dp"
android:textSize="10sp"
tools:ignore="SmallSp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="6dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<include layout="@layout/external_vnc" />
</LinearLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true" />
<ProgressBar
android:id="@+id/loading"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:ignore="SpeakableTextPresentCheck"
android:paddingBottom="100dp"
android:clipToPadding="false">
<LinearLayout
android:id="@+id/romsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/linearnothinghere"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- <com.google.android.gms.ads.AdView-->
<!-- android:id="@+id/adView"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginBottom="8dp"-->
<!-- android:visibility="gone"-->
<!-- app:adSize="BANNER"-->
<!-- app:adUnitId="ca-app-pub-3568137780412047/2777459854"-->
<!-- app:layout_constraintEnd_toEndOf="parent"-->
<!-- app:layout_constraintStart_toStartOf="parent" />-->
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/package_2_96px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/nothing_here"
android:layout_margin="8dp"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/nothing_here_home"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/gotoromstorebutton"
style="@style/Widget.Material3Expressive.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:gravity="center_horizontal|center_vertical"
app:icon="@drawable/home_storage_24px"
android:text="@string/go_to_rom_store" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/refreshRoms"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/mRVMainRoms"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:clipToPadding="false"
tools:listitem="@layout/container_main_roms" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="BottomAppBar"
app:menu="@menu/home_bottom_app_bar"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabAdd_AppBarBottomActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/create_a_machine"
android:src="@drawable/round_add_24"
app:layout_anchor="@+id/bottomAppBar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -9,6 +9,11 @@
android:enabled="true"
android:icon="@drawable/ic_home_storage_selector"
android:title="@string/roms_store"/>
<item
android:id="@+id/item_softwarestore"
android:enabled="true"
android:icon="@drawable/ic_package_selector"
android:title="@string/software_and_driver"/>
<item
android:id="@+id/item_monitor"
android:enabled="true"

View file

@ -3,7 +3,6 @@
<string name="app_name">Vectras VM</string>
<!--======================VECTRAS STRINGS====================-->
<string name="app_version" translatable="false">3.4.6</string>
<string name="qemu_version" translatable="false">Stable</string>
<!-- logger -->
<string name="startvm">VM STARTED!</string>
@ -475,6 +474,8 @@
<string name="size_gb">Size (GB)</string>
<string name="create_a_new_virtual_disk">Create a new virtual disk</string>
<string name="it_will_be_created_in">It will be created in</string>
<string name="software_and_driver">Software &amp; driver</string>
<string name="shared_by">Shared by</string>
<!--======================TERMUX STRINGS====================-->
@ -675,7 +676,9 @@
<!-- ========================== VIRTUAL MACHINE (VM) CORE ========================== -->
<!-- VM Creation & Setup -->
<string name="vm_action_create_new">New VM</string> <!-- Was: new_vm -->
<string name="vm_action_create_new">New VM</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <!-- Was: new_vm -->
<!-- Was: verified_content -->
<!-- Was: not_verified_content -->

View file

@ -5,11 +5,11 @@
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases",
"Message": "<h2>3.4.0</h2>\n- Fixed the issue of exporting rom with virtual machine ID.\n- New dialog for copying files in creating new virtual machine.\n- New dialog showing information after successful rom import.\n- Fixed no sound playing with Termux.\n- Fixed invalid file path error when using Manual setup.\n- Fixed dialog showing content without line breaks.\n- Fixed rom export error.\n- Added Processes to System monitor.\n- Improved interface.\n- Thinner fonts.\n- Fixed an issue with interaction in Rom store.\n- Fixed the External VNC Server switch being incorrect in certain cases.\n- Removed unnecessary resources.\n- Updated Chinese (Simplified) language (contributed by @WeiguangTWK).\n- Fixed issue with installing system files after not completing the first time.\n- New setup wizard.\n- Added auto return to Home after importing rom and creating virtual machine in Rom store.\n- Improved image viewer.\n- Fixed Unknow display error in architecture in rom info if it is PowerPC architecture.\n- New setup wizard interface that automatically changes according to screen size.\n- New ID generator for virtual machine.\n- Added dialog when deleting virtual machine.",
"cancellable": true,
"versionCodeBeta":"50",
"versionNameBeta":"3.4.6",
"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",
"sizeBeta": "44 MB",
"versionCodeBeta":"51",
"versionNameBeta":"3.4.7",
"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",
"sizeBeta": "45 MB",
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
"MessageBeta": "<h2>3.4.6</h2>Bugs fixed.",
"MessageBeta": "<h2>3.4.7</h2>Bugs fixed.",
"cancellableBeta": true
}

View file

@ -0,0 +1,57 @@
[
{
"rom_name": "3Dfx wrappers driver",
"rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/3dfx_logo.svg/1200px-3dfx_logo.svg.png",
"rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.4.7.iso",
"rom_path": "3dfx-wrappers-3.4.7.iso",
"rom_avail": true,
"rom_size": "3.4.7",
"rom_arch": "X86_64",
"rom_kernel": "",
"rom_extra": "",
"final_rom_file_name": "",
"desc": "Play retro games on Windows 95, 98, ME, 2000, and XP with improved performance.",
"file_size": "1 MB",
"creator": "Nguyen Bao An Bui",
"verified": true,
"vecid": "3dfxwrappers347iso",
"id": ""
},
{
"rom_name": "3Dfx wrappers driver",
"rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/3dfx_logo.svg/1200px-3dfx_logo.svg.png",
"rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-3.0.0.iso",
"rom_path": "3dfx-wrappers-3.0.0.iso",
"rom_avail": true,
"rom_size": "3.4.7",
"rom_arch": "X86_64",
"rom_kernel": "",
"rom_extra": "",
"final_rom_file_name": "",
"desc": "Play retro games on Windows 95, 98, ME, 2000, and XP with improved performance.",
"file_size": "1 MB",
"creator": "Nguyen Bao An Bui",
"verified": true,
"vecid": "3dfxwrappers300iso",
"id": ""
},
{
"rom_name": "3Dfx wrappers driver",
"rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/3dfx_logo.svg/1200px-3dfx_logo.svg.png",
"rom_url": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/blob/master/3dfx/3dfx-wrappers-2.9.5.iso",
"rom_path": "3dfx-wrappers-3.0.0.iso",
"rom_avail": true,
"rom_size": "2.9.5",
"rom_arch": "X86_64",
"rom_kernel": "",
"rom_extra": "",
"final_rom_file_name": "",
"desc": "Play retro games on Windows 95, 98, ME, 2000, and XP with improved performance.",
"file_size": "1 MB",
"creator": "Nguyen Bao An Bui",
"verified": true,
"vecid": "3dfxwrappers295iso",
"id": ""
}
]