mirror of
https://github.com/2009scape/2009Scape-mobile.git
synced 2025-12-20 13:30:15 -07:00
Note: it's not yet exposed in Per-Version-Config and doesn't select automatically for versions that require certain runtimes
381 lines
15 KiB
Java
381 lines
15 KiB
Java
package net.kdt.pojavlaunch;
|
|
|
|
import android.graphics.*;
|
|
import android.os.*;
|
|
import android.util.*;
|
|
import android.view.*;
|
|
import android.view.View.*;
|
|
import android.widget.*;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
import net.kdt.pojavlaunch.multirt.MultiRTUtils;
|
|
import net.kdt.pojavlaunch.prefs.*;
|
|
import net.kdt.pojavlaunch.utils.*;
|
|
import org.lwjgl.glfw.*;
|
|
|
|
import static net.kdt.pojavlaunch.utils.MathUtils.map;
|
|
|
|
public class JavaGUILauncherActivity extends LoggableActivity implements View.OnTouchListener {
|
|
private static final int MSG_LEFT_MOUSE_BUTTON_CHECK = 1028;
|
|
|
|
private AWTCanvasView mTextureView;
|
|
private LinearLayout contentLog;
|
|
private TextView textLog;
|
|
private ScrollView contentScroll;
|
|
private ToggleButton toggleLog;
|
|
|
|
private LinearLayout touchPad;
|
|
private ImageView mousePointer;
|
|
private GestureDetector gestureDetector;
|
|
|
|
private File logFile;
|
|
private PrintStream logStream;
|
|
|
|
private final Object mDialogLock = new Object();
|
|
|
|
private boolean isLogAllow, mSkipDetectMod;
|
|
|
|
private boolean rightOverride = false;
|
|
private int scaleFactor;
|
|
private int[] scaleFactors = initScaleFactors();
|
|
|
|
private final int fingerStillThreshold = 8;
|
|
private int initialX;
|
|
private int initialY;
|
|
private static boolean triggeredLeftMouseButton = false;
|
|
private Handler theHandler = new Handler() {
|
|
public void handleMessage(Message msg) {
|
|
switch (msg.what) {
|
|
case MSG_LEFT_MOUSE_BUTTON_CHECK: {
|
|
int x = CallbackBridge.mouseX;
|
|
int y = CallbackBridge.mouseY;
|
|
if (CallbackBridge.isGrabbing() &&
|
|
Math.abs(initialX - x) < fingerStillThreshold &&
|
|
Math.abs(initialY - y) < fingerStillThreshold) {
|
|
triggeredLeftMouseButton = true;
|
|
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK, true);
|
|
}
|
|
} break;
|
|
}
|
|
}
|
|
};
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.install_mod);
|
|
|
|
Tools.updateWindowSize(this);
|
|
|
|
try {
|
|
MultiRTUtils.setRuntimeNamed(this,LauncherPreferences.PREF_DEFAULT_RUNTIME);
|
|
gestureDetector = new GestureDetector(this, new SingleTapConfirm());
|
|
|
|
findViewById(R.id.installmod_mouse_pri).setOnTouchListener(this);
|
|
findViewById(R.id.installmod_mouse_sec).setOnTouchListener(this);
|
|
|
|
this.touchPad = findViewById(R.id.main_touchpad);
|
|
touchPad.setFocusable(false);
|
|
|
|
this.mousePointer = findViewById(R.id.main_mouse_pointer);
|
|
this.mousePointer.post(() -> {
|
|
ViewGroup.LayoutParams params = mousePointer.getLayoutParams();
|
|
params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE);
|
|
params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE);
|
|
});
|
|
|
|
|
|
touchPad.setOnTouchListener(new OnTouchListener(){
|
|
private float prevX, prevY;
|
|
@Override
|
|
public boolean onTouch(View v, MotionEvent 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.
|
|
// int index = event.getActionIndex();
|
|
|
|
int action = event.getActionMasked();
|
|
|
|
float x = event.getX();
|
|
float y = event.getY();
|
|
if(event.getHistorySize() > 0) {
|
|
prevX = event.getHistoricalX(0);
|
|
prevY = event.getHistoricalY(0);
|
|
}else{
|
|
prevX = x;
|
|
prevY = y;
|
|
}
|
|
float mouseX = mousePointer.getTranslationX();
|
|
float mouseY = mousePointer.getTranslationY();
|
|
|
|
if (gestureDetector.onTouchEvent(event)) {
|
|
|
|
sendScaledMousePosition(mouseX,mouseY);
|
|
|
|
AWTInputBridge.sendMousePress(rightOverride ? AWTInputEvent.BUTTON3_DOWN_MASK : AWTInputEvent.BUTTON1_DOWN_MASK);
|
|
if (!rightOverride) {
|
|
CallbackBridge.mouseLeft = true;
|
|
}
|
|
|
|
} else {
|
|
switch (action) {
|
|
case MotionEvent.ACTION_UP: // 1
|
|
case MotionEvent.ACTION_CANCEL: // 3
|
|
case MotionEvent.ACTION_POINTER_UP: // 6
|
|
if (!rightOverride) {
|
|
CallbackBridge.mouseLeft = false;
|
|
}
|
|
break;
|
|
case MotionEvent.ACTION_MOVE: // 2
|
|
mouseX = Math.max(0, Math.min(CallbackBridge.physicalWidth, mouseX + x - prevX));
|
|
mouseY = Math.max(0, Math.min(CallbackBridge.physicalHeight, mouseY + y - prevY));
|
|
placeMouseAt(mouseX, mouseY);
|
|
|
|
sendScaledMousePosition(mouseX,mouseY);
|
|
/*
|
|
if (!CallbackBridge.isGrabbing()) {
|
|
CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, 0, isLeftMouseDown);
|
|
CallbackBridge.sendMouseKeycode(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, 0, isRightMouseDown);
|
|
}
|
|
*/
|
|
break;
|
|
}
|
|
}
|
|
|
|
// debugText.setText(CallbackBridge.DEBUG_STRING.toString());
|
|
CallbackBridge.DEBUG_STRING.setLength(0);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
|
|
placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2);
|
|
|
|
logFile = new File(Tools.DIR_GAME_HOME, "latestlog.txt");
|
|
logFile.delete();
|
|
logFile.createNewFile();
|
|
logStream = new PrintStream(logFile.getAbsolutePath());
|
|
|
|
this.contentLog = findViewById(R.id.content_log_layout);
|
|
this.contentScroll = (ScrollView) findViewById(R.id.content_log_scroll);
|
|
this.textLog = (TextView) contentScroll.getChildAt(0);
|
|
this.toggleLog = (ToggleButton) findViewById(R.id.content_log_toggle_log);
|
|
this.toggleLog.setChecked(false);
|
|
// this.textLogBehindGL = (TextView) findViewById(R.id.main_log_behind_GL);
|
|
// this.textLogBehindGL.setTypeface(Typeface.MONOSPACE);
|
|
this.textLog.setTypeface(Typeface.MONOSPACE);
|
|
this.toggleLog.setOnCheckedChangeListener(new ToggleButton.OnCheckedChangeListener(){
|
|
@Override
|
|
public void onCheckedChanged(CompoundButton button, boolean isChecked) {
|
|
isLogAllow = isChecked;
|
|
appendToLog("");
|
|
}
|
|
});
|
|
|
|
final File modFile = (File) getIntent().getExtras().getSerializable("modFile");
|
|
final String javaArgs = getIntent().getExtras().getString("javaArgs");
|
|
|
|
mTextureView = findViewById(R.id.installmod_surfaceview);
|
|
|
|
mSkipDetectMod = getIntent().getExtras().getBoolean("skipDetectMod", false);
|
|
if (mSkipDetectMod) {
|
|
new Thread(new Runnable(){
|
|
@Override
|
|
public void run() {
|
|
launchJavaRuntime(modFile, javaArgs);
|
|
}
|
|
}, "JREMainThread").start();
|
|
} else {
|
|
openLogOutput(null);
|
|
new Thread(new Runnable(){
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
final int exit = doCustomInstall(modFile, javaArgs);
|
|
appendlnToLog(getString(R.string.toast_optifine_success));
|
|
if (exit == 0) {
|
|
runOnUiThread(new Runnable(){
|
|
@Override
|
|
public void run() {
|
|
Toast.makeText(JavaGUILauncherActivity.this, R.string.toast_optifine_success, Toast.LENGTH_SHORT).show();
|
|
MainActivity.fullyExit();
|
|
}
|
|
});
|
|
} /* else {
|
|
throw new ErrnoException(getString(R.string.glo, exit);
|
|
} */
|
|
} catch (Throwable e) {
|
|
appendlnToLog("Install failed:");
|
|
appendlnToLog(Log.getStackTraceString(e));
|
|
Tools.showError(JavaGUILauncherActivity.this, e);
|
|
}
|
|
}
|
|
}, "Installer").start();
|
|
}
|
|
} catch (Throwable th) {
|
|
Tools.showError(this, th, true);
|
|
}
|
|
}
|
|
|
|
@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;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void placeMouseAdd(float x, float y) {
|
|
this.mousePointer.setTranslationX(mousePointer.getTranslationX() + x);
|
|
this.mousePointer.setTranslationY(mousePointer.getTranslationY() + y);
|
|
}
|
|
|
|
public void placeMouseAt(float x, float y) {
|
|
this.mousePointer.setTranslationX(x);
|
|
this.mousePointer.setTranslationY(y);
|
|
}
|
|
|
|
void sendScaledMousePosition(float x, float y){
|
|
AWTInputBridge.sendMousePos((int) map(x,0,CallbackBridge.physicalWidth, scaleFactors[0], scaleFactors[2]),
|
|
(int) map(y,0,CallbackBridge.physicalHeight, scaleFactors[1], scaleFactors[3]));
|
|
}
|
|
|
|
public void forceClose(View v) {
|
|
BaseMainActivity.dialogForceClose(this);
|
|
}
|
|
|
|
public void openLogOutput(View v) {
|
|
contentLog.setVisibility(View.VISIBLE);
|
|
}
|
|
|
|
public void closeLogOutput(View view) {
|
|
if (mSkipDetectMod) {
|
|
contentLog.setVisibility(View.GONE);
|
|
} else {
|
|
forceClose(null);
|
|
}
|
|
}
|
|
|
|
private int doCustomInstall(File modFile, String javaArgs) throws IOException {
|
|
isLogAllow = true;
|
|
mSkipDetectMod = true;
|
|
return launchJavaRuntime(modFile, javaArgs);
|
|
}
|
|
|
|
public int launchJavaRuntime(File modFile, String javaArgs) {
|
|
JREUtils.redirectAndPrintJRELog(this);
|
|
try {
|
|
jreReleaseList = JREUtils.readJREReleaseProperties();
|
|
List<String> javaArgList = new ArrayList<String>();
|
|
|
|
// Enable Caciocavallo
|
|
Tools.getCacioJavaArgs(javaArgList,false);
|
|
|
|
if (javaArgs != null) {
|
|
javaArgList.addAll(Arrays.asList(javaArgs.split(" ")));
|
|
} else {
|
|
javaArgList.add("-jar");
|
|
javaArgList.add(modFile.getAbsolutePath());
|
|
}
|
|
|
|
appendlnToLog("Info: Java arguments: " + Arrays.toString(javaArgList.toArray(new String[0])));
|
|
|
|
// Run java on sandbox, non-overrideable.
|
|
Collections.reverse(javaArgList);
|
|
javaArgList.add("-Xbootclasspath/a:" + Tools.DIR_DATA + "/pro-grade.jar");
|
|
javaArgList.add("-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM");
|
|
javaArgList.add("-Djava.security.policy=" + Tools.DIR_DATA + "/java_sandbox.policy");
|
|
Collections.reverse(javaArgList);
|
|
|
|
return JREUtils.launchJavaVM(this, javaArgList);
|
|
} catch (Throwable th) {
|
|
Tools.showError(this, th, true);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
|
|
final View decorView = getWindow().getDecorView();
|
|
decorView.setSystemUiVisibility(uiOptions);
|
|
}
|
|
|
|
@Override
|
|
public void appendToLog(final String text, boolean checkAllow) {
|
|
logStream.print(text);
|
|
if (checkAllow && !isLogAllow) return;
|
|
textLog.post(() -> {
|
|
textLog.append(text);
|
|
contentScroll.fullScroll(ScrollView.FOCUS_DOWN);
|
|
});
|
|
}
|
|
|
|
int[] initScaleFactors(){
|
|
return initScaleFactors(true);
|
|
}
|
|
|
|
int[] initScaleFactors(boolean autoScale){
|
|
//Could be optimized
|
|
|
|
if(autoScale) { //Auto scale
|
|
int minDimension = Math.min(CallbackBridge.physicalHeight, CallbackBridge.physicalWidth);
|
|
scaleFactor = Math.max(((3 * minDimension) / 1080) - 1, 1);
|
|
}
|
|
|
|
int[] scales = new int[4]; //Left, Top, Right, Bottom
|
|
|
|
scales[0] = (CallbackBridge.physicalWidth/2);
|
|
scales[0] -= scales[0]/scaleFactor;
|
|
|
|
scales[1] = (CallbackBridge.physicalHeight/2);
|
|
scales[1] -= scales[1]/scaleFactor;
|
|
|
|
scales[2] = (CallbackBridge.physicalWidth/2);
|
|
scales[2] += scales[2]/scaleFactor;
|
|
|
|
scales[3] = (CallbackBridge.physicalHeight/2);
|
|
scales[3] += scales[3]/scaleFactor;
|
|
|
|
return scales;
|
|
}
|
|
|
|
public void scaleDown(View view) {
|
|
scaleFactor = Math.max(scaleFactor - 1, 1);
|
|
scaleFactors = initScaleFactors(false);
|
|
mTextureView.initScaleFactors(scaleFactor);
|
|
sendScaledMousePosition(mousePointer.getX(),mousePointer.getY());
|
|
}
|
|
|
|
public void scaleUp(View view) {
|
|
scaleFactor = Math.min(scaleFactor + 1, 6);
|
|
scaleFactors = initScaleFactors(false);
|
|
mTextureView.initScaleFactors(scaleFactor);
|
|
sendScaledMousePosition(mousePointer.getX(),mousePointer.getY());
|
|
}
|
|
}
|