diff --git a/3dfx/3dfx-wrappers-3.4.7.iso b/3dfx/3dfx-wrappers-3.4.7.iso new file mode 100644 index 0000000..a39c445 Binary files /dev/null and b/3dfx/3dfx-wrappers-3.4.7.iso differ diff --git a/app/build.gradle b/app/build.gradle index 192aa94..4b33d18 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 75decdb..5f8108c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -69,7 +70,7 @@ android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:exported="false" /> @@ -137,12 +138,6 @@ - data; - public static MainActivity activity; -// private InterstitialAd mInterstitialAd; -// private AdRequest adRequest; - public DrawerLayout mainDrawer; - private final String TAG = "MainActivity"; - public static /**/ LinearLayout extVncLayout; - public static AppBarLayout appbar; - public TextView totalRam; - public TextView usedRam; - public TextView freeRam; - public static LinearLayout linearnothinghere; - private final Timer _timer = new Timer(); - private AlertDialog alertDialog; - public static boolean isActivate = false; - public boolean skipIDEwithARM64DialogInStartVM = false; - BottomAppBar bottomAppBar; - AlertDialog progressDialog; - - @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); - activity = this; - RamInfo.activity = this; - setContentView(R.layout.activity_main); - isActivate = true; - - NotificationManager notificationManager = (NotificationManager) activity.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancelAll(); - - new LibraryChecker(activity).checkMissingLibraries(activity); - - romsLayout = findViewById(R.id.romsLayout); - - SwipeRefreshLayout refreshRoms = findViewById(R.id.refreshRoms); - - appbar = findViewById(R.id.appbar); - appbar.setExpanded(false); - - extVncLayout = findViewById(R.id.extVnc); - - linearnothinghere = findViewById(R.id.linearnothinghere); - - TextView tvLogin = findViewById(R.id.tvLogin); - tvLogin.setText(activity.getString(R.string.port_caption) + ": " + (Config.defaultVNCPort + 5900)/* + "\nPASSWORD --> " + Config.defaultVNCPasswd*/); - - Button stopBtn = findViewById(R.id.stopBtn); - stopBtn.setOnClickListener(v -> { - // Stop the service - MainService.stopService(); - - Terminal vterm = new Terminal(activity); - vterm.executeShellCommand2("killall qemu-system-*", false, activity); - - extVncLayout.setVisibility(View.GONE); - appbar.setExpanded(false); - }); - - refreshRoms.setOnRefreshListener(() -> { - loadDataVbi(); - mMainAdapter.notifyItemRangeChanged(0, mMainAdapter.data.size()); - refreshRoms.setRefreshing(false); - }); - /*bottomAppBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - - // Menu items - int id = item.getItemId(); - if (id == R.id.installRoms) { - startActivity(new Intent(activity, RomStoreActivity.class)); - } else if (id == R.id.arch) { - startActivity(new Intent(activity, SetArchActivity.class)); - } - - return false; - } - });*/ - - Button gotoromstore = findViewById(R.id.gotoromstorebutton); - gotoromstore.setOnClickListener(v -> { - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), RomStoreActivity.class); - startActivity(intent); - }); - - FloatingActionButton fabAdd = findViewById(R.id.fabAdd_AppBarBottomActivity); - fabAdd.setOnClickListener(view -> startActivity(new Intent(activity, SetArchActivity.class))); - - Toolbar mainToolbar = findViewById(R.id.toolbar); - setSupportActionBar(mainToolbar); - mainDrawer = findViewById(R.id.drawer_layout); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mainDrawer, mainToolbar, - R.string.navigation_drawer_open, R.string.navigation_drawer_close); - mainDrawer.setDrawerListener(toggle); - toggle.syncState(); - - NavigationView navigationView = findViewById(R.id.nav_view); - - //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu - // This method will trigger on item Click of navigation menu - navigationView.setNavigationItemSelectedListener(menuItem -> { - //Closing drawer on item click - mainDrawer.closeDrawers(); - - //Check to see which item was being clicked and perform appropriate action - int id = menuItem.getItemId(); - if (id == R.id.navigation_item_info) { - startActivity(new Intent(activity, AboutActivity.class)); - } - if (id == R.id.navigation_item_help) { - String tw = AppConfig.vectrasHelp; - Intent w = new Intent(ACTION_VIEW); - w.setData(Uri.parse(tw)); - startActivity(w); - } else if (id == R.id.navigation_item_website) { - String tw = AppConfig.vectrasWebsite; - Intent w = new Intent(ACTION_VIEW); - w.setData(Uri.parse(tw)); - startActivity(w); -// } else if (id == R.id.navigation_item_import_iso) { -// if (new File(AppConfig.maindirpath + "/drive.iso").exists()) { -// AlertDialog ad; -// ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); -// ad.setTitle("REPLACE ISO"); -// ad.setMessage("there is iso imported you want to replace it?"); -// ad.setButton(Dialog.BUTTON_POSITIVE, "REPLACE", (dialog, which) -> { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1004); -// }); -// ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", (dialog, which) -> { -// File isoFile = new File(AppConfig.maindirpath + "/drive.iso"); -// try { -// if(!isoFile.delete()) Log.e(TAG, "Delete drive.iso failed!"); -// } catch (Exception e) { -// Log.e(TAG, "Delete drive.iso: ", e); -// } -// }); -// ad.show(); -// } else { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1004); -// } -// } else if (id == R.id.navigation_item_hdd1) { -// if (new File(AppConfig.maindirpath + "/hdd1.qcow2").exists()) { -// AlertDialog ad; -// ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); -// ad.setTitle("REPLACE HDD1"); -// ad.setMessage("there is hdd1 imported you want to replace it?"); -// ad.setButton(Dialog.BUTTON_POSITIVE, "REPLACE", (dialog, which) -> { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1006); -// }); -// ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", (dialog, which) -> { -// File isoFile = new File(AppConfig.maindirpath + "/hdd1.qcow2"); -// try { -// if(!isoFile.delete()) Log.e(TAG, "Delete hdd1.qcow2 failed!"); -// } catch (Exception e) { -// Log.e(TAG, "Delete hdd1.qcow2: ", e); -// } -// }); -// ad.setButton(Dialog.BUTTON_NEUTRAL, "SHARE", (dialog, which) -> { -// Intent intentShareFile = new Intent(Intent.ACTION_SEND); -// File fileWithinMyDir = new File(AppConfig.maindirpath + "/hdd1.qcow2"); -// -// if (fileWithinMyDir.exists()) { -// intentShareFile.setType("*/*"); -// intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + AppConfig.maindirpath + "/hdd1.qcow2")); -// -// intentShareFile.putExtra(Intent.EXTRA_SUBJECT, -// "Sharing File..."); -// intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File..."); -// -// startActivity(Intent.createChooser(intentShareFile, "Share File")); -// } -// }); -// ad.show(); -// } else { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1005); -// } -// } else if (id == R.id.navigation_item_hdd2) { -// if (new File(AppConfig.maindirpath + "/hdd2.qcow2").exists()) { -// AlertDialog ad; -// ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); -// ad.setTitle("REPLACE HDD2"); -// ad.setMessage("there is hdd2 imported you want to replace it?"); -// ad.setButton(Dialog.BUTTON_POSITIVE, "REPLACE", (dialog, which) -> { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1006); -// }); -// ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", (dialog, which) -> { -// File isoFile = new File(AppConfig.maindirpath + "/hdd2.qcow2"); -// try { -// if(!isoFile.delete()) Log.e(TAG, "Delete hdd2.qcow2 failed!"); -// } catch (Exception e) { -// Log.e(TAG, "Delete hdd2.qcow2: ", e); -// } -// }); -// ad.setButton(Dialog.BUTTON_NEUTRAL, "SHARE", (dialog, which) -> { -// Intent intentShareFile = new Intent(Intent.ACTION_SEND); -// File fileWithinMyDir = new File(AppConfig.maindirpath + "/hdd2.qcow2"); -// -// if (fileWithinMyDir.exists()) { -// intentShareFile.setType("*/*"); -// intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + AppConfig.maindirpath + "/hdd2.qcow2")); -// -// intentShareFile.putExtra(Intent.EXTRA_SUBJECT, -// "Sharing File..."); -// intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File..."); -// -// startActivity(Intent.createChooser(intentShareFile, "Share File")); -// } -// }); -// ad.show(); -// } else { -// Intent intent = new Intent(ACTION_OPEN_DOCUMENT); -// intent.addCategory(Intent.CATEGORY_OPENABLE); -// intent.setType("*/*"); -// -// // Optionally, specify a URI for the file that should appear in the -// // system file picker when it loads. -// if (SDK_INT >= Build.VERSION_CODES.O) { -// intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS); -// } -// -// startActivityForResult(intent, 1006); -// } - } else if (id == R.id.navigation_item_desktop) { - launchX11(true); - } else if (id == R.id.navigation_item_terminal) { - /*com.vectras.vterm.TerminalBottomSheetDialog VTERM = new com.vectras.vterm.TerminalBottomSheetDialog(activity); - VTERM.showVterm();*/ - startActivity(new Intent(activity, TermuxActivity.class)); - } else if (id == R.id.navigation_item_view_logs) { - BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(activity); - View view = activity.getLayoutInflater().inflate(R.layout.bottomsheetdialog_logger, null); - bottomSheetDialog.setContentView(view); - bottomSheetDialog.show(); - - final String CREDENTIAL_SHARED_PREF = "settings_prefs"; - Timer _timer = new Timer(); - TimerTask t; - - LinearLayoutManager layoutManager = new LinearLayoutManager(getApp()); - LogsAdapter mLogAdapter = new LogsAdapter(layoutManager, getApp()); - RecyclerView logList = view.findViewById(R.id.recyclerLog); - logList.setAdapter(mLogAdapter); - logList.setLayoutManager(layoutManager); - mLogAdapter.scrollToLastPosition(); - try { - Process process = Runtime.getRuntime().exec("logcat -e"); - BufferedReader bufferedReader = new BufferedReader( - new InputStreamReader(process.getInputStream())); - Process process2 = Runtime.getRuntime().exec("logcat -w"); - BufferedReader bufferedReader2 = new BufferedReader( - new InputStreamReader(process2.getInputStream())); - - t = new TimerTask() { - @Override - public void run() { - runOnUiThread(() -> { - try { - if (bufferedReader.readLine() != null || bufferedReader2.readLine() != null) { - String logLine = bufferedReader.readLine(); - String logLine2 = bufferedReader2.readLine(); - VectrasStatus.logError("[E] " + logLine + ""); - VectrasStatus.logError("[W] " + logLine2 + ""); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - }; - _timer.scheduleAtFixedRate(t, (int) (0), (int) (100)); - } catch (IOException e) { - Log.e(TAG, "Log: ", e); - } - } else if (id == R.id.navigation_item_settings) { - startActivity(new Intent(activity, MainSettingsManager.class)); -// } else if (id == R.id.navigation_item_store) { -// startActivity(new Intent(activity, StoreActivity.class)); - } else if (id == R.id.navigation_data_explorer) { - startActivity(new Intent(activity, DataExplorerActivity.class)); - } else if (id == R.id.navigation_item_donate) { - String tw = "https://www.patreon.com/VectrasTeam"; - Intent w = new Intent(ACTION_VIEW); - w.setData(Uri.parse(tw)); - startActivity(w); -// } else if (id == R.id.navigation_item_get_rom) { -// Intent intent = new Intent(); -// intent.setClass(getApplicationContext(), RomStoreActivity.class); -// startActivity(intent); - } else if (id == R.id.mini_tools) { - Intent intent = new Intent(); - intent.setClass(activity, Minitools.class); - startActivity(intent); - } - return false; - }); - - getWindow().setNavigationBarColor(SurfaceColors.SURFACE_2.getColor(this)); - -// adRequest = new AdRequest.Builder().build(); - - //AdView mAdView = findViewById(R.id.adView); - //adRequest = new AdRequest.Builder().build(); - //mAdView.loadAd(adRequest); - -// MobileAds.initialize(this, initializationStatus -> { -// }); - - DialogUtils.joinTelegram(activity); - - totalRam = findViewById(R.id.totalRam); - usedRam = findViewById(R.id.usedRam); - freeRam = findViewById(R.id.freeRam); - - ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); - ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); - activityManager.getMemoryInfo(mi); - - long freeMem = mi.availMem / 1048576L; - long totalMem = mi.totalMem / 1048576L; - long usedMem = totalMem - freeMem; - int freeRamInt = safeLongToInt(freeMem); - int totalRamInt = safeLongToInt(totalMem); - - totalRam = findViewById(R.id.totalRam); - usedRam = findViewById(R.id.usedRam); - freeRam = findViewById(R.id.freeRam); - - - TextView tvIsRunning = findViewById(R.id.tvIsRunning); - - - String vectrasMemory = String.valueOf(RamInfo.vectrasMemory(this)); - TimerTask t = - new TimerTask() { - @Override - public void run() { - runOnUiThread( - () -> { - if (ServiceUtils.isServiceRunning(MainActivity.this, MainService.class)) - tvIsRunning.setText(R.string.running); - else tvIsRunning.setText(R.string.stopped); - - ActivityManager.MemoryInfo miI = - new ActivityManager.MemoryInfo(); - ActivityManager activityManagerr = - (ActivityManager) - getSystemService(ACTIVITY_SERVICE); - activityManagerr.getMemoryInfo(miI); - long freeMemory = miI.availMem / 1048576L; - long totalMemory = miI.totalMem / 1048576L; - long usedMemory = totalMemory - freeMemory; - - totalRam.setText( - activity.getResources() - .getString(R.string.total_memory) - + " " - + totalMemory - + " MB"); - usedRam.setText( - activity.getResources() - .getString(R.string.used_memory) - + " " - + usedMemory - + " MB"); - freeRam.setText( - activity.getResources() - .getString(R.string.free_memory) - + " " - + freeMemory - + " MB (" - + vectrasMemory - + " " - + activity.getResources() - .getString(R.string.used) - + ")"); - LinearProgressIndicator progressBar = findViewById(R.id.progressBar); - progressBar.setMax((int) totalMemory); - if (SDK_INT >= Build.VERSION_CODES.N) { - progressBar.setProgress((int) usedMemory, true); - } else { - progressBar.setProgress((int) usedMemory); - } - }); - } - }; - _timer.scheduleAtFixedRate(t, (int) (0), (int) (1000)); - ShellExecutor shellExec = new ShellExecutor(); - shellExec.exec(TermuxService.PREFIX_PATH + "/bin/termux-x11 :0"); - - TextView qemuVersion = findViewById(R.id.qemuVersion); - - setupBottomAppBar(); - - if (MainSettingsManager.getPromptUpdateVersion(activity)) - updateApp(); - - String command = "qemu-system-x86_64 --version"; - new Terminal(activity).extractQemuVersion(command, false, activity, (output, errors) -> { - if (errors.isEmpty()) { - String versionStr = "Unknown"; - if (output.equals("8.2.1")) - versionStr = output + " - 3dfx"; - Log.d(TAG, "QEMU Version: " + versionStr); - qemuVersion.setText(versionStr); - } else { - Log.e(TAG, "Errors: " + errors); - } - }); - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - int spanCount = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2; - mRVMainRoms.setLayoutManager(new GridLayoutManager(this, spanCount)); - } - - @Override - public void onDestroy() { - isActivate = false; - super.onDestroy(); - } - - public static int safeLongToInt(long l) { - if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { - throw new IllegalArgumentException(l + " cannot be cast to int without changing its value."); - } - return (int) l; - } - - private void updateApp() { - int versionCode = PackageUtils.getThisVersionCode(getApplicationContext()); - String versionName = PackageUtils.getThisVersionName(getApplicationContext()); - - RequestNetwork requestNetwork = new RequestNetwork(this); - RequestNetwork.RequestListener requestNetworkListener = new RequestNetwork.RequestListener() { - @Override - public void onResponse(String tag, String response, HashMap responseHeaders) { - View _update = findViewById(R.id.update); - - if (!response.isEmpty()) { - try { - final JSONObject obj = new JSONObject(response); - String versionNameonUpdate; - int versionCodeonUpdate; - - if (MainSettingsManager.getcheckforupdatesfromthebetachannel(MainActivity.this)) { - versionNameonUpdate = obj.getString("versionNameBeta"); - versionCodeonUpdate = obj.getInt("versionCodeBeta"); - } else { - versionNameonUpdate = obj.getString("versionName"); - versionCodeonUpdate = obj.getInt("versionCode"); - } - - if (versionCode < versionCodeonUpdate || !versionNameonUpdate.equals(versionName)) { - _update.setVisibility(View.VISIBLE); - } else { - _update.setVisibility(View.GONE); - } - } catch (JSONException e) { - _update.setVisibility(View.GONE); - } - } else { - _update.setVisibility(View.GONE); - } - } - - @Override - public void onErrorResponse(String tag, String message) { - - } - }; - - requestNetwork.startRequestNetwork(RequestNetworkController.GET,AppConfig.updateJson,"maincheckupdate",requestNetworkListener); - } - - private void loadDataVbi() { - - if (FileUtils.isFileExists(AppConfig.romsdatajson)) { - if (!VMManager.isRomsDataJsonValid(true, MainActivity.this)) { - DialogUtils.twoDialog(this, - getString(R.string.problem_has_been_detected), - getString(R.string.vm_list_data_is_corrupted_content), - getString(R.string.continuetext), - getString(R.string.cancel), - true, - R.drawable.build_24px, - true, - () -> { - FileUtils.moveAFile(AppConfig.maindirpath + "roms-data.json", AppConfig.maindirpath + "roms-data.old.json"); - FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); - startFixRomsDataJson(); - }, - null, - null); - } - } else { - FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); - } - - data = new ArrayList<>(); - - try { - - jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, 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.imgCdrom = json_data.getString("imgCdrom"); - } catch (JSONException ignored) { - romsMainData.imgCdrom = ""; - } - try { - romsMainData.vmID = json_data.getString("vmID"); - } catch (JSONException ignored) { - romsMainData.vmID = ""; - } - try { - romsMainData.qmpPort = json_data.getInt("qmpPort"); - } catch (JSONException ignored) { - romsMainData.qmpPort = 0; - } - try { - romsMainData.itemDrv1 = json_data.getString("imgDrv1"); - } catch (JSONException ignored) { - romsMainData.itemDrv1 = ""; - } - romsMainData.itemExtra = json_data.getString("imgExtra"); - //try { - //if (json_data.getString("imgArch").equals(MainSettingsManager.getArch(MainActivity.activity))) - data.add(romsMainData); - //} catch (JSONException ignored) { - //data.add(romsMainData); - //} - } - - // Setup and Handover data to recyclerview - mRVMainRoms = findViewById(R.id.mRVMainRoms); - mMainAdapter = new AdapterMainRoms(this, data); - mRVMainRoms.setAdapter(mMainAdapter); - int spanCount = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2; - mRVMainRoms.setLayoutManager(new GridLayoutManager(this, spanCount)); - } catch (JSONException e) { - e.printStackTrace(); - } - mdatasize(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.home_toolbar_menu, menu); - return true; - - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - // Menu items - int id = item.getItemId(); - if (id == 0) { - appbar = findViewById(R.id.appbar); - if (appbar.getTop() < 0) - appbar.setExpanded(true); - else - appbar.setExpanded(false); - - } else if (id == R.id.shutdown) { - alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); - alertDialog.setTitle(getResources().getString(R.string.do_you_want_to_kill_all_qemu_processes)); - alertDialog.setMessage(getResources().getString(R.string.all_running_vms_will_be_forcibly_shut_down)); - alertDialog.setCancelable(true); - alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.kill_all), (dialog, which) -> { - VMManager.killallqemuprocesses(getApplicationContext()); - }); - alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), (dialog, which) -> { - - }); - alertDialog.show(); - } else if (id == R.id.backtothedisplay) { - if (VMManager.isQemuRunning(activity)) { - if (MainSettingsManager.getVmUi(activity).equals("VNC")) - activity.startActivity(new Intent(activity, MainVNCActivity.class)); - else if (MainSettingsManager.getVmUi(activity).equals("X11")) - launchX11(false); - } else { - Toast.makeText(getApplicationContext(), activity.getResources().getString(R.string.there_is_nothing_here_because_there_is_no_vm_running), Toast.LENGTH_LONG).show(); - } - } - - return super.onOptionsItemSelected(item); - } - - public static void startVM(String vmName, String env, String itemExtra, String itemPath) { - -// timerTask = new TimerTask() { -// @Override -// public void run() { -// ActivityManager manager = (ActivityManager) activity.getSystemService(ACTIVITY_SERVICE); -// for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { -// if (!AudioStreamService.class.getName().equals(service.service.getClassName())) { -// if (SDK_INT >= Build.VERSION_CODES.O) { -// activity.startForegroundService(new Intent(activity, AudioStreamService.class)); -// } else { -// activity.startService(new Intent(activity, AudioStreamService.class)); -// } -// } -// } -// } -// }; -// timer.schedule(timerTask, 5000); - - File romDir = new File(Config.getCacheDir() + "/" + Config.vmID); - if(!romDir.mkdirs()) { - DialogUtils.oneDialog(activity, activity.getString(R.string.problem_has_been_detected), activity.getString(R.string.vm_cache_dir_failed_to_create_content) + " " + activity.getResources().getString(R.string.reason) + ": " + VMManager.latestUnsafeCommandReason, activity.getString(R.string.ok), true, R.drawable.warning_48px, true, null, null); - return; - } - - if (!VMManager.isthiscommandsafe(env, activity.getApplicationContext())) { - DialogUtils.oneDialog(activity, activity.getString(R.string.problem_has_been_detected), activity.getString(R.string.harmful_command_was_detected) + " " + activity.getResources().getString(R.string.reason) + ": " + VMManager.latestUnsafeCommandReason, activity.getString(R.string.ok), true, R.drawable.verified_user_24px, true, null, null); - return; - } - - VMManager.lastQemuCommand = env; - -// if (VMManager.isThisVMRunning(activity, itemExtra, itemPath)) { -// Toast.makeText(activity, "This VM is already running.", Toast.LENGTH_LONG).show(); -// if (MainSettingsManager.getVmUi(activity).equals("VNC")) -// activity.startActivity(new Intent(activity, MainVNCActivity.class)); -// else if (MainSettingsManager.getVmUi(activity).equals("X11")) -// activity.launchX11(false); -// return; -// } - - if (AppConfig.getSetupFiles().contains("arm") && !AppConfig.getSetupFiles().contains("arm64")) { - if (env.contains("tcg,thread=multi")) { - DialogUtils.twoDialog(activity, activity.getResources().getString(R.string.problem_has_been_detected), activity.getResources().getString(R.string.can_not_use_mttcg), activity.getString(R.string.ok), activity.getString(R.string.cancel), true, R.drawable.warning_48px, true, - () -> startVM(vmName, env.replace("tcg,thread=multi", "tcg,thread=single"), itemExtra, itemPath), null, null); - return; - } - } - - if (MainSettingsManager.getArch(activity).equals("ARM64") && MainSettingsManager.getIfType(activity).equals("ide") && !activity.skipIDEwithARM64DialogInStartVM) { - DialogUtils.twoDialog(activity, activity.getString(R.string.problem_has_been_detected), activity.getString(R.string.you_cannot_use_IDE_hard_drive_type_with_ARM64), activity.getString(R.string.continuetext), activity.getString(R.string.cancel), true, R.drawable.warning_48px, true, - () -> { - activity.skipIDEwithARM64DialogInStartVM = true; - startVM(vmName, env, itemExtra, itemPath); - }, null, null); - return; - } else if (activity.skipIDEwithARM64DialogInStartVM) { - activity.skipIDEwithARM64DialogInStartVM = false; - } - - if (MainSettingsManager.getSharedFolder(activity) && MainSettingsManager.getArch(activity).equals("I386")) { - Toast.makeText(activity, R.string.shared_folder_is_not_used_because_i386_does_not_support_it, Toast.LENGTH_LONG).show(); - } - - if (MainSettingsManager.getVncExternal(activity) && - NetworkUtils.isPortOpen("localhost", Config.defaultVNCPort + 5900, 500)) { - DialogUtils.twoDialog(activity, activity.getString(R.string.problem_has_been_detected), - activity.getString(R.string.the_vnc_server_port_you_set_is_currently_in_use_by_other), - activity.getString(R.string.go_to_settings), - activity.getString(R.string.close), - true, R.drawable.warning_48px, true, - () -> activity.startActivity(new Intent(activity, ExternalVNCSettingsActivity.class)), - null, - null); - return; - } - - activity.showProgressDialog(activity.getString(R.string.booting_up)); - Handler handler = new Handler(); - handler.postDelayed( - () -> { - if (ServiceUtils.isServiceRunning(activity, MainService.class)) { - MainService.startCommand(env, activity); - } else { - Intent serviceIntent = new Intent(activity, MainService.class); - MainService.env = env; - MainService.CHANNEL_ID = vmName; - if (SDK_INT >= Build.VERSION_CODES.O) { - activity.startForegroundService(serviceIntent); - } else { - activity.startService(serviceIntent); - } - } - - - if (MainSettingsManager.getVmUi(activity).equals("VNC")) { - if (MainSettingsManager.getVncExternal(MainActivity.activity)) { - extVncLayout.setVisibility(View.VISIBLE); - appbar.setExpanded(true); - activity.progressDialog.dismiss(); - } else { - Handler handler1 = new Handler(); - handler1.postDelayed( - new Runnable() { - public void run() { - MainVNCActivity.started = true; - activity.startActivity( - new Intent( - activity, MainVNCActivity.class)); - activity.progressDialog.dismiss(); - } - }, - 2000); - } - } else if (MainSettingsManager.getVmUi(activity).equals("SPICE")) { - // activity.startActivity(new Intent(activity, - // RemoteCanvasActivity.class)); - } else if (MainSettingsManager.getVmUi(activity).equals("X11")) { - Handler handler1 = new Handler(); - handler1.postDelayed( - new Runnable() { - public void run() { - activity.progressDialog.dismiss(); - activity.launchX11(false); - } - }, - 3000); - } - }, - 2000); - String[] params = env.split("\\s+"); - VectrasStatus.logInfo("Params:"); - Log.d("HomeStartVM", "Params:"); - for (int i = 0; i < params.length; i++) { - VectrasStatus.logInfo(i + ": " + params[i]); - Log.d("HomeStartVM", i + ": " + params[i]); - } - - } - - public void onResume() { - super.onResume(); - checkpermissions(); - Log.d(TAG, "onResume"); - Config.ui = MainSettingsManager.getVmUi(activity); - Config.defaultVNCPort = Integer.parseInt(MainSettingsManager.getVncExternalDisplay(activity)); - - //TEMPORARY FIX FOR VNC CLOSES - //TODO: FIND FIX FOR CRASHING - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); - StrictMode.setThreadPolicy(policy); - if (MainSettingsManager.getVmUi(activity).equals("VNC") && FileUtils.isFileExists(Config.getLocalQMPSocketPath()) && MainVNCActivity.started) - startActivity(new Intent(activity, MainVNCActivity.class)); - } - - public void onStart() { - super.onStart(); - Log.d(TAG, "onStart"); - if (!MainSettingsManager.getVncExternal(activity)) - NotificationUtils.clearAll(this); - loadDataVbi(); - Config.ui = MainSettingsManager.getVmUi(activity); - - TextView tvQemuArch = findViewById(R.id.qemuArch); - tvQemuArch.setText(MainSettingsManager.getArch(activity)); - - //TEMPORARY FIX FOR VNC CLOSES - //TODO: FIND FIX FOR CRASHING - //if (MainSettingsManager.getVmUi(activity).equals("VNC") && MainVNCActivity.started) - //startActivity(new Intent(activity, MainVNCActivity.class)); - -// InterstitialAd.load(this, "ca-app-pub-3568137780412047/7745973511", adRequest, -// new InterstitialAdLoadCallback() { -// @Override -// public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { -// // The mInterstitialAd reference will be null until -// // an ad is loaded. -// mInterstitialAd = interstitialAd; -// Log.i("MainActivity", "onAdLoaded"); -// } -// -// @Override -// public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { -// // Handle the error -// Log.d("MainActivity", loadAdError.toString()); -// mInterstitialAd = null; -// } -// }); -// if (mInterstitialAd != null) { -// mInterstitialAd.show(this); -// } else { -// Log.d("TAG", "The interstitial ad wasn't ready yet."); -// } - - if (!AppConfig.pendingCommand.isEmpty()) { - if (!VMManager.isthiscommandsafe(AppConfig.pendingCommand, getApplicationContext())) { - AppConfig.pendingCommand = ""; - DialogUtils.oneDialog(activity, getString(R.string.problem_has_been_detected), getString(R.string.harmful_command_was_detected) + " " + activity.getResources().getString(R.string.reason) + ": " + VMManager.latestUnsafeCommandReason, getString(R.string.ok), true, R.drawable.verified_user_24px, true, null, null); - } else { - if (AppConfig.pendingCommand.startsWith("qemu-img")) { - if (!VMManager.isthiscommandsafeimg(AppConfig.pendingCommand, getApplicationContext())) { - DialogUtils.oneDialog(activity, getString(R.string.problem_has_been_detected), getString(R.string.size_too_large_try_qcow2_format), getString(R.string.ok), true, R.drawable.warning_48px, true, null, null); - } else { - Terminal _vterm = new Terminal(MainActivity.this); - _vterm.executeShellCommand2(AppConfig.pendingCommand, false, MainActivity.activity); - Toast.makeText(getApplicationContext(), getResources().getString(R.string.done), Toast.LENGTH_LONG).show(); - } - } else { - StartVM.cdrompath = ""; - String env = StartVM.env(MainActivity.activity, AppConfig.pendingCommand, "", true); - MainActivity.startVM("Quick run", env, AppConfig.pendingCommand, ""); - VMManager.lastQemuCommand = AppConfig.pendingCommand; - } - } - AppConfig.pendingCommand = ""; - } - } - - @Override - public void onBackPressed() { - DrawerLayout drawer = findViewById(R.id.drawer_layout); - if (drawer.isDrawerOpen(GravityCompat.START)) { - drawer.closeDrawer(GravityCompat.START); - } else { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent ReturnedIntent) { - super.onActivityResult(requestCode, resultCode, ReturnedIntent); - if (requestCode == 1004 && resultCode == RESULT_OK) { - Uri content_describer = ReturnedIntent.getData(); - File selectedFilePath = new File(getPath(content_describer)); - ProgressBar loading = findViewById(R.id.loading); - if (selectedFilePath.toString().endsWith(".iso")) { - loading.setVisibility(View.VISIBLE); - new Thread(() -> { - FileInputStream File; - try { - assert content_describer != null; - File = (FileInputStream) getContentResolver().openInputStream(content_describer); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - try { - try { - try (OutputStream out = new FileOutputStream(AppConfig.maindirpath + "/drive.iso")) { - // Transfer bytes from in to out - byte[] buf = new byte[1024]; - int len; - while (true) { - assert File != null; - if (!((len = File.read(buf)) > 0)) break; - out.write(buf, 0, len); - } - } - } finally { - Runnable runnable = () -> loading.setVisibility(View.GONE); - activity.runOnUiThread(runnable); - assert File != null; - File.close(); - } - } catch (IOException e) { - Runnable runnable = () -> { - loading.setVisibility(View.GONE); - UIAlert(activity, e.toString(), "error"); - }; - activity.runOnUiThread(runnable); - } - }).start(); - } else - UIAlert(activity, "please select iso file", "INVALID FILE"); - } else if (requestCode == 1005 && resultCode == RESULT_OK) { - Uri content_describer = ReturnedIntent.getData(); - ProgressBar loading = findViewById(R.id.loading); - loading.setVisibility(View.VISIBLE); - new Thread(() -> { - FileInputStream File; - try { - assert content_describer != null; - File = (FileInputStream) getContentResolver().openInputStream(content_describer); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - try { - try { - try (OutputStream out = new FileOutputStream(AppConfig.maindirpath + "/hdd1.qcow2")) { - // Transfer bytes from in to out - byte[] buf = new byte[1024]; - int len; - while (true) { - assert File != null; - if (!((len = File.read(buf)) > 0)) break; - out.write(buf, 0, len); - } - } - } finally { - Runnable runnable = () -> loading.setVisibility(View.GONE); - activity.runOnUiThread(runnable); - assert File != null; - File.close(); - } - } catch (IOException e) { - Runnable runnable = () -> { - loading.setVisibility(View.GONE); - UIAlert(activity, e.toString(), "error"); - }; - activity.runOnUiThread(runnable); - } - }).start(); - } else if (requestCode == 1006 && resultCode == RESULT_OK) { - Uri content_describer = ReturnedIntent.getData(); - ProgressBar loading = findViewById(R.id.loading); - loading.setVisibility(View.VISIBLE); - new Thread(() -> { - FileInputStream File = null; - try { - assert content_describer != null; - File = (FileInputStream) getContentResolver().openInputStream(content_describer); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - try { - try { - try (OutputStream out = new FileOutputStream(AppConfig.maindirpath + "/hdd2.qcow2")) { - // Transfer bytes from in to out - byte[] buf = new byte[1024]; - int len; - while (true) { - assert File != null; - if (!((len = File.read(buf)) > 0)) break; - out.write(buf, 0, len); - } - } - } finally { - Runnable runnable = () -> loading.setVisibility(View.GONE); - activity.runOnUiThread(runnable); - assert File != null; - File.close(); - } - } catch (IOException e) { - Runnable runnable = () -> { - loading.setVisibility(View.GONE); - UIAlert(activity, e.toString(), "error"); - }; - activity.runOnUiThread(runnable); - } - }).start(); - } else if (requestCode == 122 && resultCode == RESULT_OK) { - Uri content_describer = ReturnedIntent.getData(); - File selectedFilePath = new File(getPath(content_describer)); - ProgressBar loading = findViewById(R.id.loading); - loading.setVisibility(View.VISIBLE); - new Thread(() -> { - FileInputStream File; - try { - assert content_describer != null; - File = (FileInputStream) getContentResolver().openInputStream(content_describer); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - try { - try { - File romDir = new File(AppConfig.maindirpath + curRomName + "/"); - if (!romDir.exists()) { - if(!romDir.mkdirs()) return; - } - try (OutputStream out = new FileOutputStream(AppConfig.maindirpath + curRomName + "/" + "drv1-" + selectedFilePath.getName())) { - // Transfer bytes from in to out - byte[] buf = new byte[1024]; - int len; - while (true) { - assert File != null; - if (!((len = File.read(buf)) > 0)) break; - out.write(buf, 0, len); - } - } - } finally { - Runnable runnable = () -> loading.setVisibility(View.GONE); - activity.runOnUiThread(runnable); - assert File != null; - File.close(); - } - } catch (IOException e) { - Runnable runnable = () -> { - loading.setVisibility(View.GONE); - UIAlert(activity, e.toString(), "error"); - }; - activity.runOnUiThread(runnable); - } - }).start(); - } - } - - public String getPath(Uri uri) { - return FileUtils.getPath(this, uri); - } - - private void mdatasize() { - if (MainActivity.data.isEmpty()) { - linearnothinghere.setVisibility(View.VISIBLE); - } else { - linearnothinghere.setVisibility(View.GONE); - } - } - - public static void mdatasize2() { - if (MainActivity.data.isEmpty()) { - linearnothinghere.setVisibility(View.VISIBLE); - } else { - linearnothinghere.setVisibility(View.GONE); - } - } - - private void checkpermissions() { - if (PermissionUtils.storagepermission(activity, true)) { - loadDataVbi(); -// if (DeviceUtils.isStorageLow(this)) { -// DialogUtils.oneDialog(this, -// getResources().getString(R.string.oops), -// getResources().getString(R.string.very_low_available_storage_space_content), -// getResources().getString(R.string.ok), -// true, -// R.drawable.warning_48px, -// true, -// null, -// () -> { -// if (DeviceUtils.isStorageLow(this)) finish(); -// }); -// } - } - } - - private void setupBottomAppBar() { - bottomAppBar = findViewById(R.id.bottomAppBar); - bottomAppBar.setOnMenuItemClickListener(item -> { - if (item.getItemId() == R.id.update) { - //updateApp(true); - startActivity(new Intent(this, UpdaterActivity.class)); - } else if (item.getItemId() == R.id.shutdown) { - VMManager.requestKillAllQemuProcess(activity, null); - } else if (item.getItemId() == R.id.backtothedisplay) { - if (MainSettingsManager.getVmUi(activity).equals("VNC")) { - startActivity(new Intent(activity, MainVNCActivity.class)); - } else if (MainSettingsManager.getVmUi(activity).equals("X11")) { - launchX11(false); - } - } else if (item.getItemId() == R.id.importrom) { - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), VMCreatorActivity.class); - intent.putExtra("importcvbinow", ""); - startActivity(intent); - } - return false; - }); - View _update = findViewById(R.id.update); - _update.setVisibility(View.GONE); - } - - private void launchX11(boolean isKillXFCE) { - if (SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - DialogUtils.oneDialog(activity, getString(R.string.x11_feature_not_supported), getString(R.string.the_x11_feature_is_currently_not_supported_on_android_14_and_above_please_use_a_device_with_android_13_or_below_for_x11_functionality), getString(R.string.ok), true, R.drawable.error_96px, true, null, null); - } else { - // XFCE4 meta-package - String xfce4Package = "xfce4"; - - // Check if XFCE4 is installed - isPackageInstalled2(activity, xfce4Package, (output, errors) -> { - boolean isInstalled = false; - - // Check if the package exists in the installed packages output - if (output != null) { - Set installedPackages = new HashSet<>(); - for (String installedPackage : output.split("\n")) { - installedPackages.add(installedPackage.trim()); - } - - isInstalled = installedPackages.contains(xfce4Package.trim()); - } - - // If not installed, show a dialog to install it - if (!isInstalled) { - DialogUtils.twoDialog(activity, "Install XFCE4", "XFCE4 is not installed. Would you like to install it?", getString(R.string.install), getString(R.string.cancel), true, R.drawable.desktop_24px, true, - () -> { - String installCommand = "apk add " + xfce4Package; - new Terminal(activity).executeShellCommand(installCommand, true, true, activity); - }, null, null); - } else { - if (isKillXFCE) - new Terminal(activity).executeShellCommand2("killall xfce4-session", false, activity); - startActivity(new Intent(activity, X11Activity.class)); - new Terminal(activity).executeShellCommand2("xfce4-session", false, MainActivity.activity); - } - }); - - } - } - - private void showProgressDialog(String _content) { - View progressView = LayoutInflater.from(activity).inflate(R.layout.dialog_progress_style, null); - TextView progress_text = progressView.findViewById(R.id.progress_text); - progress_text.setText(_content); - progressDialog = new MaterialAlertDialogBuilder(activity, R.style.CenteredDialogTheme) - .setView(progressView) - .setCancelable(false) - .create(); - - progressDialog.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 index 274a991..0661ebc 100644 --- a/app/src/main/java/com/vectras/vm/MainRoms/AdapterMainRoms.java +++ b/app/src/main/java/com/vectras/vm/MainRoms/AdapterMainRoms.java @@ -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 { diff --git a/app/src/main/java/com/vectras/vm/Minitools.java b/app/src/main/java/com/vectras/vm/Minitools.java index 9d480c2..5e2e5d0 100644 --- a/app/src/main/java/com/vectras/vm/Minitools.java +++ b/app/src/main/java/com/vectras/vm/Minitools.java @@ -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"); diff --git a/app/src/main/java/com/vectras/vm/RomInfo.java b/app/src/main/java/com/vectras/vm/RomInfo.java index d94df7e..663222b 100644 --- a/app/src/main/java/com/vectras/vm/RomInfo.java +++ b/app/src/main/java/com/vectras/vm/RomInfo.java @@ -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, diff --git a/app/src/main/java/com/vectras/vm/RomStoreActivity.java b/app/src/main/java/com/vectras/vm/RomStoreActivity.java index ed909ee..aaea0a7 100644 --- a/app/src/main/java/com/vectras/vm/RomStoreActivity.java +++ b/app/src/main/java/com/vectras/vm/RomStoreActivity.java @@ -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; diff --git a/app/src/main/java/com/vectras/vm/SetArchActivity.java b/app/src/main/java/com/vectras/vm/SetArchActivity.java index 8047fdf..0a29a28 100644 --- a/app/src/main/java/com/vectras/vm/SetArchActivity.java +++ b/app/src/main/java/com/vectras/vm/SetArchActivity.java @@ -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; } diff --git a/app/src/main/java/com/vectras/vm/SplashActivity.java b/app/src/main/java/com/vectras/vm/SplashActivity.java index 95128e5..9079053 100644 --- a/app/src/main/java/com/vectras/vm/SplashActivity.java +++ b/app/src/main/java/com/vectras/vm/SplashActivity.java @@ -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+ diff --git a/app/src/main/java/com/vectras/vm/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/VMCreatorActivity.java index a8ba11f..815de94 100644 --- a/app/src/main/java/com/vectras/vm/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/VMCreatorActivity.java @@ -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(); diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index effa144..0863870 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -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(); } diff --git a/app/src/main/java/com/vectras/vm/WidgetProvider.java b/app/src/main/java/com/vectras/vm/WidgetProvider.java index 9f9d332..23478e7 100644 --- a/app/src/main/java/com/vectras/vm/WidgetProvider.java +++ b/app/src/main/java/com/vectras/vm/WidgetProvider.java @@ -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, diff --git a/app/src/main/java/com/vectras/vm/home/HomeActivity.java b/app/src/main/java/com/vectras/vm/main/MainActivity.java similarity index 85% rename from app/src/main/java/com/vectras/vm/home/HomeActivity.java rename to app/src/main/java/com/vectras/vm/main/MainActivity.java index dc0c599..5a10a86 100644 --- a/app/src/main/java/com/vectras/vm/home/HomeActivity.java +++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java @@ -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 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 + "

Update size:
" + 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 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()); diff --git a/app/src/main/java/com/vectras/vm/home/core/CallbackInterface.java b/app/src/main/java/com/vectras/vm/main/core/CallbackInterface.java similarity index 84% rename from app/src/main/java/com/vectras/vm/home/core/CallbackInterface.java rename to app/src/main/java/com/vectras/vm/main/core/CallbackInterface.java index 482658c..b3f0cb9 100644 --- a/app/src/main/java/com/vectras/vm/home/core/CallbackInterface.java +++ b/app/src/main/java/com/vectras/vm/main/core/CallbackInterface.java @@ -1,4 +1,4 @@ -package com.vectras.vm.home.core; +package com.vectras.vm.main.core; public class CallbackInterface { //Fix Cyclic. diff --git a/app/src/main/java/com/vectras/vm/home/core/DisplaySystem.java b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java similarity index 99% rename from app/src/main/java/com/vectras/vm/home/core/DisplaySystem.java rename to app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java index 80ee87d..ed302c2 100644 --- a/app/src/main/java/com/vectras/vm/home/core/DisplaySystem.java +++ b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java @@ -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; diff --git a/app/src/main/java/com/vectras/vm/home/core/HomeStartVM.java b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java similarity index 96% rename from app/src/main/java/com/vectras/vm/home/core/HomeStartVM.java rename to app/src/main/java/com/vectras/vm/main/core/MainStartVM.java index 286d4e4..277335a 100644 --- a/app/src/main/java/com/vectras/vm/home/core/HomeStartVM.java +++ b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java @@ -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) { diff --git a/app/src/main/java/com/vectras/vm/home/core/PendingCommand.java b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java similarity index 96% rename from app/src/main/java/com/vectras/vm/home/core/PendingCommand.java rename to app/src/main/java/com/vectras/vm/main/core/PendingCommand.java index a72816c..e3c5c03 100644 --- a/app/src/main/java/com/vectras/vm/home/core/PendingCommand.java +++ b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java @@ -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; } } diff --git a/app/src/main/java/com/vectras/vm/home/core/RomOptionsDialog.java b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java similarity index 98% rename from app/src/main/java/com/vectras/vm/home/core/RomOptionsDialog.java rename to app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java index ec27b37..6de450b 100644 --- a/app/src/main/java/com/vectras/vm/home/core/RomOptionsDialog.java +++ b/app/src/main/java/com/vectras/vm/main/core/RomOptionsDialog.java @@ -1,4 +1,4 @@ -package com.vectras.vm.home.core; +package com.vectras.vm.main.core; import android.app.Activity; import android.content.Intent; diff --git a/app/src/main/java/com/vectras/vm/home/core/SharedData.java b/app/src/main/java/com/vectras/vm/main/core/SharedData.java similarity index 63% rename from app/src/main/java/com/vectras/vm/home/core/SharedData.java rename to app/src/main/java/com/vectras/vm/main/core/SharedData.java index 81530df..88c2b14 100644 --- a/app/src/main/java/com/vectras/vm/home/core/SharedData.java +++ b/app/src/main/java/com/vectras/vm/main/core/SharedData.java @@ -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 dataRomStore = new ArrayList<>(); + public static List dataSoftwareStore = new ArrayList<>(); } diff --git a/app/src/main/java/com/vectras/vm/home/monitor/SystemMonitorFragment.java b/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java similarity index 99% rename from app/src/main/java/com/vectras/vm/home/monitor/SystemMonitorFragment.java rename to app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java index 426a2ec..2b08ef5 100644 --- a/app/src/main/java/com/vectras/vm/home/monitor/SystemMonitorFragment.java +++ b/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java @@ -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; diff --git a/app/src/main/java/com/vectras/vm/home/romstore/HomeRomStoreViewModel.java b/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java similarity index 93% rename from app/src/main/java/com/vectras/vm/home/romstore/HomeRomStoreViewModel.java rename to app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java index b912d5f..0085a22 100644 --- a/app/src/main/java/com/vectras/vm/home/romstore/HomeRomStoreViewModel.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/HomeRomStoreViewModel.java @@ -1,4 +1,4 @@ -package com.vectras.vm.home.romstore; +package com.vectras.vm.main.romstore; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; diff --git a/app/src/main/java/com/vectras/vm/home/romstore/RomStoreFragment.java b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java similarity index 94% rename from app/src/main/java/com/vectras/vm/home/romstore/RomStoreFragment.java rename to app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java index 5bf0d74..861a007 100644 --- a/app/src/main/java/com/vectras/vm/home/romstore/RomStoreFragment.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreFragment.java @@ -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); } } \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/home/romstore/RomStoreHomeAdapterSearch.java b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java similarity index 98% rename from app/src/main/java/com/vectras/vm/home/romstore/RomStoreHomeAdapterSearch.java rename to app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java index 69776eb..e6b5946 100644 --- a/app/src/main/java/com/vectras/vm/home/romstore/RomStoreHomeAdapterSearch.java +++ b/app/src/main/java/com/vectras/vm/main/romstore/RomStoreHomeAdapterSearch.java @@ -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 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 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 dataSoftware = new ArrayList<>(); + + try { + Gson gson = new Gson(); + Type listType = new TypeToken>() {}.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); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..3bb6068 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapter.java @@ -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 { + Context context; + private final LayoutInflater inflater; + static List dataRom = Collections.emptyList(); + + public SoftwareStoreHomeAdapter(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.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); + } + + } +} 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 new file mode 100644 index 0000000..caa47f9 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreHomeAdapterSearch.java @@ -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 { + + Context context; + private final LayoutInflater inflater; + static List dataRom = Collections.emptyList(); + private final String TAG = "RomStoreHomeAdapterSearch"; + + public SoftwareStoreHomeAdapterSearch(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.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); + } + + } + +} 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 new file mode 100644 index 0000000..14cea0f --- /dev/null +++ b/app/src/main/java/com/vectras/vm/main/softwarestore/SoftwareStoreViewModel.java @@ -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> softwareList = new MutableLiveData<>(new ArrayList<>()); + + public LiveData> getSoftwareList() { + return softwareList; + } + + public void setSoftwareList(List data) { + softwareList.setValue(data); + } +} diff --git a/app/src/main/java/com/vectras/vm/home/vms/VmsDiffUtil.java b/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java similarity index 97% rename from app/src/main/java/com/vectras/vm/home/vms/VmsDiffUtil.java rename to app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java index 069ed60..097397c 100644 --- a/app/src/main/java/com/vectras/vm/home/vms/VmsDiffUtil.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsDiffUtil.java @@ -1,4 +1,4 @@ -package com.vectras.vm.home.vms; +package com.vectras.vm.main.vms; import androidx.recyclerview.widget.DiffUtil; diff --git a/app/src/main/java/com/vectras/vm/home/vms/VmsFragment.java b/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java similarity index 97% rename from app/src/main/java/com/vectras/vm/home/vms/VmsFragment.java rename to app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java index 883c11c..f9a908a 100644 --- a/app/src/main/java/com/vectras/vm/home/vms/VmsFragment.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsFragment.java @@ -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); diff --git a/app/src/main/java/com/vectras/vm/home/vms/VmsHomeAdapter.java b/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java similarity index 95% rename from app/src/main/java/com/vectras/vm/home/vms/VmsHomeAdapter.java rename to app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java index fb72fa1..3fcb010 100644 --- a/app/src/main/java/com/vectras/vm/home/vms/VmsHomeAdapter.java +++ b/app/src/main/java/com/vectras/vm/main/vms/VmsHomeAdapter.java @@ -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 { diff --git a/app/src/main/java/com/vectras/vm/settings/ThemeActivity.java b/app/src/main/java/com/vectras/vm/settings/ThemeActivity.java index 80a8145..521b28a 100644 --- a/app/src/main/java/com/vectras/vm/settings/ThemeActivity.java +++ b/app/src/main/java/com/vectras/vm/settings/ThemeActivity.java @@ -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() { diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java index a18c5b0..d97df03 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java @@ -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(); } }); diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java index 681bb80..fca303b 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizardActivity.java @@ -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(); } }); diff --git a/app/src/main/java/com/vectras/vm/x11/X11Activity.java b/app/src/main/java/com/vectras/vm/x11/X11Activity.java index 2a1195b..7026c67 100644 --- a/app/src/main/java/com/vectras/vm/x11/X11Activity.java +++ b/app/src/main/java/com/vectras/vm/x11/X11Activity.java @@ -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) { diff --git a/app/src/main/res/drawable/ic_package_selector.xml b/app/src/main/res/drawable/ic_package_selector.xml new file mode 100644 index 0000000..da79615 --- /dev/null +++ b/app/src/main/res/drawable/ic_package_selector.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/package_24px.xml b/app/src/main/res/drawable/package_24px.xml new file mode 100644 index 0000000..b5ce16a --- /dev/null +++ b/app/src/main/res/drawable/package_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/package_filled_24px.xml b/app/src/main/res/drawable/package_filled_24px.xml new file mode 100644 index 0000000..a9e7406 --- /dev/null +++ b/app/src/main/res/drawable/package_filled_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml deleted file mode 100644 index 947f86f..0000000 --- a/app/src/main/res/layout/activity_home.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2727a09..4545b7f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,24 +1,63 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home_content.xml b/app/src/main/res/layout/activity_main_content.xml similarity index 100% rename from app/src/main/res/layout/activity_home_content.xml rename to app/src/main/res/layout/activity_main_content.xml diff --git a/app/src/main/res/layout/content_settings_dialog.xml b/app/src/main/res/layout/content_settings_dialog.xml deleted file mode 100644 index 2d268cf..0000000 --- a/app/src/main/res/layout/content_settings_dialog.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_rom_store.xml b/app/src/main/res/layout/fragment_home_rom_store.xml index 05d5939..3aed4f5 100644 --- a/app/src/main/res/layout/fragment_home_rom_store.xml +++ b/app/src/main/res/layout/fragment_home_rom_store.xml @@ -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"> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_system_monitor.xml b/app/src/main/res/layout/fragment_home_system_monitor.xml index 5e97b25..5d34c7b 100644 --- a/app/src/main/res/layout/fragment_home_system_monitor.xml +++ b/app/src/main/res/layout/fragment_home_system_monitor.xml @@ -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"> + tools:context=".main.vms.VmsFragment"> - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/main_content.xml b/app/src/main/res/layout/main_content.xml deleted file mode 100644 index b6c37d4..0000000 --- a/app/src/main/res/layout/main_content.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_navigation_home_menu.xml b/app/src/main/res/menu/bottom_navigation_home_menu.xml index 898ea99..f4343ed 100644 --- a/app/src/main/res/menu/bottom_navigation_home_menu.xml +++ b/app/src/main/res/menu/bottom_navigation_home_menu.xml @@ -9,6 +9,11 @@ android:enabled="true" android:icon="@drawable/ic_home_storage_selector" android:title="@string/roms_store"/> + Vectras VM
- 3.4.6 Stable VM STARTED! @@ -475,6 +474,8 @@ Size (GB) Create a new virtual disk It will be created in + Software & driver + Shared by @@ -675,7 +676,9 @@ - New VM + New VM + + Hello blank fragment diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index 806ae2c..9af4b9b 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.4.0

\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": "

3.4.6

Bugs fixed.", + "MessageBeta": "

3.4.7

Bugs fixed.", "cancellableBeta": true } diff --git a/web/data/software-store.json b/web/data/software-store.json new file mode 100644 index 0000000..05ad818 --- /dev/null +++ b/web/data/software-store.json @@ -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": "" + } +] +