Skip to content

Commit b095467

Browse files
authored
Merge pull request #1 from mubashardev/feature/call-recording-fixes
Feature/call recording fixes
2 parents 2233e2d + 780b2f0 commit b095467

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1104
-481
lines changed

.claude/settings.local.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

.github/workflows/android.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Android CI
22

33
on:
44
push:
5-
branches: [ "master" ]
5+
branches: [ "master", "feature/*" ]
66
jobs:
77
build:
88
permissions: write-all

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ android {
4343
applicationId = "com.wmods.wppenhacer"
4444
minSdk = 28
4545
targetSdk = 34
46-
versionCode = 152
47-
versionName = "1.5.2-DEV ($gitHash)"
46+
versionCode = 153
47+
versionName = "1.5.3-DEV ($gitHash)"
4848
multiDexEnabled = true
4949

5050
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/src/main/java/com/wmods/wppenhacer/activities/MainActivity.java

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.view.MenuItem;
1111

1212
import androidx.annotation.NonNull;
13+
import androidx.core.app.ActivityOptionsCompat;
1314
import androidx.fragment.app.Fragment;
1415
import androidx.viewpager2.widget.ViewPager2;
1516

@@ -27,53 +28,50 @@
2728
public class MainActivity extends BaseActivity {
2829

2930
private ActivityMainBinding binding;
30-
3131
private BatteryPermissionHelper batteryPermissionHelper = BatteryPermissionHelper.Companion.getInstance();
3232

3333
@Override
3434
protected void onCreate(Bundle savedInstanceState) {
3535
App.changeLanguage(this);
3636
super.onCreate(savedInstanceState);
3737

38-
if (getSupportActionBar() != null) {
39-
getSupportActionBar().setDisplayShowHomeEnabled(true);
40-
getSupportActionBar().setIcon(R.mipmap.launcher);
41-
}
42-
4338
binding = ActivityMainBinding.inflate(getLayoutInflater());
4439
setContentView(binding.getRoot());
4540

41+
setSupportActionBar(binding.toolbar);
42+
4643
MainPagerAdapter pagerAdapter = new MainPagerAdapter(this);
4744
binding.viewPager.setAdapter(pagerAdapter);
4845

4946
var prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this);
5047
if (!prefs.getBoolean("call_recording_enable", false)) {
5148
binding.navView.getMenu().findItem(R.id.navigation_recordings).setVisible(false);
5249
}
50+
binding.viewPager.setPageTransformer(new DepthPageTransformer());
5351

5452
binding.navView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
5553
@SuppressLint("NonConstantResourceId")
5654
@Override
5755
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
5856
return switch (item.getItemId()) {
5957
case R.id.navigation_chat -> {
60-
binding.viewPager.setCurrentItem(0);
58+
binding.viewPager.setCurrentItem(0, true);
6159
yield true;
6260
}
6361
case R.id.navigation_privacy -> {
64-
binding.viewPager.setCurrentItem(1);
62+
binding.viewPager.setCurrentItem(1, true);
6563
yield true;
6664
}
6765
case R.id.navigation_home -> {
68-
binding.viewPager.setCurrentItem(2);
66+
binding.viewPager.setCurrentItem(2, true);
6967
yield true;
7068
}
7169
case R.id.navigation_media -> {
72-
binding.viewPager.setCurrentItem(3);
70+
binding.viewPager.setCurrentItem(3, true);
7371
yield true;
7472
}
7573
case R.id.navigation_colors -> {
76-
binding.viewPager.setCurrentItem(4);
74+
binding.viewPager.setCurrentItem(4, true);
7775
yield true;
7876
}
7977
case R.id.navigation_recordings -> {
@@ -97,7 +95,6 @@ public void onPageSelected(int position) {
9795
FilePicker.registerFilePicker(this);
9896
}
9997

100-
10198
private void createMainDir() {
10299
var nomedia = new File(App.getWaEnhancerFolder(), ".nomedia");
103100
if (nomedia.exists()) {
@@ -127,7 +124,9 @@ public boolean onCreateOptionsMenu(Menu menu) {
127124
@Override
128125
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
129126
if (item.getItemId() == R.id.menu_about) {
130-
startActivity(new Intent(this, AboutActivity.class));
127+
var options = ActivityOptionsCompat.makeCustomAnimation(
128+
this, R.anim.slide_in_right, R.anim.slide_out_left);
129+
startActivity(new Intent(this, AboutActivity.class), options.toBundle());
131130
return true;
132131
} else if (item.getItemId() == R.id.batteryoptimization) {
133132
if (batteryPermissionHelper.isBatterySaverPermissionAvailable(this, true)) {
@@ -151,4 +150,32 @@ public boolean onSupportNavigateUp() {
151150
onBackPressed();
152151
return super.onSupportNavigateUp();
153152
}
153+
154+
private static class DepthPageTransformer implements ViewPager2.PageTransformer {
155+
private static final float MIN_SCALE = 0.85f;
156+
157+
@Override
158+
public void transformPage(@NonNull android.view.View page, float position) {
159+
int pageWidth = page.getWidth();
160+
161+
if (position < -1) {
162+
page.setAlpha(0f);
163+
} else if (position <= 0) {
164+
page.setAlpha(1f);
165+
page.setTranslationX(0f);
166+
page.setTranslationZ(0f);
167+
page.setScaleX(1f);
168+
page.setScaleY(1f);
169+
} else if (position <= 1) {
170+
page.setAlpha(1 - position);
171+
page.setTranslationX(pageWidth * -position);
172+
page.setTranslationZ(-1f);
173+
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
174+
page.setScaleX(scaleFactor);
175+
page.setScaleY(scaleFactor);
176+
} else {
177+
page.setAlpha(0f);
178+
}
179+
}
180+
}
154181
}

app/src/main/java/com/wmods/wppenhacer/ui/fragments/HomeFragment.java

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.view.LayoutInflater;
1313
import android.view.View;
1414
import android.view.ViewGroup;
15+
import android.view.animation.AnimationUtils;
1516
import android.widget.Toast;
1617

1718
import androidx.annotation.NonNull;
@@ -75,22 +76,63 @@ public View onCreateView(@NonNull LayoutInflater inflater,
7576
checkStateWpp(requireActivity());
7677

7778
binding.rebootBtn.setOnClickListener(view -> {
79+
animateClick(view);
7880
App.getInstance().restartApp(FeatureLoader.PACKAGE_WPP);
7981
disableWpp(requireActivity());
8082
});
8183

8284
binding.rebootBtn2.setOnClickListener(view -> {
85+
animateClick(view);
8386
App.getInstance().restartApp(FeatureLoader.PACKAGE_BUSINESS);
8487
disableBusiness(requireActivity());
8588
});
8689

87-
binding.exportBtn.setOnClickListener(view -> saveConfigs(this.getContext()));
88-
binding.importBtn.setOnClickListener(view -> importConfigs(this.getContext()));
89-
binding.resetBtn.setOnClickListener(view -> resetConfigs(this.getContext()));
90+
binding.exportBtn.setOnClickListener(view -> {
91+
animateClick(view);
92+
saveConfigs(this.getContext());
93+
});
94+
95+
binding.importBtn.setOnClickListener(view -> {
96+
animateClick(view);
97+
importConfigs(this.getContext());
98+
});
99+
100+
binding.resetBtn.setOnClickListener(view -> {
101+
animateClick(view);
102+
resetConfigs(this.getContext());
103+
});
104+
105+
startCardAnimations();
90106

91107
return binding.getRoot();
92108
}
93109

110+
private void startCardAnimations() {
111+
var slideUp = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up);
112+
var fadeIn = AnimationUtils.loadAnimation(getContext(), R.anim.fade_in);
113+
114+
binding.status.startAnimation(slideUp);
115+
116+
binding.status2.postDelayed(() -> {
117+
var anim = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up);
118+
binding.status2.startAnimation(anim);
119+
}, 100);
120+
121+
binding.status3.postDelayed(() -> {
122+
var anim = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up);
123+
binding.status3.startAnimation(anim);
124+
}, 200);
125+
126+
binding.infoCard.postDelayed(() -> {
127+
binding.infoCard.startAnimation(fadeIn);
128+
}, 300);
129+
}
130+
131+
private void animateClick(View view) {
132+
var scaleIn = AnimationUtils.loadAnimation(getContext(), R.anim.scale_in);
133+
view.startAnimation(scaleIn);
134+
}
135+
94136
@Override
95137
public void onResume() {
96138
super.onResume();
@@ -104,10 +146,10 @@ private void receiverBroadcastBusiness(Context context, Intent intent) {
104146
var supported_list = Arrays.asList(context.getResources().getStringArray(R.array.supported_versions_business));
105147
if (version != null && supported_list.stream().anyMatch(s -> version.startsWith(s.replace(".xx", "")))) {
106148
binding.statusSummary3.setText(getString(R.string.version_s, version));
107-
binding.status3.setCardBackgroundColor(context.getColor(R.color.material_state_green));
149+
binding.status3.getChildAt(0).setBackgroundResource(R.drawable.gradient_success);
108150
} else {
109151
binding.statusSummary3.setText(getString(R.string.version_s_not_listed, version));
110-
binding.status3.setCardBackgroundColor(context.getColor(R.color.material_state_yellow));
152+
binding.status3.getChildAt(0).setBackgroundResource(R.drawable.gradient_warning);
111153
}
112154
binding.rebootBtn2.setVisibility(View.VISIBLE);
113155
binding.statusSummary3.setVisibility(View.VISIBLE);
@@ -122,10 +164,10 @@ private void receiverBroadcastWpp(Context context, Intent intent) {
122164

123165
if (version != null && supported_list.stream().anyMatch(s -> version.startsWith(s.replace(".xx", "")))) {
124166
binding.statusSummary1.setText(getString(R.string.version_s, version));
125-
binding.status2.setCardBackgroundColor(context.getColor(R.color.material_state_green));
167+
binding.status2.getChildAt(0).setBackgroundResource(R.drawable.gradient_success);
126168
} else {
127169
binding.statusSummary1.setText(getString(R.string.version_s_not_listed, version));
128-
binding.status2.setCardBackgroundColor(context.getColor(R.color.material_state_yellow));
170+
binding.status2.getChildAt(0).setBackgroundResource(R.drawable.gradient_warning);
129171
}
130172
binding.rebootBtn.setVisibility(View.VISIBLE);
131173
binding.statusSummary1.setVisibility(View.VISIBLE);
@@ -232,11 +274,11 @@ private void checkStateWpp(FragmentActivity activity) {
232274
binding.statusIcon.setImageResource(R.drawable.ic_round_check_circle_24);
233275
binding.statusTitle.setText(R.string.module_enabled);
234276
binding.statusSummary.setText(String.format(getString(R.string.version_s), BuildConfig.VERSION_NAME));
235-
binding.status.setCardBackgroundColor(activity.getColor(R.color.material_state_green));
277+
binding.status.getChildAt(0).setBackgroundResource(R.drawable.gradient_success);
236278
} else {
237279
binding.statusIcon.setImageResource(R.drawable.ic_round_error_outline_24);
238280
binding.statusTitle.setText(R.string.module_disabled);
239-
binding.status.setCardBackgroundColor(activity.getColor(R.color.material_state_red));
281+
binding.status.getChildAt(0).setBackgroundResource(R.drawable.gradient_error);
240282
binding.statusSummary.setVisibility(View.GONE);
241283
}
242284
if (isInstalled(FeatureLoader.PACKAGE_WPP) && App.isOriginalPackage()) {
@@ -275,15 +317,15 @@ private boolean isInstalled(String packageWpp) {
275317
private void disableBusiness(FragmentActivity activity) {
276318
binding.statusIcon3.setImageResource(R.drawable.ic_round_error_outline_24);
277319
binding.statusTitle3.setText(R.string.business_is_not_running_or_has_not_been_activated_in_lsposed);
278-
binding.status3.setCardBackgroundColor(activity.getColor(R.color.material_state_red));
320+
binding.status3.getChildAt(0).setBackgroundResource(R.drawable.gradient_error);
279321
binding.statusSummary3.setVisibility(View.GONE);
280322
binding.rebootBtn2.setVisibility(View.GONE);
281323
}
282324

283325
private void disableWpp(FragmentActivity activity) {
284326
binding.statusIcon2.setImageResource(R.drawable.ic_round_error_outline_24);
285327
binding.statusTitle2.setText(R.string.whatsapp_is_not_running_or_has_not_been_activated_in_lsposed);
286-
binding.status2.setCardBackgroundColor(activity.getColor(R.color.material_state_red));
328+
binding.status2.getChildAt(0).setBackgroundResource(R.drawable.gradient_error);
287329
binding.statusSummary1.setVisibility(View.GONE);
288330
binding.rebootBtn.setVisibility(View.GONE);
289331
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,7 +1569,7 @@ public synchronized static Field loadOriginFMessageField(ClassLoader classLoader
15691569
}
15701570
} catch (Exception ignored) {}
15711571
}
1572-
throw new RuntimeException("OriginFMessageField not found");
1572+
throw new RuntimeException("OriginFMessageField field not found");
15731573
});
15741574
}
15751575

@@ -1670,9 +1670,16 @@ public synchronized static Class loadListChannelItemClass(ClassLoader classLoade
16701670

16711671
public synchronized static Method[] loadTextStatusData(ClassLoader classLoader) throws Exception {
16721672
return UnobfuscatorCache.getInstance().getMethods(classLoader, () -> {
1673+
Class<?> textData;
1674+
var textDataList = dexkit.findClass(FindClass.create().matcher(ClassMatcher.create().addUsingString("TextData;")));
1675+
if (textDataList.isEmpty()) {
1676+
textData = findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "TextData");
1677+
} else {
1678+
textData = textDataList.get(0).getInstance(classLoader);
1679+
}
16731680
var methods = dexkit.findMethod(
16741681
FindMethod.create().matcher(
1675-
MethodMatcher.create().addParamType("com.whatsapp.TextData")
1682+
MethodMatcher.create().addParamType(textData)
16761683
)
16771684
);
16781685
if (methods.isEmpty())

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ public void doHook() throws Exception {
249249

250250
private void disablePhotoProfileStatus() throws Exception {
251251
var refreshStatusClass = Unobfuscator.loadRefreshStatusClass(classLoader);
252-
var photoProfileClass = classLoader.loadClass("com.whatsapp.wds.components.profilephoto.WDSProfilePhoto");
253-
var convClass = classLoader.loadClass("com.whatsapp.conversationslist.ConversationsFragment");
252+
var photoProfileClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, ".WDSProfilePhoto");
253+
var convClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, ".ConversationsFragment");
254254
var jidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid");
255255
var method = ReflectionUtils.findMethodUsingFilter(convClass, m -> m.getParameterCount() > 0 && !Modifier.isStatic(m.getModifiers()) && m.getParameterTypes()[0] == View.class && ReflectionUtils.findIndexOfType(m.getParameterTypes(), jidClass) != -1);
256256
var field = ReflectionUtils.getFieldByExtendType(convClass, refreshStatusClass);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
7777
var methodsTextStatus = Unobfuscator.loadTextStatusData(classLoader);
7878

7979
for (var method : methodsTextStatus) {
80-
Class<?> textDataClass = classLoader.loadClass("com.whatsapp.TextData");
8180
logDebug("setColorTextComposer", Unobfuscator.getMethodDescriptor(method));
8281
XposedBridge.hookMethod(method, new XC_MethodHook() {
8382
@Override
8483
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
85-
var textData = ReflectionUtils.getArg(param.args, textDataClass, 0);
84+
var textData = param.args[0];
8685
if (textData == null) return;
8786
if (colorData.textColor != -1)
8887
XposedHelpers.setObjectField(textData, "textColor", colorData.textColor);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<set xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:interpolator="@android:interpolator/fast_out_slow_in">
4+
<scale
5+
android:duration="150"
6+
android:fromXScale="1.0"
7+
android:fromYScale="1.0"
8+
android:pivotX="50%"
9+
android:pivotY="50%"
10+
android:toXScale="0.95"
11+
android:toYScale="0.95" />
12+
</set>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<set xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:interpolator="@android:interpolator/overshoot">
4+
<scale
5+
android:duration="200"
6+
android:fromXScale="0.95"
7+
android:fromYScale="0.95"
8+
android:pivotX="50%"
9+
android:pivotY="50%"
10+
android:toXScale="1.0"
11+
android:toYScale="1.0" />
12+
</set>

0 commit comments

Comments
 (0)