diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f861e460..998819086 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,9 @@ + diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index 3f58bb19b..901de666e 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -52,6 +52,9 @@ import android.graphics.Point; import android.graphics.Rect; import android.hardware.input.InputManager; +import android.hardware.SensorEventListener; +import android.hardware.Sensor; +import android.hardware.SensorEvent; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; @@ -77,6 +80,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; +import android.hardware.SensorManager; import java.io.ByteArrayInputStream; import java.lang.reflect.InvocationTargetException; @@ -90,7 +94,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericMotionListener, OnTouchListener, NvConnectionListener, EvdevListener, OnSystemUiVisibilityChangeListener, GameGestures, StreamView.InputCallbacks, - PerfOverlayListener, UsbDriverService.UsbDriverStateListener, View.OnKeyListener { + PerfOverlayListener, UsbDriverService.UsbDriverStateListener, View.OnKeyListener, SensorEventListener { private int lastButtonState = 0; // Only 2 touches are supported @@ -152,6 +156,11 @@ public class Game extends Activity implements SurfaceHolder.Callback, private WifiManager.WifiLock lowLatencyWifiLock; private boolean connectedToUsbDriverService = false; + + private SensorManager sensorManager; + private Sensor gameRotationVectorSensor; + private float gyroSensitivity; + private ServiceConnection usbDriverServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { @@ -179,9 +188,27 @@ public void onServiceDisconnected(ComponentName componentName) { public static final String EXTRA_APP_HDR = "HDR"; public static final String EXTRA_SERVER_CERT = "ServerCert"; + @Override + public void onSensorChanged(SensorEvent event) { + if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { + float dx = event.values[0]; + float dy = event.values[1]; + + short x = (short) (dx * -gyroSensitivity); + short y = (short) (dy * gyroSensitivity); + conn.sendMouseMove(x, y); + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + this.sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); + this.gameRotationVectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); UiHelper.setLocale(this); @@ -533,6 +560,8 @@ public void notifyCrash(Exception e) { // The connection will be started when the surface gets created streamView.getHolder().addCallback(this); + sensorManager.registerListener(this, gameRotationVectorSensor, SensorManager.SENSOR_DELAY_GAME); + gyroSensitivity = (float)prefConfig.gyroSensitivity; } private void setPreferredOrientationForCurrentDisplay() { diff --git a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java index 36c26483b..725285e99 100644 --- a/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java +++ b/app/src/main/java/com/limelight/preferences/PreferenceConfiguration.java @@ -22,6 +22,7 @@ public class PreferenceConfiguration { private static final String DISABLE_TOASTS_PREF_STRING = "checkbox_disable_warnings"; private static final String HOST_AUDIO_PREF_STRING = "checkbox_host_audio"; private static final String DEADZONE_PREF_STRING = "seekbar_deadzone"; + private static final String GYROASSIST_PREF_STRING = "gyro_sensitivity"; private static final String OSC_OPACITY_PREF_STRING = "seekbar_osc_opacity"; private static final String LANGUAGE_PREF_STRING = "list_languages"; private static final String SMALL_ICONS_PREF_STRING = "checkbox_small_icon_mode"; @@ -57,6 +58,7 @@ public class PreferenceConfiguration { private static final boolean DEFAULT_DISABLE_TOASTS = false; private static final boolean DEFAULT_HOST_AUDIO = false; private static final int DEFAULT_DEADZONE = 7; + private static final int DEFAULT_GYROASSIST = 10; private static final int DEFAULT_OPACITY = 90; public static final String DEFAULT_LANGUAGE = "default"; private static final boolean DEFAULT_MULTI_CONTROLLER = true; @@ -104,6 +106,7 @@ public class PreferenceConfiguration { public int bitrate; public int videoFormat; public int deadzonePercentage; + public float gyroSensitivity; public int oscOpacity; public boolean stretchVideo, enableSops, playHostAudio, disableWarnings; public String language; @@ -479,6 +482,7 @@ else if (audioConfig.equals("51")) { config.framePacing = getFramePacingValue(context); config.deadzonePercentage = prefs.getInt(DEADZONE_PREF_STRING, DEFAULT_DEADZONE); + config.gyroSensitivity = prefs.getInt(GYROASSIST_PREF_STRING, DEFAULT_GYROASSIST); config.oscOpacity = prefs.getInt(OSC_OPACITY_PREF_STRING, DEFAULT_OPACITY); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 074ca4913..6d24b6798 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -174,6 +174,9 @@ Adjust analog stick deadzone Note: Some games can enforce a larger deadzone than what Moonlight is configured to use. % + Adjust gyro assist sensitivity + This enables using the phone gyros for aiminig/mouse control + % Xbox 360/One USB gamepad driver Enables a built-in USB driver for devices without native Xbox controller support Override native Xbox gamepad support diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 7c1becf86..c0db634b8 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -64,6 +64,14 @@ android:summary="@string/summary_seekbar_deadzone" android:text="@string/suffix_seekbar_deadzone" android:title="@string/title_seekbar_deadzone"/> +