Skip to content

Commit 0735406

Browse files
authored
Merge pull request #334 from frknkrc44/fix-25-15
Initial support for 25.14 and 25.15
2 parents 1ba1947 + d064bb7 commit 0735406

File tree

8 files changed

+94
-29
lines changed

8 files changed

+94
-29
lines changed

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class WppCore {
6161
private static SQLiteDatabase mWaDatabase;
6262
public static BaseClient client;
6363
private static Object mCachedMessageStore;
64+
private static Class<?> mSettingsNotificationsClass;
6465

6566

6667
public static void Initialize(ClassLoader loader, XSharedPreferences pref) throws Exception {
@@ -77,6 +78,9 @@ public static void Initialize(ClassLoader loader, XSharedPreferences pref) throw
7778
convChatField = Unobfuscator.loadAntiRevokeConvChatField(loader);
7879
chatJidField = Unobfuscator.loadAntiRevokeChatJidField(loader);
7980

81+
// Settings notifications activity (required for ActivityController.EXPORTED_ACTIVITY)
82+
mSettingsNotificationsClass = getSettingsNotificationsActivityClass(loader);
83+
8084
// StartUpPrefs
8185
var startPrefsConfig = Unobfuscator.loadStartPrefsConfig(loader);
8286
XposedBridge.hookMethod(startPrefsConfig, new XC_MethodHook() {
@@ -231,6 +235,41 @@ public synchronized static Class getViewOnceViewerActivityClass(@NonNull ClassLo
231235
: XposedHelpers.findClass("com.whatsapp.viewonce.ui.messaging.ViewOnceViewerActivity", loader);
232236
}
233237

238+
public synchronized static Class getAboutActivityClass(@NonNull ClassLoader loader) {
239+
Class oldClass = XposedHelpers.findClassIfExists("com.whatsapp.settings.About", loader);
240+
241+
return oldClass != null
242+
? oldClass
243+
: XposedHelpers.findClass("com.whatsapp.settings.ui.About", loader);
244+
}
245+
246+
public synchronized static Class getSettingsNotificationsActivityClass(@NonNull ClassLoader loader) {
247+
if (mSettingsNotificationsClass != null)
248+
return mSettingsNotificationsClass;
249+
250+
Class oldClass = XposedHelpers.findClassIfExists("com.whatsapp.settings.SettingsNotifications", loader);
251+
252+
return oldClass != null
253+
? oldClass
254+
: XposedHelpers.findClass("com.whatsapp.settings.ui.SettingsNotifications", loader);
255+
}
256+
257+
public synchronized static Class getDataUsageActivityClass(@NonNull ClassLoader loader) {
258+
Class oldClass = XposedHelpers.findClassIfExists("com.whatsapp.settings.SettingsDataUsageActivity", loader);
259+
260+
return oldClass != null
261+
? oldClass
262+
: XposedHelpers.findClass("com.whatsapp.settings.ui.SettingsDataUsageActivity", loader);
263+
}
264+
265+
public synchronized static Class getTextStatusComposerFragmentClass(@NonNull ClassLoader loader) {
266+
Class oldClass = XposedHelpers.findClassIfExists("com.whatsapp.statuscomposer.composer.TextStatusComposerFragment", loader);
267+
268+
return oldClass != null
269+
? oldClass
270+
: XposedHelpers.findClass("com.whatsapp.status.composer.composer.TextStatusComposerFragment", loader);
271+
}
272+
234273
// public static Activity getActivityBySimpleName(String name) {
235274
// for (var activity : activities) {
236275
// if (activity.getClass().getSimpleName().equals(name)) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,7 @@ public synchronized static Method loadAudioProximitySensorMethod(ClassLoader loa
13561356

13571357
public synchronized static Method loadGroupAdminMethod(ClassLoader loader) throws Exception {
13581358
var method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "P Message");
1359+
if (method == null) method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "ConversationRow/setUpUsernameInGroupViewContainer/not allowed state");
13591360
if (method == null) throw new RuntimeException("GroupAdmin method not found");
13601361
return method;
13611362
}
@@ -1624,7 +1625,7 @@ public synchronized static Method loadTextStatusComposer2(ClassLoader classLoade
16241625
addMethod(MethodMatcher.create().paramCount(1).addParamType(TextDataClass))
16251626
));
16261627
if (result.isEmpty()) {
1627-
var tscClazzData = dexkit.getClassData("com.whatsapp.statuscomposer.composer.TextStatusComposerFragment");
1628+
var tscClazzData = dexkit.getClassData(WppCore.getTextStatusComposerFragmentClass(classLoader));
16281629
if (tscClazzData != null) {
16291630
for (var method : tscClazzData.getMethods()) {
16301631
var tdMethod = method.getInvokes().stream().filter(m -> m.isMethod() && m.getParamCount() == 1 && m.getParamTypes().get(0).equals(dexkit.getClassData(TextDataClass))).findFirst();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
7777
}
7878
});
7979

80-
XposedHelpers.findAndHookMethod("com.whatsapp.settings.About", classLoader, "onCreate", classLoader.loadClass("android.os.Bundle"),
80+
XposedHelpers.findAndHookMethod(WppCore.getAboutActivityClass(classLoader), "onCreate", classLoader.loadClass("android.os.Bundle"),
8181
new XC_MethodHook() {
8282
@SuppressLint("SetTextI18n")
8383
@Override

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

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -74,30 +74,51 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
7474
}
7575
if (showOnlineIcon) {
7676
var contactView = (FrameLayout) view.findViewById(Utils.getID("contact_selector", "id"));
77-
var photoView = (ImageView) contactView.getChildAt(0);
78-
contactView.removeView(photoView);
79-
80-
var relativeLayout = new RelativeLayout(context);
81-
relativeLayout.setId(0x7FFF0003);
82-
var params = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
83-
params.addRule(RelativeLayout.CENTER_IN_PARENT);
84-
photoView.setLayoutParams(params);
85-
relativeLayout.addView(photoView);
86-
contactView.addView(relativeLayout);
77+
var firstChild = contactView.getChildAt(0);
8778
var isLeftToRight = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_LTR;
88-
89-
var imageView = new ImageView(context);
90-
imageView.setId(0x7FFF0001);
91-
var params2 = new RelativeLayout.LayoutParams(Utils.dipToPixels(14), Utils.dipToPixels(14));
92-
params2.addRule(RelativeLayout.ALIGN_TOP, contactView.getId());
93-
params2.addRule(isLeftToRight ? RelativeLayout.ALIGN_RIGHT : RelativeLayout.ALIGN_LEFT, photoView.getId());
94-
params2.topMargin = Utils.dipToPixels(5);
95-
imageView.setLayoutParams(params2);
96-
imageView.setImageResource(ResId.drawable.online);
97-
imageView.setAdjustViewBounds(true);
98-
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
99-
imageView.setVisibility(View.INVISIBLE);
100-
relativeLayout.addView(imageView);
79+
if (firstChild instanceof ImageView photoView) {
80+
contactView.removeView(photoView);
81+
82+
var relativeLayout = new RelativeLayout(context);
83+
relativeLayout.setId(0x7FFF0003);
84+
var params = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
85+
params.addRule(RelativeLayout.CENTER_IN_PARENT);
86+
photoView.setLayoutParams(params);
87+
relativeLayout.addView(photoView);
88+
contactView.addView(relativeLayout);
89+
90+
var imageView = new ImageView(context);
91+
imageView.setId(0x7FFF0001);
92+
var params2 = new RelativeLayout.LayoutParams(Utils.dipToPixels(14), Utils.dipToPixels(14));
93+
params2.addRule(RelativeLayout.ALIGN_TOP, contactView.getId());
94+
params2.addRule(isLeftToRight ? RelativeLayout.ALIGN_RIGHT : RelativeLayout.ALIGN_LEFT, photoView.getId());
95+
params2.topMargin = Utils.dipToPixels(5);
96+
imageView.setLayoutParams(params2);
97+
imageView.setImageResource(ResId.drawable.online);
98+
imageView.setAdjustViewBounds(true);
99+
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
100+
imageView.setVisibility(View.INVISIBLE);
101+
relativeLayout.addView(imageView);
102+
} else if (firstChild instanceof RelativeLayout relativeLayout) {
103+
var photoView = (ImageView) relativeLayout.getChildAt(0);
104+
105+
var params = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
106+
params.addRule(RelativeLayout.CENTER_IN_PARENT);
107+
photoView.setLayoutParams(params);
108+
109+
var imageView = new ImageView(context);
110+
imageView.setId(0x7FFF0001);
111+
var params2 = new RelativeLayout.LayoutParams(Utils.dipToPixels(14), Utils.dipToPixels(14));
112+
params2.addRule(RelativeLayout.ALIGN_TOP, contactView.getId());
113+
params2.addRule(isLeftToRight ? RelativeLayout.ALIGN_RIGHT : RelativeLayout.ALIGN_LEFT, photoView.getId());
114+
params2.topMargin = Utils.dipToPixels(5);
115+
imageView.setLayoutParams(params2);
116+
imageView.setImageResource(ResId.drawable.online);
117+
imageView.setAdjustViewBounds(true);
118+
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
119+
imageView.setVisibility(View.INVISIBLE);
120+
relativeLayout.addView(imageView);
121+
}
101122
}
102123
}
103124
});
@@ -144,7 +165,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
144165

145166
var getAdapterPositionMethod = ReflectionUtils.findMethodUsingFilter(absViewHolderClass, method -> method.getParameterCount() == 0 && method.getReturnType() == int.class);
146167
var position = (int) ReflectionUtils.callMethod(getAdapterPositionMethod, viewHolder);
147-
ImageView csDot = showOnlineIcon ? view.findViewById(0x7FFF0003).findViewById(0x7FFF0001) : null;
168+
ImageView csDot = showOnlineIcon ? view.findViewById(0x7FFF0001) : null;
148169
if (showOnlineIcon) {
149170
csDot.setVisibility(View.INVISIBLE);
150171
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
558558
private void hookProps() throws Exception {
559559
var methodPropsBoolean = Unobfuscator.loadPropsBooleanMethod(classLoader);
560560
logDebug(Unobfuscator.getMethodDescriptor(methodPropsBoolean));
561-
var dataUsageActivityClass = XposedHelpers.findClass("com.whatsapp.settings.SettingsDataUsageActivity", classLoader);
561+
var dataUsageActivityClass = WppCore.getDataUsageActivityClass(classLoader);
562562
XposedBridge.hookMethod(methodPropsBoolean, new XC_MethodHook() {
563563
@Override
564564
protected void afterHookedMethod(MethodHookParam param) throws Throwable {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
public class ActivityController extends Feature {
3232

33-
public static final String EXPORTED_ACTIVITY = "com.whatsapp.settings.SettingsNotifications";
33+
public static final String EXPORTED_ACTIVITY = WppCore.getSettingsNotificationsActivityClass(ClassLoader.getSystemClassLoader()).getName();
3434
private static String Key;
3535

3636
public ActivityController(@NonNull ClassLoader classLoader, @NonNull XSharedPreferences preferences) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
6060
});
6161
}
6262

63-
var clazz = XposedHelpers.findClass("com.whatsapp.statuscomposer.composer.TextStatusComposerFragment", classLoader);
63+
var clazz = WppCore.getTextStatusComposerFragmentClass(classLoader);
6464
var methodOnCreate = ReflectionUtils.findMethodUsingFilter(clazz, method -> method.getParameterCount() == 2 && method.getParameterTypes()[0] == Bundle.class && method.getParameterTypes()[1] == View.class);
6565
XposedBridge.hookMethod(methodOnCreate,
6666
new XC_MethodHook() {

app/src/main/res/values/arrays.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@
128128
<item>2.25.11.xx</item>
129129
<item>2.25.12.xx</item>
130130
<item>2.25.13.xx</item>
131+
<item>2.25.14.xx</item>
132+
<item>2.25.15.xx</item>
131133
</string-array>
132134
<string-array name="supported_versions_business">
133135
<item>2.25.5.xx</item>
@@ -139,6 +141,8 @@
139141
<item>2.25.11.xx</item>
140142
<item>2.25.12.xx</item>
141143
<item>2.25.13.xx</item>
144+
<item>2.25.14.xx</item>
145+
<item>2.25.15.xx</item>
142146
</string-array>
143147
<string-array name="image_picker">
144148
<item>image/*</item>

0 commit comments

Comments
 (0)