mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	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