1010import com .wmods .wppenhacer .xposed .core .devkit .Unobfuscator ;
1111import com .wmods .wppenhacer .xposed .utils .ReflectionUtils ;
1212
13+ import java .util .Set ;
14+
1315import de .robv .android .xposed .XC_MethodHook ;
1416import de .robv .android .xposed .XSharedPreferences ;
1517import de .robv .android .xposed .XposedBridge ;
@@ -28,6 +30,8 @@ public void doHook() throws Throwable {
2830
2931 var chatLimitDeleteMethod = Unobfuscator .loadChatLimitDeleteMethod (classLoader );
3032 var chatLimitDelete2Method = Unobfuscator .loadChatLimitDelete2Method (classLoader );
33+ var fmessageTimestampMethod = Unobfuscator .loadFmessageTimestampField (classLoader );
34+
3135 var epUpdateMethod = Unobfuscator .loadEphemeralInsertdb (classLoader );
3236
3337 XposedHelpers .findAndHookMethod ("com.whatsapp.HomeActivity" , classLoader , "onCreate" , Bundle .class , new XC_MethodHook () {
@@ -57,14 +61,45 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
5761// Others.propsInteger.put(3272, Integer.MAX_VALUE);
5862// }
5963
60- XposedBridge .hookMethod (chatLimitDeleteMethod , new XC_MethodHook () {
61- @ Override
62- protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
63- if (ReflectionUtils .isCalledFromMethod (chatLimitDelete2Method ) && revokeallmessages ) {
64- param .setResult (0L );
64+
65+ if (revokeallmessages ) {
66+ XposedBridge .hookMethod (chatLimitDelete2Method , new XC_MethodHook () {
67+ private Unhook unhooked ;
68+
69+ @ Override
70+ protected void beforeHookedMethod (MethodHookParam param ) throws Throwable {
71+ var list = ReflectionUtils .findArrayOfType (param .args , Set .class );
72+ if (list .isEmpty ()) return ;
73+ var listMessages = (Set ) list .get (0 ).second ;
74+ var isExpired = false ;
75+ for (var fmessageObj : listMessages ) {
76+ var timestamp = fmessageTimestampMethod .getLong (fmessageObj );
77+ // verify message is expired (max: 3 days)
78+ if (System .currentTimeMillis () - timestamp > 3 * 24 * 60 * 60 * 1000 ) {
79+ isExpired = true ;
80+ break ;
81+ }
82+ }
83+ if (!isExpired ) {
84+ unhooked = XposedBridge .hookMethod (chatLimitDeleteMethod , new XC_MethodHook () {
85+ @ Override
86+ protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
87+ if (ReflectionUtils .isCalledFromMethod (chatLimitDelete2Method )) {
88+ param .setResult (0L );
89+ }
90+ }
91+ });
92+ }
6593 }
66- }
67- });
94+
95+ @ Override
96+ protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
97+ if (unhooked != null ) {
98+ unhooked .unhook ();
99+ }
100+ }
101+ });
102+ }
68103
69104 var seeMoreMethod = Unobfuscator .loadSeeMoreConstructor (classLoader );
70105 XposedBridge .hookMethod (seeMoreMethod , new XC_MethodHook () {
0 commit comments