From 478c6e99a80c9aa7bf9e61a76ad6c8763b4aaa5b Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:18:25 +0200 Subject: [PATCH 1/2] android: Add screen orientation presets to layout settings (#420) Co-authored-by: OpenSauce04 --- .../mandarine/activities/EmulationActivity.kt | 11 +++++++- .../mandarine/display/ScreenAdjustmentUtil.kt | 24 ++++++++++++---- .../features/settings/model/IntSetting.kt | 1 + .../settings/ui/SettingsFragmentPresenter.kt | 11 ++++++++ .../mandarine/fragments/EmulationFragment.kt | 3 +- src/android/app/src/main/jni/default_ini.h | 8 ++++++ .../app/src/main/res/values/arrays.xml | 28 +++++++++++++++++++ .../app/src/main/res/values/strings.xml | 8 ++++++ 8 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/activities/EmulationActivity.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/activities/EmulationActivity.kt index fb74a5542..e2d90b8cb 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/activities/EmulationActivity.kt @@ -47,6 +47,7 @@ import io.github.mandarine3ds.mandarine.utils.ThemeUtil import io.github.mandarine3ds.mandarine.viewmodel.EmulationViewModel import io.github.mandarine3ds.mandarine.utils.NetPlayManager import io.github.mandarine3ds.mandarine.dialogs.NetPlayDialog +import io.github.mandarine3ds.mandarine.features.settings.model.IntSetting class EmulationActivity : AppCompatActivity() { private val preferences: SharedPreferences @@ -79,7 +80,7 @@ class EmulationActivity : AppCompatActivity() { NativeLibrary.enableAdrenoTurboMode(BooleanSetting.ADRENO_GPU_BOOST.boolean) binding = ActivityEmulationBinding.inflate(layoutInflater) - screenAdjustmentUtil = ScreenAdjustmentUtil(windowManager, settingsViewModel.settings) + screenAdjustmentUtil = ScreenAdjustmentUtil(this, windowManager, settingsViewModel.settings) hotkeyUtility = HotkeyUtility(screenAdjustmentUtil, this) setContentView(binding.root) @@ -113,6 +114,8 @@ class EmulationActivity : AppCompatActivity() { isEmulationRunning = true instance = this + + applyOrientationSettings() // Check for orientation settings at startup } // On some devices, the system bars will not disappear on first boot or after some @@ -121,6 +124,7 @@ class EmulationActivity : AppCompatActivity() { override fun onResume() { super.onResume() enableFullscreenImmersive() + applyOrientationSettings() // Check for orientation settings changes on runtime } override fun onWindowFocusChanged(hasFocus: Boolean) { @@ -230,6 +234,11 @@ class EmulationActivity : AppCompatActivity() { } } + private fun applyOrientationSettings() { + val orientationOption = IntSetting.ORIENTATION_OPTION.int + screenAdjustmentUtil.changeActivityOrientation(orientationOption) + } + // Gets button presses @Suppress("DEPRECATION") @SuppressLint("GestureBackNavigation") diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt index c9783dd30..550278ae0 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt @@ -11,9 +11,16 @@ import io.github.mandarine3ds.mandarine.features.settings.model.IntSetting import io.github.mandarine3ds.mandarine.features.settings.model.Settings import io.github.mandarine3ds.mandarine.features.settings.utils.SettingsFile import io.github.mandarine3ds.mandarine.utils.EmulationMenuSettings +import android.content.Context +import android.content.pm.ActivityInfo +import android.app.Activity +import io.github.mandarine3ds.mandarine.R -class ScreenAdjustmentUtil(private val windowManager: WindowManager, - private val settings: Settings) { +class ScreenAdjustmentUtil( + private val context: Context, + private val windowManager: WindowManager, + private val settings: Settings, +) { fun swapScreen() { val isEnabled = !EmulationMenuSettings.swapScreens EmulationMenuSettings.swapScreens = isEnabled @@ -26,9 +33,9 @@ class ScreenAdjustmentUtil(private val windowManager: WindowManager, } fun cycleLayouts() { - // TODO: figure out how to pull these from R.array - val landscapeValues = intArrayOf(2, 1, 3, 4, 0, 5) - val portraitValues = intArrayOf(0, 1) + val landscapeValues = context.resources.getIntArray(R.array.landscapeValues) + val portraitValues = context.resources.getIntArray(R.array.portraitValues) + if (NativeLibrary.isPortraitMode) { val currentLayout = IntSetting.PORTRAIT_SCREEN_LAYOUT.int val pos = portraitValues.indexOf(currentLayout) @@ -55,4 +62,11 @@ class ScreenAdjustmentUtil(private val windowManager: WindowManager, NativeLibrary.reloadSettings() NativeLibrary.updateFramebuffer(NativeLibrary.isPortraitMode) } + + fun changeActivityOrientation(orientationOption: Int) { + val activity = context as? Activity ?: return + IntSetting.ORIENTATION_OPTION.int = orientationOption + settings.saveSetting(IntSetting.ORIENTATION_OPTION, SettingsFile.FILE_NAME_CONFIG) + activity.requestedOrientation = orientationOption + } } diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt index 182048f82..55aeb434f 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt @@ -69,6 +69,7 @@ enum class IntSetting( FORCE_HW_VERTEX_SHADERS("force_hw_vertex_shaders", Settings.SECTION_RENDERER, 0), DISABLE_SURFACE_TEXTURE_COPY("disable_surface_texture_copy", Settings.SECTION_RENDERER, 0), DISABLE_FLUSH_CPU_WRITE("disable_flush_cpu_write", Settings.SECTION_RENDERER, 0), + ORIENTATION_OPTION("screen_orientation", Settings.SECTION_LAYOUT, 2), USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, 0); override var int: Int = defaultValue diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt index b9fd69bbe..b944d13aa 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt @@ -998,6 +998,17 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) private fun addLayoutSettings(sl: ArrayList) { settingsActivity.setToolbarTitle(settingsActivity.getString(R.string.preferences_layout)) sl.apply { + add( + SingleChoiceSetting( + IntSetting.ORIENTATION_OPTION, + R.string.layout_screen_orientation, + 0, + R.array.screenOrientations, + R.array.screenOrientationValues, + IntSetting.ORIENTATION_OPTION.key, + IntSetting.ORIENTATION_OPTION.defaultValue + ) + ) add( SingleChoiceSetting( IntSetting.SCREEN_LAYOUT, diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/fragments/EmulationFragment.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/fragments/EmulationFragment.kt index 325126fdb..b308992dc 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/fragments/EmulationFragment.kt @@ -147,8 +147,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram retainInstance = true emulationState = EmulationState(game.path) emulationActivity = requireActivity() as EmulationActivity - screenAdjustmentUtil = - ScreenAdjustmentUtil(emulationActivity.windowManager, settingsViewModel.settings) + screenAdjustmentUtil = ScreenAdjustmentUtil(requireContext(), requireActivity().windowManager, settingsViewModel.settings) EmulationLifecycleUtil.addShutdownHook(hook = { emulationState.stop() }) EmulationLifecycleUtil.addPauseResumeHook(hook = { togglePause() }) } diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index a03f8808b..4e8f18189 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -239,6 +239,14 @@ custom_bottom_y = custom_bottom_width = custom_bottom_height = +# Orientation option for the emulator +# 2 (default): Automatic +# 0: Landscape +# 8: Landscape (Flipped) +# 1: Portrait +# 9: Portrait (Flipped) +screen_orientation = + # Layout for the portrait mode # 0 (default): Top and bottom screens at top, full width # 1: Custom Layout diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 2c6b2df3e..d9d9ea9af 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -548,4 +548,32 @@ 12 + + 2 + 1 + 3 + 4 + 0 + 5 + + + 0 + 1 + + + + @string/layout_screen_orientation_auto_sensor + @string/layout_screen_orientation_landscape + @string/layout_screen_orientation_landscape_reverse + @string/layout_screen_orientation_portrait + @string/layout_screen_orientation_portrait_reverse + + + 2 + 0 + 8 + 1 + 9 + + diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 1cb2cfe11..3de704a6b 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -308,6 +308,14 @@ Audio Input Device Sound Output Mode + + Screen Orientation + Automatic + Landscape + Reverse Landscape + Portrait + Reverse Portrait + Clear Default From 4d245d2071dbd5c2f5c397c106651b6391bdd3cb Mon Sep 17 00:00:00 2001 From: Kleidis <167202775+kleidis@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:14:17 +0100 Subject: [PATCH 2/2] License headers --- .../mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt | 2 +- .../mandarine/features/settings/model/IntSetting.kt | 2 +- .../mandarine/features/settings/ui/SettingsFragmentPresenter.kt | 2 +- src/android/app/src/main/jni/default_ini.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt index 550278ae0..80da34719 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/display/ScreenAdjustmentUtil.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright 2025 Citra Project / Mandarine Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt index 55aeb434f..a12ae4658 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/model/IntSetting.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright 2025 Citra Project / Mandarine Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. diff --git a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt index b944d13aa..e6411298b 100644 --- a/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/io/github/mandarine3ds/mandarine/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright 2025 Citra Project / Mandarine Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 4e8f18189..92ce12e0a 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright 2025 Citra Project / Mandarine Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included.