Update ThemesModule.kt

This commit is contained in:
OTKUSteyler 2026-09-05 13:25:51 +02:00 • committed by GitHub
parent 7152b06265
commit 8616f04995
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -46,7 +46,6 @@ object ThemesModule : Module() {
private const val THEME_FILE = "current-theme.json" private const val THEME_FILE = "current-theme.json"
@Deprecated("This method is deprecated in the parent class") @Deprecated("This method is deprecated in the parent class")
@ExperimentalSerializationApi @ExperimentalSerializationApi
override fun buildPayload(builder: JsonObjectBuilder) { override fun buildPayload(builder: JsonObjectBuilder) {
@ -86,10 +85,20 @@ object ThemesModule : Module() {
} }
fun hookTheme() { fun hookTheme() {
try {
val themeManager = param.classLoader.loadClass("com.discord.theme.utils.ColorUtilsKt") val themeManager = param.classLoader.loadClass("com.discord.theme.utils.ColorUtilsKt")
val darkTheme = param.classLoader.loadClass("com.discord.theme.DarkerTheme") val darkTheme = param.classLoader.loadClass("com.discord.theme.DarkerTheme")
val lightTheme = param.classLoader.loadClass("com.discord.theme.LightTheme") val lightTheme = param.classLoader.loadClass("com.discord.theme.LightTheme")
hookThemeInternal(themeManager, darkTheme, lightTheme)
} catch (e: Throwable) {
GoonXposed.xposed.Utils.Log.e("Failed to hook theme: ${e.message}")
}
}
private fun hookThemeInternal(
themeManager: Class<*>, darkTheme: Class<*>, lightTheme: Class<*>
) {
val theme = this.theme ?: return val theme = this.theme ?: return
// Apply rawColors // Apply rawColors
@ -111,6 +120,7 @@ object ThemesModule : Module() {
// If there's any rawColors value, hook the color getter // If there's any rawColors value, hook the color getter
if (!theme.data.rawColors.isNullOrEmpty()) { if (!theme.data.rawColors.isNullOrEmpty()) {
try {
val getColorCompat = themeManager.getDeclaredMethod( val getColorCompat = themeManager.getDeclaredMethod(
"getColorCompat", "getColorCompat",
Resources::class.java, Resources::class.java,
@ -124,11 +134,14 @@ object ThemesModule : Module() {
val patch = MethodHookBuilder().run { val patch = MethodHookBuilder().run {
before { before {
try {
val arg1 = args[0] val arg1 = args[0]
val resources = if (arg1 is Context) arg1.resources else (arg1 as Resources) val resources = if (arg1 is Context) arg1.resources else (arg1 as Resources)
val name = resources.getResourceEntryName(args[1] as Int) val name = resources.getResourceEntryName(args[1] as Int)
if (rawColorMap[name] != null) result = rawColorMap[name] if (rawColorMap[name] != null) result = rawColorMap[name]
} catch (_: Throwable) {
}
} }
build() build()
@ -136,17 +149,24 @@ object ThemesModule : Module() {
getColorCompat.hook(patch) getColorCompat.hook(patch)
getColorCompatLegacy.hook(patch) getColorCompatLegacy.hook(patch)
} catch (e: Throwable) {
GoonXposed.xposed.Utils.Log.e("Failed to hook getColorCompat: ${e.message}")
}
} }
} }
// Parse HEX colour string to INT. Takes "#RRGGBBAA" or "#RRGGBB" // Parse HEX colour string to INT. Takes "#RRGGBBAA" or "#RRGGBB"
private fun hexStringToColorInt(hexString: String): Int { private fun hexStringToColorInt(hexString: String): Int {
return if (hexString.length == 9) { return try {
if (hexString.length == 9) {
// Rearrange RRGGBBAA -> AARRGGBB so parseColor() is happy // Rearrange RRGGBBAA -> AARRGGBB so parseColor() is happy
val alpha = hexString.substring(7, 9) val alpha = hexString.substring(7, 9)
val rrggbb = hexString.substring(1, 7) val rrggbb = hexString.substring(1, 7)
"#$alpha$rrggbb".toColorInt() "#$alpha$rrggbb".toColorInt()
} else hexString.toColorInt() } else hexString.toColorInt()
} catch (_: Throwable) {
0
}
} }
private fun hookThemeMethod(themeClass: Class<*>, methodName: String, themeValue: Int) { private fun hookThemeMethod(themeClass: Class<*>, methodName: String, themeValue: Int) {