diff options
| author | 2023-05-22 19:36:15 -0400 | |
|---|---|---|
| committer | 2023-06-03 00:06:03 -0700 | |
| commit | ffba83d568e6bd4dc98a26103320f97b6b0d9e6c (patch) | |
| tree | 2a6b57c31421ccf297f6ef8080fc473314ab9200 /src/android | |
| parent | android: Improve missing game handling (diff) | |
| download | yuzu-ffba83d568e6bd4dc98a26103320f97b6b0d9e6c.tar.gz yuzu-ffba83d568e6bd4dc98a26103320f97b6b0d9e6c.tar.xz yuzu-ffba83d568e6bd4dc98a26103320f97b6b0d9e6c.zip | |
android: Add option for touch overlay haptics
Disabled by default
Diffstat (limited to 'src/android')
6 files changed, 51 insertions, 4 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index b71291609..a904c2011 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt | |||
| @@ -130,6 +130,7 @@ class Settings { | |||
| 130 | 130 | ||
| 131 | const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter" | 131 | const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter" |
| 132 | const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable" | 132 | const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable" |
| 133 | const val PREF_MENU_SETTINGS_HAPTICS = "EmulationMenuSettings_Haptics" | ||
| 133 | const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout" | 134 | const val PREF_MENU_SETTINGS_LANDSCAPE = "EmulationMenuSettings_LandscapeScreenLayout" |
| 134 | const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps" | 135 | const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps" |
| 135 | const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay" | 136 | const val PREF_MENU_SETTINGS_SHOW_OVERLAY = "EmulationMenuSettings_ShowOverlay" |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index daa704565..1d1c1333d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt | |||
| @@ -223,10 +223,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 223 | 223 | ||
| 224 | popup.menuInflater.inflate(R.menu.menu_overlay_options, popup.menu) | 224 | popup.menuInflater.inflate(R.menu.menu_overlay_options, popup.menu) |
| 225 | 225 | ||
| 226 | popup.menu.findItem(R.id.menu_rel_stick_center).isChecked = | 226 | popup.menu.apply { |
| 227 | EmulationMenuSettings.joystickRelCenter | 227 | findItem(R.id.menu_rel_stick_center).isChecked = EmulationMenuSettings.joystickRelCenter |
| 228 | popup.menu.findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide | 228 | findItem(R.id.menu_dpad_slide).isChecked = EmulationMenuSettings.dpadSlide |
| 229 | popup.menu.findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay | 229 | findItem(R.id.menu_show_overlay).isChecked = EmulationMenuSettings.showOverlay |
| 230 | findItem(R.id.menu_haptics).isChecked = EmulationMenuSettings.hapticFeedback | ||
| 231 | } | ||
| 230 | 232 | ||
| 231 | popup.setOnMenuItemClickListener { | 233 | popup.setOnMenuItemClickListener { |
| 232 | when (it.itemId) { | 234 | when (it.itemId) { |
| @@ -290,6 +292,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 290 | EmulationMenuSettings.dpadSlide = it.isChecked | 292 | EmulationMenuSettings.dpadSlide = it.isChecked |
| 291 | true | 293 | true |
| 292 | } | 294 | } |
| 295 | R.id.menu_haptics -> { | ||
| 296 | it.isChecked = !it.isChecked | ||
| 297 | EmulationMenuSettings.hapticFeedback = it.isChecked | ||
| 298 | true | ||
| 299 | } | ||
| 293 | R.id.menu_reset_overlay -> { | 300 | R.id.menu_reset_overlay -> { |
| 294 | binding.drawerLayout.close() | 301 | binding.drawerLayout.close() |
| 295 | resetInputOverlay() | 302 | resetInputOverlay() |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt index 5c3d79a16..95f358c21 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt | |||
| @@ -14,6 +14,7 @@ import android.graphics.drawable.Drawable | |||
| 14 | import android.graphics.drawable.VectorDrawable | 14 | import android.graphics.drawable.VectorDrawable |
| 15 | import android.os.Build | 15 | import android.os.Build |
| 16 | import android.util.AttributeSet | 16 | import android.util.AttributeSet |
| 17 | import android.view.HapticFeedbackConstants | ||
| 17 | import android.view.MotionEvent | 18 | import android.view.MotionEvent |
| 18 | import android.view.SurfaceView | 19 | import android.view.SurfaceView |
| 19 | import android.view.View | 20 | import android.view.View |
| @@ -105,6 +106,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 105 | button.buttonId, | 106 | button.buttonId, |
| 106 | button.status | 107 | button.status |
| 107 | ) | 108 | ) |
| 109 | playHaptics(event) | ||
| 108 | shouldUpdateView = true | 110 | shouldUpdateView = true |
| 109 | } | 111 | } |
| 110 | 112 | ||
| @@ -132,6 +134,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 132 | dpad.rightId, | 134 | dpad.rightId, |
| 133 | dpad.rightStatus | 135 | dpad.rightStatus |
| 134 | ) | 136 | ) |
| 137 | playHaptics(event) | ||
| 135 | shouldUpdateView = true | 138 | shouldUpdateView = true |
| 136 | } | 139 | } |
| 137 | 140 | ||
| @@ -151,6 +154,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 151 | joystick.buttonId, | 154 | joystick.buttonId, |
| 152 | joystick.buttonStatus | 155 | joystick.buttonStatus |
| 153 | ) | 156 | ) |
| 157 | playHaptics(event) | ||
| 154 | shouldUpdateView = true | 158 | shouldUpdateView = true |
| 155 | } | 159 | } |
| 156 | 160 | ||
| @@ -193,6 +197,20 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 193 | return true | 197 | return true |
| 194 | } | 198 | } |
| 195 | 199 | ||
| 200 | private fun playHaptics(event: MotionEvent) { | ||
| 201 | if (EmulationMenuSettings.hapticFeedback) { | ||
| 202 | when (event.actionMasked) { | ||
| 203 | MotionEvent.ACTION_DOWN, | ||
| 204 | MotionEvent.ACTION_POINTER_DOWN -> | ||
| 205 | performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY) | ||
| 206 | |||
| 207 | MotionEvent.ACTION_UP, | ||
| 208 | MotionEvent.ACTION_POINTER_UP -> | ||
| 209 | performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY_RELEASE) | ||
| 210 | } | ||
| 211 | } | ||
| 212 | } | ||
| 213 | |||
| 196 | private fun isTouchInputConsumed(track_id: Int): Boolean { | 214 | private fun isTouchInputConsumed(track_id: Int): Boolean { |
| 197 | for (button in overlayButtons) { | 215 | for (button in overlayButtons) { |
| 198 | if (button.trackId == track_id) { | 216 | if (button.trackId == track_id) { |
| @@ -236,11 +254,13 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 236 | buttonBeingConfigured = button | 254 | buttonBeingConfigured = button |
| 237 | buttonBeingConfigured!!.onConfigureTouch(event) | 255 | buttonBeingConfigured!!.onConfigureTouch(event) |
| 238 | } | 256 | } |
| 257 | |||
| 239 | MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) { | 258 | MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) { |
| 240 | buttonBeingConfigured!!.onConfigureTouch(event) | 259 | buttonBeingConfigured!!.onConfigureTouch(event) |
| 241 | invalidate() | 260 | invalidate() |
| 242 | return true | 261 | return true |
| 243 | } | 262 | } |
| 263 | |||
| 244 | MotionEvent.ACTION_UP, | 264 | MotionEvent.ACTION_UP, |
| 245 | MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) { | 265 | MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) { |
| 246 | // Persist button position by saving new place. | 266 | // Persist button position by saving new place. |
| @@ -267,11 +287,13 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 267 | dpadBeingConfigured = dpad | 287 | dpadBeingConfigured = dpad |
| 268 | dpadBeingConfigured!!.onConfigureTouch(event) | 288 | dpadBeingConfigured!!.onConfigureTouch(event) |
| 269 | } | 289 | } |
| 290 | |||
| 270 | MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) { | 291 | MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) { |
| 271 | dpadBeingConfigured!!.onConfigureTouch(event) | 292 | dpadBeingConfigured!!.onConfigureTouch(event) |
| 272 | invalidate() | 293 | invalidate() |
| 273 | return true | 294 | return true |
| 274 | } | 295 | } |
| 296 | |||
| 275 | MotionEvent.ACTION_UP, | 297 | MotionEvent.ACTION_UP, |
| 276 | MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) { | 298 | MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) { |
| 277 | // Persist button position by saving new place. | 299 | // Persist button position by saving new place. |
| @@ -298,10 +320,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 298 | joystickBeingConfigured = joystick | 320 | joystickBeingConfigured = joystick |
| 299 | joystickBeingConfigured!!.onConfigureTouch(event) | 321 | joystickBeingConfigured!!.onConfigureTouch(event) |
| 300 | } | 322 | } |
| 323 | |||
| 301 | MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) { | 324 | MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) { |
| 302 | joystickBeingConfigured!!.onConfigureTouch(event) | 325 | joystickBeingConfigured!!.onConfigureTouch(event) |
| 303 | invalidate() | 326 | invalidate() |
| 304 | } | 327 | } |
| 328 | |||
| 305 | MotionEvent.ACTION_UP, | 329 | MotionEvent.ACTION_UP, |
| 306 | MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) { | 330 | MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) { |
| 307 | saveControlPosition( | 331 | saveControlPosition( |
| @@ -795,10 +819,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 795 | ButtonType.BUTTON_CAPTURE, | 819 | ButtonType.BUTTON_CAPTURE, |
| 796 | ButtonType.BUTTON_PLUS, | 820 | ButtonType.BUTTON_PLUS, |
| 797 | ButtonType.BUTTON_MINUS -> 0.07f | 821 | ButtonType.BUTTON_MINUS -> 0.07f |
| 822 | |||
| 798 | ButtonType.TRIGGER_L, | 823 | ButtonType.TRIGGER_L, |
| 799 | ButtonType.TRIGGER_R, | 824 | ButtonType.TRIGGER_R, |
| 800 | ButtonType.TRIGGER_ZL, | 825 | ButtonType.TRIGGER_ZL, |
| 801 | ButtonType.TRIGGER_ZR -> 0.26f | 826 | ButtonType.TRIGGER_ZR -> 0.26f |
| 827 | |||
| 802 | else -> 0.11f | 828 | else -> 0.11f |
| 803 | } | 829 | } |
| 804 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() | 830 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt index 26ea2d77d..f5a81a7e5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt | |||
| @@ -33,6 +33,13 @@ object EmulationMenuSettings { | |||
| 33 | .putBoolean(Settings.PREF_MENU_SETTINGS_DPAD_SLIDE, value) | 33 | .putBoolean(Settings.PREF_MENU_SETTINGS_DPAD_SLIDE, value) |
| 34 | .apply() | 34 | .apply() |
| 35 | } | 35 | } |
| 36 | var hapticFeedback: Boolean | ||
| 37 | get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, false) | ||
| 38 | set(value) { | ||
| 39 | preferences.edit() | ||
| 40 | .putBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, value) | ||
| 41 | .apply() | ||
| 42 | } | ||
| 36 | 43 | ||
| 37 | var landscapeScreenLayout: Int | 44 | var landscapeScreenLayout: Int |
| 38 | get() = preferences.getInt( | 45 | get() = preferences.getInt( |
diff --git a/src/android/app/src/main/res/menu/menu_overlay_options.xml b/src/android/app/src/main/res/menu/menu_overlay_options.xml index 17ba5496d..9acc29405 100644 --- a/src/android/app/src/main/res/menu/menu_overlay_options.xml +++ b/src/android/app/src/main/res/menu/menu_overlay_options.xml | |||
| @@ -25,6 +25,11 @@ | |||
| 25 | android:checkable="true" /> | 25 | android:checkable="true" /> |
| 26 | 26 | ||
| 27 | <item | 27 | <item |
| 28 | android:id="@+id/menu_haptics" | ||
| 29 | android:title="@string/emulation_haptics" | ||
| 30 | android:checkable="true" /> | ||
| 31 | |||
| 32 | <item | ||
| 28 | android:id="@+id/menu_reset_overlay" | 33 | android:id="@+id/menu_reset_overlay" |
| 29 | android:title="@string/emulation_touch_overlay_reset" /> | 34 | android:title="@string/emulation_touch_overlay_reset" /> |
| 30 | 35 | ||
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 03a5ffc7e..6e4b1e630 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml | |||
| @@ -185,6 +185,7 @@ | |||
| 185 | <string name="emulation_toggle_controls">Toggle Controls</string> | 185 | <string name="emulation_toggle_controls">Toggle Controls</string> |
| 186 | <string name="emulation_rel_stick_center">Relative Stick Center</string> | 186 | <string name="emulation_rel_stick_center">Relative Stick Center</string> |
| 187 | <string name="emulation_dpad_slide">DPad Slide</string> | 187 | <string name="emulation_dpad_slide">DPad Slide</string> |
| 188 | <string name="emulation_haptics">Haptics</string> | ||
| 188 | <string name="emulation_show_overlay">Show Overlay</string> | 189 | <string name="emulation_show_overlay">Show Overlay</string> |
| 189 | <string name="emulation_toggle_all">Toggle All</string> | 190 | <string name="emulation_toggle_all">Toggle All</string> |
| 190 | <string name="emulation_control_scale">Adjust Scale</string> | 191 | <string name="emulation_control_scale">Adjust Scale</string> |