From ff1db31271275fe59f6dfbceb0ef9befe67f18ca Mon Sep 17 00:00:00 2001 From: artdeell Date: Sun, 12 Feb 2023 22:18:45 +0300 Subject: [PATCH] Gyro controls: Implement listener to correct gyro controls in reverse portrait/landscape modes Co-authored-by: TarikBR --- .../java/net/kdt/pojavlaunch/GyroControl.java | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GyroControl.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GyroControl.java index ccacd01e4..c66ddaca9 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GyroControl.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/GyroControl.java @@ -5,28 +5,34 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; -import android.util.Log; +import android.view.OrientationEventListener; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import org.lwjgl.glfw.CallbackBridge; -public class GyroControl implements SensorEventListener, GrabListener { +public class GyroControl implements SensorEventListener, GrabListener{ private final SensorManager mSensorManager; private final Sensor mSensor; + private final OrientationCorrectionListener mCorrectionListener; private boolean mShouldHandleEvents; private boolean mFirstPass; private long mPreviousTimestamp; + private float xFactor; // -1 or 1 depending on device orientation + private float yFactor; + private boolean mSwapXY; public GyroControl(Context context) { mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); + mCorrectionListener = new OrientationCorrectionListener(context); } public void enable() { if(mSensor == null) return; mFirstPass = true; mSensorManager.registerListener(this, mSensor, 1000 * LauncherPreferences.PREF_GYRO_SAMPLE_RATE); + mCorrectionListener.enable(); mShouldHandleEvents = CallbackBridge.isGrabbing(); CallbackBridge.addGrabListener(this); } @@ -34,9 +40,9 @@ public class GyroControl implements SensorEventListener, GrabListener { public void disable() { if(mSensor == null) return; mSensorManager.unregisterListener(this); + mCorrectionListener.disable(); CallbackBridge.removeGrabListener(this); } - @Override public void onSensorChanged(SensorEvent sensorEvent) { if(mShouldHandleEvents && sensorEvent.sensor == mSensor) { @@ -44,8 +50,13 @@ public class GyroControl implements SensorEventListener, GrabListener { if(!mFirstPass) { factor *= (sensorEvent.timestamp - mPreviousTimestamp) * 0.000001; }else mFirstPass = false; - CallbackBridge.mouseX += sensorEvent.values[0] * factor; - CallbackBridge.mouseY += sensorEvent.values[1] * factor; + if(mSwapXY) { + float interm = sensorEvent.values[0]; + sensorEvent.values[0] = sensorEvent.values[1]; + sensorEvent.values[1] = interm; + } + CallbackBridge.mouseX += sensorEvent.values[0] * factor * xFactor; + CallbackBridge.mouseY += sensorEvent.values[1] * factor * yFactor; CallbackBridge.sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); mPreviousTimestamp = sensorEvent.timestamp; } @@ -61,4 +72,32 @@ public class GyroControl implements SensorEventListener, GrabListener { mFirstPass = true; mShouldHandleEvents = isGrabbing; } + + class OrientationCorrectionListener extends OrientationEventListener { + + public OrientationCorrectionListener(Context context) { + super(context, SensorManager.SENSOR_DELAY_NORMAL); + } + + @Override + public void onOrientationChanged(int i) { + if((315 < i && i <= 360) || (i < 45) ) { + mSwapXY = true; + xFactor = -1; + yFactor = -1; + }else if(45 < i && i < 135) { + mSwapXY = false; + xFactor = -1; + yFactor = -1; + }else if(135 < i && i < 225) { + mSwapXY = true; + xFactor = 1; + yFactor = 1; + }else if(225 < i && i < 315) { + mSwapXY = false; + xFactor = 1; + yFactor = 1; + } + } + } }