mirror of
https://github.com/2009scape/2009Scape-mobile.git
synced 2026-08-01 14:19:12 -06:00
new SD controls (ported)
This commit is contained in:
parent
1b30b48496
commit
f28c46638d
9 changed files with 313 additions and 422 deletions
Binary file not shown.
|
|
@ -59,21 +59,13 @@ public class DummyLauncher extends BaseActivity {
|
|||
mProgressLayout.observe(ProgressLayout.INSTALL_MODPACK);
|
||||
|
||||
playHD.setOnClickListener(view -> {
|
||||
Log.i("downthecrop","hello from play HD touch");
|
||||
if(mProgressLayout.hasProcesses()){
|
||||
Toast.makeText(this, R.string.tasks_ongoing, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
if(!runtimeReady()) return;
|
||||
Intent intent = new Intent(DummyLauncher.this, MainActivity.class);
|
||||
startActivity(intent);
|
||||
});
|
||||
|
||||
playSD.setOnClickListener(view -> {
|
||||
Log.i("downthecrop","hello from play SD touch");
|
||||
if(mProgressLayout.hasProcesses()){
|
||||
Toast.makeText(this, R.string.tasks_ongoing, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
if(!runtimeReady()) return;
|
||||
Intent intent = new Intent(DummyLauncher.this, JavaGUILauncherActivity.class);
|
||||
startActivity(intent);
|
||||
});
|
||||
|
|
@ -81,6 +73,13 @@ public class DummyLauncher extends BaseActivity {
|
|||
}
|
||||
|
||||
|
||||
private boolean runtimeReady(){
|
||||
if(mProgressLayout.hasProcesses()){
|
||||
Toast.makeText(this, R.string.tasks_ongoing, Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
private void showBottomDialog() {
|
||||
|
|
@ -88,69 +87,6 @@ public class DummyLauncher extends BaseActivity {
|
|||
dialog.show(getSupportFragmentManager(), "tag");
|
||||
}
|
||||
|
||||
private void showFileChooser(int requestCode) {
|
||||
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
|
||||
switch(requestCode){
|
||||
case FILE_SELECT_CODE_JSON:
|
||||
intent.setType("application/json");
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
break;
|
||||
case FILE_SELECT_CODE_ZIP:
|
||||
intent.setType("application/zip");
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
break;
|
||||
default:
|
||||
intent.setType("*/*");
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
startActivityForResult(
|
||||
Intent.createChooser(intent, "Select a File to Upload"),
|
||||
requestCode);
|
||||
} catch (android.content.ActivityNotFoundException ex) {
|
||||
// Potentially direct the user to the Market with a Dialog
|
||||
Toast.makeText(this, "Please install a File Manager.",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (requestCode == FILE_SELECT_CODE_JSON) {
|
||||
if (resultCode == RESULT_OK) {
|
||||
Uri uri = data.getData();
|
||||
|
||||
// TODO: Change destination based on file type
|
||||
File config = new File(Tools.DIR_DATA, "config.json");
|
||||
try {
|
||||
Log.d("TAG", "Starting copy: " + uri.getPath());
|
||||
InputStream inputStream = getContentResolver().openInputStream(uri);
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(config);
|
||||
byte buf[] = new byte[1024];
|
||||
int len;
|
||||
while ((len = inputStream.read(buf)) > 0) {
|
||||
fileOutputStream.write(buf, 0, len);
|
||||
}
|
||||
|
||||
Toast.makeText(this, "Config loaded. Please restart the app.",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
fileOutputStream.close();
|
||||
inputStream.close();
|
||||
|
||||
// TODO: unzip the plugin here
|
||||
} catch (IOException e1) {
|
||||
Log.d("error", "Error with file " + e1);
|
||||
}
|
||||
}
|
||||
}
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
|
|
|||
|
|
@ -4,13 +4,16 @@ import static net.kdt.pojavlaunch.MainActivity.fullyExit;
|
|||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Toast;
|
||||
|
|
@ -36,7 +39,6 @@ import java.io.InputStream;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
|
@ -50,9 +52,12 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
private LinearLayout mTouchPad;
|
||||
private ImageView mMousePointerImageView;
|
||||
private GestureDetector mGestureDetector;
|
||||
|
||||
private boolean cameraMode = false;
|
||||
private long lastPress = 0;
|
||||
private ScaleGestureDetector scaleGestureDetector;
|
||||
private boolean rcState = false;
|
||||
private boolean mSkipDetectMod, mIsVirtualMouseEnabled;
|
||||
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
|
@ -71,21 +76,20 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
mTouchCharInput = findViewById(R.id.awt_touch_char);
|
||||
mTouchCharInput.setCharacterSender(new AwtCharSender());
|
||||
|
||||
findViewById(R.id.mouseMode).setOnTouchListener(this);
|
||||
findViewById(R.id.keyboard).setOnTouchListener(this);
|
||||
findViewById(R.id.camera).setOnTouchListener(this);
|
||||
findViewById(R.id.mb2).setOnTouchListener(this);
|
||||
|
||||
mTouchPad = findViewById(R.id.main_touchpad);
|
||||
mLoggerView = findViewById(R.id.launcherLoggerView);
|
||||
mMousePointerImageView = findViewById(R.id.main_mouse_pointer);
|
||||
mTextureView = findViewById(R.id.installmod_surfaceview);
|
||||
scaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());
|
||||
mGestureDetector = new GestureDetector(this, new SingleTapConfirm());
|
||||
mTouchPad.setFocusable(false);
|
||||
mTouchPad.setVisibility(View.GONE);
|
||||
|
||||
findViewById(R.id.installmod_mouse_pri).setOnTouchListener(this);
|
||||
findViewById(R.id.installmod_mouse_sec).setOnTouchListener(this);
|
||||
findViewById(R.id.installmod_window_moveup).setOnTouchListener(this);
|
||||
findViewById(R.id.installmod_window_movedown).setOnTouchListener(this);
|
||||
findViewById(R.id.installmod_window_moveleft).setOnTouchListener(this);
|
||||
findViewById(R.id.installmod_window_moveright).setOnTouchListener(this);
|
||||
|
||||
mMousePointerImageView.post(() -> {
|
||||
ViewGroup.LayoutParams params = mMousePointerImageView.getLayoutParams();
|
||||
params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE);
|
||||
|
|
@ -96,6 +100,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
float prevX = 0, prevY = 0;
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
scaleGestureDetector.onTouchEvent(event);
|
||||
// MotionEvent reports input details from the touch screen
|
||||
// and other input controls. In this case, you are only
|
||||
// interested in events where the touch position changed.
|
||||
|
|
@ -200,48 +205,59 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
decorView.setSystemUiVisibility(uiOptions);
|
||||
}
|
||||
|
||||
public static class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
|
||||
@Override
|
||||
public boolean onScale(ScaleGestureDetector detector) {
|
||||
float scaleFactor = detector.getScaleFactor();
|
||||
if (scaleFactor > 1) { //Send F4 To Zoom Out
|
||||
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F3, AWTInputEvent.VK_F3);
|
||||
} else { //116 F3 To Zoom In
|
||||
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F4,AWTInputEvent.VK_F4);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onScaleBegin(ScaleGestureDetector detector) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScaleEnd(ScaleGestureDetector detector) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent e) {
|
||||
boolean isDown;
|
||||
switch (e.getActionMasked()) {
|
||||
case MotionEvent.ACTION_DOWN: // 0
|
||||
case MotionEvent.ACTION_POINTER_DOWN: // 5
|
||||
isDown = true;
|
||||
break;
|
||||
case MotionEvent.ACTION_UP: // 1
|
||||
case MotionEvent.ACTION_CANCEL: // 3
|
||||
case MotionEvent.ACTION_POINTER_UP: // 6
|
||||
isDown = false;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (v.getId()) {
|
||||
case R.id.installmod_mouse_pri:
|
||||
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK, isDown);
|
||||
break;
|
||||
|
||||
case R.id.installmod_mouse_sec:
|
||||
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON3_DOWN_MASK, isDown);
|
||||
break;
|
||||
}
|
||||
if(isDown) switch(v.getId()) {
|
||||
case R.id.installmod_window_moveup:
|
||||
AWTInputBridge.nativeMoveWindow(0, -10);
|
||||
break;
|
||||
case R.id.installmod_window_movedown:
|
||||
AWTInputBridge.nativeMoveWindow(0, 10);
|
||||
break;
|
||||
case R.id.installmod_window_moveleft:
|
||||
AWTInputBridge.nativeMoveWindow(-10, 0);
|
||||
break;
|
||||
case R.id.installmod_window_moveright:
|
||||
AWTInputBridge.nativeMoveWindow(10, 0);
|
||||
break;
|
||||
public boolean onTouch(View v, MotionEvent e) { // these AWTInputEvent doesn't work for some reason
|
||||
long time = System.currentTimeMillis();
|
||||
if (time > lastPress + 500) {
|
||||
switch (v.getId()) {
|
||||
case R.id.keyboard:
|
||||
toggleKeyboard(this.getCurrentFocus());
|
||||
break;
|
||||
case R.id.mb2:
|
||||
if (!rcState) {
|
||||
activateRC(); // Send F11 to activate RightClick
|
||||
} else {
|
||||
clearRC(); // Send F10 to clear RightClick
|
||||
}
|
||||
break;
|
||||
case R.id.camera:
|
||||
AWTInputBridge.sendKey((char) AWTInputEvent.VK_F9, AWTInputEvent.VK_F9);
|
||||
if (!cameraMode) { // Camera Mode On
|
||||
Log.i("downthecrop", "Hello from the camrea Button");
|
||||
//AWTInputBridge.sendKey((char) AWTInputEvent.VK_F9, AWTInputEvent.VK_F9); // Send F9
|
||||
cameraMode = true;
|
||||
} else { // Camera Mode off
|
||||
AWTInputBridge.sendKey((char) AWTInputEvent.VK_F8, AWTInputEvent.VK_F8);
|
||||
cameraMode = false;
|
||||
}
|
||||
break;
|
||||
case R.id.mouseMode:
|
||||
toggleVirtualMouse(this.getCurrentFocus());
|
||||
}
|
||||
lastPress = time;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -259,6 +275,16 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
mMousePointerImageView.setY(y);
|
||||
}
|
||||
|
||||
private void clearRC(){
|
||||
rcState = false;
|
||||
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F10,AWTInputEvent.VK_F10);
|
||||
}
|
||||
|
||||
private void activateRC(){
|
||||
rcState = true;
|
||||
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F11,AWTInputEvent.VK_F11);
|
||||
}
|
||||
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
void sendScaledMousePosition(float x, float y){
|
||||
// Clamp positions to the borders of the usable view, then scale them
|
||||
|
|
@ -271,10 +297,6 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
);
|
||||
}
|
||||
|
||||
public void forceClose(View v) {
|
||||
MainActivity.dialogForceClose(this);
|
||||
}
|
||||
|
||||
public void openLogOutput(View v) {
|
||||
mLoggerView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
|
@ -309,61 +331,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private int doCustomInstall(Runtime runtime, File modFile, String javaArgs) {
|
||||
mSkipDetectMod = true;
|
||||
return launchJavaRuntime(runtime, javaArgs);
|
||||
}
|
||||
|
||||
public void toggleKeyboard(View view) {
|
||||
mTouchCharInput.switchKeyboardState();
|
||||
}
|
||||
public void performCopy(View view) {
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_CONTROL, 1);
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_C);
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_CONTROL, 0);
|
||||
}
|
||||
|
||||
public void performPaste(View view) {
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_CONTROL, 1);
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_V);
|
||||
AWTInputBridge.sendKey(' ', AWTInputEvent.VK_CONTROL, 0);
|
||||
}
|
||||
|
||||
public int getJavaVersion(File modFile) {
|
||||
try (ZipFile zipFile = new ZipFile(modFile)){
|
||||
ZipEntry manifest = zipFile.getEntry("META-INF/MANIFEST.MF");
|
||||
if(manifest == null) return -1;
|
||||
|
||||
String manifestString = Tools.read(zipFile.getInputStream(manifest));
|
||||
String mainClass = Tools.extractUntilCharacter(manifestString, "Main-Class:", '\n');
|
||||
if(mainClass == null) return -1;
|
||||
|
||||
mainClass = mainClass.trim().replace('.', '/') + ".class";
|
||||
ZipEntry mainClassFile = zipFile.getEntry(mainClass);
|
||||
if(mainClassFile == null) return -1;
|
||||
|
||||
InputStream classStream = zipFile.getInputStream(mainClassFile);
|
||||
byte[] bytesWeNeed = new byte[8];
|
||||
int readCount = classStream.read(bytesWeNeed);
|
||||
classStream.close();
|
||||
if(readCount < 8) return -1;
|
||||
|
||||
ByteBuffer byteBuffer = ByteBuffer.wrap(bytesWeNeed);
|
||||
if(byteBuffer.getInt() != 0xCAFEBABE) return -1;
|
||||
short minorVersion = byteBuffer.getShort();
|
||||
short majorVersion = byteBuffer.getShort();
|
||||
Log.i("JavaGUILauncher", majorVersion+","+minorVersion);
|
||||
return classVersionToJavaVersion(majorVersion);
|
||||
}catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
public static int classVersionToJavaVersion(int majorVersion) {
|
||||
if(majorVersion < 46) return 2; // there isn't even an arm64 port of jre 1.1 (or anything before 1.8 in fact)
|
||||
return majorVersion - 44;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -286,7 +286,8 @@ public class LauncherActivity extends BaseActivity {
|
|||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
if (requestCode == REQUEST_STORAGE_REQUEST_CODE){
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (requestCode == REQUEST_STORAGE_REQUEST_CODE) {
|
||||
synchronized (mLockStoragePerm) {
|
||||
mLockStoragePerm.notifyAll();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,26 @@
|
|||
package net.kdt.pojavlaunch;
|
||||
|
||||
import static android.app.Activity.RESULT_OK;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Dialog;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
|
@ -22,12 +32,23 @@ import net.kdt.pojavlaunch.extra.ExtraConstants;
|
|||
import net.kdt.pojavlaunch.extra.ExtraCore;
|
||||
import net.kdt.pojavlaunch.extra.ExtraListener;
|
||||
import net.kdt.pojavlaunch.prefs.screens.LauncherPreferenceFragment;
|
||||
import net.kdt.pojavlaunch.tasks.AsyncAssetManager;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class MyDialogFragment extends DialogFragment {
|
||||
|
||||
private static final int FILE_SELECT_CODE_JSON = 0;
|
||||
private static final int FILE_SELECT_CODE_ZIP = 1;
|
||||
|
||||
private static LinearLayout pluginList;
|
||||
private static File disabledPluginsDirectory;
|
||||
private static File pluginsDirectory;
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
|
|
@ -40,6 +61,8 @@ public class MyDialogFragment extends DialogFragment {
|
|||
|
||||
final Button loadConfig = dialog.findViewById(R.id.loadConfig);
|
||||
final Button loadPlugin = dialog.findViewById(R.id.loadPlugin);
|
||||
pluginList = dialog.findViewById(R.id.pluginsList);
|
||||
addPluginsToList();
|
||||
|
||||
loadConfig.setOnTouchListener((v, event) -> {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
|
|
@ -83,6 +106,144 @@ public class MyDialogFragment extends DialogFragment {
|
|||
return false;
|
||||
};
|
||||
|
||||
private void addPluginsToList() {
|
||||
// Path for plugins and disabled plugins
|
||||
pluginsDirectory = new File(Tools.DIR_DATA + "/plugins/");
|
||||
disabledPluginsDirectory = new File(Tools.DIR_DATA + "/disabledPlugins/");
|
||||
|
||||
// Check if disabledPluginsDirectory exists, if not, create it.
|
||||
if (!disabledPluginsDirectory.exists()) {
|
||||
boolean success = disabledPluginsDirectory.mkdirs();
|
||||
if (!success) {
|
||||
Log.e("TAG", "Failed to create directory: " + disabledPluginsDirectory.getPath());
|
||||
// If we failed to create the directory, we can return early from this method
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Clear the existing list
|
||||
pluginList.removeAllViews();
|
||||
|
||||
// Process the enabled plugins
|
||||
processPluginDirectory(pluginsDirectory, true);
|
||||
|
||||
// Process the disabled plugins
|
||||
processPluginDirectory(disabledPluginsDirectory, false);
|
||||
}
|
||||
|
||||
private void processPluginDirectory(File directory, boolean enabled) {
|
||||
File[] files = directory.listFiles();
|
||||
|
||||
if (files != null) { // Make sure the directory isn't empty
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) { // This line weeds out other directories/folders
|
||||
// Create a new LinearLayout
|
||||
LinearLayout newLinearLayout = new LinearLayout(getContext());
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.setMargins(0, 10, 0, 10); // Top margin is 10dp
|
||||
newLinearLayout.setLayoutParams(layoutParams);
|
||||
newLinearLayout.setPadding(10, 10, 10, 10); // Padding is 10dp
|
||||
newLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
|
||||
|
||||
// Create a new TextView
|
||||
TextView textView = new TextView(getContext());
|
||||
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
textParams.setMargins(30, 0, 0, 0); // Left margin is 30dp
|
||||
textView.setLayoutParams(textParams);
|
||||
textView.setText(file.getName());
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); // Text size is 16sp
|
||||
|
||||
// Create a new Switch
|
||||
Switch pluginSwitch = new Switch(getContext());
|
||||
pluginSwitch.setChecked(enabled); // Set the initial state based on the directory
|
||||
|
||||
// Set an onCheckedChangeListener on the Switch
|
||||
pluginSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
File fromDir = isChecked ? disabledPluginsDirectory : pluginsDirectory;
|
||||
File toDir = isChecked ? pluginsDirectory : disabledPluginsDirectory;
|
||||
|
||||
File fromFile = new File(fromDir, file.getName());
|
||||
File toFile = new File(toDir, file.getName());
|
||||
|
||||
// Move the directory
|
||||
boolean success = fromFile.renameTo(toFile);
|
||||
|
||||
if (!success) {
|
||||
// Handle failure
|
||||
Log.e("TAG", "Failed to move directory: " + fromFile.getPath() + " to " + toFile.getPath());
|
||||
}
|
||||
});
|
||||
|
||||
// Add the TextView and Switch to the LinearLayout
|
||||
newLinearLayout.addView(textView);
|
||||
newLinearLayout.addView(pluginSwitch);
|
||||
|
||||
// Add the LinearLayout to the parent layout
|
||||
pluginList.addView(newLinearLayout);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (requestCode == FILE_SELECT_CODE_JSON) {
|
||||
if (resultCode == RESULT_OK) {
|
||||
Uri uri = data.getData();
|
||||
File config = new File(Tools.DIR_DATA, "config.json"); // file to overwrite
|
||||
try {
|
||||
Log.d("TAG", "Starting copy: " + uri.getPath());
|
||||
InputStream inputStream = getContext().getContentResolver().openInputStream(uri);
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(config);
|
||||
byte buf[] = new byte[1024];
|
||||
int len;
|
||||
while ((len = inputStream.read(buf)) > 0) {
|
||||
fileOutputStream.write(buf, 0, len);
|
||||
}
|
||||
Toast.makeText(getContext(), "Config loaded. Please restart the app.",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
fileOutputStream.close();
|
||||
inputStream.close();
|
||||
} catch (IOException e1) {
|
||||
Log.d("error", "Error with file " + e1);
|
||||
}
|
||||
}
|
||||
} else if(requestCode == FILE_SELECT_CODE_ZIP) {
|
||||
Uri uri = data.getData();
|
||||
// Create a temporary file in your app's cache directory
|
||||
File tempFile = new File(getContext().getCacheDir(), "temp.zip");
|
||||
|
||||
try {
|
||||
// Open an InputStream to the selected file
|
||||
InputStream inputStream = getContext().getContentResolver().openInputStream(uri);
|
||||
|
||||
// Open a FileOutputStream to your temporary file
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
|
||||
|
||||
// Copy the contents
|
||||
byte[] buffer = new byte[1024];
|
||||
int read;
|
||||
while ((read = inputStream.read(buffer)) != -1) {
|
||||
fileOutputStream.write(buffer, 0, read);
|
||||
}
|
||||
|
||||
// Close the streams
|
||||
fileOutputStream.close();
|
||||
inputStream.close();
|
||||
|
||||
// Now you can pass the File object to your method
|
||||
AsyncAssetManager.extractPluginZip(tempFile);
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
private void showFileChooser(int requestCode) {
|
||||
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
|
||||
|
|
@ -92,7 +253,9 @@ public class MyDialogFragment extends DialogFragment {
|
|||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
break;
|
||||
case FILE_SELECT_CODE_ZIP:
|
||||
intent.setType("application/zip");
|
||||
intent.setType("*/*");
|
||||
String[] mimetypes = {"application/zip", "application/x-zip-compressed", "multipart/x-zip"};
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
break;
|
||||
default:
|
||||
|
|
@ -100,8 +263,6 @@ public class MyDialogFragment extends DialogFragment {
|
|||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
startActivityForResult(
|
||||
Intent.createChooser(intent, "Select a File to Upload"),
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ import java.io.InputStream;
|
|||
|
||||
public class AsyncAssetManager {
|
||||
|
||||
private static final String PLUGIN_PATH = "plugins";
|
||||
|
||||
private AsyncAssetManager(){}
|
||||
|
||||
/**
|
||||
|
|
@ -86,8 +88,8 @@ public class AsyncAssetManager {
|
|||
unpackComponent(ctx, "security", true);
|
||||
unpackComponent(ctx, "arc_dns_injector", true);
|
||||
unpackComponent(ctx, "forge_installer", true);
|
||||
Tools.copyAssetFile(ctx,"rt4.jar",Tools.DIR_DATA, true);
|
||||
Tools.copyAssetFile(ctx,"config.json",Tools.DIR_DATA, true);
|
||||
Tools.copyAssetFile(ctx,"rt4.jar",Tools.DIR_DATA, true); // Change this to true for debugging
|
||||
Tools.copyAssetFile(ctx,"config.json",Tools.DIR_DATA, false);
|
||||
|
||||
// Unzip the plugins for use.
|
||||
extractAllPlugins(ctx); // Can comment this out to keep the plugins saved, rewrites them ever time it launches...
|
||||
|
|
@ -99,14 +101,36 @@ public class AsyncAssetManager {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
private static void extractAllPlugins(Context ctx) throws IOException {
|
||||
String pluginsPath = "plugins"; // The folder where your plugins reside in the assets
|
||||
AssetManager am = ctx.getAssets();
|
||||
String[] plugins = am.list(pluginsPath);
|
||||
if(plugins != null) {
|
||||
for(String plugin : plugins) {
|
||||
Tools.copyAssetFile(ctx, pluginsPath + "/" + plugin, Tools.DIR_DATA, true);
|
||||
// Path for plugins and disabled plugins
|
||||
File pluginsDirectory = new File(Tools.DIR_DATA + "/plugins/");
|
||||
File disabledPluginsDirectory = new File(Tools.DIR_DATA + "/disabledPlugins/");
|
||||
|
||||
// Check if disabledPluginsDirectory exists, if not, create it.
|
||||
if (!disabledPluginsDirectory.exists()) {
|
||||
boolean success = disabledPluginsDirectory.mkdirs();
|
||||
if (!success) {
|
||||
Log.e("TAG", "Failed to create directory: " + disabledPluginsDirectory.getPath());
|
||||
// If we failed to create the directory, we can return early from this method
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
String[] plugins = ctx.getAssets().list(PLUGIN_PATH);
|
||||
if (plugins != null) {
|
||||
for (String plugin : plugins) {
|
||||
// Name of the directory that would be created when the plugin is extracted
|
||||
String pluginDirectoryName = plugin.substring(0, plugin.lastIndexOf('.'));
|
||||
File installedPluginDirectory = new File(pluginsDirectory, pluginDirectoryName);
|
||||
File disabledPluginDirectory = new File(disabledPluginsDirectory, pluginDirectoryName);
|
||||
|
||||
// If a directory with this name already exists in either the plugins directory or the disabled plugins directory, skip this plugin
|
||||
if (installedPluginDirectory.exists() || disabledPluginDirectory.exists()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Extract the plugin
|
||||
Tools.copyAssetFile(ctx, PLUGIN_PATH + "/" + plugin, Tools.DIR_DATA, true);
|
||||
Tools.ZipTool.unzip(
|
||||
new File(Tools.DIR_DATA + "/" + plugin),
|
||||
new File(Tools.DIR_DATA + "/plugins/")
|
||||
|
|
@ -115,6 +139,11 @@ public class AsyncAssetManager {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public static void extractPluginZip(File plugin) throws IOException {
|
||||
Tools.ZipTool.unzip(plugin, new File(Tools.DIR_DATA + "/plugins/"));
|
||||
}
|
||||
|
||||
private static void unpackComponent(Context ctx, String component, boolean privateDirectory) throws IOException {
|
||||
AssetManager am = ctx.getAssets();
|
||||
String rootDir = privateDirectory ? Tools.DIR_DATA : Tools.DIR_GAME_HOME;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<solid
|
||||
android:color="#ffff"/>
|
||||
android:color="#232323"/>
|
||||
|
||||
<corners
|
||||
android:topLeftRadius="40dp"
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
android:ems="10"
|
||||
android:imeOptions="flagNoFullscreen|flagNoExtractUi|flagNoPersonalizedLearning|actionDone"
|
||||
android:inputType="textFilter|textImeMultiLine|textAutoComplete|textAutoCorrect"
|
||||
tools:ignore="TouchTargetSizeCheck"
|
||||
tools:ignore="MissingConstraints,TouchTargetSizeCheck"
|
||||
/>
|
||||
|
||||
<net.kdt.pojavlaunch.AWTCanvasView
|
||||
|
|
@ -49,141 +49,41 @@
|
|||
</LinearLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_btn2"
|
||||
android:id="@+id/keyboard"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="forceClose"
|
||||
android:text="@string/control_forceclose"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_btn3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@id/installmod_btn2"
|
||||
android:layout_marginTop="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="openLogOutput"
|
||||
android:text="@string/control_viewout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@id/installmod_btn2"
|
||||
app:layout_constraintTop_toBottomOf="@+id/installmod_btn2" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@id/installmod_btn3"
|
||||
android:layout_marginTop="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="toggleVirtualMouse"
|
||||
android:text="@string/control_mouse"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintRight_toLeftOf="@id/installmod_btn3"
|
||||
app:layout_constraintTop_toBottomOf="@+id/installmod_btn3" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="toggleKeyboard"
|
||||
android:text="Keyboard"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="performCopy"
|
||||
android:text="Copy"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/button" />
|
||||
|
||||
<Button
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:onClick="performPaste"
|
||||
android:text="Paste"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/button3" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_mouse_pri"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="@string/control_primary"
|
||||
app:layout_constraintBottom_toTopOf="@+id/installmod_mouse_sec"
|
||||
android:text="K"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_mouse_sec"
|
||||
android:id="@+id/mb2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_toRightOf="@id/installmod_mouse_pri"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="@string/control_secondary"
|
||||
android:text="RC"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toRightOf="@id/installmod_mouse_pri"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintStart_toEndOf="@+id/keyboard" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_window_moveleft"
|
||||
android:id="@+id/mouseMode"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="◀"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
android:text="M"
|
||||
app:layout_constraintBottom_toTopOf="@+id/keyboard"
|
||||
app:layout_constraintStart_toStartOf="@+id/keyboard" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_window_moveright"
|
||||
android:id="@+id/camera"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_toRightOf="@id/installmod_mouse_pri"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="▶"
|
||||
app:layout_constraintBottom_toTopOf="@+id/installmod_window_moveleft"
|
||||
app:layout_constraintEnd_toEndOf="@+id/installmod_window_moveleft" />
|
||||
android:text="C"
|
||||
app:layout_constraintBottom_toTopOf="@+id/mb2"
|
||||
app:layout_constraintStart_toStartOf="@+id/mb2" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_window_moveup"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_toRightOf="@id/installmod_mouse_pri"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="▲"
|
||||
app:layout_constraintBottom_toTopOf="@+id/installmod_window_moveleft"
|
||||
app:layout_constraintEnd_toStartOf="@+id/installmod_window_moveright" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/installmod_window_movedown"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="@drawable/control_button"
|
||||
android:text="▼"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/installmod_window_moveleft" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<FrameLayout
|
||||
android:id="@+id/prefContainer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="400dp"
|
||||
android:layout_height="match_parent"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
|
|
@ -35,72 +35,19 @@
|
|||
android:padding="8dp"
|
||||
android:text="Settings"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="#000000"
|
||||
android:textSize="25dp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/mouseSpeed"
|
||||
android:layout_width="match_parent"
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:orientation="horizontal"
|
||||
android:padding="10dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Mouse Speed"
|
||||
android:textColor="#000000"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Plugins"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold" />
|
||||
<LinearLayout
|
||||
android:id="@+id/userName"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Auto Login"
|
||||
android:textColor="#000000"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginRight="30dp"
|
||||
android:background="#6F000000"
|
||||
android:hint="Username"
|
||||
android:padding="10dp"
|
||||
android:textColor="#ffffff"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:layout_marginRight="30dp"
|
||||
android:background="#6F000000"
|
||||
android:hint="Password"
|
||||
android:inputType="textPassword"
|
||||
android:padding="10dp"
|
||||
android:textColor="#ffffff"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/plugins"
|
||||
android:id="@+id/pluginsContainer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
|
|
@ -109,61 +56,10 @@
|
|||
android:padding="10dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/pluginsList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Plugins"
|
||||
android:textColor="#000000"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/plugin2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:orientation="horizontal"
|
||||
android:padding="10dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Plugin1"
|
||||
android:textColor="#000000"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/plugin1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:orientation="horizontal"
|
||||
android:padding="10dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:text="Plugin2"
|
||||
android:textColor="#000000"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<Switch
|
||||
android:id="@+id/switch1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="Switch" />
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue