[android]: Force app to use the displays max set refresh rate

Since Android 15, google automatically forces "games" to be 60 hrz. This ensures the display's max refresh rate is actually used. Tested on a Google Pixel 7 Pro with Android 16

Emulation Activity was excluded for battery usage concerns
This commit is contained in:
Kleidis 2025-12-01 16:27:38 +01:00 committed by OpenSauce
parent b0fe4d190d
commit 5537f6c60a
3 changed files with 40 additions and 0 deletions

View File

@ -7,6 +7,7 @@ package org.citra.citra_emu.features.settings.ui
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
@ -37,6 +38,7 @@ import org.citra.citra_emu.features.settings.utils.SettingsFile
import org.citra.citra_emu.utils.SystemSaveGame
import org.citra.citra_emu.utils.DirectoryInitialization
import org.citra.citra_emu.utils.InsetsHelper
import org.citra.citra_emu.utils.MaxRefreshRate
import org.citra.citra_emu.utils.ThemeUtil
class SettingsActivity : AppCompatActivity(), SettingsActivityView {
@ -54,6 +56,11 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
MaxRefreshRate.set(this)
}
setContentView(binding.root)
WindowCompat.setDecorFitsSystemWindows(window, false)

View File

@ -6,6 +6,7 @@ package org.citra.citra_emu.ui.main
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
@ -51,6 +52,7 @@ import org.citra.citra_emu.utils.CitraDirectoryUtils
import org.citra.citra_emu.utils.DirectoryInitialization
import org.citra.citra_emu.utils.FileBrowserHelper
import org.citra.citra_emu.utils.InsetsHelper
import org.citra.citra_emu.utils.MaxRefreshRate
import org.citra.citra_emu.utils.PermissionsHandler
import org.citra.citra_emu.utils.ThemeUtil
import org.citra.citra_emu.viewmodel.GamesViewModel
@ -86,6 +88,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
MaxRefreshRate.set(this)
}
setContentView(binding.root)
WindowCompat.setDecorFitsSystemWindows(window, false)

View File

@ -0,0 +1,26 @@
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
package org.citra.citra_emu.utils
import android.app.Activity
import android.os.Build
import androidx.annotation.RequiresApi
object MaxRefreshRate {
@RequiresApi(Build.VERSION_CODES.R)
fun set(activity: Activity) {
val display = activity.display
val window = activity.window
display?.let {
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
}
}
}
}