Explorar el Código

android: Focus on the in game menu when opened

t895 hace 2 años
padre
commit
68cbf67f4c

+ 8 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt

@@ -193,6 +193,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
             return super.dispatchKeyEvent(event)
         }
 
+        if (emulationViewModel.drawerOpen.value) {
+            return super.dispatchKeyEvent(event)
+        }
+
         return InputHandler.dispatchKeyEvent(event)
     }
 
@@ -203,6 +207,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
             return super.dispatchGenericMotionEvent(event)
         }
 
+        if (emulationViewModel.drawerOpen.value) {
+            return super.dispatchGenericMotionEvent(event)
+        }
+
         // Don't attempt to do anything if we are disconnecting a device.
         if (event.actionMasked == MotionEvent.ACTION_CANCEL) {
             return true

+ 22 - 7
src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt

@@ -38,6 +38,7 @@ import androidx.window.layout.WindowLayoutInfo
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.android.material.slider.Slider
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import org.yuzu.yuzu_emu.HomeNavigationDirections
@@ -184,10 +185,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
 
             override fun onDrawerOpened(drawerView: View) {
                 binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
+                binding.inGameMenu.requestFocus()
+                emulationViewModel.setDrawerOpen(true)
             }
 
             override fun onDrawerClosed(drawerView: View) {
                 binding.drawerLayout.setDrawerLockMode(IntSetting.LOCK_DRAWER.getInt())
+                emulationViewModel.setDrawerOpen(false)
             }
 
             override fun onDrawerStateChanged(newState: Int) {
@@ -239,6 +243,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                             requireContext().theme
                         )
                     }
+                    binding.inGameMenu.requestFocus()
                     true
                 }
 
@@ -247,6 +252,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                         null,
                         Settings.MenuTag.SECTION_ROOT
                     )
+                    binding.inGameMenu.requestFocus()
                     binding.root.findNavController().navigate(action)
                     true
                 }
@@ -256,6 +262,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                         args.game,
                         Settings.MenuTag.SECTION_ROOT
                     )
+                    binding.inGameMenu.requestFocus()
                     binding.root.findNavController().navigate(action)
                     true
                 }
@@ -287,6 +294,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                             )
                         }
                     }
+                    binding.inGameMenu.requestFocus()
                     NativeConfig.saveGlobalConfig()
                     true
                 }
@@ -295,7 +303,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                     emulationState.stop()
                     emulationViewModel.setIsEmulationStopping(true)
                     binding.drawerLayout.close()
-                    binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
+                    binding.inGameMenu.requestFocus()
                     true
                 }
 
@@ -312,12 +320,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                     if (!NativeLibrary.isRunning()) {
                         return
                     }
-
-                    if (binding.drawerLayout.isOpen) {
-                        binding.drawerLayout.close()
-                    } else {
-                        binding.drawerLayout.open()
-                    }
+                    emulationViewModel.setDrawerOpen(!binding.drawerLayout.isOpen)
                 }
             }
         )
@@ -408,6 +411,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
                     }
                 }
             }
+            launch {
+                repeatOnLifecycle(Lifecycle.State.CREATED) {
+                    emulationViewModel.drawerOpen.collect {
+                        if (it) {
+                            binding.drawerLayout.open()
+                            binding.inGameMenu.requestFocus()
+                        } else {
+                            binding.drawerLayout.close()
+                        }
+                    }
+                }
+            }
         }
     }
 

+ 8 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt

@@ -6,6 +6,7 @@ package org.yuzu.yuzu_emu.model
 import androidx.lifecycle.ViewModel
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
 
 class EmulationViewModel : ViewModel() {
     val emulationStarted: StateFlow<Boolean> get() = _emulationStarted
@@ -23,6 +24,9 @@ class EmulationViewModel : ViewModel() {
     val shaderMessage: StateFlow<String> get() = _shaderMessage
     private val _shaderMessage = MutableStateFlow("")
 
+    private val _drawerOpen = MutableStateFlow(false)
+    val drawerOpen = _drawerOpen.asStateFlow()
+
     fun setEmulationStarted(started: Boolean) {
         _emulationStarted.value = started
     }
@@ -49,6 +53,10 @@ class EmulationViewModel : ViewModel() {
         setTotalShaders(max)
     }
 
+    fun setDrawerOpen(value: Boolean) {
+        _drawerOpen.value = value
+    }
+
     fun clear() {
         setEmulationStarted(false)
         setIsEmulationStopping(false)

+ 1 - 0
src/android/app/src/main/res/layout/fragment_emulation.xml

@@ -160,6 +160,7 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_gravity="start"
+        android:focusedByDefault="true"
         app:headerLayout="@layout/header_in_game"
         app:menu="@menu/menu_in_game"
         tools:visibility="gone" />