diff --git a/.gitignore b/.gitignore
index f5de75c1f..3303a20bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
/build
/*/build
app_pojavlauncher/src/main/assets/components/jre
+app_pojavlauncher/src/main/assets/components/lwjgl3/version
local.properties
.idea/
.DS_Store
diff --git a/README.md b/README.md
index 1bede481c..1d1029493 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
-# HD Launcher - 2009Scape Mobile 2.0
+
HD Launcher - 2009Scape Mobile 2.1
-
+
+
+
+
-
-# 2009Scape Mobile
-
Unoffical, unsupported, and unethical app to run 2009Scape on your Android device. Based on Pojav/Boardwalk.
# Download
@@ -15,7 +15,7 @@ Unoffical, unsupported, and unethical app to run 2009Scape on your Android devic
-[Controls](https://github.com/downthecrop/2009Scape-mobile/wiki/Controls)
+[Controls](https://github.com/2009scape/2009Scape-mobile/wiki/Controls)
Tip: Use [SwiftKey](https://play.google.com/store/apps/details?id=com.touchtype.swiftkey&hl=en_CA&gl=US) keyboard and disable battery optimization to get the best experience
diff --git a/app_pojavlauncher/src/main/assets/plugins/XPDropPlugin.zip b/app_pojavlauncher/src/main/assets/plugins/XPDropPlugin.zip
deleted file mode 100644
index c7686e153..000000000
Binary files a/app_pojavlauncher/src/main/assets/plugins/XPDropPlugin.zip and /dev/null differ
diff --git a/app_pojavlauncher/src/main/assets/rt4.jar b/app_pojavlauncher/src/main/assets/rt4.jar
index 1e0418fa9..265145347 100644
Binary files a/app_pojavlauncher/src/main/assets/rt4.jar and b/app_pojavlauncher/src/main/assets/rt4.jar differ
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GLFWGLSurface.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GLFWGLSurface.java
index 2433356e2..832110fb6 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GLFWGLSurface.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GLFWGLSurface.java
@@ -220,30 +220,14 @@ public class GLFWGLSurface extends View implements GrabListener {
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {}
});
- this.longPressDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
-
- boolean isDragClicking = false;
+ longPressDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
- if(!isDragClicking) {
- isDragClicking = true;
- AWTInputBridge.sendKey((char) AWTInputEvent.VK_F5, AWTInputEvent.VK_F5);
- }
- }
-
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- if(isDragClicking) {
- isDragClicking = false;
- AWTInputBridge.sendKey((char)AWTInputEvent.VK_F5, AWTInputEvent.VK_F5);
- }
- return super.onSingleTapUp(e);
+ CallbackBridge.putMouseEventWithCoords(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_RIGHT, CallbackBridge.mouseX, CallbackBridge.mouseY);
}
});
- //this.longPressDetector.setIsLongpressEnabled(true);
-
((ViewGroup)getParent()).addView(textureView);
}
}
@@ -257,7 +241,7 @@ public class GLFWGLSurface extends View implements GrabListener {
@SuppressWarnings("accessibility")
public boolean onTouchEvent(MotionEvent e) {
scaleGestureDetector.onTouchEvent(e);
- //longPressDetector.onTouchEvent(e);
+ longPressDetector.onTouchEvent(e);
// Kinda need to send this back to the layout
if(((ControlLayout)getParent()).getModifiable()) return false;
@@ -280,7 +264,6 @@ public class GLFWGLSurface extends View implements GrabListener {
CallbackBridge.mouseY = (e.getY() * mScaleFactor);
//One android click = one MC click
if(mSingleTapDetector.onTouchEvent(e)){ //
- //longPressDetector.onTouchEvent(e);// Touch Mode
CallbackBridge.putMouseEventWithCoords(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_LEFT, CallbackBridge.mouseX, CallbackBridge.mouseY);
return true;
}
@@ -429,6 +412,7 @@ public class GLFWGLSurface extends View implements GrabListener {
// Actualise the pointer count
mLastPointerCount = e.getPointerCount();
+ longPressDetector.onTouchEvent(e);
return true;
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
index bba467323..1c781ff62 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
@@ -1,6 +1,9 @@
package net.kdt.pojavlaunch;
import static net.kdt.pojavlaunch.MainActivity.fullyExit;
+import static net.kdt.pojavlaunch.Tools.currentDisplayMetrics;
+
+import static java.security.AccessController.getContext;
import android.annotation.SuppressLint;
import android.content.ClipboardManager;
@@ -47,7 +50,10 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
private LinearLayout mTouchPad;
private ImageView mMousePointerImageView;
private GestureDetector mGestureDetector;
+
+ private GestureDetector longPressDetector;
private boolean cameraMode = false;
+ float prevX = 0, prevY = 0;
private long lastPress = 0;
private ScaleGestureDetector scaleGestureDetector;
private boolean rcState = false;
@@ -90,10 +96,11 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
ViewGroup.LayoutParams params = mMousePointerImageView.getLayoutParams();
params.width = (int) (36 / 100f * LauncherPreferences.PREF_MOUSESCALE);
params.height = (int) (54 / 100f * LauncherPreferences.PREF_MOUSESCALE);
+ if(LauncherPreferences.PREF_VIRTUAL_MOUSE_START)
+ toggleVirtualMouse();
});
mTouchPad.setOnTouchListener(new View.OnTouchListener() {
- float prevX = 0, prevY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
// MotionEvent reports input details from the touch screen
@@ -101,11 +108,13 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
// interested in events where the touch position changed.
// int index = event.getActionIndex();
int action = event.getActionMasked();
+ float mouseSpeed = LauncherPreferences.PREF_MOUSESPEED;
float x = event.getX();
float y = event.getY();
float mouseX, mouseY;
+ // Scale the mouse speed
mouseX = mMousePointerImageView.getX();
mouseY = mMousePointerImageView.getY();
@@ -117,8 +126,8 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
}
} else {
if (action == 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));
+ mouseX = Math.max(0, Math.min(currentDisplayMetrics.widthPixels, mouseX + (x - prevX) * mouseSpeed));
+ mouseY = Math.max(0, Math.min(currentDisplayMetrics.heightPixels, mouseY + (y - prevY) * mouseSpeed));
placeMouseAt(mouseX, mouseY);
sendScaledMousePosition(mouseX, mouseY);
}
@@ -127,8 +136,6 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
if (event.getPointerCount() == 2) {
// Right-click event when a second finger touches the screen
// Simulating right-click by sending GLFW_MOUSE_BUTTON_RIGHT event
- Log.i("downthecrop","Hi from a rightclick event!");
- //activateRC();
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F11,AWTInputEvent.VK_F11);
AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK);
}
@@ -143,6 +150,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
mTextureView.setOnTouchListener((v, event) -> {
scaleGestureDetector.onTouchEvent(event);
+ longPressDetector.onTouchEvent(event);
float x = event.getX();
float y = event.getY();
if (mGestureDetector.onTouchEvent(event)) {
@@ -161,11 +169,34 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
break;
case MotionEvent.ACTION_MOVE: // 2
sendScaledMousePosition(x + mTextureView.getX(), y);
+ try {
+ panCamera(prevX-x, prevY-y);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
break;
}
+
+ prevY = y;
+ prevX = x;
return true;
});
+ longPressDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public void onLongPress(MotionEvent e) {
+ // Send RightClick
+ AWTInputBridge.sendKey((char)AWTInputEvent.VK_F11,AWTInputEvent.VK_F11);
+ AWTInputBridge.sendMousePress(AWTInputEvent.BUTTON1_DOWN_MASK);
+ super.onLongPress(e);
+ }
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ return super.onSingleTapUp(e);
+ }
+ });
+
try {
placeMouseAt(CallbackBridge.physicalWidth / 2f, CallbackBridge.physicalHeight / 2f);
@@ -200,14 +231,28 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
} catch (Throwable th) {
Tools.showError(this, th, true);
}
+ }
+ private void panCamera(float dx, float dy) throws InterruptedException {
+ //Log.i("downthecrop-pan","dx: " +dx + " dy: " + dy);
+ final float threshold = 8.0f; // adjust this value as needed to control the sensitivity of the panning
- getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
- @Override
- public void handleOnBackPressed() {
- MainActivity.dialogForceClose(JavaGUILauncherActivity.this);
- }
- });
+ // Check horizontal panning
+ if(dx > threshold) {
+ // Finger moved to the right, pan camera to the right
+ AWTInputBridge.sendKey((char)AWTInputEvent.VK_RIGHT, AWTInputEvent.VK_RIGHT);
+ } else if(dx < -threshold) {
+ AWTInputBridge.sendKey((char)AWTInputEvent.VK_LEFT, AWTInputEvent.VK_LEFT);
+ }
+
+ // Check vertical panning
+ if(dy > threshold) {
+ // Finger moved down, pan camera up
+ AWTInputBridge.sendKey((char)AWTInputEvent.VK_UP, AWTInputEvent.VK_UP);
+ } else if(dy < -threshold) {
+ // Finger moved up, pan camera down
+ AWTInputBridge.sendKey((char)AWTInputEvent.VK_DOWN, AWTInputEvent.VK_DOWN);
+ }
}
@Override
@@ -258,7 +303,6 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
break;
case R.id.camera:
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;
findViewById(R.id.camera).setBackground(getResources().getDrawable( R.drawable.control_button_pressed ));
@@ -269,7 +313,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
}
break;
case R.id.mouseMode:
- toggleVirtualMouse(this.getCurrentFocus());
+ toggleVirtualMouse();
}
lastPress = time;
}
@@ -317,7 +361,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
mLoggerView.setVisibility(View.VISIBLE);
}
- public void toggleVirtualMouse(View v) {
+ public void toggleVirtualMouse() {
mIsVirtualMouseEnabled = !mIsVirtualMouseEnabled;
ImageView view = findViewById(R.id.mouseModeIco);
if(!mIsVirtualMouseEnabled){
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
index a7c651839..d7af7fd4d 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
@@ -3,6 +3,7 @@ package net.kdt.pojavlaunch;
import static net.kdt.pojavlaunch.GLFWGLSurface.FINGER_SCROLL_THRESHOLD;
import static net.kdt.pojavlaunch.Tools.currentDisplayMetrics;
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.DEFAULT_PREF;
+import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_SCALE_FACTOR;
import android.content.Context;
import android.os.Build;
@@ -35,7 +36,7 @@ public class Touchpad extends FrameLayout implements GrabListener{
/* Detect a classic android Tap */
private final GestureDetector mSingleTapDetector = new GestureDetector(getContext(), new SingleTapConfirm());
/* Resolution scaler option, allow downsizing a window */
- private final float mScaleFactor = DEFAULT_PREF.getInt("resolutionRatio",100)/100f;
+ private final float mScaleFactor = PREF_SCALE_FACTOR/100f;
/* Current pointer ID to move the mouse */
private int mCurrentPointerID = -1000;
/* Previous MotionEvent position, not scale */
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java
index 2a14ffa81..b215235bd 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/gamepad/Gamepad.java
@@ -42,6 +42,7 @@ import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTI
import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_SOUTH_WEST;
import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.DIRECTION_WEST;
import static net.kdt.pojavlaunch.customcontrols.gamepad.GamepadJoystick.isJoystickEvent;
+import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_SCALE_FACTOR;
import static net.kdt.pojavlaunch.utils.MCOptionUtils.getMcScale;
import static org.lwjgl.glfw.CallbackBridge.sendKeyPress;
import static org.lwjgl.glfw.CallbackBridge.sendMouseButton;
@@ -51,7 +52,7 @@ import fr.spse.gamepad_remapper.GamepadHandler;
public class Gamepad implements GrabListener, GamepadHandler {
/* Resolution scaler option, allow downsizing a window */
- private final float mScaleFactor = LauncherPreferences.DEFAULT_PREF.getInt("resolutionRatio",100)/100f;
+ private final float mScaleFactor = PREF_SCALE_FACTOR/100f;
/* Sensitivity, adjusted according to screen size */
private final double mSensitivityFactor = (1.4 * (1080f/ currentDisplayMetrics.heightPixels));
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java
index 8011684c2..f9b14b300 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java
@@ -23,6 +23,7 @@ import net.kdt.pojavlaunch.utils.KeyEncoder;
*/
public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText {
public static final String TEXT_FILLER = " ";
+ public static boolean softKeyboardIsActive = false;
public TouchCharInput(@NonNull Context context) {
this(context, null);
}
@@ -49,7 +50,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
Log.i("TouchCharInput","New Event (before/after)!: "+ lengthBefore + " : " + lengthAfter);
boolean isBackSpace = (lengthBefore > lengthAfter);
if(isBackSpace) {
- KeyEncoder.sendEncodedChar(KeyEncoder.backspaceUnicode,KeyEncoder.backspaceUnicode);
+ KeyEncoder.sendUnicodeBackspace();
return;
}
char c = text.charAt(text.length()-1);
@@ -115,6 +116,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
/** Regain ability to exist, take focus and have some text being input */
public void enable(){
+ softKeyboardIsActive = true;
setEnabled(true);
setFocusable(true);
setVisibility(VISIBLE);
@@ -123,6 +125,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
/** Lose ability to exist, take focus and have some text being input */
public void disable(){
+ softKeyboardIsActive = false;
clear();
setVisibility(GONE);
clearFocus();
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
index 5772b9066..4fad6ad39 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
@@ -46,7 +46,7 @@ public class LauncherPreferences {
public static boolean PREF_ARC_CAPES = false;
public static boolean PREF_USE_ALTERNATE_SURFACE = true;
public static boolean PREF_JAVA_SANDBOX = true;
- public static int PREF_SCALE_FACTOR = 100;
+ public static int PREF_SCALE_FACTOR = 60;
public static boolean PREF_ENABLE_GYRO = false;
public static float PREF_GYRO_SENSITIVITY = 1f;
public static int PREF_GYRO_SAMPLE_RATE = 16;
@@ -93,7 +93,7 @@ public class LauncherPreferences {
PREF_ARC_CAPES = DEFAULT_PREF.getBoolean("arc_capes",false);
PREF_USE_ALTERNATE_SURFACE = DEFAULT_PREF.getBoolean("alternate_surface", false);
PREF_JAVA_SANDBOX = DEFAULT_PREF.getBoolean("java_sandbox", true);
- PREF_SCALE_FACTOR = DEFAULT_PREF.getInt("resolutionRatio", 100);
+ PREF_SCALE_FACTOR = DEFAULT_PREF.getInt("resolutionRatio", 60);
PREF_ENABLE_GYRO = DEFAULT_PREF.getBoolean("enableGyro", false);
PREF_GYRO_SENSITIVITY = ((float)DEFAULT_PREF.getInt("gyroSensitivity", 100))/100f;
PREF_GYRO_SAMPLE_RATE = DEFAULT_PREF.getInt("gyroSampleRate", 16);
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java
index 61d0e9b82..4d1b7ccbe 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java
@@ -1,6 +1,7 @@
package net.kdt.pojavlaunch.prefs.screens;
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_NOTCH_SIZE;
+import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_SCALE_FACTOR;
import android.content.SharedPreferences;
import android.os.Build;
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java
index 25884bf74..b5c7ca95a 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java
@@ -1,112 +1,63 @@
package net.kdt.pojavlaunch.utils;
import net.kdt.pojavlaunch.AWTInputBridge;
+import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput;
-/*
- About Key Events. Because the Android Spec doesn't require
- soft keyboards to dispatch key events not all keyboard implementations
- across Android will trigger these actions.
-
- Currently we use the following function to translate keycodes for
- special character, capital letters, and digits.
-
- keycode 123 (F12) is used as a single digit capslock button which
- when sent to the miniclient before a char will act accordingly.
- */
+import java.util.HashMap;
+import java.util.Map;
public class KeyEncoder {
- static String specialChars = "/*!@#$%^&*()\"{}_[+:;=-_]'|\\?/<>,.";
- static char modifier = 123;
- static char backspaceAndroid = 67;
- public static char backspaceUnicode = 8;
+ private static final Map specialCharMap = createSpecialCharMap();
+ private static final char MODIFIER = 123; // F12 key as a modifier for caps lock
+ private static final char BACKSPACE_ANDROID = 67;
+ private static final char BACKSPACE_UNICODE = 8;
- public static void sendEncodedChar(int keyCode, char iC){
- System.out.println(keyCode);
- if(keyCode == 75)
- AWTInputBridge.sendKey((char)222,222);
- else if(keyCode == backspaceAndroid){
- AWTInputBridge.sendKey(backspaceUnicode,backspaceUnicode);
- } else if(specialChars.contains(""+iC)){
- // Send special character to client
- char c = iC;
- switch(c){
- case '!':
- c = '1';
- break;
- case '@':
- c = '2';
- break;
- case '#':
- c = '3';
- break;
- case '$':
- c = '4';
- break;
- case '%':
- c = '5';
- break;
- case '^':
- c = '6';
- break;
- case '&':
- c = '7';
- break;
- case '*':
- c = '8';
- break;
- case '(':
- c = '9';
- break;
- case ')':
- c = '0';
- break;
- case '_':
- c = '-';
- break;
- case '+':
- c = '=';
- break;
- case '{':
- c = '[';
- break;
- case '}':
- c = ']';
- break;
- case ':':
- c = ';';
- break;
- case '"':
- c = '\'';
- break;
- case '<':
- c = ',';
- break;
- case '>':
- c = '.';
- break;
- case '?':
- c = '/';
- break;
- case '|':
- c = '\\';
- break;
- }
- if(c != iC){
- AWTInputBridge.sendKey(modifier,modifier);
- }
- AWTInputBridge.sendKey(c,c);
- } else if(Character.isDigit(iC)){
- AWTInputBridge.sendKey(iC,iC);
- } else if (iC == Character.toUpperCase(iC)){
- // We send F12 as a modifier to avoid needing to worry about shift.
- // Client takes this modifier and does a toUpperCase().
- AWTInputBridge.sendKey(modifier,modifier);
- AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
- } else if(iC == Character.toLowerCase(iC)){
- AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
+ // Initialize the mapping of special characters to their respective keys
+ private static Map createSpecialCharMap() {
+ Map map = new HashMap<>();
+ map.put('!', '1');
+ map.put('@', '2');
+ map.put('#', '3');
+ map.put('$', '4');
+ map.put('%', '5');
+ map.put('^', '6');
+ map.put('&', '7');
+ map.put('*', '8');
+ map.put('(', '9');
+ map.put(')', '0');
+ map.put('_', '-');
+ map.put('+', '=');
+ map.put('{', '[');
+ map.put('}', ']');
+ map.put(':', ';');
+ map.put('"', '\'');
+ map.put('<', ',');
+ map.put('>', '.');
+ map.put('?', '/');
+ map.put('|', '\\');
+ return map;
+ }
+
+ public static void sendUnicodeBackspace(){
+ AWTInputBridge.sendKey(BACKSPACE_UNICODE, BACKSPACE_UNICODE);
+ }
+
+ public static void sendEncodedChar(int keyCode, char c) {
+ if (keyCode == BACKSPACE_ANDROID && !TouchCharInput.softKeyboardIsActive) {
+ sendUnicodeBackspace();
+ } else if (specialCharMap.containsKey(c)) {
+ AWTInputBridge.sendKey(MODIFIER, MODIFIER);
+ AWTInputBridge.sendKey(specialCharMap.get(c), specialCharMap.get(c));
+ } else if (Character.isDigit(c)) {
+ AWTInputBridge.sendKey(c, c);
+ } else if (Character.isLowerCase(c)){
+ AWTInputBridge.sendKey(Character.toUpperCase(c),Character.toUpperCase(c));
+ } else if (Character.isUpperCase(c)) {
+ AWTInputBridge.sendKey(MODIFIER, MODIFIER);
+ AWTInputBridge.sendKey(c, c);
} else {
- AWTInputBridge.sendKey(iC,keyCode);
+ AWTInputBridge.sendKey(c, keyCode);
}
}
-}
\ No newline at end of file
+}
diff --git a/app_pojavlauncher/src/main/res/xml/pref_video.xml b/app_pojavlauncher/src/main/res/xml/pref_video.xml
index 591dc37d4..68ebbf07f 100644
--- a/app_pojavlauncher/src/main/res/xml/pref_video.xml
+++ b/app_pojavlauncher/src/main/res/xml/pref_video.xml
@@ -29,6 +29,7 @@
app2:showSeekBarValue="true"
app2:selectable="false"
app2:seekBarIncrement="5"
+ app2:defaultValue="60"
android:icon="@drawable/ic_setting_screen_resolution"
/>