mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	android: Add option for touch overlay haptics
Disabled by default
This commit is contained in:
		@@ -130,6 +130,7 @@ class Settings {
 | 
			
		||||
 | 
			
		||||
        const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
 | 
			
		||||
        const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
 | 
			
		||||
        const val PREF_MENU_SETTINGS_HAPTICS = "EmulationMenuSettings_Haptics"
 | 
			
		||||
        const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout"
 | 
			
		||||
        const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps"
 | 
			
		||||
        const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay"
 | 
			
		||||
 
 | 
			
		||||
@@ -223,10 +223,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
 | 
			
		||||
        popup.menuInflater.inflate(R.menu.menu_overlay_options, popup.menu)
 | 
			
		||||
 | 
			
		||||
        popup.menu.findItem(R.id.menu_rel_stick_center).isChecked =
 | 
			
		||||
            EmulationMenuSettings.joystickRelCenter
 | 
			
		||||
        popup.menu.findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide
 | 
			
		||||
        popup.menu.findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay
 | 
			
		||||
        popup.menu.apply {
 | 
			
		||||
            findItem(R.id.menu_rel_stick_center).isChecked = EmulationMenuSettings.joystickRelCenter
 | 
			
		||||
            findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide
 | 
			
		||||
            findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay
 | 
			
		||||
            findItem(R.id.menu_haptics).isChecked = EmulationMenuSettings.hapticFeedback
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        popup.setOnMenuItemClickListener {
 | 
			
		||||
            when (it.itemId) {
 | 
			
		||||
@@ -290,6 +292,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 | 
			
		||||
                    EmulationMenuSettings.dpadSlide = it.isChecked
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
                R.id.menu_haptics -> {
 | 
			
		||||
                    it.isChecked = !it.isChecked
 | 
			
		||||
                    EmulationMenuSettings.hapticFeedback = it.isChecked
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
                R.id.menu_reset_overlay -> {
 | 
			
		||||
                    binding.drawerLayout.close()
 | 
			
		||||
                    resetInputOverlay()
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import android.graphics.drawable.Drawable
 | 
			
		||||
import android.graphics.drawable.VectorDrawable
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.util.AttributeSet
 | 
			
		||||
import android.view.HapticFeedbackConstants
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
import android.view.SurfaceView
 | 
			
		||||
import android.view.View
 | 
			
		||||
@@ -105,6 +106,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                button.buttonId,
 | 
			
		||||
                button.status
 | 
			
		||||
            )
 | 
			
		||||
            playHaptics(event)
 | 
			
		||||
            shouldUpdateView = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -132,6 +134,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                dpad.rightId,
 | 
			
		||||
                dpad.rightStatus
 | 
			
		||||
            )
 | 
			
		||||
            playHaptics(event)
 | 
			
		||||
            shouldUpdateView = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -151,6 +154,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                joystick.buttonId,
 | 
			
		||||
                joystick.buttonStatus
 | 
			
		||||
            )
 | 
			
		||||
            playHaptics(event)
 | 
			
		||||
            shouldUpdateView = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -193,6 +197,20 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun playHaptics(event: MotionEvent) {
 | 
			
		||||
        if (EmulationMenuSettings.hapticFeedback) {
 | 
			
		||||
            when (event.actionMasked) {
 | 
			
		||||
                MotionEvent.ACTION_DOWN,
 | 
			
		||||
                MotionEvent.ACTION_POINTER_DOWN ->
 | 
			
		||||
                    performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_UP,
 | 
			
		||||
                MotionEvent.ACTION_POINTER_UP ->
 | 
			
		||||
                    performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun isTouchInputConsumed(track_id: Int): Boolean {
 | 
			
		||||
        for (button in overlayButtons) {
 | 
			
		||||
            if (button.trackId == track_id) {
 | 
			
		||||
@@ -236,11 +254,13 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                        buttonBeingConfigured = button
 | 
			
		||||
                        buttonBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) {
 | 
			
		||||
                    buttonBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                    invalidate()
 | 
			
		||||
                    return true
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_UP,
 | 
			
		||||
                MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
 | 
			
		||||
                    // Persist button position by saving new place.
 | 
			
		||||
@@ -267,11 +287,13 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                        dpadBeingConfigured = dpad
 | 
			
		||||
                        dpadBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) {
 | 
			
		||||
                    dpadBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                    invalidate()
 | 
			
		||||
                    return true
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_UP,
 | 
			
		||||
                MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
 | 
			
		||||
                    // Persist button position by saving new place.
 | 
			
		||||
@@ -298,10 +320,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                    joystickBeingConfigured = joystick
 | 
			
		||||
                    joystickBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) {
 | 
			
		||||
                    joystickBeingConfigured!!.onConfigureTouch(event)
 | 
			
		||||
                    invalidate()
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                MotionEvent.ACTION_UP,
 | 
			
		||||
                MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
 | 
			
		||||
                    saveControlPosition(
 | 
			
		||||
@@ -795,10 +819,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context
 | 
			
		||||
                ButtonType.BUTTON_CAPTURE,
 | 
			
		||||
                ButtonType.BUTTON_PLUS,
 | 
			
		||||
                ButtonType.BUTTON_MINUS -> 0.07f
 | 
			
		||||
 | 
			
		||||
                ButtonType.TRIGGER_L,
 | 
			
		||||
                ButtonType.TRIGGER_R,
 | 
			
		||||
                ButtonType.TRIGGER_ZL,
 | 
			
		||||
                ButtonType.TRIGGER_ZR -> 0.26f
 | 
			
		||||
 | 
			
		||||
                else -> 0.11f
 | 
			
		||||
            }
 | 
			
		||||
            scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat()
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,13 @@ object EmulationMenuSettings {
 | 
			
		||||
                .putBoolean(Settings.PREF_MENU_SETTINGS_DPAD_SLIDE, value)
 | 
			
		||||
                .apply()
 | 
			
		||||
        }
 | 
			
		||||
    var hapticFeedback: Boolean
 | 
			
		||||
        get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, false)
 | 
			
		||||
        set(value) {
 | 
			
		||||
            preferences.edit()
 | 
			
		||||
                .putBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, value)
 | 
			
		||||
                .apply()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    var landscapeScreenLayout: Int
 | 
			
		||||
        get() = preferences.getInt(
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,11 @@
 | 
			
		||||
        android:title="@string/emulation_dpad_slide"
 | 
			
		||||
        android:checkable="true" />
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/menu_haptics"
 | 
			
		||||
        android:title="@string/emulation_haptics"
 | 
			
		||||
        android:checkable="true" />
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/menu_reset_overlay"
 | 
			
		||||
        android:title="@string/emulation_touch_overlay_reset" />
 | 
			
		||||
 
 | 
			
		||||
@@ -185,6 +185,7 @@
 | 
			
		||||
    <string name="emulation_toggle_controls">Toggle Controls</string>
 | 
			
		||||
    <string name="emulation_rel_stick_center">Relative Stick Center</string>
 | 
			
		||||
    <string name="emulation_dpad_slide">DPad Slide</string>
 | 
			
		||||
    <string name="emulation_haptics">Haptics</string>
 | 
			
		||||
    <string name="emulation_show_overlay">Show Overlay</string>
 | 
			
		||||
    <string name="emulation_toggle_all">Toggle All</string>
 | 
			
		||||
    <string name="emulation_control_scale">Adjust Scale</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user