summaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorGravatar Charles Lombardo2023-05-22 19:36:15 -0400
committerGravatar bunnei2023-06-03 00:06:03 -0700
commitffba83d568e6bd4dc98a26103320f97b6b0d9e6c (patch)
tree2a6b57c31421ccf297f6ef8080fc473314ab9200 /src/android
parentandroid: Improve missing game handling (diff)
downloadyuzu-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')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt1
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt15
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt26
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt7
-rw-r--r--src/android/app/src/main/res/menu/menu_overlay_options.xml5
-rw-r--r--src/android/app/src/main/res/values/strings.xml1
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
14import android.graphics.drawable.VectorDrawable 14import android.graphics.drawable.VectorDrawable
15import android.os.Build 15import android.os.Build
16import android.util.AttributeSet 16import android.util.AttributeSet
17import android.view.HapticFeedbackConstants
17import android.view.MotionEvent 18import android.view.MotionEvent
18import android.view.SurfaceView 19import android.view.SurfaceView
19import android.view.View 20import 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>