xiongzhu 1 jaar geleden
bovenliggende
commit
a3b7a9bdf5
30 gewijzigde bestanden met toevoegingen van 667 en 696 verwijderingen
  1. 1 0
      app/src/main/AndroidManifest.xml
  2. BIN
      app/src/main/ic_launcher-playstore.png
  3. 0 83
      app/src/main/java/com/example/modifier/Commons.java
  4. 148 0
      app/src/main/java/com/example/modifier/Global.java
  5. 94 93
      app/src/main/java/com/example/modifier/ModifierService.java
  6. 1 1
      app/src/main/java/com/example/modifier/MyApplication.java
  7. 1 0
      app/src/main/java/com/example/modifier/Utils.java
  8. 68 37
      app/src/main/java/com/example/modifier/fragments/BackupFragment.java
  9. 19 43
      app/src/main/java/com/example/modifier/fragments/SettingsFragment.java
  10. 6 7
      app/src/main/java/com/example/modifier/fragments/UtilsFragment.java
  11. 70 166
      app/src/main/res/drawable/ic_launcher_background.xml
  12. 10 26
      app/src/main/res/drawable/ic_launcher_foreground.xml
  13. 35 25
      app/src/main/res/layout/floating_window.xml
  14. 2 2
      app/src/main/res/layout/fragment_backup.xml
  15. 2 3
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  16. 2 3
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  17. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.webp
  18. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  19. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.webp
  20. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  21. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.webp
  22. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  23. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  24. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  25. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  26. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  27. 112 112
      app/src/main/res/values-night/colors.xml
  28. 94 94
      app/src/main/res/values/colors.xml
  29. 2 0
      app/src/main/res/values/strings.xml
  30. 0 1
      app/src/main/res/values/themes.xml

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

@@ -9,6 +9,7 @@
         android:name=".MyApplication"
         android:allowBackup="true"
         android:dataExtractionRules="@xml/data_extraction_rules"
+        android:enableOnBackInvokedCallback="true"
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"

BIN
app/src/main/ic_launcher-playstore.png


+ 0 - 83
app/src/main/java/com/example/modifier/Commons.java

@@ -1,83 +0,0 @@
-package com.example.modifier;
-
-import android.content.Context;
-
-import androidx.core.content.ContextCompat;
-
-import com.google.gson.Gson;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Commons {
-
-    public static void save(Config config) {
-        Context context = Utils.getContext();
-        try {
-            File file = new File(ContextCompat.getDataDir(context), "config.json");
-            Gson gson = new Gson();
-            String json = gson.toJson(config);
-
-            try {
-                FileWriter writer = new FileWriter(file);
-                writer.write(json);
-                writer.close();
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-            Utils.runAsRoot(
-                    "cp " + file.getPath() + " /data/data/com.android.phone/rcsConfig.json",
-                    "echo 'copied to phone'",
-                    "chmod 777 /data/data/com.android.phone/rcsConfig.json");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void clear(boolean gsf, boolean gms, boolean sms) {
-        try {
-
-            List<String> cmds = new ArrayList<>();
-            if (gsf) {
-                cmds.add("pm clear com.google.android.gsf");
-                cmds.add("echo 'cleared gsf'");
-            }
-            if (gms) {
-                cmds.add("pm clear com.google.android.gms");
-                cmds.add("echo 'cleared gms'");
-            }
-            if (sms) {
-                cmds.add("pm clear com.google.android.apps.messaging");
-                cmds.add("echo 'cleared sms'");
-            }
-            Utils.runAsRoot(cmds.toArray(new String[0]));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void stop(boolean gsf, boolean gms, boolean sms) {
-        try {
-            List<String> cmds = new ArrayList<>();
-            if (gsf) {
-                cmds.add("am force-stop com.google.android.gsf");
-                cmds.add("echo 'stopped gsf'");
-            }
-            if (gms) {
-                cmds.add("am force-stop com.google.android.gms");
-                cmds.add("echo 'stopped gms'");
-            }
-            if (sms) {
-                cmds.add("am force-stop com.google.android.apps.messaging");
-                cmds.add("echo 'stopped sms'");
-            }
-            Utils.runAsRoot(cmds.toArray(new String[0]));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-}

+ 148 - 0
app/src/main/java/com/example/modifier/Global.java

@@ -0,0 +1,148 @@
+package com.example.modifier;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import androidx.core.content.ContextCompat;
+
+import com.android.volley.RequestQueue;
+import com.android.volley.toolbox.JsonObjectRequest;
+import com.android.volley.toolbox.RequestFuture;
+import com.android.volley.toolbox.Volley;
+import com.google.gson.Gson;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+public class Global {
+
+    public static String serverUrl = "";
+    public static long rcsTimeout = 2000;
+    public static Config config = new Config("", "", "", "", "", "", "");
+    ExecutorService executor = Executors.newFixedThreadPool(8);
+
+
+    public static void load() {
+        Context context = Utils.getContext();
+        serverUrl = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE).getString("server", "http://192.168.6.215:3000");
+        RequestQueue queue = Volley.newRequestQueue(context);
+        RequestFuture<JSONObject> future = RequestFuture.newFuture();
+        JsonObjectRequest request = new JsonObjectRequest(serverUrl + "/api/sys-config/rcs_wait", future, future);
+        queue.add(request);
+        try {
+            JSONObject jsonObject = future.get(60, TimeUnit.SECONDS);
+            rcsTimeout = Long.parseLong(jsonObject.optString("value"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        try {
+            File file = new File(ContextCompat.getDataDir(context), "config.json");
+            if (file.exists()) {
+                Gson gson = new Gson();
+                String json = FileUtils.readFileToString(file, "UTF-8");
+                config = gson.fromJson(json, Config.class);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static Set<String> getServers() {
+        Context context = Utils.getContext();
+        Set<String> defServers = new HashSet<>();
+        defServers.add("http://192.168.6.215:3000");
+        defServers.add("http://192.168.50.135:3000");
+        SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
+        return new HashSet<>(prefs.getStringSet("servers", defServers));
+    }
+
+    public static void saveServer(String server) {
+        serverUrl = server;
+        Context context = Utils.getContext();
+        SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
+        Set<String> servers = getServers();
+        servers.add(server);
+        prefs.edit().putStringSet("servers", servers)
+                .putString("server", server)
+                .apply();
+    }
+
+    public static void save(Config config) {
+        Context context = Utils.getContext();
+        try {
+            File file = new File(ContextCompat.getDataDir(context), "config.json");
+            Gson gson = new Gson();
+            String json = gson.toJson(config);
+
+            try {
+                FileWriter writer = new FileWriter(file);
+                writer.write(json);
+                writer.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            Utils.runAsRoot(
+                    "cp " + file.getPath() + " /data/data/com.android.phone/rcsConfig.json",
+                    "echo 'copied to phone'",
+                    "chmod 777 /data/data/com.android.phone/rcsConfig.json");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void clear(boolean gsf, boolean gms, boolean sms) {
+        try {
+
+            List<String> cmds = new ArrayList<>();
+            if (gsf) {
+                cmds.add("pm clear com.google.android.gsf");
+                cmds.add("echo 'cleared gsf'");
+            }
+            if (gms) {
+                cmds.add("pm clear com.google.android.gms");
+                cmds.add("echo 'cleared gms'");
+            }
+            if (sms) {
+                cmds.add("pm clear com.google.android.apps.messaging");
+                cmds.add("echo 'cleared sms'");
+            }
+            Utils.runAsRoot(cmds.toArray(new String[0]));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void stop(boolean gsf, boolean gms, boolean sms) {
+        try {
+            List<String> cmds = new ArrayList<>();
+            if (gsf) {
+                cmds.add("am force-stop com.google.android.gsf");
+                cmds.add("echo 'stopped gsf'");
+            }
+            if (gms) {
+                cmds.add("am force-stop com.google.android.gms");
+                cmds.add("echo 'stopped gms'");
+            }
+            if (sms) {
+                cmds.add("am force-stop com.google.android.apps.messaging");
+                cmds.add("echo 'stopped sms'");
+            }
+            Utils.runAsRoot(cmds.toArray(new String[0]));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 94 - 93
app/src/main/java/com/example/modifier/ModifierService.java

@@ -6,29 +6,25 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.net.Uri;
 import android.os.Build;
 import android.util.DisplayMetrics;
 import android.util.Log;
-import android.view.GestureDetector;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
-import android.view.View;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
-import androidx.appcompat.view.ContextThemeWrapper;
 
 import com.example.modifier.databinding.FloatingWindowBinding;
 import com.google.android.material.color.DynamicColors;
-import com.google.android.material.color.DynamicColorsOptions;
 
+import org.apache.commons.lang3.StringUtils;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -37,6 +33,7 @@ import java.util.Optional;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
 import io.socket.client.IO;
@@ -62,41 +59,43 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         return instance;
     }
 
-    public void connect(String server) {
-        if (mSocket != null) {
-            mSocket.disconnect();
-        }
-        try {
-            canSend = getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE).getBoolean("canSend", false);
-            mSocketOpts.query = "model=" + Build.MANUFACTURER + " " + Build.MODEL + "&name=" + Build.DEVICE + "&id=" + Utils.getUniqueID() + "&canSend=" + canSend;
-            mSocket = IO.socket(server, mSocketOpts);
-            mSocket.on("message", this);
-            mSocket.on(Socket.EVENT_CONNECT, args -> {
-                Log.i(TAG, "Connected to server");
-            });
-            mSocket.on(Socket.EVENT_DISCONNECT, args -> {
-                Log.i(TAG, "Disconnected from server");
-            });
-            mSocket.on(Socket.EVENT_CONNECT_ERROR, args -> {
-                Log.i(TAG, "Connection error: " + args[0]);
-                if (args[0] instanceof Exception) {
-                    Exception e = (Exception) args[0];
-                    e.printStackTrace();
-                }
-            });
+    public void connect() {
+        mExecutor.submit(() -> {
+            Global.load();
+            if (mSocket != null) {
+                mSocket.disconnect();
+            }
+            try {
+                canSend = getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE).getBoolean("canSend", false);
+                mSocketOpts.query = "model=" + Build.MANUFACTURER + " " + Build.MODEL + "&name=" + Build.DEVICE + "&id=" + Utils.getUniqueID() + "&canSend=" + canSend;
+                mSocket = IO.socket(Global.serverUrl, mSocketOpts);
+                mSocket.on("message", this);
+                mSocket.on(Socket.EVENT_CONNECT, args -> {
+                    Log.i(TAG, "Connected to server");
+                });
+                mSocket.on(Socket.EVENT_DISCONNECT, args -> {
+                    Log.i(TAG, "Disconnected from server");
+                });
+                mSocket.on(Socket.EVENT_CONNECT_ERROR, args -> {
+                    Log.i(TAG, "Connection error: " + args[0]);
+                    if (args[0] instanceof Exception) {
+                        Exception e = (Exception) args[0];
+                        e.printStackTrace();
+                    }
+                });
 
-            mSocket.connect();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+                mSocket.connect();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
     }
 
     @Override
     public void onCreate() {
         super.onCreate();
         Log.i(TAG, "Starting ModifierService");
-        String server = getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE).getString("server", "http://192.168.6.215:3000");
-        connect(server);
+        connect();
     }
 
     @Override
@@ -126,45 +125,51 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
                 } else if ("task".equals(action)) {
                     JSONArray data = json.optJSONArray("data");
                     String id = json.optString("id");
-                    if (data != null) {
-                        JSONArray success = new JSONArray();
-                        JSONArray fail = new JSONArray();
-                        for (int i = 0; i < data.length(); i++) {
-                            JSONObject task = data.optJSONObject(i);
-                            String to = task.optString("number");
-                            String body = task.optString("message");
-                            int taskId = task.optInt("id");
-                            try {
-                                if (send(to, body)) {
-                                    success.put(taskId);
-                                } else {
-                                    fail.put(taskId);
-                                }
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                                fail.put(taskId);
-                            }
-                        }
-                        JSONObject res = new JSONObject();
-                        try {
-                            res.put("id", id);
-                            res.put("status", 0);
-                            res.put("data", new JSONObject()
-                                    .put("success", success)
-                                    .put("fail", fail));
-                        } catch (JSONException e) {
-                        }
-                        mSocket.emit("callback", res);
-                        updateDevice("busy", false);
+                    if (data != null && StringUtils.isNoneBlank(id)) {
+                        runTask(id, data);
                     }
                 }
             }
         }
     }
 
+    private void runTask(String id, JSONArray data) {
+        mExecutor.submit(() -> {
+            Global.load();
+            JSONArray success = new JSONArray();
+            JSONArray fail = new JSONArray();
+            for (int i = 0; i < data.length(); i++) {
+                JSONObject task = data.optJSONObject(i);
+                String to = task.optString("number");
+                String body = task.optString("message");
+                int taskId = task.optInt("id");
+                try {
+                    if (send(to, body)) {
+                        success.put(taskId);
+                    } else {
+                        fail.put(taskId);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    fail.put(taskId);
+                }
+            }
+            JSONObject res = new JSONObject();
+            try {
+                res.put("id", id);
+                res.put("status", 0);
+                res.put("data", new JSONObject()
+                        .put("success", success)
+                        .put("fail", fail));
+            } catch (JSONException e) {
+            }
+            mSocket.emit("callback", res);
+            updateDevice("busy", false);
+        });
+    }
+
     private boolean send(String to, String body) {
         Log.i(TAG, "Sending SMS to " + to + ": " + body);
-        String cmd = "am start -a android.intent.action.SENDTO -d sms:" + to + " --es sms_body '" + body + "' --ez exit_on_sent true";
         Intent intent = new Intent(Intent.ACTION_SENDTO);
         intent.setData(Uri.parse("sms:" + to));
         intent.putExtra("sms_body", body);
@@ -172,37 +177,33 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         startActivity(intent);
         try {
-//            Utils.runAsRoot(cmd);
-
             Log.i(TAG, "Command executed successfully, waiting for app to open...");
             ScheduledFuture<Boolean> f = mExecutor.schedule(() -> {
-                Log.i(TAG, "Getting root node...");
-                AccessibilityNodeInfo root = getRootInActiveWindow();
-                String packageName = root.getPackageName().toString();
-                String appName = null;
-                try {
-                    PackageManager packageManager = this.getPackageManager();
-                    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
-                    appName = packageManager.getApplicationLabel(applicationInfo).toString();
-                } catch (PackageManager.NameNotFoundException e) {
-                    e.printStackTrace();
-                }
-                Log.i(TAG, "App: " + appName + " (" + packageName + ")");
-                TraverseResult result = new TraverseResult();
-                traverseNode(root, result);
-                if (result.isRcsCapable()) {
-                    if (result.getSendBtn() == null) {
-                        Log.i(TAG, "Send button not found");
+                long ts = System.currentTimeMillis();
+                while (System.currentTimeMillis() - ts < Global.rcsTimeout) {
+                    AccessibilityNodeInfo root = getRootInActiveWindow();
+                    String packageName = root.getPackageName().toString();
+                    TraverseResult result = new TraverseResult();
+                    traverseNode(root, result);
+                    if (result.isRcsCapable()) {
+                        if (result.getSendBtn() == null) {
+                            Log.i(TAG, "Send button not found");
+                        } else {
+                            Log.i(TAG, "Clicking send button");
+                            result.getSendBtn().performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                            return true;
+                        }
                     } else {
-                        Log.i(TAG, "Clicking send button");
-                        result.getSendBtn().performAction(AccessibilityNodeInfo.ACTION_CLICK);
-                        return true;
+                        Log.i(TAG, "RCS not detected");
+                    }
+                    try {
+                        Thread.sleep(500);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
                     }
-                } else {
-                    Log.i(TAG, "RCS not detected");
                 }
                 return false;
-            }, 2, java.util.concurrent.TimeUnit.SECONDS);
+            }, 1000, TimeUnit.MILLISECONDS);
             synchronized (f) {
                 Log.i(TAG, "Waiting for task to complete...");
                 return f.get();
@@ -223,7 +224,7 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         String text = Optional.ofNullable(node.getText()).map(CharSequence::toString).orElse(null);
         String id = node.getViewIdResourceName();
 
-        Log.i(TAG, "Node: class=" + className + ", text=" + text + ", name=" + name + ", id=" + id);
+        Log.d(TAG, "Node: class=" + className + ", text=" + text + ", name=" + name + ", id=" + id);
 
         if ("Compose:Draft:Send".equals(name)) {
             result.setSendBtn(node);
@@ -263,8 +264,8 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         windowManager.getDefaultDisplay().getMetrics(displayMetrics);
         int height = displayMetrics.heightPixels;
         int width = displayMetrics.widthPixels;
-        int maxX = width - Utils.dp2px(this, 150);
-        int maxY = height - Utils.dp2px(this, 100);
+        int maxX = width - Utils.dp2px(this, 108);
+        int maxY = height - Utils.dp2px(this, 108);
 
 
         FrameLayout mLayout = new FrameLayout(this);
@@ -310,7 +311,7 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         binding.swConnect.setChecked(true);
         binding.swConnect.setOnCheckedChangeListener((buttonView, isChecked) -> {
             if (isChecked) {
-                mSocket.connect();
+                connect();
             } else {
                 mSocket.disconnect();
             }

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

@@ -8,6 +8,6 @@ public class MyApplication extends Application {
     @Override
     public void onCreate() {
         super.onCreate();
-        DynamicColors.applyToActivitiesIfAvailable(this);
+//        DynamicColors.applyToActivitiesIfAvailable(this);
     }
 }

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

@@ -254,4 +254,5 @@ public class Utils {
         float scale = context.getResources().getDisplayMetrics().density;
         return (int) (dp * scale + 0.5f);
     }
+
 }

+ 68 - 37
app/src/main/java/com/example/modifier/fragments/BackupFragment.java

@@ -2,65 +2,96 @@ package com.example.modifier.fragments;
 
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 import androidx.fragment.app.Fragment;
 
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import com.example.modifier.R;
+import com.example.modifier.Utils;
+import com.example.modifier.databinding.FragmentBackupBinding;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.gson.Gson;
 
-/**
- * A simple {@link Fragment} subclass.
- * Use the {@link BackupFragment#newInstance} factory method to
- * create an instance of this fragment.
- */
-public class BackupFragment extends Fragment {
+import org.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
-    // TODO: Rename parameter arguments, choose names that match
-    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
-    private static final String ARG_PARAM1 = "param1";
-    private static final String ARG_PARAM2 = "param2";
+public class BackupFragment extends Fragment {
 
-    // TODO: Rename and change types of parameters
-    private String mParam1;
-    private String mParam2;
+    FragmentBackupBinding binding;
+    Handler handler = new Handler(Looper.getMainLooper());
+    ExecutorService executor = Executors.newFixedThreadPool(4);
 
     public BackupFragment() {
         // Required empty public constructor
     }
 
-    /**
-     * Use this factory method to create a new instance of
-     * this fragment using the provided parameters.
-     *
-     * @param param1 Parameter 1.
-     * @param param2 Parameter 2.
-     * @return A new instance of fragment BackupFragment.
-     */
-    // TODO: Rename and change types and number of parameters
-    public static BackupFragment newInstance(String param1, String param2) {
-        BackupFragment fragment = new BackupFragment();
-        Bundle args = new Bundle();
-        args.putString(ARG_PARAM1, param1);
-        args.putString(ARG_PARAM2, param2);
-        fragment.setArguments(args);
-        return fragment;
-    }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (getArguments() != null) {
-            mParam1 = getArguments().getString(ARG_PARAM1);
-            mParam2 = getArguments().getString(ARG_PARAM2);
-        }
+
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-        // Inflate the layout for this fragment
-        return inflater.inflate(R.layout.fragment_backup, container, false);
+        binding = FragmentBackupBinding.inflate(inflater, container, false);
+        binding.fabBackup.setOnClickListener(v -> {
+
+            Utils.addProgressIndicator(getContext(), binding.fabBackup);
+            binding.fabBackup.setEnabled(false);
+
+            executor.submit(() -> {
+                createBackup();
+
+                handler.post(() -> {
+                    binding.fabBackup.setIconResource(R.drawable.ic_done);
+                    binding.fabBackup.setText("OK");
+                    handler.postDelayed(() -> {
+                        binding.fabBackup.setEnabled(true);
+                        binding.fabBackup.setIconResource(R.drawable.ic_add);
+                        binding.fabBackup.setText("Backup");
+                    }, 1500);
+                });
+            });
+
+        });
+        return binding.getRoot();
+    }
+
+    private void createBackup() {
+        try {
+            File backupDir = new File(ContextCompat.getExternalFilesDirs(getContext(), "backup")[0], System.currentTimeMillis() + "");
+            backupDir.mkdirs();
+            File file = new File(ContextCompat.getDataDir(getContext()), "config.json");
+            if (!file.exists()) {
+                throw new Exception("Config file not found");
+            }
+            IOUtils.copy(Files.newInputStream(file.toPath()), Files.newOutputStream(new File(backupDir, "config.json").toPath()));
+
+            File dataDir = new File(backupDir, "data");
+            dataDir.mkdirs();
+
+            Utils.runAsRoot("cp -r /data/data/com.google.android.apps.messaging/* " + dataDir.getPath());
+
+            Log.d("BackupFragment", "Backup created at " + backupDir.getPath());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 }

+ 19 - 43
app/src/main/java/com/example/modifier/fragments/SettingsFragment.java

@@ -1,8 +1,6 @@
 package com.example.modifier.fragments;
 
 import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.SharedPreferences;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
@@ -16,14 +14,12 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Toast;
 
-import com.example.modifier.BuildConfig;
+import com.example.modifier.Global;
 import com.example.modifier.Config;
 import com.example.modifier.ModifierService;
 import com.example.modifier.R;
 import com.example.modifier.Utils;
 import com.example.modifier.databinding.FragmentSettingsBinding;
-import com.google.android.material.progressindicator.CircularProgressIndicatorSpec;
-import com.google.android.material.progressindicator.IndeterminateDrawable;
 import com.google.gson.Gson;
 
 import org.apache.commons.lang3.RandomStringUtils;
@@ -32,10 +28,8 @@ import org.apache.commons.lang3.StringUtils;
 import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;
-import java.util.HashSet;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -44,7 +38,7 @@ public class SettingsFragment extends Fragment {
     private FragmentSettingsBinding binding;
 
     Handler handler = new Handler(Looper.getMainLooper());
-    ExecutorService executor = Executors.newFixedThreadPool(32);
+    ExecutorService executor = Executors.newFixedThreadPool(4);
 
     public SettingsFragment() {
 
@@ -80,32 +74,19 @@ public class SettingsFragment extends Fragment {
         binding.btnSave.setOnClickListener(v -> {
             onSave();
         });
-
-        Set<String> defServers = new HashSet<>();
-        defServers.add("http://192.168.6.215:3000");
-        defServers.add("http://192.168.50.135:3000");
-        SharedPreferences prefs = getContext().getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
-        Set<String> servers = new HashSet<>(prefs.getStringSet("servers", defServers));
-        binding.etServer.setSimpleItems(servers.toArray(new String[0]));
         binding.etServer.setThreshold(1000);
-        if (prefs.contains("server")) {
-            binding.etServer.setText(prefs.getString("server", ""));
-        }
         binding.btnServer.setOnClickListener(v -> {
             String server = binding.etServer.getText().toString();
             if (StringUtils.isEmpty(server)) {
                 Toast.makeText(getContext(), "Server is required", Toast.LENGTH_SHORT).show();
                 return;
             }
-            prefs.edit().putString("server", server).apply();
-
-            servers.add(server);
-            prefs.edit().putStringSet("servers", servers).apply();
-            binding.etServer.setSimpleItems(servers.toArray(new String[0]));
+            Global.saveServer(server);
+            binding.etServer.setSimpleItems(Global.getServers().toArray(new String[0]));
 
             ModifierService modifierService = ModifierService.getInstance();
             if (modifierService != null) {
-                modifierService.connect(server);
+                modifierService.connect();
             }
 
             Utils.addProgressIndicator(getContext(), binding.btnServer);
@@ -121,27 +102,22 @@ public class SettingsFragment extends Fragment {
             }, 500);
         });
 
-        handler.post(() -> {
-            Gson gson = new Gson();
-            try {
-                File file = new File(ContextCompat.getDataDir(getContext()), "config.json");
-                if (file.exists()) {
-                    FileReader reader = new FileReader(file);
-                    Config config = gson.fromJson(reader, Config.class);
-                    binding.etNumber.setText(config.getNumber());
-                    binding.etMcc.setText(config.getMcc());
-                    binding.etMnc.setText(config.getMnc());
-                    binding.etIccid.setText(config.getIccid());
-                    binding.etImsi.setText(config.getImsi());
-                    binding.etImei.setText(config.getImei());
-                    binding.etCountry.setText(config.getCountry());
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
+        executor.execute(() -> {
+            Global.load();
+            handler.post(() -> {
+                binding.etServer.setText(Global.serverUrl);
+                binding.etServer.setSimpleItems(Global.getServers().toArray(new String[0]));
+                Config config = Global.config;
+                binding.etNumber.setText(config.getNumber());
+                binding.etMcc.setText(config.getMcc());
+                binding.etMnc.setText(config.getMnc());
+                binding.etIccid.setText(config.getIccid());
+                binding.etImsi.setText(config.getImsi());
+                binding.etImei.setText(config.getImei());
+                binding.etCountry.setText(config.getCountry());
+            });
         });
 
-
         return binding.getRoot();
     }
 

+ 6 - 7
app/src/main/java/com/example/modifier/fragments/UtilsFragment.java

@@ -13,7 +13,7 @@ import android.view.ViewGroup;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 
-import com.example.modifier.Commons;
+import com.example.modifier.Global;
 import com.example.modifier.R;
 import com.example.modifier.Utils;
 import com.example.modifier.databinding.FragmentUtilsBinding;
@@ -21,7 +21,6 @@ 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;
 
@@ -30,7 +29,7 @@ public class UtilsFragment extends Fragment {
     private FragmentUtilsBinding binding;
 
     Handler handler = new Handler(Looper.getMainLooper());
-    ExecutorService executor = Executors.newFixedThreadPool(32);
+    ExecutorService executor = Executors.newFixedThreadPool(4);
 
     public UtilsFragment() {
     }
@@ -97,7 +96,7 @@ public class UtilsFragment extends Fragment {
                                 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);
+                                Global.stop(false, false, true);
                                 break;
                             }
                         }
@@ -128,8 +127,8 @@ public class UtilsFragment extends Fragment {
             boolean gsf = binding.cbGsf.isChecked();
             boolean gms = binding.cbGms.isChecked();
             boolean sms = binding.cbSms.isChecked();
-            Commons.clear(gsf, gms, sms);
-            Commons.stop(gsf, gms, sms);
+            Global.clear(gsf, gms, sms);
+            Global.stop(gsf, gms, sms);
             handler.post(() -> {
                 binding.btnClear.setIconResource(R.drawable.ic_done);
                 binding.btnClear.setText("OK");
@@ -150,7 +149,7 @@ public class UtilsFragment extends Fragment {
             boolean gsf = binding.cbGsf.isChecked();
             boolean gms = binding.cbGms.isChecked();
             boolean sms = binding.cbSms.isChecked();
-            Commons.stop(gsf, gms, sms);
+            Global.stop(gsf, gms, sms);
             handler.post(() -> {
                 binding.btnStop.setIconResource(R.drawable.ic_done);
                 binding.btnStop.setText("OK");

+ 70 - 166
app/src/main/res/drawable/ic_launcher_background.xml

@@ -1,170 +1,74 @@
 <?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
+<vector
     android:height="108dp"
+    android:width="108dp"
+    android:viewportHeight="108"
     android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#3DDC84"
-        android:pathData="M0,0h108v108h-108z" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M9,0L9,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,0L19,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,0L29,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,0L39,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,0L49,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,0L59,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,0L69,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,0L79,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M89,0L89,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M99,0L99,108"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,9L108,9"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,19L108,19"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,29L108,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,39L108,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,49L108,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,59L108,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,69L108,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,79L108,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,89L108,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M0,99L108,99"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,29L89,29"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,39L89,39"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,49L89,49"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,59L89,59"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,69L89,69"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M19,79L89,79"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M29,19L29,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M39,19L39,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M49,19L49,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M59,19L59,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M69,19L69,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
-    <path
-        android:fillColor="#00000000"
-        android:pathData="M79,19L79,89"
-        android:strokeWidth="0.8"
-        android:strokeColor="#33FFFFFF" />
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#4A6360"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
 </vector>

+ 10 - 26
app/src/main/res/drawable/ic_launcher_foreground.xml

@@ -1,30 +1,14 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
     android:width="108dp"
     android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
-        <aapt:attr name="android:fillColor">
-            <gradient
-                android:endX="85.84757"
-                android:endY="92.4963"
-                android:startX="42.9492"
-                android:startY="49.59793"
-                android:type="linear">
-                <item
-                    android:color="#44000000"
-                    android:offset="0.0" />
-                <item
-                    android:color="#00000000"
-                    android:offset="1.0" />
-            </gradient>
-        </aapt:attr>
-    </path>
+    android:viewportWidth="20"
+    android:viewportHeight="20">
+  <group android:scaleX="0.55"
+      android:scaleY="0.55"
+      android:translateX="4.5"
+      android:translateY="4.5">
     <path
-        android:fillColor="#FFFFFF"
-        android:fillType="nonZero"
-        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
-        android:strokeWidth="1"
-        android:strokeColor="#00000000" />
-</vector>
+        android:pathData="M14.69,11.503c1,0 1.81,0.81 1.81,1.81v0.689h-0.005c-0.034,0.78 -0.248,1.757 -1.123,2.555C14.416,17.43 12.765,18 10,18c-2.766,0 -4.416,-0.57 -5.372,-1.443c-0.875,-0.798 -1.089,-1.776 -1.123,-2.555L3.5,14.002v-0.69c0,-0.999 0.81,-1.809 1.81,-1.809h9.38zM6.5,3A1.5,1.5 0,0 0,5 4.5v4A1.5,1.5 0,0 0,6.5 10h7A1.5,1.5 0,0 0,15 8.5v-4A1.5,1.5 0,0 0,13.5 3h-3v-0.5A0.48,0.48 0,0 0,10 2c-0.276,0 -0.5,0.23 -0.5,0.5L9.5,3h-3zM7,6.5a1,1 0,1 1,2 0a1,1 0,0 1,-2 0zM11,6.5a1,1 0,1 1,2 0a1,1 0,0 1,-2 0z"
+        android:fillColor="#ffffff"/>
+  </group>
+</vector>

+ 35 - 25
app/src/main/res/layout/floating_window.xml

@@ -1,32 +1,42 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/floating_window"
-    android:layout_width="100dp"
-    android:layout_height="100dp"
-    android:background="@drawable/bg_floating"
+    android:layout_width="108dp"
+    android:layout_height="108dp"
     android:orientation="vertical">
 
-    <com.google.android.material.progressindicator.LinearProgressIndicator
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:indeterminate="true" />
+    <com.google.android.material.card.MaterialCardView
+        style="?attr/materialCardViewElevatedStyle"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:layout_gravity="center">
 
-    <com.google.android.material.checkbox.MaterialCheckBox
-        android:id="@+id/sw_connect"
-        style="@style/Widget.Material3.CompoundButton.CheckBox"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:checked="true"
-        android:text="Connect"
-        android:textSize="14sp" />
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
 
-    <com.google.android.material.checkbox.MaterialCheckBox
-        android:id="@+id/sw_send"
-        style="@style/Widget.Material3.CompoundButton.CheckBox"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:checked="true"
-        android:text="Send"
-        android:textSize="14sp" />
-</LinearLayout>
+            <com.google.android.material.checkbox.MaterialCheckBox
+                android:id="@+id/sw_connect"
+                style="@style/Widget.Material3.CompoundButton.CheckBox"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:checked="true"
+                android:text="Connect"
+                android:textSize="14sp"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.google.android.material.checkbox.MaterialCheckBox
+                android:id="@+id/sw_send"
+                style="@style/Widget.Material3.CompoundButton.CheckBox"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:checked="true"
+                android:text="Send"
+                android:textSize="14sp"
+                app:layout_constraintStart_toStartOf="@id/sw_connect"
+                app:layout_constraintTop_toBottomOf="@id/sw_connect" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </com.google.android.material.card.MaterialCardView>
+</FrameLayout>

+ 2 - 2
app/src/main/res/layout/fragment_backup.xml

@@ -22,12 +22,12 @@
     </ScrollView>
 
     <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
-        android:id="@+id/extended_fab"
+        android:id="@+id/fab_backup"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|end"
         android:layout_margin="16dp"
-        android:text="New Backup"
+        android:text="Backup"
         app:icon="@drawable/ic_add"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent" />

+ 2 - 3
app/src/main/res/mipmap-anydpi/ic_launcher.xml → app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
+    <background android:drawable="@drawable/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
 </adaptive-icon>

+ 2 - 3
app/src/main/res/mipmap-anydpi/ic_launcher_round.xml → app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
-    <background android:drawable="@drawable/ic_launcher_background" />
-    <foreground android:drawable="@drawable/ic_launcher_foreground" />
-    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
+    <background android:drawable="@drawable/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
 </adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 112 - 112
app/src/main/res/values-night/colors.xml

@@ -1,143 +1,143 @@
 <resources>
-    <color name="md_theme_primary">#B1D18A</color>
-    <color name="md_theme_onPrimary">#1F3701</color>
-    <color name="md_theme_primaryContainer">#354E16</color>
-    <color name="md_theme_onPrimaryContainer">#CDEDA3</color>
-    <color name="md_theme_secondary">#BFCBAD</color>
-    <color name="md_theme_onSecondary">#2A331E</color>
-    <color name="md_theme_secondaryContainer">#404A33</color>
-    <color name="md_theme_onSecondaryContainer">#DCE7C8</color>
-    <color name="md_theme_tertiary">#A0D0CB</color>
-    <color name="md_theme_onTertiary">#003735</color>
-    <color name="md_theme_tertiaryContainer">#1F4E4B</color>
-    <color name="md_theme_onTertiaryContainer">#BCECE7</color>
+    <color name="md_theme_primary">#81D5CC</color>
+    <color name="md_theme_onPrimary">#003733</color>
+    <color name="md_theme_primaryContainer">#00504B</color>
+    <color name="md_theme_onPrimaryContainer">#9DF2E8</color>
+    <color name="md_theme_secondary">#B1CCC8</color>
+    <color name="md_theme_onSecondary">#1C3532</color>
+    <color name="md_theme_secondaryContainer">#324B48</color>
+    <color name="md_theme_onSecondaryContainer">#CCE8E4</color>
+    <color name="md_theme_tertiary">#AFC9E7</color>
+    <color name="md_theme_onTertiary">#17324A</color>
+    <color name="md_theme_tertiaryContainer">#2F4961</color>
+    <color name="md_theme_onTertiaryContainer">#CEE5FF</color>
     <color name="md_theme_error">#FFB4AB</color>
     <color name="md_theme_onError">#690005</color>
     <color name="md_theme_errorContainer">#93000A</color>
     <color name="md_theme_onErrorContainer">#FFDAD6</color>
-    <color name="md_theme_background">#12140E</color>
-    <color name="md_theme_onBackground">#E2E3D8</color>
-    <color name="md_theme_surface">#12140E</color>
-    <color name="md_theme_onSurface">#E2E3D8</color>
-    <color name="md_theme_surfaceVariant">#44483D</color>
-    <color name="md_theme_onSurfaceVariant">#C5C8BA</color>
-    <color name="md_theme_outline">#8F9285</color>
-    <color name="md_theme_outlineVariant">#44483D</color>
+    <color name="md_theme_background">#0E1514</color>
+    <color name="md_theme_onBackground">#DDE4E2</color>
+    <color name="md_theme_surface">#0E1514</color>
+    <color name="md_theme_onSurface">#DDE4E2</color>
+    <color name="md_theme_surfaceVariant">#3F4947</color>
+    <color name="md_theme_onSurfaceVariant">#BEC9C6</color>
+    <color name="md_theme_outline">#899391</color>
+    <color name="md_theme_outlineVariant">#3F4947</color>
     <color name="md_theme_scrim">#000000</color>
-    <color name="md_theme_inverseSurface">#E2E3D8</color>
-    <color name="md_theme_inverseOnSurface">#2F312A</color>
-    <color name="md_theme_inversePrimary">#4C662B</color>
-    <color name="md_theme_primaryFixed">#CDEDA3</color>
-    <color name="md_theme_onPrimaryFixed">#102000</color>
-    <color name="md_theme_primaryFixedDim">#B1D18A</color>
-    <color name="md_theme_onPrimaryFixedVariant">#354E16</color>
-    <color name="md_theme_secondaryFixed">#DCE7C8</color>
-    <color name="md_theme_onSecondaryFixed">#151E0B</color>
-    <color name="md_theme_secondaryFixedDim">#BFCBAD</color>
-    <color name="md_theme_onSecondaryFixedVariant">#404A33</color>
-    <color name="md_theme_tertiaryFixed">#BCECE7</color>
-    <color name="md_theme_onTertiaryFixed">#00201E</color>
-    <color name="md_theme_tertiaryFixedDim">#A0D0CB</color>
-    <color name="md_theme_onTertiaryFixedVariant">#1F4E4B</color>
-    <color name="md_theme_surfaceDim">#12140E</color>
-    <color name="md_theme_surfaceBright">#383A32</color>
-    <color name="md_theme_surfaceContainerLowest">#0C0F09</color>
-    <color name="md_theme_surfaceContainerLow">#1A1C16</color>
-    <color name="md_theme_surfaceContainer">#1E201A</color>
-    <color name="md_theme_surfaceContainerHigh">#282B24</color>
-    <color name="md_theme_surfaceContainerHighest">#33362E</color>
-    <color name="md_theme_primary_mediumContrast">#B5D58E</color>
-    <color name="md_theme_onPrimary_mediumContrast">#0C1A00</color>
-    <color name="md_theme_primaryContainer_mediumContrast">#7D9A59</color>
+    <color name="md_theme_inverseSurface">#DDE4E2</color>
+    <color name="md_theme_inverseOnSurface">#2B3231</color>
+    <color name="md_theme_inversePrimary">#006A63</color>
+    <color name="md_theme_primaryFixed">#9DF2E8</color>
+    <color name="md_theme_onPrimaryFixed">#00201D</color>
+    <color name="md_theme_primaryFixedDim">#81D5CC</color>
+    <color name="md_theme_onPrimaryFixedVariant">#00504B</color>
+    <color name="md_theme_secondaryFixed">#CCE8E4</color>
+    <color name="md_theme_onSecondaryFixed">#051F1D</color>
+    <color name="md_theme_secondaryFixedDim">#B1CCC8</color>
+    <color name="md_theme_onSecondaryFixedVariant">#324B48</color>
+    <color name="md_theme_tertiaryFixed">#CEE5FF</color>
+    <color name="md_theme_onTertiaryFixed">#001D33</color>
+    <color name="md_theme_tertiaryFixedDim">#AFC9E7</color>
+    <color name="md_theme_onTertiaryFixedVariant">#2F4961</color>
+    <color name="md_theme_surfaceDim">#0E1514</color>
+    <color name="md_theme_surfaceBright">#343A39</color>
+    <color name="md_theme_surfaceContainerLowest">#090F0F</color>
+    <color name="md_theme_surfaceContainerLow">#161D1C</color>
+    <color name="md_theme_surfaceContainer">#1A2120</color>
+    <color name="md_theme_surfaceContainerHigh">#252B2A</color>
+    <color name="md_theme_surfaceContainerHighest">#303635</color>
+    <color name="md_theme_primary_mediumContrast">#85D9D0</color>
+    <color name="md_theme_onPrimary_mediumContrast">#001A18</color>
+    <color name="md_theme_primaryContainer_mediumContrast">#499E96</color>
     <color name="md_theme_onPrimaryContainer_mediumContrast">#000000</color>
-    <color name="md_theme_secondary_mediumContrast">#C4CFB1</color>
-    <color name="md_theme_onSecondary_mediumContrast">#101907</color>
-    <color name="md_theme_secondaryContainer_mediumContrast">#8A9579</color>
+    <color name="md_theme_secondary_mediumContrast">#B5D0CC</color>
+    <color name="md_theme_onSecondary_mediumContrast">#011A18</color>
+    <color name="md_theme_secondaryContainer_mediumContrast">#7B9692</color>
     <color name="md_theme_onSecondaryContainer_mediumContrast">#000000</color>
-    <color name="md_theme_tertiary_mediumContrast">#A4D4D0</color>
-    <color name="md_theme_onTertiary_mediumContrast">#001A19</color>
-    <color name="md_theme_tertiaryContainer_mediumContrast">#6B9995</color>
+    <color name="md_theme_tertiary_mediumContrast">#B3CDEB</color>
+    <color name="md_theme_onTertiary_mediumContrast">#00182B</color>
+    <color name="md_theme_tertiaryContainer_mediumContrast">#7993AF</color>
     <color name="md_theme_onTertiaryContainer_mediumContrast">#000000</color>
     <color name="md_theme_error_mediumContrast">#FFBAB1</color>
     <color name="md_theme_onError_mediumContrast">#370001</color>
     <color name="md_theme_errorContainer_mediumContrast">#FF5449</color>
     <color name="md_theme_onErrorContainer_mediumContrast">#000000</color>
-    <color name="md_theme_background_mediumContrast">#12140E</color>
-    <color name="md_theme_onBackground_mediumContrast">#E2E3D8</color>
-    <color name="md_theme_surface_mediumContrast">#12140E</color>
-    <color name="md_theme_onSurface_mediumContrast">#FBFCF0</color>
-    <color name="md_theme_surfaceVariant_mediumContrast">#44483D</color>
-    <color name="md_theme_onSurfaceVariant_mediumContrast">#C9CCBE</color>
-    <color name="md_theme_outline_mediumContrast">#A1A497</color>
-    <color name="md_theme_outlineVariant_mediumContrast">#818578</color>
+    <color name="md_theme_background_mediumContrast">#0E1514</color>
+    <color name="md_theme_onBackground_mediumContrast">#DDE4E2</color>
+    <color name="md_theme_surface_mediumContrast">#0E1514</color>
+    <color name="md_theme_onSurface_mediumContrast">#F6FCFA</color>
+    <color name="md_theme_surfaceVariant_mediumContrast">#3F4947</color>
+    <color name="md_theme_onSurfaceVariant_mediumContrast">#C2CDCB</color>
+    <color name="md_theme_outline_mediumContrast">#9BA5A3</color>
+    <color name="md_theme_outlineVariant_mediumContrast">#7B8583</color>
     <color name="md_theme_scrim_mediumContrast">#000000</color>
-    <color name="md_theme_inverseSurface_mediumContrast">#E2E3D8</color>
-    <color name="md_theme_inverseOnSurface_mediumContrast">#282B24</color>
-    <color name="md_theme_inversePrimary_mediumContrast">#364F17</color>
-    <color name="md_theme_primaryFixed_mediumContrast">#CDEDA3</color>
-    <color name="md_theme_onPrimaryFixed_mediumContrast">#081400</color>
-    <color name="md_theme_primaryFixedDim_mediumContrast">#B1D18A</color>
-    <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#253D05</color>
-    <color name="md_theme_secondaryFixed_mediumContrast">#DCE7C8</color>
-    <color name="md_theme_onSecondaryFixed_mediumContrast">#0B1403</color>
-    <color name="md_theme_secondaryFixedDim_mediumContrast">#BFCBAD</color>
-    <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#303924</color>
-    <color name="md_theme_tertiaryFixed_mediumContrast">#BCECE7</color>
-    <color name="md_theme_onTertiaryFixed_mediumContrast">#001413</color>
-    <color name="md_theme_tertiaryFixedDim_mediumContrast">#A0D0CB</color>
-    <color name="md_theme_onTertiaryFixedVariant_mediumContrast">#083D3A</color>
-    <color name="md_theme_surfaceDim_mediumContrast">#12140E</color>
-    <color name="md_theme_surfaceBright_mediumContrast">#383A32</color>
-    <color name="md_theme_surfaceContainerLowest_mediumContrast">#0C0F09</color>
-    <color name="md_theme_surfaceContainerLow_mediumContrast">#1A1C16</color>
-    <color name="md_theme_surfaceContainer_mediumContrast">#1E201A</color>
-    <color name="md_theme_surfaceContainerHigh_mediumContrast">#282B24</color>
-    <color name="md_theme_surfaceContainerHighest_mediumContrast">#33362E</color>
-    <color name="md_theme_primary_highContrast">#F4FFDF</color>
+    <color name="md_theme_inverseSurface_mediumContrast">#DDE4E2</color>
+    <color name="md_theme_inverseOnSurface_mediumContrast">#252B2A</color>
+    <color name="md_theme_inversePrimary_mediumContrast">#00514C</color>
+    <color name="md_theme_primaryFixed_mediumContrast">#9DF2E8</color>
+    <color name="md_theme_onPrimaryFixed_mediumContrast">#001413</color>
+    <color name="md_theme_primaryFixedDim_mediumContrast">#81D5CC</color>
+    <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#003E39</color>
+    <color name="md_theme_secondaryFixed_mediumContrast">#CCE8E4</color>
+    <color name="md_theme_onSecondaryFixed_mediumContrast">#001413</color>
+    <color name="md_theme_secondaryFixedDim_mediumContrast">#B1CCC8</color>
+    <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#223B38</color>
+    <color name="md_theme_tertiaryFixed_mediumContrast">#CEE5FF</color>
+    <color name="md_theme_onTertiaryFixed_mediumContrast">#001223</color>
+    <color name="md_theme_tertiaryFixedDim_mediumContrast">#AFC9E7</color>
+    <color name="md_theme_onTertiaryFixedVariant_mediumContrast">#1E3850</color>
+    <color name="md_theme_surfaceDim_mediumContrast">#0E1514</color>
+    <color name="md_theme_surfaceBright_mediumContrast">#343A39</color>
+    <color name="md_theme_surfaceContainerLowest_mediumContrast">#090F0F</color>
+    <color name="md_theme_surfaceContainerLow_mediumContrast">#161D1C</color>
+    <color name="md_theme_surfaceContainer_mediumContrast">#1A2120</color>
+    <color name="md_theme_surfaceContainerHigh_mediumContrast">#252B2A</color>
+    <color name="md_theme_surfaceContainerHighest_mediumContrast">#303635</color>
+    <color name="md_theme_primary_highContrast">#EBFFFB</color>
     <color name="md_theme_onPrimary_highContrast">#000000</color>
-    <color name="md_theme_primaryContainer_highContrast">#B5D58E</color>
+    <color name="md_theme_primaryContainer_highContrast">#85D9D0</color>
     <color name="md_theme_onPrimaryContainer_highContrast">#000000</color>
-    <color name="md_theme_secondary_highContrast">#F4FFDF</color>
+    <color name="md_theme_secondary_highContrast">#EBFFFB</color>
     <color name="md_theme_onSecondary_highContrast">#000000</color>
-    <color name="md_theme_secondaryContainer_highContrast">#C4CFB1</color>
+    <color name="md_theme_secondaryContainer_highContrast">#B5D0CC</color>
     <color name="md_theme_onSecondaryContainer_highContrast">#000000</color>
-    <color name="md_theme_tertiary_highContrast">#EAFFFC</color>
+    <color name="md_theme_tertiary_highContrast">#FAFAFF</color>
     <color name="md_theme_onTertiary_highContrast">#000000</color>
-    <color name="md_theme_tertiaryContainer_highContrast">#A4D4D0</color>
+    <color name="md_theme_tertiaryContainer_highContrast">#B3CDEB</color>
     <color name="md_theme_onTertiaryContainer_highContrast">#000000</color>
     <color name="md_theme_error_highContrast">#FFF9F9</color>
     <color name="md_theme_onError_highContrast">#000000</color>
     <color name="md_theme_errorContainer_highContrast">#FFBAB1</color>
     <color name="md_theme_onErrorContainer_highContrast">#000000</color>
-    <color name="md_theme_background_highContrast">#12140E</color>
-    <color name="md_theme_onBackground_highContrast">#E2E3D8</color>
-    <color name="md_theme_surface_highContrast">#12140E</color>
+    <color name="md_theme_background_highContrast">#0E1514</color>
+    <color name="md_theme_onBackground_highContrast">#DDE4E2</color>
+    <color name="md_theme_surface_highContrast">#0E1514</color>
     <color name="md_theme_onSurface_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceVariant_highContrast">#44483D</color>
-    <color name="md_theme_onSurfaceVariant_highContrast">#F9FCED</color>
-    <color name="md_theme_outline_highContrast">#C9CCBE</color>
-    <color name="md_theme_outlineVariant_highContrast">#C9CCBE</color>
+    <color name="md_theme_surfaceVariant_highContrast">#3F4947</color>
+    <color name="md_theme_onSurfaceVariant_highContrast">#F3FDFA</color>
+    <color name="md_theme_outline_highContrast">#C2CDCB</color>
+    <color name="md_theme_outlineVariant_highContrast">#C2CDCB</color>
     <color name="md_theme_scrim_highContrast">#000000</color>
-    <color name="md_theme_inverseSurface_highContrast">#E2E3D8</color>
+    <color name="md_theme_inverseSurface_highContrast">#DDE4E2</color>
     <color name="md_theme_inverseOnSurface_highContrast">#000000</color>
-    <color name="md_theme_inversePrimary_highContrast">#1A3000</color>
-    <color name="md_theme_primaryFixed_highContrast">#D1F2A7</color>
+    <color name="md_theme_inversePrimary_highContrast">#00302D</color>
+    <color name="md_theme_primaryFixed_highContrast">#A1F6ED</color>
     <color name="md_theme_onPrimaryFixed_highContrast">#000000</color>
-    <color name="md_theme_primaryFixedDim_highContrast">#B5D58E</color>
-    <color name="md_theme_onPrimaryFixedVariant_highContrast">#0C1A00</color>
-    <color name="md_theme_secondaryFixed_highContrast">#E0EBCC</color>
+    <color name="md_theme_primaryFixedDim_highContrast">#85D9D0</color>
+    <color name="md_theme_onPrimaryFixedVariant_highContrast">#001A18</color>
+    <color name="md_theme_secondaryFixed_highContrast">#D0EDE8</color>
     <color name="md_theme_onSecondaryFixed_highContrast">#000000</color>
-    <color name="md_theme_secondaryFixedDim_highContrast">#C4CFB1</color>
-    <color name="md_theme_onSecondaryFixedVariant_highContrast">#101907</color>
-    <color name="md_theme_tertiaryFixed_highContrast">#C0F0EC</color>
+    <color name="md_theme_secondaryFixedDim_highContrast">#B5D0CC</color>
+    <color name="md_theme_onSecondaryFixedVariant_highContrast">#011A18</color>
+    <color name="md_theme_tertiaryFixed_highContrast">#D6E9FF</color>
     <color name="md_theme_onTertiaryFixed_highContrast">#000000</color>
-    <color name="md_theme_tertiaryFixedDim_highContrast">#A4D4D0</color>
-    <color name="md_theme_onTertiaryFixedVariant_highContrast">#001A19</color>
-    <color name="md_theme_surfaceDim_highContrast">#12140E</color>
-    <color name="md_theme_surfaceBright_highContrast">#383A32</color>
-    <color name="md_theme_surfaceContainerLowest_highContrast">#0C0F09</color>
-    <color name="md_theme_surfaceContainerLow_highContrast">#1A1C16</color>
-    <color name="md_theme_surfaceContainer_highContrast">#1E201A</color>
-    <color name="md_theme_surfaceContainerHigh_highContrast">#282B24</color>
-    <color name="md_theme_surfaceContainerHighest_highContrast">#33362E</color>
+    <color name="md_theme_tertiaryFixedDim_highContrast">#B3CDEB</color>
+    <color name="md_theme_onTertiaryFixedVariant_highContrast">#00182B</color>
+    <color name="md_theme_surfaceDim_highContrast">#0E1514</color>
+    <color name="md_theme_surfaceBright_highContrast">#343A39</color>
+    <color name="md_theme_surfaceContainerLowest_highContrast">#090F0F</color>
+    <color name="md_theme_surfaceContainerLow_highContrast">#161D1C</color>
+    <color name="md_theme_surfaceContainer_highContrast">#1A2120</color>
+    <color name="md_theme_surfaceContainerHigh_highContrast">#252B2A</color>
+    <color name="md_theme_surfaceContainerHighest_highContrast">#303635</color>
 </resources>

+ 94 - 94
app/src/main/res/values/colors.xml

@@ -1,143 +1,143 @@
 <resources>
-    <color name="md_theme_primary">#4C662B</color>
+    <color name="md_theme_primary">#006A63</color>
     <color name="md_theme_onPrimary">#FFFFFF</color>
-    <color name="md_theme_primaryContainer">#CDEDA3</color>
-    <color name="md_theme_onPrimaryContainer">#102000</color>
-    <color name="md_theme_secondary">#586249</color>
+    <color name="md_theme_primaryContainer">#9DF2E8</color>
+    <color name="md_theme_onPrimaryContainer">#00201D</color>
+    <color name="md_theme_secondary">#4A6360</color>
     <color name="md_theme_onSecondary">#FFFFFF</color>
-    <color name="md_theme_secondaryContainer">#DCE7C8</color>
-    <color name="md_theme_onSecondaryContainer">#151E0B</color>
-    <color name="md_theme_tertiary">#386663</color>
+    <color name="md_theme_secondaryContainer">#CCE8E4</color>
+    <color name="md_theme_onSecondaryContainer">#051F1D</color>
+    <color name="md_theme_tertiary">#47617A</color>
     <color name="md_theme_onTertiary">#FFFFFF</color>
-    <color name="md_theme_tertiaryContainer">#BCECE7</color>
-    <color name="md_theme_onTertiaryContainer">#00201E</color>
+    <color name="md_theme_tertiaryContainer">#CEE5FF</color>
+    <color name="md_theme_onTertiaryContainer">#001D33</color>
     <color name="md_theme_error">#BA1A1A</color>
     <color name="md_theme_onError">#FFFFFF</color>
     <color name="md_theme_errorContainer">#FFDAD6</color>
     <color name="md_theme_onErrorContainer">#410002</color>
-    <color name="md_theme_background">#F9FAEF</color>
-    <color name="md_theme_onBackground">#1A1C16</color>
-    <color name="md_theme_surface">#F9FAEF</color>
-    <color name="md_theme_onSurface">#1A1C16</color>
-    <color name="md_theme_surfaceVariant">#E1E4D5</color>
-    <color name="md_theme_onSurfaceVariant">#44483D</color>
-    <color name="md_theme_outline">#75796C</color>
-    <color name="md_theme_outlineVariant">#C5C8BA</color>
+    <color name="md_theme_background">#F4FBF9</color>
+    <color name="md_theme_onBackground">#161D1C</color>
+    <color name="md_theme_surface">#F4FBF9</color>
+    <color name="md_theme_onSurface">#161D1C</color>
+    <color name="md_theme_surfaceVariant">#DAE5E2</color>
+    <color name="md_theme_onSurfaceVariant">#3F4947</color>
+    <color name="md_theme_outline">#6F7977</color>
+    <color name="md_theme_outlineVariant">#BEC9C6</color>
     <color name="md_theme_scrim">#000000</color>
-    <color name="md_theme_inverseSurface">#2F312A</color>
-    <color name="md_theme_inverseOnSurface">#F1F2E6</color>
-    <color name="md_theme_inversePrimary">#B1D18A</color>
-    <color name="md_theme_primaryFixed">#CDEDA3</color>
-    <color name="md_theme_onPrimaryFixed">#102000</color>
-    <color name="md_theme_primaryFixedDim">#B1D18A</color>
-    <color name="md_theme_onPrimaryFixedVariant">#354E16</color>
-    <color name="md_theme_secondaryFixed">#DCE7C8</color>
-    <color name="md_theme_onSecondaryFixed">#151E0B</color>
-    <color name="md_theme_secondaryFixedDim">#BFCBAD</color>
-    <color name="md_theme_onSecondaryFixedVariant">#404A33</color>
-    <color name="md_theme_tertiaryFixed">#BCECE7</color>
-    <color name="md_theme_onTertiaryFixed">#00201E</color>
-    <color name="md_theme_tertiaryFixedDim">#A0D0CB</color>
-    <color name="md_theme_onTertiaryFixedVariant">#1F4E4B</color>
-    <color name="md_theme_surfaceDim">#DADBD0</color>
-    <color name="md_theme_surfaceBright">#F9FAEF</color>
+    <color name="md_theme_inverseSurface">#2B3231</color>
+    <color name="md_theme_inverseOnSurface">#ECF2F0</color>
+    <color name="md_theme_inversePrimary">#81D5CC</color>
+    <color name="md_theme_primaryFixed">#9DF2E8</color>
+    <color name="md_theme_onPrimaryFixed">#00201D</color>
+    <color name="md_theme_primaryFixedDim">#81D5CC</color>
+    <color name="md_theme_onPrimaryFixedVariant">#00504B</color>
+    <color name="md_theme_secondaryFixed">#CCE8E4</color>
+    <color name="md_theme_onSecondaryFixed">#051F1D</color>
+    <color name="md_theme_secondaryFixedDim">#B1CCC8</color>
+    <color name="md_theme_onSecondaryFixedVariant">#324B48</color>
+    <color name="md_theme_tertiaryFixed">#CEE5FF</color>
+    <color name="md_theme_onTertiaryFixed">#001D33</color>
+    <color name="md_theme_tertiaryFixedDim">#AFC9E7</color>
+    <color name="md_theme_onTertiaryFixedVariant">#2F4961</color>
+    <color name="md_theme_surfaceDim">#D5DBD9</color>
+    <color name="md_theme_surfaceBright">#F4FBF9</color>
     <color name="md_theme_surfaceContainerLowest">#FFFFFF</color>
-    <color name="md_theme_surfaceContainerLow">#F3F4E9</color>
-    <color name="md_theme_surfaceContainer">#EEEFE3</color>
-    <color name="md_theme_surfaceContainerHigh">#E8E9DE</color>
-    <color name="md_theme_surfaceContainerHighest">#E2E3D8</color>
-    <color name="md_theme_primary_mediumContrast">#314A12</color>
+    <color name="md_theme_surfaceContainerLow">#EFF5F3</color>
+    <color name="md_theme_surfaceContainer">#E9EFED</color>
+    <color name="md_theme_surfaceContainerHigh">#E3E9E7</color>
+    <color name="md_theme_surfaceContainerHighest">#DDE4E2</color>
+    <color name="md_theme_primary_mediumContrast">#004C47</color>
     <color name="md_theme_onPrimary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_primaryContainer_mediumContrast">#617D3F</color>
+    <color name="md_theme_primaryContainer_mediumContrast">#26817A</color>
     <color name="md_theme_onPrimaryContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondary_mediumContrast">#3C462F</color>
+    <color name="md_theme_secondary_mediumContrast">#2E4744</color>
     <color name="md_theme_onSecondary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryContainer_mediumContrast">#6E785E</color>
+    <color name="md_theme_secondaryContainer_mediumContrast">#607A76</color>
     <color name="md_theme_onSecondaryContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiary_mediumContrast">#1A4A47</color>
+    <color name="md_theme_tertiary_mediumContrast">#2B455D</color>
     <color name="md_theme_onTertiary_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryContainer_mediumContrast">#4F7D79</color>
+    <color name="md_theme_tertiaryContainer_mediumContrast">#5D7792</color>
     <color name="md_theme_onTertiaryContainer_mediumContrast">#FFFFFF</color>
     <color name="md_theme_error_mediumContrast">#8C0009</color>
     <color name="md_theme_onError_mediumContrast">#FFFFFF</color>
     <color name="md_theme_errorContainer_mediumContrast">#DA342E</color>
     <color name="md_theme_onErrorContainer_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_background_mediumContrast">#F9FAEF</color>
-    <color name="md_theme_onBackground_mediumContrast">#1A1C16</color>
-    <color name="md_theme_surface_mediumContrast">#F9FAEF</color>
-    <color name="md_theme_onSurface_mediumContrast">#1A1C16</color>
-    <color name="md_theme_surfaceVariant_mediumContrast">#E1E4D5</color>
-    <color name="md_theme_onSurfaceVariant_mediumContrast">#404439</color>
-    <color name="md_theme_outline_mediumContrast">#5D6155</color>
-    <color name="md_theme_outlineVariant_mediumContrast">#787C70</color>
+    <color name="md_theme_background_mediumContrast">#F4FBF9</color>
+    <color name="md_theme_onBackground_mediumContrast">#161D1C</color>
+    <color name="md_theme_surface_mediumContrast">#F4FBF9</color>
+    <color name="md_theme_onSurface_mediumContrast">#161D1C</color>
+    <color name="md_theme_surfaceVariant_mediumContrast">#DAE5E2</color>
+    <color name="md_theme_onSurfaceVariant_mediumContrast">#3B4543</color>
+    <color name="md_theme_outline_mediumContrast">#57615F</color>
+    <color name="md_theme_outlineVariant_mediumContrast">#737D7B</color>
     <color name="md_theme_scrim_mediumContrast">#000000</color>
-    <color name="md_theme_inverseSurface_mediumContrast">#2F312A</color>
-    <color name="md_theme_inverseOnSurface_mediumContrast">#F1F2E6</color>
-    <color name="md_theme_inversePrimary_mediumContrast">#B1D18A</color>
-    <color name="md_theme_primaryFixed_mediumContrast">#617D3F</color>
+    <color name="md_theme_inverseSurface_mediumContrast">#2B3231</color>
+    <color name="md_theme_inverseOnSurface_mediumContrast">#ECF2F0</color>
+    <color name="md_theme_inversePrimary_mediumContrast">#81D5CC</color>
+    <color name="md_theme_primaryFixed_mediumContrast">#26817A</color>
     <color name="md_theme_onPrimaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_primaryFixedDim_mediumContrast">#496429</color>
+    <color name="md_theme_primaryFixedDim_mediumContrast">#006761</color>
     <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixed_mediumContrast">#6E785E</color>
+    <color name="md_theme_secondaryFixed_mediumContrast">#607A76</color>
     <color name="md_theme_onSecondaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixedDim_mediumContrast">#555F47</color>
+    <color name="md_theme_secondaryFixedDim_mediumContrast">#47615E</color>
     <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixed_mediumContrast">#4F7D79</color>
+    <color name="md_theme_tertiaryFixed_mediumContrast">#5D7792</color>
     <color name="md_theme_onTertiaryFixed_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixedDim_mediumContrast">#366460</color>
+    <color name="md_theme_tertiaryFixedDim_mediumContrast">#455E78</color>
     <color name="md_theme_onTertiaryFixedVariant_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceDim_mediumContrast">#DADBD0</color>
-    <color name="md_theme_surfaceBright_mediumContrast">#F9FAEF</color>
+    <color name="md_theme_surfaceDim_mediumContrast">#D5DBD9</color>
+    <color name="md_theme_surfaceBright_mediumContrast">#F4FBF9</color>
     <color name="md_theme_surfaceContainerLowest_mediumContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceContainerLow_mediumContrast">#F3F4E9</color>
-    <color name="md_theme_surfaceContainer_mediumContrast">#EEEFE3</color>
-    <color name="md_theme_surfaceContainerHigh_mediumContrast">#E8E9DE</color>
-    <color name="md_theme_surfaceContainerHighest_mediumContrast">#E2E3D8</color>
-    <color name="md_theme_primary_highContrast">#142700</color>
+    <color name="md_theme_surfaceContainerLow_mediumContrast">#EFF5F3</color>
+    <color name="md_theme_surfaceContainer_mediumContrast">#E9EFED</color>
+    <color name="md_theme_surfaceContainerHigh_mediumContrast">#E3E9E7</color>
+    <color name="md_theme_surfaceContainerHighest_mediumContrast">#DDE4E2</color>
+    <color name="md_theme_primary_highContrast">#002724</color>
     <color name="md_theme_onPrimary_highContrast">#FFFFFF</color>
-    <color name="md_theme_primaryContainer_highContrast">#314A12</color>
+    <color name="md_theme_primaryContainer_highContrast">#004C47</color>
     <color name="md_theme_onPrimaryContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondary_highContrast">#1C2511</color>
+    <color name="md_theme_secondary_highContrast">#0C2624</color>
     <color name="md_theme_onSecondary_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryContainer_highContrast">#3C462F</color>
+    <color name="md_theme_secondaryContainer_highContrast">#2E4744</color>
     <color name="md_theme_onSecondaryContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiary_highContrast">#002725</color>
+    <color name="md_theme_tertiary_highContrast">#05243B</color>
     <color name="md_theme_onTertiary_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryContainer_highContrast">#1A4A47</color>
+    <color name="md_theme_tertiaryContainer_highContrast">#2B455D</color>
     <color name="md_theme_onTertiaryContainer_highContrast">#FFFFFF</color>
     <color name="md_theme_error_highContrast">#4E0002</color>
     <color name="md_theme_onError_highContrast">#FFFFFF</color>
     <color name="md_theme_errorContainer_highContrast">#8C0009</color>
     <color name="md_theme_onErrorContainer_highContrast">#FFFFFF</color>
-    <color name="md_theme_background_highContrast">#F9FAEF</color>
-    <color name="md_theme_onBackground_highContrast">#1A1C16</color>
-    <color name="md_theme_surface_highContrast">#F9FAEF</color>
+    <color name="md_theme_background_highContrast">#F4FBF9</color>
+    <color name="md_theme_onBackground_highContrast">#161D1C</color>
+    <color name="md_theme_surface_highContrast">#F4FBF9</color>
     <color name="md_theme_onSurface_highContrast">#000000</color>
-    <color name="md_theme_surfaceVariant_highContrast">#E1E4D5</color>
-    <color name="md_theme_onSurfaceVariant_highContrast">#21251C</color>
-    <color name="md_theme_outline_highContrast">#404439</color>
-    <color name="md_theme_outlineVariant_highContrast">#404439</color>
+    <color name="md_theme_surfaceVariant_highContrast">#DAE5E2</color>
+    <color name="md_theme_onSurfaceVariant_highContrast">#1C2624</color>
+    <color name="md_theme_outline_highContrast">#3B4543</color>
+    <color name="md_theme_outlineVariant_highContrast">#3B4543</color>
     <color name="md_theme_scrim_highContrast">#000000</color>
-    <color name="md_theme_inverseSurface_highContrast">#2F312A</color>
+    <color name="md_theme_inverseSurface_highContrast">#2B3231</color>
     <color name="md_theme_inverseOnSurface_highContrast">#FFFFFF</color>
-    <color name="md_theme_inversePrimary_highContrast">#D6F7AC</color>
-    <color name="md_theme_primaryFixed_highContrast">#314A12</color>
+    <color name="md_theme_inversePrimary_highContrast">#A7FBF2</color>
+    <color name="md_theme_primaryFixed_highContrast">#004C47</color>
     <color name="md_theme_onPrimaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_primaryFixedDim_highContrast">#1C3300</color>
+    <color name="md_theme_primaryFixedDim_highContrast">#00332F</color>
     <color name="md_theme_onPrimaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixed_highContrast">#3C462F</color>
+    <color name="md_theme_secondaryFixed_highContrast">#2E4744</color>
     <color name="md_theme_onSecondaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_secondaryFixedDim_highContrast">#26301B</color>
+    <color name="md_theme_secondaryFixedDim_highContrast">#18312E</color>
     <color name="md_theme_onSecondaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixed_highContrast">#1A4A47</color>
+    <color name="md_theme_tertiaryFixed_highContrast">#2B455D</color>
     <color name="md_theme_onTertiaryFixed_highContrast">#FFFFFF</color>
-    <color name="md_theme_tertiaryFixedDim_highContrast">#003331</color>
+    <color name="md_theme_tertiaryFixedDim_highContrast">#132F46</color>
     <color name="md_theme_onTertiaryFixedVariant_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceDim_highContrast">#DADBD0</color>
-    <color name="md_theme_surfaceBright_highContrast">#F9FAEF</color>
+    <color name="md_theme_surfaceDim_highContrast">#D5DBD9</color>
+    <color name="md_theme_surfaceBright_highContrast">#F4FBF9</color>
     <color name="md_theme_surfaceContainerLowest_highContrast">#FFFFFF</color>
-    <color name="md_theme_surfaceContainerLow_highContrast">#F3F4E9</color>
-    <color name="md_theme_surfaceContainer_highContrast">#EEEFE3</color>
-    <color name="md_theme_surfaceContainerHigh_highContrast">#E8E9DE</color>
-    <color name="md_theme_surfaceContainerHighest_highContrast">#E2E3D8</color>
+    <color name="md_theme_surfaceContainerLow_highContrast">#EFF5F3</color>
+    <color name="md_theme_surfaceContainer_highContrast">#E9EFED</color>
+    <color name="md_theme_surfaceContainerHigh_highContrast">#E3E9E7</color>
+    <color name="md_theme_surfaceContainerHighest_highContrast">#DDE4E2</color>
 </resources>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -7,4 +7,6 @@
     <string name="backup">Backup</string>
     <string name="utils">Utils</string>
     <string name="settings">Settings</string>
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
 </resources>

+ 0 - 1
app/src/main/res/values/themes.xml

@@ -1,5 +1,4 @@
 <resources>
-
     <style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
         <item name="colorPrimary">@color/md_theme_primary</item>
         <item name="colorOnPrimary">@color/md_theme_onPrimary</item>