diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java index 5082d46ee..126b556e4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java @@ -32,7 +32,7 @@ import org.lwjgl.glfw.*; public class BaseMainActivity extends LoggableActivity { public static volatile ClipboardManager GLOBAL_CLIPBOARD; - public TouchCharInput touchCharInput; + public static TouchCharInput touchCharInput; volatile public static boolean isInputStackCall; @@ -84,8 +84,8 @@ public class BaseMainActivity extends LoggableActivity { public boolean hiddenTextIgnoreUpdate = true; - private boolean isVirtualMouseEnabled; - private LinearLayout touchPad; + private static boolean isVirtualMouseEnabled; + private static LinearLayout touchPad; private ImageView mousePointer; private MinecraftAccount mProfile; @@ -867,12 +867,14 @@ public class BaseMainActivity extends LoggableActivity { this.mousePointer.setY(y); } - public void toggleMouse(View view) { + public static void toggleMouse(Context ctx) { if (CallbackBridge.isGrabbing()) return; isVirtualMouseEnabled = !isVirtualMouseEnabled; touchPad.setVisibility(isVirtualMouseEnabled ? View.VISIBLE : View.GONE); - ((Button) view).setText(isVirtualMouseEnabled ? R.string.control_mouseon: R.string.control_mouseoff); + Toast.makeText(ctx, + isVirtualMouseEnabled ? R.string.control_mouseon : R.string.control_mouseoff, + Toast.LENGTH_SHORT).show(); } public static void dialogForceClose(Context ctx) { @@ -895,6 +897,12 @@ public class BaseMainActivity extends LoggableActivity { sendKeyPress(LWJGLGLFWKeycode.GLFW_KEY_ESCAPE); } + public static void switchKeyboardState() { + if(touchCharInput != null) touchCharInput.switchKeyboardState(); + } + + + protected void setRightOverride(boolean val) { this.rightOverride = val; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index dac6a7cc7..21e003483 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -3,142 +3,54 @@ package net.kdt.pojavlaunch; import android.app.Activity; import android.content.Intent; import android.os.*; -import android.view.*; + import androidx.annotation.Nullable; -import com.google.android.material.navigation.NavigationView; - import net.kdt.pojavlaunch.customcontrols.*; -import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.prefs.*; import net.kdt.pojavlaunch.utils.MCOptionUtils; -import org.lwjgl.glfw.*; import java.io.*; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.DEFAULT_PREF; public class MainActivity extends BaseMainActivity { - public ControlLayout mControlLayout; - - private View.OnClickListener mClickListener; - private View.OnTouchListener mTouchListener; + public static ControlLayout mControlLayout; + private FileObserver fileObserver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initLayout(R.layout.main_with_customctrl); - super.ingameControlsEditorListener = new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(MenuItem menuItem) { - switch (menuItem.getItemId()) { - case R.id.menu_ctrl_load: - CustomControlsActivity.load(mControlLayout); - break; - case R.id.menu_ctrl_add: - mControlLayout.addControlButton(new ControlData("New")); - break; - case R.id.menu_ctrl_add_drawer: - mControlLayout.addDrawer(new ControlDrawerData()); - break; - case R.id.menu_ctrl_selectdefault: - CustomControlsActivity.dialogSelectDefaultCtrl(mControlLayout); - break; - case R.id.menu_ctrl_save: - CustomControlsActivity.save(true,mControlLayout); - break; - } - //Toast.makeText(MainActivity.this, menuItem.getTitle() + ":" + menuItem.getItemId(), Toast.LENGTH_SHORT).show(); - return true; + super.ingameControlsEditorListener = menuItem -> { + switch (menuItem.getItemId()) { + case R.id.menu_ctrl_load: + CustomControlsActivity.load(mControlLayout); + break; + case R.id.menu_ctrl_add: + mControlLayout.addControlButton(new ControlData("New")); + break; + case R.id.menu_ctrl_add_drawer: + mControlLayout.addDrawer(new ControlDrawerData()); + break; + case R.id.menu_ctrl_selectdefault: + CustomControlsActivity.dialogSelectDefaultCtrl(mControlLayout); + break; + case R.id.menu_ctrl_save: + CustomControlsActivity.save(true,mControlLayout); + break; } + //Toast.makeText(MainActivity.this, menuItem.getTitle() + ":" + menuItem.getItemId(), Toast.LENGTH_SHORT).show(); + return true; }; - mClickListener = new View.OnClickListener(){ - @Override - public void onClick(View view) { - if (view instanceof ControlButton) { - ControlButton button = (ControlButton) view; - for(int keycode : button.getProperties().keycodes){ - switch (keycode) { - case ControlData.SPECIALBTN_KEYBOARD: - touchCharInput.switchKeyboardState(); - break; - - case ControlData.SPECIALBTN_TOGGLECTRL: - mControlLayout.toggleControlVisible(); - break; - - case ControlData.SPECIALBTN_VIRTUALMOUSE: - toggleMouse(button); - break; - } - } - } - } - }; - - mTouchListener = new View.OnTouchListener(){ - @Override - public boolean onTouch(View view, 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; - } - - if (view instanceof ControlButton) { - ControlButton button = (ControlButton) view; - for(int keycode : button.getProperties().keycodes) { - switch (keycode) { - case ControlData.SPECIALBTN_MOUSEPRI: - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); - break; - - case ControlData.SPECIALBTN_MOUSEMID: - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_MIDDLE, isDown); - break; - - case ControlData.SPECIALBTN_MOUSESEC: - if (CallbackBridge.isGrabbing()) { - sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); - } else { - CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown ? 1 : 0, CallbackBridge.mouseX, CallbackBridge.mouseY); - - setRightOverride(isDown); - } - break; - - case ControlData.SPECIALBTN_SCROLLDOWN: - if (!isDown) CallbackBridge.sendScroll(0, 1d); - break; - - case ControlData.SPECIALBTN_SCROLLUP: - if (!isDown) CallbackBridge.sendScroll(0, -1d); - break; - } - } - } - - return false; - } - }; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){ fileObserver = new FileObserver(new File(Tools.DIR_GAME_NEW + "/options.txt"), FileObserver.MODIFY) { @Override public void onEvent(int i, @Nullable String s) { - //FIXME Make sure the multithreading nature of this event doesn't cause any problems ? MCOptionUtils.load(); getMcScale(); } @@ -147,7 +59,6 @@ public class MainActivity extends BaseMainActivity { fileObserver = new FileObserver(Tools.DIR_GAME_NEW + "/options.txt", FileObserver.MODIFY) { @Override public void onEvent(int i, @Nullable String s) { - //FIXME Make sure the multithreading nature of this event doesn't cause any problems ? MCOptionUtils.load(); getMcScale(); } @@ -156,19 +67,6 @@ public class MainActivity extends BaseMainActivity { fileObserver.startWatching(); - ControlData[] specialButtons = ControlData.getSpecialButtons(); - specialButtons[0].specialButtonListener - = specialButtons[1].specialButtonListener - = specialButtons[4].specialButtonListener - = mClickListener; - - specialButtons[2].specialButtonListener - = specialButtons[3].specialButtonListener - = specialButtons[5].specialButtonListener - = specialButtons[6].specialButtonListener - = specialButtons[7].specialButtonListener - = mTouchListener; - mControlLayout = findViewById(R.id.main_control_layout); mControlLayout.setModifiable(false); try { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index dffcae899..a43dbc299 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -81,8 +81,6 @@ public class ControlData implements Cloneable public float cornerRadius; //0-100% public boolean isSwipeable; - public Object specialButtonListener; - public ControlData() { this("button"); } @@ -142,7 +140,6 @@ public class ControlData implements Cloneable this.strokeColor = strokeColor; this.strokeWidth = strokeWidth; this.cornerRadius = cornerRadius; - update(); } public void execute(boolean isDown) { @@ -176,14 +173,6 @@ public class ControlData implements Cloneable // Calculate, because the dynamic position contains some math equations return calculate(insertedPos); } - - public void update() { - if(SPECIAL_BUTTONS != null) - for(int keycode : keycodes) - for (ControlData data : getSpecialButtons()) - if (keycode == data.keycodes[0]) - specialButtonListener = data.specialButtonListener; - } private static float calculate(String math) { return (float) new ExpressionBuilder(math) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 6dacb6746..8269633cc 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -7,7 +7,7 @@ import com.google.gson.*; import java.io.*; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; + import net.kdt.pojavlaunch.*; import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; @@ -16,11 +16,6 @@ import net.kdt.pojavlaunch.customcontrols.buttons.ControlSubButton; import net.kdt.pojavlaunch.customcontrols.handleview.HandleView; import net.kdt.pojavlaunch.prefs.*; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.lwjgl.glfw.*; - public class ControlLayout extends FrameLayout { protected CustomControls mLayout; @@ -260,7 +255,7 @@ public class ControlLayout extends FrameLayout //Check if the action is cancelling, reset the lastControl button associated to the view if(ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL){ - if(lastControlButton != null) lastControlButton.sendKeyPresses(ev,false); + if(lastControlButton != null) lastControlButton.sendKeyPresses(false); mapTable.put(v, null); return true; } @@ -276,7 +271,7 @@ public class ControlLayout extends FrameLayout } //Release last keys - if (lastControlButton != null) lastControlButton.sendKeyPresses(ev,false); + if (lastControlButton != null) lastControlButton.sendKeyPresses(false); mapTable.put(v, null); //Look for another SWIPEABLE button @@ -288,7 +283,7 @@ public class ControlLayout extends FrameLayout //Press the new key if(!button.equals(lastControlButton)){ - button.sendKeyPresses(ev,true); + button.sendKeyPresses(true); mapTable.put(v, button); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java index fdafc9361..398259e43 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/CustomControls.java @@ -66,7 +66,7 @@ public class CustomControls { } public void save(String path) throws IOException { - //Current version is the V2 so the version as to be marked as 2 ! + //Current version is the V2.3 so the version as to be marked as 3 ! version = 3; Tools.write(path, Tools.GLOBAL_GSON.toJson(this)); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java index 1cf5d0a67..b94911342 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/LayoutConverter.java @@ -121,7 +121,6 @@ public class LayoutConverter { if(button.getBoolean("holdAlt")) { keycodes[next_idx] = LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT; next_idx++; } keycodes[next_idx] = button.getInt("keycode"); n_button.keycodes = keycodes; - n_button.update(); empty.mControlDataList.add(n_button); } empty.scaledAt = (float)oldLayoutJson.getDouble("scaledAt"); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java index 20a85ca6d..899e8d6c9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlButton.java @@ -20,6 +20,7 @@ import net.kdt.pojavlaunch.prefs.LauncherPreferences; import org.lwjgl.glfw.*; +import static net.kdt.pojavlaunch.BaseMainActivity.sendMouseButton; import static net.kdt.pojavlaunch.LWJGLGLFWKeycode.GLFW_KEY_UNKNOWN; import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_BUTTONSIZE; @@ -79,17 +80,12 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp //Visibility properties.isHideable = !properties.containsKeycode(ControlData.SPECIALBTN_TOGGLECTRL) && !properties.containsKeycode(ControlData.SPECIALBTN_VIRTUALMOUSE); - properties.update(); return properties; } public void setProperties(ControlData properties, boolean changePos) { mProperties = properties; - properties.update(); - - // com.android.internal.R.string.delete - // android.R.string. setText(properties.name); if (changePos) { @@ -97,17 +93,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setY(properties.insertDynamicPos(mProperties.dynamicY)); } - if (properties.specialButtonListener == null) { - // A non-special button or inside custom controls screen so skip listener - } else if (properties.specialButtonListener instanceof View.OnClickListener) { - setOnClickListener((View.OnClickListener) properties.specialButtonListener); - } else if (properties.specialButtonListener instanceof View.OnTouchListener) { - setOnTouchListener((View.OnTouchListener) properties.specialButtonListener); - } else { - throw new IllegalArgumentException("Field " + ControlData.class.getName() + ".specialButtonListener must be View.OnClickListener or View.OnTouchListener, but was " + - properties.specialButtonListener.getClass().getName()); - } - setLayoutParams(new FrameLayout.LayoutParams((int) properties.getWidth(), (int) properties.getHeight() )); } @@ -140,7 +125,6 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp setBackground(); // Re-calculate position - mProperties.update(); if(!mProperties.isDynamicBtn){ setX(getX()); setY(getY()); @@ -269,7 +253,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isSwipeable && !isPointerOutOfBounds){ //Remove keys if(!triggerToggle(event)) { - sendKeyPresses(event,false); + sendKeyPresses(false); } } isPointerOutOfBounds = true; @@ -282,7 +266,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp ((ControlLayout) getParent()).onTouch(this, event); //RE-press the button if(mProperties.isSwipeable && !mProperties.isToggle){ - sendKeyPresses(event,true); + sendKeyPresses(true); } } isPointerOutOfBounds = false; @@ -291,7 +275,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp case MotionEvent.ACTION_DOWN: // 0 case MotionEvent.ACTION_POINTER_DOWN: // 5 if(!mProperties.isToggle){ - sendKeyPresses(event,true); + sendKeyPresses(true); } break; @@ -306,7 +290,7 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp isPointerOutOfBounds = false; if(!triggerToggle(event)) { - sendKeyPresses(event,false); + sendKeyPresses(false); } break; @@ -465,21 +449,63 @@ public class ControlButton extends androidx.appcompat.widget.AppCompatButton imp if(mProperties.isToggle){ isToggled = !isToggled; invalidate(); - sendKeyPresses(event, isToggled); + sendKeyPresses(isToggled); return true; } return false; } - public void sendKeyPresses(MotionEvent event, boolean isDown){ + public void sendKeyPresses(boolean isDown){ for(int keycode : mProperties.keycodes){ if(keycode >= GLFW_KEY_UNKNOWN){ MainActivity.sendKeyPress(keycode, CallbackBridge.getCurrentMods(), isDown); CallbackBridge.setModifiers(keycode, isDown); }else{ - super.onTouchEvent(event); + sendSpecialKey(keycode, isDown); } } } + private void sendSpecialKey(int keycode, boolean isDown){ + switch (keycode) { + case ControlData.SPECIALBTN_KEYBOARD: + if(isDown)BaseMainActivity.switchKeyboardState(); + break; + + case ControlData.SPECIALBTN_TOGGLECTRL: + if(isDown)MainActivity.mControlLayout.toggleControlVisible(); + break; + + case ControlData.SPECIALBTN_VIRTUALMOUSE: + if(isDown)BaseMainActivity.toggleMouse(getContext()); + break; + + case ControlData.SPECIALBTN_MOUSEPRI: + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT, isDown); + break; + + case ControlData.SPECIALBTN_MOUSEMID: + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_MIDDLE, isDown); + break; + + case ControlData.SPECIALBTN_MOUSESEC: + if (CallbackBridge.isGrabbing()) { + sendMouseButton(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown); + } else { + CallbackBridge.putMouseEventWithCoords(LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, isDown , CallbackBridge.mouseX, CallbackBridge.mouseY); + + //setRightOverride(isDown); + } + break; + + case ControlData.SPECIALBTN_SCROLLDOWN: + if (!isDown) CallbackBridge.sendScroll(0, 1d); + break; + + case ControlData.SPECIALBTN_SCROLLUP: + if (!isDown) CallbackBridge.sendScroll(0, -1d); + break; + } + } + } diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 94111f036..e107acdff 100644 --- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -29,18 +29,18 @@ public class CallbackBridge { } @Override public void run() { - putMouseEventWithCoords(button, 1, x, y); + putMouseEventWithCoords(button, true, x, y); try { Thread.sleep(40); } catch (InterruptedException e) {} - putMouseEventWithCoords(button, 0, x, y); + putMouseEventWithCoords(button, false, x, y); } } public static void putMouseEventWithCoords(int button, int x, int y /* , int dz, long nanos */) { new Thread(new PusherRunnable(button,x,y)).run(); } - public static void putMouseEventWithCoords(int button, int state, int x, int y /* , int dz, long nanos */) { + public static void putMouseEventWithCoords(int button, boolean isDown, int x, int y /* , int dz, long nanos */) { sendCursorPos(x, y); - sendMouseKeycode(button, CallbackBridge.getCurrentMods(), state == 1); + sendMouseKeycode(button, CallbackBridge.getCurrentMods(), isDown); } private static boolean threadAttached;