Skip to content

Commit ca9e13b

Browse files
committed
refactor(ShareLimit): convert from Java to Kotlin and fix bug in latest WA
1 parent 1bb285f commit ca9e13b

2 files changed

Lines changed: 30 additions & 85 deletions

File tree

app/src/main/java/com/wmods/wppenhacer/xposed/core/devkit/Unobfuscator.kt

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -736,34 +736,6 @@ object Unobfuscator {
736736
}
737737
}
738738

739-
@Throws(Exception::class)
740-
@JvmStatic
741-
fun loadShareLimitMethod(classLoader: ClassLoader): Method {
742-
return UnobfuscatorCache.getInstance().getMethod(classLoader) {
743-
findFirstMethodUsingStrings(
744-
classLoader,
745-
StringMatchType.Contains,
746-
"send_max_video_duration"
747-
)
748-
?: throw Exception("ShareLimit method not found")
749-
}
750-
}
751-
752-
@Throws(Exception::class)
753-
@JvmStatic
754-
fun loadShareMapItemField(classLoader: ClassLoader): Field {
755-
return UnobfuscatorCache.getInstance().getField(classLoader) {
756-
val shareLimitMethod = loadShareLimitMethod(classLoader)
757-
val methodData = bridge.getMethodData(shareLimitMethod) ?: return@getField null
758-
val usingFields = methodData.usingFields
759-
for (ufield in usingFields) {
760-
val field = ufield.field.getFieldInstance(classLoader)
761-
if (field.type == Map::class.java) return@getField field
762-
}
763-
throw Exception("ShareItem field not found")
764-
}
765-
}
766-
767739
@Throws(Exception::class)
768740
@JvmStatic
769741
fun loadMenuManagerClass(classLoader: ClassLoader): Class<*> {
@@ -3405,7 +3377,6 @@ object Unobfuscator {
34053377
}
34063378

34073379
@Throws(Exception::class)
3408-
34093380
@JvmStatic
34103381
fun loadOnConversationsListChangedMethod(classLoader: ClassLoader): Method? {
34113382
return UnobfuscatorCache.getInstance().getMethod(classLoader) {
@@ -3417,4 +3388,14 @@ object Unobfuscator {
34173388
)
34183389
}
34193390
}
3391+
3392+
fun loadMultiSelectionLimitInfoClass(classLoader: ClassLoader): Class<*> {
3393+
return UnobfuscatorCache.getInstance().getClass(classLoader) {
3394+
bridge.findClass {
3395+
matcher {
3396+
usingStrings("MultiSelectionLimitInfo")
3397+
}
3398+
}.single().getInstance(classLoader)
3399+
}
3400+
}
34203401
}
Lines changed: 20 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,22 @@
1-
package com.wmods.wppenhacer.xposed.features.general;
2-
3-
import androidx.annotation.NonNull;
4-
5-
import com.wmods.wppenhacer.xposed.core.Feature;
6-
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
7-
8-
import java.util.HashMap;
9-
10-
import de.robv.android.xposed.XC_MethodHook;
11-
import de.robv.android.xposed.XSharedPreferences;
12-
import de.robv.android.xposed.XposedBridge;
13-
14-
public class ShareLimit extends Feature {
15-
public ShareLimit(ClassLoader loader, XSharedPreferences preferences) {
16-
super(loader, preferences);
1+
package com.wmods.wppenhacer.xposed.features.general
2+
3+
import com.wmods.wppenhacer.xposed.core.Feature
4+
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator
5+
import de.robv.android.xposed.XC_MethodHook
6+
import de.robv.android.xposed.XSharedPreferences
7+
import de.robv.android.xposed.XposedBridge
8+
9+
class ShareLimit(classLoader: ClassLoader, prefs: XSharedPreferences) : Feature(classLoader, prefs) {
10+
11+
override fun doHook() {
12+
if(!prefs.getBoolean("removeforwardlimit", false)) return
13+
val multiSelectionLimitInfoClass = Unobfuscator.loadMultiSelectionLimitInfoClass(classLoader)
14+
XposedBridge.hookAllConstructors(multiSelectionLimitInfoClass, object : XC_MethodHook() {
15+
override fun beforeHookedMethod(param: MethodHookParam) {
16+
param.args[0] = Int.MAX_VALUE
17+
}
18+
})
1719
}
1820

19-
public void doHook() throws Exception {
20-
if (!prefs.getBoolean("removeforwardlimit", false)) return;
21-
var shareLimitMethod = Unobfuscator.loadShareLimitMethod(classLoader);
22-
logDebug(Unobfuscator.getMethodDescriptor(shareLimitMethod));
23-
var shareItemField = Unobfuscator.loadShareMapItemField(classLoader);
24-
logDebug(Unobfuscator.getFieldDescriptor(shareItemField));
25-
26-
XposedBridge.hookMethod(
27-
shareLimitMethod,
28-
new XC_MethodHook() {
29-
private HashMap<Object, Object> fakeMap;
30-
private HashMap<Object, Object> mMap;
31-
32-
/**
33-
* @noinspection unchecked
34-
*/
35-
@Override
36-
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
37-
fakeMap = new HashMap<>();
38-
mMap = (HashMap<Object, Object>) shareItemField.get(param.thisObject);
39-
shareItemField.set(param.thisObject, fakeMap);
40-
}
41-
42-
@Override
43-
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
44-
mMap.putAll(fakeMap);
45-
shareItemField.set(param.thisObject, mMap);
46-
fakeMap.clear();
47-
}
48-
});
49-
50-
51-
}
52-
53-
@NonNull
54-
@Override
55-
public String getPluginName() {
56-
return "Share Limit";
57-
}
58-
}
21+
override fun getPluginName(): String = "Share Limit"
22+
}

0 commit comments

Comments
 (0)