From 9440d5eb8d08490674ce6956c0de8042857cdd7d Mon Sep 17 00:00:00 2001 From: Abandoned Cart Date: Sun, 4 Jun 2023 10:24:18 -0400 Subject: [PATCH] android: Add settings for variable orientation --- .../yuzu_emu/activities/EmulationActivity.kt | 2 +- .../features/settings/model/Settings.kt | 2 +- .../yuzu_emu/fragments/EmulationFragment.kt | 77 ++++++++++++++++++- .../yuzu_emu/utils/EmulationMenuSettings.kt | 6 +- .../main/res/menu/menu_overlay_options.xml | 20 +++++ .../app/src/main/res/values/strings.xml | 4 + 6 files changed, 105 insertions(+), 6 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 901a3978d8..541dec6a1c 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 @@ -144,7 +144,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { startMotionSensorListener() NativeLibrary.notifyOrientationChange( - EmulationMenuSettings.landscapeScreenLayout, + EmulationMenuSettings.screenLayout, getAdjustedRotation() ) } 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 23c31e13ab..0beaa26e7e 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 @@ -132,7 +132,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_SCREEN_LAYOUT = "EmulationMenuSettings_ScreenLayout" const val PREF_MENU_SETTINGS_SHOW_FPS = "EmulationMenuSettings_ShowFps" 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 1a9843fcc0..af83cd6e5b 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 @@ -9,8 +9,10 @@ import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.content.pm.ActivityInfo +import android.content.res.Configuration import android.content.res.Resources import android.graphics.Color +import android.hardware.display.DisplayManager import android.os.Bundle import android.os.Handler import android.os.Looper @@ -19,6 +21,7 @@ import android.view.* import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.appcompat.widget.PopupMenu +import androidx.core.content.getSystemService import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.Insets import androidx.core.view.ViewCompat @@ -178,6 +181,35 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { super.onDetach() } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + + var emulatorLayout = 5 + when (newConfig.orientation) { + Configuration.ORIENTATION_LANDSCAPE -> { emulatorLayout = 5 } + Configuration.ORIENTATION_PORTRAIT -> { emulatorLayout = 4 } + Configuration.ORIENTATION_UNDEFINED -> { emulatorLayout = 5 } + else -> {} + } + + emulationActivity?.let { + var rotation = it.getSystemService()!! + .getDisplay(Display.DEFAULT_DISPLAY).rotation + if ((newConfig.screenLayout and Configuration.SCREENLAYOUT_LONG_YES) == 0 || + (newConfig.screenLayout and Configuration.SCREENLAYOUT_LONG_NO) != 0 + ) { + rotation = when (rotation) { + Surface.ROTATION_0 -> Surface.ROTATION_90 + Surface.ROTATION_90 -> Surface.ROTATION_0 + Surface.ROTATION_180 -> Surface.ROTATION_270 + Surface.ROTATION_270 -> Surface.ROTATION_180 + else -> { rotation } + } + } + NativeLibrary.notifyOrientationChange(emulatorLayout, rotation) + } + } + private fun refreshInputOverlay() { binding.surfaceInputOverlay.refreshControls() } @@ -217,6 +249,18 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + @SuppressLint("SourceLockedOrientationActivity") + private fun updateScreenLayout() { + emulationActivity?.let { + when (EmulationMenuSettings.screenLayout) { + 5 -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE } + 4 -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT } + 0 -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED } + else -> { it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE } + } + } + } + private val Number.toPx get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() fun updateCurrentLayout(emulationActivity: EmulationActivity, newLayoutInfo: WindowLayoutInfo) { @@ -237,7 +281,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { binding.inGameMenu.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT binding.overlayContainer.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT binding.overlayContainer.updatePadding(0, 0, 0, 0) - emulationActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + updateScreenLayout() } binding.surfaceInputOverlay.requestLayout() binding.inGameMenu.requestLayout() @@ -266,6 +310,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { popup.menu.apply { findItem(R.id.menu_toggle_fps).isChecked = EmulationMenuSettings.showFps + findItem(R.id.menu_screen_layout).subMenu?.let { subMenu -> + when (EmulationMenuSettings.screenLayout) { + 5 -> { subMenu.findItem(R.id.menu_screen_layout_landscape).isChecked = true } + 4 -> { subMenu.findItem(R.id.menu_screen_layout_portrait).isChecked = true } + 0 -> { subMenu.findItem(R.id.menu_screen_layout_auto).isChecked = true } + else -> { subMenu.findItem(R.id.menu_screen_layout_landscape).isChecked = true } + } + } 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 @@ -281,6 +333,29 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { true } + R.id.menu_screen_layout_landscape -> { + EmulationMenuSettings.screenLayout = 5 + updateScreenLayout() + false + } + + R.id.menu_screen_layout_portrait -> { + EmulationMenuSettings.screenLayout = 4 + updateScreenLayout() + false + } + + R.id.menu_screen_layout_auto -> { + EmulationMenuSettings.screenLayout = 0 + updateScreenLayout() + false + } + + R.id.menu_screen_layout -> { + it.subMenu?.setGroupCheckable(R.id.menu_screen_layout_group, true, true) + true + } + R.id.menu_edit_overlay -> { binding.drawerLayout.close() binding.surfaceInputOverlay.requestFocus() 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 e1e7a59d7c..dfb184cee4 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 @@ -41,14 +41,14 @@ object EmulationMenuSettings { .apply() } - var landscapeScreenLayout: Int + var screenLayout: Int get() = preferences.getInt( - Settings.PREF_MENU_SETTINGS_LANDSCAPE, + Settings.PREF_MENU_SETTINGS_SCREEN_LAYOUT, LayoutOption_MobileLandscape ) set(value) { preferences.edit() - .putInt(Settings.PREF_MENU_SETTINGS_LANDSCAPE, value) + .putInt(Settings.PREF_MENU_SETTINGS_SCREEN_LAYOUT, value) .apply() } var showFps: Boolean 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 4885b4f6fb..aaddd71b2f 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 @@ -6,6 +6,26 @@ android:title="@string/emulation_fps_counter" android:checkable="true" /> + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index fc24e27f5c..3eac2a9625 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -209,6 +209,10 @@ Exit Emulation Done FPS Counter + Orientation + Landscape + Portrait + Auto Toggle Controls Relative Stick Center DPad Slide