Răsfoiți Sursa

android: Move motion listener to emulation activity

german77 3 ani în urmă
părinte
comite
166bff88b8

+ 70 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt

@@ -4,9 +4,14 @@
 package org.yuzu.yuzu_emu.activities
 
 import android.app.Activity
+import android.content.Context
 import android.content.DialogInterface
 import android.content.Intent
 import android.graphics.Rect
+import android.hardware.Sensor
+import android.hardware.SensorEvent
+import android.hardware.SensorEventListener
+import android.hardware.SensorManager
 import android.os.Bundle
 import android.view.*
 import android.view.KeyEvent
@@ -29,7 +34,7 @@ import org.yuzu.yuzu_emu.utils.SerializableHelper.parcelable
 import org.yuzu.yuzu_emu.utils.ThemeHelper
 import kotlin.math.roundToInt
 
-open class EmulationActivity : AppCompatActivity() {
+open class EmulationActivity : AppCompatActivity(), SensorEventListener {
     private var controllerMappingHelper: ControllerMappingHelper? = null
 
     // TODO(bunnei): Disable notifications until we support app suspension.
@@ -41,6 +46,10 @@ open class EmulationActivity : AppCompatActivity() {
     private lateinit var nfcReader: NfcReader
     private lateinit var inputHandler: InputHandler
 
+    private val gyro = FloatArray(3)
+    private val accel = FloatArray(3)
+    private var motionTimestamp: Long = 0
+
     private lateinit var game: Game
 
     override fun onDestroy() {
@@ -160,6 +169,49 @@ open class EmulationActivity : AppCompatActivity() {
         return inputHandler.dispatchGenericMotionEvent(event)
     }
 
+    override fun onSensorChanged(event: SensorEvent) {
+        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
+            accel[0] = -event.values[1] / SensorManager.GRAVITY_EARTH
+            accel[1] = event.values[0] / SensorManager.GRAVITY_EARTH
+            accel[2] = -event.values[2] / SensorManager.GRAVITY_EARTH
+        }
+        if (event.sensor.type == Sensor.TYPE_GYROSCOPE) {
+            // Investigate why sensor value is off by 6x
+            gyro[0] = event.values[1] / 6.0f
+            gyro[1] = -event.values[0] / 6.0f
+            gyro[2] = event.values[2] / 6.0f
+        }
+
+        // Only update state on accelerometer data
+        if (event.sensor.type != Sensor.TYPE_ACCELEROMETER) {
+            return
+        }
+        val deltaTimestamp = (event.timestamp - motionTimestamp) / 1000
+        motionTimestamp = event.timestamp
+        NativeLibrary.onGamePadMotionEvent(
+            NativeLibrary.Player1Device,
+            deltaTimestamp,
+            gyro[0],
+            gyro[1],
+            gyro[2],
+            accel[0],
+            accel[1],
+            accel[2]
+        )
+        NativeLibrary.onGamePadMotionEvent(
+            NativeLibrary.ConsoleDevice,
+            deltaTimestamp,
+            gyro[0],
+            gyro[1],
+            gyro[2],
+            accel[0],
+            accel[1],
+            accel[2]
+        )
+    }
+
+    override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
+
     private fun restoreState(savedInstanceState: Bundle) {
         game = savedInstanceState.parcelable(EXTRA_SELECTED_GAME)!!
     }
@@ -212,6 +264,23 @@ open class EmulationActivity : AppCompatActivity() {
             .show()
     }
 
+    private fun startMotionSensorListener() {
+        val sensorManager = this.getSystemService(Context.SENSOR_SERVICE) as SensorManager
+        val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
+        val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
+        sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_GAME)
+        sensorManager.registerListener(this, accelSensor, SensorManager.SENSOR_DELAY_GAME)
+    }
+
+    private fun stopMotionSensorListener() {
+        val sensorManager = this.getSystemService(Context.SENSOR_SERVICE) as SensorManager
+        val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
+        val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
+
+        sensorManager.unregisterListener(this, gyroSensor)
+        sensorManager.unregisterListener(this, accelSensor)
+    }
+
     private fun setControlScale(scale: Int) {
         PreferenceManager.getDefaultSharedPreferences(applicationContext).edit()
             .putInt(Settings.PREF_CONTROL_SCALE, scale)

+ 1 - 63
src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt

@@ -12,10 +12,6 @@ import android.graphics.Canvas
 import android.graphics.Rect
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.VectorDrawable
-import android.hardware.Sensor
-import android.hardware.SensorEvent
-import android.hardware.SensorEventListener
-import android.hardware.SensorManager
 import android.os.Build
 import android.util.AttributeSet
 import android.view.MotionEvent
@@ -41,7 +37,7 @@ import kotlin.math.min
  * [SurfaceView] that is rendering emulation.
  */
 class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context, attrs),
-    OnTouchListener, SensorEventListener {
+    OnTouchListener {
     private val overlayButtons: MutableSet<InputOverlayDrawableButton> = HashSet()
     private val overlayDpads: MutableSet<InputOverlayDrawableDpad> = HashSet()
     private val overlayJoysticks: MutableSet<InputOverlayDrawableJoystick> = HashSet()
@@ -54,21 +50,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
     private val preferences: SharedPreferences =
         PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
 
-    private val gyro = FloatArray(3)
-    private val accel = FloatArray(3)
-    private var motionTimestamp: Long = 0
-
     private lateinit var windowInsets: WindowInsets
 
-    private fun setMotionSensorListener(context: Context) {
-        val sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
-        val gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
-        val accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
-
-        sensorManager.registerListener(this, gyroSensor, SensorManager.SENSOR_DELAY_GAME)
-        sensorManager.registerListener(this, accelSensor, SensorManager.SENSOR_DELAY_GAME)
-    }
-
     override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
         super.onLayout(changed, left, top, right, bottom)
 
@@ -81,9 +64,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
         // Load the controls.
         refreshControls()
 
-        // Set the on motion sensor listener.
-        setMotionSensorListener(context)
-
         // Set the on touch listener.
         setOnTouchListener(this)
 
@@ -338,48 +318,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
         return true
     }
 
-    override fun onSensorChanged(event: SensorEvent) {
-        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
-            accel[0] = -event.values[1] / SensorManager.GRAVITY_EARTH
-            accel[1] = event.values[0] / SensorManager.GRAVITY_EARTH
-            accel[2] = -event.values[2] / SensorManager.GRAVITY_EARTH
-        }
-        if (event.sensor.type == Sensor.TYPE_GYROSCOPE) {
-            // Investigate why sensor value is off by 12x
-            gyro[0] = event.values[1] / 12.0f
-            gyro[1] = -event.values[0] / 12.0f
-            gyro[2] = event.values[2] / 12.0f
-        }
-
-        // Only update state on accelerometer data
-        if (event.sensor.type != Sensor.TYPE_ACCELEROMETER) {
-            return
-        }
-        val deltaTimestamp = (event.timestamp - motionTimestamp) / 1000
-        motionTimestamp = event.timestamp
-        NativeLibrary.onGamePadMotionEvent(
-            NativeLibrary.Player1Device,
-            deltaTimestamp,
-            gyro[0],
-            gyro[1],
-            gyro[2],
-            accel[0],
-            accel[1],
-            accel[2]
-        )
-        NativeLibrary.onGamePadMotionEvent(
-            NativeLibrary.ConsoleDevice,
-            deltaTimestamp,
-            gyro[0],
-            gyro[1],
-            gyro[2],
-            accel[0],
-            accel[1],
-            accel[2]
-        )
-    }
-
-    override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
     private fun addOverlayControls(orientation: String) {
         if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_0, true)) {
             overlayButtons.add(