diff --git a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt index eab2ea02b..9488cf62f 100644 --- a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt @@ -306,6 +306,11 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { private var achievementsInFront by mutableStateOf(null) private var achievementsOpen by mutableStateOf(false) private var hudOn by mutableStateOf(true) + private var hudFps by mutableStateOf(true) + private var hudBattery by mutableStateOf(true) + private var hudGraph by mutableStateOf(true) + private var hudColor by mutableStateOf(SessionPrefs.HUD_COLOR_MINT) + private var hudOpacity by mutableStateOf(SessionPrefs.HUD_OPACITY_DEFAULT) private var upscaler by mutableStateOf(0) private var upscaleSharpness by mutableStateOf(75) private var effects by mutableStateOf(ScreenEffects.OFF) @@ -638,7 +643,7 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { com.droiddeck.launcher.ui.FocusGlideHost(androidx.compose.ui.Modifier.fillMaxSize()) { CursorOverlay({ cursorPos }, cursorVisible, resources.displayMetrics.density, cursorImage, cursorHotX, cursorHotY, cursorImageScale) - if (hud.text.isNotEmpty()) HudText(hud.text) + if (hud.text.isNotEmpty() || hud.graph.size >= 2) HudText(hud.text, hud.graph, hudColor, hudOpacity) if (glassesOutputActive && !loading.visible) com.droiddeck.launcher.ui.GlassesPlayingHint(glasses.model) if (trackingRecovery != null && !drawerOpen && !pcKeyboardOpen && !loading.visible) { androidx.compose.ui.viewinterop.AndroidView( @@ -752,6 +757,11 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { isHomeApp = isHomeApp, androidApps = androidApps, hudOn = hudOn, + hudFps = hudFps, + hudBattery = hudBattery, + hudGraph = hudGraph, + hudColor = hudColor, + hudOpacity = hudOpacity, upscaler = upscaler, upscaleSharpness = upscaleSharpness, effects = effects, cardboard = cardboard, @@ -779,6 +789,11 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { secondScreenDisplays = secondScreenDisplays, selectedSecondScreenDisplay = selectedSecondScreenDisplay, onHud = { on -> SessionPrefs.setHudEnabled(this@SessionActivity, on); hudOn = on; hud.refresh() }, + onHudFps = { on -> SessionPrefs.setHudShowFps(this@SessionActivity, on); hudFps = on; hud.refresh() }, + onHudBattery = { on -> SessionPrefs.setHudShowBattery(this@SessionActivity, on); hudBattery = on; hud.refresh() }, + onHudGraph = { on -> SessionPrefs.setHudShowGraph(this@SessionActivity, on); hudGraph = on; hud.refresh() }, + onHudColor = { color -> SessionPrefs.setHudColor(this@SessionActivity, color); hudColor = color }, + onHudOpacity = { percent -> SessionPrefs.setHudOpacity(this@SessionActivity, percent); hudOpacity = percent }, onUpscaler = { m -> SessionPrefs.setUpscaler(this@SessionActivity, m); upscaler = m WaylandCompositor.nativeSetUpscaler(m) @@ -1343,6 +1358,11 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { unfoldedControls = SessionPrefs.unfoldedControls(this) picturePosition = SessionPrefs.picturePosition(this) hudOn = SessionPrefs.hudEnabled(this) + hudFps = SessionPrefs.hudShowFps(this) + hudBattery = SessionPrefs.hudShowBattery(this) + hudGraph = SessionPrefs.hudShowGraph(this) + hudColor = SessionPrefs.hudColor(this) + hudOpacity = SessionPrefs.hudOpacity(this) upscaler = SessionPrefs.upscaler(this) upscaleSharpness = SessionPrefs.upscaleSharpness(this) effects = SessionPrefs.screenEffects(this) diff --git a/app/src/main/java/com/droiddeck/launcher/session/PerfHud.kt b/app/src/main/java/com/droiddeck/launcher/session/PerfHud.kt index 55ab3f7fa..3829d9a25 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/PerfHud.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/PerfHud.kt @@ -1,6 +1,9 @@ package com.droiddeck.launcher.session import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.BatteryManager import android.os.Environment import android.os.Handler import android.os.Looper @@ -15,21 +18,35 @@ import com.droiddeck.launcher.wayland.WaylandCompositor import java.io.File import java.util.Locale import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicLong class PerfHud(context: Context) { var text by mutableStateOf("") private set + var graph by mutableStateOf(FloatArray(0)) + private set private val context = context.applicationContext private val frames = AtomicInteger() private var lastTick = 0L + private var lastFps = 0f private var running = false private val handler = Handler(Looper.getMainLooper()) + private val intervals = FloatArray(GRAPH) + private val graphWrite = AtomicInteger() + private val lastFrameNs = AtomicLong() + + @Volatile private var showFps = true + @Volatile private var showBattery = true + @Volatile private var showGraph = true private val enabled: Boolean get() = SessionPrefs.hudEnabled(context) && !File(Environment.getExternalStorageDirectory(), "Download/droiddeck-no-hud").exists() + private val anyPart: Boolean + get() = showFps || showBattery || showGraph + var onPresentingWindowChanged: (() -> Unit)? = null private var lastWindow: String? = null @@ -40,7 +57,17 @@ class PerfHud(context: Context) { handler.post { onPresentingWindowChanged?.invoke() } } } - override fun onGameFrame() { frames.incrementAndGet() } + override fun onGameFrame() { + frames.incrementAndGet() + if (!showGraph) return + val now = System.nanoTime() + val previous = lastFrameNs.getAndSet(now) + if (previous == 0L) return + val ms = ((now - previous) / 1_000_000f).coerceIn(0f, 50f) + val slot = graphWrite.get() + intervals[slot and (GRAPH - 1)] = ms + graphWrite.compareAndSet(slot, slot + 1) + } } private val tick = object : Runnable { @@ -49,28 +76,82 @@ class PerfHud(context: Context) { val now = SystemClock.elapsedRealtime() val dt = (now - lastTick).coerceAtLeast(1L) / 1000f lastTick = now - text = line(frames.getAndSet(0) / dt) - handler.postDelayed(this, 1000) + lastFps = frames.getAndSet(0) / dt + text = readout(lastFps) + if (showGraph) publishGraph() else clearGraph() + handler.postDelayed(this, TICK_MS) } } fun refresh() { - if (enabled) start() else stop() + readOptions() + if (!enabled || !anyPart) { + stop() + return + } + if (!running) start() else { + if (!showGraph) clearGraph() else publishGraph() + text = readout(lastFps) + } } fun start() { - if (!enabled || running) return + readOptions() + if (!enabled || !anyPart || running) return running = true lastTick = SystemClock.elapsedRealtime() + lastFrameNs.set(0L) frames.set(0) + graphWrite.set(0) WaylandCompositor.setGameListener(listener) - handler.post(tick) + handler.postDelayed(tick, TICK_MS) } fun stop() { running = false + handler.removeCallbacks(tick) WaylandCompositor.clearGameListener(listener) text = "" + graph = FloatArray(0) + } + + private fun readOptions() { + showFps = SessionPrefs.hudShowFps(context) + showBattery = SessionPrefs.hudShowBattery(context) + showGraph = SessionPrefs.hudShowGraph(context) + } + + private fun readout(fpsValue: Float): String { + val parts = ArrayList(2) + if (showFps) parts.add(line(fpsValue)) + if (showBattery) batteryCelsius(readBatteryDeci())?.let { parts.add(it) } + return parts.joinToString("\n") + } + + private fun readBatteryDeci(): Int { + val sticky = runCatching { + context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) + }.getOrNull() ?: return 0 + return sticky.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) + } + + private fun clearGraph() { + lastFrameNs.set(0L) + graphWrite.set(0) + if (graph.isNotEmpty()) graph = FloatArray(0) + } + + private fun publishGraph() { + val count = graphWrite.get() + val shown = minOf(count, GRAPH) + if (shown < 2) { + graph = FloatArray(0) + return + } + val out = FloatArray(shown) + val start = count - shown + for (i in 0 until shown) out[i] = intervals[(start + i) and (GRAPH - 1)] + graph = out } private fun line(base: Float): String { @@ -91,4 +172,12 @@ class PerfHud(context: Context) { } private fun fps(value: Float) = String.format(Locale.US, "%.0f fps", value) + + companion object { + private const val TICK_MS = 1_000L + private const val GRAPH = 128 + + internal fun batteryCelsius(deci: Int): String? = + if (deci <= 0) null else String.format(Locale.US, "%.1f°C", deci / 10f) + } } diff --git a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt index e7b810c23..54d81f27b 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SessionPrefs.kt @@ -157,6 +157,43 @@ object SessionPrefs { prefs(context).edit().putBoolean(hudKey(context), on).apply() } + fun hudShowFps(context: Context): Boolean = prefs(context).getBoolean("hudFps", true) + + fun setHudShowFps(context: Context, on: Boolean) { + prefs(context).edit().putBoolean("hudFps", on).apply() + } + + fun hudShowBattery(context: Context): Boolean = prefs(context).getBoolean("hudBattery", true) + + fun setHudShowBattery(context: Context, on: Boolean) { + prefs(context).edit().putBoolean("hudBattery", on).apply() + } + + fun hudShowGraph(context: Context): Boolean = prefs(context).getBoolean("hudGraph", true) + + fun setHudShowGraph(context: Context, on: Boolean) { + prefs(context).edit().putBoolean("hudGraph", on).apply() + } + + fun hudColor(context: Context): String = + prefs(context).getString("hudColor", HUD_COLOR_MINT)?.takeIf { it in HUD_COLORS } ?: HUD_COLOR_MINT + + fun setHudColor(context: Context, color: String) { + if (color in HUD_COLORS) prefs(context).edit().putString("hudColor", color).apply() + } + + fun hudOpacity(context: Context): Int = + prefs(context).getInt("hudOpacity", HUD_OPACITY_DEFAULT).takeIf { it in HUD_OPACITY_RANGE } ?: HUD_OPACITY_DEFAULT + + fun setHudOpacity(context: Context, percent: Int) { + prefs(context).edit().putInt("hudOpacity", percent.coerceIn(HUD_OPACITY_RANGE)).apply() + } + + const val HUD_COLOR_MINT = "mint" + val HUD_COLORS = listOf(HUD_COLOR_MINT, "white", "sky", "amber", "violet") + val HUD_OPACITY_RANGE = 30..100 + const val HUD_OPACITY_DEFAULT = 70 + private fun hudKey(context: Context) = if (mangoappSession(context)) "hudDeck" else "hud" private fun mangoappSession(context: Context) = diff --git a/app/src/main/java/com/droiddeck/launcher/session/SettingsReset.kt b/app/src/main/java/com/droiddeck/launcher/session/SettingsReset.kt index 78bbc89cd..221eb6b69 100644 --- a/app/src/main/java/com/droiddeck/launcher/session/SettingsReset.kt +++ b/app/src/main/java/com/droiddeck/launcher/session/SettingsReset.kt @@ -13,7 +13,7 @@ object SettingsReset { internal val SESSION_KEYS = setOf( "orientation", "launcherFullscreen", "animations", "theme", "runSteamAtStartup", "addedGamesArt", "gameStoresEnabled", "gameStoresSpeedTier", "gameStoresParallel", "storesOpenTab", "storesShowMature", - "hud", "hudDeck", "backActionsInverted", "touch", "osc", "shape", "steamController", + "hud", "hudDeck", "hudFps", "hudBattery", "hudGraph", "hudColor", "hudOpacity", "backActionsInverted", "touch", "osc", "shape", "steamController", "gamepadLeft", "gamepadRight", "pipAutoEnter", "unfoldedControls", "stretch16x9", "picturePosition", "gpuDriverMode", "androidDriver", "linuxDriver", "linuxDriver.steam", "linuxDriver.desktop", "tuSysmem", "glThread", "noGlError", "zinkLazy", "mangoapp", "gpuClockPin", "gamescopeRealtime", diff --git a/app/src/main/java/com/droiddeck/launcher/ui/SessionLoading.kt b/app/src/main/java/com/droiddeck/launcher/ui/SessionLoading.kt index bf41dcf0b..38bbb76cf 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/SessionLoading.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/SessionLoading.kt @@ -27,6 +27,7 @@ import androidx.compose.foundation.layout.heightIn import androidx.compose.material.icons.filled.Pause import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Icon +import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -68,6 +69,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight @@ -78,21 +81,93 @@ import androidx.compose.ui.text.style.TextOverflow @Composable -fun HudText(text: String) { +fun HudText(text: String, graph: FloatArray = FloatArray(0), color: String = "mint", opacity: Int = 70) { + if (text.isEmpty() && graph.size < 2) return + val accent = hudInk(color) + val wash = (opacity.coerceIn(30, 100) / 100f) + val ink = accent.copy(alpha = (0.5f + wash * 0.5f).coerceIn(0.62f, 1f)) Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopEnd) { - Text( - text, - fontFamily = FontFamily.Monospace, - fontSize = 12.sp, - color = Color.White, + Column( + horizontalAlignment = Alignment.End, modifier = Modifier .padding(12.dp) - .background(Color(0x8C000000)) - .padding(horizontal = 8.dp, vertical = 3.dp), - ) + .background( + Brush.verticalGradient( + listOf(accent.copy(alpha = wash * 0.28f), Color.Black.copy(alpha = wash * 0.72f)), + ), + RoundedCornerShape(8.dp), + ) + .padding(horizontal = 8.dp, vertical = 5.dp), + ) { + if (text.isNotEmpty()) Text( + text, + fontFamily = FontFamily.Monospace, + fontSize = 12.sp, + color = ink, + textAlign = TextAlign.End, + ) + if (graph.size >= 2) { + if (text.isNotEmpty()) Spacer(Modifier.height(4.dp)) + HudGraph(graph, accent, wash) + } + } } } +@Composable +private fun HudGraph(samples: FloatArray, accent: Color, wash: Float) { + Canvas(Modifier.width(148.dp).height(44.dp)) { + val maxMs = (samples.maxOrNull() ?: 16.7f).coerceAtLeast(16.7f) + val step = size.width / (samples.size - 1) + fun yOf(ms: Float) = size.height * (1f - (ms / maxMs).coerceIn(0f, 1f)) + val fillAlpha = wash * 0.5f + val fill = Path().apply { + moveTo(0f, size.height) + samples.forEachIndexed { i, ms -> lineTo(i * step, yOf(ms)) } + lineTo(size.width, size.height) + close() + } + drawPath( + fill, + Brush.verticalGradient(listOf(HUD_SLOW.copy(alpha = fillAlpha), accent.copy(alpha = fillAlpha * 0.45f))), + ) + val guide = yOf(16.7f) + drawLine(Color.White.copy(alpha = 0.32f), Offset(0f, guide), Offset(size.width, guide), strokeWidth = 1f) + for (i in 0 until samples.lastIndex) { + val tone = ((samples[i] - 8f) / 25f).coerceIn(0f, 1f) + drawLine( + mix(accent, HUD_SLOW, tone).copy(alpha = 0.55f + wash * 0.4f), + Offset(i * step, yOf(samples[i])), + Offset((i + 1) * step, yOf(samples[i + 1])), + strokeWidth = 2.5f, + cap = StrokeCap.Round, + ) + } + } +} + +private fun hudInk(color: String): Color = Color( + when (color) { + "white" -> 0xFFF2F5F8 + "sky" -> 0xFF66C0F4 + "amber" -> 0xFFFFB74D + "violet" -> 0xFFD0A2FF + else -> 0xFF3DDC84 + }.toInt(), +) + +private fun mix(from: Color, to: Color, t: Float): Color { + val u = t.coerceIn(0f, 1f) + return Color( + red = from.red + (to.red - from.red) * u, + green = from.green + (to.green - from.green) * u, + blue = from.blue + (to.blue - from.blue) * u, + alpha = 1f, + ) +} + +private val HUD_SLOW = Color(0xFFFF5C6C.toInt()) + private class LoadStage(@androidx.annotation.StringRes val label: Int, @androidx.annotation.StringRes val detail: Int) private fun loadStages(steam: Boolean): List = if (steam) listOf( diff --git a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt index 6fa4cba7b..82425814c 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt @@ -195,6 +195,11 @@ class DrawerActions( val isHomeApp: Boolean, val androidApps: List, val hudOn: Boolean, + val hudFps: Boolean = true, + val hudBattery: Boolean = true, + val hudGraph: Boolean = true, + val hudColor: String = SessionPrefs.HUD_COLOR_MINT, + val hudOpacity: Int = SessionPrefs.HUD_OPACITY_DEFAULT, val frameGen: FrameGen.Mode, val lossless: Lossless.State, val oscMode: String, @@ -222,6 +227,11 @@ class DrawerActions( val secondScreenDisplays: List, val selectedSecondScreenDisplay: Int, val onHud: (Boolean) -> Unit, + val onHudFps: (Boolean) -> Unit = {}, + val onHudBattery: (Boolean) -> Unit = {}, + val onHudGraph: (Boolean) -> Unit = {}, + val onHudColor: (String) -> Unit = {}, + val onHudOpacity: (Int) -> Unit = {}, val onFrameGenPick: (FrameGen.Mode) -> Unit, val onImportLossless: () -> Unit, val onKeyboard: () -> Unit, @@ -462,6 +472,30 @@ internal fun SessionDrawer(open: Boolean, requestedPage: SessionDrawerPage, cont SettingsGroup(stringResource(R.string.drawer_page_display)) { ToggleRow(host, "hud", stringResource(R.string.drawer_hud), null, a.hudOn, chipModifier = focus.track(page, "hud"), onChange = a.onHud) + if (a.hudOn) { + ToggleRow(host, "hud-fps", stringResource(R.string.drawer_hud_fps), null, a.hudFps, + chipModifier = focus.track(page, "hud-fps"), onChange = a.onHudFps) + ToggleRow(host, "hud-battery", stringResource(R.string.drawer_hud_battery), null, a.hudBattery, + chipModifier = focus.track(page, "hud-battery"), onChange = a.onHudBattery) + ToggleRow(host, "hud-graph", stringResource(R.string.drawer_hud_graph), null, a.hudGraph, + chipModifier = focus.track(page, "hud-graph"), onChange = a.onHudGraph) + ChoiceRow( + host, "hud-color", stringResource(R.string.drawer_hud_color), null, + listOf( + SessionPrefs.HUD_COLOR_MINT to stringResource(R.string.drawer_hud_color_mint), + "white" to stringResource(R.string.drawer_hud_color_white), + "sky" to stringResource(R.string.drawer_hud_color_sky), + "amber" to stringResource(R.string.drawer_hud_color_amber), + "violet" to stringResource(R.string.drawer_hud_color_violet), + ), + a.hudColor, chipModifier = focus.track(page, "hud-color"), onPick = a.onHudColor, + ) + SliderRow( + stringResource(R.string.drawer_hud_opacity), null, a.hudOpacity, + SessionPrefs.HUD_OPACITY_RANGE, step = 10, format = { "$it%" }, + modifier = focus.track(page, "hud-opacity"), onChange = a.onHudOpacity, + ) + } val fgOpen = host.open == "fg" val fgLabel = FrameGen.label(LocalContext.current, a.frameGen) SettingsRow(stringResource(R.string.frame_gen_title), null, highlighted = fgOpen) { diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c8fd949fb..df1ed3e76 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -590,6 +590,16 @@ الصفحة السابقة الصفحة التالية واجهة الأداء + معدل الإطارات + درجة حرارة البطارية + مخطط الأداء + اللون + نعناعي + أبيض + سماوي + كهرماني + بنفسجي + العتامة وضع التحجيم حدة التحجيم مؤثرات الشاشة diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index a9303902a..8c6856fc6 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -577,6 +577,16 @@ Página anterior Página siguiente HUD de rendimiento + Tasa de fotogramas + Temperatura de la batería + Gráfico de rendimiento + Color + Menta + Blanco + Celeste + Ámbar + Violeta + Opacidad Modo de escalado Nitidez del escalado Efectos de pantalla diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index aba51d559..9d8a81384 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -582,6 +582,16 @@ Предишна страница Следваща страница HUD за производителност + Честота на кадрите + Температура на батерията + Графика на производителността + Цвят + Мента + Бяло + Небесно + Кехлибарено + Виолетово + Прозрачност Режим на мащабиране Острота на мащабиране Ефекти на екрана diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2bef97b92..87e03f749 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -586,6 +586,16 @@ Předchozí stránka Další stránka HUD výkonu + Snímková frekvence + Teplota baterie + Graf výkonu + Barva + Máta + Bílá + Nebeská + Ambrová + Fialová + Průhlednost Režim škálování Ostrost škálování Efekty obrazovky diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3fe4695cb..a5da9e3ef 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -582,6 +582,16 @@ Forrige side Næste side Ydelses-HUD + Billedhastighed + Batteritemperatur + Ydelsesgraf + Farve + Mint + Hvid + Himmelblå + Ravgul + Violet + Gennemsigtighed Skaleringstilstand Skaleringsskarphed Skærmeffekter diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9fe1c0e79..a477da476 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -579,6 +579,16 @@ Vorherige Seite Nächste Seite Leistungs-HUD + Bildrate + Akkutemperatur + Leistungsdiagramm + Farbe + Minze + Weiß + Himmelblau + Bernstein + Violett + Deckkraft Skalierungsmodus Skalierungsschärfe Bildschirmeffekte diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 14f83431c..49fbc0dae 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -582,6 +582,16 @@ Προηγούμενη σελίδα Επόμενη σελίδα HUD απόδοσης + Ρυθμός καρέ + Θερμοκρασία μπαταρίας + Γράφημα απόδοσης + Χρώμα + Μέντα + Λευκό + Γαλάζιο + Κεχριμπαρί + Βιολετί + Διαφάνεια Λειτουργία κλιμάκωσης Οξύτητα κλιμάκωσης Εφέ οθόνης diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ea6e05fb3..f4b00b45a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -581,6 +581,16 @@ Página anterior Página siguiente HUD de rendimiento + Tasa de fotogramas + Temperatura de la batería + Gráfico de rendimiento + Color + Menta + Blanco + Celeste + Ámbar + Violeta + Opacidad Modo de escalado Nitidez del escalado Efectos de pantalla diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 680b9c455..bd9364284 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -582,6 +582,16 @@ Edellinen sivu Seuraava sivu Suorituskyky-HUD + Kuvataajuus + Akun lämpötila + Suorituskykykäyrä + Väri + Minttu + Valkoinen + Taivaansininen + Meripihka + Violetti + Peittävyys Skaalaustila Skaalauksen terävyys Näyttötehosteet diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 107215628..42856242d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -581,6 +581,16 @@ Page précédente Page suivante HUD de performance + Fréquence d\'images + Température de la batterie + Graphique de performance + Couleur + Menthe + Blanc + Ciel + Ambre + Violet + Opacité Mode de mise à l\'échelle Netteté de la mise à l\'échelle Effets d\'écran diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 2a246077f..38e985443 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -582,6 +582,16 @@ पिछला पेज अगला पेज परफ़ॉर्मेंस HUD + फ़्रेम दर + बैटरी तापमान + परफ़ॉर्मेंस ग्राफ़ + रंग + मिंट + सफ़ेद + स्काई + एम्बर + वायलेट + ओपैसिटी स्केलिंग मोड स्केलिंग शार्पनेस स्क्रीन इफ़ेक्ट diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ab5bbef49..5c49ae3b4 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -582,6 +582,16 @@ Előző oldal Következő oldal Teljesítmény HUD + Képkockasebesség + Akkuhőmérséklet + Teljesítménygrafikon + Szín + Menta + Fehér + Égszínkék + Borostyán + Lila + Átlátszatlanság Méretezési mód Méretezési élesség Képernyőeffektek diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0bd3c783f..46ee60053 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -580,6 +580,16 @@ Halaman sebelumnya Halaman berikutnya HUD performa + Laju bingkai + Suhu baterai + Grafik performa + Warna + Mint + Putih + Langit + Ambar + Ungu + Opasitas Mode penskalaan Ketajaman penskalaan Efek layar diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a2c2c3c4c..c29d4964d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -581,6 +581,16 @@ Pagina precedente Pagina successiva HUD prestazioni + Frequenza fotogrammi + Temperatura batteria + Grafico prestazioni + Colore + Menta + Bianco + Cielo + Ambra + Viola + Opacità Modalità di ridimensionamento Nitidezza del ridimensionamento Effetti schermo diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 213144bea..7f77f84b4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -580,6 +580,16 @@ 前のページ 次のページ パフォーマンスHUD + フレームレート + バッテリー温度 + パフォーマンスグラフ + 色 + ミント + ホワイト + スカイ + アンバー + バイオレット + 不透明度 スケーリングモード スケーリングのシャープネス 画面エフェクト diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4fc869f78..1df2c7fa1 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -580,6 +580,16 @@ 이전 페이지 다음 페이지 성능 HUD + 프레임 속도 + 배터리 온도 + 성능 그래프 + 색상 + 민트 + 흰색 + 하늘색 + 호박색 + 보라색 + 불투명도 스케일링 모드 스케일링 선명도 화면 효과 diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 599ff582f..942349281 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -580,6 +580,16 @@ Halaman sebelumnya Halaman seterusnya HUD prestasi + Kadar bingkai + Suhu bateri + Graf prestasi + Warna + Pudina + Putih + Langit + Ambar + Ungu + Kelegapan Mod penskalaan Ketajaman penskalaan Kesan skrin diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 68dcfc185..1ae985456 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -582,6 +582,16 @@ Forrige side Neste side Ytelses-HUD + Bildefrekvens + Batteritemperatur + Ytelsesgraf + Farge + Mint + Hvit + Himmel + Amber + Fiolett + Opasitet Skaleringsmodus Skaleringsskarphet Skjermeffekter diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 267afcb69..a31b6227c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -582,6 +582,16 @@ Vorige pagina Volgende pagina Prestatie-HUD + Beeldsnelheid + Accutemperatuur + Prestatiegrafiek + Kleur + Mint + Wit + Hemelsblauw + Amber + Violet + Transparantie Schaalmodus Schaalscherpte Schermeffecten diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fc7bb39b1..4c5d60c66 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -586,6 +586,16 @@ Poprzednia strona Następna strona HUD wydajności + Liczba klatek + Temperatura baterii + Wykres wydajności + Kolor + Mięta + Biały + Błękitny + Bursztynowy + Fioletowy + Przezroczystość Tryb skalowania Ostrość skalowania Efekty ekranowe diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 8c51b09c9..2e1f6425f 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -581,6 +581,16 @@ Página anterior Página seguinte HUD de desempenho + Taxa de fotogramas + Temperatura da bateria + Gráfico de desempenho + Cor + Menta + Branco + Céu + Âmbar + Violeta + Opacidade Modo de escala Nitidez da escala Efeitos de ecrã diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 7c6f7f966..73d6239a3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -581,6 +581,16 @@ Página anterior Próxima página HUD de desempenho + Taxa de quadros + Temperatura da bateria + Gráfico de desempenho + Cor + Menta + Branco + Céu + Âmbar + Violeta + Opacidade Modo de escala Nitidez da escala Efeitos de tela diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c9e753866..e02c7b249 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -584,6 +584,16 @@ Pagina anterioară Pagina următoare HUD de performanță + Rată de cadre + Temperatură baterie + Grafic de performanță + Culoare + Mentă + Alb + Cer + Chihlimbariu + Violet + Opacitate Mod de scalare Claritatea scalării Efecte de ecran diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4af87d354..71da72cf7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -583,6 +583,16 @@ Предыдущая страница Следующая страница HUD производительности + Частота кадров + Температура батареи + График производительности + Цвет + Мята + Белый + Небесный + Янтарный + Фиолетовый + Непрозрачность Режим масштабирования Резкость масштабирования Экранные эффекты diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index e740f9cb9..0f84b8f48 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -582,6 +582,16 @@ Föregående sida Nästa sida Prestanda-HUD + Bildfrekvens + Batteritemperatur + Prestandagraf + Färg + Mint + Vit + Himmelsblå + Amber + Lila + Opacitet Skalningsläge Skalningsskärpa Skärmeffekter diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 3a9157bb7..7dceea5bf 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -580,6 +580,16 @@ หน้าก่อนหน้า หน้าถัดไป HUD ประสิทธิภาพ + อัตราเฟรม + อุณหภูมิแบตเตอรี่ + กราฟประสิทธิภาพ + สี + มิ้นต์ + ขาว + ฟ้าสดใส + อำพัน + ม่วง + ความโปร่งใส โหมดการปรับขนาด ความคมชัดของการปรับขนาด เอฟเฟกต์หน้าจอ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 9e6b9ab15..ba7d16b0d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -579,6 +579,16 @@ Önceki sayfa Sonraki sayfa Performans HUD\'u + Kare hızı + Pil sıcaklığı + Performans grafiği + Renk + Nane + Beyaz + Gök mavisi + Kehribar + Mor + Opaklık Ölçekleme modu Ölçekleme keskinliği Ekran efektleri diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 931caa8ad..a3938e290 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -586,6 +586,16 @@ Попередня сторінка Наступна сторінка HUD продуктивності + Частота кадрів + Температура батареї + Графік продуктивності + Колір + М\'ята + Білий + Небесний + Бурштиновий + Фіолетовий + Непрозорість Режим масштабування Чіткість масштабування Ефекти екрана diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d636a67ea..a8e738e09 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -580,6 +580,16 @@ Trang trước Trang sau HUD hiệu năng + Tốc độ khung hình + Nhiệt độ pin + Biểu đồ hiệu năng + Màu + Bạc hà + Trắng + Xanh da trời + Hổ phách + Tím + Độ mờ Chế độ chia tỷ lệ Độ sắc nét khi chia tỷ lệ Hiệu ứng màn hình diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f513e51a9..ebad970f5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -580,6 +580,16 @@ 上一页 下一页 性能 HUD + 帧率 + 电池温度 + 性能图表 + 颜色 + 薄荷绿 + 白色 + 天蓝 + 琥珀 + 紫罗兰 + 不透明度 缩放模式 缩放锐度 屏幕效果 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 10cc860e7..b512870a5 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -580,6 +580,16 @@ 上一頁 下一頁 效能 HUD + 幀率 + 電池溫度 + 效能圖表 + 顏色 + 薄荷綠 + 白色 + 天藍 + 琥珀色 + 紫羅蘭 + 不透明度 縮放模式 縮放銳利度 畫面效果 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e11242c24..26b6d8821 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -580,6 +580,16 @@ 上一頁 下一頁 效能 HUD + 幀率 + 電池溫度 + 效能圖表 + 顏色 + 薄荷綠 + 白色 + 天藍 + 琥珀 + 紫羅蘭 + 不透明度 縮放模式 縮放銳利度 畫面效果 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a11bc727e..e8f5d77f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -593,6 +593,16 @@ Previous page Next page Performance HUD + Frame rate + Battery temperature + Performance graph + Color + Mint + White + Sky + Amber + Violet + Opacity Scaling mode Scaling sharpness Screen effects diff --git a/app/src/test/java/com/droiddeck/launcher/session/SettingsResetTest.kt b/app/src/test/java/com/droiddeck/launcher/session/SettingsResetTest.kt index 81ace45da..3f3fbf07f 100644 --- a/app/src/test/java/com/droiddeck/launcher/session/SettingsResetTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/session/SettingsResetTest.kt @@ -32,6 +32,11 @@ class SettingsResetTest { SessionPrefs.setHdr(app, SessionService.MODE_DESKTOP, true) SessionPrefs.setResolutionChoice(app, SessionService.MODE_STEAM, "1280x800") SessionPrefs.setGuestHostname(app, "MyDeck") + SessionPrefs.setHudShowFps(app, false) + SessionPrefs.setHudShowBattery(app, false) + SessionPrefs.setHudShowGraph(app, false) + SessionPrefs.setHudColor(app, "amber") + SessionPrefs.setHudOpacity(app, 40) ControllerPrefs.setOpacity(app, 40) AppUiPrefs.setScale(app, 150) FrameGen.set(app, FrameGen.Mode(FrameGen.ENGINE_DDFG, 3)) @@ -45,6 +50,13 @@ class SettingsResetTest { assertFalse(SessionPrefs.hdr(app, SessionService.MODE_DESKTOP)) assertFalse(SessionPrefs.resolutionChosen(app, SessionService.MODE_STEAM)) assertEquals(SessionPrefs.DEFAULT_GUEST_HOSTNAME, SessionPrefs.guestHostname(app)) + assertTrue(SessionPrefs.hudShowFps(app)) + assertTrue(SessionPrefs.hudShowBattery(app)) + assertTrue(SessionPrefs.hudShowGraph(app)) + assertEquals(SessionPrefs.HUD_COLOR_MINT, SessionPrefs.hudColor(app)) + assertEquals(SessionPrefs.HUD_OPACITY_DEFAULT, SessionPrefs.hudOpacity(app)) + assertEquals("32.4°C", PerfHud.batteryCelsius(324)) + assertNull(PerfHud.batteryCelsius(0)) assertEquals(100, ControllerPrefs.read(app).opacity) assertEquals(AppUiPrefs.DEFAULT_SCALE, AppUiPrefs.scale(app)) assertEquals(FrameGen.Mode.OFF.engine, FrameGen.engine(app))