Skip to content

Commit b105574

Browse files
committed
Fix bug in change color of StatusComposer
Signed-off-by: Dev4Mod <[email protected]>
1 parent bbf6418 commit b105574

File tree

2 files changed

+41
-21
lines changed

2 files changed

+41
-21
lines changed

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

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public synchronized static Field loadBroadcastTagField(ClassLoader classLoader)
226226
return UnobfuscatorCache.getInstance().getField(classLoader, () -> {
227227
var fmessage = loadFMessageClass(classLoader);
228228
var clazzData = dexkit.findClass(FindClass.create().matcher(ClassMatcher.create().addUsingString("UPDATE_MESSAGE_MAIN_BROADCAST_SCAN_SQL")));
229-
if (clazzData.isEmpty()) return new Exception("BroadcastTag class not found");
229+
if (clazzData.isEmpty()) throw new Exception("BroadcastTag class not found");
230230
var methodData = dexkit.findMethod(FindMethod.create().searchInClass(clazzData).matcher(MethodMatcher.create().usingStrings("participant_hash", "view_mode", "broadcast")));
231231
if (methodData.isEmpty()) throw new Exception("BroadcastTag method support not found");
232232
var usingFields = methodData.get(0).getUsingFields();
@@ -700,7 +700,7 @@ public synchronized static Field loadAntiRevokeConvChatField(ClassLoader loader)
700700

701701
public synchronized static Field loadAntiRevokeChatJidField(ClassLoader loader) throws Exception {
702702
return UnobfuscatorCache.getInstance().getField(loader, () -> {
703-
Class<?> chatClass = findFirstClassUsingStrings(loader, StringMatchType.Contains, "payment_chat_composer_entry_nux_shown");
703+
Class<?> chatClass = findFirstClassUsingStrings(loader, StringMatchType.Contains, "conversation/createconversation");
704704
Class<?> jidClass = XposedHelpers.findClass("com.whatsapp.jid.Jid", loader);
705705
Field field = ReflectionUtils.getFieldByExtendType(chatClass, jidClass);
706706
if (field == null) throw new Exception("AntiRevokeChatJid field not found");
@@ -1585,22 +1585,10 @@ public synchronized static Class loadListChannelItemClass(ClassLoader classLoade
15851585
}
15861586

15871587
public synchronized static Method loadTextStatusComposer(ClassLoader classLoader) throws Exception {
1588-
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> {
1589-
var method1 = View.class.getDeclaredMethod("setBackgroundColor", int.class);
1590-
Class<?> TextStatusComposerFragmentClass = classLoader.loadClass("com.whatsapp.statuscomposer.composer.TextStatusComposerFragment");
1591-
var fieldInt = ReflectionUtils.findFieldUsingFilter(TextStatusComposerFragmentClass, field -> field.getType() == int.class);
1592-
var classData = dexkit.getClassData(TextStatusComposerFragmentClass);
1593-
if (classData == null) throw new RuntimeException("TextStatusComposer class not found");
1594-
1595-
var methods = classData.findMethod(FindMethod.create().matcher(MethodMatcher.create()
1596-
.addInvoke(DexSignUtil.getMethodDescriptor(method1))
1597-
.addUsingField(DexSignUtil.getFieldDescriptor(fieldInt))
1598-
.modifiers(Modifier.PUBLIC | Modifier.STATIC)
1599-
));
1600-
if (methods.isEmpty())
1601-
throw new RuntimeException("TextStatusComposer method not found");
1602-
return methods.get(methods.size() - 1).getMethodInstance(classLoader);
1603-
});
1588+
var methods = dexkit.findMethod(FindMethod.create().matcher(MethodMatcher.create().addUsingString("background_color_key", StringMatchType.Equals).paramCount(1)));
1589+
if (methods.isEmpty())
1590+
return null;
1591+
return methods.single().getMethodInstance(classLoader);
16041592
}
16051593

16061594
public synchronized static Method loadTextStatusComposer2(ClassLoader classLoader) throws Exception {

app/src/main/java/com/wmods/wppenhacer/xposed/features/others/TextStatusComposer.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.wmods.wppenhacer.xposed.features.others;
22

3+
import android.graphics.drawable.ColorDrawable;
34
import android.os.Bundle;
45
import android.view.View;
56
import android.widget.EditText;
@@ -11,6 +12,7 @@
1112
import com.wmods.wppenhacer.xposed.core.WppCore;
1213
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
1314
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
15+
import com.wmods.wppenhacer.xposed.utils.ResId;
1416
import com.wmods.wppenhacer.xposed.utils.Utils;
1517

1618
import java.lang.reflect.Field;
@@ -23,6 +25,7 @@
2325

2426
public class TextStatusComposer extends Feature {
2527
private static final AtomicReference<ColorData> colorData = new AtomicReference<>();
28+
private static final AtomicReference<Object> textComposerModel = new AtomicReference<>();
2629

2730
public TextStatusComposer(@NonNull ClassLoader classLoader, @NonNull XSharedPreferences preferences) {
2831
super(classLoader, preferences);
@@ -34,6 +37,27 @@ public void doHook() throws Throwable {
3437

3538
var setColorTextComposer = Unobfuscator.loadTextStatusComposer(classLoader);
3639
log("setColorTextComposer: " + Unobfuscator.getMethodDescriptor(setColorTextComposer));
40+
41+
if (setColorTextComposer != null) {
42+
XposedBridge.hookAllConstructors(setColorTextComposer.getDeclaringClass(), new XC_MethodHook() {
43+
@Override
44+
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
45+
textComposerModel.set(param.thisObject);
46+
}
47+
});
48+
var arrMethod = ReflectionUtils.findMethodUsingFilter(setColorTextComposer.getDeclaringClass(), method -> method.getParameterCount() == 1 && method.getParameterTypes()[0] == int.class && method.getReturnType() == int.class);
49+
XposedBridge.hookMethod(arrMethod, new XC_MethodHook() {
50+
@Override
51+
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
52+
try {
53+
param.setResult(XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args));
54+
} catch (Exception e) {
55+
param.setResult(ResId.string.app_name);
56+
}
57+
}
58+
});
59+
}
60+
3761
var clazz = XposedHelpers.findClass("com.whatsapp.statuscomposer.composer.TextStatusComposerFragment", classLoader);
3862
var methodOnCreate = ReflectionUtils.findMethodUsingFilter(clazz, method -> method.getParameterCount() == 2 && method.getParameterTypes()[0] == Bundle.class && method.getParameterTypes()[1] == View.class);
3963
XposedBridge.hookMethod(methodOnCreate,
@@ -49,9 +73,17 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
4973
pickerColor.setOnLongClickListener(v -> {
5074
var dialog = new SimpleColorPickerDialog(activity, color -> {
5175
try {
52-
Field fieldInt = ReflectionUtils.findFieldUsingFilter(param.thisObject.getClass(), field -> field.getType() == int.class);
53-
fieldInt.setInt(param.thisObject, color);
54-
ReflectionUtils.callMethod(setColorTextComposer, null, param.thisObject);
76+
if (setColorTextComposer != null) {
77+
var mInstance = textComposerModel.get();
78+
ReflectionUtils.callMethod(setColorTextComposer, mInstance, color);
79+
} else {
80+
Field fieldInt = ReflectionUtils.getFieldByType(param.thisObject.getClass(), int.class);
81+
fieldInt.setInt(param.thisObject, color);
82+
}
83+
activity.getWindow().setBackgroundDrawable(new ColorDrawable(color));
84+
var controls = viewRoot.findViewById(Utils.getID("controls", "id"));
85+
controls.setBackgroundColor(color);
86+
5587
} catch (Exception e) {
5688
log(e);
5789
}

0 commit comments

Comments
 (0)