@@ -3,6 +3,7 @@ package com.vendetta.xposed
3
3
import android.content.Context
4
4
import android.graphics.Color
5
5
import android.content.res.AssetManager
6
+ import android.content.res.Resources
6
7
import android.content.res.XModuleResources
7
8
import android.util.Log
8
9
import de.robv.android.xposed.IXposedHookLoadPackage
@@ -82,7 +83,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
82
83
}
83
84
84
85
override fun handleInitPackageResources (resparam : XC_InitPackageResources .InitPackageResourcesParam ) {
85
- if (resparam.packageName == " com.google.android. webview" ) return
86
+ if (resparam.packageName.contains( " . webview" ) ) return
86
87
87
88
// rawColorMap is initialized during handleLoadPackage
88
89
rawColorMap.forEach { (key, value) ->
@@ -95,11 +96,9 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
95
96
}
96
97
97
98
override fun handleLoadPackage (param : XC_LoadPackage .LoadPackageParam ) {
98
- if (param.packageName == " com.google.android. webview" ) return
99
-
99
+ if (param.packageName.contains( " . webview" ) ) return
100
+
100
101
val catalystInstanceImpl = param.classLoader.loadClass(" com.facebook.react.bridge.CatalystInstanceImpl" )
101
- val resourceDrawableIdHelper = param.classLoader.loadClass(" com.facebook.react.views.imagehelper.ResourceDrawableIdHelper" )
102
- val soundManagerModule = param.classLoader.loadClass(" com.discord.sounds.SoundManagerModule" )
103
102
val themeManager = param.classLoader.loadClass(" com.discord.theme.utils.ColorUtilsKt" )
104
103
val darkTheme = param.classLoader.loadClass(" com.discord.theme.DarkTheme" )
105
104
val lightTheme = param.classLoader.loadClass(" com.discord.theme.LightTheme" )
@@ -118,23 +117,6 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
118
117
Boolean ::class .javaPrimitiveType
119
118
).apply { isAccessible = true }
120
119
121
- val getResourceDrawableId = resourceDrawableIdHelper.getDeclaredMethod(
122
- " getResourceDrawableId" ,
123
- Context ::class .java,
124
- String ::class .java
125
- ).apply { isAccessible = true }
126
-
127
- val mResourceDrawableIdMapField = resourceDrawableIdHelper.getDeclaredField(" mResourceDrawableIdMap" ).apply {
128
- isAccessible = true
129
- }
130
-
131
- val resolveRawResId = soundManagerModule.getDeclaredMethod(
132
- " resolveRawResId" ,
133
- Context ::class .java,
134
- String ::class .java,
135
- String ::class .java
136
- ).apply { isAccessible = true }
137
-
138
120
val cache = File (param.appInfo.dataDir, " cache" ).also { it.mkdirs() }
139
121
val vendetta = File (cache, " vendetta.js" )
140
122
val etag = File (cache, " vendetta_etag.txt" )
@@ -189,6 +171,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
189
171
)
190
172
XposedBridge .hookMethod(getColorCompat, object : XC_MethodHook () {
191
173
override fun afterHookedMethod (param : MethodHookParam ) {
174
+ @Suppress(" DEPRECATION" )
192
175
param.result = (param.args[0 ] as Context ).resources.getColor(param.args[1 ] as Int )
193
176
}
194
177
})
@@ -244,45 +227,21 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
244
227
245
228
XposedBridge .hookMethod(loadScriptFromAssets, patch)
246
229
XposedBridge .hookMethod(loadScriptFromFile, patch)
247
- XposedBridge .hookMethod(getResourceDrawableId, object : XC_MethodHook () {
248
- @Suppress(" UNCHECKED_CAST" )
249
- override fun beforeHookedMethod (param : MethodHookParam ) {
250
- val context = param.args[0 ] as Context
251
- val str = param.args[1 ] as String?
252
- val mResourceDrawableIdMap = mResourceDrawableIdMapField.get(param.thisObject) as HashMap <String , Int >
253
- if (str.isNullOrEmpty()) {
254
- param.result = 0 ; return
255
- }
256
- val replace = str.replace(" -" , " _" )
257
- try {
258
- param.result = Integer .parseInt(replace); return
259
- } catch (e: Throwable ) {
260
- synchronized(param.thisObject) {
261
- if (mResourceDrawableIdMap.containsKey(replace)) {
262
- param.result = mResourceDrawableIdMap[replace]!! .toInt()
263
- }
264
230
265
- // Hardcode package name to fix resource loading when patched app has modified package name
266
- val identifier = context.resources.getIdentifier(replace, " drawable" , " com.discord" )
267
- mResourceDrawableIdMap[replace] = identifier
268
- param.result = identifier; return
269
- }
231
+ // Fighting the side effects of changing the package name
232
+ if (param.packageName != " com.discord" ) {
233
+ val getIdentifier = Resources ::class .java.getDeclaredMethod(
234
+ " getIdentifier" ,
235
+ String ::class .java,
236
+ String ::class .java,
237
+ String ::class .java
238
+ );
239
+
240
+ XposedBridge .hookMethod(getIdentifier, object : XC_MethodHook () {
241
+ override fun beforeHookedMethod (mhparam : MethodHookParam ) = with (mhparam) {
242
+ if (args[2 ] == param.packageName) args[2 ] = " com.discord"
270
243
}
271
- }
272
- })
273
- XposedBridge .hookMethod(resolveRawResId, object : XC_MethodHook () {
274
- override fun beforeHookedMethod (param : MethodHookParam ) {
275
- val context = param.args[0 ] as Context
276
- val str = param.args[1 ] as String
277
- val str2 = param.args[2 ] as String
278
-
279
- // Hardcode package name to fix resource loading when patched app has modified package name
280
- val identifier = context.resources.getIdentifier(str, str2, " com.discord" )
281
- if (identifier > 0 ) {
282
- param.result = identifier; return
283
- }
284
- throw IllegalArgumentException (" Trying to resolve unknown sound $str " )
285
- }
286
- })
244
+ })
245
+ }
287
246
}
288
247
}
0 commit comments