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,6 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="deploymentTargetDropDown"> <component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="adb-R95R4001KTL-pPKf1Z._adb-tls-connect._tcp" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2024-01-18T00:24:31.544552600Z" />
<runningDeviceTargetsSelectedWithDialog> <runningDeviceTargetsSelectedWithDialog>
<Target> <Target>
<type value="RUNNING_DEVICE_TARGET" /> <type value="RUNNING_DEVICE_TARGET" />

View file

@ -20,8 +20,8 @@ android {
applicationId "com.vectras.vm" applicationId "com.vectras.vm"
minSdk 21 minSdk 21
targetSdk 34 targetSdk 34
versionCode 8 versionCode 9
versionName "2.4" versionName "PHANTOM v2.5"
ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" } ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" }
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View file

@ -12,6 +12,7 @@
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:glEsVersion="0x00020000" />
@ -25,11 +26,15 @@
android:supportsRtl="false" android:supportsRtl="false"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".SetArchActivity"
android:exported="false"
android:label="@string/title_activity_set_arch"
android:theme="@style/AppTheme" />
<activity <activity
android:name=".SplashActivity" android:name=".SplashActivity"
android:exported="true" android:exported="true"
android:hardwareAccelerated="true" android:hardwareAccelerated="true">
>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -112,24 +117,34 @@
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize"
android:label="Settings" android:label="Settings"
android:theme="@style/AppTheme" /> android:theme="@style/AppTheme" />
<activity
android:name="com.vectras.vm.CustomRomActivity"
android:label="Custom Rom"
android:theme="@style/AppTheme" />
<service <service
android:name="com.vectras.qemu.MainService" android:name="com.vectras.qemu.MainService"
android:enabled="true" android:enabled="true"
android:exported="false" android:exported="false"
android:foregroundServiceType="location"
android:label="Vectras Service"> android:label="Vectras Service">
<intent-filter> <intent-filter>
<action android:name="com.vectras.qemu.action.STARTVM" /> <action android:name="com.vectras.qemu.action.STARTVM" />
</intent-filter> </intent-filter>
</service> </service>
<receiver android:name=".WidgetProvider"
<receiver
android:name=".WidgetProvider"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter> </intent-filter>
<meta-data android:name="android.appwidget.provider"
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widgetproviderinfo" /> android:resource="@xml/widgetproviderinfo" />
</receiver> </receiver>
<meta-data <meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID" android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3568137780412047~1296857222" /> android:value="ca-app-pub-3568137780412047~1296857222" />

View file

@ -1,20 +0,0 @@
package com.vectras.qemu;
import android.app.Application;
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
try {
Class.forName("android.os.AsyncTask");
} catch (Throwable ignore) {
// ignored
}
}
}

View file

@ -2,7 +2,9 @@ package com.vectras.qemu;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
@ -35,6 +37,7 @@ import android.view.WindowManager;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
@ -55,6 +58,7 @@ import com.vectras.qemu.utils.FileUtils;
import com.vectras.qemu.utils.Machine; import com.vectras.qemu.utils.Machine;
import com.vectras.qemu.utils.QmpClient; import com.vectras.qemu.utils.QmpClient;
import com.vectras.vm.Fragment.ControlersOptionsFragment; import com.vectras.vm.Fragment.ControlersOptionsFragment;
import com.vectras.vm.Fragment.LoggerDialogFragment;
import com.vectras.vm.MainActivity; import com.vectras.vm.MainActivity;
import com.vectras.vm.R; import com.vectras.vm.R;
import com.vectras.vm.adapter.LogsAdapter; import com.vectras.vm.adapter.LogsAdapter;
@ -82,7 +86,7 @@ import org.libsdl.app.SDLSurface;
public class MainSDLActivity extends SDLActivity { public class MainSDLActivity extends SDLActivity {
public static final String TAG = "MainSDLActivity"; public static final String TAG = "MainSDLActivity";
public static MainSDLActivity activity ; public static MainSDLActivity activity;
public static final int KEYBOARD = 10000; public static final int KEYBOARD = 10000;
public static final int QUIT = 10001; public static final int QUIT = 10001;
@ -172,7 +176,7 @@ public class MainSDLActivity extends SDLActivity {
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
// Log.v("singletap", "Could not sleep"); // Log.v("singletap", "Could not sleep");
} }
MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_LEFT, MotionEvent.ACTION_DOWN, 1,0, 0); MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_LEFT, MotionEvent.ACTION_DOWN, 1, 0, 0);
try { try {
Thread.sleep(50); Thread.sleep(50);
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
@ -277,13 +281,14 @@ public class MainSDLActivity extends SDLActivity {
e.printStackTrace(); e.printStackTrace();
} }
} }
public static void sendCtrlAltKey(int code) { public static void sendCtrlAltKey(int code) {
delayKey(100); delayKey(100);
SDLActivity.onNativeKeyDown(KeyEvent.KEYCODE_CTRL_LEFT); SDLActivity.onNativeKeyDown(KeyEvent.KEYCODE_CTRL_LEFT);
delayKey(100); delayKey(100);
SDLActivity.onNativeKeyDown(KeyEvent.KEYCODE_ALT_LEFT); SDLActivity.onNativeKeyDown(KeyEvent.KEYCODE_ALT_LEFT);
delayKey(100); delayKey(100);
if(code>=0) { if (code >= 0) {
SDLActivity.onNativeKeyDown(code); SDLActivity.onNativeKeyDown(code);
delayKey(100); delayKey(100);
SDLActivity.onNativeKeyUp(code); SDLActivity.onNativeKeyUp(code);
@ -388,8 +393,7 @@ public class MainSDLActivity extends SDLActivity {
} }
}, 200); }, 200);
} } else if (item.getItemId() == R.id.itemMonitor) {
else if (item.getItemId() == R.id.itemMonitor) {
if (this.monitorMode) { if (this.monitorMode) {
this.onVMConsole(); this.onVMConsole();
} else { } else {
@ -421,7 +425,7 @@ public class MainSDLActivity extends SDLActivity {
} else if (item.getItemId() == this.QUIT) { } else if (item.getItemId() == this.QUIT) {
} else if (item.getItemId() == R.id.itemHelp) { } else if (item.getItemId() == R.id.itemHelp) {
} else if (item.getItemId() == R.id.itemHideToolbar) { } else if (item.getItemId() == R.id.itemHideToolbar) {
this.onHideToolbar(); this.onHideToolbar();
} else if (item.getItemId() == R.id.itemDisplay) { } else if (item.getItemId() == R.id.itemDisplay) {
this.onSelectMenuSDLDisplay(); this.onSelectMenuSDLDisplay();
@ -439,7 +443,7 @@ public class MainSDLActivity extends SDLActivity {
FileUtils.viewVectrasLog(this); FileUtils.viewVectrasLog(this);
} }
public void onHideToolbar(){ public void onHideToolbar() {
ActionBar bar = this.getSupportActionBar(); ActionBar bar = this.getSupportActionBar();
if (bar != null) { if (bar != null) {
bar.hide(); bar.hide();
@ -449,7 +453,7 @@ public class MainSDLActivity extends SDLActivity {
private void onMouseMode() { private void onMouseMode() {
String [] items = {"Trackpad Mouse (Phone)", String[] items = {"Trackpad Mouse (Phone)",
"Bluetooth/USB Mouse (Desktop mode)", //Physical mouse for Chromebook, Android x86 PC, or Bluetooth Mouse "Bluetooth/USB Mouse (Desktop mode)", //Physical mouse for Chromebook, Android x86 PC, or Bluetooth Mouse
}; };
final AlertDialog.Builder mBuilder = new AlertDialog.Builder(this); final AlertDialog.Builder mBuilder = new AlertDialog.Builder(this);
@ -457,7 +461,7 @@ public class MainSDLActivity extends SDLActivity {
mBuilder.setSingleChoiceItems(items, Config.mouseMode.ordinal(), new DialogInterface.OnClickListener() { mBuilder.setSingleChoiceItems(items, Config.mouseMode.ordinal(), new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int i) { public void onClick(DialogInterface dialog, int i) {
switch(i){ switch (i) {
case 0: case 0:
setUIModeMobile(true); setUIModeMobile(true);
break; break;
@ -485,7 +489,7 @@ public class MainSDLActivity extends SDLActivity {
height += bar.getHeight(); height += bar.getHeight();
} }
if(vm_width < width && vm_height < height) if (vm_width < width && vm_height < height)
return true; return true;
return false; return false;
@ -495,7 +499,7 @@ public class MainSDLActivity extends SDLActivity {
//XXX: No need to calibrate for SDL trackpad. //XXX: No need to calibrate for SDL trackpad.
} }
private void setUIModeMobile(boolean fitToScreen){ private void setUIModeMobile(boolean fitToScreen) {
try { try {
UIUtils.setOrientation(this); UIUtils.setOrientation(this);
@ -506,16 +510,16 @@ public class MainSDLActivity extends SDLActivity {
Config.mouseMode = Config.MouseMode.Trackpad; Config.mouseMode = Config.MouseMode.Trackpad;
MainSettingsManager.setDesktopMode(this, false); MainSettingsManager.setDesktopMode(this, false);
MainActivity.vmexecutor.setRelativeMouseMode(1); MainActivity.vmexecutor.setRelativeMouseMode(1);
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(this.getApplicationContext(), "Trackpad Enabled"); UIUtils.toastShort(this.getApplicationContext(), "Trackpad Enabled");
if(fitToScreen) if (fitToScreen)
onFitToScreen(); onFitToScreen();
else else
onNormalScreen(); onNormalScreen();
calibration(); calibration();
invalidateOptionsMenu(); invalidateOptionsMenu();
}catch (Exception ex){ } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
@ -529,15 +533,15 @@ public class MainSDLActivity extends SDLActivity {
alertDialog.setTitle("Desktop Mode"); alertDialog.setTitle("Desktop Mode");
LinearLayout mLayout = new LinearLayout(this); LinearLayout mLayout = new LinearLayout(this);
mLayout.setPadding(20,20,20,20); mLayout.setPadding(20, 20, 20, 20);
mLayout.setOrientation(LinearLayout.VERTICAL); mLayout.setOrientation(LinearLayout.VERTICAL);
TextView textView = new TextView(activity); TextView textView = new TextView(activity);
textView.setVisibility(View.VISIBLE); textView.setVisibility(View.VISIBLE);
String desktopInstructions = this.getString(R.string.desktopInstructions); String desktopInstructions = this.getString(R.string.desktopInstructions);
if(!checkVMResolutionFits()){ if (!checkVMResolutionFits()) {
String resolutionWarning = "Warning: MainActivity.vmexecutor resolution " String resolutionWarning = "Warning: MainActivity.vmexecutor resolution "
+ vm_width+ "x" + vm_height + + vm_width + "x" + vm_height +
" is too high for Desktop Mode. " + " is too high for Desktop Mode. " +
"Scaling will be used and Mouse Alignment will not be accurate. " + "Scaling will be used and Mouse Alignment will not be accurate. " +
"Reduce display resolution within the Guest OS for better experience.\n\n"; "Reduce display resolution within the Guest OS for better experience.\n\n";
@ -584,13 +588,13 @@ public class MainSDLActivity extends SDLActivity {
Config.mouseMode = Config.MouseMode.External; Config.mouseMode = Config.MouseMode.External;
MainSettingsManager.setDesktopMode(this, true); MainSettingsManager.setDesktopMode(this, true);
MainActivity.vmexecutor.setRelativeMouseMode(0); MainActivity.vmexecutor.setRelativeMouseMode(0);
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(MainSDLActivity.this, "External Mouse Enabled"); UIUtils.toastShort(MainSDLActivity.this, "External Mouse Enabled");
onNormalScreen(); onNormalScreen();
calibration(); calibration();
invalidateOptionsMenu(); invalidateOptionsMenu();
}catch (Exception ex){ } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
} }
@ -623,7 +627,7 @@ public class MainSDLActivity extends SDLActivity {
Log.d(TAG, "onStretchToScreen"); Log.d(TAG, "onStretchToScreen");
screenMode = SDLScreenMode.Fullscreen; screenMode = SDLScreenMode.Fullscreen;
sendCtrlAltKey(KeyEvent.KEYCODE_F); // not working sendCtrlAltKey(KeyEvent.KEYCODE_F); // not working
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(activity, "Resizing, Please Wait"); UIUtils.toastShort(activity, "Resizing, Please Wait");
resize(null); resize(null);
@ -643,14 +647,14 @@ public class MainSDLActivity extends SDLActivity {
public void run() { public void run() {
Log.d(TAG, "onFitToScreen"); Log.d(TAG, "onFitToScreen");
screenMode = SDLScreenMode.FitToScreen; screenMode = SDLScreenMode.FitToScreen;
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(activity, "Resizing, Please Wait"); UIUtils.toastShort(activity, "Resizing, Please Wait");
resize(null); resize(null);
} }
}).start(); }).start();
}catch (Exception ex){ } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
@ -667,14 +671,14 @@ public class MainSDLActivity extends SDLActivity {
public void run() { public void run() {
Log.d(TAG, "onNormalScreen"); Log.d(TAG, "onNormalScreen");
screenMode = SDLScreenMode.Normal; screenMode = SDLScreenMode.Normal;
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(activity, "Resizing, Please Wait"); UIUtils.toastShort(activity, "Resizing, Please Wait");
resize(null); resize(null);
} }
}).start(); }).start();
}catch (Exception ex){ } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
@ -751,7 +755,7 @@ public class MainSDLActivity extends SDLActivity {
int maxMenuItemsShown = 4; int maxMenuItemsShown = 4;
int actionShow = MenuItemCompat.SHOW_AS_ACTION_IF_ROOM; int actionShow = MenuItemCompat.SHOW_AS_ACTION_IF_ROOM;
if(UIUtils.isLandscapeOrientation(this)) { if (UIUtils.isLandscapeOrientation(this)) {
maxMenuItemsShown = 6; maxMenuItemsShown = 6;
actionShow = MenuItemCompat.SHOW_AS_ACTION_ALWAYS; actionShow = MenuItemCompat.SHOW_AS_ACTION_ALWAYS;
} }
@ -782,13 +786,12 @@ public class MainSDLActivity extends SDLActivity {
maxMenuItemsShown--; maxMenuItemsShown--;
} }
if (soundcard==null || soundcard.equals("None")) { if (soundcard == null || soundcard.equals("None")) {
menu.removeItem(menu.findItem(R.id.itemVolume).getItemId()); menu.removeItem(menu.findItem(R.id.itemVolume).getItemId());
maxMenuItemsShown--; maxMenuItemsShown--;
} }
for (int i = 0; i < menu.size() && i < maxMenuItemsShown; i++) { for (int i = 0; i < menu.size() && i < maxMenuItemsShown; i++) {
MenuItemCompat.setShowAsAction(menu.getItem(i), actionShow); MenuItemCompat.setShowAsAction(menu.getItem(i), actionShow);
} }
@ -825,12 +828,12 @@ public class MainSDLActivity extends SDLActivity {
if (event.getAction() == KeyEvent.ACTION_MULTIPLE && event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE && event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) {
sendText(event.getCharacters().toString()); sendText(event.getCharacters().toString());
return true; return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { } else /*if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
this.onBackPressed(); this.onBackPressed();
return true; return true;
} if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { }*/ if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
// We emulate right click with volume down // We emulate right click with volume down
if(event.getAction() == KeyEvent.ACTION_DOWN) { if (event.getAction() == KeyEvent.ACTION_DOWN) {
MotionEvent e = MotionEvent.obtain(1000, 1000, MotionEvent.ACTION_DOWN, 0, 0, 0, 0, 0, 0, 0, MotionEvent e = MotionEvent.obtain(1000, 1000, MotionEvent.ACTION_DOWN, 0, 0, 0, 0, 0, 0, 0,
InputDevice.SOURCE_TOUCHSCREEN, 0); InputDevice.SOURCE_TOUCHSCREEN, 0);
rightClick(e, 0); rightClick(e, 0);
@ -838,7 +841,7 @@ public class MainSDLActivity extends SDLActivity {
return true; return true;
} else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) { } else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
// We emulate middle click with volume up // We emulate middle click with volume up
if(event.getAction() == KeyEvent.ACTION_DOWN) { if (event.getAction() == KeyEvent.ACTION_DOWN) {
MotionEvent e = MotionEvent.obtain(1000, 1000, MotionEvent.ACTION_DOWN, 0, 0, 0, 0, 0, 0, 0, MotionEvent e = MotionEvent.obtain(1000, 1000, MotionEvent.ACTION_DOWN, 0, 0, 0, 0, 0, 0, 0,
InputDevice.SOURCE_TOUCHSCREEN, 0); InputDevice.SOURCE_TOUCHSCREEN, 0);
middleClick(e, 0); middleClick(e, 0);
@ -880,6 +883,7 @@ public class MainSDLActivity extends SDLActivity {
private TimerTask t; private TimerTask t;
public boolean ctrlClicked = false; public boolean ctrlClicked = false;
public boolean altClicked = false; public boolean altClicked = false;
// Setup // Setup
@SuppressLint("UseCompatLoadingForDrawables") @SuppressLint("UseCompatLoadingForDrawables")
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -936,7 +940,10 @@ public class MainSDLActivity extends SDLActivity {
btnLogs.setOnClickListener(new View.OnClickListener() { btnLogs.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
FileUtils.viewVectrasLog(activity); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Create and show the dialog.
LoggerDialogFragment newFragment = new LoggerDialogFragment();
newFragment.show(ft, "Logger");
} }
}); });
shutdownBtn.setOnClickListener(new View.OnClickListener() { shutdownBtn.setOnClickListener(new View.OnClickListener() {
@ -1132,6 +1139,21 @@ public class MainSDLActivity extends SDLActivity {
} }
} }
});*/ });*/
ImageButton hideBtn = findViewById(R.id.visibilityButton);
hideBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FrameLayout l = findViewById(R.id.mainControl);
if (l.getVisibility() == View.VISIBLE) {
l.setVisibility(View.GONE);
hideBtn.setImageResource(R.drawable.round_visibility_24);
} else {
l.setVisibility(View.VISIBLE);
hideBtn.setImageResource(R.drawable.round_visibility_off_24);
}
}
});
} }
private void createUI(int w, int h) { private void createUI(int w, int h) {
@ -1194,7 +1216,7 @@ public class MainSDLActivity extends SDLActivity {
} }
public LinearLayout createVolumePanel() { public LinearLayout createVolumePanel() {
LinearLayout layout = new LinearLayout (this); LinearLayout layout = new LinearLayout(this);
layout.setPadding(20, 20, 20, 20); layout.setPadding(20, 20, 20, 20);
LinearLayout.LayoutParams volparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams volparams = new LinearLayout.LayoutParams(
@ -1277,7 +1299,7 @@ public class MainSDLActivity extends SDLActivity {
file.delete(); file.delete();
} }
} }
if(Config.showToast) if (Config.showToast)
UIUtils.toastShort(getApplicationContext(), "Please wait while saving VM State"); UIUtils.toastShort(getApplicationContext(), "Please wait while saving VM State");
MainActivity.vmexecutor.current_fd = MainActivity.vmexecutor.get_fd(MainActivity.vmexecutor.save_state_name); MainActivity.vmexecutor.current_fd = MainActivity.vmexecutor.get_fd(MainActivity.vmexecutor.save_state_name);
@ -1309,8 +1331,8 @@ public class MainSDLActivity extends SDLActivity {
try { try {
JSONObject object = new JSONObject(response); JSONObject object = new JSONObject(response);
errorStr = object.getString("error"); errorStr = object.getString("error");
}catch (Exception ex) { } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
if (errorStr != null) { if (errorStr != null) {
@ -1319,8 +1341,8 @@ public class MainSDLActivity extends SDLActivity {
try { try {
JSONObject descObj = new JSONObject(errorStr); JSONObject descObj = new JSONObject(errorStr);
descStr = descObj.getString("desc"); descStr = descObj.getString("desc");
}catch (Exception ex) { } catch (Exception ex) {
if(Config.debug) if (Config.debug)
ex.printStackTrace(); ex.printStackTrace();
} }
final String descStr1 = descStr; final String descStr1 = descStr;
@ -1353,7 +1375,7 @@ public class MainSDLActivity extends SDLActivity {
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
boolean res = false; boolean res = false;
if(Config.mouseMode == Config.MouseMode.External){ if (Config.mouseMode == Config.MouseMode.External) {
return res; return res;
} }
//TODO: //TODO:
@ -1363,7 +1385,7 @@ public class MainSDLActivity extends SDLActivity {
} }
private void resumeVM() { private void resumeVM() {
if(MainActivity.vmexecutor == null){ if (MainActivity.vmexecutor == null) {
return; return;
} }
Thread t = new Thread(new Runnable() { Thread t = new Thread(new Runnable() {
@ -1382,7 +1404,7 @@ public class MainSDLActivity extends SDLActivity {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
if(Config.mouseMode == Config.MouseMode.External) if (Config.mouseMode == Config.MouseMode.External)
setUIModeDesktop(); setUIModeDesktop();
else else
setUIModeMobile(screenMode == SDLScreenMode.FitToScreen); setUIModeMobile(screenMode == SDLScreenMode.FitToScreen);
@ -1395,13 +1417,6 @@ public class MainSDLActivity extends SDLActivity {
} }
public void onBackPressed() {
super.onBackPressed();
UIUtils.hideKeyboard(this, mSurface);
Machine.stopVM(activity);
return;
}
@Override @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
@ -1446,7 +1461,7 @@ public class MainSDLActivity extends SDLActivity {
LinearLayout buttonsLayout = new LinearLayout(this); LinearLayout buttonsLayout = new LinearLayout(this);
buttonsLayout.setOrientation(LinearLayout.HORIZONTAL); buttonsLayout.setOrientation(LinearLayout.HORIZONTAL);
buttonsLayout.setGravity(Gravity.CENTER_HORIZONTAL); buttonsLayout.setGravity(Gravity.CENTER_HORIZONTAL);
Button displayMode = new Button (this); Button displayMode = new Button(this);
displayMode.setText("Display Mode"); displayMode.setText("Display Mode");
displayMode.setOnClickListener(new View.OnClickListener() { displayMode.setOnClickListener(new View.OnClickListener() {
@ -1458,7 +1473,7 @@ public class MainSDLActivity extends SDLActivity {
layout.addView(buttonsLayout); layout.addView(buttonsLayout);
final TextView value = new TextView(this); final TextView value = new TextView(this);
value.setText("Idle Refresh Rate: " + currRate+" Hz"); value.setText("Idle Refresh Rate: " + currRate + " Hz");
layout.addView(value); layout.addView(value);
value.setLayoutParams(params); value.setLayoutParams(params);
@ -1471,7 +1486,7 @@ public class MainSDLActivity extends SDLActivity {
((SeekBar) rate).setOnSeekBarChangeListener(new OnSeekBarChangeListener() { ((SeekBar) rate).setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar s, int progress, boolean touch) { public void onProgressChanged(SeekBar s, int progress, boolean touch) {
value.setText("Idle Refresh Rate: " + (progress+1)+" Hz"); value.setText("Idle Refresh Rate: " + (progress + 1) + " Hz");
} }
public void onStartTrackingTouch(SeekBar arg0) { public void onStartTrackingTouch(SeekBar arg0) {
@ -1479,7 +1494,7 @@ public class MainSDLActivity extends SDLActivity {
} }
public void onStopTrackingTouch(SeekBar arg0) { public void onStopTrackingTouch(SeekBar arg0) {
int progress = arg0.getProgress()+1; int progress = arg0.getProgress() + 1;
int refreshMs = 1000 / progress; int refreshMs = 1000 / progress;
Log.v(TAG, "Changing idle refresh rate: (ms)" + refreshMs); Log.v(TAG, "Changing idle refresh rate: (ms)" + refreshMs);
MainActivity.vmexecutor.setsdlrefreshrate(refreshMs); MainActivity.vmexecutor.setsdlrefreshrate(refreshMs);
@ -1498,18 +1513,17 @@ public class MainSDLActivity extends SDLActivity {
} }
private void onDisplayMode() { private void onDisplayMode() {
String [] items = { String[] items = {
"Normal (One-To-One)", "Normal (One-To-One)",
"Fit To Screen" "Fit To Screen"
// ,"Stretch To Screen" //Stretched // ,"Stretch To Screen" //Stretched
}; };
int currentScaleType = 0; int currentScaleType = 0;
if(screenMode == SDLScreenMode.FitToScreen){ if (screenMode == SDLScreenMode.FitToScreen) {
currentScaleType = 1; currentScaleType = 1;
} else if(screenMode == SDLScreenMode.Fullscreen) } else if (screenMode == SDLScreenMode.Fullscreen)
currentScaleType = 2; currentScaleType = 2;
final AlertDialog.Builder mBuilder = new AlertDialog.Builder(this); final AlertDialog.Builder mBuilder = new AlertDialog.Builder(this);
@ -1517,12 +1531,12 @@ public class MainSDLActivity extends SDLActivity {
mBuilder.setSingleChoiceItems(items, currentScaleType, new DialogInterface.OnClickListener() { mBuilder.setSingleChoiceItems(items, currentScaleType, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int i) { public void onClick(DialogInterface dialog, int i) {
switch(i){ switch (i) {
case 0: case 0:
onNormalScreen(); onNormalScreen();
break; break;
case 1: case 1:
if(Config.mouseMode == Config.MouseMode.External){ if (Config.mouseMode == Config.MouseMode.External) {
UIUtils.toastShort(MainSDLActivity.this, "Fit to Screen Disabled under Desktop Mode"); UIUtils.toastShort(MainSDLActivity.this, "Fit to Screen Disabled under Desktop Mode");
dialog.dismiss(); dialog.dismiss();
return; return;
@ -1530,7 +1544,7 @@ public class MainSDLActivity extends SDLActivity {
onFitToScreen(); onFitToScreen();
break; break;
case 2: case 2:
if(Config.mouseMode == Config.MouseMode.External){ if (Config.mouseMode == Config.MouseMode.External) {
UIUtils.toastShort(MainSDLActivity.this, "Stretch Screen Disabled under Desktop Mode"); UIUtils.toastShort(MainSDLActivity.this, "Stretch Screen Disabled under Desktop Mode");
dialog.dismiss(); dialog.dismiss();
return; return;
@ -1550,7 +1564,7 @@ public class MainSDLActivity extends SDLActivity {
@Override @Override
protected synchronized void runSDLMain(){ protected synchronized void runSDLMain() {
//We go through the vm executor //We go through the vm executor
MainActivity.startvm(this, Config.UI_SDL); MainActivity.startvm(this, Config.UI_SDL);
@ -1563,11 +1577,10 @@ public class MainSDLActivity extends SDLActivity {
} }
} }
public static void onVMResolutionChanged(int w, int h) public static void onVMResolutionChanged(int w, int h) {
{
boolean refreshDisplay = false; boolean refreshDisplay = false;
if(w!=vm_width || h!=vm_height) if (w != vm_width || h != vm_height)
refreshDisplay = true; refreshDisplay = true;
vm_width = w; vm_width = w;
vm_height = h; vm_height = h;
@ -1575,7 +1588,7 @@ public class MainSDLActivity extends SDLActivity {
Log.v(TAG, "VM resolution changed to " + vm_width + "x" + vm_height); Log.v(TAG, "VM resolution changed to " + vm_width + "x" + vm_height);
if(refreshDisplay) { if (refreshDisplay) {
activity.resize(null); activity.resize(null);
} }
@ -1594,13 +1607,13 @@ public class MainSDLActivity extends SDLActivity {
private void setLayout(Configuration newConfig) { private void setLayout(Configuration newConfig) {
boolean isLanscape = boolean isLanscape =
(newConfig!=null && newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) (newConfig != null && newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
|| UIUtils.isLandscapeOrientation(this); || UIUtils.isLandscapeOrientation(this);
View vnc_canvas_layout = (View) this.findViewById(R.id.sdl_layout); View vnc_canvas_layout = (View) this.findViewById(R.id.sdl_layout);
RelativeLayout.LayoutParams vnc_canvas_layout_params = null; RelativeLayout.LayoutParams vnc_canvas_layout_params = null;
//normal 1-1 //normal 1-1
if(screenMode == SDLScreenMode.Normal) { if (screenMode == SDLScreenMode.Normal) {
if (isLanscape) { if (isLanscape) {
vnc_canvas_layout_params = new RelativeLayout.LayoutParams( vnc_canvas_layout_params = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,
@ -1674,23 +1687,22 @@ public class MainSDLActivity extends SDLActivity {
@Override @Override
public void run() { public void run() {
if(Config.mouseMode == Config.MouseMode.External) if (Config.mouseMode == Config.MouseMode.External)
setUIModeDesktop(); setUIModeDesktop();
else else
setUIModeMobile(screenMode == SDLScreenMode.FitToScreen); setUIModeMobile(screenMode == SDLScreenMode.FitToScreen);
} }
},1000); }, 1000);
} }
@Override @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
Log.d(TAG,"Configuration changed"); Log.d(TAG, "Configuration changed");
resize(newConfig); resize(newConfig);
} }
public synchronized void doResize(boolean reverse, final Configuration newConfig) { public synchronized void doResize(boolean reverse, final Configuration newConfig) {
//XXX: notify the UI not to process mouse motion //XXX: notify the UI not to process mouse motion
isResizing = true; isResizing = true;
@ -1706,18 +1718,18 @@ public class MainSDLActivity extends SDLActivity {
final ActionBar bar = ((SDLActivity) activity).getSupportActionBar(); final ActionBar bar = ((SDLActivity) activity).getSupportActionBar();
if(MainSDLActivity.mLayout != null) { if (MainSDLActivity.mLayout != null) {
width = MainSDLActivity.mLayout.getWidth(); width = MainSDLActivity.mLayout.getWidth();
height = MainSDLActivity.mLayout.getHeight(); height = MainSDLActivity.mLayout.getHeight();
} }
//native resolution for use with external mouse //native resolution for use with external mouse
if(screenMode != SDLScreenMode.Fullscreen && screenMode != SDLScreenMode.FitToScreen) { if (screenMode != SDLScreenMode.Fullscreen && screenMode != SDLScreenMode.FitToScreen) {
width = MainSDLActivity.vm_width; width = MainSDLActivity.vm_width;
height = MainSDLActivity.vm_height; height = MainSDLActivity.vm_height;
} }
if(reverse){ if (reverse) {
int temp = width; int temp = width;
width = height; width = height;
height = temp; height = temp;
@ -1727,13 +1739,13 @@ public class MainSDLActivity extends SDLActivity {
.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; .getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
if (portrait) { if (portrait) {
if(Config.mouseMode != Config.MouseMode.External) { if (Config.mouseMode != Config.MouseMode.External) {
int height_n = (int) (width / (MainSDLActivity.vm_width / (float) MainSDLActivity.vm_height)); int height_n = (int) (width / (MainSDLActivity.vm_width / (float) MainSDLActivity.vm_height));
Log.d(TAG, "Resizing portrait: " + width + " x " + height_n); Log.d(TAG, "Resizing portrait: " + width + " x " + height_n);
getHolder().setFixedSize(width, height_n); getHolder().setFixedSize(width, height_n);
} }
} else { } else {
if ( (screenMode == SDLScreenMode.Fullscreen || screenMode == SDLScreenMode.FitToScreen) if ((screenMode == SDLScreenMode.Fullscreen || screenMode == SDLScreenMode.FitToScreen)
&& !MainSettingsManager.getAlwaysShowMenuToolbar(MainSDLActivity.this) && !MainSettingsManager.getAlwaysShowMenuToolbar(MainSDLActivity.this)
&& bar != null && bar.isShowing()) { && bar != null && bar.isShowing()) {
height += bar.getHeight(); height += bar.getHeight();
@ -1751,7 +1763,6 @@ public class MainSDLActivity extends SDLActivity {
}, 1000); }, 1000);
} }
// XXX: SDL is missing some key codes in sdl2-keymap.h // XXX: SDL is missing some key codes in sdl2-keymap.h
@ -1818,14 +1829,14 @@ public class MainSDLActivity extends SDLActivity {
float y = event.getY(0); float y = event.getY(0);
float p = event.getPressure(0); float p = event.getPressure(0);
int relative = Config.mouseMode == Config.MouseMode.External? 0: 1; int relative = Config.mouseMode == Config.MouseMode.External ? 0 : 1;
int sdlMouseButton = 0; int sdlMouseButton = 0;
if(event.getButtonState() == MotionEvent.BUTTON_PRIMARY) if (event.getButtonState() == MotionEvent.BUTTON_PRIMARY)
sdlMouseButton = Config.SDL_MOUSE_LEFT; sdlMouseButton = Config.SDL_MOUSE_LEFT;
else if(event.getButtonState() == MotionEvent.BUTTON_SECONDARY) else if (event.getButtonState() == MotionEvent.BUTTON_SECONDARY)
sdlMouseButton = Config.SDL_MOUSE_RIGHT; sdlMouseButton = Config.SDL_MOUSE_RIGHT;
else if(event.getButtonState() == MotionEvent.BUTTON_TERTIARY) else if (event.getButtonState() == MotionEvent.BUTTON_TERTIARY)
sdlMouseButton = Config.SDL_MOUSE_MIDDLE; sdlMouseButton = Config.SDL_MOUSE_MIDDLE;
@ -1837,13 +1848,13 @@ public class MainSDLActivity extends SDLActivity {
mouseUp = false; mouseUp = false;
} }
if (action == MotionEvent.ACTION_MOVE) { if (action == MotionEvent.ACTION_MOVE) {
if(Config.mouseMode == Config.MouseMode.External) { if (Config.mouseMode == Config.MouseMode.External) {
//Log.d("SDL", "onTouch Absolute Move by=" + action + ", X,Y=" + (x) + "," + (y) + " P=" + p); //Log.d("SDL", "onTouch Absolute Move by=" + action + ", X,Y=" + (x) + "," + (y) + " P=" + p);
MainActivity.vmexecutor.onVectrasMouse(0, MotionEvent.ACTION_MOVE,0, x , y ); MainActivity.vmexecutor.onVectrasMouse(0, MotionEvent.ACTION_MOVE, 0, x, y);
}else { } else {
//Log.d("SDL", "onTouch Relative Moving by=" + action + ", X,Y=" + (x - //Log.d("SDL", "onTouch Relative Moving by=" + action + ", X,Y=" + (x -
// old_x) + "," + (y - old_y) + " P=" + p); // old_x) + "," + (y - old_y) + " P=" + p);
MainActivity.vmexecutor.onVectrasMouse(0, MotionEvent.ACTION_MOVE,1, (x - old_x) * sensitivity_mult, (y - old_y) * sensitivity_mult); MainActivity.vmexecutor.onVectrasMouse(0, MotionEvent.ACTION_MOVE, 1, (x - old_x) * sensitivity_mult, (y - old_y) * sensitivity_mult);
} }
} }
@ -1851,13 +1862,12 @@ public class MainSDLActivity extends SDLActivity {
old_x = x; old_x = x;
old_y = y; old_y = y;
} } else if (event.getAction() == event.ACTION_UP) {
else if (event.getAction() == event.ACTION_UP ) {
//Log.d("SDL", "onTouch Up: " + sdlMouseButton); //Log.d("SDL", "onTouch Up: " + sdlMouseButton);
//XXX: it seems that the Button state is not available when Button up so //XXX: it seems that the Button state is not available when Button up so
// we should release all mouse buttons to be safe since we don't know which one fired the event // we should release all mouse buttons to be safe since we don't know which one fired the event
if(sdlMouseButton == Config.SDL_MOUSE_MIDDLE if (sdlMouseButton == Config.SDL_MOUSE_MIDDLE
||sdlMouseButton == Config.SDL_MOUSE_RIGHT || sdlMouseButton == Config.SDL_MOUSE_RIGHT
) { ) {
MainActivity.vmexecutor.onVectrasMouse(sdlMouseButton, MotionEvent.ACTION_UP, relative, x, y); MainActivity.vmexecutor.onVectrasMouse(sdlMouseButton, MotionEvent.ACTION_UP, relative, x, y);
} else if (sdlMouseButton != 0) { } else if (sdlMouseButton != 0) {
@ -1866,11 +1876,11 @@ public class MainSDLActivity extends SDLActivity {
//Or only the last one pressed //Or only the last one pressed
if (lastMouseButtonDown > 0) { if (lastMouseButtonDown > 0) {
if(lastMouseButtonDown == Config.SDL_MOUSE_MIDDLE if (lastMouseButtonDown == Config.SDL_MOUSE_MIDDLE
||lastMouseButtonDown == Config.SDL_MOUSE_RIGHT || lastMouseButtonDown == Config.SDL_MOUSE_RIGHT
) { ) {
MainActivity.vmexecutor.onVectrasMouse(lastMouseButtonDown, MotionEvent.ACTION_UP, relative,x, y); MainActivity.vmexecutor.onVectrasMouse(lastMouseButtonDown, MotionEvent.ACTION_UP, relative, x, y);
}else } else
MainActivity.vmexecutor.onVectrasMouse(lastMouseButtonDown, MotionEvent.ACTION_UP, relative, x, y); MainActivity.vmexecutor.onVectrasMouse(lastMouseButtonDown, MotionEvent.ACTION_UP, relative, x, y);
} else { } else {
//ALl buttons //ALl buttons
@ -1885,13 +1895,12 @@ public class MainSDLActivity extends SDLActivity {
} }
lastMouseButtonDown = -1; lastMouseButtonDown = -1;
mouseUp = true; mouseUp = true;
} } else if (event.getAction() == event.ACTION_DOWN
else if (event.getAction() == event.ACTION_DOWN
&& Config.mouseMode == Config.MouseMode.External && Config.mouseMode == Config.MouseMode.External
) { ) {
//XXX: Some touch events for touchscreen mode are primary so we force left mouse button //XXX: Some touch events for touchscreen mode are primary so we force left mouse button
if(sdlMouseButton == 0 && MotionEvent.TOOL_TYPE_FINGER == event.getToolType(0)) { if (sdlMouseButton == 0 && MotionEvent.TOOL_TYPE_FINGER == event.getToolType(0)) {
sdlMouseButton = Config.SDL_MOUSE_LEFT; sdlMouseButton = Config.SDL_MOUSE_LEFT;
} }
@ -1903,8 +1912,8 @@ public class MainSDLActivity extends SDLActivity {
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
boolean res = false; boolean res = false;
if(Config.mouseMode == Config.MouseMode.External){ if (Config.mouseMode == Config.MouseMode.External) {
res = onTouchProcess(v,event); res = onTouchProcess(v, event);
res = onTouchEventProcess(event); res = onTouchEventProcess(event);
} }
return res; return res;
@ -1949,13 +1958,13 @@ public class MainSDLActivity extends SDLActivity {
} }
public void setVolume(int volume) { public void setVolume(int volume) {
if(am!=null) if (am != null)
am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
} }
protected int getCurrentVolume() { protected int getCurrentVolume() {
int volumeTmp = 0; int volumeTmp = 0;
if(am!=null) if (am != null)
volumeTmp = am.getStreamVolume(AudioManager.STREAM_MUSIC); volumeTmp = am.getStreamVolume(AudioManager.STREAM_MUSIC);
return volumeTmp; return volumeTmp;
} }
@ -1989,13 +1998,13 @@ public class MainSDLActivity extends SDLActivity {
Thread t = new Thread(new Runnable() { Thread t = new Thread(new Runnable() {
public void run() { public void run() {
Log.d("SDL", "Mouse Middle Click"); Log.d("SDL", "Mouse Middle Click");
MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_MIDDLE, MotionEvent.ACTION_DOWN, 1,-1, -1); MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_MIDDLE, MotionEvent.ACTION_DOWN, 1, -1, -1);
try { try {
Thread.sleep(100); Thread.sleep(100);
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
// Log.v("SDLSurface", "Interrupted: " + ex); // Log.v("SDLSurface", "Interrupted: " + ex);
} }
MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_MIDDLE, MotionEvent.ACTION_UP, 1,-1, -1); MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_MIDDLE, MotionEvent.ACTION_UP, 1, -1, -1);
} }
}); });
t.start(); t.start();
@ -2015,7 +2024,7 @@ public class MainSDLActivity extends SDLActivity {
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
// Log.v("doubletap", "Could not sleep"); // Log.v("doubletap", "Could not sleep");
} }
MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_LEFT, MotionEvent.ACTION_UP, 1,0, 0); MainActivity.vmexecutor.onVectrasMouse(Config.SDL_MOUSE_LEFT, MotionEvent.ACTION_UP, 1, 0, 0);
try { try {
Thread.sleep(50); Thread.sleep(50);
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
@ -2036,7 +2045,6 @@ public class MainSDLActivity extends SDLActivity {
private boolean firstTouch = false; private boolean firstTouch = false;
private class GestureListener extends GestureDetector.SimpleOnGestureListener { private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override @Override
@ -2051,10 +2059,10 @@ public class MainSDLActivity extends SDLActivity {
// Log.d("SDL", "Long Press Action=" + event.getAction() + ", X,Y=" // Log.d("SDL", "Long Press Action=" + event.getAction() + ", X,Y="
// + event.getX() + "," + event.getY() + " P=" // + event.getX() + "," + event.getY() + " P="
// + event.getPressure()); // + event.getPressure());
if(Config.mouseMode == Config.MouseMode.External) if (Config.mouseMode == Config.MouseMode.External)
return; return;
if(Config.enableDragOnLongPress) if (Config.enableDragOnLongPress)
dragPointer(event); dragPointer(event);
} }
@ -2062,7 +2070,7 @@ public class MainSDLActivity extends SDLActivity {
float x1 = event.getX(); float x1 = event.getX();
float y1 = event.getY(); float y1 = event.getY();
if(Config.mouseMode == Config.MouseMode.External) if (Config.mouseMode == Config.MouseMode.External)
return true; return true;
// Log.d("onSingleTapConfirmed", "Tapped at: (" + x1 + "," + y1 + // Log.d("onSingleTapConfirmed", "Tapped at: (" + x1 + "," + y1 +
@ -2090,12 +2098,12 @@ public class MainSDLActivity extends SDLActivity {
public boolean onDoubleTap(MotionEvent event) { public boolean onDoubleTap(MotionEvent event) {
// Log.d("onDoubleTap", "Tapped at: (" + event.getX() + "," + event.getY() + ")"); // Log.d("onDoubleTap", "Tapped at: (" + event.getX() + "," + event.getY() + ")");
if(Config.mouseMode == Config.MouseMode.External if (Config.mouseMode == Config.MouseMode.External
//&& MotionEvent.TOOL_TYPE_MOUSE == event.getToolType(0) //&& MotionEvent.TOOL_TYPE_MOUSE == event.getToolType(0)
) )
return true; return true;
if(!Config.enableDragOnLongPress) if (!Config.enableDragOnLongPress)
processDoubleTap(event); processDoubleTap(event);
else else
doubleClick(event, 0); doubleClick(event, 0);
@ -2152,7 +2160,7 @@ public class MainSDLActivity extends SDLActivity {
return true; return true;
case InputDevice.SOURCE_MOUSE: case InputDevice.SOURCE_MOUSE:
if(Config.mouseMode == Config.MouseMode.Trackpad) if (Config.mouseMode == Config.MouseMode.Trackpad)
break; break;
action = event.getActionMasked(); action = event.getActionMasked();
@ -2166,7 +2174,7 @@ public class MainSDLActivity extends SDLActivity {
return true; return true;
case MotionEvent.ACTION_HOVER_MOVE: case MotionEvent.ACTION_HOVER_MOVE:
if(Config.processMouseHistoricalEvents) { if (Config.processMouseHistoricalEvents) {
final int historySize = event.getHistorySize(); final int historySize = event.getHistorySize();
for (int h = 0; h < historySize; h++) { for (int h = 0; h < historySize; h++) {
float ex = event.getHistoricalX(h); float ex = event.getHistoricalX(h);
@ -2197,11 +2205,10 @@ public class MainSDLActivity extends SDLActivity {
return false; return false;
} }
private void processHoverMouse(float x,float y,float p, int action) { private void processHoverMouse(float x, float y, float p, int action) {
if (Config.mouseMode == Config.MouseMode.External) {
if(Config.mouseMode == Config.MouseMode.External) {
//Log.d("SDL", "Mouse Hover: " + x + "," + y); //Log.d("SDL", "Mouse Hover: " + x + "," + y);
MainActivity.vmexecutor.onVectrasMouse(0, action, 0, x, y); MainActivity.vmexecutor.onVectrasMouse(0, action, 0, x, y);
} }

View file

@ -39,6 +39,7 @@ import android.view.MenuItem;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.preference.Preference; import androidx.preference.Preference;
@ -47,8 +48,10 @@ import androidx.preference.PreferenceFragmentCompat;
import com.vectras.vm.R; import com.vectras.vm.R;
import com.vectras.vm.SplashActivity; import com.vectras.vm.SplashActivity;
import com.vectras.vm.VectrasApp;
import java.util.List; import java.util.List;
import java.util.Objects;
public class MainSettingsManager extends AppCompatActivity public class MainSettingsManager extends AppCompatActivity
implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@ -204,19 +207,13 @@ public class MainSettingsManager extends AppCompatActivity
} }
private void onNightMode() { private void onNightMode() {
mHandler.postDelayed(new Runnable() { if (MainSettingsManager.getModeNight(activity)) {
@Override AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
public void run() { VectrasApp.getApp().setTheme(R.style.AppTheme);
Intent startActivity = new Intent(getContext(), SplashActivity.class); } else {
int pendingIntentId = 123456; AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); VectrasApp.getApp().setTheme(R.style.AppTheme);
}
AlarmManager mgr = (AlarmManager) MainSettingsManager.activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
} }
@Override @Override
@ -252,8 +249,89 @@ public class MainSettingsManager extends AppCompatActivity
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (SDK_INT > 33) if (SDK_INT > 33)
findPreference("sharedFolder").setEnabled(false);/* findPreference("sharedFolder").setEnabled(false);
Preference pref = findPreference("customMemory");
mHandler = new Handler();
Preference pref = findPreference("vmArch");
if (pref != null) {
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(@NonNull Preference preference,
Object newValue) {
onArch();
return true;
}
});
}
Preference pref2 = findPreference("kvm");
if (pref2 != null) {
pref2.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(@NonNull Preference preference,
Object newValue) {
onKvm();
return true;
}
private void onKvm() {
if (getKvm(activity))
setMTTCG(activity, true);
else
setMTTCG(activity, false);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent startActivity = new Intent(getContext(), SplashActivity.class);
int pendingIntentId = 123456;
PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
AlarmManager mgr = (AlarmManager) MainSettingsManager.activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
}
});
}
Preference pref3 = findPreference("MTTCG");
if (pref3 != null) {
pref3.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(@NonNull Preference preference,
Object newValue) {
onMttcg();
return true;
}
private void onMttcg() {
if (getMTTCG(activity))
setKvm(activity, true);
else
setKvm(activity, false);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent startActivity = new Intent(getContext(), SplashActivity.class);
int pendingIntentId = 123456;
PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
AlarmManager mgr = (AlarmManager) MainSettingsManager.activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
}
});
}
/*Preference pref = findPreference("customMemory");
if (pref != null) { if (pref != null) {
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@ -305,6 +383,21 @@ public class MainSettingsManager extends AppCompatActivity
findPreference("sharedFolder").setEnabled(false); findPreference("sharedFolder").setEnabled(false);
} }
private void onArch() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent startActivity = new Intent(getContext(), SplashActivity.class);
int pendingIntentId = 123456;
PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
AlarmManager mgr = (AlarmManager) MainSettingsManager.activity.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, pendingIntent);
System.exit(0);
}
}, 300);
}
@Override @Override
public void onCreatePreferences(Bundle bundle, String root_key) { public void onCreatePreferences(Bundle bundle, String root_key) {
@ -316,7 +409,6 @@ public class MainSettingsManager extends AppCompatActivity
@Override @Override
public boolean onPreferenceChange(Preference pref, Object newValue) { public boolean onPreferenceChange(Preference pref, Object newValue) {
return true; return true;
} }
@ -672,7 +764,18 @@ public class MainSettingsManager extends AppCompatActivity
public static String getVmUi(Activity activity) { public static String getVmUi(Activity activity) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
return prefs.getString("vmUi", "VNC"); return prefs.getString("vmUi", "SDL");
}
public static void setSoundCard(Activity activity, String soundCard) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor edit = prefs.edit();
edit.putString("soundCard", soundCard);
edit.apply();
}
public static String getSoundCard(Activity activity) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
return prefs.getString("soundCard", "None");
} }
public static void setUsbTablet(Activity activity, boolean UsbTablet) { public static void setUsbTablet(Activity activity, boolean UsbTablet) {
@ -711,6 +814,30 @@ public class MainSettingsManager extends AppCompatActivity
return prefs.getBoolean("sharedFolder", false); return prefs.getBoolean("sharedFolder", false);
} }
public static void setArch(Activity activity, String vmArch) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor edit = prefs.edit();
edit.putString("vmArch", vmArch);
edit.apply();
}
public static String getArch(Activity activity) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
return prefs.getString("vmArch", "X86_64");
}
public static void setKvm(Activity activity, boolean kvm) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean("kvm", kvm);
edit.apply();
}
public static boolean getKvm(Activity activity) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
return prefs.getBoolean("kvm", false);
}
public static boolean isFirstLaunch(Activity activity) { public static boolean isFirstLaunch(Activity activity) {
PackageInfo pInfo = null; PackageInfo pInfo = null;

View file

@ -13,7 +13,9 @@ import androidx.fragment.app.FragmentTransaction;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -43,6 +45,7 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -55,6 +58,7 @@ import android.widget.TextView;
import com.vectras.qemu.utils.FileUtils; import com.vectras.qemu.utils.FileUtils;
import com.vectras.vm.Fragment.ControlersOptionsFragment; import com.vectras.vm.Fragment.ControlersOptionsFragment;
import com.vectras.vm.Fragment.LoggerDialogFragment;
import com.vectras.vm.MainActivity; import com.vectras.vm.MainActivity;
import com.vectras.vm.R; import com.vectras.vm.R;
import com.vectras.qemu.utils.Machine; import com.vectras.qemu.utils.Machine;
@ -133,7 +137,10 @@ public class MainVNCActivity extends VncCanvasActivity {
btnLogs.setOnClickListener(new View.OnClickListener() { btnLogs.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
FileUtils.viewVectrasLog(activity); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Create and show the dialog.
LoggerDialogFragment newFragment = new LoggerDialogFragment();
newFragment.show(ft, "Logger");
} }
}); });
shutdownBtn.setOnClickListener(new View.OnClickListener() { shutdownBtn.setOnClickListener(new View.OnClickListener() {
@ -331,6 +338,21 @@ public class MainVNCActivity extends VncCanvasActivity {
} }
} }
}); });
ImageButton hideBtn = findViewById(R.id.visibilityButton);
hideBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FrameLayout l = findViewById(R.id.mainControl);
if (l.getVisibility() == View.VISIBLE) {
l.setVisibility(View.GONE);
hideBtn.setImageResource(R.drawable.round_visibility_24);
} else {
l.setVisibility(View.VISIBLE);
hideBtn.setImageResource(R.drawable.round_visibility_off_24);
}
}
});
} }
private void keyDownUp(int keyEventCode) { private void keyDownUp(int keyEventCode) {
@ -1197,8 +1219,13 @@ public class MainVNCActivity extends VncCanvasActivity {
public void onBackPressed() { public void onBackPressed() {
super.onBackPressed(); super.onBackPressed();
Machine.stopVM(activity); FrameLayout l = findViewById(R.id.mainControl);
return; if (l != null) {
if (l.getVisibility() == View.VISIBLE) {
l.setVisibility(View.GONE);
} else
l.setVisibility(View.VISIBLE);
}
} }
public void onHideToolbar() { public void onHideToolbar() {

View file

@ -16,13 +16,16 @@ import com.vectras.qemu.utils.FileUtils;
import com.vectras.qemu.utils.Machine; import com.vectras.qemu.utils.Machine;
import com.vectras.qemu.utils.QmpClient; import com.vectras.qemu.utils.QmpClient;
import com.vectras.qemu.utils.RamInfo; import com.vectras.qemu.utils.RamInfo;
import com.vectras.vm.AppConfig;
import com.vectras.vm.MainActivity; import com.vectras.vm.MainActivity;
import com.vectras.vm.logger.VectrasStatus; import com.vectras.vm.logger.VectrasStatus;
import com.vectras.vm.utils.UIUtils; import com.vectras.vm.utils.UIUtils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -135,24 +138,53 @@ public class StartVM {
shared_folder_path = Config.sharedFolder; shared_folder_path = Config.sharedFolder;
//extra_params = Config.extra_params; //extra_params = Config.extra_params;
this.context = context; this.context = context;
this.libqemu = FileUtils.getNativeLibDir(context) + "/libqemu-system-x86_64.so"; if (Objects.equals(MainSettingsManager.getArch(MainActivity.activity), "ARM")) {
this.arch = "x86_64"; this.libqemu = FileUtils.getNativeLibDir(context) + "/libqemu-system-arm.so";
File libFile = new File(libqemu);
if (!libFile.exists()) {
this.libqemu = FileUtils.getNativeLibDir(context) + "/libqemu-system-aarch64.so";
libFile = new File(libqemu);
}
this.arch = "arm";
this.machine_type = "virt";
this.disablehpet = 0;
this.disableacpi = 0;
this.disabletsc = 0;
this.cpu = "cortex-a57";
} else if (Objects.equals(MainSettingsManager.getArch(MainActivity.activity), "X86_64")) {
this.libqemu = FileUtils.getNativeLibDir(context) + "/libqemu-system-x86_64.so";
this.arch = "x86_64";
this.machine_type = "pc";
this.cpu = "qemu64";
}
this.sound_card = MainSettingsManager.getSoundCard(MainActivity.activity);
this.cpuNum = MainSettingsManager.getCpuNum(MainActivity.activity); this.cpuNum = MainSettingsManager.getCpuNum(MainActivity.activity);
this.cpu = "qemu64";
if (MainSettingsManager.getMTTCG(MainActivity.activity))
this.enable_mttcg = 1;
else
this.enable_mttcg = 0;
this.vnc_allow_external = 0; this.vnc_allow_external = 0;
this.enablleAvx = MainSettingsManager.getAvx(MainActivity.activity); this.enablleAvx = MainSettingsManager.getAvx(MainActivity.activity);
this.tbSize = MainSettingsManager.getTbSize(MainActivity.activity); this.tbSize = MainSettingsManager.getTbSize(MainActivity.activity);
if (MainSettingsManager.getKvm(MainActivity.activity)) {
this.enablekvm = 1;
this.cpu = "host";
this.enable_mttcg = 0;
} else {
if (MainSettingsManager.getMTTCG(MainActivity.activity)) {
this.enable_mttcg = 1;
}
}
if (MainSettingsManager.getUsbTablet(MainActivity.activity)) if (MainSettingsManager.getUsbTablet(MainActivity.activity))
this.mouse = "usb-tablet"; this.mouse = "usb-tablet";
else else
this.mouse = "ps2"; this.mouse = "ps2";
if (new File(AppConfig.maindirpath + "/drive.iso").exists())
cd_iso_path = AppConfig.maindirpath + "/drive.iso";
else
cd_iso_path = null;
} }
public static void onVMResolutionChanged(int width, int height) { public static void onVMResolutionChanged(int width, int height) {

View file

@ -1,34 +1,47 @@
package com.vectras.vm; package com.vectras.vm;
import android.app.Activity;
import android.content.Context;
import android.os.Environment; import android.os.Environment;
import android.widget.ImageView.ScaleType; import android.widget.ImageView.ScaleType;
import com.vectras.qemu.MainSettingsManager;
import java.io.File; import java.io.File;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Objects;
/** /**
*
* @author dev * @author dev
*/ */
public class AppConfig { public class AppConfig {
// App Config // App Config
public static final String vectrasWebsite = "https://vectras.netlify.com/"; 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 vectrasRaw = "https://raw.githubusercontent.com/epicstudios856/Vectras-windows-emulator/main/";
public static final String vectrasLicense = vectrasRaw + "LICENSE.md"; public static final String vectrasLicense = vectrasRaw + "LICENSE.md";
public static final String vectrasPrivacy = vectrasRaw + "PRIVACYANDPOLICY.md"; public static final String vectrasPrivacy = vectrasRaw + "PRIVACYANDPOLICY.md";
public static final String vectrasTerms = vectrasRaw + "TERMSOFSERVICE.md"; public static final String vectrasTerms = vectrasRaw + "TERMSOFSERVICE.md";
public static final String vectrasInfo = vectrasRaw + "info.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 vectrasRepo = "https://github.com/epicstudios856/Vectras-windows-emulator/tree/main/";
public static final String updateJson = vectrasRaw + "UpdateConfig.json"; public static final String updateJson = vectrasRaw + "UpdateConfig.json";
public static final String blogJson = vectrasRaw + "news_list.json"; public static final String blogJson = vectrasRaw + "news_list.json";
public static final String storeJson = vectrasRaw + "store_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 romsJson(Activity activity) {
public static final String datadirpath = SplashActivity.activity.getExternalFilesDir("data")+"/"; if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) {
public static final String sharedFolder = datadirpath + "Vectras/ProgramFiles/"; return vectrasRaw + "roms.json";
public static final String basefiledir = datadirpath + "Vectras/.qemu/"; } else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM")) {
public static final String maindirpath = datadirpath + "Vectras/"; 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.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.RomsManagerActivity; import com.vectras.vm.RomsManagerActivity;
import com.vectras.vm.MainRoms.AdapterMainRoms; import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms; import com.vectras.vm.MainRoms.DataMainRoms;
@ -33,6 +35,7 @@ import com.vectras.vm.AppConfig;
import com.vectras.vm.MainActivity; import com.vectras.vm.MainActivity;
import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.FileUtils;
import com.vectras.vm.utils.UIUtils; import com.vectras.vm.utils.UIUtils;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -44,120 +47,110 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
public class HomeFragment extends Fragment { public class HomeFragment extends Fragment {
View view; public static View view;
public static RecyclerView mRVMainRoms; public static RecyclerView mRVMainRoms;
public static LinearLayout romsLayout; public static LinearLayout romsLayout;
public static AdapterMainRoms mMainAdapter; public static AdapterMainRoms mMainAdapter;
public MainActivity activity; public MainActivity activity;
public static JSONArray jArray; public static JSONArray jArray;
public static List<DataMainRoms> data; public static List<DataMainRoms> data;
/*private ImageButton mStop; /*private ImageButton mStop;
private ImageButton mRestart;*/ private ImageButton mRestart;*/
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub // 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() { refreshRoms.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override @Override
public void onRefresh() { public void onRefresh() {
data=new ArrayList<>(); 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 public static void loadDataVbi() {
+ "roms-data.json"))); data = new ArrayList<>();
// Extract data from json and store into ArrayList as class objects try {
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);
}
// Setup and Handover data to recyclerview jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, new File(AppConfig.maindirpath
mRVMainRoms = (RecyclerView)view.findViewById(R.id.mRVMainRoms); + "roms-data.json")));
mMainAdapter = new AdapterMainRoms(MainActivity.activity, data);
mRVMainRoms.setAdapter(mMainAdapter);
mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
} catch (JSONException e) { // Extract data from json and store into ArrayList as class objects
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show(); for (int i = 0; i < jArray.length(); i++) {
} JSONObject json_data = jArray.getJSONObject(i);
mMainAdapter.notifyItemRangeChanged(0, mMainAdapter.data.size()); DataMainRoms romsMainData = new DataMainRoms();
refreshRoms.setRefreshing(false); romsMainData.itemName = json_data.getString("imgName");
} romsMainData.itemIcon = json_data.getString("imgIcon");
}); try {
data=new ArrayList<>(); 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 } catch (JSONException e) {
+ "roms-data.json"))); 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++){ * CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
JSONObject json_data = jArray.getJSONObject(i); */
DataMainRoms romsMainData = new DataMainRoms(); public boolean checkConnection(Context context) {
romsMainData.itemName= json_data.getString("imgName"); final ConnectivityManager connMgr = (ConnectivityManager) context
romsMainData.itemIcon= json_data.getString("imgIcon"); .getSystemService(Context.CONNECTIVITY_SERVICE);
romsMainData.itemPath= json_data.getString("imgPath");
romsMainData.itemExtra= json_data.getString("imgExtra");
data.add(romsMainData);
}
// Setup and Handover data to recyclerview if (connMgr != null) {
mRVMainRoms = (RecyclerView)view.findViewById(R.id.mRVMainRoms); NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();
mMainAdapter = new AdapterMainRoms(MainActivity.activity, data);
mRVMainRoms.setAdapter(mMainAdapter);
mRVMainRoms.setLayoutManager(new GridLayoutManager(MainActivity.activity, 2));
} catch (JSONException e) { if (activeNetworkInfo != null) { // connected to the internet
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show(); // connected to the mobile provider's data plan
} if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
return view; return true;
} } else
return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
/** }
* CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT }
*/ return false;
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;
}
} }

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; package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION.SDK_INT;
import android.androidVNC.RfbProto; import android.androidVNC.RfbProto;
@ -18,7 +19,10 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
@ -28,12 +32,15 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.StrictMode; import android.os.StrictMode;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.DocumentsContract;
import android.text.Html; import android.text.Html;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; 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.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
import com.google.android.material.button.MaterialButton; 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.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.FirebaseUser;
import com.vectras.qemu.Config; import com.vectras.qemu.Config;
@ -88,7 +97,14 @@ import com.vectras.vm.utils.UIUtils;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.File; 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.InetAddress;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
@ -136,6 +152,8 @@ public class MainActivity extends AppCompatActivity {
ad.show(); ad.show();
} }
public static ProgressBar loadingPbb;
/** /**
* Called when the activity is first created. * Called when the activity is first created.
*/ */
@ -143,6 +161,7 @@ public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
loadingPbb = findViewById(R.id.loadingPb);
activity = this; activity = this;
clearNotifications(); clearNotifications();
setupFolders(); setupFolders();
@ -154,7 +173,7 @@ public class MainActivity extends AppCompatActivity {
this.setupWidgets(); this.setupWidgets();
initNavigationMenu(); initNavigationMenu();
FileInstaller.installFiles(activity, false); FileInstaller.installFiles(activity, false);
getWindow().setNavigationBarColor(SurfaceColors.SURFACE_2.getColor(this));
//updateApp(true); //updateApp(true);
//mAuth = FirebaseAuth.getInstance(); //mAuth = FirebaseAuth.getInstance();
} }
@ -231,6 +250,8 @@ public class MainActivity extends AppCompatActivity {
} else if (id == R.id.installRoms) { } else if (id == R.id.installRoms) {
startActivity(new Intent(activity, RomsManagerActivity.class)); startActivity(new Intent(activity, RomsManagerActivity.class));
} else if (id == R.id.arch) {
startActivity(new Intent(activity, SetArchActivity.class));
} }
return super.onOptionsItemSelected(item); 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 //Check to see which item was being clicked and perform appropriate action
int id = menuItem.getItemId(); int id = menuItem.getItemId();
if (id == R.id.navigation_item_info) { 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) { } else if (id == R.id.navigation_item_website) {
String tw = AppConfig.vectrasWebsite; String tw = AppConfig.vectrasWebsite;
Intent w = new Intent(Intent.ACTION_VIEW); Intent w = new Intent(Intent.ACTION_VIEW);
w.setData(Uri.parse(tw)); w.setData(Uri.parse(tw));
startActivity(w); 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) { } else if (id == R.id.navigation_item_view_logs) {
FileUtils.viewVectrasLog(activity); FileUtils.viewVectrasLog(activity);
} else if (id == R.id.navigation_item_settings) { } else if (id == R.id.navigation_item_settings) {
@ -478,8 +549,8 @@ public class MainActivity extends AppCompatActivity {
AlertDialog alertDialog; AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); alertDialog = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
alertDialog.setTitle("JOIN US ON TELEGRAM"); alertDialog.setTitle("JOIN US ON TELEGRAM");
TextView title = alertDialog.findViewById(R.id.title_text); TextView title = alertDialog.findViewById(android.R.id.title);
ObjectAnimator rgbAnim=ObjectAnimator.ofObject(title,"textColor",new ArgbEvaluator(), Color.RED,Color.GREEN,Color.BLUE); ObjectAnimator rgbAnim = ObjectAnimator.ofObject(title, "textColor", new ArgbEvaluator(), Color.RED, Color.GREEN, Color.BLUE);
rgbAnim.setDuration(1000); rgbAnim.setDuration(1000);
rgbAnim.setRepeatMode(ValueAnimator.REVERSE); rgbAnim.setRepeatMode(ValueAnimator.REVERSE);
rgbAnim.setRepeatCount(ValueAnimator.INFINITE); rgbAnim.setRepeatCount(ValueAnimator.INFINITE);
@ -545,10 +616,19 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
if (MainSettingsManager.getVirtio(activity)) { try {
Config.hd_if_type = "virtio"; HomeFragment.loadDataVbi();
} else { } catch (Exception ignored) {
Config.hd_if_type = "ide";
}
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(); setupFolders();
Config.ui = MainSettingsManager.getVmUi(activity); Config.ui = MainSettingsManager.getVmUi(activity);
@ -822,10 +902,18 @@ public class MainActivity extends AppCompatActivity {
public static void loadQEMULib() { public static void loadQEMULib() {
try { if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) {
System.loadLibrary("qemu-system-i386"); try {
} catch (Error ex) { System.loadLibrary("qemu-system-i386");
System.loadLibrary("qemu-system-x86_64"); } 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(); t.start();
} }
public static void toggleVisibility(View view) { public String getPath(Uri uri) {
if (view.getVisibility() == View.VISIBLE) { return com.vectras.vm.utils.FileUtils.getPath(this, uri);
view.setVisibility(View.GONE); }
} else if (view.getVisibility() == View.GONE || view.getVisibility() == View.INVISIBLE) {
view.setVisibility(View.VISIBLE); @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.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@ -28,9 +31,14 @@ import com.vectras.vm.MainActivity;
import com.vectras.vm.R; import com.vectras.vm.R;
import com.vectras.vm.utils.UIUtils; 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.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -66,8 +74,45 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
final MyHolder myHolder = (MyHolder) holder; final MyHolder myHolder = (MyHolder) holder;
final DataMainRoms current = data.get(position); final DataMainRoms current = data.get(position);
myHolder.textName.setText(current.itemName); myHolder.textName.setText(current.itemName);
myHolder.textArch.setText(current.itemArch);
Bitmap bmImg = BitmapFactory.decodeFile(current.itemIcon); Bitmap bmImg = BitmapFactory.decodeFile(current.itemIcon);
myHolder.ivIcon.setImageBitmap(bmImg); 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() { myHolder.cdRoms.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { public void onClick(View view) {
@ -90,7 +135,43 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
myHolder.cdRoms.setOnLongClickListener(new View.OnLongClickListener() { myHolder.cdRoms.setOnLongClickListener(new View.OnLongClickListener() {
@Override @Override
public boolean onLongClick(View v) { 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; return false;
} }
}); });
@ -114,9 +195,11 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE " + title, new DialogInterface.OnClickListener() { ad.setButton(Dialog.BUTTON_NEGATIVE, "REMOVE " + title, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
File file = new File(path); File file = new File(path);
file.delete(); try {
File fileIcon = new File(pathIcon); file.delete();
fileIcon.delete(); } catch (Exception e) {
throw new RuntimeException(e);
}
HomeFragment.mMainAdapter = new AdapterMainRoms(MainActivity.activity, HomeFragment.data); HomeFragment.mMainAdapter = new AdapterMainRoms(MainActivity.activity, HomeFragment.data);
HomeFragment.data.remove(currentPos); HomeFragment.data.remove(currentPos);
@ -163,15 +246,18 @@ public class AdapterMainRoms extends RecyclerView.Adapter<RecyclerView.ViewHolde
class MyHolder extends RecyclerView.ViewHolder { class MyHolder extends RecyclerView.ViewHolder {
CardView cdRoms; CardView cdRoms;
TextView textName; TextView textName, textArch;
ImageView ivIcon; ImageView ivIcon;
ImageButton optionsBtn;
// create constructor to get widget reference // create constructor to get widget reference
public MyHolder(View itemView) { public MyHolder(View itemView) {
super(itemView); super(itemView);
cdRoms = (CardView) itemView.findViewById(R.id.cdItem); cdRoms = (CardView) itemView.findViewById(R.id.cdItem);
textName = (TextView) itemView.findViewById(R.id.textName); textName = (TextView) itemView.findViewById(R.id.textName);
textArch = (TextView) itemView.findViewById(R.id.textArch);
ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon); 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 class DataMainRoms {
public String itemIcon; public String itemIcon;
public String itemName; public String itemName;
public String itemArch;
public String itemPath; public String itemPath;
public String itemExtra; public String itemExtra;
} }

View file

@ -75,14 +75,15 @@ public class AdapterRoms extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
myHolder.textSize.setText(current.itemSize); myHolder.textSize.setText(current.itemSize);
myHolder.checkBox.setChecked(position == mSelectedItem); myHolder.checkBox.setChecked(position == mSelectedItem);
if (current.itemAvail) { if (current.itemAvail) {
myHolder.textAvail.setText("availability: available"); if (FileUtils.fileValid(RomsManagerActivity.activity, AppConfig.maindirpath + current.itemPath)) {
myHolder.textAvail.setTextColor(Color.GREEN); myHolder.checkBox.setEnabled(false);
} else if (!current.itemAvail) { myHolder.textAvail.setTextColor(Color.BLUE);
myHolder.textAvail.setText("availability: unavailable"); myHolder.textAvail.setText("(installed)");
myHolder.textAvail.setTextColor(Color.RED); } else {
myHolder.checkBox.setEnabled(false); myHolder.checkBox.setEnabled(true);
} myHolder.textAvail.setTextColor(Color.GREEN);
if (current.itemAvail) myHolder.textAvail.setText("availability: available");
}
myHolder.checkBox.setOnClickListener(new View.OnClickListener() { myHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -96,6 +97,11 @@ public class AdapterRoms extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
RomsManagerActivity.selectedIcon = current.itemIcon; 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.provider.MediaStore;
import android.text.Html; import android.text.Html;
import android.util.Log; import android.util.Log;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.webkit.URLUtil; import android.webkit.URLUtil;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.button.MaterialButtonToggleGroup; import com.google.android.material.button.MaterialButtonToggleGroup;
import com.vectras.qemu.MainSettingsManager;
import com.vectras.vm.AppConfig; import com.vectras.vm.AppConfig;
import com.vectras.vm.Fragment.HomeFragment;
import com.vectras.vm.MainRoms.AdapterMainRoms; import com.vectras.vm.MainRoms.AdapterMainRoms;
import com.vectras.vm.MainRoms.DataMainRoms; import com.vectras.vm.MainRoms.DataMainRoms;
import com.vectras.vm.Roms.AdapterRoms; import com.vectras.vm.Roms.AdapterRoms;
@ -110,6 +117,31 @@ public class RomsManagerActivity extends AppCompatActivity {
public MaterialButton androidToggle; public MaterialButton androidToggle;
public MaterialButton otherToggle; 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. * Called when the activity is first created.
*/ */
@ -119,6 +151,7 @@ public class RomsManagerActivity extends AppCompatActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
activity = this; activity = this;
setContentView(R.layout.activity_roms_manager); setContentView(R.layout.activity_roms_manager);
loadingPb = findViewById(R.id.loadingPb);
filterToggle = findViewById(R.id.filterToggle); filterToggle = findViewById(R.id.filterToggle);
windowsToggle = findViewById(R.id.windowsToggle); windowsToggle = findViewById(R.id.windowsToggle);
linuxToggle = findViewById(R.id.linuxToggle); linuxToggle = findViewById(R.id.linuxToggle);
@ -163,6 +196,7 @@ public class RomsManagerActivity extends AppCompatActivity {
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);
setTitle("Roms Manager " + MainSettingsManager.getArch(activity));
new RomsManagerActivity.AsyncLogin().execute(); new RomsManagerActivity.AsyncLogin().execute();
new Thread(new Runnable() { new Thread(new Runnable() {
@ -189,7 +223,7 @@ public class RomsManagerActivity extends AppCompatActivity {
in.close(); in.close();
} catch (Exception e) { } catch (Exception e) {
acceptLiceneseChkBox.setEnabled(false); 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 //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) { 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) { protected String doInBackground(String... params) {
HttpsURLConnection con = null; HttpsURLConnection con = null;
try { try {
URL u = new URL(AppConfig.romsJson); URL u = new URL(AppConfig.romsJson(activity));
con = (HttpsURLConnection) u.openConnection(); con = (HttpsURLConnection) u.openConnection();
con.connect(); con.connect();
@ -349,23 +392,36 @@ public class RomsManagerActivity extends AppCompatActivity {
} }
@Override public static class RomsJso extends JSONObject {
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
public class RomsJso extends JSONObject { public JSONObject makeJSONObject(String imgName, String imgIcon, String imgArch, String imgPath, String imgExtra) {
public JSONObject makeJSONObject(String imgName, String imgIcon, String imgPath, String imgExtra) {
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
try { try {
obj.put("imgName", imgName); obj.put("imgName", imgName);
obj.put("imgIcon", imgIcon); 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("imgPath", imgPath);
obj.put("imgExtra", imgExtra); obj.put("imgExtra", imgExtra);
} catch (JSONException e) { } catch (JSONException e) {
@ -384,7 +440,7 @@ public class RomsManagerActivity extends AppCompatActivity {
public void onFirstStartup() { public void onFirstStartup() {
if (selected) { 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); SharedPreferences credentials = activity.getSharedPreferences(CREDENTIAL_SHARED_PREF, Context.MODE_PRIVATE);
ProgressDialog mProgressDialog = new ProgressDialog(this, R.style.MainDialogTheme); ProgressDialog mProgressDialog = new ProgressDialog(this, R.style.MainDialogTheme);
mProgressDialog.setTitle("Data Setup"); mProgressDialog.setTitle("Data Setup");
@ -396,64 +452,78 @@ public class RomsManagerActivity extends AppCompatActivity {
editor.putBoolean("isFirstLaunch", Boolean.TRUE); editor.putBoolean("isFirstLaunch", Boolean.TRUE);
editor.apply(); editor.apply();
RomsJso obj = new RomsJso(); RomsJso obj = new RomsJso();
startIconDownload(); try {
final File jsonFile = new File(AppConfig.maindirpath + "roms-data" + ".json"); startIconDownload();
} catch (Exception e) {
if (jsonFile.exists()) { File file = new File(selectedPath);
try { try {
List<DataMainRoms> data = new ArrayList<>(); file.delete();
JSONArray jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, jsonFile)); } 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 { try {
// Extract data from json and store into ArrayList as class objects List<DataMainRoms> data = new ArrayList<>();
for (int i = 0; i < jArray.length(); i++) { JSONArray jArray = new JSONArray(FileUtils.readFromFile(MainActivity.activity, jsonFile));
JSONObject json_data = jArray.getJSONObject(i);
DataMainRoms romsMainData = new DataMainRoms(); try {
romsMainData.itemName = json_data.getString("imgName"); // Extract data from json and store into ArrayList as class objects
romsMainData.itemIcon = json_data.getString("imgIcon"); for (int i = 0; i < jArray.length(); i++) {
romsMainData.itemPath = json_data.getString("imgPath"); JSONObject json_data = jArray.getJSONObject(i);
romsMainData.itemExtra = json_data.getString("imgExtra"); DataMainRoms romsMainData = new DataMainRoms();
data.add(romsMainData); 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) { } catch (JSONException e) {
Toast.makeText(MainActivity.activity, e.toString(), Toast.LENGTH_LONG).show(); UIUtils.toastLong(activity, e.toString());
} }
MainActivity.activity.finish();
JSONObject jsonObject = obj.makeJSONObject(selectedName, AppConfig.maindirpath + "icons/" + selectedPath.replace(".IMG", ".jpg"), AppConfig.maindirpath + selectedPath, selectedExtra); } else {
jArray.put(jsonObject); 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 { try {
Writer output = null; Writer output = null;
output = new BufferedWriter(new FileWriter(jsonFile)); output = new BufferedWriter(new FileWriter(jsonFile));
output.write(jArray.toString().replace("\\", "").replace("//", "/")); output.write(jsonArray.toString().replace("\\", "").replace("//", "/"));
output.close(); output.close();
} catch (Exception e) { } catch (Exception e) {
UIUtils.toastLong(activity, e.toString()); UIUtils.toastLong(activity, e.toString());
} }
} catch (JSONException e) { VectrasStatus.logInfo("Welcome to Vectras ♡");
UIUtils.toastLong(activity, e.toString());
} }
} 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() { /*new Timer().schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
mProgressDialog.dismiss(); } mProgressDialog.dismiss(); }
}, 3000);*/ }, 3000);*/
finish();
startActivity(new Intent(activity, SplashActivity.class));
}
} else { } else {
AlertDialog ad; AlertDialog ad;
ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create(); ad = new AlertDialog.Builder(activity, R.style.MainDialogTheme).create();
@ -501,8 +571,6 @@ public class RomsManagerActivity extends AppCompatActivity {
return FileUtils.getPath(activity, uri); return FileUtils.getPath(activity, uri);
} }
public ProgressDialog progressDialog = null;
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
@ -512,12 +580,10 @@ public class RomsManagerActivity extends AppCompatActivity {
if (selectedFilePath.getName().equals(selectedPath.replace(".IMG", ".vbi"))) { if (selectedFilePath.getName().equals(selectedPath.replace(".IMG", ".vbi"))) {
try { try {
progressDialog = new ProgressDialog(activity, loadingPb.setVisibility(View.VISIBLE);
R.style.MainDialogTheme); goBtn.setEnabled(false);
progressDialog.setTitle("Extracting"); acceptLiceneseChkBox.setEnabled(false);
progressDialog.setMessage("Please wait..."); mRVRoms.setVisibility(View.GONE);
progressDialog.setCancelable(false);
progressDialog.show(); // Showing Progress Dialog
Thread t = new Thread() { Thread t = new Thread() {
public void run() { public void run() {
FileInputStream zipFile = null; FileInputStream zipFile = null;
@ -556,7 +622,17 @@ public class RomsManagerActivity extends AppCompatActivity {
UIUtils.toastLong(activity, e.toString()); UIUtils.toastLong(activity, e.toString());
throw new RuntimeException(e); throw new RuntimeException(e);
} finally { } 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 { try {
zis.close(); zis.close();
} catch (IOException e) { } catch (IOException e) {
@ -568,7 +644,10 @@ public class RomsManagerActivity extends AppCompatActivity {
}; };
t.start(); t.start();
} catch (Exception e) { } 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()); UIUtils.toastLong(activity, e.toString());
throw new RuntimeException(e); 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> { static class DownloadsImage extends AsyncTask<String, Void, Void> {
@Override @Override
@ -643,4 +720,13 @@ public class RomsManagerActivity extends AppCompatActivity {
finish(); 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; package com.vectras.vm;
import static android.content.Intent.ACTION_OPEN_DOCUMENT;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.Uri;
import android.os.*; import android.os.*;
import android.provider.DocumentsContract;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -24,38 +31,50 @@ import com.vectras.vm.Blog.DataBlog;
import com.vectras.vm.Fragment.HomeFragment; import com.vectras.vm.Fragment.HomeFragment;
import com.vectras.vm.Store.AdapterStore; import com.vectras.vm.Store.AdapterStore;
import com.vectras.vm.Store.DataStore; 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.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader; 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.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
public class StoreActivity extends AppCompatActivity{ public class StoreActivity extends AppCompatActivity {
private RecyclerView mRVStore; private RecyclerView mRVStore;
private AdapterStore mAdapter; private AdapterStore mAdapter;
public static LinearLayout noConnectionLayout; public static LinearLayout noConnectionLayout;
public SwipeRefreshLayout pullToRefresh; public SwipeRefreshLayout pullToRefresh;
public static StoreActivity activity; public static StoreActivity activity;
public String Data; public String Data;
@Override @Override
protected void onCreate(Bundle bundle) { protected void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
setContentView(R.layout.activity_store); setContentView(R.layout.activity_store);
loadingPb = findViewById(R.id.loadingPb);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setTitle(getString(R.string.app_name)); toolbar.setTitle(getString(R.string.app_name));
activity = this; activity = this;
AdView mAdView = findViewById(R.id.adView); AdView mAdView = findViewById(R.id.adView);
@ -86,6 +105,7 @@ public class StoreActivity extends AppCompatActivity{
} }
}); });
} }
public boolean checkConnection(Context context) { public boolean checkConnection(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); .getSystemService(Context.CONNECTIVITY_SERVICE);
@ -194,11 +214,99 @@ public class StoreActivity extends AppCompatActivity{
} }
} }
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onCreateOptionsMenu(Menu menu) {
if(item.getItemId()== android.R.id.home){ super.onCreateOptionsMenu(menu);
finish();
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); 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;
}
}

View file

@ -0,0 +1,6 @@
<vector android:height="24dp" android:viewportHeight="256"
android:viewportWidth="256" android:width="24dp"
android:tint="?attr/colorControlNormal" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#000000"
android:pathData="M201.3,18c-1.2,0.5 -18.2,10.2 -37.7,21.5l-35.6,20.5 -36.4,-21c-24.5,-14.1 -37.3,-21 -39.3,-21 -3.6,-0 -37.6,18.9 -41.5,23.1l-2.8,2.9 0,66.9c0,62.2 0.1,67 1.8,69 2.4,3 34,21.2 37.9,21.8 2.5,0.4 3.7,-0 5.7,-2l2.6,-2.6 0,-28.1 0,-28.1 2.8,1.5c4.4,2.3 11.3,9.7 13.6,14.6 1.9,4.1 2.1,6.8 2.6,32.7 0.4,23.3 0.8,28.5 2,29.7 3.1,3 48.6,28.6 50.9,28.6 2.9,-0 49.4,-26.8 51.3,-29.5 1,-1.5 1.4,-9 1.8,-30.5l0.5,-28.5 2.7,-4.6c2.7,-4.6 8.8,-10.8 12.7,-12.8 2,-1.1 2,-0.9 2.3,27l0.3,28.1 2.8,2.4c1.5,1.3 3.8,2.4 5,2.4 1.2,-0 10.4,-4.8 20.4,-10.6 17,-9.8 18.3,-10.8 19.3,-14.2 0.8,-2.5 1,-24.6 0.8,-68.9 -0.3,-63.7 -0.3,-65.3 -2.3,-67.2 -2.3,-2.3 -37.1,-22.6 -40,-23.4 -1.1,-0.3 -3,-0.2 -4.2,0.3zM89,56c21.8,12.6 37.5,21 39,21 1.6,-0 16.3,-7.9 36.6,-19.6 18.6,-10.8 35.2,-20.2 36.7,-21.1 2.7,-1.4 3.2,-1.2 12.3,3.9 5.2,2.9 9.4,5.6 9.4,5.9 0,0.8 -93.6,54.9 -94.9,54.9 -1.3,-0 -94.5,-53.8 -94.8,-54.7 -0.3,-0.7 17.3,-11.3 18.7,-11.3 0.3,-0 16.9,9.5 37,21zM232,115.4l0,55.4 -7.7,4.5 -7.8,4.5 -0.5,-21.7c-0.5,-19.5 -0.7,-21.9 -2.6,-25.1 -2.5,-4.3 -8.7,-8 -13.5,-8 -8.7,-0 -23.6,11.5 -29.3,22.8 -4.9,9.6 -5.6,14.7 -5.6,39.2l0,22.6 -11.2,6.4c-6.2,3.5 -12.8,7.2 -14.5,8.3l-3.3,1.9 0,-55.4 0,-55.3 47.8,-27.7c26.2,-15.2 47.8,-27.7 48,-27.8 0.1,-0 0.2,24.9 0.2,55.4z" android:strokeColor="#00000000"/>
</vector>

View file

@ -0,0 +1,6 @@
<vector android:height="24dp" android:viewportHeight="256"
android:viewportWidth="256" android:width="24dp"
android:tint="?attr/colorControlNormal" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#000000"
android:pathData="M63.2,21.1c-8.3,1.1 -17.9,5.9 -24.1,12.2 -6.3,6.4 -8.9,10.5 -11.3,18 -1.7,5.5 -1.8,10.8 -1.8,79.2 0,70.7 0.1,73.5 2,79.8 2.7,8.6 9.4,17.5 17.1,22.6 11.6,7.8 8.9,7.5 78.3,7.9 40.6,0.2 64.4,-0.1 69,-0.8 17,-2.5 30.7,-14.2 35.8,-30.3 1.7,-5.5 1.8,-11.1 1.8,-79.3 0,-71.3 -0.1,-73.6 -2,-79.5 -5.6,-16.4 -19.2,-27.7 -36.2,-29.9 -8.8,-1.1 -119.7,-1.1 -128.6,0.1zM111.2,91.7l0.3,19.7 17.8,-19.7 17.9,-19.7 5.9,-0c3.2,-0 5.9,0.2 5.9,0.4 0,0.3 -7,8 -15.5,17.2 -8.5,9.2 -15.5,17.2 -15.5,17.6 0,0.5 7.3,10.4 16.3,22.1 8.9,11.7 16.6,21.8 17,22.4 0.6,1 -0.7,1.3 -5.5,1.3l-6.3,-0 -14.3,-19c-7.8,-10.5 -14.6,-19 -15.1,-19 -0.5,-0 -2.8,2.2 -5,4.9l-4.1,4.9 0,14.1 0,14.1 -5.5,-0 -5.5,-0 0,-40.5 0,-40.5 5.5,-0 5.5,-0 0.2,19.7zM50.5,200.1c3.3,1.6 8.4,3.3 11.4,3.9 7.1,1.3 125,1.3 132,-0 7.5,-1.4 14.8,-4.9 21,-9.8l5.4,-4.4 -0.5,8c-0.8,14.1 -8.9,25.5 -21.4,30.1 -5.3,2 -7.4,2.1 -70.4,2.1 -63,-0 -65.1,-0.1 -70.4,-2.1 -7.2,-2.6 -14.8,-9.6 -18.2,-16.6 -2.1,-4.2 -2.9,-7.5 -3.2,-13.6l-0.5,-8.1 4.4,3.8c2.4,2 7.1,5 10.4,6.7z" android:strokeColor="#00000000"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M440,473L440,840Q440,857 451.5,868.5Q463,880 480,880Q497,880 508.5,868.5Q520,857 520,840L520,473L596,548Q607,559 623.5,559.5Q640,560 652,548Q663,537 663,520Q663,503 652,492L508,348Q496,336 480,336Q464,336 452,348L308,492Q297,503 296.5,519.5Q296,536 308,548Q319,559 336,559Q353,559 364,548L440,473ZM480,160Q346,160 253,253Q160,346 160,480Q160,513 166.5,545Q173,577 186,607Q193,624 190.5,641Q188,658 175,671Q163,683 145.5,676.5Q128,670 119,651Q100,610 90,567.5Q80,525 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,525 870.5,568.5Q861,612 841,653Q832,671 814.5,677Q797,683 785,671Q773,659 769.5,642Q766,625 773,609Q787,578 793.5,545.5Q800,513 800,480Q800,346 707,253Q614,160 480,160Z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M5,16c0,3.87 3.13,7 7,7s7,-3.13 7,-7v-4L5,12v4zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3 12,3s-2.16,0.28 -3.09,0.75L6.6,1.44l-0.82,0.83 2.1,2.1C6.14,5.64 5,7.68 5,10v1h14v-1c0,-2.32 -1.14,-4.36 -2.88,-5.63zM9,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM15,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,16.5c-2.49,0 -4.5,-2.01 -4.5,-4.5S9.51,7.5 12,7.5s4.5,2.01 4.5,4.5 -2.01,4.5 -4.5,4.5zM12,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.9,13.98l2.1,2.53 3.1,-3.99c0.2,-0.26 0.6,-0.26 0.8,0.01l3.51,4.68c0.25,0.33 0.01,0.8 -0.4,0.8H6.02c-0.42,0 -0.65,-0.48 -0.39,-0.81L8.12,14c0.19,-0.26 0.57,-0.27 0.78,-0.02z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M4,20h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM4,17h2v2L4,19v-2zM2,6c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2zM6,7L4,7L4,5h2v2zM4,14h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM4,11h2v2L4,13v-2z"/>
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M3,10v4c0,0.55 0.45,1 1,1h3l3.29,3.29c0.63,0.63 1.71,0.18 1.71,-0.71L12,6.41c0,-0.89 -1.08,-1.34 -1.71,-0.71L7,9L4,9c-0.55,0 -1,0.45 -1,1zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,4.45v0.2c0,0.38 0.25,0.71 0.6,0.85C17.18,6.53 19,9.06 19,12s-1.82,5.47 -4.4,6.5c-0.36,0.14 -0.6,0.47 -0.6,0.85v0.2c0,0.63 0.63,1.07 1.21,0.85C18.6,19.11 21,15.84 21,12s-2.4,-7.11 -5.79,-8.4c-0.58,-0.23 -1.21,0.22 -1.21,0.85z"/>
</vector>

View file

@ -0,0 +1,141 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
<ProgressBar
android:id="@+id/loadingPb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone" />
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/container_main_roms" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/custom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/titleField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/rom_name"
android:theme="@style/AppTheme.TextInput"
app:startIconDrawable="@drawable/round_edit_24">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:selectAllOnFocus="true"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/iconField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/rom_icon"
android:clickable="true"
android:theme="@style/AppTheme.TextInput"
app:startIconDrawable="@drawable/round_image_24">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:clickable="true"
android:editable="false"
android:focusable="false"
android:selectAllOnFocus="true"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/driveField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/rom_drive_qcow2_img_etc"
android:clickable="true"
android:theme="@style/AppTheme.TextInput"
app:startIconDrawable="@drawable/round_storage_24">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/drive"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:clickable="true"
android:editable="false"
android:focusable="false"
android:selectAllOnFocus="true"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/qemuField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/qemu_params"
android:theme="@style/AppTheme.TextInput"
app:startIconDrawable="@drawable/ic_qemu">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/qemu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:selectAllOnFocus="true"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/addRomBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/add" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal|bottom"
android:orientation="horizontal">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:adSize="BANNER"
app:adUnitId="ca-app-pub-3568137780412047/8936512089" />
</LinearLayout>
</FrameLayout>
</LinearLayout>

View file

@ -119,6 +119,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/action_sign_with_google" android:text="@string/action_sign_with_google"
android:visibility="gone"
app:icon="@drawable/ic_google" /> app:icon="@drawable/ic_google" />
<ProgressBar <ProgressBar

View file

@ -2,7 +2,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
@ -31,6 +31,39 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="10dp"> android:padding="10dp">
<androidx.cardview.widget.CardView
android:id="@+id/cdCustom"
style="@style/CardViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:padding="8dp"
app:cardCornerRadius="10dp"
app:cardUseCompatPadding="true"
android:focusable="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:rotationX="25">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:scaleType="fitXY"
android:src="@drawable/input_circle" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="CUSTOM ROM" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textView"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -43,7 +76,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="4dp" android:layout_margin="4dp"
android:gravity="center_horizontal" > android:gravity="center_horizontal">
<com.google.android.material.button.MaterialButtonToggleGroup <com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/filterToggle" android:id="@+id/filterToggle"
@ -102,7 +135,7 @@
android:id="@+id/romsRv" android:id="@+id/romsRv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1.0" /> android:layout_weight="1.0"/>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:layout_height="56dp"
android:layout_width="match_parent"
android:gravity="center"
android:id="@+id/appbar"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$Behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView2"
android:layout_width="56dp"
android:layout_height="56dp"
android:scaleType="fitXY"
app:srcCompat="@drawable/ic_qemu" />
<TextView
android:id="@+id/toolbar_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:gravity="center"
android:layout_gravity="center"
android:paddingLeft="8dp"
android:text="EMU"
android:textColor="?attr/colorControlNormal"
android:textSize="24sp"
android:textStyle="bold" />
</LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/choose_qemu_architecture"
android:textSize="16sp" />
<Button
android:id="@+id/archx86"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="x86_64 QEMU (RECOMMENDED)"
android:textAlignment="textStart"
app:icon="@drawable/round_memory_24" />
<Button
android:id="@+id/archarm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ARM QEMU"
android:textAlignment="textStart"
android:visibility="gone"
app:icon="@drawable/round_memory_24" />
<Button
android:id="@+id/webBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="QEMU WEBSITE"
android:textAlignment="textStart"
app:icon="@drawable/round_public_24" />
</LinearLayout>
</LinearLayout>

View file

@ -1,4 +1,4 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -10,8 +10,21 @@
android:layout_width="150dp" android:layout_width="150dp"
android:layout_height="150dp" android:layout_height="150dp"
android:id="@+id/animation_view" android:id="@+id/animation_view"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:lottie_rawRes="@raw/logo" app:lottie_rawRes="@raw/logo"
app:lottie_autoPlay="true" app:lottie_autoPlay="true"
app:lottie_loop="false"/> app:lottie_loop="false"/>
</LinearLayout> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_version"
android:padding="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -22,6 +22,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" /> android:layout_height="?attr/actionBarSize" />
<ProgressBar
android:id="@+id/loadingPb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_store" /> <include layout="@layout/content_store" />

View file

@ -13,21 +13,67 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"> android:orientation="vertical">
<ImageView <FrameLayout
android:id="@+id/ivIcon"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="match_parent">
android:scaleType="centerCrop"
app:srcCompat="@drawable/tv_banner" /> <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ivIcon"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
app:srcCompat="@mipmap/ic_launcher" />
</FrameLayout>
<TextView
android:id="@+id/textArch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#20000000"
android:backgroundTint="?attr/colorPrimary"
android:gravity="left"
android:maxLines="1"
android:padding="8dp"
android:singleLine="true"
android:text="arch"
android:textAlignment="gravity"
android:textColor="?attr/colorPrimary"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>
<ImageButton
android:id="@+id/optionsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|top"
android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:padding="10dp"
android:src="@drawable/round_settings_24"
app:tint="?attr/colorPrimary" />
</FrameLayout>
<TextView <TextView
android:id="@+id/textName" android:id="@+id/textName"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:maxLines="1" android:maxLines="1"
android:padding="8dp" android:padding="8dp"
android:singleLine="true" android:singleLine="true"
@ -35,5 +81,4 @@
android:textSize="20sp" android:textSize="20sp"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

View file

@ -32,11 +32,13 @@
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <com.airbnb.lottie.LottieAnimationView
android:id="@+id/imageView" android:layout_width="100dp"
android:layout_width="match_parent" android:layout_height="100dp"
android:layout_height="wrap_content" android:id="@+id/animation_view"
android:src="@mipmap/ic_launcher"/> app:lottie_rawRes="@raw/logo2"
app:lottie_autoPlay="true"
app:lottie_loop="true"/>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -5,283 +5,308 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:alpha="0.5"> android:alpha="0.5">
<androidx.constraintlayout.widget.ConstraintLayout <FrameLayout
android:id="@+id/mainControl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="horizontal">
<ListView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/functions" android:layout_width="match_parent"
android:layout_width="56dp" android:layout_height="match_parent"
android:layout_height="150dp" android:orientation="horizontal">
android:divider="@android:color/transparent"
android:dividerHeight="0dp" <ListView
android:background="@drawable/background1" android:id="@+id/functions"
android:backgroundTint="?attr/colorPrimary" android:layout_width="56dp"
android:layout_marginLeft="8dp" android:layout_height="150dp"
android:layout_marginBottom="8dp" android:layout_marginLeft="8dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:visibility="gone" android:layout_marginBottom="8dp"
app:layout_constraintLeft_toLeftOf="parent" android:background="@drawable/background1"
tools:listitem="@layout/container_function"/> android:backgroundTint="?attr/colorPrimary"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
tools:listitem="@layout/container_function" />
<LinearLayout
android:id="@+id/dpad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:gravity="center_vertical"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageButton
android:id="@+id/upBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_up"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/leftBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_left"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/downBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_down"
app:tint="?attr/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageButton
android:id="@+id/rightBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_right"
app:tint="?attr/colorPrimary" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintRight_toRightOf="parent">
<ImageButton
android:id="@+id/escBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_esc"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/delBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_del"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/enterBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_enter"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/ctrlBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_ctrl"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/altBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_alt"
app:tint="?attr/colorPrimary" />
</LinearLayout>
<Button
android:id="@+id/ctrlAltDelBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:text="Ctrl Alt Del"
android:textColor="?attr/colorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout <LinearLayout
android:id="@+id/dpad" android:layout_width="match_parent"
android:layout_width="wrap_content" android:layout_height="match_parent"
android:layout_height="wrap_content" android:orientation="vertical">
android:layout_margin="15dp"
android:gravity="center_vertical"
android:orientation="horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="horizontal">
<ImageButton <LinearLayout
android:id="@+id/upBtn" android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:layout_weight="1.0"
android:orientation="vertical"
android:padding="10dp">
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="2dp" android:background="@drawable/background1"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary" android:backgroundTint="?attr/colorPrimary"
android:clickable="true" android:gravity="center"
android:focusable="true" android:orientation="horizontal"
android:src="@drawable/ic_arrow_up" android:paddingLeft="10dp"
app:tint="?attr/colorPrimary" /> android:paddingRight="10dp"
android:translationY="-6dp">
<ImageButton <ImageButton
android:id="@+id/leftBtn" android:id="@+id/btnLogs"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="2dp" android:layout_marginRight="8dp"
android:background="@drawable/controls_button1" android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary" android:backgroundTint="?attr/colorPrimary"
android:clickable="true" android:src="@drawable/round_menu_24"
android:focusable="true" app:tint="?attr/colorPrimary" />
android:src="@drawable/ic_arrow_left"
app:tint="?attr/colorPrimary" /> <ImageButton
android:id="@+id/btnSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_settings_24"
android:visibility="gone"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/btnQmp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_terminal_24"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/btnMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_games_24"
android:visibility="gone"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/kbdBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_keyboard_24"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/shutdownBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_logout_24"
app:tint="?attr/colorPrimary" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:orientation="horizontal" />
<ImageButton
android:id="@+id/downBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_down"
app:tint="?attr/colorPrimary" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:gravity="center"
android:orientation="vertical">
<ImageButton
android:id="@+id/rightBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:clickable="true"
android:focusable="true"
android:src="@drawable/ic_arrow_right"
app:tint="?attr/colorPrimary" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:layout_margin="15dp"
app:layout_constraintRight_toRightOf="parent">
<ImageButton
android:id="@+id/escBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_esc"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/delBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_del"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/enterBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_enter"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/ctrlBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_ctrl"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/altBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/ic_alt"
app:tint="?attr/colorPrimary" />
</LinearLayout>
<Button
android:id="@+id/ctrlAltDelBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/controls_button1"
android:backgroundTint="?attr/colorPrimary"
android:text="Ctrl Alt Del"
android:textColor="?attr/colorPrimary"
android:layout_margin="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.0" android:layout_weight="1.0"
android:orientation="horizontal">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="left" android:layout_gravity="left"
android:orientation="vertical" android:gravity="center_horizontal"
android:padding="10dp">
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/background1"
android:backgroundTint="?attr/colorPrimary"
android:gravity="center"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingLeft="10dp" android:padding="15dp">
android:paddingRight="10dp"
android:translationY="-6dp">
<ImageButton
android:id="@+id/btnLogs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_menu_24"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/btnSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_settings_24"
app:tint="?attr/colorPrimary"
android:visibility="gone" />
<ImageButton
android:id="@+id/btnQmp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_terminal_24"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/btnMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_games_24"
app:tint="?attr/colorPrimary"
android:visibility="gone" />
<ImageButton
android:id="@+id/kbdBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_keyboard_24"
app:tint="?attr/colorPrimary" />
<ImageButton
android:id="@+id/shutdownBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:background="@drawable/controls_button"
android:backgroundTint="?attr/colorPrimary"
android:src="@drawable/round_logout_24"
app:tint="?attr/colorPrimary" />
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:orientation="horizontal" />
</LinearLayout> </LinearLayout>
<LinearLayout </FrameLayout>
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:orientation="horizontal">
</LinearLayout> <ImageButton
android:id="@+id/visibilityButton"
<LinearLayout android:layout_width="wrap_content"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="top|left"
android:layout_gravity="left" android:background="@android:color/transparent"
android:gravity="center_horizontal" android:clickable="true"
android:orientation="horizontal" android:focusable="true"
android:padding="15dp"> android:padding="10dp"
android:src="@drawable/visibility_off"
</LinearLayout> app:tint="?attr/colorPrimary" />
</LinearLayout>
</FrameLayout> </FrameLayout>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/button_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next"
app:layout_constraintBottom_toTopOf="@id/textview_first"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/lorem_ipsum"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button_first" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/button_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/previous"
app:layout_constraintBottom_toTopOf="@id/textview_second"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/lorem_ipsum"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button_second" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -120,6 +120,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:background="?attr/colorSurface" /> android:background="?attr/colorSurface" />
<ProgressBar
android:id="@+id/loadingPbb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
android:visibility="gone" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView

View file

@ -5,38 +5,38 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center_vertical|center|center_horizontal" android:gravity="center_vertical|center|center_horizontal"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone" > android:visibility="gone">
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
style="@style/CardViewStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical|center|center_horizontal" android:gravity="center_vertical|center|center_horizontal"
style="@style/CardViewStyle"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardUseCompatPadding="true" > app:cardUseCompatPadding="true">
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical|center|center_horizontal" android:gravity="center_vertical|center|center_horizontal"
android:padding="15dp" android:orientation="vertical"
android:orientation="vertical" > android:padding="15dp">
<ImageView <ImageView
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:padding="15dp" android:padding="15dp"
android:scaleType="fitXY" android:scaleType="fitXY"
android:src="@drawable/access_point_network_off" android:src="@drawable/access_point_network_off"
app:tint="@android:color/white" /> app:srcCompat="@drawable/access_point_network_off" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="5dp"
android:text="No Internet connection" android:text="No Internet connection"
android:textSize="20sp" android:textSize="20sp"
android:padding="5dp"
android:textStyle="bold" /> android:textStyle="bold" />
</LinearLayout> </LinearLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/qemuField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/qemu_params"
android:theme="@style/AppTheme.TextInput"
app:startIconDrawable="@drawable/ic_qemu">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/qemu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:selectAllOnFocus="true"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/saveRomBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>

View file

@ -8,9 +8,13 @@
android:id="@+id/navigation_item_website" android:id="@+id/navigation_item_website"
android:icon="@drawable/round_public_24" android:icon="@drawable/round_public_24"
android:title="@string/vectras_website" /> android:title="@string/vectras_website" />
<item
android:id="@+id/navigation_item_import_iso"
android:icon="@drawable/round_album_24"
android:title="@string/import_iso"/>
<item <item
android:id="@+id/navigation_item_view_logs" android:id="@+id/navigation_item_view_logs"
android:icon="@drawable/round_menu_24" android:icon="@drawable/round_adb_24"
android:title="@string/view_logs" /> android:title="@string/view_logs" />
<item <item
android:id="@+id/navigation_item_settings" android:id="@+id/navigation_item_settings"

View file

@ -1,6 +1,12 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/arch"
android:icon="@drawable/ic_arch"
app:showAsAction="always"
android:title="@string/title_activity_set_arch"/>
<item <item
android:id="@+id/installRoms" android:id="@+id/installRoms"
android:icon="@drawable/round_browser_updated_24" android:icon="@drawable/round_browser_updated_24"

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/FirstFragment">
<fragment
android:id="@+id/FirstFragment"
android:name="com.vectras.vm.FirstFragment"
android:label="@string/first_fragment_label"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/action_FirstFragment_to_SecondFragment"
app:destination="@id/SecondFragment" />
</fragment>
<fragment
android:id="@+id/SecondFragment"
android:name="com.vectras.vm.SecondFragment"
android:label="@string/second_fragment_label"
tools:layout="@layout/fragment_second">
<action
android:id="@+id/action_SecondFragment_to_FirstFragment"
app:destination="@id/FirstFragment" />
</fragment>
</navigation>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,210 @@
<resources>
<string name="app_name" translatable="false">Vectras VM</string>
<string name="app_version" translatable="false">PHANTOM v2.5</string>
<string name="str_home">بيت</string>
<string name="str_logger">المسجل</string>
<string name="fab_info">ابدأ المحاكاة</string>
<!-- logger -->
<string name="startvm">بدأ تشغيل الجهاز الافتراضي!</string>
<string name="stopvm">توقف الجهاز الافتراضي!</string>
<string name="noproccesses">لا توجد عمليات!</string>
<string name="unknownstate">دولة غير معروفة!</string>
<string name="desktopInstructions">لاستخدام الماوس الخارجي:\n\tقم بتعطيل تسريع الماوس داخل نظام التشغيل الضيف.\n\t\tبالنسبة لـ DSL استخدم الأمر: xset m 1\n\"\t\tبالنسبة لأنظمة تشغيل أخرى، قم بتعطيل \\"تحسين دقة المؤشر\\" أو اختر الماوس \ \"usb-tablet\\" من خيارات Vectras الرئيسية.\n\tقم بتوصيل ماوس USB/Bluetooth أو قم بإقرانه ثم اضغط على \"موافق\"\n\tحرك مؤشر الماوس إلى كافة جوانب سطح المكتب للمعايرة.\n\"</string>
<string name="repeater_caption"><![CDATA[أدخل عنوان المكرر <b>فقط إذا</b> كنت تستخدم مكررًا من النوع<br><i>UltraVNC</i>]]></string>
<string name="navigation_drawer_open">الدرج مفتوح</string>
<string name="navigation_drawer_close">إغلاق الدرج</string>
<string name="address_caption">عنوان</string>
<string name="alt_check">بديل</string>
<string name="arrow_down">السهم لأسفل</string>
<string name="arrow_left">السهم الايسر</string>
<string name="arrow_right">السهم الأيمن</string>
<string name="arrow_up">سهم للاعلى</string>
<string name="auto">آلي</string>
<string name="button_send_text">ارسل رسالة</string>
<string name="button_send_without_saving">أرسل رسالة نصية/لا تحفظها</string>
<string name="center_mouse">الفأر</string>
<string name="close">يغلق</string>
<string name="color_format_caption">تنسيق اللون</string>
<string name="color_mode">وضع اللون</string>
<string name="connect_button">يتصل</string>
<string name="connection_caption">اتصال</string>
<string name="control_check">كنترول</string>
<string name="reset">إعادة ضبط</string>
<string name="shutdown">اغلق</string>
<string name="copy_list_button">قائمة النسخ</string>
<string name="ctrl_alt_del">السيطرة-البديل-ديل</string>
<string name="ctrl_c">السيطرة-ج</string>
<string name="delete_connection">حذف الاتصال</string>
<string name="delete_key">حذف المفتاح المحدد</string>
<string name="delete_key_list">حذف قائمة المفاتيح</string>
<string name="disconnect">قطع الاتصال</string>
<string name="devices">الأجهزة</string>
<string name="external_mouse">ماوس خارجي</string>
<string name="monitor">مراقب كيمو</string>
<string name="export_settings">يصدّر</string>
<string name="export_settings_path">تصدير إلى ملف</string>
<string name="enter_text_title">أدخل النص لإرساله</string>
<string name="enter_text">ارسل رسالة</string>
<string name="stretch_to_screen">تمتد إلى الشاشة</string>
<string name="fit_to_screen">صالح للشاشة</string>
<string name="full_screen">تكبير الشاشة</string>
<string name="toggle_full_screen">ملء الشاشة تبديل</string>
<string name="zoom_in">تكبير</string>
<string name="zoom_out">تصغير</string>
<string name="force_full_check">فرض الصورة النقطية بملء الشاشة</string>
<string name="import_export_settings">إعدادات الاستيراد/التصدير</string>
<string name="import_settings">يستورد</string>
<string name="import_settings_file_url">استيراد من ملف أو URL</string>
<string name="info">معلومات</string>
<string name="input_mode">وضع الإدخال</string>
<string name="input_mode_fit_to_screen">لا عموم. ماوس كرة التتبع</string>
<string name="input_mode_mouse">وضع التحكم بمؤشر الماوس</string>
<string name="input_mode_panning">وضع تحريك سطح المكتب</string>
<string name="input_mode_touchpad_pan_trackball_mouse">المس المقلاة؛ ماوس كرة التتبع</string>
<string name="input_mode_dpad_pan_touchpad_mouse">لمس الماوس. D-سادة عموم</string>
<string name="input_mode_touch_pan_zoom_mouse">المس عموم الماوس والتكبير</string>
<string name="input_mode_touchpad">لوحة اللمس</string>
<string name="keep_password_button">يحفظ</string>
<string name="intro_dont_show">لا تظهر مرة أخرى</string>
<string name="keys_caption">مفاتيح</string>
<string name="list_caption">قائمة</string>
<string name="list_name_caption">اسم القائمة</string>
<string name="local_mouse_check">مؤشر الماوس المحلي</string>
<string name="meta_key_title">إرسال مفاتيح خاصة</string>
<string name="mouse_follow_pan">اتبع الماوس عموم</string>
<string name="new_list_button">قائمة جديدة</string>
<string name="nickname_caption">كنية</string>
<string name="off">عن</string>
<string name="on">على</string>
<string name="one_to_one">عادي (1:1)</string>
<string name="open_doc">دليل / ويكي</string>
<string name="pan_follow_mouse">عموم يتبع الماوس</string>
<string name="password_caption">كلمة المرور</string>
<string name="port_caption">ميناء</string>
<string name="repeater_button">مكرر</string>
<string name="repeater_clear">لا تستخدم مكرر</string>
<string name="repeater_dialog_title">معلومات مكرر</string>
<string name="repeater_empty_text">لا يوجد مكرر</string>
<string name="repeater_save">استخدم عنوان المكرر هذا</string>
<string name="save_as_copy">حفظ كنسخة</string>
<string name="scaling">التحجيم</string>
<string name="save_state">إيقاف الجهاز الافتراضي مؤقتًا</string>
<string name="save_snapshot">حفظ لقطة</string>
<string name="scaling_zoomable">قابل للتكبير</string>
<!-- Send selected metakey -->
<string name="send_button">يرسل</string>
<string name="send_key_again">إرسال المفتاح مرة أخرى</string>
<string name="shift_check">يحول</string>
<string name="shortcut_label">اتصال فنك</string>
<string name="showkbd_label">لوحة المفاتيح</string>
<string name="special_keys">مفاتيح خاصة</string>
<string name="username_caption">اسم المستخدم</string>
<string name="email_caption">بريد إلكتروني</string>
<string name="username_hint">لمصادقة ويندوز</string>
<string name="right_click">انقر بزر الماوس الأيمن</string>
<string name="help">يساعد</string>
<string name="drives">محركات الأقراص</string>
<string name="volume">مقدار</string>
<string name="hide_toolbar">إخفاء شريط الأدوات</string>
<string name="view_log">سجل عرض</string>
<string name="mode">وضع</string>
<string name="keyboard">لوحة المفاتيح</string>
<string name="name">اسم</string>
<string name="size">مقاس:</string>
<string name="availablity">التوفر:</string>
<string name="hide">يخفي</string>
<string name="title_activity_login">نشاط تسجيل الدخول</string>
<string name="prompt_email">بريد إلكتروني</string>
<string name="prompt_password">كلمة المرور</string>
<string name="action_sign_in">تسجيل الدخول</string>
<string name="action_sign_up">اشتراك</string>
<string name="action_sign_with_google">الدخول مع جوجل</string>
<string name="welcome">\"مرحباً !\"</string>
<string name="invalid_username">ليس اسم مستخدم صالحًا</string>
<string name="invalid_password"><![CDATA[يجب أن تكون كلمة المرور > 5 أحرف]]></string>
<string name="login_failed">\"فشل تسجيل الدخول\"</string>
<string name="profile">حساب تعريفي</string>
<string name="apps_amp_games"><![CDATA[التطبيقات والألعاب]]></string>
<string name="vectras_website">موقع فيكترا</string>
<string name="about">عن</string>
<string name="emulation_information">معلومات المحاكاة</string>
<string name="full_name">الاسم الكامل</string>
<string name="terms_amp_conditions"><![CDATA[البنود و الظروف]]></string>
<string name="i_accept_terms_amp_conditions"><![CDATA[أوافق على الشروط والأحكام]]></string>
<string name="settings">إعدادات</string>
<string name="go_ahead">تفضل</string>
<string name="download">تحميل</string>
<string name="view_profile" translatable="false"><u><![CDATA[View Profile>>]]></u></string>
<string name="username">اسم المستخدم</string>
<string name="save">يحفظ</string>
<string name="memory_usage">استخدام الذاكرة</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">مرحبا جزء فارغ</string>
<string name="linux">لينكس</string>
<string name="windows">شبابيك</string>
<string name="apple">تفاحة</string>
<string name="external_vnc">فنك خارجي</string>
<string name="hosted_successfully">تم استضافته بنجاح!</string>
<string name="ip">إب: 127.0.0.1:1</string>
<string name="install_rom">تثبيت الروم</string>
<string name="reconnect">أعد الاتصال</string>
<string name="display">عرض</string>
<string name="calibrate_mouse">معايرة الماوس</string>
<string name="hide_controller">إخفاء وحدة التحكم</string>
<string name="remove">يزيل</string>
<string name="view_logs">عرض السجلات</string>
<string name="title_activity_set_arch">SetArchActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">الجزء الأول</string>
<string name="second_fragment_label">الجزء الثاني</string>
<string name="next">التالي</string>
<string name="previous">سابق</string>
<string name="lorem_ipsum" translatable="false">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
<string name="choose_qemu_architicture">اختر الهندسة المعمارية qemu:</string>
<string name="choose_qemu_architecture">اختر بنية qmu:</string>
<string name="import_custom_rom_cvbi">استيراد ذاكرة القراءة فقط المخصصة \\".CVBI\\"</string>
<string name="rom_name">اسم القرص</string>
<string name="rom_drive_qcow2_img_etc">محرك الأقراص المضغوطة (qcow2، img، إلخ...)</string>
<string name="qemu_params">كيمو بارامس</string>
<string name="rom_icon">رمز مدمج</string>
<string name="add">يضيف</string>
<string name="import_iso">استيراد ايزو</string>
</resources>

View file

@ -7,7 +7,7 @@
<item name="android:windowMinWidthMajor">100%</item> <item name="android:windowMinWidthMajor">100%</item>
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
<item name="android:enforceNavigationBarContrast" tools:ignore="NewApi">false</item> <item name="android:enforceNavigationBarContrast" tools:ignore="NewApi">false</item>
<item name="android:navigationBarColor">?attr/colorSurface</item> <item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item> <item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item> <item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item>
@ -25,26 +25,25 @@
<item name="android:dialogPreferenceStyle">@style/MainDialogTheme</item> <item name="android:dialogPreferenceStyle">@style/MainDialogTheme</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style> </style>
<style name="CardViewStyle" parent="CardView"> <style name="CardViewStyle" parent="CardView">
<item name="cardBackgroundColor">#25222C</item> <item name="cardBackgroundColor">#25222C</item>
</style> </style>
<style name="AppTheme.WidgetGroupChip" parent="Widget.MaterialComponents.Chip.Choice"> <style name="AppTheme.WidgetGroupChip" parent="Widget.MaterialComponents.Chip.Choice">
<item name="chipStrokeWidth">1dp</item> <item name="chipStrokeWidth">1dp</item>
</style> </style>
<style name="AppTheme.Toolbar.OverflowButton" parent="@style/Widget.AppCompat.ActionButton.Overflow"> <style name="AppTheme.Toolbar.OverflowButton" parent="@style/Widget.AppCompat.ActionButton.Overflow"></style>
</style>
<style name="AppTheme.MaterialToggleButton" parent=""> <style name="AppTheme.MaterialToggleButton" parent=""></style>
</style>
<style name="AppTheme.TabLayout.Title" parent="TextAppearance.Design.Tab"> <style name="AppTheme.TabLayout.Title" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item> <item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
</style> </style>
<style name="AppTheme.TextInput" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <style name="AppTheme.TextInput" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"></style>
</style>
<style name="PopupAnimation"> <style name="PopupAnimation">
<item name="android:windowEnterAnimation">@anim/popup_in</item> <item name="android:windowEnterAnimation">@anim/popup_in</item>
@ -59,77 +58,98 @@
<style name="PopupMenuStyle" parent="Theme.Material3.Dark"> <style name="PopupMenuStyle" parent="Theme.Material3.Dark">
</style> </style>
<style name="ActivityAnimation" parent="@android:style/Animation.Activity"> <style name="ActivityAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/popup_in</item> <item name="android:activityOpenEnterAnimation">@anim/popup_in</item>
<item name="android:activityOpenExitAnimation">@anim/popup_out</item> <item name="android:activityOpenExitAnimation">@anim/popup_out</item>
<item name="android:activityCloseEnterAnimation">@anim/popup_in</item> <item name="android:activityCloseEnterAnimation">@anim/popup_in</item>
<item name="android:activityCloseExitAnimation">@anim/popup_out</item> <item name="android:activityCloseExitAnimation">@anim/popup_out</item>
</style> </style>
<style name="Theme.FullScreen" parent="AppTheme">
<item name="android:windowFullscreen">true</item> <style name="Theme.FullScreen" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item> <item name="android:windowFullscreen">true</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item> <item name="android:windowTranslucentNavigation">false</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item> <item name="android:navigationBarColor">@android:color/transparent</item>
<item name="titleTextColor">@android:color/white</item> <item name="titleTextColor">@android:color/white</item>
<item name="android:textColor">@android:color/white</item> <item name="android:textColor">@android:color/white</item>
</style> </style>
<style name="MainDialogTheme" parent="AppTheme.MaterialAlertDialog"> <style name="MainDialogTheme" parent="AppTheme.MaterialAlertDialog">
<!-- <item name="backgroundColor">?attr/colorSurface</item>--> <!-- <item name="backgroundColor">?attr/colorSurface</item>-->
</style> </style>
<!-- Alert Dialog --> <!-- Alert Dialog -->
<style name="AppTheme.MaterialAlertDialog" parent="@style/ThemeOverlay.Material3.MaterialAlertDialog"> <style name="AppTheme.MaterialAlertDialog" parent="@style/ThemeOverlay.Material3.MaterialAlertDialog">
<item name="shapeAppearanceOverlay">@style/MaterialDialog.ShapeAppearance</item> <item name="shapeAppearanceOverlay">@style/MaterialDialog.ShapeAppearance</item>
<item name="materialAlertDialogTitleTextStyle">@style/MaterialDialog.Title.Text</item> <item name="materialAlertDialogTitleTextStyle">@style/MaterialDialog.Title.Text</item>
<item name="materialAlertDialogBodyTextStyle">@style/MaterialDialog.Body.Text</item> <item name="materialAlertDialogBodyTextStyle">@style/MaterialDialog.Body.Text</item>
<item name="buttonBarPositiveButtonStyle">@style/MaterialAlertDialog.PositiveButtonStyle </item> <item name="buttonBarPositiveButtonStyle">@style/MaterialAlertDialog.PositiveButtonStyle
<item name="buttonBarNegativeButtonStyle">@style/MaterialAlertDialog.NegativeButtonStyle </item> </item>
<item name="buttonBarNeutralButtonStyle">@style/MaterialAlertDialog.NeutralButtonStyle </item> <item name="buttonBarNegativeButtonStyle">@style/MaterialAlertDialog.NegativeButtonStyle
</item>
<item name="buttonBarNeutralButtonStyle">@style/MaterialAlertDialog.NeutralButtonStyle
</item>
<item name="android:windowEnterAnimation">@animator/dialog_in</item> <item name="android:windowEnterAnimation">@animator/dialog_in</item>
<item name="android:windowExitAnimation">@animator/dialog_out</item> <item name="android:windowExitAnimation">@animator/dialog_out</item>
<!-- <item name="background">?attr/colorSurface</item>--> <!-- <item name="background">?attr/colorSurface</item>-->
<item name="dialogCornerRadius">28dp</item> <item name="dialogCornerRadius">28dp</item>
</style> </style>
<style name="MaterialDialog.ShapeAppearance" parent=""> <style name="MaterialDialog.ShapeAppearance" parent="">
<item name="cornerSize">10dp</item> <item name="cornerSize">10dp</item>
</style> </style>
<style name="MaterialDialog.Title.Text" parent="@style/MaterialAlertDialog.Material3.Title.Text"> <style name="MaterialDialog.Title.Text" parent="@style/MaterialAlertDialog.Material3.Title.Text">
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialDialog.Body.Text" parent="@style/MaterialAlertDialog.Material3.Body.Text"> <style name="MaterialDialog.Body.Text" parent="@style/MaterialAlertDialog.Material3.Body.Text">
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.PositiveButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.PositiveButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.NegativeButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.NegativeButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.NeutralButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.NeutralButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="ThemeEditText" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <style name="ThemeEditText" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<item name="colorPrimary">@android:color/white</item> <item name="colorPrimary">@android:color/white</item>
<item name="colorPrimaryDark">@android:color/white</item> <item name="colorPrimaryDark">@android:color/white</item>
<item name="boxStrokeColor">#ffffff</item> <item name="boxStrokeColor">#ffffff</item>
<item name="boxStrokeWidth">2dp</item> <item name="boxStrokeWidth">2dp</item>
</style> </style>
<style name="MyCheckBoxStyle" parent="Widget.Material3.CompoundButton.CheckBox"> <style name="MyCheckBoxStyle" parent="Widget.Material3.CompoundButton.CheckBox">
<item name="android:theme">@style/MyCheckboxTheme</item> <item name="android:theme">@style/MyCheckboxTheme</item>
</style> </style>
<style name="MyCheckboxTheme"> <style name="MyCheckboxTheme">
</style> </style>
<style name="DialogAnimation"> <style name="DialogAnimation">
<item name="android:windowEnterAnimation">@anim/slide_in_bottom</item> <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/slide_out_bottom</item> <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style> </style>
<style name="Preference.SwitchPreferenceCompat" parent="@style/Preference.SwitchPreferenceCompat.Material"
tools:ignore="ResourceCycle"> <style name="Preference.SwitchPreferenceCompat" parent="@style/Preference.SwitchPreferenceCompat.Material" tools:ignore="ResourceCycle">
<item name="widgetLayout">@layout/switch_mui3</item> <item name="widgetLayout">@layout/switch_mui3</item>
</style> </style>
<!-- Base application theme. -->
<style name="Base.AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your dark theme here. -->
<!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
</style>
</resources> </resources>

View file

@ -0,0 +1,210 @@
<resources>
<string name="app_name" translatable="false">Vectras VM</string>
<string name="app_version" translatable="false">PHANTOM v2.5</string>
<string name="str_home">Дом</string>
<string name="str_logger">Регистратор</string>
<string name="fab_info">Запустить эмуляцию</string>
<!-- logger -->
<string name="startvm">ВМ НАЧАЛОСЬ!</string>
<string name="stopvm">ВМ ОСТАНОВИЛСЯ!</string>
<string name="noproccesses">НИКАКИХ ПРОЦЕССОВ!</string>
<string name="unknownstate">НЕИЗВЕСТНОЕ СОСТОЯНИЕ!</string>
<string name="desktopInstructions">Чтобы использовать внешнюю мышь:\n\tотключите ускорение мыши внутри гостевой ОС.\n\t\tДля DSL используйте команду: xset m 1\n\"\t\tДля других ОС отключите «Повысить точность указателя» или выберите «Мышь» \ \"usb-tablet\\" из основных опций Vectras.\n\tПодключите или подключите USB/Bluetooth-мышь и нажмите OK\n\tПереместите указатель мыши на все стороны рабочего стола для калибровки.\n\"</string>
<string name="repeater_caption"><![CDATA[Введите адрес ретранслятора <b>только в том случае, если</b> вы используете репитер типа <br><i>UltraVNC</i>.]]></string>
<string name="navigation_drawer_open">ящик открыт</string>
<string name="navigation_drawer_close">ящик закрыть</string>
<string name="address_caption">Адрес</string>
<string name="alt_check">Альтернативный вариант</string>
<string name="arrow_down">Кнопка \"Стрелка вниз</string>
<string name="arrow_left">Стрелка влево</string>
<string name="arrow_right">Правая стрелка</string>
<string name="arrow_up">Стрелка вверх</string>
<string name="auto">Авто</string>
<string name="button_send_text">Послать текст</string>
<string name="button_send_without_saving">Отправить текст/не сохранять его</string>
<string name="center_mouse">Мышь</string>
<string name="close">Закрывать</string>
<string name="color_format_caption">Цветовой формат</string>
<string name="color_mode">Цветовой режим</string>
<string name="connect_button">Соединять</string>
<string name="connection_caption">Связь</string>
<string name="control_check">Ctrl</string>
<string name="reset">Перезагрузить</string>
<string name="shutdown">Неисправность</string>
<string name="copy_list_button">Копировать список</string>
<string name="ctrl_alt_del">Ctrl-Alt-Del</string>
<string name="ctrl_c">Ctrl-c</string>
<string name="delete_connection">Удалить соединение</string>
<string name="delete_key">Удалить выбранный ключ</string>
<string name="delete_key_list">Удалить список ключей</string>
<string name="disconnect">Отключить</string>
<string name="devices">Устройства</string>
<string name="external_mouse">Внешняя мышь</string>
<string name="monitor">QEMU Монитор</string>
<string name="export_settings">Экспорт</string>
<string name="export_settings_path">Экспортировать в файл</string>
<string name="enter_text_title">Введите текст для отправки</string>
<string name="enter_text">Послать текст</string>
<string name="stretch_to_screen">Растянуть на экран</string>
<string name="fit_to_screen">По размеру экрана</string>
<string name="full_screen">Полноэкранный</string>
<string name="toggle_full_screen">Включить полноэкранный режим</string>
<string name="zoom_in">Приблизить</string>
<string name="zoom_out">Уменьшить</string>
<string name="force_full_check">Принудительно использовать полноэкранное растровое изображение</string>
<string name="import_export_settings">Настройки импорта/экспорта</string>
<string name="import_settings">Импортировать</string>
<string name="import_settings_file_url">Импорт из файла или URL-адреса</string>
<string name="info">Информация</string>
<string name="input_mode">Режим ввода</string>
<string name="input_mode_fit_to_screen">Нет Пана; Трекбольная мышь</string>
<string name="input_mode_mouse">Режим управления указателем мыши</string>
<string name="input_mode_panning">Режим панорамирования рабочего стола</string>
<string name="input_mode_touchpad_pan_trackball_mouse">Сенсорная панорама; Трекбольная мышь</string>
<string name="input_mode_dpad_pan_touchpad_mouse">Сенсорная мышь; D-Pad Панорамирование</string>
<string name="input_mode_touch_pan_zoom_mouse">Сенсорное панорамирование и масштабирование мыши</string>
<string name="input_mode_touchpad">Touchpad</string>
<string name="keep_password_button">Keep</string>
<string name="intro_dont_show">Don\'t show again</string>
<string name="keys_caption">Keys</string>
<string name="list_caption">List</string>
<string name="list_name_caption">List Name</string>
<string name="local_mouse_check">Local mouse pointer</string>
<string name="meta_key_title">Send Special Keys</string>
<string name="mouse_follow_pan">Mouse follow pan</string>
<string name="new_list_button">New List</string>
<string name="nickname_caption">Nickname</string>
<string name="off">Off</string>
<string name="on">On</string>
<string name="one_to_one">Normal (1:1)</string>
<string name="open_doc">Manual/Wiki</string>
<string name="pan_follow_mouse">Pan Follows Mouse</string>
<string name="password_caption">Password</string>
<string name="port_caption">Port</string>
<string name="repeater_button">Repeater</string>
<string name="repeater_clear">Don\'t use repeater</string>
<string name="repeater_dialog_title">Repeater Information</string>
<string name="repeater_empty_text">No repeater</string>
<string name="repeater_save">Use this repeater address</string>
<string name="save_as_copy">Save as Copy</string>
<string name="scaling">Scaling</string>
<string name="save_state">Pause VM</string>
<string name="save_snapshot">Save Snapshot</string>
<string name="scaling_zoomable">Zoomable</string>
<!-- Send selected metakey -->
<string name="send_button">Send</string>
<string name="send_key_again">Send Key Again</string>
<string name="shift_check">Shift</string>
<string name="shortcut_label">VNC Connection</string>
<string name="showkbd_label">Keyboard</string>
<string name="special_keys">Special Keys</string>
<string name="username_caption">Username</string>
<string name="email_caption">Email</string>
<string name="username_hint">For Windows Authentication</string>
<string name="right_click">Mouse Right Click</string>
<string name="help">Help</string>
<string name="drives">Drives</string>
<string name="volume">Volume</string>
<string name="hide_toolbar">Hide Toolbar</string>
<string name="view_log">View Log</string>
<string name="mode">Mode</string>
<string name="keyboard">Keyboard</string>
<string name="name">name</string>
<string name="size">size:</string>
<string name="availablity">availablity:</string>
<string name="hide">Hide</string>
<string name="title_activity_login">LoginActivity</string>
<string name="prompt_email">Email</string>
<string name="prompt_password">Password</string>
<string name="action_sign_in">Sign in</string>
<string name="action_sign_up">Sign up</string>
<string name="action_sign_with_google">Sign in with google</string>
<string name="welcome">"Welcome !"</string>
<string name="invalid_username">Not a valid username</string>
<string name="invalid_password">Password must be >5 characters</string>
<string name="login_failed">"Login failed"</string>
<string name="profile">Profile</string>
<string name="apps_amp_games"><![CDATA[Apps & Games]]></string>
<string name="vectras_website">Vectras Website</string>
<string name="about">About</string>
<string name="emulation_information">Emulation Information</string>
<string name="full_name">Full Name</string>
<string name="terms_amp_conditions"><![CDATA[Terms&Conditions]]></string>
<string name="i_accept_terms_amp_conditions"><![CDATA[I Accept Terms&Conditions]]></string>
<string name="settings">Settings</string>
<string name="go_ahead">Go ahead</string>
<string name="download">Download</string>
<string name="view_profile" translatable="false"><u><![CDATA[View Profile>>]]></u></string>
<string name="username">USERNAME</string>
<string name="save">SAVE</string>
<string name="memory_usage">Memory Usage</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="linux">linux</string>
<string name="windows">windows</string>
<string name="apple">apple</string>
<string name="external_vnc">EXTERNAL VNC</string>
<string name="hosted_successfully">HOSTED SUCCESSFULLY!</string>
<string name="ip">IP: 127.0.0.1:1</string>
<string name="install_rom">Install Rom</string>
<string name="reconnect">Reconnect</string>
<string name="display">Display</string>
<string name="calibrate_mouse">Calibrate Mouse</string>
<string name="hide_controller">HIDE CONTROLLER</string>
<string name="remove">Remove</string>
<string name="view_logs">View Logs</string>
<string name="title_activity_set_arch">SetArchActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="lorem_ipsum" translatable="false">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
<string name="choose_qemu_architicture">Choose qemu architicture:</string>
<string name="choose_qemu_architecture">Choose qemu architecture:</string>
<string name="import_custom_rom_cvbi">IMPORT CUSTOM ROM \".CVBI\"</string>
<string name="rom_name">ROM NAME</string>
<string name="rom_drive_qcow2_img_etc">ROM DRIVE (qcow2, img, etc...)</string>
<string name="qemu_params">QEMU PARAMS</string>
<string name="rom_icon">ROM ICON</string>
<string name="add">ADD</string>
<string name="import_iso">Import ISO</string>
</resources>

View file

@ -24,4 +24,28 @@
<item>SDL</item> <item>SDL</item>
<item>VNC</item> <item>VNC</item>
</string-array> </string-array>
<string-array name="vmArchLabels">
<item>X86_64 QEMU</item>
<!--<item>ARM QEMU</item>-->
</string-array>
<string-array name="vmArchValues">
<item>X86_64</item>
<!--<item>ARM</item>-->
</string-array>
<string-array name="soundCardLabels">
<item>NONE</item>
<item>ALL SOUNDCARD</item>
<item>AC97 SOUNDCARD</item>
<item>SB16 SOUNDCARD</item>
<item>ADLIB SOUNDCARD</item>
<item>PCSPK SOUNDCARD</item>
</string-array>
<string-array name="soundCardValues">
<item>None</item>
<item>all</item>
<item>ac97</item>
<item>sb16</item>
<item>adlib</item>
<item>pcspk</item>
</string-array>
</resources> </resources>

View file

@ -1,6 +1,6 @@
<resources> <resources>
<string name="app_name">Vectras VM</string> <string name="app_name" translatable="false">Vectras VM</string>
<string name="app_version">2.4</string> <string name="app_version" translatable="false">PHANTOM v2.5</string>
<string name="str_home">Home</string> <string name="str_home">Home</string>
<string name="str_logger">Logger</string> <string name="str_logger">Logger</string>
<string name="fab_info">Start Emulation</string> <string name="fab_info">Start Emulation</string>
@ -136,7 +136,7 @@
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="go_ahead">Go ahead</string> <string name="go_ahead">Go ahead</string>
<string name="download">Download</string> <string name="download">Download</string>
<string name="view_profile"><u><![CDATA[View Profile>>]]></u></string> <string name="view_profile" translatable="false"><u><![CDATA[View Profile>>]]></u></string>
<string name="username">USERNAME</string> <string name="username">USERNAME</string>
<string name="save">SAVE</string> <string name="save">SAVE</string>
<string name="memory_usage">Memory Usage</string> <string name="memory_usage">Memory Usage</string>
@ -155,4 +155,56 @@
<string name="hide_controller">HIDE CONTROLLER</string> <string name="hide_controller">HIDE CONTROLLER</string>
<string name="remove">Remove</string> <string name="remove">Remove</string>
<string name="view_logs">View Logs</string> <string name="view_logs">View Logs</string>
<string name="title_activity_set_arch">SetArchActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="lorem_ipsum" translatable="false">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
<string name="choose_qemu_architicture">Choose qemu architicture:</string>
<string name="choose_qemu_architecture">Choose qemu architecture:</string>
<string name="import_custom_rom_cvbi">IMPORT CUSTOM ROM \".CVBI\"</string>
<string name="rom_name">ROM NAME</string>
<string name="rom_drive_qcow2_img_etc">ROM DRIVE (qcow2, img, etc...)</string>
<string name="qemu_params">QEMU PARAMS</string>
<string name="rom_icon">ROM ICON</string>
<string name="add">ADD</string>
<string name="import_iso">Import ISO</string>
</resources> </resources>

View file

@ -7,7 +7,7 @@
<item name="android:windowMinWidthMajor">100%</item> <item name="android:windowMinWidthMajor">100%</item>
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
<item name="android:enforceNavigationBarContrast" tools:ignore="NewApi">false</item> <item name="android:enforceNavigationBarContrast" tools:ignore="NewApi">false</item>
<item name="android:navigationBarColor">?attr/colorSurface</item> <item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item> <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item> <item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item>
@ -25,28 +25,27 @@
<item name="android:dialogPreferenceStyle">@style/MainDialogTheme</item> <item name="android:dialogPreferenceStyle">@style/MainDialogTheme</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style> </style>
<style name="SwitchStyle" parent="Widget.Material3.CompoundButton.MaterialSwitch">
</style> <style name="SwitchStyle" parent="Widget.Material3.CompoundButton.MaterialSwitch"></style>
<style name="CardViewStyle" parent="CardView"> <style name="CardViewStyle" parent="CardView">
<item name="cardBackgroundColor">#FDFCFF</item> <item name="cardBackgroundColor">#FDFCFF</item>
</style> </style>
<style name="AppTheme.WidgetGroupChip" parent="Widget.MaterialComponents.Chip.Choice"> <style name="AppTheme.WidgetGroupChip" parent="Widget.MaterialComponents.Chip.Choice">
<item name="chipStrokeWidth">1dp</item> <item name="chipStrokeWidth">1dp</item>
</style> </style>
<style name="AppTheme.Toolbar.OverflowButton" parent="@style/Widget.AppCompat.ActionButton.Overflow"> <style name="AppTheme.Toolbar.OverflowButton" parent="@style/Widget.AppCompat.ActionButton.Overflow"></style>
</style>
<style name="AppTheme.MaterialToggleButton" parent=""> <style name="AppTheme.MaterialToggleButton" parent=""></style>
</style>
<style name="AppTheme.TabLayout.Title" parent="TextAppearance.Design.Tab"> <style name="AppTheme.TabLayout.Title" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item> <item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
</style> </style>
<style name="AppTheme.TextInput" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <style name="AppTheme.TextInput" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"></style>
</style>
<style name="PopupAnimation"> <style name="PopupAnimation">
<item name="android:windowEnterAnimation">@anim/popup_in</item> <item name="android:windowEnterAnimation">@anim/popup_in</item>
@ -61,76 +60,96 @@
<style name="PopupMenuStyle" parent="Theme.Material3.Light"> <style name="PopupMenuStyle" parent="Theme.Material3.Light">
</style> </style>
<style name="ActivityAnimation" parent="@android:style/Animation.Activity"> <style name="ActivityAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/popup_in</item> <item name="android:activityOpenEnterAnimation">@anim/popup_in</item>
<item name="android:activityOpenExitAnimation">@anim/popup_out</item> <item name="android:activityOpenExitAnimation">@anim/popup_out</item>
<item name="android:activityCloseEnterAnimation">@anim/popup_in</item> <item name="android:activityCloseEnterAnimation">@anim/popup_in</item>
<item name="android:activityCloseExitAnimation">@anim/popup_out</item> <item name="android:activityCloseExitAnimation">@anim/popup_out</item>
</style> </style>
<style name="Theme.FullScreen" parent="AppTheme">
<item name="android:windowFullscreen">true</item> <style name="Theme.FullScreen" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item> <item name="android:windowFullscreen">true</item>
<item name="android:windowTranslucentNavigation">false</item> <item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowTranslucentNavigation">false</item>
<item name="android:navigationBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="titleTextColor">@android:color/white</item> <item name="titleTextColor">@android:color/white</item>
<item name="android:textColor">@android:color/white</item> <item name="android:textColor">@android:color/white</item>
</style>
<style name="MainDialogTheme" parent="AppTheme.MaterialAlertDialog">
</style> </style>
<style name="MainDialogTheme" parent="AppTheme.MaterialAlertDialog"></style>
<!-- Alert Dialog --> <!-- Alert Dialog -->
<style name="AppTheme.MaterialAlertDialog" parent="@style/ThemeOverlay.Material3.MaterialAlertDialog"> <style name="AppTheme.MaterialAlertDialog" parent="@style/ThemeOverlay.Material3.MaterialAlertDialog">
<item name="shapeAppearanceOverlay">@style/MaterialDialog.ShapeAppearance</item> <item name="shapeAppearanceOverlay">@style/MaterialDialog.ShapeAppearance</item>
<item name="materialAlertDialogTitleTextStyle">@style/MaterialDialog.Title.Text</item> <item name="materialAlertDialogTitleTextStyle">@style/MaterialDialog.Title.Text</item>
<item name="materialAlertDialogBodyTextStyle">@style/MaterialDialog.Body.Text</item> <item name="materialAlertDialogBodyTextStyle">@style/MaterialDialog.Body.Text</item>
<item name="buttonBarPositiveButtonStyle">@style/MaterialAlertDialog.PositiveButtonStyle </item> <item name="buttonBarPositiveButtonStyle">@style/MaterialAlertDialog.PositiveButtonStyle
<item name="buttonBarNegativeButtonStyle">@style/MaterialAlertDialog.NegativeButtonStyle </item> </item>
<item name="buttonBarNeutralButtonStyle">@style/MaterialAlertDialog.NeutralButtonStyle </item> <item name="buttonBarNegativeButtonStyle">@style/MaterialAlertDialog.NegativeButtonStyle
</item>
<item name="buttonBarNeutralButtonStyle">@style/MaterialAlertDialog.NeutralButtonStyle
</item>
<item name="android:windowEnterAnimation">@animator/dialog_in</item> <item name="android:windowEnterAnimation">@animator/dialog_in</item>
<item name="android:windowExitAnimation">@animator/dialog_out</item> <item name="android:windowExitAnimation">@animator/dialog_out</item>
<!--<item name="background">?attr/colorSurface</item>--> <!--<item name="background">?attr/colorSurface</item>-->
<item name="dialogCornerRadius">28dp</item> <item name="dialogCornerRadius">28dp</item>
</style> </style>
<style name="MaterialDialog.ShapeAppearance" parent=""> <style name="MaterialDialog.ShapeAppearance" parent="">
<item name="cornerSize">10dp</item> <item name="cornerSize">10dp</item>
</style> </style>
<style name="MaterialDialog.Title.Text" parent="@style/MaterialAlertDialog.Material3.Title.Text"> <style name="MaterialDialog.Title.Text" parent="@style/MaterialAlertDialog.Material3.Title.Text">
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialDialog.Body.Text" parent="@style/MaterialAlertDialog.Material3.Body.Text"> <style name="MaterialDialog.Body.Text" parent="@style/MaterialAlertDialog.Material3.Body.Text">
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.PositiveButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.PositiveButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.NegativeButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.NegativeButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="MaterialAlertDialog.NeutralButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog"> <style name="MaterialAlertDialog.NeutralButtonStyle" parent="@style/Widget.Material3.Button.TextButton.Dialog">
<item name="backgroundTint">@android:color/transparent</item> <item name="backgroundTint">@android:color/transparent</item>
<item name="fontFamily">@font/josefin_sans</item> <item name="fontFamily">@font/josefin_sans</item>
</style> </style>
<style name="ThemeEditText" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <style name="ThemeEditText" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<item name="colorPrimary">@android:color/white</item> <item name="colorPrimary">@android:color/white</item>
<item name="colorPrimaryDark">@android:color/white</item> <item name="colorPrimaryDark">@android:color/white</item>
<item name="boxStrokeColor">#ffffff</item> <item name="boxStrokeColor">#ffffff</item>
<item name="boxStrokeWidth">2dp</item> <item name="boxStrokeWidth">2dp</item>
</style> </style>
<style name="MyCheckBoxStyle" parent="Widget.Material3.CompoundButton.CheckBox"> <style name="MyCheckBoxStyle" parent="Widget.Material3.CompoundButton.CheckBox">
<item name="android:theme">@style/MyCheckboxTheme</item> <item name="android:theme">@style/MyCheckboxTheme</item>
</style> </style>
<style name="MyCheckboxTheme"> <style name="MyCheckboxTheme">
</style> </style>
<style name="DialogAnimation"> <style name="DialogAnimation">
<item name="android:windowEnterAnimation">@anim/slide_in_bottom</item> <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/slide_out_bottom</item> <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style> </style>
<style name="Preference.SwitchPreferenceCompat" parent="@style/Preference.SwitchPreferenceCompat.Material"
tools:ignore="ResourceCycle"> <style name="Preference.SwitchPreferenceCompat" parent="@style/Preference.SwitchPreferenceCompat.Material" tools:ignore="ResourceCycle">
<item name="widgetLayout">@layout/switch_mui3</item> <item name="widgetLayout">@layout/switch_mui3</item>
</style> </style>
<!-- Base application theme. -->
<style name="Base.AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
</resources> </resources>

View file

@ -7,6 +7,17 @@
android:title="QEMU" android:title="QEMU"
app:icon="@drawable/ic_qemu"> app:icon="@drawable/ic_qemu">
<ListPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="X86_64"
android:entries="@array/vmArchLabels"
android:entryValues="@array/vmArchValues"
android:key="vmArch"
android:title="VM ARCH"
app:icon="@drawable/ic_arch"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -22,9 +33,19 @@
android:key="memory" android:key="memory"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:singleLine="true" android:singleLine="true"
android:title="MEMORY" android:title="MEMORY (MB)"
app:useSimpleSummaryProvider="true" app:useSimpleSummaryProvider="true"
app:icon="@drawable/round_memory_24" /> app:icon="@drawable/round_memory_24" />
<ListPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="None"
android:entries="@array/soundCardLabels"
android:entryValues="@array/soundCardValues"
android:key="soundCard"
android:title="SOUND CARD"
app:icon="@drawable/round_volume_up_24"
app:useSimpleSummaryProvider="true" />
<EditTextPreference <EditTextPreference
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -33,23 +54,32 @@
android:key="TbSize" android:key="TbSize"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:singleLine="true" android:singleLine="true"
android:title="TB SIZE (MB)" android:title="TB SIZE (KB)"
app:useSimpleSummaryProvider="true" app:useSimpleSummaryProvider="true"
app:icon="@drawable/ic_t" /> app:icon="@drawable/ic_t" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:defaultValue="false" android:defaultValue="true"
android:key="AVX" android:key="AVX"
android:title="AVX" android:title="AVX"
app:icon="@drawable/ic_a" /> app:icon="@drawable/ic_a" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:defaultValue="false" android:defaultValue="true"
android:key="MTTCG" android:key="MTTCG"
android:title="MTTCG" android:title="MTTCG"
android:summary="multi tcg acceleration"
app:icon="@drawable/ic_mttcg" /> app:icon="@drawable/ic_mttcg" />
<SwitchPreferenceCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="false"
android:key="kvm"
android:summary="kvm acceleration"
android:title="KVM"
app:icon="@drawable/ic_kvm" />
<ListPreference <ListPreference
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -63,7 +93,7 @@
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:defaultValue="false" android:defaultValue="true"
android:title="VIRTIO HARDDISK" android:title="VIRTIO HARDDISK"
android:key="virtio" android:key="virtio"
android:summaryOff="hdd type: ide" android:summaryOff="hdd type: ide"
@ -108,7 +138,7 @@
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:defaultValue="true" android:defaultValue="false"
android:key="UsbTablet" android:key="UsbTablet"
android:title="USB TABLET" android:title="USB TABLET"
app:summaryOn="mouse: usb tablet" app:summaryOn="mouse: usb tablet"