From 436393ebcbef4cd0cbc96918b065d7b6f227f965 Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Tue, 7 May 2024 08:05:16 +0700 Subject: [PATCH 1/6] Codebase: Improve safety null check --- .../com/wmods/wppenhacer/MainActivity.java | 6 +++-- .../ui/fragments/MediaFragment.java | 22 ++++++++++++++----- .../wppenhacer/utils/ColorReplacement.java | 6 ++--- .../wppenhacer/utils/DrawableColors.java | 4 ++-- .../wppenhacer/views/HorizontalListView.java | 12 +++++----- .../xposed/core/UnobfuscatorCache.java | 5 ++++- .../wmods/wppenhacer/xposed/core/WppCore.java | 9 ++++++-- .../features/customization/SeparateGroup.java | 5 ++++- .../features/general/ShowEditMessage.java | 10 ++++++--- 9 files changed, 55 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/wmods/wppenhacer/MainActivity.java b/app/src/main/java/com/wmods/wppenhacer/MainActivity.java index 953e3792..7ccec327 100644 --- a/app/src/main/java/com/wmods/wppenhacer/MainActivity.java +++ b/app/src/main/java/com/wmods/wppenhacer/MainActivity.java @@ -31,8 +31,10 @@ protected void onCreate(Bundle savedInstanceState) { getTheme().applyStyle(rikka.material.preference.R.style.ThemeOverlay_Rikka_Material3_Preference, true); getTheme().applyStyle(R.style.ThemeOverlay, true); super.onCreate(savedInstanceState); - getSupportActionBar().setDisplayShowHomeEnabled(true); - getSupportActionBar().setIcon(R.mipmap.launcher); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayShowHomeEnabled(true); + getSupportActionBar().setIcon(R.mipmap.launcher); + } binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_activity_main); diff --git a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java index 5cf9af4d..99b1cc9b 100644 --- a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java +++ b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java @@ -25,7 +25,10 @@ public class MediaFragment extends BasePreFragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContract = registerForActivityResult(new ActivityResultContracts.OpenDocumentTree(), result -> { - findPreference("localdownload").setSummary(getPathFromContentUri(result)); + Preference preference = findPreference("localdownload"); + if (preference != null) { + preference.setSummary(getPathFromContentUri(result)); + } mPrefs.edit().putString("localdownload", getPathFromContentUri(result)).apply(); }); } @@ -35,6 +38,10 @@ public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable S super.onCreatePreferences(savedInstanceState, rootKey); setPreferencesFromResource(R.xml.fragment_media, rootKey); var localPref = findPreference("localdownload"); + if (localPref == null) { + Log.e(TAG, "localPref is null!"); + return; + } localPref.setOnPreferenceClickListener((preference) -> { mContract.launch(null); return true; @@ -46,10 +53,15 @@ public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable S public String getPathFromContentUri(Uri uri) { if (!"com.android.externalstorage.documents".equals(uri.getAuthority())) return uri.toString(); - String[] pathsections = uri.getPath().split(":"); - var path = pathsections[pathsections.length - 1]; - if (path.startsWith("/tree")) - path = ""; + + String path = ""; + String uriPath = uri.getPath(); + if (uriPath != null) { + var pathSections = uriPath.split(":"); + path = pathSections[pathSections.length - 1]; + if (path.startsWith("/tree")) + path = ""; + } return Environment.getExternalStorageDirectory().getPath() + "/" + path; } diff --git a/app/src/main/java/com/wmods/wppenhacer/utils/ColorReplacement.java b/app/src/main/java/com/wmods/wppenhacer/utils/ColorReplacement.java index e5948862..37adfbe2 100644 --- a/app/src/main/java/com/wmods/wppenhacer/utils/ColorReplacement.java +++ b/app/src/main/java/com/wmods/wppenhacer/utils/ColorReplacement.java @@ -49,9 +49,9 @@ static void replace(ImageView view) { view.setColorFilter(IColors.parseColor(sColorSub + newColor)); } } - } else { -// XposedBridge.log("Image replacement: " + colorFilter.getClass().getName()); - } + }/* else { + XposedBridge.log("Image replacement: " + colorFilter.getClass().getName()); + }*/ } } diff --git a/app/src/main/java/com/wmods/wppenhacer/utils/DrawableColors.java b/app/src/main/java/com/wmods/wppenhacer/utils/DrawableColors.java index f27d3089..bca5a4a9 100644 --- a/app/src/main/java/com/wmods/wppenhacer/utils/DrawableColors.java +++ b/app/src/main/java/com/wmods/wppenhacer/utils/DrawableColors.java @@ -110,9 +110,9 @@ public static int getColor(Drawable drawable) { } else if (drawable instanceof InsetDrawable insetDrawable) { color = getInsetDrawableColor(insetDrawable); } - if (colors.get(IColors.toString(color)) == null) { +// if (colors.get(IColors.toString(color)) == null) { // XposedBridge.log("(getColor) Color: " + IColors.toString(color) + " / Class: " + drawable.getClass()); - } +// } return color; } diff --git a/app/src/main/java/com/wmods/wppenhacer/views/HorizontalListView.java b/app/src/main/java/com/wmods/wppenhacer/views/HorizontalListView.java index bc2045f4..6b42747f 100644 --- a/app/src/main/java/com/wmods/wppenhacer/views/HorizontalListView.java +++ b/app/src/main/java/com/wmods/wppenhacer/views/HorizontalListView.java @@ -12,6 +12,8 @@ import android.widget.ListAdapter; import android.widget.Scroller; +import androidx.annotation.NonNull; + import java.util.LinkedList; import java.util.Queue; @@ -289,18 +291,18 @@ protected boolean onDown(MotionEvent e) { private final GestureDetector.OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { @Override - public boolean onDown(MotionEvent e) { + public boolean onDown(@NonNull MotionEvent e) { return HorizontalListView.this.onDown(e); } @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + public boolean onFling(MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) { return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY); } @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, + public boolean onScroll(MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) { getParent().requestDisallowInterceptTouchEvent(true); @@ -314,7 +316,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, } @Override - public boolean onSingleTapConfirmed(MotionEvent e) { + public boolean onSingleTapConfirmed(@NonNull MotionEvent e) { XposedBridge.log("onSingleTapConfirmed"); Rect viewRect = new Rect(); for (int i = 0; i < getChildCount(); i++) { @@ -346,7 +348,7 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } @Override - public void onLongPress(MotionEvent e) { + public void onLongPress(@NonNull MotionEvent e) { Rect viewRect = new Rect(); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/UnobfuscatorCache.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/UnobfuscatorCache.java index 5535f1ce..2c2cf579 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/UnobfuscatorCache.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/UnobfuscatorCache.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import de.robv.android.xposed.XSharedPreferences; @@ -161,7 +162,9 @@ public void saveClass(String message, Class messageClass) { } private String getKeyName() { - return Arrays.stream(Thread.currentThread().getStackTrace()).filter(stackTraceElement -> stackTraceElement.getClassName().equals(Unobfuscator.class.getName())).findFirst().get().getMethodName(); + AtomicReference keyName = new AtomicReference<>(""); + Arrays.stream(Thread.currentThread().getStackTrace()).filter(stackTraceElement -> stackTraceElement.getClassName().equals(Unobfuscator.class.getName())).findFirst().ifPresent(stackTraceElement -> keyName.set(stackTraceElement.getMethodName())); + return keyName.get(); } public Constructor getConstructor(ClassLoader loader, FunctionCall functionCall) throws Exception { diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/WppCore.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/WppCore.java index 9af66cb1..58b89bb9 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/WppCore.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/WppCore.java @@ -6,6 +6,8 @@ import android.content.SharedPreferences; import android.graphics.drawable.Drawable; +import androidx.annotation.Nullable; + import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -105,11 +107,14 @@ public static Object getContactManager() { return mContactManager; } + @Nullable public static String getContactName(Object userJid) { try { var contact = getContactMethod.invoke(mContactManager, userJid); - var stringField = Arrays.stream(contact.getClass().getDeclaredFields()).filter(f -> f.getType().equals(String.class)).toArray(Field[]::new); - return (String) stringField[3].get(contact); + if (contact != null) { + var stringField = Arrays.stream(contact.getClass().getDeclaredFields()).filter(f -> f.getType().equals(String.class)).toArray(Field[]::new); + return (String) stringField[3].get(contact); + } } catch (Exception e) { XposedBridge.log(e); } diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/SeparateGroup.java b/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/SeparateGroup.java index 295f72ec..288f03e9 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/SeparateGroup.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/SeparateGroup.java @@ -284,10 +284,13 @@ private List filterChat(Object thiz, List chatsList) { return editableChatList; } - private void hookTabList(Class home) throws Exception { + private void hookTabList(@NonNull Class home) throws Exception { var onCreateTabList = Unobfuscator.loadTabListMethod(loader); logDebug(Unobfuscator.getMethodDescriptor(onCreateTabList)); var fieldTabsList = Arrays.stream(home.getDeclaredFields()).filter(f -> f.getType().equals(List.class)).findFirst().orElse(null); + if (fieldTabsList == null) { + throw new NullPointerException("fieldTabList is NULL!"); + } fieldTabsList.setAccessible(true); XposedBridge.hookMethod(onCreateTabList, new XC_MethodHook() { diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/features/general/ShowEditMessage.java b/app/src/main/java/com/wmods/wppenhacer/xposed/features/general/ShowEditMessage.java index 237cdddf..43f44602 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/features/general/ShowEditMessage.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/features/general/ShowEditMessage.java @@ -159,7 +159,9 @@ private void showBottomDialog(ArrayList messages) { int dip = Utils.dipToPixels(20); linearLayout.setPadding(dip, dip, dip, 0); Drawable bg = DesignUtils.createDrawable("rc_dialog_bg"); - bg.setTint(DesignUtils.getPrimarySurfaceColor(ctx)); + if (bg != null) { + bg.setTint(DesignUtils.getPrimarySurfaceColor(ctx)); + } linearLayout.setBackground(bg); // Title View @@ -204,8 +206,10 @@ private void showBottomDialog(ArrayList messages) { linearLayout.addView(okButton); nestedScrollView0.addView(linearLayout); dialog.setContentView(nestedScrollView0); - dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x00000000)); - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + if (dialog.getWindow() != null) { + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x00000000)); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + } dialog.setCanceledOnTouchOutside(true); dialog.show(); }); From d8b0c9642094381588a5966d1ec12e3b0dab931c Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Tue, 7 May 2024 08:07:02 +0700 Subject: [PATCH 2/6] Restart WA: Check if can successfully reboot --- .../com/wmods/wppenhacer/ui/fragments/MediaFragment.java | 4 +++- .../java/com/wmods/wppenhacer/xposed/core/MainFeatures.java | 6 ++++-- .../main/java/com/wmods/wppenhacer/xposed/core/Utils.java | 6 +++++- .../java/com/wmods/wppenhacer/xposed/core/WaCallback.java | 4 +++- .../xposed/features/customization/CustomTheme.java | 3 +-- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java index 99b1cc9b..4c4db125 100644 --- a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java +++ b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java @@ -8,17 +8,19 @@ import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; +import android.util.Log; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; +import androidx.preference.Preference; import com.wmods.wppenhacer.R; import com.wmods.wppenhacer.ui.fragments.base.BasePreFragment; public class MediaFragment extends BasePreFragment { - + private final String TAG = "MediaFragment"; private ActivityResultLauncher mContract; @Override diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/MainFeatures.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/MainFeatures.java index 507b4fe1..2bc11d82 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/MainFeatures.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/MainFeatures.java @@ -128,8 +128,10 @@ private static void registerReceivers() { @Override public void onReceive(Context context, Intent intent) { if (context.getPackageName().equals(intent.getStringExtra("PKG"))) { - Toast.makeText(context, "Rebooting " + context.getPackageManager().getApplicationLabel(context.getApplicationInfo()) + "...", Toast.LENGTH_SHORT).show(); - Utils.doRestart(context); + var appName = context.getPackageManager().getApplicationLabel(context.getApplicationInfo()); + Toast.makeText(context, "Rebooting " + appName + "...", Toast.LENGTH_SHORT).show(); + if (!Utils.doRestart(context)) + Toast.makeText(context, "Unable to rebooting " + appName, Toast.LENGTH_SHORT).show(); } } }; diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/Utils.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/Utils.java index 0a44b0e8..8f6958f8 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/Utils.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/Utils.java @@ -24,14 +24,18 @@ public static Application getApplication() { return MainFeatures.mApp; } - public static void doRestart(Context context) { + public static boolean doRestart(Context context) { PackageManager packageManager = context.getPackageManager(); Intent intent = packageManager.getLaunchIntentForPackage(context.getPackageName()); + if (intent == null) + return false; + ComponentName componentName = intent.getComponent(); Intent mainIntent = Intent.makeRestartActivityTask(componentName); mainIntent.setPackage(context.getPackageName()); context.startActivity(mainIntent); Runtime.getRuntime().exit(0); + return true; } @SuppressLint("DiscouragedApi") diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/WaCallback.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/WaCallback.java index 520eb019..3a1ec564 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/WaCallback.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/WaCallback.java @@ -5,6 +5,7 @@ import android.app.Application; import android.content.Context; import android.os.Bundle; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -32,7 +33,8 @@ public void onActivityResumed(@NonNull Activity activity) { new AlertDialogWpp(activity). setMessage(activity.getString(ResId.string.restart_wpp)). setPositiveButton(activity.getString(ResId.string.yes), (dialog, which) -> { - Utils.doRestart(activity); + if (!Utils.doRestart(activity)) + Toast.makeText(activity, "Unable to rebooting activity", Toast.LENGTH_SHORT).show(); }) .setNegativeButton(activity.getString(ResId.string.no), null) .show(); diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/CustomTheme.java b/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/CustomTheme.java index e248878b..032a4096 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/CustomTheme.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/features/customization/CustomTheme.java @@ -73,8 +73,7 @@ public void doHook() throws Exception { if (!backgroundColor.equals("0")) { switch (c) { case "0b141a" -> colors.put(c, backgroundColor.substring(3)); - case "#ff0b141a" -> colors.put(c, backgroundColor); - case "#ff111b21" -> colors.put(c, backgroundColor); + case "#ff0b141a", "#ff111b21" -> colors.put(c, backgroundColor); } } From 0574f4d5fdc60c6c6295c16b3ae14ea431dbf877 Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Tue, 7 May 2024 08:08:57 +0700 Subject: [PATCH 3/6] Resource: value "in" is not for indonesian translation --- app/src/main/res/values-in/strings.xml | 227 ------------------------- 1 file changed, 227 deletions(-) delete mode 100644 app/src/main/res/values-in/strings.xml diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml deleted file mode 100644 index f82e33fc..00000000 --- a/app/src/main/res/values-in/strings.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - Modul LSPosed untuk menyesuaikan WhatsApp Anda - Anti Hapus Pesan - Pesan tidak akan dihapus untuk Anda - Sembunyikan mengetik - Orang lain tidak akan mengetahui bahwa Anda sedang mengetik - Sembunyikan merekam audio - Orang lain tidak akan mengetahui bahwa Anda sedang merekam audio - Sembunyikan tandai \"diteruskan\" - Anda dapat meneruskan pesan tanpa tandai \"diteruskan\" - Sembunyikan lihat status - Orang lain tidak akan mengetahui bahwa Anda telah melihat statusnya - Sembunyikan centang biru - Orang lain tidak akan mengetahui bahwa Anda telah membaca pesannya - Perhatian - Setiap kali Anda mengubah sesuatu di layar ini, mulai ulang WhatsApp! - Mulai ulang modul - Fungsi - Kustomisasi - Detik dalam waktu - Tampilkan detik di samping waktu apa pun dalam aplikasi - Tambahkan teks di sebelah waktu pesan - Jika Anda berada di layar ini, berarti Anda belum menginstal LSPosed atau tidak memiliki APK WhatsApp apa pun yang dipatch oleh LSPatch.\n\nSilahkan perbaiki! Mulai ulang modul dan coba lagi - Nonaktifkan sekali lihat - Anda dapat membuka pesan \"lihat sekali\" berkali-kali - Tema WhatsApp baru - Ubah warna dan tema ikon menjadi tema WhatsApp baru - Anti Hapus Status - Status tidak akan dihapus untuk Anda - Sembunyikan centang dua - Orang lain tidak akan mengetahui bahwa pesan mereka telah terkirim kepada Anda. -(PERHATIAN: Dapat menyebabkan keterlambatan dalam menerima pesan) - Lainnya - Anti Tarik Pesan - Setelan Privasi - "Setelan" - Mulai ulang otomatis - Opsi ini memerlukan akses root! -Saat diaktifkan, WhatsApp akan mulai ulang otomatis untuk menyimpan semua perubahan yang dilakukan di sini - Kesalahan saat memulai LSPosed - Waktu dalam format 12 jam - Setelan Media - Unduh Status - Tampilkan tombol untuk mengunduh status - Video Kualitas HD - Kirim video dalam kualitas HD - Warna - Sesuaikan warna Anda - Ubah semua warna di Whatsapp Anda, coba sekarang! - Warna saat ini: %s - Terapkan - Warna tidak valid - Media Sosial - Grup Telegram - Saluran Telegram - ItsMadruga (Pemilik) - Darker935 (Penyumbang) - Versi yang diperlukan: %s - Versi terinstall: %s - Versi WhatsApp ini tidak didukung oleh modul kami, gunakan versi WhatsApp yang didukung - WhatsApp tidak di instal! Instal dan coba lagi - Mulai ulang WhatsApp - Media - Umum - Gaya beranda baru - Layar Percakapan - Warna primer - Warna latar belakang - Warna sekunder - Gaya pengaturan baru - Aktifkan gaya pengaturan baru dengan foto profil di toolbar layar beranda - Aktifkan gaya beranda baru dengan navigasi bawah - Filter obrolan - Aktifkan filter asli obrolan, yang terletak di bagian atas layar beranda, memfilter kontak, bisnis, dan lainny - Ikon menu - Tambahkan ikon pada opsi menu diaplikasi - Tombol guratan - Buat guratan di sekitar tombol di WhatsApp - Ikon kerangka - Gaya ikon baru, jik Anda suka, aktifkan - Bekukan terakhir dilihat - Waktu terakhir Anda terlihat akan dibekukan. -(CATATAN: Anda tidak akan melihat pembaruan kehadiran apa pun dari pengguna lain, seperti mengetik, merekam, online) - Hapus batas penerusan pesan untuk 5 obrolan (normal) dan 1 obrolan (berkali-kali) - Hapus batas \"diteruskan\" - Teruskan - Layar Beranda - Tampilkan nama - Tampilkan nama profil Anda di bagian atas layar utama, menggantikan \"WhatsApp\" - Tampilkan bio Anda dibawah nama - Tampilkan bio - Setel ulang preferensi - Ketuk di sini untuk mengatur ulang semua pengaturan yang disimpan - Tindakan ini akan mengatur ulang semua preferensi yang tersimpan. -Anda perlu mengaktifkan dan mengatur ulang kembali - Setel ulang - Gelembung kiri - Gelembung kanan - Kustomisasi diterapkan secara asli oleh WhatsApp - Sesuaikan layar beranda sesuai keinginan Anda - Sesuaikan tampilan layar percakapan, seperti gelembung, entri, dan lainnya - Sembunyikan centang biru, centang dua, terakhir dilihat, dan lainnya - Unduh status, pengaturan media dan lainnya - Modul berfungsi dengan %s - Modul tidak berfungsi - LSPosed tidak ditemukan - LSPatch tidak ditemukan - Memuat - Modul dinonaktifkan di LSPosed - Modul diaktifkan, tetapi cakupannya kosong - Gambar Kualitas HD - Kirim gambar dalam kualitas HD - Unduh Sekali Lihat - Tampilkan tombol untuk mengunduh pesan \"lihat sekali\" - Grup terpisah - Pisahkan obrolan anda berdasarkan: Chat, Grup, Status, Komunitas, Panggilan - Centang biru setelah membalas - Kontak hanya akan melihat tanda centang biru setelah Anda membalas pesan -(CATATAN: Harus mengaktifkan \"Sembunyikan centang biru\") - Sembunyikan obrolan yang diarsipkan - Sembunyikan obrolan yang diarsipkan, klik dan tahan pada judul \"WhatsApp\" di layar beranda untuk mengakses obrolan - Sembunyikan lihat sekali dan pesan suara - Orang lain tidak akan mengetahui bahwa Anda telah membuka pesan \"lihat sekali\" dan pesan suara - Blokir Panggilan - Blokir panggilan WhatsApp berdasarkan jenis privasi - Tampilkan titik online - Tampilkan titik online berwarna hijau di layar beranda. -(CATATAN: Harus mengaktifkan tampilkan online untuk semua orang di menu pengaturan privasi WhatsApp) - Tampilkan tombol DND - Tampilkan tombol mode DND di toolbar layar beranda - Dev4Mod (Penyumbang) - Nonaktifkan batas pesan yang disematkan - Nonaktifkan batas 3 pesan yang disematkan - \"Hapus untuk semua orang\" di semua pesan - Hapus batas 24 jam dalam menghapus pesan untuk semua orang - Nonaktif - Tampilkan teks - Tampilkan ikon - Tidak ada - Blokir semua panggilan - Blokir nomor tak dikenal - Tampilkan pesan yang diedit - Tampilkan riwayat pesan yang diedit ketika mengklik \"Diedit\" pada pesan - Saat mode Pesawat (Offline) diaktifkan, Anda tidak akan dapat mengirim atau menerima pesan. - Mode Pesawat (Offline) - Aktifkan - Batal - Riwayat pesan yang diedit - Pesan asli - Obrolan baru - Nomor dengan kode negara - Pesan - Unduh - (Mulai ulang WhatsApp) - Terjadi kesalahan saat menyimpan, coba lagi - "Disimpan ke " - Sembunyikan tab di beranda - Sembunyikan tab di layar beranda seperti Pembaruan, Komunitas, Panggilan. - Komunitas - "Panggilan " - Pembaruan - Tentang - Aktifkan IGStatus di layar beranda - Tampilkan gaya status Instagram di layar beranda - Tidak ada pencarian - Ikon pencarian - Bilah pencarian - Sembunyikan rekomendasi saluran - Sembunyikan rekomendasi saluran dari tab Status - Hapus \"Baca selengkapnya\" - Hapus \"Baca selengkapnya\" dan tampilkan semua pesan panjang - Alat - Beranda - Privasi - Modul diaktifkan - Versi %s - Modul dinonaktifkan - WhatsApp berjalan di latar belakang - WhatsApp tidak berjalan atau belum diaktifkan di LSPosed - WhatsApp Bisnis tidak berjalan atau belum diaktifkan di LSPosed - WhatsApp harus dimulai ulang agar perubahan di Wa Enhancer dapat diterapkan. - -Apakah Anda ingin mulai ulang WhatsApp? - Versi %s tidak terdaftar - Media - Tampilkan tombol centang biru - Tampilkan tombol centang biru (dilihat/dibaca untuk pesan dan status) - Tandai dilihat/dibaca - WhatsApp Bisnis berjalan di latar belakang - Mengirim centang biru (dilihat/dibaca) - Aktifkan gaya status Facebook - Ubah gaya status asli menjadi gaya status Facebook - Kirim - Apakah Anda ingin mengirim stiker? - Kirim Stiker - Aktifkan filter obrolan - Tampilkan opsi untuk memfilter obrolan seperti: grup, kontak, dan pesan belum dibaca - Nonaktifkan saluran - Nonaktifkan saluran dari tab Status. -(CATATAN: Nonaktifkan IGStatus agar berfungsi!) - Obrolan - Ubah warna gelembung - Ubah warna gelembung di layar percakapan - Atur warna #00000000 ke warna default - Konfirmasi sebelum mengirim stiker - Tampilkan dialog sebelum mengirim stiker - Lokasi unduhan - Tingkatkan Batas Ukuran Video - Tingkatkan batas ukuran video menjadi 90MB - Kirim Video Resolusi Asli - Kirim video dalam resolusi asli untuk status, grup, dan obrolan - Kirim Video 60fps - Kirim video dalam 60fps untuk status, grup, dan obrolan - Status - Unduhan - Tampilkan tombol di menu - Tampilkan tombol di layar - Aktifkan log verbose untuk debugger - Panggilan telepon - Panggilan WhatsApp - Layar Beranda - Aktifkan pemilihan jenis panggilan - Tampilkan opsi untuk memilih panggilan melalui telepon atau WhatsApp - Ya - Tidak - From debcd43b9e275187034c902352f16b5cea381be4 Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Tue, 7 May 2024 09:50:59 +0700 Subject: [PATCH 4/6] Unonfuscator: Fix Exception message --- .../java/com/wmods/wppenhacer/xposed/core/Unobfuscator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/wmods/wppenhacer/xposed/core/Unobfuscator.java b/app/src/main/java/com/wmods/wppenhacer/xposed/core/Unobfuscator.java index d2bb34cd..9d077574 100644 --- a/app/src/main/java/com/wmods/wppenhacer/xposed/core/Unobfuscator.java +++ b/app/src/main/java/com/wmods/wppenhacer/xposed/core/Unobfuscator.java @@ -1116,7 +1116,7 @@ public static Field loadSetEditMessageField(ClassLoader loader) throws Exception return field.getFieldInstance(loader); } } - throw new RuntimeException("GetEditMessage method not found"); + throw new RuntimeException("SetEditMessage method not found"); }); } From 5ddbc3bfc4d3600b4ab1ede2fbe1fad1849796ae Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Thu, 9 May 2024 03:05:44 +0700 Subject: [PATCH 5/6] Fix missing semicolon --- .../java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java index 14415c87..01ad9f69 100644 --- a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java +++ b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java @@ -24,7 +24,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { mContract = registerForActivityResult(new ActivityResultContracts.OpenDocumentTree(), result -> { if (result == null) return; var realPath = RealPathUtil.getRealPathFromURI_API19(getContext(), result); - Preference preference = findPreference("localdownload") + Preference preference = findPreference("localdownload"); if (preference != null) { preference.setSummary(getPathFromContentUri(result)); } From 3783b25c127f42403a9cc9ab670496a969c279f7 Mon Sep 17 00:00:00 2001 From: BryanGIG Date: Thu, 9 May 2024 03:12:17 +0700 Subject: [PATCH 6/6] Fix build --- .../java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java index 01ad9f69..535877ab 100644 --- a/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java +++ b/app/src/main/java/com/wmods/wppenhacer/ui/fragments/MediaFragment.java @@ -3,6 +3,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Environment; +import android.util.Log; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; @@ -26,7 +27,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { var realPath = RealPathUtil.getRealPathFromURI_API19(getContext(), result); Preference preference = findPreference("localdownload"); if (preference != null) { - preference.setSummary(getPathFromContentUri(result)); + preference.setSummary(realPath); } mPrefs.edit().putString("localdownload", realPath).apply(); });