PHANTOM V2.5

PH2.5 (9)
This commit is contained in:
Epic Studios 2024-01-20 02:19:58 +02:00
parent 050fb846f8
commit e724a517a8
58 changed files with 3092 additions and 869 deletions

View file

@ -1,34 +1,47 @@
package com.vectras.vm;
import android.app.Activity;
import android.content.Context;
import android.os.Environment;
import android.widget.ImageView.ScaleType;
import com.vectras.qemu.MainSettingsManager;
import java.io.File;
import java.util.Hashtable;
import java.util.Objects;
/**
*
* @author dev
*/
public class AppConfig {
// App Config
public static final String vectrasWebsite = "https://vectras.netlify.com/";
public static final String vectrasRaw = "https://raw.githubusercontent.com/epicstudios856/Vectras-windows-emulator/main/";
public static final String vectrasLicense = vectrasRaw + "LICENSE.md";
public static final String vectrasPrivacy = vectrasRaw + "PRIVACYANDPOLICY.md";
public static final String vectrasTerms = vectrasRaw + "TERMSOFSERVICE.md";
public static final String vectrasInfo = vectrasRaw + "info.md";
public static final String vectrasRepo = "https://github.com/epicstudios856/Vectras-windows-emulator/tree/main/";
public static final String updateJson = vectrasRaw + "UpdateConfig.json";
public static final String blogJson = vectrasRaw + "news_list.json";
public static final String storeJson = vectrasRaw + "store_list.json";
public static final String romsJson = vectrasRaw + "roms.json";
// App Config
public static final String vectrasWebsite = "https://vectras.netlify.com/";
public static final String vectrasRaw = "https://raw.githubusercontent.com/epicstudios856/Vectras-windows-emulator/main/";
public static final String vectrasLicense = vectrasRaw + "LICENSE.md";
public static final String vectrasPrivacy = vectrasRaw + "PRIVACYANDPOLICY.md";
public static final String vectrasTerms = vectrasRaw + "TERMSOFSERVICE.md";
public static final String vectrasInfo = vectrasRaw + "info.md";
public static final String vectrasRepo = "https://github.com/epicstudios856/Vectras-windows-emulator/tree/main/";
public static final String updateJson = vectrasRaw + "UpdateConfig.json";
public static final String blogJson = vectrasRaw + "news_list.json";
public static final String storeJson = vectrasRaw + "store_list.json";
// App config
public static final String datadirpath = SplashActivity.activity.getExternalFilesDir("data")+"/";
public static final String sharedFolder = datadirpath + "Vectras/ProgramFiles/";
public static final String basefiledir = datadirpath + "Vectras/.qemu/";
public static final String maindirpath = datadirpath + "Vectras/";
public static final String romsJson(Activity activity) {
if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) {
return vectrasRaw + "roms.json";
} else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM")) {
return vectrasRaw + "roms-arm.json";
} else {
return null;
}
}
// App config
public static final String datadirpath = SplashActivity.activity.getExternalFilesDir("data") + "/";
public static final String sharedFolder = datadirpath + "Vectras/ProgramFiles/";
public static final String basefiledir = datadirpath + "Vectras/.qemu/";
public static final String maindirpath = datadirpath + "Vectras/";
}

View file

@ -0,0 +1,454 @@
package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.logger.VectrasStatus;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
public class CustomRomActivity extends AppCompatActivity {
public TextInputEditText title, icon, drive, qemu;
public Button addRomBtn;
public ProgressBar loadingPb;
public static CustomRomActivity activity;
private boolean isFilled(TextInputEditText TXT) {
if (TXT.getText().toString().trim().length() > 0)
return true;
else
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, "arch").setShortcut('3', 'c').setIcon(R.drawable.ic_arch).setShowAsAction(1);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
startActivity(new Intent(activity, SetArchActivity.class));
return true;
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_rom);
activity = this;
loadingPb = findViewById(R.id.loadingPb);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setTitle("Custom Rom");
AdView mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
MobileAds.initialize(this, new OnInitializationCompleteListener() {
@Override
public void onInitializationComplete(InitializationStatus initializationStatus) {
}
});
title = findViewById(R.id.title);
icon = findViewById(R.id.icon);
drive = findViewById(R.id.drive);
qemu = findViewById(R.id.qemu);
TextInputLayout iconLayout = findViewById(R.id.iconField);
TextInputLayout driveLayout = findViewById(R.id.driveField);
TextView arch = findViewById(R.id.textArch);
arch.setText(MainSettingsManager.getArch(this));
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/jpeg");
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 1001);
}
});
iconLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/jpeg");
// Optionally, specify a URI for the file that should appear in the
// system file picker when it loads.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 1001);
}
});
drive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 1002);
}
});
driveLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 1002);
}
});
addRomBtn = findViewById(R.id.addRomBtn);
addRomBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadingPb.setVisibility(View.VISIBLE);
final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json");
RomsJso obj = new RomsJso();
if (jsonFile.exists()) {
try {
List<DataMainRoms> data = new ArrayList<>();
JSONArray jArray = null;
jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, jsonFile));
try {
// 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");
romsMainData.itemPath = json_data.getString("imgPath");
romsMainData.itemExtra = json_data.getString("imgExtra");
data.add(romsMainData);
}
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
}
JSONObject jsonObject = obj.makeJSONObject(title.getText().toString(), icon.getText().toString(), MainSettingsManager.getArch(activity), drive.getText().toString(), qemu.getText().toString());
jArray.put(jsonObject);
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jArray.toString().replace("\\", "").replace("//", "/"));
output.close();
} catch (Exception e) {
UIUtils.toastLong(activity, e.toString());
loadingPb.setVisibility(View.GONE);
}
} catch (JSONException e) {
loadingPb.setVisibility(View.GONE);
throw new RuntimeException(e);
}
} else {
JSONObject jsonObject = obj.makeJSONObject(title.getText().toString(), icon.getText().toString(), MainSettingsManager.getArch(activity), drive.getText().toString(), qemu.getText().toString());
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jsonArray.toString().replace("\\", "").replace("//", "/"));
output.close();
} catch (Exception e) {
UIUtils.toastLong(activity, e.toString());
}
VectrasStatus.logInfo("Welcome to Vectras ♡");
}
MainActivity.activity.finish();
finish();
activity.startActivity(new Intent(activity, SplashActivity.class));
}
});
TextView textName = findViewById(R.id.textName);
TextWatcher afterTextChangedListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// ignore
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
textName.setText(title.getText().toString());
if (isFilled(title) && isFilled(icon) && isFilled(drive))
addRomBtn.setEnabled(true);
else
addRomBtn.setEnabled(false);
}
@Override
public void afterTextChanged(Editable s) {
if (isFilled(title) && isFilled(icon) && isFilled(drive))
addRomBtn.setEnabled(true);
else
addRomBtn.setEnabled(false);
}
};
title.addTextChangedListener(afterTextChangedListener);
icon.addTextChangedListener(afterTextChangedListener);
drive.addTextChangedListener(afterTextChangedListener);
qemu.addTextChangedListener(afterTextChangedListener);
}
public static class RomsJso extends JSONObject {
public JSONObject makeJSONObject(String imgName, String imgIcon, String imgArch, String imgPath, String imgExtra) {
JSONObject obj = new JSONObject();
try {
obj.put("imgName", imgName);
obj.put("imgIcon", imgIcon);
obj.put("imgArch", imgArch);
obj.put("imgPath", imgPath);
obj.put("imgExtra", imgExtra);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
}
byte[] data;
public String getPath(Uri uri) {
return FileUtils.getPath(this, uri);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent ReturnedIntent) {
super.onActivityResult(requestCode, resultCode, ReturnedIntent);
LinearLayout custom = findViewById(R.id.custom);
if (requestCode == 1001 && resultCode == RESULT_OK) {
Uri content_describer = ReturnedIntent.getData();
TextInputEditText icon = findViewById(R.id.icon);
File selectedFilePath = new File(getPath(content_describer));
ImageView ivIcon = findViewById(R.id.ivIcon);
loadingPb.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
FileInputStream File = null;
Bitmap selectedImage = null;
try {
File = (FileInputStream) getContentResolver().openInputStream(content_describer);
selectedImage = BitmapFactory.decodeStream(File);
Bitmap finalSelectedImage = selectedImage;
Runnable runnable = new Runnable() {
@Override
public void run() {
ivIcon.setImageBitmap(finalSelectedImage);
}
};
activity.runOnUiThread(runnable);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} finally {
try {
try {
SaveImage(selectedImage, new File(AppConfig.maindirpath + "/icons/"), selectedFilePath.getName());
} finally {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
icon.setText(AppConfig.maindirpath + "/icons/" + selectedFilePath.getName());
}
};
activity.runOnUiThread(runnable);
File.close();
}
} catch (IOException e) {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
}
};
activity.runOnUiThread(runnable);
MainActivity.UIAlert("error", e.toString(), activity);
}
}
}
}).start();
} else if (requestCode == 1002 && resultCode == RESULT_OK) {
Uri content_describer = ReturnedIntent.getData();
File selectedFilePath = new File(getPath(content_describer));
drive.setText(AppConfig.maindirpath + selectedFilePath.getName());
loadingPb.setVisibility(View.VISIBLE);
custom.setVisibility(View.GONE);
new Thread(new Runnable() {
@Override
public void run() {
FileInputStream File = null;
try {
File = (FileInputStream) getContentResolver().openInputStream(content_describer);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
try {
try {
OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + selectedFilePath.getName()));
try {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = File.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
out.close();
}
} finally {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
custom.setVisibility(View.VISIBLE);
addRomBtn.setEnabled(isFilled(title) && isFilled(icon) && isFilled(drive));
}
};
activity.runOnUiThread(runnable);
File.close();
}
} catch (IOException e) {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
custom.setVisibility(View.VISIBLE);
addRomBtn.setEnabled(isFilled(title) && isFilled(icon) && isFilled(drive));
}
};
activity.runOnUiThread(runnable);
MainActivity.UIAlert("error", e.toString(), activity);
}
}
}).start();
}
if (requestCode == 1000 && resultCode == RESULT_CANCELED) {
finish();
}
}
private static void SaveImage(Bitmap finalBitmap, File imgDir, String name) {
File myDir = imgDir;
myDir.mkdirs();
String fname = name;
File file = new File(myDir, fname);
if (file.exists()) file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void onDestroy() {
super.onDestroy();
File lol = new File(AppConfig.maindirpath + drive.getText().toString());
try {
lol.delete();
} catch (Exception e) {
}
}
}

View file

@ -17,12 +17,14 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.RomsManagerActivity;
import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms;
@ -33,6 +35,7 @@ import com.vectras.vm.AppConfig;
import com.vectras.vm.MainActivity;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
@ -44,120 +47,110 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class HomeFragment extends Fragment {
View view;
public static RecyclerView mRVMainRoms;
public static LinearLayout romsLayout;
public static View view;
public static RecyclerView mRVMainRoms;
public static LinearLayout romsLayout;
public static AdapterMainRoms mMainAdapter;
public MainActivity activity;
public static JSONArray jArray;
public static List<DataMainRoms> data;
public MainActivity activity;
public static JSONArray jArray;
public static List<DataMainRoms> data;
/*private ImageButton mStop;
private ImageButton mRestart;*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
/*private ImageButton mStop;
private ImageButton mRestart;*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
activity = MainActivity.activity;
activity = MainActivity.activity;
view = inflater.inflate(R.layout.home_fragment, container, false);
view = inflater.inflate(R.layout.home_fragment, container, false);
romsLayout = view.findViewById(R.id.romsLayout);
romsLayout = view.findViewById(R.id.romsLayout);
SwipeRefreshLayout refreshRoms = view.findViewById(R.id.refreshRoms);
SwipeRefreshLayout refreshRoms = view.findViewById(R.id.refreshRoms);
refreshRoms.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
data=new ArrayList<>();
refreshRoms.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadDataVbi();
mMainAdapter.notifyItemRangeChanged(0, mMainAdapter.data.size());
refreshRoms.setRefreshing(false);
}
});
loadDataVbi();
try {
return view;
}
jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, new File(AppConfig.maindirpath
+ "roms-data.json")));
public static void loadDataVbi() {
data = new ArrayList<>();
// 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");
romsMainData.itemPath= json_data.getString("imgPath");
romsMainData.itemExtra= json_data.getString("imgExtra");
data.add(romsMainData);
}
try {
// Setup and Handover data to recyclerview
mRVMainRoms = (RecyclerView)view.findViewById(R.id.mRVMainRoms);
mMainAdapter = new AdapterMainRoms(MainActivity.activity, data);
mRVMainRoms.setAdapter(mMainAdapter);
mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, new File(AppConfig.maindirpath
+ "roms-data.json")));
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
}
mMainAdapter.notifyItemRangeChanged(0, mMainAdapter.data.size());
refreshRoms.setRefreshing(false);
}
});
data=new ArrayList<>();
// 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");
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);
}
}
try {
// Setup and Handover data to recyclerview
mRVMainRoms = (RecyclerView) HomeFragment.view.findViewById(R.id.mRVMainRoms);
mMainAdapter = new AdapterMainRoms(MainActivity.activity, data);
mRVMainRoms.setAdapter(mMainAdapter);
mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, new File(AppConfig.maindirpath
+ "roms-data.json")));
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
}
}
// 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");
romsMainData.itemPath= json_data.getString("imgPath");
romsMainData.itemExtra= json_data.getString("imgExtra");
data.add(romsMainData);
}
/**
* CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
*/
public boolean checkConnection(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// Setup and Handover data to recyclerview
mRVMainRoms = (RecyclerView)view.findViewById(R.id.mRVMainRoms);
mMainAdapter = new AdapterMainRoms(MainActivity.activity, data);
mRVMainRoms.setAdapter(mMainAdapter);
mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
if (connMgr != null) {
NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
}
return view;
}
/**
* CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
*/
public boolean checkConnection(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();
if (activeNetworkInfo != null) { // connected to the internet
// connected to the mobile provider's data plan
if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
return true;
} else
return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
}
return false;
}
if (activeNetworkInfo != null) { // connected to the internet
// connected to the mobile provider's data plan
if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
return true;
} else
return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
}
return false;
}
}

View file

@ -0,0 +1,91 @@
package com.vectras.vm.Fragment;
import android.app.Activity;
import android.app.Dialog;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Toast;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.R;
import com.vectras.vm.VectrasApp;
import com.vectras.vm.adapter.LogsAdapter;
import com.vectras.vm.logger.VectrasStatus;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Timer;
import java.util.TimerTask;
public class LoggerDialogFragment extends DialogFragment {
private final String CREDENTIAL_SHARED_PREF = "settings_prefs";
private LogsAdapter mLogAdapter;
private RecyclerView logList;
private Timer _timer = new Timer();
private TimerTask t;
Activity activity;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
activity = getActivity();
final Dialog alertDialog = new Dialog(getActivity(), R.style.MainDialogTheme);
alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
alertDialog.setContentView(R.layout.fragment_logs);
LinearLayoutManager layoutManager = new LinearLayoutManager(VectrasApp.getApp());
mLogAdapter = new LogsAdapter(layoutManager, VectrasApp.getApp());
logList = (RecyclerView) alertDialog.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() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (bufferedReader.readLine() != null || bufferedReader2.readLine() != null) {
String logLine = bufferedReader.readLine();
String logLine2 = bufferedReader2.readLine();
VectrasStatus.logError("<font color='red'>[E] "+logLine+"</font>");
VectrasStatus.logError("<font color='yellow'>[W] "+logLine2+"</font>");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
};
_timer.scheduleAtFixedRate(t, (int) (0), (int) (100));
} catch (IOException e) {
Toast.makeText(activity, "There was an error: " + Log.getStackTraceString(e), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
alertDialog.show();
return alertDialog;
}
}

View file

@ -1,5 +1,6 @@
package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import static android.os.Build.VERSION.SDK_INT;
import android.androidVNC.RfbProto;
@ -18,7 +19,10 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@ -28,12 +32,15 @@ import android.os.Handler;
import android.os.Looper;
import android.os.StrictMode;
import android.preference.PreferenceManager;
import android.provider.DocumentsContract;
import android.text.Html;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
@ -61,6 +68,8 @@ import com.google.android.gms.ads.initialization.OnInitializationCompleteListene
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.elevation.SurfaceColors;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.vectras.qemu.Config;
@ -88,7 +97,14 @@ import com.vectras.vm.utils.UIUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
@ -136,6 +152,8 @@ public class MainActivity extends AppCompatActivity {
ad.show();
}
public static ProgressBar loadingPbb;
/**
* Called when the activity is first created.
*/
@ -143,6 +161,7 @@ public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadingPbb = findViewById(R.id.loadingPb);
activity = this;
clearNotifications();
setupFolders();
@ -154,7 +173,7 @@ public class MainActivity extends AppCompatActivity {
this.setupWidgets();
initNavigationMenu();
FileInstaller.installFiles(activity, false);
getWindow().setNavigationBarColor(SurfaceColors.SURFACE_2.getColor(this));
//updateApp(true);
//mAuth = FirebaseAuth.getInstance();
}
@ -231,6 +250,8 @@ public class MainActivity extends AppCompatActivity {
} else if (id == R.id.installRoms) {
startActivity(new Intent(activity, RomsManagerActivity.class));
} else if (id == R.id.arch) {
startActivity(new Intent(activity, SetArchActivity.class));
}
return super.onOptionsItemSelected(item);
@ -371,12 +392,62 @@ public class MainActivity extends AppCompatActivity {
//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 (SDK_INT > 33)
UIAlert("ANDROID 13+", "sorry android 13+ have storage issues and we are working on it", activity);
else
startActivity(new Intent(activity, AboutActivity.class));
} else if (id == R.id.navigation_item_website) {
String tw = AppConfig.vectrasWebsite;
Intent w = new Intent(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", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int 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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 1004);
return;
}
});
ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
File isoFile = new File(AppConfig.maindirpath + "/drive.iso");
try {
isoFile.delete();
} catch (Exception e) {
throw new RuntimeException(e);
}
return;
}
});
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 (Build.VERSION.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_view_logs) {
FileUtils.viewVectrasLog(activity);
} else if (id == R.id.navigation_item_settings) {
@ -478,8 +549,8 @@ public class MainActivity extends AppCompatActivity {
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
alertDialog.setTitle("JOIN US ON TELEGRAM");
TextView title = alertDialog.findViewById(R.id.title_text);
ObjectAnimator rgbAnim=ObjectAnimator.ofObject(title,"textColor",new ArgbEvaluator(), Color.RED,Color.GREEN,Color.BLUE);
TextView title = alertDialog.findViewById(android.R.id.title);
ObjectAnimator rgbAnim = ObjectAnimator.ofObject(title, "textColor", new ArgbEvaluator(), Color.RED, Color.GREEN, Color.BLUE);
rgbAnim.setDuration(1000);
rgbAnim.setRepeatMode(ValueAnimator.REVERSE);
rgbAnim.setRepeatCount(ValueAnimator.INFINITE);
@ -545,10 +616,19 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onStart() {
super.onStart();
if (MainSettingsManager.getVirtio(activity)) {
Config.hd_if_type = "virtio";
} else {
Config.hd_if_type = "ide";
try {
HomeFragment.loadDataVbi();
} catch (Exception ignored) {
}
if (MainSettingsManager.getArch(activity) == "X86_64") {
if (MainSettingsManager.getVirtio(activity)) {
Config.hd_if_type = "virtio";
} else {
Config.hd_if_type = "ide";
}
} else if (MainSettingsManager.getArch(activity) == "ARM") {
Config.hd_if_type = "scsi";
}
setupFolders();
Config.ui = MainSettingsManager.getVmUi(activity);
@ -822,10 +902,18 @@ public class MainActivity extends AppCompatActivity {
public static void loadQEMULib() {
try {
System.loadLibrary("qemu-system-i386");
} catch (Error ex) {
System.loadLibrary("qemu-system-x86_64");
if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) {
try {
System.loadLibrary("qemu-system-i386");
} catch (Error ex) {
System.loadLibrary("qemu-system-x86_64");
}
} else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM")) {
try {
System.loadLibrary("qemu-system-arm");
} catch (Error ex) {
System.loadLibrary("qemu-system-aarch64");
}
}
}
@ -993,11 +1081,47 @@ public class MainActivity extends AppCompatActivity {
t.start();
}
public static void toggleVisibility(View view) {
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.GONE);
} else if (view.getVisibility() == View.GONE || view.getVisibility() == View.INVISIBLE) {
view.setVisibility(View.VISIBLE);
public String getPath(Uri uri) {
return com.vectras.vm.utils.FileUtils.getPath(this, uri);
}
@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));
FileInputStream isoFile = null;
try {
isoFile = (FileInputStream) getContentResolver().openInputStream(content_describer);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
if (selectedFilePath.toString().endsWith(".iso")) {
loadingPbb.setVisibility(View.VISIBLE);
try {
try {
OutputStream out = new FileOutputStream(new File(AppConfig.maindirpath + "/drive.iso"));
try {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = isoFile.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
out.close();
}
} finally {
loadingPbb.setVisibility(View.GONE);
isoFile.close();
}
} catch (IOException e) {
loadingPbb.setVisibility(View.GONE);
UIAlert("error", e.toString(), activity);
}
} else
UIAlert("NOT VAILED FILE", "please select iso file", activity);
}
}

View file

@ -6,12 +6,15 @@ import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@ -28,9 +31,14 @@ import com.vectras.vm.MainActivity;
import com.vectras.vm.R;
import com.vectras.vm.utils.UIUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Collections;
import java.util.List;
@ -66,8 +74,45 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
final MyHolder myHolder = (MyHolder) holder;
final DataMainRoms current = data.get(position);
myHolder.textName.setText(current.itemName);
myHolder.textArch.setText(current.itemArch);
Bitmap bmImg = BitmapFactory.decodeFile(current.itemIcon);
myHolder.ivIcon.setImageBitmap(bmImg);
myHolder.optionsBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Dialog d;
d = new Dialog(MainActivity.activity);
d.setTitle(current.itemName);
d.setContentView(R.layout.rom_options_dialog);
TextView qemu = d.findViewById(R.id.qemu);
qemu.setText(current.itemExtra);
Button saveRomBtn = d.findViewById(R.id.saveRomBtn);
saveRomBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json");
current.itemExtra = qemu.getText().toString();
try {
JSONObject jObj = HomeFragment.jArray.getJSONObject(position);
jObj.put("imgExtra", qemu.getText().toString());
HomeFragment.jArray.put(position, jObj);
} catch (JSONException e) {
throw new RuntimeException(e);
}
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(HomeFragment.jArray.toString());
output.close();
} catch (Exception e) {
UIUtils.toastLong(MainActivity.activity, e.toString());
} finally {
d.dismiss();
}
}
});
d.show();
}
});
myHolder.cdRoms.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
@ -90,7 +135,43 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
myHolder.cdRoms.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showDialog(current.itemName, current.itemPath, current.itemIcon);
AlertDialog ad;
ad = new AlertDialog.Builder(MainActivity.activity, R.style.MainDialogTheme).create();
ad.setTitle("Remove " + current.itemName);
ad.setMessage("Are you sure?");
ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE " + current.itemName, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
File file = new File(current.itemPath);
try {
file.delete();
} catch (Exception e) {
UIUtils.toastLong(MainActivity.activity, e.toString());
} finally {
}
HomeFragment.mMainAdapter = new AdapterMainRoms(MainActivity.activity, HomeFragment.data);
HomeFragment.data.remove(position);
HomeFragment.mRVMainRoms.setAdapter(HomeFragment.mMainAdapter);
HomeFragment.mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
HomeFragment.jArray.remove(position);
try {
Writer output = null;
File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json");
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(HomeFragment.jArray.toString());
output.close();
} catch (Exception e) {
UIUtils.toastLong(MainActivity.activity, e.toString());
}
UIUtils.toastLong(MainActivity.activity, current.itemName + " are removed successfully!");
return;
}
});
ad.setButton(Dialog.BUTTON_POSITIVE, "CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
ad.show();
return false;
}
});
@ -114,9 +195,11 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE " + title, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
File file = new File(path);
file.delete();
File fileIcon = new File(pathIcon);
fileIcon.delete();
try {
file.delete();
} catch (Exception e) {
throw new RuntimeException(e);
}
HomeFragment.mMainAdapter = new AdapterMainRoms(MainActivity.activity, HomeFragment.data);
HomeFragment.data.remove(currentPos);
@ -163,15 +246,18 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
class MyHolder extends RecyclerView.ViewHolder {
CardView cdRoms;
TextView textName;
TextView textName, textArch;
ImageView ivIcon;
ImageButton optionsBtn;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
cdRoms = (CardView) itemView.findViewById(R.id.cdItem);
textName = (TextView) itemView.findViewById(R.id.textName);
textArch = (TextView) itemView.findViewById(R.id.textArch);
ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon);
optionsBtn = (ImageButton) itemView.findViewById(R.id.optionsButton);
}
}

View file

@ -2,6 +2,7 @@ package com.vectras.vm.MainRoms;
public class DataMainRoms {
public String itemIcon;
public String itemName;
public String itemArch;
public String itemPath;
public String itemExtra;
}

View file

@ -75,14 +75,15 @@ public class AdapterRoms extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
myHolder.textSize.setText(current.itemSize);
myHolder.checkBox.setChecked(position == mSelectedItem);
if (current.itemAvail) {
myHolder.textAvail.setText("availability: available");
myHolder.textAvail.setTextColor(Color.GREEN);
} else if (!current.itemAvail) {
myHolder.textAvail.setText("availability: unavailable");
myHolder.textAvail.setTextColor(Color.RED);
myHolder.checkBox.setEnabled(false);
}
if (current.itemAvail)
if (FileUtils.fileValid(RomsManagerActivity.activity, AppConfig.maindirpath + current.itemPath)) {
myHolder.checkBox.setEnabled(false);
myHolder.textAvail.setTextColor(Color.BLUE);
myHolder.textAvail.setText("(installed)");
} else {
myHolder.checkBox.setEnabled(true);
myHolder.textAvail.setTextColor(Color.GREEN);
myHolder.textAvail.setText("availability: available");
}
myHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -96,6 +97,11 @@ public class AdapterRoms extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
RomsManagerActivity.selectedIcon = current.itemIcon;
}
});
} else {
myHolder.textAvail.setText("availability: unavailable");
myHolder.textAvail.setTextColor(Color.RED);
myHolder.checkBox.setEnabled(false);
}
}

View file

@ -23,22 +23,29 @@ import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.button.MaterialButtonToggleGroup;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.AppConfig;
import com.vectras.vm.Fragment.HomeFragment;
import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.Roms.AdapterRoms;
@ -110,6 +117,31 @@ public class RomsManagerActivity extends AppCompatActivity {
public MaterialButton androidToggle;
public MaterialButton otherToggle;
public ProgressBar loadingPb;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, "arch").setShortcut('3', 'c').setIcon(R.drawable.ic_arch).setShowAsAction(1);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
startActivity(new Intent(activity, SetArchActivity.class));
return true;
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Called when the activity is first created.
*/
@ -119,6 +151,7 @@ public class RomsManagerActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
activity = this;
setContentView(R.layout.activity_roms_manager);
loadingPb = findViewById(R.id.loadingPb);
filterToggle = findViewById(R.id.filterToggle);
windowsToggle = findViewById(R.id.windowsToggle);
linuxToggle = findViewById(R.id.linuxToggle);
@ -163,6 +196,7 @@ public class RomsManagerActivity extends AppCompatActivity {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
setTitle("Roms Manager " + MainSettingsManager.getArch(activity));
new RomsManagerActivity.AsyncLogin().execute();
new Thread(new Runnable() {
@ -189,7 +223,7 @@ public class RomsManagerActivity extends AppCompatActivity {
in.close();
} catch (Exception e) {
acceptLiceneseChkBox.setEnabled(false);
UIUtils.toastLong(activity, "no internet connection "+e.toString());
UIUtils.toastLong(activity, "no internet connection " + e.toString());
}
//since we are in background thread, to post results we have to go back to ui thread. do the following for that
@ -227,6 +261,15 @@ public class RomsManagerActivity extends AppCompatActivity {
}
});
CardView custom = (CardView) findViewById(R.id.cdCustom);
custom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(activity, CustomRomActivity.class));
}
});
}
public static void UIAlertLicense(String title, String html, final Activity activity) {
@ -270,7 +313,7 @@ public class RomsManagerActivity extends AppCompatActivity {
protected String doInBackground(String... params) {
HttpsURLConnection con = null;
try {
URL u = new URL(AppConfig.romsJson);
URL u = new URL(AppConfig.romsJson(activity));
con = (HttpsURLConnection) u.openConnection();
con.connect();
@ -349,23 +392,36 @@ public class RomsManagerActivity extends AppCompatActivity {
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
public static class RomsJso extends JSONObject {
public class RomsJso extends JSONObject {
public JSONObject makeJSONObject(String imgName, String imgIcon, String imgPath, String imgExtra) {
public JSONObject makeJSONObject(String imgName, String imgIcon, String imgArch, String imgPath, String imgExtra) {
JSONObject obj = new JSONObject();
try {
obj.put("imgName", imgName);
obj.put("imgIcon", imgIcon);
obj.put("imgArch", imgArch);
obj.put("imgPath", imgPath);
obj.put("imgExtra", imgExtra);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
}
public static class RomsJso2 extends JSONObject {
public JSONObject makeJSONObject(String imgName, String imgIcon, String imgArch, String imgPath, String imgExtra) {
JSONObject obj = new JSONObject();
try {
obj.put("imgName", imgName);
obj.put("imgIcon", imgIcon);
obj.put("imgArch", imgArch);
obj.put("imgPath", imgPath);
obj.put("imgExtra", imgExtra);
} catch (JSONException e) {
@ -384,7 +440,7 @@ public class RomsManagerActivity extends AppCompatActivity {
public void onFirstStartup() {
if (selected) {
if (FileUtils.fileValid(activity, AppConfig.maindirpath + selectedPath) && !FileUtils.fileValid(activity, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"))) {
if (FileUtils.fileValid(activity, AppConfig.maindirpath + selectedPath)) {
SharedPreferences credentials = activity.getSharedPreferences(CREDENTIAL_SHARED_PREF, Context.MODE_PRIVATE);
ProgressDialog mProgressDialog = new ProgressDialog(this, R.style.MainDialogTheme);
mProgressDialog.setTitle("Data Setup");
@ -396,64 +452,78 @@ public class RomsManagerActivity extends AppCompatActivity {
editor.putBoolean("isFirstLaunch", Boolean.TRUE);
editor.apply();
RomsJso obj = new RomsJso();
startIconDownload();
final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json");
if (jsonFile.exists()) {
try {
startIconDownload();
} catch (Exception e) {
File file = new File(selectedPath);
try {
List<DataMainRoms> data = new ArrayList<>();
JSONArray jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, jsonFile));
file.delete();
} catch (Exception er) {
throw new RuntimeException(er);
}
throw new RuntimeException(e);
} finally {
mProgressDialog.dismiss();
final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json");
if (jsonFile.exists()) {
try {
// 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");
romsMainData.itemPath = json_data.getString("imgPath");
romsMainData.itemExtra = json_data.getString("imgExtra");
data.add(romsMainData);
List<DataMainRoms> data = new ArrayList<>();
JSONArray jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, jsonFile));
try {
// 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");
romsMainData.itemPath = json_data.getString("imgPath");
romsMainData.itemExtra = json_data.getString("imgExtra");
data.add(romsMainData);
}
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
}
JSONObject jsonObject = obj.makeJSONObject(selectedName, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"), MainSettingsManager.getArch(activity), AppConfig.maindirpath + selectedPath, selectedExtra);
jArray.put(jsonObject);
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jArray.toString().replace("\\", "").replace("//", "/"));
output.close();
} catch (Exception e) {
UIUtils.toastLong(activity, e.toString());
}
} catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show();
UIUtils.toastLong(activity, e.toString());
}
JSONObject jsonObject = obj.makeJSONObject(selectedName, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"), AppConfig.maindirpath + selectedPath, selectedExtra);
jArray.put(jsonObject);
MainActivity.activity.finish();
} else {
JSONObject jsonObject = obj.makeJSONObject(selectedName, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"), MainSettingsManager.getArch(activity), AppConfig.maindirpath + selectedPath, selectedExtra);
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jArray.toString().replace("\\", "").replace("//", "/"));
output.write(jsonArray.toString().replace("\\", "").replace("//", "/"));
output.close();
} catch (Exception e) {
UIUtils.toastLong(activity, e.toString());
}
} catch (JSONException e) {
UIUtils.toastLong(activity, e.toString());
VectrasStatus.logInfo("Welcome to Vectras ♡");
}
} else {
JSONObject jsonObject = obj.makeJSONObject(selectedName, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"), AppConfig.maindirpath + selectedPath, selectedExtra);
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
try {
Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jsonArray.toString().replace("\\", "").replace("//", "/"));
output.close();
} catch (Exception e) {
UIUtils.toastLong(activity, e.toString());
}
VectrasStatus.logInfo("Welcome to Vectras ♡");
}
activity.startActivity(new Intent(activity, MainActivity.class));
/*new Timer().schedule(new TimerTask() {
@Override
public void run() {
mProgressDialog.dismiss(); }
}, 3000);*/
finish();
startActivity(new Intent(activity, SplashActivity.class));
}
} else {
AlertDialog ad;
ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
@ -501,8 +571,6 @@ public class RomsManagerActivity extends AppCompatActivity {
return FileUtils.getPath(activity, uri);
}
public ProgressDialog progressDialog = null;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@ -512,12 +580,10 @@ public class RomsManagerActivity extends AppCompatActivity {
if (selectedFilePath.getName().equals(selectedPath.replace(".IMG", ".vbi"))) {
try {
progressDialog = new ProgressDialog(activity,
R.style.MainDialogTheme);
progressDialog.setTitle("Extracting");
progressDialog.setMessage("Please wait...");
progressDialog.setCancelable(false);
progressDialog.show(); // Showing Progress Dialog
loadingPb.setVisibility(View.VISIBLE);
goBtn.setEnabled(false);
acceptLiceneseChkBox.setEnabled(false);
mRVRoms.setVisibility(View.GONE);
Thread t = new Thread() {
public void run() {
FileInputStream zipFile = null;
@ -556,7 +622,17 @@ public class RomsManagerActivity extends AppCompatActivity {
UIUtils.toastLong(activity, e.toString());
throw new RuntimeException(e);
} finally {
progressDialog.cancel(); // cancelling Dialog.
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
goBtn.setEnabled(true);
acceptLiceneseChkBox.setEnabled(true);
mRVRoms.setVisibility(View.VISIBLE);
onFirstStartup();
}
};
activity.runOnUiThread(runnable);
try {
zis.close();
} catch (IOException e) {
@ -568,7 +644,10 @@ public class RomsManagerActivity extends AppCompatActivity {
};
t.start();
} catch (Exception e) {
progressDialog.dismiss(); // Close Progress Dialog
loadingPb.setVisibility(View.GONE);
goBtn.setEnabled(true);
acceptLiceneseChkBox.setEnabled(true);
mRVRoms.setVisibility(View.VISIBLE);
UIUtils.toastLong(activity, e.toString());
throw new RuntimeException(e);
}
@ -580,8 +659,6 @@ public class RomsManagerActivity extends AppCompatActivity {
}
}
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
static class DownloadsImage extends AsyncTask<String, Void, Void> {
@Override
@ -643,4 +720,13 @@ public class RomsManagerActivity extends AppCompatActivity {
finish();
}
@Override
public void onStart() {
super.onStart();
if (MainSettingsManager.getArch(activity) == null) {
startActivity(new Intent(this, SetArchActivity.class));
}
activity = this;
}
}

View file

@ -0,0 +1,76 @@
package com.vectras.vm;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.vectras.qemu.MainSettingsManager;
public class SetArchActivity extends AppCompatActivity implements View.OnClickListener {
SetArchActivity activity;
private static Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
setContentView(R.layout.activity_set_arch);
activity = this;
Button arch86 = findViewById(R.id.archx86);
Button archarm = findViewById(R.id.archarm);
Button web = findViewById(R.id.webBtn);
arch86.setOnClickListener(this);
archarm.setOnClickListener(this);
web.setOnClickListener(this);
}
public void onClick(View v) {
int id = v.getId();
if (id == R.id.archx86) {
MainSettingsManager.setArch(this, "X86_64");
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent startActivity = new Intent(activity, SplashActivity.class);
int pendingIntentId = 123456;
PendingIntent pendingIntent = PendingIntent.getActivity(activity, pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
AlarmManager mgr = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
} else if (id == R.id.archarm) {
MainSettingsManager.setArch(this, "ARM");
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent startActivity = new Intent(activity, SplashActivity.class);
int pendingIntentId = 123456;
PendingIntent pendingIntent = PendingIntent.getActivity(activity, pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
AlarmManager mgr = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
} else if (id == R.id.webBtn) {
String qe = "https://www.qemu.org/";
Intent q = new Intent(Intent.ACTION_VIEW);
q.setData(Uri.parse(qe));
startActivity(q);
}
}
}

View file

@ -1,12 +1,19 @@
package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.*;
import android.provider.DocumentsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull;
@ -24,38 +31,50 @@ import com.vectras.vm.Blog.DataBlog;
import com.vectras.vm.Fragment.HomeFragment;
import com.vectras.vm.Store.AdapterStore;
import com.vectras.vm.Store.DataStore;
import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.net.ssl.HttpsURLConnection;
public class StoreActivity extends AppCompatActivity{
public class StoreActivity extends AppCompatActivity {
private RecyclerView mRVStore;
private AdapterStore mAdapter;
public static LinearLayout noConnectionLayout;
public SwipeRefreshLayout pullToRefresh;
public static StoreActivity activity;
public String Data;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_store);
loadingPb = findViewById(R.id.loadingPb);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setTitle(getString(R.string.app_name));
activity = this;
AdView mAdView = findViewById(R.id.adView);
@ -86,6 +105,7 @@ public class StoreActivity extends AppCompatActivity{
}
});
}
public boolean checkConnection(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
@ -194,11 +214,99 @@ public class StoreActivity extends AppCompatActivity{
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId()== android.R.id.home){
finish();
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, "IMPORT FILES").setShortcut('3', 'c').setIcon(R.drawable.input_circle).setShowAsAction(1);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Environment.DIRECTORY_DOWNLOADS);
}
startActivityForResult(intent, 69);
return true;
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public ProgressBar loadingPb;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 69 && resultCode == RESULT_OK) {
Uri content_describer = data.getData();
File selectedFilePath = new File(getPath(content_describer));
loadingPb.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
@Override
public void run() {
FileInputStream File = null;
try {
File = (FileInputStream) getContentResolver().openInputStream(content_describer);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
try {
try {
OutputStream out = new FileOutputStream(new File(AppConfig.sharedFolder + "/" + selectedFilePath.getName()));
try {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = File.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
out.close();
}
} finally {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
}
};
activity.runOnUiThread(runnable);
File.close();
}
} catch (IOException e) {
Runnable runnable = new Runnable() {
@Override
public void run() {
loadingPb.setVisibility(View.GONE);
}
};
activity.runOnUiThread(runnable);
MainActivity.UIAlert("error", e.toString(), activity);
}
}
}).start();
}
}
public String getPath(Uri uri) {
return FileUtils.getPath(activity, uri);
}
}

View file

@ -1,29 +0,0 @@
package com.vectras.vm.data;
import com.vectras.vm.data.model.LoggedInUser;
import java.io.IOException;
/**
* Class that handles authentication w/ login credentials and retrieves user information.
*/
public class LoginDataSource {
public Result<LoggedInUser> login(String username, String password) {
try {
// TODO: handle loggedInUser authentication
LoggedInUser fakeUser =
new LoggedInUser(
java.util.UUID.randomUUID().toString(),
"Jane Doe");
return new Result.Success<>(fakeUser);
} catch (Exception e) {
return new Result.Error(new IOException("Error logging in", e));
}
}
public void logout() {
// TODO: revoke authentication
}
}

View file

@ -1,54 +0,0 @@
package com.vectras.vm.data;
import com.vectras.vm.data.model.LoggedInUser;
/**
* Class that requests authentication and user information from the remote data source and
* maintains an in-memory cache of login status and user credentials information.
*/
public class LoginRepository {
private static volatile LoginRepository instance;
private LoginDataSource dataSource;
// If user credentials will be cached in local storage, it is recommended it be encrypted
// @see https://developer.android.com/training/articles/keystore
private LoggedInUser user = null;
// private constructor : singleton access
private LoginRepository(LoginDataSource dataSource) {
this.dataSource = dataSource;
}
public static LoginRepository getInstance(LoginDataSource dataSource) {
if (instance == null) {
instance = new LoginRepository(dataSource);
}
return instance;
}
public boolean isLoggedIn() {
return user != null;
}
public void logout() {
user = null;
dataSource.logout();
}
private void setLoggedInUser(LoggedInUser user) {
this.user = user;
// If user credentials will be cached in local storage, it is recommended it be encrypted
// @see https://developer.android.com/training/articles/keystore
}
public Result<LoggedInUser> login(String username, String password) {
// handle login
Result<LoggedInUser> result = dataSource.login(username, password);
if (result instanceof Result.Success) {
setLoggedInUser(((Result.Success<LoggedInUser>) result).getData());
}
return result;
}
}

View file

@ -1,48 +0,0 @@
package com.vectras.vm.data;
/**
* A generic class that holds a result success w/ data or an error exception.
*/
public class Result<T> {
// hide the private constructor to limit subclass types (Success, Error)
private Result() {
}
@Override
public String toString() {
if (this instanceof Result.Success) {
Result.Success success = (Result.Success) this;
return "Success[data=" + success.getData().toString() + "]";
} else if (this instanceof Result.Error) {
Result.Error error = (Result.Error) this;
return "Error[exception=" + error.getError().toString() + "]";
}
return "";
}
// Success sub-class
public final static class Success<T> extends Result {
private T data;
public Success(T data) {
this.data = data;
}
public T getData() {
return this.data;
}
}
// Error sub-class
public final static class Error extends Result {
private Exception error;
public Error(Exception error) {
this.error = error;
}
public Exception getError() {
return this.error;
}
}
}

View file

@ -1,23 +0,0 @@
package com.vectras.vm.data.model;
/**
* Data class that captures user information for logged in users retrieved from LoginRepository
*/
public class LoggedInUser {
private String userId;
private String displayName;
public LoggedInUser(String userId, String displayName) {
this.userId = userId;
this.displayName = displayName;
}
public String getUserId() {
return userId;
}
public String getDisplayName() {
return displayName;
}
}