diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index f23147dd8..da3a0c5f1 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -10,6 +10,7 @@ import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.view.InputDevice import android.view.KeyEvent @@ -47,6 +48,7 @@ import org.citra.citra_emu.utils.FileBrowserHelper import org.citra.citra_emu.utils.EmulationLifecycleUtil import org.citra.citra_emu.utils.EmulationMenuSettings import org.citra.citra_emu.utils.Log +import org.citra.citra_emu.utils.MaxRefreshRate import org.citra.citra_emu.utils.ThemeUtil import org.citra.citra_emu.viewmodel.EmulationViewModel @@ -84,6 +86,10 @@ class EmulationActivity : AppCompatActivity() { ThemeUtil.setTheme(this) settingsViewModel.settings.loadSettings() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + MaxRefreshRate.set(this, forceSixtyHrz = true) + } + super.onCreate(savedInstanceState) secondaryDisplay = SecondaryDisplay(this) secondaryDisplay.updateDisplay() diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt index 1ae915e5a..e954f8e9e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt @@ -58,7 +58,7 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView { binding = ActivitySettingsBinding.inflate(layoutInflater) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - MaxRefreshRate.set(this) + MaxRefreshRate.set(this, forceSixtyHrz = false) } setContentView(binding.root) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt index 471a78cfa..408e22187 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt @@ -90,7 +90,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { binding = ActivityMainBinding.inflate(layoutInflater) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - MaxRefreshRate.set(this) + MaxRefreshRate.set(this, forceSixtyHrz = false) } setContentView(binding.root) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/SetMaxRefreshRate.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/SetMaxRefreshRate.kt index 49a7ff15d..ea2e0fd03 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/SetMaxRefreshRate.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/SetMaxRefreshRate.kt @@ -8,18 +8,30 @@ import android.os.Build import androidx.annotation.RequiresApi object MaxRefreshRate { + //Since Android 15, google automatically forces "games" to be 60 hrz. + // This functions sets the refresh rate to max supported rate, unless forced to 60 hrz. @RequiresApi(Build.VERSION_CODES.R) - fun set(activity: Activity) { + fun set(activity: Activity, forceSixtyHrz: Boolean) { val display = activity.display val window = activity.window display?.let { + // Get all supported modes and find the one with the highest refresh rate val supportedModes = it.supportedModes val maxRefreshRate = supportedModes.maxByOrNull { mode -> mode.refreshRate } if (maxRefreshRate != null) { val layoutParams = window.attributes - layoutParams.preferredDisplayModeId = maxRefreshRate.modeId - window.attributes = layoutParams + val modeId = if (forceSixtyHrz) { + supportedModes.firstOrNull { mode -> mode.refreshRate == 60f }?.modeId + } else { + // Set the preferred display mode to the one with the highest refresh rate + maxRefreshRate.modeId + } + + if (modeId != null) { + layoutParams.preferredDisplayModeId = modeId + window.attributes = layoutParams + } } } }