mirror of
https://github.com/xoureldeen/Vectras-VM-Android.git
synced 2026-05-03 00:30:28 +00:00
PHANTOM V2.5
PH2.5 (9)
This commit is contained in:
parent
050fb846f8
commit
e724a517a8
58 changed files with 3092 additions and 869 deletions
|
|
@ -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/";
|
||||
|
||||
}
|
||||
|
|
|
|||
454
app/src/main/java/com/vectras/vm/CustomRomActivity.java
Normal file
454
app/src/main/java/com/vectras/vm/CustomRomActivity.java
Normal 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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
76
app/src/main/java/com/vectras/vm/SetArchActivity.java
Normal file
76
app/src/main/java/com/vectras/vm/SetArchActivity.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue