Skip to content

Commit 291616d

Browse files
committed
Refactor ShowOnline to use WaContactWpp
1 parent caabe30 commit 291616d

File tree

8 files changed

+120
-32
lines changed

8 files changed

+120
-32
lines changed

app/src/main/java/com/wmods/wppenhacer/xposed/core/FeatureLoader.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.wmods.wppenhacer.xposed.core.components.AlertDialogWpp;
2424
import com.wmods.wppenhacer.xposed.core.components.FMessageWpp;
2525
import com.wmods.wppenhacer.xposed.core.components.SharedPreferencesWrapper;
26+
import com.wmods.wppenhacer.xposed.core.components.WaContactWpp;
2627
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
2728
import com.wmods.wppenhacer.xposed.core.devkit.UnobfuscatorCache;
2829
import com.wmods.wppenhacer.xposed.features.customization.BubbleColors;
@@ -154,8 +155,6 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
154155
throw new Exception(sb);
155156
}
156157
}
157-
WppCore.Initialize(loader, pref);
158-
DesignUtils.setPrefs(pref);
159158
initComponents(loader, pref);
160159
plugins(loader, pref, packageInfo.versionName);
161160
sendEnabledBroadcast(mApp);
@@ -214,9 +213,12 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
214213
}
215214

216215
private static void initComponents(ClassLoader loader, XSharedPreferences pref) throws Exception {
217-
AlertDialogWpp.initDialog(loader);
218216
FMessageWpp.initialize(loader);
217+
WppCore.Initialize(loader, pref);
218+
DesignUtils.setPrefs(pref);
219219
Utils.init(loader);
220+
AlertDialogWpp.initDialog(loader);
221+
WaContactWpp.initialize(loader);
220222
WppCore.addListenerActivity((activity, state) -> {
221223

222224
if (state == WppCore.ActivityChangeState.ChangeType.RESUMED) {

app/src/main/java/com/wmods/wppenhacer/xposed/core/WppCore.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ public class WppCore {
7272

7373
public static void Initialize(ClassLoader loader, XSharedPreferences pref) throws Exception {
7474
privPrefs = Utils.getApplication().getSharedPreferences("WaGlobal", Context.MODE_PRIVATE);
75-
FMessageWpp.initialize(loader);
7675
// init UserJID
7776
var mSendReadClass = Unobfuscator.findFirstClassUsingName(loader, StringMatchType.EndsWith,"SendReadReceiptJob");
7877
var subClass = ReflectionUtils.findConstructorUsingFilter(mSendReadClass, (constructor) -> constructor.getParameterCount() == 8).getParameterTypes()[0];

app/src/main/java/com/wmods/wppenhacer/xposed/core/components/FMessageWpp.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ public UserJid(@Nullable Object lidOrJid) {
270270
}
271271
}
272272

273+
public UserJid(@Nullable Object userJid, Object phoneJid) {
274+
this.userJid = userJid;
275+
this.phoneJid = phoneJid;
276+
}
277+
278+
273279
@Nullable
274280
public String getPhoneRawString() {
275281
if (this.phoneJid == null) return null;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.wmods.wppenhacer.xposed.core.components;
2+
3+
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
4+
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
5+
6+
import java.lang.reflect.Field;
7+
8+
import de.robv.android.xposed.XposedBridge;
9+
10+
public class WaContactWpp {
11+
12+
public static Class<?> TYPE;
13+
private static Field fieldContactData;
14+
private static Field fieldUserJid;
15+
private static Field fieldPhoneUserJid;
16+
private final Object mInstance;
17+
18+
19+
public WaContactWpp(Object object) {
20+
if (TYPE == null) throw new RuntimeException("WaContactWpp not initialized");
21+
if (object == null) throw new RuntimeException("object is null");
22+
this.mInstance = object;
23+
}
24+
25+
public static void initialize(ClassLoader classLoader) {
26+
try {
27+
TYPE = Unobfuscator.loadWaContactClass(classLoader);
28+
var phoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.PhoneUserJid");
29+
if (phoneUserJid == null) {
30+
var contactDataClass = Unobfuscator.loadWaContactData(classLoader);
31+
fieldContactData = ReflectionUtils.getFieldByType(TYPE, contactDataClass);
32+
fieldUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, "com.whatsapp.jid.Jid");
33+
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, "com.whatsapp.jid.PhoneUserJid");
34+
} else {
35+
fieldUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.Jid");
36+
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.PhoneUserJid");
37+
}
38+
} catch (Exception e) {
39+
XposedBridge.log(e);
40+
}
41+
}
42+
43+
public Object getObject() {
44+
return mInstance;
45+
}
46+
47+
48+
public FMessageWpp.UserJid getUserJid() {
49+
try {
50+
if (fieldContactData != null) {
51+
var coreData = fieldContactData.get(mInstance);
52+
return new FMessageWpp.UserJid(fieldUserJid.get(coreData), fieldPhoneUserJid.get(coreData));
53+
}
54+
return new FMessageWpp.UserJid(fieldUserJid.get(mInstance), fieldPhoneUserJid.get(mInstance));
55+
} catch (Exception e) {
56+
XposedBridge.log(e);
57+
}
58+
return null;
59+
}
60+
61+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,4 +2037,8 @@ public static Method loadConvertLidToJid(ClassLoader loader) throws Exception {
20372037
public static Method loadConvertJidToLid(ClassLoader loader) throws Exception {
20382038
return UnobfuscatorCache.getInstance().getMethod(loader, () -> findFirstMethodUsingStrings(loader, StringMatchType.Contains, "WaJidMapRepository/getAccountUserJidByPhoneJid"));
20392039
}
2040+
2041+
public static Class loadWaContactData(ClassLoader classLoader) throws Exception {
2042+
return UnobfuscatorCache.getInstance().getClass(classLoader, () -> findFirstClassUsingStrings(classLoader,StringMatchType.EndsWith,"WaContactData"));
2043+
}
20402044
}

app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/ShowOnline.java

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
import androidx.core.text.TextUtilsCompat;
1717

1818
import com.wmods.wppenhacer.xposed.core.Feature;
19-
import com.wmods.wppenhacer.xposed.core.components.FMessageWpp;
19+
import com.wmods.wppenhacer.xposed.core.components.WaContactWpp;
2020
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
2121
import com.wmods.wppenhacer.xposed.core.devkit.UnobfuscatorCache;
2222
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
2323
import com.wmods.wppenhacer.xposed.utils.ResId;
2424
import com.wmods.wppenhacer.xposed.utils.Utils;
2525

26+
import java.lang.reflect.Method;
2627
import java.util.Locale;
2728

2829
import de.robv.android.xposed.XC_MethodHook;
@@ -130,7 +131,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
130131
var getStatusUser = Unobfuscator.loadStatusUserMethod(classLoader);
131132
logDebug(Unobfuscator.getMethodDescriptor(getStatusUser));
132133
var sendPresenceMethod = Unobfuscator.loadSendPresenceMethod(classLoader);
133-
logDebug(Unobfuscator.getMethodDescriptor(sendPresenceMethod));
134+
logDebug("sendPresenceMethod", Unobfuscator.getMethodDescriptor(sendPresenceMethod));
134135
var tcTokenMethod = Unobfuscator.loadTcTokenMethod(classLoader);
135136
var absViewHolderClass = Unobfuscator.loadAbsViewHolder(classLoader);
136137

@@ -160,6 +161,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
160161
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
161162
var viewHolder = field1.get(param.thisObject);
162163
var object = param.args[0];
164+
var waContact = new WaContactWpp(object);
163165
var viewField = ReflectionUtils.findFieldUsingFilter(absViewHolderClass, field -> field.getType() == View.class);
164166
var view = (View) viewField.get(viewHolder);
165167

@@ -170,41 +172,41 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
170172
csDot.setVisibility(View.INVISIBLE);
171173
}
172174
TextView lastSeenText = showOnlineText ? view.findViewById(0x7FFF0002) : null;
173-
var jidFiled = ReflectionUtils.getFieldByExtendType(object.getClass(), XposedHelpers.findClass("com.whatsapp.jid.Jid", classLoader));
174-
var jidObject = jidFiled.get(object);
175-
var userJid = new FMessageWpp.UserJid(jidObject);
175+
var userJid = waContact.getUserJid();
176176
if (userJid.isGroup() || userJid.isNull()) return;
177177

178178
var tokenDBInstance = fieldTokenDBInstance.get(mInstancePresence);
179-
var tokenData = ReflectionUtils.callMethod(tcTokenMethod, tokenDBInstance, jidObject);
179+
var tokenData = ReflectionUtils.callMethod(tcTokenMethod, tokenDBInstance, userJid.userJid);
180180
var tokenObj = tokenClass.getConstructors()[0].newInstance(tokenData == null ? null : XposedHelpers.getObjectField(tokenData, "A01"));
181181
sendPresenceMethod.invoke(null, userJid.userJid, null, tokenObj, mInstancePresence);
182-
183182
var status = (String) ReflectionUtils.callMethod(getStatusUser, mStatusUser, object, false);
184-
var currentPosition = (int) ReflectionUtils.callMethod(getAdapterPositionMethod, viewHolder);
185-
if (currentPosition != position) return;
186-
if (!TextUtils.isEmpty(status) && status.trim().equals(UnobfuscatorCache.getInstance().getString("online"))) {
187-
if (csDot != null) {
188-
csDot.setVisibility(View.VISIBLE);
189-
}
190-
}
183+
setStatus(getAdapterPositionMethod, viewHolder, position, status, csDot, lastSeenText);
184+
}
185+
});
186+
}
191187

192-
if (lastSeenText != null) {
193-
if (!TextUtils.isEmpty(status)) {
194-
lastSeenText.setText(status);
195-
if (UnobfuscatorCache.getInstance().getString("online").equals(status)) {
196-
lastSeenText.setTextColor(Color.GREEN);
197-
} else {
198-
lastSeenText.setTextColor(0xffcac100);
199-
}
200-
} else {
201-
lastSeenText.setText("");
202-
lastSeenText.setTextColor(Color.GRAY);
203-
}
188+
private static void setStatus(Method getAdapterPositionMethod, Object viewHolder, int position, String status, ImageView csDot, TextView lastSeenText) {
189+
var currentPosition = (int) ReflectionUtils.callMethod(getAdapterPositionMethod, viewHolder);
190+
if (currentPosition != position) return;
191+
if (!TextUtils.isEmpty(status) && status.trim().equals(UnobfuscatorCache.getInstance().getString("online"))) {
192+
if (csDot != null) {
193+
csDot.setVisibility(View.VISIBLE);
194+
}
195+
}
196+
197+
if (lastSeenText != null) {
198+
if (!TextUtils.isEmpty(status)) {
199+
lastSeenText.setText(status);
200+
if (UnobfuscatorCache.getInstance().getString("online").equals(status)) {
201+
lastSeenText.setTextColor(Color.GREEN);
202+
} else {
203+
lastSeenText.setTextColor(0xffcac100);
204204
}
205-
205+
} else {
206+
lastSeenText.setText("");
207+
lastSeenText.setTextColor(Color.GRAY);
206208
}
207-
});
209+
}
208210
}
209211

210212
@NonNull

app/src/main/java/com/wmods/wppenhacer/xposed/features/privacy/HideReceipt.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
5454
}
5555
if (param.args[msgTypeIdx] == "inactive") {
5656
Object fmessageObj = WppCore.getFMessageFromKey(key);
57+
if (fmessageObj == null) return;
5758
var fmessage = new FMessageWpp(fmessageObj);
5859
var messageId = fmessage.getKey().messageID;
5960
MessageHistory.getInstance().insertHideSeenMessage(userJid.getPhoneRawString(), messageId, MessageHistory.MessageType.MESSAGE_TYPE, false);

app/src/main/java/com/wmods/wppenhacer/xposed/utils/ReflectionUtils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ public static List<Field> getFieldsByType(Class<?> cls, Class<?> type) {
145145
return Arrays.stream(cls.getFields()).filter(f -> type == f.getType()).collect(Collectors.toList());
146146
}
147147

148+
public static Field getFieldByExtendType(Class<?> cls, String className) {
149+
if (cls == null) return null;
150+
if (className == null) return null;
151+
return getFieldByExtendType(cls, findClass(className,cls.getClassLoader()));
152+
}
153+
148154
public static Field getFieldByExtendType(Class<?> cls, Class<?> type) {
149155
if (cachePrefs == null) {
150156
return Arrays.stream(cls.getFields()).filter(f -> type.isAssignableFrom(f.getType())).findFirst().orElse(null);
@@ -172,6 +178,13 @@ public static Field getFieldByExtendType(Class<?> cls, Class<?> type) {
172178
return field;
173179
}
174180

181+
public static Field getFieldByType(Class<?> cls, String className) {
182+
if (cls == null) return null;
183+
if (className == null) return null;
184+
return getFieldByType(cls, findClass(className,cls.getClassLoader()));
185+
}
186+
187+
175188
public static Field getFieldByType(Class<?> cls, Class<?> type) {
176189
if (cachePrefs == null) {
177190
return Arrays.stream(cls.getFields()).filter(f -> type == f.getType()).findFirst().orElse(null);

0 commit comments

Comments
 (0)