@@ -3,6 +3,7 @@ package com.vendetta.xposed
33import android.content.Context
44import android.graphics.Color
55import android.content.res.AssetManager
6+ import android.content.res.Resources
67import android.content.res.XModuleResources
78import android.util.Log
89import de.robv.android.xposed.IXposedHookLoadPackage
@@ -82,7 +83,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
8283 }
8384
8485 override fun handleInitPackageResources (resparam : XC_InitPackageResources .InitPackageResourcesParam ) {
85- if (resparam.packageName == " com.google.android. webview" ) return
86+ if (resparam.packageName.contains( " . webview" ) ) return
8687
8788 // rawColorMap is initialized during handleLoadPackage
8889 rawColorMap.forEach { (key, value) ->
@@ -95,11 +96,9 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
9596 }
9697
9798 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+
100101 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" )
103102 val themeManager = param.classLoader.loadClass(" com.discord.theme.utils.ColorUtilsKt" )
104103 val darkTheme = param.classLoader.loadClass(" com.discord.theme.DarkTheme" )
105104 val lightTheme = param.classLoader.loadClass(" com.discord.theme.LightTheme" )
@@ -118,23 +117,6 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
118117 Boolean ::class .javaPrimitiveType
119118 ).apply { isAccessible = true }
120119
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-
138120 val cache = File (param.appInfo.dataDir, " cache" ).also { it.mkdirs() }
139121 val vendetta = File (cache, " vendetta.js" )
140122 val etag = File (cache, " vendetta_etag.txt" )
@@ -189,6 +171,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
189171 )
190172 XposedBridge .hookMethod(getColorCompat, object : XC_MethodHook () {
191173 override fun afterHookedMethod (param : MethodHookParam ) {
174+ @Suppress(" DEPRECATION" )
192175 param.result = (param.args[0 ] as Context ).resources.getColor(param.args[1 ] as Int )
193176 }
194177 })
@@ -244,45 +227,21 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
244227
245228 XposedBridge .hookMethod(loadScriptFromAssets, patch)
246229 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- }
264230
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"
270243 }
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+ }
287246 }
288247}
0 commit comments