-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathchanges.patch
More file actions
2302 lines (2147 loc) · 124 KB
/
changes.patch
File metadata and controls
2302 lines (2147 loc) · 124 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
diff --git a/app/src/main/java/com/waenhancer/UpdateChecker.java b/app/src/main/java/com/waenhancer/UpdateChecker.java
index 9f178f18..08115e85 100644
--- a/app/src/main/java/com/waenhancer/UpdateChecker.java
+++ b/app/src/main/java/com/waenhancer/UpdateChecker.java
@@ -234,7 +234,7 @@ public class UpdateChecker implements Runnable {
}
} catch (Exception e) {
String errMsg = "[UpdateChecker] Exception: " + e.getMessage();
- XposedBridge.log("[" + TAG + "] " + errMsg);
+
writeDebugLog(errMsg);
}
}
diff --git a/app/src/main/java/com/waenhancer/WppXposed.java b/app/src/main/java/com/waenhancer/WppXposed.java
index 7e485667..e670398f 100644
--- a/app/src/main/java/com/waenhancer/WppXposed.java
+++ b/app/src/main/java/com/waenhancer/WppXposed.java
@@ -61,21 +61,21 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] handleLoadPackage: " + lpparam.packageName + " (process: " + lpparam.processName + ")");
+
}
var packageName = lpparam.packageName;
var classLoader = lpparam.classLoader;
if (packageName.equals(BuildConfig.APPLICATION_ID)) {
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Hooking module's own process: " + packageName);
+
}
XposedHelpers.findAndHookMethod("com.waenhancer.utils.ModuleStatus", lpparam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
return;
}
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Checking if target is WhatsApp or Business");
+
}
AntiUpdater.hookSession(lpparam);
@@ -90,12 +90,12 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
boolean isOriginal = App.isOriginalPackage();
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] isWpp: " + isWpp + ", isBusiness: " + isBusiness + ", isOriginal: " + isOriginal);
+
}
if ((isWpp && isOriginal) || isBusiness) {
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Target verified. Starting FeatureLoader...");
+
}
// Initialize module resources early
@@ -115,14 +115,14 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
}
} else {
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Logging hooks skipped (logging_enabled=false)");
+
}
}
try {
FeatureLoader.start(classLoader, getPref(), lpparam.appInfo.sourceDir);
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] FeatureLoader.start completed successfully");
+
}
} catch (Throwable t) {
XposedBridge.log("[WAEX] CRITICAL ERROR in FeatureLoader.start: " + t.getMessage());
@@ -187,7 +187,7 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
}
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Global resource translation hooks installed.");
+
}
}
@@ -337,7 +337,7 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
}
}
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Valid module IDs populated: " + XResManager.validModuleIds.size());
+
}
} catch (Throwable t) {
XposedBridge.log("[WAEX] Error populating valid IDs: " + t.getMessage());
@@ -365,7 +365,7 @@ public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackage
}
}
if (Utils.DEBUG) {
- XposedBridge.log("[WAEX] Background resource mapping complete. Total: " + XResManager.moduleToHostIdMap.size());
+
}
} catch (Throwable t) {
XposedBridge.log("[WAEX] Resource mapping background error: " + t.getMessage());
diff --git a/app/src/main/java/com/waenhancer/activities/CallRecordingSettingsActivity.java b/app/src/main/java/com/waenhancer/activities/CallRecordingSettingsActivity.java
index df223ec6..e5d94f24 100644
--- a/app/src/main/java/com/waenhancer/activities/CallRecordingSettingsActivity.java
+++ b/app/src/main/java/com/waenhancer/activities/CallRecordingSettingsActivity.java
@@ -99,7 +99,7 @@ public class CallRecordingSettingsActivity extends BaseActivity {
} else {
prefs.edit().putBoolean("call_recording_use_root", false).apply();
setModeSelection(false);
- Log.d(TAG, "Root denied, output: " + output);
+
Toast.makeText(this, R.string.root_access_denied, Toast.LENGTH_LONG).show();
}
});
diff --git a/app/src/main/java/com/waenhancer/receivers/TaskerMessageSentReceiver.java b/app/src/main/java/com/waenhancer/receivers/TaskerMessageSentReceiver.java
index 3accf305..0e92a0dc 100644
--- a/app/src/main/java/com/waenhancer/receivers/TaskerMessageSentReceiver.java
+++ b/app/src/main/java/com/waenhancer/receivers/TaskerMessageSentReceiver.java
@@ -10,18 +10,18 @@ public class TaskerMessageSentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- Log.d(TAG, "TaskerMessageSentReceiver onReceive triggered");
+
if (intent == null) return;
String number = intent.getStringExtra("number");
String message = intent.getStringExtra("message");
if (number == null || message == null) {
- Log.d(TAG, "Aborting: number or message is null");
+
return;
}
- Log.d(TAG, "Forwarding com.waenhancer.MESSAGE_SENT: number=" + number + ", message=" + message);
+
// Forward broadcast to WhatsApp packages for handling inside the hooked process
forwardBroadcast(context, "com.whatsapp", number, message);
diff --git a/app/src/main/java/com/waenhancer/services/LogService.java b/app/src/main/java/com/waenhancer/services/LogService.java
index 6c046f99..7ba8bc16 100644
--- a/app/src/main/java/com/waenhancer/services/LogService.java
+++ b/app/src/main/java/com/waenhancer/services/LogService.java
@@ -49,7 +49,7 @@ public class LogService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && ACTION_STOP.equals(intent.getAction())) {
- Log.d(TAG, "Stop action received via intent");
+
LogManager.setLoggingEnabled(this, false);
stopSelf();
return START_NOT_STICKY;
@@ -59,7 +59,7 @@ public class LogService extends Service {
isRunning = true;
startForeground(NOTIFICATION_ID, createNotification());
startStreaming();
- Log.d(TAG, "LogService started");
+
}
return START_STICKY;
diff --git a/app/src/main/java/com/waenhancer/ui/fragments/HomeFragment.java b/app/src/main/java/com/waenhancer/ui/fragments/HomeFragment.java
index 627d8f29..0114685a 100644
--- a/app/src/main/java/com/waenhancer/ui/fragments/HomeFragment.java
+++ b/app/src/main/java/com/waenhancer/ui/fragments/HomeFragment.java
@@ -71,7 +71,7 @@ public class HomeFragment extends BaseFragment {
@Override
public void onReceive(Context context, Intent intent) {
String pkg = intent.getStringExtra("PKG");
- Log.d("WAE_STATUS", "Received RECEIVER_WPP broadcast from: " + pkg);
+
try {
if (FeatureLoader.PACKAGE_WPP.equals(pkg))
receiverBroadcastWpp(context, intent);
@@ -536,7 +536,7 @@ public class HomeFragment extends BaseFragment {
boolean hookEnabled = com.waenhancer.utils.ModuleStatus.isModuleActive();
boolean heartbeatEnabled = hasRecentModuleHeartbeat();
- Log.d("WAE_STATUS", "checkStateWpp: framework=" + frameworkPresent + ", hook=" + hookEnabled + ", heartbeat=" + heartbeatEnabled);
+
updateModuleStatusUi(frameworkPresent, hookEnabled, heartbeatEnabled);
@@ -690,7 +690,7 @@ public class HomeFragment extends BaseFragment {
}
private static void checkWpp(FragmentActivity activity) {
- Log.d("WAE_STATUS", "Sending CHECK_WPP broadcast to " + BuildConfig.APPLICATION_ID);
+
Intent checkWpp = new Intent(BuildConfig.APPLICATION_ID + ".CHECK_WPP");
// Ensure broadcast reaches WhatsApp even if it is in background/stopped state (Android 14+)
checkWpp.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
@@ -769,7 +769,7 @@ public class HomeFragment extends BaseFragment {
long diff = System.currentTimeMillis() - lastSeen;
// Expiry threshold: 24 hours for persistent status even if WhatsApp is force-stopped
boolean active = diff < 24 * 60 * 60 * 1000L;
- Log.v("WAE_STATUS", "Heartbeat check: lastSeen=" + lastSeen + ", diff=" + (diff/1000) + "s, active=" + active);
+
return active;
}
diff --git a/app/src/main/java/com/waenhancer/ui/fragments/base/BasePreferenceFragment.java b/app/src/main/java/com/waenhancer/ui/fragments/base/BasePreferenceFragment.java
index fcb7202d..582ada69 100644
--- a/app/src/main/java/com/waenhancer/ui/fragments/base/BasePreferenceFragment.java
+++ b/app/src/main/java/com/waenhancer/ui/fragments/base/BasePreferenceFragment.java
@@ -193,7 +193,7 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, @Nullable String s) {
- android.util.Log.d("WAE_Manager", "onSharedPreferenceChanged: " + s);
+
if (Objects.equals(s, "release_channel")) {
String channel = mPrefs.getString("release_channel", "stable");
WppCore.setPrivString("release_channel", channel);
@@ -213,7 +213,7 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat
s.equals("open_wae");
if (!isInternalKey) {
- android.util.Log.d("WAE_Manager", "Setting need_restart = true due to change in: " + s);
+
// Track what changed for the restart dialog
try {
@@ -239,10 +239,10 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat
private void scheduleRestartBroadcast() {
if (!isResumed()) {
- android.util.Log.d("WAE_Manager", "scheduleRestartBroadcast: Fragment not resumed, skipping");
+
return;
}
- android.util.Log.d("WAE_Manager", "scheduleRestartBroadcast: Scheduling MANUAL_RESTART broadcast in 250ms");
+
restartBroadcastHandler.removeCallbacks(restartBroadcastRunnable);
restartBroadcastHandler.postDelayed(restartBroadcastRunnable, 250);
}
diff --git a/app/src/main/java/com/waenhancer/xposed/bridge/ScopeHook.java b/app/src/main/java/com/waenhancer/xposed/bridge/ScopeHook.java
index af19c7d7..07941e51 100644
--- a/app/src/main/java/com/waenhancer/xposed/bridge/ScopeHook.java
+++ b/app/src/main/java/com/waenhancer/xposed/bridge/ScopeHook.java
@@ -52,7 +52,7 @@ public class ScopeHook {
if ("getHookBinder".equals(arg)) {
Method mGetContext = param.thisObject.getClass().getMethod("getContext");
Context context = (Context) mGetContext.invoke(param.thisObject);
- XposedBridge.log("WaEnhancer X: Trying to allow blocking ");
+
try {
XposedHelpers.callStaticMethod(Binder.class, "allowBlockingForCurrentThread");
} catch (Throwable ignored) {
@@ -66,7 +66,7 @@ public class ScopeHook {
XposedHelpers.callStaticMethod(Binder.class, "defaultBlockingForCurrentThread");
} catch (Throwable ignored) {
}
- XposedBridge.log("WaEnhancer X: Bypass Scope using Provider Settings");
+
}
}
} catch (Throwable ex) {
@@ -96,7 +96,7 @@ public class ScopeHook {
}
private static void hookScope(Object pms, ClassLoader loader) {
- XposedBridge.log("Hooked visibility Scope");
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
hook = XposedBridge.hookAllMethods(XposedHelpers.findClass("com.android.server.pm.AppsFilterBase", loader), "shouldFilterApplication", new XC_MethodHook() {
@Override
diff --git a/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderClient.java b/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderClient.java
index 7551afcf..d3c5359e 100644
--- a/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderClient.java
+++ b/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderClient.java
@@ -63,7 +63,7 @@ public class ProviderClient extends BaseClient {
if (binder != null) {
service = WaeIIFace.Stub.asInterface(binder);
if (service != null && service.asBinder().pingBinder()) {
- XposedBridge.log("" + service);
+
connected = true;
}
diff --git a/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderSharedPreferences.java b/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderSharedPreferences.java
index c23b0402..414f6bcc 100644
--- a/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderSharedPreferences.java
+++ b/app/src/main/java/com/waenhancer/xposed/bridge/client/ProviderSharedPreferences.java
@@ -32,7 +32,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
private final SharedPreferences fallbackPrefs;
public ProviderSharedPreferences(Context context, SharedPreferences localPrefs, SharedPreferences fallbackPrefs) {
- Utils.log("[WAEX] ProviderSharedPreferences: Initializing...");
+
this.context = context;
this.localPrefs = localPrefs;
this.fallbackPrefs = fallbackPrefs;
@@ -46,13 +46,13 @@ public class ProviderSharedPreferences implements SharedPreferences {
} catch (Throwable t) {
Utils.log("[WAEX] ProviderSharedPreferences: Observer registration critical failure: " + t.getMessage());
}
- Utils.log("[WAEX] ProviderSharedPreferences: Initialization complete. Local cache size: " + localPrefs.getAll().size());
+
}
private void registerObserver() {
String authority = BuildConfig.APPLICATION_ID + AUTHORITY_SUFFIX;
try {
- Utils.log("[WAEX] ProviderSharedPreferences: Registering observer for authority: " + authority);
+
context.getContentResolver().registerContentObserver(
Uri.parse("content://" + authority + "/preferences"),
true,
@@ -63,13 +63,13 @@ public class ProviderSharedPreferences implements SharedPreferences {
long now = System.currentTimeMillis();
if (now - lastHydration > 500) {
lastHydration = now;
- Utils.log("[WAEX] ProviderSharedPreferences: Preferences changed, re-hydrating...");
+
hydrateFromProvider();
}
}
}
);
- Utils.log("[WAEX] ProviderSharedPreferences: Observer registered successfully");
+
} catch (Throwable e) {
Utils.log("[WAEX] ProviderSharedPreferences: Failed to register observer: " + e.getMessage());
// Try legacy
@@ -171,7 +171,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
}
public void reload() {
- Utils.log("[WAEX] ProviderSharedPreferences: Manual reload requested");
+
hydrateFromProvider();
}
@@ -201,11 +201,11 @@ public class ProviderSharedPreferences implements SharedPreferences {
}
lastHydrationTime = now;
try {
- Utils.log("[WAEX] ProviderSharedPreferences: Starting hydration...");
+
Bundle result = callProvider("get_all_preferences", null);
if (result == null) {
- Utils.log("[WAEX] ProviderSharedPreferences: Hydration failed (null result). Using fallback.");
- Utils.log("[WAEX] ProviderSharedPreferences: Fallback cache size: " + fallbackPrefs.getAll().size());
+
+
var editor = localPrefs.edit().clear();
for (Map.Entry<String, ?> entry : fallbackPrefs.getAll().entrySet()) {
Object value = entry.getValue();
@@ -218,7 +218,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
editor.commit();
return;
}
- Utils.log("[WAEX] ProviderSharedPreferences: Received preferences bundle from provider");
+
Serializable serializable = result.getSerializable("prefs");
if (!(serializable instanceof Map)) {
android.util.Log.e("WAE", "Hydration failed: result 'prefs' is not a Map (type: " + (serializable != null ? serializable.getClass().getName() : "null") + ")");
@@ -226,7 +226,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
}
Map<?, ?> rawMap = (Map<?, ?>) serializable;
- android.util.Log.i("WAE", "Hydrating " + rawMap.size() + " preferences from provider");
+
var editor = localPrefs.edit().clear();
for (Map.Entry<?, ?> entry : rawMap.entrySet()) {
if (!(entry.getKey() instanceof String)) {
@@ -270,7 +270,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
}
}
editor.commit();
- android.util.Log.i("WAE", "Hydration completed successfully");
+
} catch (Exception e) {
android.util.Log.e("WAE", "Hydration failed with exception: " + e.getMessage(), e);
}
@@ -284,7 +284,7 @@ public class ProviderSharedPreferences implements SharedPreferences {
}
private void syncToProvider(String key, Object value) {
- de.robv.android.xposed.XposedBridge.log("[WAEX] ProviderSharedPreferences: Putting preference: " + key + " = " + value);
+ de.robv.android.xposed.
Bundle extras = new Bundle();
extras.putString("key", key);
if (value instanceof String) {
@@ -393,17 +393,17 @@ public class ProviderSharedPreferences implements SharedPreferences {
String[] authorities = new String[] { BuildConfig.APPLICATION_ID + AUTHORITY_SUFFIX, AUTHORITY_LEGACY, "com.waenhancer.provider" };
for (String authority : authorities) {
try {
- Utils.log("[WAEX] ProviderSharedPreferences: Calling provider: " + method + " (Authority: " + authority + ")");
+
Bundle result = context.getContentResolver().call(
Uri.parse("content://" + authority),
method,
null,
extras);
if (result != null) {
- Utils.log("[WAEX] ProviderSharedPreferences: Call successful for: " + authority);
+
return result;
} else {
- Utils.log("[WAEX] ProviderSharedPreferences: Call returned null for: " + authority);
+
}
} catch (Throwable e) {
Utils.log("[WAEX] ProviderSharedPreferences: Call error (" + authority + "): " + e.getMessage());
diff --git a/app/src/main/java/com/waenhancer/xposed/bridge/providers/HookProvider.java b/app/src/main/java/com/waenhancer/xposed/bridge/providers/HookProvider.java
index bd5d195e..ba52a78e 100644
--- a/app/src/main/java/com/waenhancer/xposed/bridge/providers/HookProvider.java
+++ b/app/src/main/java/com/waenhancer/xposed/bridge/providers/HookProvider.java
@@ -38,7 +38,7 @@ public class HookProvider extends ContentProvider {
@Nullable
@Override
public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
- android.util.Log.d("WAE_Provider", "HookProvider.call: method=" + method + ", arg=" + arg);
+
int callingUid = android.os.Binder.getCallingUid();
long token = android.os.Binder.clearCallingIdentity();
@@ -71,7 +71,7 @@ public class HookProvider extends ContentProvider {
if ("record_event".equals(method) && extras != null) {
String eventName = extras.getString("event_name");
Bundle params = extras.getBundle("params");
- android.util.Log.d("WAE_Provider", "record_event received: " + eventName);
+
if (eventName != null) {
com.waenhancer.utils.AnalyticsManager.logEvent(context, eventName, params);
}
@@ -105,10 +105,10 @@ public class HookProvider extends ContentProvider {
}
if (method.equals("get_all_preferences")) {
var all = prefs.getAll();
- android.util.Log.d("WAE_Provider", "Serving " + all.size() + " preferences to caller (UID: " + callingUid + ")");
+
// Dump keys for diagnosis
for (String k : all.keySet()) {
- android.util.Log.v("WAE_Provider", " Key: " + k + " = " + all.get(k));
+
}
Bundle result = new Bundle();
result.putSerializable("prefs", new HashMap<>(all));
@@ -117,7 +117,7 @@ public class HookProvider extends ContentProvider {
if ("put_preference".equals(method) && extras != null) {
String key = extras.getString("key");
String type = extras.getString("type");
- android.util.Log.d("WAE_Provider", "Writing preference: " + key + " (from UID: " + callingUid + ")");
+
if (key == null || type == null) {
return null;
}
diff --git a/app/src/main/java/com/waenhancer/xposed/core/Feature.java b/app/src/main/java/com/waenhancer/xposed/core/Feature.java
index 352d0c15..2a993353 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/Feature.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/Feature.java
@@ -31,7 +31,7 @@ public abstract class Feature {
Throwable th = (Throwable) object;
Log.i("WAE", this.getPluginName() + "-> " + th.getMessage(), th);
} else {
- Log.i("WAE", this.getPluginName() + "-> " + object);
+
}
}
@@ -42,7 +42,7 @@ public abstract class Feature {
Throwable th = (Throwable) object;
Log.i("WAE", this.getPluginName() + "-> " + title + ": " + th.getMessage(), th);
} else {
- Log.i("WAE", this.getPluginName() + "-> " + title + ": " + object);
+
}
}
@@ -51,18 +51,18 @@ public abstract class Feature {
if (!DEBUG) return;
if (object instanceof Throwable) {
XposedBridge.log(String.format("[%s] Error:", this.getPluginName()));
- XposedBridge.log((Throwable) object);
+
} else {
- XposedBridge.log(String.format("[%s] %s", this.getPluginName(), object));
+
}
}
public void logError(Object object) {
if (object instanceof Throwable) {
- XposedBridge.log(String.format("[%s] CRITICAL ERROR:", this.getPluginName()));
- XposedBridge.log((Throwable) object);
+
+
} else {
- XposedBridge.log(String.format("[%s] CRITICAL ERROR: %s", this.getPluginName(), object));
+
}
}
diff --git a/app/src/main/java/com/waenhancer/xposed/core/FeatureLoader.java b/app/src/main/java/com/waenhancer/xposed/core/FeatureLoader.java
index 4e0490a7..1dd4372c 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/FeatureLoader.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/FeatureLoader.java
@@ -183,11 +183,11 @@ public class FeatureLoader {
String processName = Application.getProcessName();
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] callApplicationOnCreate for: " + mApp.getPackageName() + " (process: " + processName + ")");
+
}
if (!Objects.equals(processName, mApp.getPackageName())) {
- XposedBridge.log("[WAEX] Skipping secondary process. Expected: " + mApp.getPackageName() + ", Actual: " + processName);
+
return;
}
@@ -210,7 +210,7 @@ public class FeatureLoader {
if (pref.getBoolean("bootloader_spoofer", false)) {
HookBL.hook(loader, pref);
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] Bootloader Spoofer Injected");
+
}
}
@@ -221,7 +221,7 @@ public class FeatureLoader {
var providerPrefs = new com.waenhancer.xposed.bridge.client.ProviderSharedPreferences(mApp, localBridgePrefs, pref);
Utils.xprefs = providerPrefs;
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] ProviderSharedPreferences initialized with " + providerPrefs.getAll().size() + " preferences");
+
}
if (pref instanceof XSharedPreferences) {
@@ -229,7 +229,7 @@ public class FeatureLoader {
}
PackageInfo packageInfo = packageManager.getPackageInfo(mApp.getPackageName(), 0);
- XposedBridge.log(packageInfo.versionName);
+
currentVersion = packageInfo.versionName;
// Host preference scan removed - too expensive
@@ -248,7 +248,7 @@ public class FeatureLoader {
return (packageInfo.versionName + ".").startsWith(target);
});
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] Version verification result for " + packageInfo.versionName + ": isSupported=" + isSupported);
+
}
if (!isSupported) {
disableExpirationVersion(mApp.getClassLoader());
@@ -351,13 +351,13 @@ public class FeatureLoader {
Unobfuscator.loadLibrary(mApp);
if (!Unobfuscator.initWithPath(sourceDir)) {
- XposedBridge.log("Can't init dexkit");
+
return;
}
UnobfuscatorCache.init(mApp);
SharedPreferencesWrapper.hookInit(mApp.getClassLoader());
- XposedBridge.log("[WAEX] Initializing components and plugins using ProviderSharedPreferences...");
+
ResId.initLocal(mApp);
initComponents(loader, providerPrefs);
plugins(loader, providerPrefs, packageInfo.versionName);
@@ -366,7 +366,7 @@ public class FeatureLoader {
var timemillis2 = System.currentTimeMillis() - timemillis;
loadedTimeStr = String.format(java.util.Locale.US, "%.2fs", timemillis2 / 1000.0);
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] Loaded Hooks in " + loadedTimeStr);
+
}
new Handler(Looper.getMainLooper()).post(() -> {
@@ -404,7 +404,7 @@ public class FeatureLoader {
String fullName = activity.getClass().getName();
String superName = activity.getClass().getSuperclass() != null ? activity.getClass().getSuperclass().getName() : "null";
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] Activity RESUMED: " + activityName + " (Full Class Name: " + fullName + " | Superclass: " + superName + ")");
+
}
// Record screen view in analytics
@@ -419,7 +419,7 @@ public class FeatureLoader {
boolean needRestartPref = pref.getBoolean("need_restart", false);
boolean needRestartGlobal = WppCore.getPrivBoolean("need_restart", false);
if (Feature.DEBUG) {
- XposedBridge.log("[WAEX] Restart Check on RESUMED - Pref: " + needRestartPref + ", Global: " + needRestartGlobal + ", isShowing: " + isRestartDialogShowing);
+
}
if ((needRestartPref || needRestartGlobal) && !isRestartDialogShowing) {
@@ -448,13 +448,13 @@ public class FeatureLoader {
if (btnRestart.isEmpty()) btnRestart = "Restart WhatsApp";
if (btnCancel.isEmpty()) btnCancel = "Cancel";
- XposedBridge.log("[WAEX] Restart dialog - Msg: '" + msg + "', Btn: '" + btnRestart + "'");
+
new AlertDialogWpp(activity)
.setTitle("Restart Required")
.setMessage(msg)
.setPositiveButton(btnRestart, (dialog, which) -> {
- XposedBridge.log("[WAEX] User clicked RESTART WHATSAPP");
+
isRestartDialogShowing = false;
pref.edit().putBoolean("need_restart", false)
.remove("pending_restart_changes").apply();
@@ -477,7 +477,7 @@ public class FeatureLoader {
if (pref.getBoolean("update_check", true)) {
if (!hasCheckedThisSession[0]) {
hasCheckedThisSession[0] = true;
- XposedBridge.log("[WAEX] Scheduling startup update check...");
+
activity.getWindow().getDecorView().postDelayed(() -> {
try {
CompletableFuture.runAsync(new UpdateChecker(activity));
@@ -524,9 +524,9 @@ public class FeatureLoader {
BroadcastReceiver restartManualReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- XposedBridge.log("[WAEX] MANUAL_RESTART broadcast received");
+
WppCore.setPrivBooleanSync("need_restart", true);
- XposedBridge.log("[WAEX] Global need_restart set to true via broadcast");
+
}
};
ContextCompat.registerReceiver(mApp, restartManualReceiver,
@@ -539,7 +539,7 @@ public class FeatureLoader {
public void onReceive(Context context, Intent intent) {
if (UnobfuscatorCache.getInstance() != null) {
UnobfuscatorCache.getInstance().clearCache();
- XposedBridge.log("WAEX: Obfuscate cache cleared via broadcast");
+
}
}
};
@@ -681,7 +681,7 @@ public class FeatureLoader {
VideoNoteAttachment.class
};
if (Feature.DEBUG) {
- XposedBridge.log("Loading Plugins");
+
}
var executorService = Executors.newWorkStealingPool(Math.min(Runtime.getRuntime().availableProcessors(), 4));
var times = java.util.Collections.synchronizedList(new ArrayList<String>());
@@ -711,7 +711,7 @@ public class FeatureLoader {
executorService.shutdown();
try {
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
- XposedBridge.log("WAE: Features failed to load within 5 seconds");
+
}
} catch (InterruptedException e) {
XposedBridge.log(e);
@@ -719,7 +719,7 @@ public class FeatureLoader {
if (DebugFeature.DEBUG) {
for (var time : times) {
if (time != null)
- XposedBridge.log(time);
+
}
}
}
diff --git a/app/src/main/java/com/waenhancer/xposed/core/WppCore.java b/app/src/main/java/com/waenhancer/xposed/core/WppCore.java
index 07c6ac1c..ad2cada8 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/WppCore.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/WppCore.java
@@ -137,7 +137,7 @@ public class WppCore {
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
mConversationDelegate = param.thisObject;
if (Utils.DEBUG) {
- XposedBridge.log("WAE: Captured conversation delegate: " + mConversationDelegate.getClass().getName());
+
}
}
});
@@ -226,7 +226,7 @@ public class WppCore {
private static boolean tryConnectBridge(BaseClient baseClient) throws Exception {
try {
if (Utils.DEBUG) {
- XposedBridge.log("Trying to connect to " + baseClient.getClass().getSimpleName());
+
}
client = baseClient;
CompletableFuture<Boolean> canLoadFuture = baseClient.connect();
@@ -245,7 +245,7 @@ public class WppCore {
String jidRawString = (String) XposedHelpers.callMethod(userJidRaw, "getRawString");
if (jidRawString == null) {
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.sendMessage - could not get rawString from jid: " + userJidRaw);
+
}
Utils.showToast("Error: could not find JID", Toast.LENGTH_SHORT);
return false;
@@ -253,12 +253,12 @@ public class WppCore {
// Strip device suffix if LID: e.g. "4306.0:0@lid" -> "4306@lid"
jidRawString = jidRawString.replaceFirst("\\.[\\d:]+@", "@");
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.sendMessage - jidRawString: " + jidRawString);
+
}
return sendMessage(jidRawString, message);
} catch (Exception e) {
- XposedBridge.log("WppCore.sendMessage(Object) failed: " + e);
+
Utils.showToast("Error in sending message: " + e.getMessage(), Toast.LENGTH_SHORT);
return false;
}
@@ -301,19 +301,17 @@ public class WppCore {
android.app.RemoteInput.addResultsToIntent(remoteInputs, fillIn, results);
action.actionIntent.send(Utils.getApplication(), 0, fillIn);
if (Utils.DEBUG) {
- XposedBridge.log(
- "WppCore.sendMessageViaNotification - sent to [" + contactName + "] via RemoteInput!");
+
}
return true;
}
}
}
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.sendMessageViaNotification - no WA notification with title=[" + contactName
- + "]. Total=" + notifications.length);
+
}
} catch (Exception e) {
- XposedBridge.log("WppCore.sendMessageViaNotification error: " + e);
+
}
return false;
}
@@ -348,18 +346,18 @@ public class WppCore {
android.app.RemoteInput.addResultsToIntent(remoteInputs, fillIn, results);
action.actionIntent.send(Utils.getApplication(), 0, fillIn);
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.sendMessage - sent via RemoteInput (jid match)!");
+
}
return true;
}
}
}
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.sendMessage - no matching WA notification for jid=" + jidOrNumber);
+
}
return false;
} catch (Exception e) {
- XposedBridge.log("WppCore.sendMessage error: " + e);
+
return false;
}
}
@@ -410,7 +408,7 @@ public class WppCore {
try {
actionUser = Unobfuscator.loadActionUser(loader);
if (Utils.DEBUG) {
- XposedBridge.log("ActionUser: " + actionUser.getName());
+
}
XposedBridge.hookAllConstructors(actionUser, new XC_MethodHook() {
@Override
@@ -431,13 +429,12 @@ public class WppCore {
f.setAccessible(true);
Object val = f.get(oneKs);
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.A00-hook: 1Ks." + f.getName() + " = " + val
- + " [class=" + (val == null ? "null" : val.getClass().getName()) + "]");
+
}
}
}
if (Utils.DEBUG) {
- XposedBridge.log("WppCore.A00-hook: message arg = " + param.args[1]);
+
}
}
});
@@ -661,7 +658,7 @@ public class WppCore {
return null;
try {
if (mCachedMessageStore == null) {
- XposedBridge.log("CachedMessageStore is null");
+
return null;
}
return cachedMessageStoreKey.invoke(mCachedMessageStore, messageKey);
@@ -747,7 +744,7 @@ public class WppCore {
cachedUserJid = jid;
cachedActivityHash = currentHash;
if (Utils.DEBUG) {
- XposedBridge.log("WAE: Resolved JID " + jid.getPhoneNumber() + " in " + (System.currentTimeMillis() - start) + "ms");
+
}
return jid;
}
@@ -763,13 +760,13 @@ public class WppCore {
}
long start = System.currentTimeMillis();
if (Utils.DEBUG) {
- XposedBridge.log("WAE: ensureConversationJidResolvers started");
+
}
try {
if (conversationDelegateField == null) {
conversationDelegateField = Unobfuscator.loadConversationDelegateField(loader);
if (Utils.DEBUG) {
- XposedBridge.log("WAE: conversationDelegateField found: " + (conversationDelegateField != null));
+
}
}
} catch (Exception e) {
@@ -779,14 +776,14 @@ public class WppCore {
if (conversationJidField == null) {
conversationJidField = Unobfuscator.loadUserJidConversationDelegate(loader);
if (Utils.DEBUG) {
- XposedBridge.log("WAE: conversationJidField found: " + (conversationJidField != null));
+
}
}
} catch (Exception e) {
XposedBridge.log("WAE: Error loading conversationJidField: " + e.getMessage());
}
if (Utils.DEBUG) {
- XposedBridge.log("WAE: ensureConversationJidResolvers finished in " + (System.currentTimeMillis() - start) + "ms");
+
}
}
@@ -965,7 +962,7 @@ public class WppCore {
if (file.exists()) return file;
}
- XposedBridge.log("WAE: WppCore: getContactPhotoFile: No photo found for " + jid + " in " + datafolder);
+
return null;
}
@@ -1132,7 +1129,7 @@ public class WppCore {
if (client == null) {
throw new Exception("Bridge client not initialized");
}
- XposedBridge.log("Bridge disconnected. Trying automatic synchronous reconnect");
+
boolean reconnected = false;
try {
reconnected = Boolean.TRUE.equals(client.connect().get(4, TimeUnit.SECONDS));
diff --git a/app/src/main/java/com/waenhancer/xposed/core/components/AlertDialogWpp.java b/app/src/main/java/com/waenhancer/xposed/core/components/AlertDialogWpp.java
index b5b2a088..cabba81c 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/components/AlertDialogWpp.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/components/AlertDialogWpp.java
@@ -64,7 +64,7 @@ public class AlertDialogWpp {
return;
}
Class<?> alertDialogClass = getAlertDialog.getReturnType();
- XposedBridge.log("[WAEX] AlertDialogWpp: Initializing with class " + alertDialogClass.getName());
+
// Try to find methods by name first (more reliable if not obfuscated)
setMessageMethod = null;
@@ -76,13 +76,13 @@ public class AlertDialogWpp {
method -> method.getParameterCount() == 1 &&
method.getParameterTypes()[0].equals(CharSequence.class));
}
- if (setMessageMethod != null) XposedBridge.log("[WAEX] AlertDialogWpp: Found setMessageMethod: " + setMessageMethod.getName());
+ if (setMessageMethod != null)
setItemsMethod = ReflectionUtils.findMethodUsingFilterIfExists(alertDialogClass,
method -> method.getParameterCount() == 2 &&
((method.getParameterTypes()[0].equals(DialogInterface.OnClickListener.class) && CharSequence[].class.isAssignableFrom(method.getParameterTypes()[1])) ||
(CharSequence[].class.isAssignableFrom(method.getParameterTypes()[0]) && method.getParameterTypes()[1].equals(DialogInterface.OnClickListener.class))));
- if (setItemsMethod != null) XposedBridge.log("[WAEX] AlertDialogWpp: Found setItemsMethod: " + setItemsMethod.getName());
+ if (setItemsMethod != null)
setMultiChoiceItemsMethod = ReflectionUtils.findMethodUsingFilterIfExists(alertDialogClass,
method -> method.getParameterCount() == 3 &&
@@ -96,7 +96,7 @@ public class AlertDialogWpp {
method.getParameterCount() == 2 &&
((method.getParameterTypes()[0].equals(DialogInterface.OnClickListener.class) && CharSequence.class.isAssignableFrom(method.getParameterTypes()[1])) ||
(CharSequence.class.isAssignableFrom(method.getParameterTypes()[0]) && method.getParameterTypes()[1].equals(DialogInterface.OnClickListener.class))));
- XposedBridge.log("[WAEX] AlertDialogWpp: Found " + buttons.length + " button methods");
+
} catch (Exception ignored) {}
setNegativeButtonMethod = null;
@@ -104,7 +104,7 @@ public class AlertDialogWpp {
setPositiveButtonMethod = null;
for (java.lang.reflect.Method m : buttons) {
- XposedBridge.log("[WAEX] AlertDialogWpp: Button candidate: " + m.getName() + " (" + Arrays.toString(m.getParameterTypes()) + ")");
+
if (m.getName().equals("setNegativeButton")) setNegativeButtonMethod = m;
else if (m.getName().equals("setNeutralButton")) setNeutralButtonMethod = m;
else if (m.getName().equals("setPositiveButton")) setPositiveButtonMethod = m;
@@ -125,11 +125,11 @@ public class AlertDialogWpp {
setNeutralButtonMethod = buttons[1];
}
- XposedBridge.log("[WAEX] AlertDialogWpp: Using button fallback mapping (Pos=" + setPositiveButtonMethod.getName() + ")");
+
}
isAvailable = true;
- XposedBridge.log("[WAEX] AlertDialogWpp initialized successfully");
+
logClassMethods(alertDialogClass);
} catch (Throwable e) {
isAvailable = false;
@@ -139,11 +139,11 @@ public class AlertDialogWpp {
}
private static void logClassMethods(Class<?> clazz) {
- XposedBridge.log("[WAEX] --- Methods for " + clazz.getName() + " ---");
+
for (Method m : clazz.getDeclaredMethods()) {
- XposedBridge.log("[WAEX] " + m.getReturnType().getSimpleName() + " " + m.getName() + "(" + Arrays.toString(m.getParameterTypes()) + ")");
+
}
- XposedBridge.log("[WAEX] ---------------------------------------");
+
}
@@ -154,7 +154,7 @@ public class AlertDialogWpp {
try {
mAlertDialogWpp = getAlertDialog.invoke(null, context);
} catch (Exception e) {
- XposedBridge.log("[WAEX] AlertDialogWpp instance failed, using system fallback");
+
mIsUsingSystem = true;
}
} else {
@@ -321,7 +321,7 @@ public class AlertDialogWpp {
XposedHelpers.callMethod(mAlertDialogWpp, methodName, listener, text);
success = true;
} catch (Throwable t2) {
- XposedBridge.log("[WAEX] AlertDialogWpp button failed: " + methodName + ", falling back to system");
+
mIsUsingSystem = true;
// Apply to system builder so it's ready if we switch
if (methodName.equals("setPositiveButton")) mAlertDialog.setPositiveButton(text, listener);
@@ -950,7 +950,7 @@ public class AlertDialogWpp {
try {
mCreate = (Dialog) XposedHelpers.callMethod(mAlertDialogWpp, "create");
} catch (Throwable t) {
- XposedBridge.log("[WAEX] AlertDialogWpp.create() failed, using system fallback");
+
mCreate = mAlertDialog.create();
}
}
diff --git a/app/src/main/java/com/waenhancer/xposed/core/components/FMessageWpp.java b/app/src/main/java/com/waenhancer/xposed/core/components/FMessageWpp.java
index ad905ee6..490b1aff 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/components/FMessageWpp.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/components/FMessageWpp.java
@@ -78,9 +78,7 @@ public class FMessageWpp {
keyIdField = ReflectionUtils.getFieldByType(Key.TYPE, String.class);
keyFromMeField = ReflectionUtils.getFieldByType(Key.TYPE, boolean.class);
keyRemoteJidField = ReflectionUtils.getFieldByExtendType(Key.TYPE, UserJid.TYPE_JID);
- XposedBridge.log("[WAEX] Key fields initialized: ID=" + (keyIdField != null ? keyIdField.getName() : "null") +
- ", fromMe=" + (keyFromMeField != null ? keyFromMeField.getName() : "null") +
- ", remoteJid=" + (keyRemoteJidField != null ? keyRemoteJidField.getName() : "null"));
+
}
} catch (Exception e) {
XposedBridge.log(e);
diff --git a/app/src/main/java/com/waenhancer/xposed/core/components/WaContactWpp.java b/app/src/main/java/com/waenhancer/xposed/core/components/WaContactWpp.java
index f2d82f2d..72453a4d 100644
--- a/app/src/main/java/com/waenhancer/xposed/core/components/WaContactWpp.java
+++ b/app/src/main/java/com/waenhancer/xposed/core/components/WaContactWpp.java
@@ -71,7 +71,7 @@ public record WaContactWpp(Object mInstance) {
Object instance = m.invoke(null);
if (instance != null) {
mInstanceGetWaContact = instance;
- XposedBridge.log("WAE: WaContactWpp: Captured instance via static method: " + m.getName());
+
break;
}
} catch (Exception ignored) {
@@ -84,11 +84,11 @@ public record WaContactWpp(Object mInstance) {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
mInstanceGetWaContact = param.thisObject;
- XposedBridge.log("WAE: WaContactWpp: Captured instance via constructor");
+
}
});
} else {
- XposedBridge.log("WAE: WaContactWpp: Instance already captured, skipping constructor hook");
+
}
getProfilePhoto = Unobfuscator.loadGetProfilePhotoMethod(classLoader);
@@ -146,7 +146,7 @@ public record WaContactWpp(Object mInstance) {
public static WaContactWpp getWaContactFromJid(FMessageWpp.UserJid userJid) {