Skip to content

Commit 0ee662c

Browse files
committed
improve call information
1 parent 6b7a321 commit 0ee662c

File tree

2 files changed

+60
-34
lines changed

2 files changed

+60
-34
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,38 +1721,38 @@ public synchronized static Method loadBubbleDrawableMethod(ClassLoader classLoad
17211721
});
17221722
}
17231723

1724-
public static Method[] loadRootDetector(ClassLoader classLoader) {
1724+
public static synchronized Method[] loadRootDetector(ClassLoader classLoader) {
17251725
var methods = findAllMethodUsingStrings(classLoader, StringMatchType.Contains, "/system/bin/su");
17261726
if (methods.length == 0) throw new RuntimeException("RootDetector method not found");
17271727
return methods;
17281728
}
17291729

1730-
public static Method loadCheckEmulator(ClassLoader classLoader) throws Exception {
1730+
public static synchronized Method loadCheckEmulator(ClassLoader classLoader) throws Exception {
17311731
var method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "Android SDK built for x86");
17321732
if (method == null) throw new RuntimeException("CheckEmulator method not found");
17331733
return method;
17341734
}
17351735

1736-
public static Method loadCheckCustomRom(ClassLoader classLoader) throws Exception {
1736+
public static synchronized Method loadCheckCustomRom(ClassLoader classLoader) throws Exception {
17371737
var method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "cyanogen");
17381738
if (method == null) throw new RuntimeException("CheckCustomRom method not found");
17391739
return method;
17401740
}
17411741

1742-
public static Class loadGetContactInfoClass(ClassLoader classLoader) throws Exception {
1742+
public static synchronized Class loadGetContactInfoClass(ClassLoader classLoader) throws Exception {
17431743
return UnobfuscatorCache.getInstance().getClass(classLoader, () -> findFirstClassUsingStrings(classLoader, StringMatchType.Contains, "unknown@unknown"));
17441744

17451745
}
17461746

1747-
public static Method loadTranscribeMethod(ClassLoader classLoader) throws Exception {
1747+
public static synchronized Method loadTranscribeMethod(ClassLoader classLoader) throws Exception {
17481748
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "transcribe: starting transcription"));
17491749
}
17501750

1751-
public static Method loadCheckSupportLanguage(ClassLoader classLoader) throws Exception {
1751+
public static synchronized Method loadCheckSupportLanguage(ClassLoader classLoader) throws Exception {
17521752
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> findFirstMethodUsingStrings(classLoader, StringMatchType.Equals, "Unsupported language"));
17531753
}
17541754

1755-
public static Class loadUnkTranscript(ClassLoader classLoader) throws Exception {
1755+
public static synchronized Class loadUnkTranscript(ClassLoader classLoader) throws Exception {
17561756
return UnobfuscatorCache.getInstance().getClass(classLoader, () -> {
17571757
var loadTranscribe = loadTranscribeMethod(classLoader);
17581758
var callbackClass = loadTranscribe.getParameterTypes()[1];
@@ -1766,7 +1766,8 @@ public static Class loadUnkTranscript(ClassLoader classLoader) throws Exception
17661766
});
17671767
}
17681768

1769-
public static Method loadStateChangeMethod(ClassLoader classLoader) throws Exception {
1769+
public static synchronized Method loadStateChangeMethod(ClassLoader classLoader) throws Exception {
17701770
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "presencestatemanager/startTransitionToUnavailable/new-state"));
17711771
}
1772+
17721773
}

app/src/main/java/com/wmods/wppenhacer/xposed/features/general/Others.java

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
import com.wmods.wppenhacer.xposed.core.WppCore;
1717
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
1818
import com.wmods.wppenhacer.xposed.utils.AnimationUtil;
19+
import com.wmods.wppenhacer.xposed.utils.DebugUtils;
1920
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
2021
import com.wmods.wppenhacer.xposed.utils.ResId;
2122
import com.wmods.wppenhacer.xposed.utils.Utils;
2223

2324
import org.json.JSONObject;
2425

26+
import java.lang.reflect.Method;
2527
import java.util.ArrayList;
2628
import java.util.HashMap;
2729
import java.util.Objects;
@@ -182,41 +184,64 @@ private void callInfo() throws Exception {
182184
if (!prefs.getBoolean("call_info", false))
183185
return;
184186

187+
var clsCallEventCallback = classLoader.loadClass("com.whatsapp.calling.service.VoiceServiceEventCallback");
188+
for (Method method : clsCallEventCallback.getDeclaredMethods()) {
189+
XposedBridge.hookMethod(method, DebugUtils.getDebugMethodHook(false, false, true, true));
190+
}
191+
192+
185193
Class<?> clsWamCall = classLoader.loadClass("com.whatsapp.fieldstats.events.WamCall");
186-
XposedBridge.hookAllMethods(clsWamCall, "serialize",
194+
195+
XposedBridge.hookAllMethods(clsCallEventCallback, "fieldstatsReady",
187196
new XC_MethodHook() {
188197
@Override
189-
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
190-
var wamCall = param.thisObject;
191-
var ip = (String)XposedHelpers.getObjectField(wamCall, "callPeerIpStr");
192-
var platform = (String)XposedHelpers.getObjectField(wamCall, "callPeerPlatform");
193-
CompletableFuture.runAsync(() -> {
194-
try {
195-
showCallInformation(ip, platform);
196-
} catch (Exception e) {
197-
logDebug(e);
198-
}
199-
});
198+
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
199+
if (clsWamCall.isInstance(param.args[0])) {
200+
201+
Object callinfo = XposedHelpers.callMethod(param.thisObject, "getCallInfo");
202+
if (callinfo == null)
203+
return;
204+
var userJid = XposedHelpers.callMethod(callinfo, "getPeerJid");
205+
CompletableFuture.runAsync(() -> {
206+
try {
207+
showCallInformation(param.args[0], userJid);
208+
} catch (Exception e) {
209+
logDebug(e);
210+
}
211+
});
212+
}
200213
}
201214
});
202215
}
203216

204-
private void showCallInformation(String ip, String platform) throws Exception {
205-
var db = new StringBuilder();
217+
private void showCallInformation(Object wamCall, Object userJid) throws Exception {
218+
if (WppCore.isGroup(WppCore.getRawString(userJid)))
219+
return;
220+
var sb = new StringBuilder();
221+
222+
var contact = WppCore.getContactName(userJid);
223+
if (!TextUtils.isEmpty(contact))
224+
sb.append("Contact: ").append(contact).append("\n");
225+
sb.append("Number: ").append("+").append(WppCore.stripJID(WppCore.getRawString(userJid))).append("\n");
226+
227+
var ip = (String) XposedHelpers.getObjectField(wamCall, "callPeerIpStr");
206228
if (ip != null) {
207-
var client = new OkHttpClient();
208-
var url = "http://ip-api.com/json/" + ip;
209-
var request = new okhttp3.Request.Builder().url(url).build();
210-
var content = client.newCall(request).execute().body().string();
211-
var json = new JSONObject(content);
212-
var country = json.getString("country");
213-
var city = json.getString("city");
214-
db.append("Country: ").append(country).append("\n");
215-
db.append("City: ").append(city).append("\n");
229+
var client = new OkHttpClient();
230+
var url = "http://ip-api.com/json/" + ip;
231+
var request = new okhttp3.Request.Builder().url(url).build();
232+
var content = client.newCall(request).execute().body().string();
233+
var json = new JSONObject(content);
234+
var country = json.getString("country");
235+
var city = json.getString("city");
236+
sb.append("Country: ").append(country).append("\n");
237+
sb.append("City: ").append(city).append("\n");
238+
sb.append("IP: ").append(ip).append("\n");
216239
}
217-
db.append("Platform: ").append(platform).append("\n");
218-
db.append("IP: ").append(ip).append("\n");
219-
Utils.showNotification("Call Information", db.toString());
240+
var platform = (String) XposedHelpers.getObjectField(wamCall, "callPeerPlatform");
241+
if (platform != null) sb.append("Platform: ").append(platform).append("\n");
242+
var wppVersion = (String) XposedHelpers.getObjectField(wamCall, "callPeerAppVersion");
243+
if (wppVersion != null) sb.append("WhatsApp Version: ").append(wppVersion).append("\n");
244+
Utils.showNotification("Call Information", sb.toString());
220245
}
221246

222247
private void alwaysOnline() throws Exception {

0 commit comments

Comments
 (0)