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"/>
+