android: Move motion listener to emulation activity
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user