diff --git a/app/build.gradle b/app/build.gradle index c32dfcd..4cd26cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 59 - versionName "3.5.5" + versionCode 60 + versionName "3.5.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 105de53..afdae45 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -146,19 +146,6 @@ - - - data; - private SwipeRefreshLayout refreshRoms; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // TODO Auto-generated method stub - - // TODO show the text view in @layout/home_fragment if list empty - - view = inflater.inflate(R.layout.home_fragment, container, false); - - romsLayout = view.findViewById(R.id.romsLayout); - - refreshRoms = view.findViewById(R.id.refreshRoms); - - refreshRoms.setOnRefreshListener(() -> { - loadDataVbi(); - mMainAdapter.notifyItemRangeChanged(0, mMainAdapter.data.size()); - refreshRoms.setRefreshing(false); - }); - loadDataVbi(); - - return view; - } - - private void loadDataVbi() { - data = new ArrayList<>(); - - try { - - jArray = new JSONArray(FileUtils.readFromFile(requireActivity(), new File(AppConfig.maindirpath - + "roms-data.json"))); - - // Extract data from json and store into ArrayList as class objects - for (int i = 0; i < jArray.length(); i++) { - JSONObject json_data = jArray.getJSONObject(i); - DataMainRoms romsMainData = new DataMainRoms(); - romsMainData.itemName = json_data.getString("imgName"); - romsMainData.itemIcon = json_data.getString("imgIcon"); - try { - romsMainData.itemArch = json_data.getString("imgArch"); - } catch (JSONException ignored) { - romsMainData.itemArch = "unknown"; - } - romsMainData.itemPath = json_data.getString("imgPath"); - try { - romsMainData.itemDrv1 = json_data.getString("imgDrv1"); - } catch (JSONException ignored) { - romsMainData.itemDrv1 = ""; - } - romsMainData.itemExtra = json_data.getString("imgExtra"); - try { - if (json_data.getString("imgArch").equals(MainSettingsManager.getArch(requireActivity()))) - data.add(romsMainData); - } catch (JSONException ignored) { - data.add(romsMainData); - } - } - - // Setup and Handover data to recyclerview - mRVMainRoms = HomeFragment.view.findViewById(R.id.mRVMainRoms); - mMainAdapter = new AdapterMainRoms(requireActivity(), data); - mRVMainRoms.setAdapter(mMainAdapter); - mRVMainRoms.setLayoutManager(new GridLayoutManager(getContext(), 2)); - } catch (JSONException e) { - Toast.makeText(requireActivity(), e.toString(), Toast.LENGTH_LONG).show(); - } - } -} diff --git a/app/src/main/java/com/vectras/vm/MainRoms/AdapterMainRoms.java b/app/src/main/java/com/vectras/vm/MainRoms/AdapterMainRoms.java deleted file mode 100644 index 0661ebc..0000000 --- a/app/src/main/java/com/vectras/vm/MainRoms/AdapterMainRoms.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.vectras.vm.MainRoms; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.cardview.widget.CardView; -import androidx.recyclerview.widget.RecyclerView; - -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.R; -import com.vectras.vm.StartVM; -import com.vectras.vm.VMManager; -import java.util.Collections; -import java.util.List; - -public class AdapterMainRoms extends RecyclerView.Adapter { - - private final Activity activity; - private final Context context; - private final LayoutInflater inflater; - public List data = Collections.emptyList(); - int currentPos = 0; - - public AdapterMainRoms(Activity activity, List data) { - this.activity = activity; - this.context = activity.getApplicationContext(); - inflater = LayoutInflater.from(context); - this.data = 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_main_roms, parent, false); - return new MyHolder(view); - } - - // Bind data - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int _position) { - - int position = holder.getBindingAdapterPosition(); - if (position == RecyclerView.NO_POSITION) return; - - // Get current position of item in recyclerview to bind data and assign values from list - final MyHolder myHolder = (MyHolder) holder; - final DataMainRoms current = data.get(position); - myHolder.textName.setText(current.itemName); - myHolder.textArch.setText(current.itemArch); - if (current.itemIcon.isEmpty()){ - VMManager.setIconWithName(myHolder.ivIcon, current.itemName); - } else { - Bitmap bmImg = BitmapFactory.decodeFile(current.itemIcon); - myHolder.ivIcon.setImageBitmap(bmImg); - } - myHolder.optionsBtn.setOnClickListener(view -> { - - BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context); - View v = activity.getLayoutInflater().inflate(R.layout.rom_options_dialog, null); - bottomSheetDialog.setContentView(v); - - Button modifyRomBtn = v.findViewById(R.id.modifyRomBtn); - modifyRomBtn.setOnClickListener(v3 -> { - VMCreatorActivity.current = data.get(position); - VMManager.setArch(current.itemArch, activity); - context.startActivity(new Intent(context, VMCreatorActivity.class).putExtra("POS", position).putExtra("MODIFY", true).putExtra("VMID", current.vmID)); - bottomSheetDialog.cancel(); - }); - - Button exportRomBtn = v.findViewById(R.id.exportRomBtn); - exportRomBtn.setOnClickListener(v2 -> { - ExportRomActivity.pendingPosition = position; - Intent intent = new Intent(); - intent.setClass(context.getApplicationContext(), ExportRomActivity.class); - context.startActivity(intent); - bottomSheetDialog.cancel(); - }); - - Button removeRomBtn = v.findViewById(R.id.removeRomBtn); - removeRomBtn.setOnClickListener(v1 -> { - VMManager.deleteVMDialog(current.itemName, position, activity); - bottomSheetDialog.cancel(); - }); - bottomSheetDialog.show(); - }); - - myHolder.cdRoms.setOnClickListener(view -> { - VMManager.setArch(current.itemArch, activity); - StartVM.cdrompath = current.imgCdrom; - if (current.qmpPort == 0) { - Config.setDefault(); - } else { - Config.QMPPort = current.qmpPort; - } - Config.vmID = current.vmID; - String env = StartVM.env(activity, current.itemExtra, current.itemPath, false); - //MainActivity.startVM(current.itemName, env, current.itemExtra, current.itemPath); - }); - - myHolder.cdRoms.setOnLongClickListener(v -> { - VMManager.deleteVMDialog(current.itemName, position, activity); - return false; - }); - } - - // return total item from List - @Override - public int getItemCount() { - return data.size(); - } - - static class MyHolder extends RecyclerView.ViewHolder { - - CardView cdRoms; - TextView textName, textArch; - ImageView ivIcon; - ImageButton optionsBtn; - - // create constructor to get widget reference - public MyHolder(View itemView) { - super(itemView); - cdRoms = itemView.findViewById(R.id.cdItem); - textName = itemView.findViewById(R.id.textName); - textArch = itemView.findViewById(R.id.textArch); - ivIcon = itemView.findViewById(R.id.ivIcon); - optionsBtn = itemView.findViewById(R.id.optionsButton); - } - - } - -} diff --git a/app/src/main/java/com/vectras/vm/MainService.java b/app/src/main/java/com/vectras/vm/MainService.java index 22481b0..b2e22cf 100644 --- a/app/src/main/java/com/vectras/vm/MainService.java +++ b/app/src/main/java/com/vectras/vm/MainService.java @@ -1,6 +1,5 @@ package com.vectras.vm; -import android.app.Activity; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -14,13 +13,8 @@ import android.util.Log; import androidx.core.app.NotificationCompat; -import com.vectras.qemu.MainVNCActivity; -import com.vectras.vm.core.PulseAudio; import com.vectras.vterm.Terminal; -import java.io.File; -import java.util.Objects; - public class MainService extends Service { public static String CHANNEL_ID = "Vectras VM Service"; private static final int NOTIFICATION_ID = 1; @@ -28,6 +22,7 @@ public class MainService extends Service { public static String env = null; private String TAG = "MainService"; public static MainService service; + public static Context activityContext; @Override public void onCreate() { @@ -49,8 +44,8 @@ public class MainService extends Service { if (env != null) { if (service != null) { - Terminal vterm = new Terminal(this); - vterm.executeShellCommand2(env, true, this); + Terminal vterm = new Terminal(activityContext); + vterm.executeShellCommand2(env, true, activityContext); } } else Log.e(TAG, "env is null"); diff --git a/app/src/main/java/com/vectras/vm/RomStoreActivity.java b/app/src/main/java/com/vectras/vm/RomStoreActivity.java deleted file mode 100644 index aaea0a7..0000000 --- a/app/src/main/java/com/vectras/vm/RomStoreActivity.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.vectras.vm; - -import android.annotation.SuppressLint; -import android.os.Build; -import android.os.Bundle; -import android.os.StrictMode; -import android.text.Editable; -import android.text.TextWatcher; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; - -import androidx.appcompat.app.AppCompatActivity; -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.main.romstore.RomStoreHomeAdapterSearch; -import com.vectras.vm.Roms.AdapterRoms; -import com.vectras.vm.Roms.DataRoms; -import com.vectras.vm.network.RequestNetwork; -import com.vectras.vm.network.RequestNetworkController; -import com.vectras.vm.utils.UIUtils; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.stream.Collectors; - -public class RomStoreActivity extends AppCompatActivity { - - ActivityRomStoreBinding binding; - private RequestNetwork net; - private RequestNetwork.RequestListener _net_request_listener; - private String contentJSON = "[]"; - public static String license; - private RomStoreHomeAdapterSearch mAdapterSearch; - private List data = new ArrayList<>(); - private List dataSearch = new ArrayList<>(); - public static boolean isFinishNow = false; - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - super.onBackPressed(); - return true; - } - return super.onOptionsItemSelected(item); - } - - /** - * Called when the activity is first created. - */ - @Override - public void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); - StrictMode.setThreadPolicy(policy); - - UIUtils.edgeToEdge(this); - binding = ActivityRomStoreBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - UIUtils.setOnApplyWindowInsetsListenerTop(findViewById(R.id.appbar)); - UIUtils.setOnApplyWindowInsetsListenerBottom(findViewById(R.id.romsRv)); - UIUtils.setOnApplyWindowInsetsListenerBottom(findViewById(R.id.romsSearch)); - UIUtils.setOnApplyWindowInsetsListenerBottom(findViewById(R.id.linear_search_emty)); - - binding.searchBar.setNavigationOnClickListener(v -> onBackPressed()); - - binding.searchView.getEditText().addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - search(s.toString()); - } - - @Override - public void onTextChanged(CharSequence newText, int start, int before, int count) { - } - }); - - net = new RequestNetwork(this); - _net_request_listener = new RequestNetwork.RequestListener() { - @Override - public void onResponse(String tag, String response, HashMap 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 + "vroms-store.json","",_net_request_listener); - }); - - net.startRequestNetwork(RequestNetworkController.GET,AppConfig.vectrasRaw + "vroms-store.json","",_net_request_listener); - } - - public void onResume() { - super.onResume(); - if (isFinishNow) - finish(); - isFinishNow = false; - } - - @Override - public void onBackPressed() { - if (binding.searchView.isShowing()) - binding.searchView.hide(); - else - super.onBackPressed(); - } - - @SuppressLint("NotifyDataSetChanged") - private void loadData() { - AdapterRoms mAdapter = new AdapterRoms(this, data); - binding.romsRv.setAdapter(mAdapter); - binding.romsRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); - - mAdapterSearch = new RomStoreHomeAdapterSearch(this, dataSearch); - binding.romsSearch.setAdapter(mAdapterSearch); - binding.romsSearch.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); - - List dataRoms = new ArrayList<>(); - - try { - Gson gson = new Gson(); - Type listType = new TypeToken>() {}.getType(); - dataRoms = gson.fromJson(contentJSON, listType); - } catch (Exception e) { - binding.linearload.setVisibility(View.GONE); - binding.linearnothinghere.setVisibility(View.VISIBLE); - } - - data.clear(); - data.addAll(dataRoms); - mAdapter.notifyDataSetChanged(); - - dataSearch.clear(); - dataSearch.addAll(dataRoms); - mAdapterSearch.notifyDataSetChanged(); - } - - @SuppressLint("NotifyDataSetChanged") - private void search(String keyword) { - try { - // Extract data from json and store into ArrayList as class objects - Gson gson = new Gson(); - Type listType = new TypeToken>() {}.getType(); - List allData = gson.fromJson(contentJSON, listType); - List filteredData = new ArrayList<>(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - filteredData = allData.stream() - .filter(rom -> { - String romName = (rom.romName != null) ? rom.romName : ""; - String romKernel = (rom.romKernel != null) ? rom.romKernel : ""; - - return romName.toLowerCase().contains(keyword.toLowerCase()) - || romKernel.toLowerCase().contains(keyword.toLowerCase()); - }) - .collect(Collectors.toList()); - } else { - for (DataRoms rom : allData) { - if (rom.romName.toLowerCase().contains(keyword.toLowerCase()) || - rom.romKernel.toLowerCase().contains(keyword.toLowerCase())) { - filteredData.add(rom); - } - } - } - - dataSearch.clear(); - dataSearch.addAll(filteredData); - } catch (Exception e) { - Log.e("RomManagerActivity", "Json parsing error: " + e.getMessage()); - } - - if (dataSearch.isEmpty()) - binding.romsSearch.setVisibility(View.GONE); - else - binding.romsSearch.setVisibility(View.VISIBLE); - - mAdapterSearch.notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/com/vectras/vm/Roms/AdapterRoms.java b/app/src/main/java/com/vectras/vm/Roms/AdapterRoms.java deleted file mode 100644 index 8a0ff2b..0000000 --- a/app/src/main/java/com/vectras/vm/Roms/AdapterRoms.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.vectras.vm.Roms; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.util.Log; -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.AppConfig; -import com.vectras.vm.RomInfo; -import com.vectras.vm.R; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.OutputStream; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class AdapterRoms extends RecyclerView.Adapter { - - Context context; - private final LayoutInflater inflater; - static List dataRom = Collections.emptyList(); - private final String TAG = "AdapterRoms"; - - public AdapterRoms(Context context, List 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.romArch + " - " + current.fileSize); - 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); - 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.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); - } - - } - -} diff --git a/app/src/main/java/com/vectras/vm/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/VMCreatorActivity.java index 815de94..8a0b84f 100644 --- a/app/src/main/java/com/vectras/vm/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/VMCreatorActivity.java @@ -26,7 +26,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.textfield.TextInputLayout; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.Fragment.CreateImageDialogFragment; -import com.vectras.vm.MainRoms.DataMainRoms; +import com.vectras.vm.main.vms.DataMainRoms; import com.vectras.vm.databinding.ActivityVmCreatorBinding; import com.vectras.vm.databinding.DialogProgressStyleBinding; import com.vectras.vm.main.MainActivity; diff --git a/app/src/main/java/com/vectras/vm/WidgetProvider.java b/app/src/main/java/com/vectras/vm/WidgetProvider.java deleted file mode 100644 index 23478e7..0000000 --- a/app/src/main/java/com/vectras/vm/WidgetProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.vectras.vm; - -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.Context; -import android.content.Intent; -import android.widget.RemoteViews; - -import com.vectras.vm.main.MainActivity; - -public class WidgetProvider extends AppWidgetProvider { - - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - // Perform this loop procedure for each widget that belongs to this - // provider. - for (int i=0; i < appWidgetIds.length; i++) { - int appWidgetId = appWidgetIds[i]; - // Create an Intent to launch ExampleActivity - Intent intent = new Intent(context, MainActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity( - /* context = */ context, - /* requestCode = */ 0, - /* intent = */ intent, - /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE - ); - - // Get the layout for the widget and attach an onClick listener to - // the button. - RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); - views.setOnClickPendingIntent(R.id.button, pendingIntent); - views.setRemoteAdapter(R.id.mRVMainRoms, intent); - // Tell the AppWidgetManager to perform an update on the current app - // widget. - appWidgetManager.updateAppWidget(appWidgetId, views); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/main/MainActivity.java b/app/src/main/java/com/vectras/vm/main/MainActivity.java index 5195d45..50f7704 100644 --- a/app/src/main/java/com/vectras/vm/main/MainActivity.java +++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java @@ -37,7 +37,6 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import com.termux.app.TermuxActivity; import com.vectras.qemu.Config; import com.vectras.qemu.MainSettingsManager; -import com.vectras.qemu.MainVNCActivity; import com.vectras.vm.AboutActivity; import com.vectras.vm.AppConfig; import com.vectras.vm.VMCreatorActivity; @@ -53,7 +52,7 @@ import com.vectras.vm.network.RequestNetworkController; import com.vectras.vm.databinding.BottomsheetdialogLoggerBinding; import com.vectras.vm.databinding.UpdateBottomDialogLayoutBinding; import com.vectras.vm.main.romstore.RomStoreHomeAdapterSearch; -import com.vectras.vm.Roms.DataRoms; +import com.vectras.vm.main.romstore.DataRoms; import com.vectras.vm.SetArchActivity; import com.vectras.vm.VMManager; import com.vectras.vm.adapter.LogsAdapter; @@ -565,7 +564,7 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment. @SuppressLint("NotifyDataSetChanged") private void search(String keyword) { try { - // Extract data from json and store into ArrayList as class objects + // Extract data from JSON and store into ArrayList as class objects List filteredData = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -598,7 +597,11 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment. else binding.rvRomstoresearch.setVisibility(View.VISIBLE); - adapterRomStoreSearch.notifyDataSetChanged(); + if (currentSearchMode == SEARCH_ROM_STORE ) { + if (adapterRomStoreSearch != null) adapterRomStoreSearch.notifyDataSetChanged(); + } else { + if (adapterSoftwareStoreSearch != null) adapterSoftwareStoreSearch.notifyDataSetChanged(); + } } private void showLogsDialog() { diff --git a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java index 883077e..dfdee4a 100644 --- a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java +++ b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java @@ -206,6 +206,7 @@ public class MainStartVM { MainService.startCommand(finalCommand, context); } else { Intent serviceIntent = new Intent(context, MainService.class); + MainService.activityContext = context; MainService.env = finalCommand; MainService.CHANNEL_ID = vmName; if (SDK_INT >= Build.VERSION_CODES.O) { diff --git a/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java index 8017a81..a626113 100644 --- a/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java +++ b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java @@ -8,7 +8,7 @@ import android.widget.Button; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.vectras.vm.VMCreatorActivity; import com.vectras.vm.ExportRomActivity; -import com.vectras.vm.MainRoms.DataMainRoms; +import com.vectras.vm.main.vms.DataMainRoms; import com.vectras.vm.R; import com.vectras.vm.VMManager; diff --git a/app/src/main/java/com/vectras/vm/main/core/SharedData.java b/app/src/main/java/com/vectras/vm/main/core/SharedData.java index 88c2b14..169e101 100644 --- a/app/src/main/java/com/vectras/vm/main/core/SharedData.java +++ b/app/src/main/java/com/vectras/vm/main/core/SharedData.java @@ -1,6 +1,6 @@ package com.vectras.vm.main.core; -import com.vectras.vm.Roms.DataRoms; +import com.vectras.vm.main.romstore.DataRoms; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/vectras/vm/Roms/DataRoms.java b/app/src/main/java/com/vectras/vm/main/romstore/DataRoms.java similarity index 93% rename from app/src/main/java/com/vectras/vm/Roms/DataRoms.java rename to app/src/main/java/com/vectras/vm/main/romstore/DataRoms.java index 66580d1..44a136b 100644 --- a/app/src/main/java/com/vectras/vm/Roms/DataRoms.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/DataRoms.java @@ -1,4 +1,4 @@ -package com.vectras.vm.Roms; +package com.vectras.vm.main.romstore; import com.google.gson.annotations.SerializedName; diff --git a/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java b/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java index 0085a22..a0e3ddc 100644 --- a/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java @@ -4,8 +4,6 @@ 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; diff --git a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java index 861a007..b11d634 100644 --- a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java @@ -18,7 +18,6 @@ import com.google.gson.Gson; import com.vectras.vm.AppConfig; 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.main.core.SharedData; diff --git a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java index e6b5946..aa7a87f 100644 --- a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java @@ -19,7 +19,6 @@ 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; diff --git a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdpater.java b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdpater.java index 84cfc51..b4a66d4 100644 --- a/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdpater.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdpater.java @@ -18,7 +18,6 @@ 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; diff --git a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreFragment.java b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreFragment.java index f0427c7..531c036 100644 --- a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreFragment.java +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreFragment.java @@ -16,11 +16,10 @@ 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.main.romstore.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; diff --git a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java index 3bb6068..c8ade8a 100644 --- a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java @@ -18,7 +18,7 @@ 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 com.vectras.vm.main.romstore.DataRoms; import java.util.Collections; import java.util.List; diff --git a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapterSearch.java b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapterSearch.java index caa47f9..ae6337b 100644 --- a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapterSearch.java +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapterSearch.java @@ -19,7 +19,7 @@ import com.bumptech.glide.Glide; import com.vectras.vm.RomInfo; import com.vectras.vm.R; -import com.vectras.vm.Roms.DataRoms; +import com.vectras.vm.main.romstore.DataRoms; import java.util.Collections; import java.util.List; diff --git a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreViewModel.java b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreViewModel.java index 14cea0f..c2f0a81 100644 --- a/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreViewModel.java +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreViewModel.java @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import com.vectras.vm.Roms.DataRoms; +import com.vectras.vm.main.romstore.DataRoms; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/vectras/vm/MainRoms/DataMainRoms.java b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java similarity index 86% rename from app/src/main/java/com/vectras/vm/MainRoms/DataMainRoms.java rename to app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java index c684b92..b27ebd7 100644 --- a/app/src/main/java/com/vectras/vm/MainRoms/DataMainRoms.java +++ b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java @@ -1,4 +1,4 @@ -package com.vectras.vm.MainRoms; +package com.vectras.vm.main.vms; public class DataMainRoms { public String itemIcon; public String itemName; diff --git a/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java b/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java index 097397c..93ac804 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java @@ -2,8 +2,6 @@ package com.vectras.vm.main.vms; import androidx.recyclerview.widget.DiffUtil; -import com.vectras.vm.MainRoms.DataMainRoms; - import java.util.List; public class VmsDiffUtil extends DiffUtil.Callback { diff --git a/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java b/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java index b5b4cc7..8929cd3 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java @@ -15,7 +15,6 @@ import android.view.ViewGroup; import com.google.android.material.transition.MaterialFadeThrough; import com.vectras.vm.AppConfig; -import com.vectras.vm.MainRoms.DataMainRoms; import com.vectras.vm.R; import com.vectras.vm.VMManager; import com.vectras.vm.databinding.FragmentHomeVmsBinding; diff --git a/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java b/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java index 3fcb010..3521dae 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java @@ -16,7 +16,6 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.vectras.qemu.Config; -import com.vectras.vm.MainRoms.DataMainRoms; import com.vectras.vm.R; import com.vectras.vm.StartVM; import com.vectras.vm.VMManager; diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java deleted file mode 100644 index 27d5fe9..0000000 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java +++ /dev/null @@ -1,734 +0,0 @@ -package com.vectras.vm.setupwizard; - -import static android.content.Intent.ACTION_VIEW; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.termux.app.TermuxActivity; -import com.termux.app.TermuxService; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ScrollView; -import android.widget.TextView; -import android.widget.Toast; -import android.widget.BaseAdapter; - -import androidx.activity.OnBackPressedCallback; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.preference.PreferenceManager; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.vectras.qemu.MainSettingsManager; -import com.vectras.vm.AppConfig; -import com.vectras.vm.R; -import com.vectras.vm.network.RequestNetwork; -import com.vectras.vm.network.RequestNetworkController; -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.main.MainActivity; -import com.vectras.vm.utils.ClipboardUltils; -import com.vectras.vm.utils.DeviceUtils; -import com.vectras.vm.utils.DialogUtils; -import com.vectras.vm.utils.FileUtils; -import com.vectras.vm.utils.JSONUtils; -import com.vectras.vm.utils.ListUtils; -import com.vectras.vm.utils.UIUtils; -import com.vectras.vm.utils.PermissionUtils; -import com.vectras.vterm.TerminalBottomSheetDialog; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Objects; - -public class SetupWizardActivity extends AppCompatActivity { - ActivitySetupWizardBinding binding; - SetupQemuAdvancedBinding bindingAdvancedSetup; - SetupQemuDoneBinding bindingFinalSteps; - private final String TAG = "SetupWizardActivity"; - private boolean isFirstLaunch = false; - private boolean libprooterror = false; - private RequestNetwork net; - private RequestNetwork.RequestListener _net_request_listener; - private String contentJSON = ""; - private HashMap mmap = new HashMap<>(); - private String bootstrapfilelink = ""; - private final ArrayList> listmapForSelectMirrors = new ArrayList<>(); - private String selectedMirrorCommand = "echo "; - private String selectedMirrorLocation = ""; - private String downloadBootstrapsCommand = ""; - private boolean aria2Error = false; - private boolean isexecutingCommand = false; - private boolean isServerError = false; - private boolean isManualMode = false; - private boolean isAllowCheckPermissions = false; - String tarPath; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - UIUtils.edgeToEdge(this); - binding = ActivitySetupWizardBinding.inflate(getLayoutInflater()); - bindingAdvancedSetup = binding.advancedsetup; - bindingFinalSteps = binding.finalsteps; - setContentView(binding.getRoot()); - UIUtils.setOnApplyWindowInsetsListener(findViewById(R.id.main)); - - setupSpiner(); - - tarPath = getExternalFilesDir("data") + "/data.tar.gz"; - - binding.spinnerselectmirror.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - selectedMirrorCommand = Objects.requireNonNull(listmapForSelectMirrors.get(position).get("mirror")); - selectedMirrorLocation = Objects.requireNonNull(listmapForSelectMirrors.get(position).get("location")); - MainSettingsManager.setSelectedMirror(SetupWizardActivity.this, position); - } - - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); - - net = new RequestNetwork(this); - _net_request_listener = new RequestNetwork.RequestListener() { - @Override - public void onResponse(String tag, String response, HashMap responseHeaders) { - binding.linearload.setVisibility(View.GONE); - contentJSON = response; - if (JSONUtils.isValidFromString(contentJSON)) { - mmap.clear(); - mmap = new Gson().fromJson(contentJSON, new TypeToken>() { - }.getType()); - if (mmap.containsKey("arm64-v8a") && mmap.containsKey("amd64")) { - if (Build.SUPPORTED_ABIS[0].contains("arm64")) { - bootstrapfilelink = Objects.requireNonNull(mmap.get("arm64-v8a")).toString(); - } else { - bootstrapfilelink = Objects.requireNonNull(mmap.get("amd64")).toString(); - } - downloadBootstrapsCommand = " aria2c -x 4 --async-dns=false --disable-ipv6 --check-certificate=false -o setup.tar.gz " + bootstrapfilelink; - if (!bootstrapfilelink.isEmpty()) { - binding.linearcannotconnecttoserver.setVisibility(View.GONE); - } - } - } - } - - @Override - public void onErrorResponse(String tag, String message) { - binding.linearload.setVisibility(View.GONE); - } - }; - - setupOnClick(); - - getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - if (isexecutingCommand) { - if (binding.linearsimplesetupui.getVisibility() == View.GONE) - binding.linearsimplesetupui.setVisibility(View.VISIBLE); - } else if (bindingAdvancedSetup.lnAdvancedsetup.getVisibility() == View.GONE) { - onBackInFinalSteps(); - } else { - setEnabled(false); - getOnBackPressedDispatcher().onBackPressed(); - } - } - }); - - extractSystemFiles(); - } - - private void extractSystemFiles() { - 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.installing)); - AlertDialog progressDialog = new MaterialAlertDialogBuilder(this, R.style.CenteredDialogTheme) - .setView(progressView) - .setCancelable(false) - .create(); - progressDialog.show(); - - new Thread(() -> { - boolean result = SetupFeatureCore.startExtractSystemFiles(this); - - runOnUiThread(() -> { - progressDialog.dismiss(); - - if (!result) DialogUtils.oneDialog( - this, - getString(R.string.oops), - getString(R.string.system_files_installation_failed_content), - getString(R.string.try_again), - true, - R.drawable.error_96px, - false, - this::extractSystemFiles, - null); - }); - }).start(); - } - - @Override - protected void onResume() { - super.onResume(); - checkpermissions(); - } - - // Function to append text and automatically scroll to bottom - @SuppressLint("SetTextI18n") - private void appendTextAndScroll(String textToAdd) { - // Update the text - bindingAdvancedSetup.tvTerminalOutput.append(textToAdd); - - if (textToAdd.contains("xssFjnj58Id")) { - isexecutingCommand = false; - binding.linearsimplesetupui.setVisibility(View.GONE); - bindingAdvancedSetup.lnAdvancedsetup.setVisibility(View.GONE); - } else if (textToAdd.contains("libproot.so --help") || textToAdd.contains("/bin/sh: can't fork:")) { - libprooterror = true; - } else if (textToAdd.contains("not complete: /root/setup.tar.gz")) { - aria2Error = true; - } else if (textToAdd.contains("temporary error")) { - isServerError = true; - } - - if (textToAdd.contains("Starting setup...")) { - setTextStatus(getString(R.string.getting_ready_for_you_please_don_t_disconnect_the_network)); - } else if (textToAdd.contains("fetch http")) { - setTextStatus(getString(R.string.connecting_to_mirror_in) + "\n" + selectedMirrorLocation + "..."); - } else if (textToAdd.contains("Installing packages...")) { - setTextStatus(getString(R.string.completed_10_it_won_t_take_long)); - } else if (textToAdd.contains("(50/")) { - setTextStatus(getString(R.string.completed_20_it_won_t_take_long)); - } else if (textToAdd.contains("100/")) { - setTextStatus(getString(R.string.completed_30_it_won_t_take_long)); - } else if (textToAdd.contains("150/")) { - setTextStatus(getString(R.string.completed_40_it_won_t_take_long)); - } else if (textToAdd.contains("200/")) { - setTextStatus(getString(R.string.completed_50_it_won_t_take_long)); - } else if (textToAdd.contains("Downloading Qemu...")) { - setTextStatus(getString(R.string.completed_75_don_t_disconnect)); - } else if (textToAdd.contains("Installing Qemu...")) { - setTextStatus(getString(R.string.keep_it_up)); - } else if (textToAdd.contains("qemu-system")) { - setTextStatus(getString(R.string.completed_95_keep_it_up)); - } else if (textToAdd.contains("Just a sec...")) { - setTextStatus(getString(R.string.almost_there)); - } - - // Scroll to the bottom - bindingAdvancedSetup.scrollView.post(() -> bindingAdvancedSetup.scrollView.fullScroll(ScrollView.FOCUS_DOWN)); - } - - private void setTextStatus(String content) { - bindingAdvancedSetup.title.setText(content.replaceAll("\n", ". ")); - binding.textviewsettingup.setText(content); - } - - private void startSetup() { - aria2Error = false; - isServerError = false; - simpleSetupUIControler(1); - uiControllerAdvancedSetup(true); - String cmd = selectedMirrorCommand + ";" + - " set -e;" + - " echo \"Starting setup...\";" + - " apk update;" + - " echo \"Installing packages...\";" + - " apk add " + (DeviceUtils.is64bit() ? AppConfig.neededPkgs() : AppConfig.neededPkgs32bit()) + ";" + - " echo \"Downloading Qemu...\";"; - - if (isManualMode) { - cmd += " tar -xzvf " + tarPath + " -C /;" + - " rm " + tarPath + ";" + - " chmod 775 /usr/local/bin/*;"; - } else if (DeviceUtils.is64bit()) { - cmd += downloadBootstrapsCommand + ";" + - " echo \"Installing Qemu...\";" + - " tar -xzvf setup.tar.gz -C /;" + - " rm setup.tar.gz;" + - " chmod 775 /usr/local/bin/*;"; - } else { - cmd += " apk add qemu-system-x86_64 qemu-system-ppc qemu-system-i386 qemu-system-aarch64" + - " qemu-pr-helper qemu-img mesa-dri-gallium;"; - } - - cmd += " echo \"Just a sec...\";" + - " echo export TMPDIR=/tmp >> /etc/profile;" + - " mkdir -p $TMPDIR/pulse;" + - " echo export PULSE_SERVER=127.0.0.1 >> /etc/profile;" + - " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;" + - " echo \"installation successful! xssFjnj58Id\""; - - bindingAdvancedSetup.tvCommandsetup.setText(cmd); - executeShellCommand(cmd); - } - - private void checkpermissions() { - if (!isAllowCheckPermissions) return; - - if (PermissionUtils.storagepermission(this, true)) { - if (!isFirstLaunch) { - isFirstLaunch = true; - SetupFeatureCore.checkabi(this); - - if (binding.linearsimplesetupui.getVisibility() == View.GONE) { - showAdvancedSetupDialog(); - } - } - - if (DeviceUtils.isStorageLow(this, false)) { - DialogUtils.oneDialog(this, - getResources().getString(R.string.oops), - getResources().getString(R.string.not_enough_storage_to_set_up_content), - getResources().getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - () -> { - if (DeviceUtils.isStorageLow(this, false)) finish(); - }); - } - } - } - - private void simpleSetupUIControler(int status) { - if (status == 0) { - //Before setup. - binding.linearstartsetup.setVisibility(View.VISIBLE); - binding.linearsettingup.setVisibility(View.GONE); - binding.linearsetupfailed.setVisibility(View.GONE); - - File tarGZ = new File(tarPath); - if (tarGZ.exists()) { - if (!tarGZ.delete()) Log.e(TAG, "simpleSetupUIControler: Unable to delete " + tarPath); - } - } else if (status == 1) { - //Setting up. - binding.linearstartsetup.setVisibility(View.GONE); - binding.linearsettingup.setVisibility(View.VISIBLE); - binding.linearsetupfailed.setVisibility(View.GONE); - } else if (status == 2) { - //Failed. - binding.linearstartsetup.setVisibility(View.GONE); - binding.linearsettingup.setVisibility(View.GONE); - binding.linearsetupfailed.setVisibility(View.VISIBLE); - } - } - - private final ActivityResultLauncher bootstrapFilePicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - String abi = Build.SUPPORTED_ABIS[0]; - if (FileUtils.getFileNameFromUri(this, uri).endsWith(abi + ".tar.gz")) { - simpleSetupUIControler(1); - new Thread(() -> { - try { - setTextStatus(getString(R.string.copying_file)); - FileUtils.copyFileFromUri(this, uri, tarPath); - runOnUiThread(() -> { - isManualMode = true; - startSetup(); - MainSettingsManager.setsetUpWithManualSetupBefore(SetupWizardActivity.this, true); - }); - } catch (Exception e) { - runOnUiThread(() -> { - DialogUtils.oneDialog(this, - getString(R.string.oops), - getString(R.string.the_file_could_not_be_processed_content), - getResources().getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - () -> { - if (binding.linearsimplesetupui.getVisibility() == View.GONE) { - showAdvancedSetupDialog(); - } - }); - simpleSetupUIControler(0); - }); - } - }).start(); - } else { - DialogUtils.oneDialog(this, - getString(R.string.invalid_file), - getString(R.string.please_select) + " vectras-vm-" + abi + ".tar.gz.", - getResources().getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - () -> { - if (binding.linearsimplesetupui.getVisibility() == View.GONE) { - showAdvancedSetupDialog(); - } - }); - } - } else { - if (binding.linearsimplesetupui.getVisibility() == View.GONE) { - showAdvancedSetupDialog(); - } - } - }); - - private void onBackInFinalSteps() { - if (bindingFinalSteps.lineardonate.getVisibility() == View.GONE) { - bindingFinalSteps.lineardonate.setVisibility(View.VISIBLE); - } else if (bindingFinalSteps.linearcommunity.getVisibility() == View.GONE) { - bindingFinalSteps.linearcommunity.setVisibility(View.VISIBLE); - } - - if (bindingFinalSteps.tvLater.getVisibility() == View.GONE) { - bindingFinalSteps.tvLater.setVisibility(View.VISIBLE); - bindingFinalSteps.btnContinue.setText(getString(R.string.join)); - } - } - - private void setupOnClick() { - //Simple setup - binding.buttonletstart.setOnClickListener(v -> { - binding.linearwelcome.setVisibility(View.GONE); - isAllowCheckPermissions = true; - checkpermissions(); - net.startRequestNetwork(RequestNetworkController.GET, AppConfig.bootstrapfileslink, "", _net_request_listener); - }); - - binding.buttontryconnectagain.setOnClickListener(v -> { - binding.linearload.setVisibility(View.VISIBLE); - net.startRequestNetwork(RequestNetworkController.GET, AppConfig.bootstrapfileslink, "", _net_request_listener); - }); - - binding.buttonautosetup.setOnClickListener(v -> { - isManualMode = false; - startSetup(); - simpleSetupUIControler(1); - }); - - binding.buttonmanualsetup.setOnClickListener(v -> bootstrapFilePicker.launch("*/*")); - - binding.buttonsetuptryagain.setOnClickListener(v -> simpleSetupUIControler(0)); - - binding.buttonsetupshowlog.setOnClickListener(v -> binding.linearsimplesetupui.setVisibility(View.GONE)); - - binding.textviewshowadvancedsetup.setOnClickListener(v -> { - binding.linearsimplesetupui.setVisibility(View.GONE); - if (binding.linearstartsetup.getVisibility() == View.VISIBLE) { - showAdvancedSetupDialog(); - } - }); - - - //Advanced setup - bindingAdvancedSetup.ivClose.setOnClickListener(v -> binding.linearsimplesetupui.setVisibility(View.VISIBLE)); - - bindingAdvancedSetup.ivOpenterminal.setOnClickListener(v -> { - if (DeviceUtils.is64bit()) { - startActivity(new Intent(this, TermuxActivity.class)); - } else { - TerminalBottomSheetDialog VTERM = new TerminalBottomSheetDialog(this); - VTERM.showVterm(); - } - }); - - bindingAdvancedSetup.btnInstall.setOnClickListener(v -> { - File tarGZ = new File(tarPath); - if (tarGZ.exists()) { - if (!tarGZ.delete()) Log.e(TAG, "btnInstall: Unable to delete " + tarPath); - } - showAdvancedSetupDialog(); - }); - - bindingAdvancedSetup.ivCopycommandsetup.setOnClickListener(v -> ClipboardUltils.copyToClipboard(SetupWizardActivity.this, bindingAdvancedSetup.tvCommandsetup.getText().toString())); - - - //Final steps - bindingFinalSteps.tvLater.setOnClickListener(v -> { - if (bindingFinalSteps.linearcommunity.getVisibility() == View.VISIBLE) { - bindingFinalSteps.linearcommunity.setVisibility(View.GONE); - } else if (bindingFinalSteps.lineardonate.getVisibility() == View.VISIBLE) { - bindingFinalSteps.tvLater.setVisibility(View.GONE); - bindingFinalSteps.lineardonate.setVisibility(View.GONE); - bindingFinalSteps.btnContinue.setText(getString(R.string.done)); - } - }); - - bindingFinalSteps.btnContinue.setOnClickListener(v -> { - if (bindingFinalSteps.linearcommunity.getVisibility() == View.VISIBLE) { - bindingFinalSteps.linearcommunity.setVisibility(View.GONE); - Intent intent = new Intent(ACTION_VIEW, Uri.parse(AppConfig.telegramLink)); - startActivity(intent); - //Don't show join Telegram dialog again - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor edit = prefs.edit(); - edit.putBoolean("tgDialog", true); - edit.apply(); - } else if (bindingFinalSteps.lineardonate.getVisibility() == View.VISIBLE) { - bindingFinalSteps.tvLater.setVisibility(View.GONE); - bindingFinalSteps.lineardonate.setVisibility(View.GONE); - bindingFinalSteps.btnContinue.setText(getString(R.string.done)); - Intent intent = new Intent(ACTION_VIEW, Uri.parse(AppConfig.patreonLink)); - startActivity(intent); - } else { - startActivity(new Intent(SetupWizardActivity.this, MainActivity.class)); - finish(); - } - }); - } - - private void uiControllerAdvancedSetup(boolean isStartSetup) { - bindingAdvancedSetup.lnBntinstall.setVisibility(isStartSetup ? View.GONE : View.VISIBLE); - bindingAdvancedSetup.progressBar.setVisibility(isStartSetup ? View.VISIBLE : View.GONE); - } - - private void showAdvancedSetupDialog() { - DialogUtils.twoDialog( - this, - getResources().getString(R.string.bootstrap_required), - getResources().getString(R.string.you_can_choose_between_auto_download_and_setup_or_manual_setup_by_choosing_bootstrap_file), - getString(R.string.auto_setup), - getString(R.string.manual_setup), - true, R.drawable.system_update_24px, - false, - () -> { - //startDownload(); - isManualMode = false; - startSetup(); - simpleSetupUIControler(1); - }, - () -> bootstrapFilePicker.launch("*/*"), - null); - } - - private void setupSpiner() { - ListUtils.setupMirrorListForListmap(listmapForSelectMirrors); - - binding.spinnerselectmirror.setAdapter(new SpinnerSelectMirrorAdapter(getApplicationContext(), listmapForSelectMirrors)); - binding.spinnerselectmirror.setSelection(MainSettingsManager.getSelectedMirror(this)); - } - - public static class SpinnerSelectMirrorAdapter extends BaseAdapter { - - private final ArrayList> data; - private final LayoutInflater inflater; - - public SpinnerSelectMirrorAdapter(Context context, ArrayList> arr) { - this.data = arr; - this.inflater = LayoutInflater.from(context); - } - - @Override - public int getCount() { - return data.size(); - } - - @Override - public HashMap getItem(int position) { - return data.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder holder; - - if (convertView == null) { - // Inflate binding only once for each new item - SimpleLayoutForSpinerBinding binding = - SimpleLayoutForSpinerBinding.inflate(inflater, parent, false); - - // Create ViewHolder to hold binding - holder = new ViewHolder(binding); - convertView = binding.getRoot(); - convertView.setTag(holder); - } else { - // Get back the saved ViewHolder - holder = (ViewHolder) convertView.getTag(); - } - - // Assign data - HashMap item = data.get(position); - holder.binding.textViewLocation.setText(item.get("location")); - - return convertView; - } - - // ViewHolder holds binding for reuse - record ViewHolder(SimpleLayoutForSpinerBinding binding) { - } - } - - // Method to execute the shell command - public void executeShellCommand(String userCommand) { - isexecutingCommand = true; - new Thread(() -> { - try { - // Setup the process builder to start PRoot with environmental variables and commands - ProcessBuilder processBuilder = new ProcessBuilder(); - - // Adjust these environment variables as necessary for your app - String filesDir = getFilesDir().getAbsolutePath(); - - File tmpDir = new File(getFilesDir(), "usr/tmp"); - - // Setup environment for the PRoot process - processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath()); - - processBuilder.environment().put("HOME", "/root"); - processBuilder.environment().put("USER", "root"); - processBuilder.environment().put("PATH", "/bin:/usr/bin:/sbin:/usr/sbin"); - processBuilder.environment().put("TERM", "xterm-256color"); - processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath()); - processBuilder.environment().put("SHELL", "/bin/sh"); - - String[] prootCommand = { - TermuxService.PREFIX_PATH + "/bin/proot", // PRoot binary path - "--kill-on-exit", - "--link2symlink", - "-0", - "-r", filesDir + "/distro", // Path to the rootfs - "-b", "/dev", - "-b", "/proc", - "-b", "/sys", - "-b", "/sdcard", - "-b", "/storage", - "-b", "/data", - "-w", "/root", - "/bin/sh", - "--login"// The shell to execute inside PRoot - }; - - processBuilder.command(prootCommand); - Process process = processBuilder.start(); - // Get the input and output streams of the process - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - - // Send user command to PRoot - writer.write(userCommand); - writer.newLine(); - writer.flush(); - writer.close(); - - // Read the input stream for the output of the command - String line; - while ((line = reader.readLine()) != null) { - final String outputLine = line; - runOnUiThread(() -> appendTextAndScroll(outputLine + "\n")); - } - - // Read any errors from the error stream - while ((line = errorReader.readLine()) != null) { - final String errorLine = line; - runOnUiThread(() -> appendTextAndScroll(errorLine + "\n")); - } - - // Clean up - reader.close(); - errorReader.close(); - - // Wait for the process to finish - process.waitFor(); - - // Wait for the process to finish - int exitValue = process.waitFor(); - - // Check if the exit value indicates an error - if (exitValue != 0) { - isexecutingCommand = false; - // If exit value is not zero, display a toast message - if (!aria2Error) { - String toastMessage = "Command failed with exit code: " + exitValue; - runOnUiThread(() -> { - appendTextAndScroll("Error: " + toastMessage + "\n"); - Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show(); - uiControllerAdvancedSetup(false); - bindingAdvancedSetup.title.setText(getString(R.string.failed)); - simpleSetupUIControler(2); - }); - } - if (libprooterror) { - runOnUiThread(() -> DialogUtils.twoDialog( - this, - getResources().getString(R.string.oops), - getResources().getString(R.string.a_serious_problem_has_occurred), - getString(R.string.join_our_community), - getString(R.string.close), - true, R.drawable.system_update_24px, - true, - () -> { - Intent intent = new Intent(); - intent.setAction(ACTION_VIEW); - intent.setData(Uri.parse(AppConfig.community)); - startActivity(intent); - }, - null, - null)); - } else if (aria2Error && downloadBootstrapsCommand.contains("aria2c")) { - runOnUiThread(() -> { - downloadBootstrapsCommand = " curl -o setup.tar.gz -L " + bootstrapfilelink; - startSetup(); - }); - } else if (isServerError) { - runOnUiThread(() -> DialogUtils.oneDialog( - this, - getResources().getString(R.string.oops), - getResources().getString(R.string.unable_to_connect_to_alpine_linux_server_content), - getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - null)); - } - } - } catch (IOException | InterruptedException e) { - isexecutingCommand = false; - // Handle exceptions by printing the stack trace in the terminal output - final String errorMessage = e.getMessage(); - runOnUiThread(() -> { - appendTextAndScroll("Error: " + errorMessage + "\n"); - Toast.makeText(this, "Error executing command: " + errorMessage, Toast.LENGTH_LONG).show(); - uiControllerAdvancedSetup(false); - bindingAdvancedSetup.title.setText(getString(R.string.failed)); - simpleSetupUIControler(2); - }); - } - }).start(); // Execute the command in a separate thread to prevent blocking the UI thread - } - - public String getPath(Uri uri) { - return FileUtils.getPath(this, uri); - } -} diff --git a/app/src/main/java/com/vectras/vm/utils/DialogUtils.java b/app/src/main/java/com/vectras/vm/utils/DialogUtils.java index 3d9e6ce..32e92f1 100644 --- a/app/src/main/java/com/vectras/vm/utils/DialogUtils.java +++ b/app/src/main/java/com/vectras/vm/utils/DialogUtils.java @@ -2,6 +2,7 @@ package com.vectras.vm.utils; import static android.content.Intent.ACTION_VIEW; +import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; @@ -31,6 +32,8 @@ public class DialogUtils { } public static void oneDialog(Context context, String _title, String _message, String _textPositiveButton, boolean _isicon, int _iconid, boolean _cancel, Runnable _onPositive, Runnable _onDismiss) { + if (!isAllowShow(context)) return; + View buttonsView = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null); AlertDialog dialog = new AlertDialog.Builder(context).create(); @@ -89,6 +92,8 @@ public class DialogUtils { } public static void twoDialog(Context context, String _title, String _message, String _textPositiveButton, String _textNegativeButton, boolean _isicon, int _iconid, boolean _cancel, Runnable _onPositive, Runnable _onNegative, Runnable _onDismiss) { + if (!isAllowShow(context)) return; + View buttonsView = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null); AlertDialog dialog = new AlertDialog.Builder(context).create(); @@ -156,6 +161,8 @@ public class DialogUtils { } public static void threeDialog(Context context, String _title, String _message, String _textPositiveButton, String _textNegativeButton, String _textNeutralButton, boolean _isicon, int _iconid, boolean _cancel, Runnable _onPositive, Runnable _onNegative, Runnable _onNeutral, Runnable _onDismiss) { + if (!isAllowShow(context)) return; + View buttonsView = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null); AlertDialog dialog = new AlertDialog.Builder(context).create(); @@ -232,6 +239,10 @@ public class DialogUtils { dialog.show(); } + public static boolean isAllowShow(Context context) { + return context instanceof Activity; + } + public static void joinTelegram(Context _context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(_context); if (!prefs.getBoolean("tgDialog", false)) { diff --git a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java index 3a1f491..f18bc3f 100644 --- a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java +++ b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java @@ -59,7 +59,7 @@ public class LibraryChecker { .setMessage("The following libraries are missing:\n\n" + missingLibraries) .setCancelable(false) .setPositiveButton("Install", (dialog, which) -> { - // Create the install command + // Create the installation command String installCommand = "apk add " + missingLibraries.replace("\n", " "); new Terminal(context).executeShellCommand(installCommand, true, true, activity); }) diff --git a/app/src/main/java/com/vectras/vterm/Terminal.java b/app/src/main/java/com/vectras/vterm/Terminal.java index d42bacb..ebf5828 100644 --- a/app/src/main/java/com/vectras/vterm/Terminal.java +++ b/app/src/main/java/com/vectras/vterm/Terminal.java @@ -1,8 +1,6 @@ package com.vectras.vterm; -import android.app.Activity; import android.content.Context; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -26,10 +24,7 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import com.vectras.qemu.MainVNCActivity; import com.vectras.vm.R; import com.vectras.vm.VMManager; import com.vectras.vm.AppConfig; @@ -57,8 +52,8 @@ public class Terminal { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); - if (!inetAddress.isLoopbackAddress() && inetAddress.getHostAddress().toString().contains(".")) { - return inetAddress.getHostAddress().toString(); + if (!inetAddress.isLoopbackAddress() && Objects.requireNonNull(inetAddress.getHostAddress()).contains(".")) { + return inetAddress.getHostAddress(); } } } @@ -187,7 +182,7 @@ public class Terminal { com.vectras.vm.logger.VectrasStatus.logError("VTERM: >" + userCommand + ""); new Thread(() -> { try { - // Setup the qemuProcess builder to start PRoot with environmental variables and commands + // Set up the qemuProcess builder to start PRoot with environmental variables and commands ProcessBuilder processBuilder = new ProcessBuilder(); // Adjust these environment variables as necessary for your app @@ -264,13 +259,11 @@ public class Terminal { int exitCode = qemuProcess.waitFor(); // Wait for the process to finish if (exitCode == 0) { output.append("Execution finished successfully.\n"); - output.append(reader.readLine()).append("\n"); - Log.i(TAG, reader.readLine()); } else { output.append("Execution finished with exit code: ").append(exitCode).append("\n"); - output.append(reader.readLine()).append("\n"); - Log.i(TAG, reader.readLine()); } + output.append(reader.readLine()).append("\n"); + Log.i(TAG, reader.readLine()); } catch (IOException | InterruptedException e) { output.append(e.getMessage()); errors.append(Log.getStackTraceString(e)); @@ -367,109 +360,6 @@ public class Terminal { return output.toString(); } - public void extractQemuVersion(String userCommand, boolean showResultDialog, Activity dialogActivity, CommandCallback callback) { - StringBuilder output = new StringBuilder(); - StringBuilder errors = new StringBuilder(); - Log.d(TAG, userCommand); - com.vectras.vm.logger.VectrasStatus.logError("VTERM: >" + userCommand + ""); - - new Thread(() -> { - try { - // Process setup (same as your original code) - ProcessBuilder processBuilder = new ProcessBuilder(); - - String filesDir = Objects.requireNonNull(context.getFilesDir().getAbsolutePath()); - File tmpDir = new File(Objects.requireNonNull(context.getFilesDir()), "usr/tmp"); - - processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath()); - processBuilder.environment().put("HOME", "/root"); - processBuilder.environment().put("USER", user); - processBuilder.environment().put("TERM", "xterm-256color"); - processBuilder.environment().put("TMPDIR", "/tmp"); - processBuilder.environment().put("SHELL", "/bin/sh"); - processBuilder.environment().put("DISPLAY", DISPLAY); - processBuilder.environment().put("PULSE_SERVER", "127.0.0.1"); - processBuilder.environment().put("XDG_RUNTIME_DIR", "${TMPDIR}"); - processBuilder.environment().put("SDL_VIDEODRIVER", "x11"); - - String[] prootCommand = { - TermuxService.PREFIX_PATH + "/bin/proot", - "--kill-on-exit", - "--link2symlink", - "-0", - "-r", filesDir + "/distro", - "-b", "/dev", - "-b", "/proc", - "-b", "/sys", - "-b", AppConfig.internalDataDirPath + "distro/root:/dev/shm", - "-b", "/sdcard", - "-b", "/storage", - "-b", "/data", - "-b", AppConfig.internalDataDirPath + "usr/tmp:/tmp", - "-w", "/root", - "/bin/sh", - "--login" - }; - - processBuilder.command(prootCommand); - qemuProcess = processBuilder.start(); - - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(qemuProcess.getOutputStream())); - BufferedReader reader = new BufferedReader(new InputStreamReader(qemuProcess.getInputStream())); - BufferedReader errorReader = new BufferedReader(new InputStreamReader(qemuProcess.getErrorStream())); - - writer.write(userCommand); - writer.newLine(); - writer.flush(); - writer.close(); - - String line; - while ((line = reader.readLine()) != null) { - output.append(line).append("\n"); - } - - while ((line = errorReader.readLine()) != null) { - errors.append(line).append("\n"); - } - - reader.close(); - errorReader.close(); - - qemuProcess.waitFor(); - - } catch (IOException | InterruptedException e) { - output.append(e.getMessage()); - errors.append(Log.getStackTraceString(e)); - } finally { - String finalOutput = output.toString(); - String finalErrors = errors.toString(); - - // Extract version using regex - String version = extractVersion(finalOutput); - - // Run callback on main thread - new Handler(Looper.getMainLooper()).post(() -> { - if (callback != null) { - callback.onCommandCompleted(version != null ? version : finalOutput, finalErrors); - } - if (showResultDialog) { - showDialog(finalOutput.isEmpty() ? finalErrors : finalOutput, dialogActivity, userCommand); - } - }); - } - }).start(); - } - - private String extractVersion(String output) { - String regex = "QEMU emulator version ([\\d.]+)"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(output); - if (matcher.find()) { - return matcher.group(1); // Return the version number - } - return null; - } - public interface CommandCallback { void onCommandCompleted(String output, String errors); } diff --git a/app/src/main/res/layout/activity_rom_store.xml b/app/src/main/res/layout/activity_rom_store.xml deleted file mode 100644 index 83077d8..0000000 --- a/app/src/main/res/layout/activity_rom_store.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_setup_wizard.xml b/app/src/main/res/layout/activity_setup_wizard.xml deleted file mode 100644 index 997d0a8..0000000 --- a/app/src/main/res/layout/activity_setup_wizard.xml +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml deleted file mode 100644 index 3a6d297..0000000 --- a/app/src/main/res/layout/home_fragment.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index de6a9c8..0f90c36 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

3.5.0

\n3dfx is back!", "cancellable": true, - "versionCodeBeta":"59", - "versionNameBeta":"3.5.5", - "versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5", + "versionCodeBeta":"60", + "versionNameBeta":"3.5.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,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6", "sizeBeta": "46 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

3.5.5

Bugs fixed.", + "MessageBeta": "

3.5.6

Bugs fixed.", "cancellableBeta": true } diff --git a/web/data/software-store.json b/web/data/software-store.json index 752a505..2d45238 100644 --- a/web/data/software-store.json +++ b/web/data/software-store.json @@ -126,21 +126,21 @@ "id": "" }, { - "rom_name": "VMware SVGA 3D", - "rom_icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Vmware_workstation_16_icon.svg/2051px-Vmware_workstation_16_icon.svg.png", - "rom_url": "https://archive.org/details/vmware-drivers-x-64-for-video-wddm", - "rom_path": "VMware_Drivers_x64_for_video_wddm.iso", + "rom_name": "Half-Life 2", + "rom_icon": "https://upload.wikimedia.org/wikipedia/en/thumb/2/25/Half-Life_2_cover.jpg/250px-Half-Life_2_cover.jpg", + "rom_url": "https://archive.org/details/half-life-2_202512", + "rom_path": "Half Life 2.iso", "rom_avail": true, - "rom_size": "8.15.1.50 x64", + "rom_size": "2004", "rom_arch": "X86_64", "rom_kernel": "", "rom_extra": "", "final_rom_file_name": "", - "desc": "VMware SVGA 3D is a virtual graphics adapter and driver for VMware virtual machines (VMs), enabling 2D/3D acceleration (DirectX 9.0c, OpenGL 2.1+) for better guest OS performance, higher resolutions, and smoother graphics, installed via VMware Tools. It replaces basic VGA, offers dynamic switching between software/hardware rendering, and provides features like increased VRAM (up to 8GB for modern guests).", - "file_size": "33 MB", + "desc": "Half-Life 2 is a 2004 first-person shooter game developed and published by Valve Corporation. It was published for Windows on Valve's digital distribution service, Steam. Like the original Half-Life (1998), Half-Life 2 is played from a first-person perspective, combining combat, puzzles, and storytelling. It adds features such as vehicles and physics-based gameplay. The player controls Gordon Freeman, who joins a resistance effort to liberate Earth from the alien Combine empire.", + "file_size": "2 GB", "creator": "tokaevUser", "verified": true, - "vecid": "vmwaredriversx64forvideowddmiso", + "vecid": "halflife2iso", "id": "" }, {