diff options
| author | 2024-01-25 20:39:52 -0500 | |
|---|---|---|
| committer | 2024-01-25 20:39:52 -0500 | |
| commit | 68cbf67f4c852d0dc3745dcacc8f0a40e4595f1d (patch) | |
| tree | 91e5f930f8f26b64e76fd7effbfec7e5051d7118 /src | |
| parent | Merge pull request #12759 from liamwhite/mp-misc (diff) | |
| download | yuzu-68cbf67f4c852d0dc3745dcacc8f0a40e4595f1d.tar.gz yuzu-68cbf67f4c852d0dc3745dcacc8f0a40e4595f1d.tar.xz yuzu-68cbf67f4c852d0dc3745dcacc8f0a40e4595f1d.zip | |
android: Focus on the in game menu when opened
Diffstat (limited to 'src')
4 files changed, 39 insertions, 7 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt index 9b08f008d..26cddecf4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt | |||
| @@ -193,6 +193,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 193 | return super.dispatchKeyEvent(event) | 193 | return super.dispatchKeyEvent(event) |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | if (emulationViewModel.drawerOpen.value) { | ||
| 197 | return super.dispatchKeyEvent(event) | ||
| 198 | } | ||
| 199 | |||
| 196 | return InputHandler.dispatchKeyEvent(event) | 200 | return InputHandler.dispatchKeyEvent(event) |
| 197 | } | 201 | } |
| 198 | 202 | ||
| @@ -203,6 +207,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { | |||
| 203 | return super.dispatchGenericMotionEvent(event) | 207 | return super.dispatchGenericMotionEvent(event) |
| 204 | } | 208 | } |
| 205 | 209 | ||
| 210 | if (emulationViewModel.drawerOpen.value) { | ||
| 211 | return super.dispatchGenericMotionEvent(event) | ||
| 212 | } | ||
| 213 | |||
| 206 | // Don't attempt to do anything if we are disconnecting a device. | 214 | // Don't attempt to do anything if we are disconnecting a device. |
| 207 | if (event.actionMasked == MotionEvent.ACTION_CANCEL) { | 215 | if (event.actionMasked == MotionEvent.ACTION_CANCEL) { |
| 208 | return true | 216 | return true |
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 d17e087fe..22da1d0e5 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 | |||
| @@ -38,6 +38,7 @@ import androidx.window.layout.WindowLayoutInfo | |||
| 38 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 38 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 39 | import com.google.android.material.slider.Slider | 39 | import com.google.android.material.slider.Slider |
| 40 | import kotlinx.coroutines.Dispatchers | 40 | import kotlinx.coroutines.Dispatchers |
| 41 | import kotlinx.coroutines.flow.collect | ||
| 41 | import kotlinx.coroutines.flow.collectLatest | 42 | import kotlinx.coroutines.flow.collectLatest |
| 42 | import kotlinx.coroutines.launch | 43 | import kotlinx.coroutines.launch |
| 43 | import org.yuzu.yuzu_emu.HomeNavigationDirections | 44 | import org.yuzu.yuzu_emu.HomeNavigationDirections |
| @@ -184,10 +185,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 184 | 185 | ||
| 185 | override fun onDrawerOpened(drawerView: View) { | 186 | override fun onDrawerOpened(drawerView: View) { |
| 186 | binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) | 187 | binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) |
| 188 | binding.inGameMenu.requestFocus() | ||
| 189 | emulationViewModel.setDrawerOpen(true) | ||
| 187 | } | 190 | } |
| 188 | 191 | ||
| 189 | override fun onDrawerClosed(drawerView: View) { | 192 | override fun onDrawerClosed(drawerView: View) { |
| 190 | binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt()) | 193 | binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt()) |
| 194 | emulationViewModel.setDrawerOpen(false) | ||
| 191 | } | 195 | } |
| 192 | 196 | ||
| 193 | override fun onDrawerStateChanged(newState: Int) { | 197 | override fun onDrawerStateChanged(newState: Int) { |
| @@ -239,6 +243,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 239 | requireContext().theme | 243 | requireContext().theme |
| 240 | ) | 244 | ) |
| 241 | } | 245 | } |
| 246 | binding.inGameMenu.requestFocus() | ||
| 242 | true | 247 | true |
| 243 | } | 248 | } |
| 244 | 249 | ||
| @@ -247,6 +252,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 247 | null, | 252 | null, |
| 248 | Settings.MenuTag.SECTION_ROOT | 253 | Settings.MenuTag.SECTION_ROOT |
| 249 | ) | 254 | ) |
| 255 | binding.inGameMenu.requestFocus() | ||
| 250 | binding.root.findNavController().navigate(action) | 256 | binding.root.findNavController().navigate(action) |
| 251 | true | 257 | true |
| 252 | } | 258 | } |
| @@ -256,6 +262,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 256 | args.game, | 262 | args.game, |
| 257 | Settings.MenuTag.SECTION_ROOT | 263 | Settings.MenuTag.SECTION_ROOT |
| 258 | ) | 264 | ) |
| 265 | binding.inGameMenu.requestFocus() | ||
| 259 | binding.root.findNavController().navigate(action) | 266 | binding.root.findNavController().navigate(action) |
| 260 | true | 267 | true |
| 261 | } | 268 | } |
| @@ -287,6 +294,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 287 | ) | 294 | ) |
| 288 | } | 295 | } |
| 289 | } | 296 | } |
| 297 | binding.inGameMenu.requestFocus() | ||
| 290 | NativeConfig.saveGlobalConfig() | 298 | NativeConfig.saveGlobalConfig() |
| 291 | true | 299 | true |
| 292 | } | 300 | } |
| @@ -295,7 +303,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 295 | emulationState.stop() | 303 | emulationState.stop() |
| 296 | emulationViewModel.setIsEmulationStopping(true) | 304 | emulationViewModel.setIsEmulationStopping(true) |
| 297 | binding.drawerLayout.close() | 305 | binding.drawerLayout.close() |
| 298 | binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) | 306 | binding.inGameMenu.requestFocus() |
| 299 | true | 307 | true |
| 300 | } | 308 | } |
| 301 | 309 | ||
| @@ -312,12 +320,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 312 | if (!NativeLibrary.isRunning()) { | 320 | if (!NativeLibrary.isRunning()) { |
| 313 | return | 321 | return |
| 314 | } | 322 | } |
| 315 | 323 | emulationViewModel.setDrawerOpen(!binding.drawerLayout.isOpen) | |
| 316 | if (binding.drawerLayout.isOpen) { | ||
| 317 | binding.drawerLayout.close() | ||
| 318 | } else { | ||
| 319 | binding.drawerLayout.open() | ||
| 320 | } | ||
| 321 | } | 324 | } |
| 322 | } | 325 | } |
| 323 | ) | 326 | ) |
| @@ -408,6 +411,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { | |||
| 408 | } | 411 | } |
| 409 | } | 412 | } |
| 410 | } | 413 | } |
| 414 | launch { | ||
| 415 | repeatOnLifecycle(Lifecycle.State.CREATED) { | ||
| 416 | emulationViewModel.drawerOpen.collect { | ||
| 417 | if (it) { | ||
| 418 | binding.drawerLayout.open() | ||
| 419 | binding.inGameMenu.requestFocus() | ||
| 420 | } else { | ||
| 421 | binding.drawerLayout.close() | ||
| 422 | } | ||
| 423 | } | ||
| 424 | } | ||
| 425 | } | ||
| 411 | } | 426 | } |
| 412 | } | 427 | } |
| 413 | 428 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt index f34870c2d..b66f47fe7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt | |||
| @@ -6,6 +6,7 @@ package org.yuzu.yuzu_emu.model | |||
| 6 | import androidx.lifecycle.ViewModel | 6 | import androidx.lifecycle.ViewModel |
| 7 | import kotlinx.coroutines.flow.MutableStateFlow | 7 | import kotlinx.coroutines.flow.MutableStateFlow |
| 8 | import kotlinx.coroutines.flow.StateFlow | 8 | import kotlinx.coroutines.flow.StateFlow |
| 9 | import kotlinx.coroutines.flow.asStateFlow | ||
| 9 | 10 | ||
| 10 | class EmulationViewModel : ViewModel() { | 11 | class EmulationViewModel : ViewModel() { |
| 11 | val emulationStarted: StateFlow<Boolean> get() = _emulationStarted | 12 | val emulationStarted: StateFlow<Boolean> get() = _emulationStarted |
| @@ -23,6 +24,9 @@ class EmulationViewModel : ViewModel() { | |||
| 23 | val shaderMessage: StateFlow<String> get() = _shaderMessage | 24 | val shaderMessage: StateFlow<String> get() = _shaderMessage |
| 24 | private val _shaderMessage = MutableStateFlow("") | 25 | private val _shaderMessage = MutableStateFlow("") |
| 25 | 26 | ||
| 27 | private val _drawerOpen = MutableStateFlow(false) | ||
| 28 | val drawerOpen = _drawerOpen.asStateFlow() | ||
| 29 | |||
| 26 | fun setEmulationStarted(started: Boolean) { | 30 | fun setEmulationStarted(started: Boolean) { |
| 27 | _emulationStarted.value = started | 31 | _emulationStarted.value = started |
| 28 | } | 32 | } |
| @@ -49,6 +53,10 @@ class EmulationViewModel : ViewModel() { | |||
| 49 | setTotalShaders(max) | 53 | setTotalShaders(max) |
| 50 | } | 54 | } |
| 51 | 55 | ||
| 56 | fun setDrawerOpen(value: Boolean) { | ||
| 57 | _drawerOpen.value = value | ||
| 58 | } | ||
| 59 | |||
| 52 | fun clear() { | 60 | fun clear() { |
| 53 | setEmulationStarted(false) | 61 | setEmulationStarted(false) |
| 54 | setIsEmulationStopping(false) | 62 | setIsEmulationStopping(false) |
diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index 5252adf54..988bbb373 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml | |||
| @@ -160,6 +160,7 @@ | |||
| 160 | android:layout_width="wrap_content" | 160 | android:layout_width="wrap_content" |
| 161 | android:layout_height="match_parent" | 161 | android:layout_height="match_parent" |
| 162 | android:layout_gravity="start" | 162 | android:layout_gravity="start" |
| 163 | android:focusedByDefault="true" | ||
| 163 | app:headerLayout="@layout/header_in_game" | 164 | app:headerLayout="@layout/header_in_game" |
| 164 | app:menu="@menu/menu_in_game" | 165 | app:menu="@menu/menu_in_game" |
| 165 | tools:visibility="gone" /> | 166 | tools:visibility="gone" /> |