From 11041e950d5296d072fd951b3224c1d9e940e6d0 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 14 Mar 2023 21:13:13 +0100 Subject: [PATCH 1/4] Android: Combine reading cutout setting with updateOrientation --- .../activities/EmulationActivity.kt | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt index 47921ce401..66009e7d29 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt @@ -109,8 +109,6 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider { settings = Settings() settings.loadSettings() - updateOrientation() - // Set these options now so that the SurfaceView the game renders into is the right size. enableFullscreenImmersive() @@ -203,21 +201,7 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider { super.onResume() - // Only android 9+ support this feature. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - val attributes = window.attributes - - attributes.layoutInDisplayCutoutMode = - if (BooleanSetting.MAIN_EXPAND_TO_CUTOUT_AREA.boolean) { - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES - } else { - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER - } - - window.attributes = attributes - } - - updateOrientation() + updateDisplaySettings() DolphinSensorEventListener.setDeviceRotation(windowManager.defaultDisplay.rotation) } @@ -338,7 +322,20 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider { View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY } - private fun updateOrientation() { + private fun updateDisplaySettings() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val attributes = window.attributes + + attributes.layoutInDisplayCutoutMode = + if (BooleanSetting.MAIN_EXPAND_TO_CUTOUT_AREA.boolean) { + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES + } else { + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER + } + + window.attributes = attributes + } + requestedOrientation = IntSetting.MAIN_EMULATION_ORIENTATION.int } From 5aa80603d75e4a7e878540865ffb2e2f8f983148 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 14 Mar 2023 21:17:52 +0100 Subject: [PATCH 2/4] Android: Reload EmulationActivity settings on title change This way, we ensure that game INI settings are properly applied. I don't think we actually expose the affected settings on a per-game basis in the UI, but still. --- .../org/dolphinemu/dolphinemu/activities/EmulationActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt index 66009e7d29..4b363ce008 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt @@ -222,6 +222,8 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider { title = NativeLibrary.GetCurrentTitleDescription() emulationFragment?.refreshInputOverlay() + + updateDisplaySettings() } catch (_: IllegalStateException) { // Most likely the core delivered an onTitleChanged while emulation was shutting down. // Let's just ignore it, since we're about to shut down anyway. From a31214b8c65dba36c2a2edff27efddc82011737f Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 14 Mar 2023 21:41:27 +0100 Subject: [PATCH 3/4] Android: Fix EmulationActivity's handling of process recreation --- .../dolphinemu/activities/EmulationActivity.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt index 4b363ce008..4735b506dd 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.kt @@ -56,6 +56,7 @@ import org.dolphinemu.dolphinemu.overlay.InputOverlayPointer import org.dolphinemu.dolphinemu.ui.main.MainPresenter import org.dolphinemu.dolphinemu.ui.main.ThemeProvider import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner +import org.dolphinemu.dolphinemu.utils.DirectoryInitialization import org.dolphinemu.dolphinemu.utils.FileBrowserHelper import org.dolphinemu.dolphinemu.utils.ThemeHelper import kotlin.math.roundToInt @@ -201,7 +202,19 @@ class EmulationActivity : AppCompatActivity(), ThemeProvider { super.onResume() - updateDisplaySettings() + // If the whole app process was recreated, directory initialization might not be done yet. + // If that's the case, we can't read settings, so skip reading the settings for now and do + // it once onTitleChanged runs instead. + if (DirectoryInitialization.areDolphinDirectoriesReady()) { + updateDisplaySettings(); + } else { + // If the process was recreated and DolphinApplication.onStart didn't think it should + // start directory initialization, we have to start it, otherwise emulation will never + // start. Technically it would be nicer to ask the user for write permission first, + // but because this problem can only happen in very convoluted situations, this code is + // going to get essentially no testing, so let's go with the simplest possible fix. + DirectoryInitialization.start(this); + } DolphinSensorEventListener.setDeviceRotation(windowManager.defaultDisplay.rotation) } From a4eff2acc1107d8bf07e9cbc0dc8227952d8b02d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 8 Dec 2023 19:30:05 +0100 Subject: [PATCH 4/4] Android: Don't call Run before directory initialization Combined with the previous commits, this finally fixes the bug where Dolphin had a chance of crashing if you returned to it after Android killed the Dolphin process. --- .../org/dolphinemu/dolphinemu/fragments/EmulationFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.kt index e403e7ef5d..637f4fb924 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/EmulationFragment.kt @@ -16,6 +16,7 @@ import org.dolphinemu.dolphinemu.databinding.FragmentEmulationBinding import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting import org.dolphinemu.dolphinemu.features.settings.model.Settings import org.dolphinemu.dolphinemu.overlay.InputOverlay +import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner import org.dolphinemu.dolphinemu.utils.Log import java.io.File @@ -100,7 +101,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (NativeLibrary.IsGameMetadataValid()) inputOverlay?.refreshControls() - run(emulationActivity!!.isActivityRecreated) + AfterDirectoryInitializationRunner().runWithLifecycle(this) { + run(emulationActivity!!.isActivityRecreated) + } } override fun onPause() {