From c2dd90d1b62a915e7f73e4d20bd0ff499f4e7e86 Mon Sep 17 00:00:00 2001 From: xXJsonDeruloXx Date: Thu, 8 Oct 2026 08:05:07 -0400 Subject: [PATCH] feat: Steam's touch icons, labels and colours on the touch controls; pick and save them like Steam --- .../com/droiddeck/launcher/SessionActivity.kt | 4 +- .../launcher/input/SteamTouchBindings.kt | 285 ++++++++++++++++++ .../launcher/input/SteamTouchConfig.kt | 24 +- .../launcher/input/SteamTouchControls.kt | 216 +++++++++++-- .../launcher/input/SteamTouchIconPicker.kt | 188 ++++++++++++ .../launcher/input/SteamTouchBindingsTest.kt | 118 ++++++++ 6 files changed, 805 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/droiddeck/launcher/input/SteamTouchBindings.kt create mode 100644 app/src/main/java/com/droiddeck/launcher/input/SteamTouchIconPicker.kt create mode 100644 app/src/test/java/com/droiddeck/launcher/input/SteamTouchBindingsTest.kt diff --git a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt index 54fb73770..0b00682e6 100644 --- a/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt +++ b/app/src/main/java/com/droiddeck/launcher/SessionActivity.kt @@ -148,7 +148,6 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { private var steamTouchControls: com.droiddeck.launcher.input.SteamTouchControls? = null private var oscStyle by mutableStateOf(SessionPrefs.OSC_STYLE_DROIDDECK) private var steamTouchAvailable by mutableStateOf(false) - private var steamTouchRetries = 0 private val steamTouchRetry = Runnable { updateOnScreenControls() } private var keyboard: KeyboardHost? = null private var controllerSettings by mutableStateOf(null) @@ -1866,7 +1865,7 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { val steam = if (wantsSteam) steamTouch() else null // The service makes the device while the session starts, after this activity: the app's // own pad until then, and another look in a moment. - if (wantsSteam && steam == null && steamTouchRetries++ < 120) { + if (wantsSteam && steam == null && !isFinishing && !isDestroyed) { uiHandler.removeCallbacks(steamTouchRetry) uiHandler.postDelayed(steamTouchRetry, 1000) } @@ -2111,6 +2110,7 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback { } override fun onDestroy() { + uiHandler.removeCallbacks(steamTouchRetry) if (runtimeRemovalBlocked) { super.onDestroy(); return } // Deliberately does NOT end the session: this activity can be destroyed while the user is // in another app, and the whole point of the service is that Steam survives that. diff --git a/app/src/main/java/com/droiddeck/launcher/input/SteamTouchBindings.kt b/app/src/main/java/com/droiddeck/launcher/input/SteamTouchBindings.kt new file mode 100644 index 000000000..131e29cbf --- /dev/null +++ b/app/src/main/java/com/droiddeck/launcher/input/SteamTouchBindings.kt @@ -0,0 +1,285 @@ +package com.droiddeck.launcher.input + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.LruCache +import java.io.File + +/** + * What each touch control is bound to, and the icon it shows - Steam's, as its configurator keeps + * them. + * + * A Steam Input binding is one string: `,