xiongzhu 1 rok temu
rodzic
commit
6d4320364b

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -4,7 +4,9 @@
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+
     <application
+        android:name=".MyApplication"
         android:allowBackup="true"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"

BIN
app/src/main/assets/bin/sqlite3.arm


BIN
app/src/main/assets/bin/sqlite3.arm64


BIN
app/src/main/assets/bin/sqlite3.x64


BIN
app/src/main/assets/bin/sqlite3.x86


+ 10 - 1
app/src/main/java/com/example/modifier/MyApplication.java

@@ -1,4 +1,13 @@
 package com.example.modifier;
 
-public class MyApplication {
+import android.app.Application;
+
+import com.google.android.material.color.DynamicColors;
+
+public class MyApplication extends Application {
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        DynamicColors.applyToActivitiesIfAvailable(this);
+    }
 }

+ 51 - 0
app/src/main/java/com/example/modifier/Utils.java

@@ -4,6 +4,7 @@ import android.accessibilityservice.AccessibilityServiceInfo;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.ServiceInfo;
+import android.content.res.AssetManager;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
@@ -20,9 +21,15 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -77,6 +84,9 @@ public class Utils {
         p.waitFor();
 
         Log.i(TAG, "Output: " + res);
+        if (err.length() > 0) {
+            Log.i(TAG, "Error: " + err);
+        }
 
         return res.toString();
     }
@@ -198,4 +208,45 @@ public class Utils {
         IndeterminateDrawable progressIndicatorDrawable = IndeterminateDrawable.createCircularDrawable(context, spec);
         button.setIcon(progressIndicatorDrawable);
     }
+
+    public static boolean copyAssetFolder(AssetManager assetManager,
+                                          String fromAssetPath, String toPath) {
+        try {
+            String[] files = assetManager.list(fromAssetPath);
+            new File(toPath).mkdirs();
+            boolean res = true;
+            for (String file : files)
+                if (file.contains("."))
+                    res &= copyAsset(assetManager,
+                            fromAssetPath + "/" + file,
+                            toPath + "/" + file);
+                else
+                    res &= copyAssetFolder(assetManager,
+                            fromAssetPath + "/" + file,
+                            toPath + "/" + file);
+            return res;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public static boolean copyAsset(AssetManager assetManager,
+                                    String fromAssetPath, String toPath) {
+        InputStream in = null;
+        OutputStream out = null;
+        try {
+            in = assetManager.open(fromAssetPath);
+            new File(toPath).createNewFile();
+            out = Files.newOutputStream(Paths.get(toPath));
+            IOUtils.copy(in, out);
+            in.close();
+            out.flush();
+            out.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 }

+ 52 - 0
app/src/main/java/com/example/modifier/fragments/UtilsFragment.java

@@ -1,9 +1,11 @@
 package com.example.modifier.fragments;
 
 import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -16,6 +18,10 @@ import com.example.modifier.R;
 import com.example.modifier.Utils;
 import com.example.modifier.databinding.FragmentUtilsBinding;
 
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -66,6 +72,52 @@ public class UtilsFragment extends Fragment {
                 }, 1500);
             });
         });
+        binding.btnClearConv.setOnClickListener(v -> {
+            binding.btnClearConv.setEnabled(false);
+            Utils.addProgressIndicator(getContext(), binding.btnClearConv);
+            handler.post(() -> {
+                executor.execute(() -> {
+                    try {
+                        Utils.copyAssetFolder(getContext().getAssets(), "bin", new File(getContext().getDataDir(), "bin").getPath());
+//                        Utils.runAsRoot("su -c \"\"");
+                        Log.i("Modifier", "arch: " + StringUtils.join(Build.SUPPORTED_ABIS, ", "));
+
+                        String arch = null;
+                        for (String supportedAbi : Build.SUPPORTED_ABIS) {
+                            if ("x86".equals(supportedAbi)) {
+                                arch = "x86";
+                            } else if ("x86_64".equals(supportedAbi)) {
+                                arch = "x64";
+                            } else if ("arm64-v8a".equals(supportedAbi)) {
+                                arch = "arm64";
+                            } else if ("armeabi-v7a".equals(supportedAbi)) {
+                                arch = "arm";
+                            }
+                            if (StringUtils.isNoneBlank(arch)) {
+                                String binPath = new File(getContext().getDataDir(), "bin/sqlite3." + arch).getPath();
+                                Log.i("Modifier", "sqlite3 binPath: " + binPath);
+                                Utils.runAsRoot("chmod +x " + binPath, binPath + " /data/data/com.google.android.apps.messaging/databases/bugle_db \"DELETE FROM conversations;\"", "echo ok");
+                                Commons.stop(false, false, true);
+                                break;
+                            }
+                        }
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    handler.post(() -> {
+                        binding.btnClearConv.setIconResource(R.drawable.ic_done);
+                        binding.btnClearConv.setText("OK");
+                        handler.postDelayed(() -> {
+                            binding.btnClearConv.setEnabled(true);
+                            binding.btnClearConv.setIcon(null);
+                            binding.btnClearConv.setText("Clear Conversations");
+                        }, 1500);
+                    });
+                });
+            });
+
+        });
         return binding.getRoot();
     }
 

+ 29 - 0
app/src/main/res/layout/fragment_utils.xml

@@ -130,6 +130,35 @@
                         android:text="Send" />
                 </LinearLayout>
             </com.google.android.material.card.MaterialCardView>
+
+            <com.google.android.material.card.MaterialCardView
+                style="@style/Widget.Material3.CardView.Filled"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="MISC"
+                        android:textColor="?attr/colorPrimary"
+                        android:textSize="14sp"
+                        android:textStyle="bold" />
+
+                    <com.google.android.material.button.MaterialButton
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/btn_clear_conv"
+                        android:text="Clear Conversations" />
+                </LinearLayout>
+            </com.google.android.material.card.MaterialCardView>
         </LinearLayout>
     </ScrollView>