x1ongzhu 1 năm trước cách đây
mục cha
commit
64f889fdf2
33 tập tin đã thay đổi với 1356 bổ sung262 xóa
  1. 2 0
      app/build.gradle
  2. BIN
      app/release/app-release.apk
  3. BIN
      app/release/baselineProfiles/0/app-release.dm
  4. BIN
      app/release/baselineProfiles/1/app-release.dm
  5. 37 0
      app/release/output-metadata.json
  6. 1 1
      app/src/main/AndroidManifest.xml
  7. 83 0
      app/src/main/java/com/example/modifier/Commons.java
  8. 22 212
      app/src/main/java/com/example/modifier/MainActivity.java
  9. 10 2
      app/src/main/java/com/example/modifier/ModifierService.java
  10. 43 0
      app/src/main/java/com/example/modifier/Utils.java
  11. 66 0
      app/src/main/java/com/example/modifier/fragments/BackupFragment.java
  12. 134 0
      app/src/main/java/com/example/modifier/fragments/CellularFragment.java
  13. 66 0
      app/src/main/java/com/example/modifier/fragments/SettingsFragment.java
  14. 10 0
      app/src/main/res/drawable/ic_refresh.xml
  15. 10 0
      app/src/main/res/drawable/ic_settings.xml
  16. 11 0
      app/src/main/res/drawable/ic_settings_backup_restore.xml
  17. 10 0
      app/src/main/res/drawable/ic_signal_cellular.xml
  18. 0 9
      app/src/main/res/drawable/refreshoutlined.xml
  19. 27 13
      app/src/main/res/layout/activity_main.xml
  20. 0 2
      app/src/main/res/layout/floating_window.xml
  21. 14 0
      app/src/main/res/layout/fragment_backup.xml
  22. 167 0
      app/src/main/res/layout/fragment_cellular.xml
  23. 14 0
      app/src/main/res/layout/fragment_settings.xml
  24. 15 0
      app/src/main/res/menu/bottom_nav_menu.xml
  25. 25 0
      app/src/main/res/navigation/home_nav.xml
  26. 143 0
      app/src/main/res/values-night/colors.xml
  27. 98 0
      app/src/main/res/values-night/theme_overlays.xml
  28. 49 6
      app/src/main/res/values-night/themes.xml
  29. 142 4
      app/src/main/res/values/colors.xml
  30. 6 0
      app/src/main/res/values/strings.xml
  31. 98 0
      app/src/main/res/values/theme_overlays.xml
  32. 49 13
      app/src/main/res/values/themes.xml
  33. 4 0
      gradle/libs.versions.toml

+ 2 - 0
app/build.gradle

@@ -54,6 +54,8 @@ dependencies {
     implementation libs.material
     implementation libs.activity
     implementation libs.constraintlayout
+    implementation libs.navigation.fragment
+    implementation libs.navigation.ui
     testImplementation libs.junit
     androidTestImplementation libs.ext.junit
     androidTestImplementation libs.espresso.core

BIN
app/release/app-release.apk


BIN
app/release/baselineProfiles/0/app-release.dm


BIN
app/release/baselineProfiles/1/app-release.dm


+ 37 - 0
app/release/output-metadata.json

@@ -0,0 +1,37 @@
+{
+  "version": 3,
+  "artifactType": {
+    "type": "APK",
+    "kind": "Directory"
+  },
+  "applicationId": "com.example.modifier",
+  "variantName": "release",
+  "elements": [
+    {
+      "type": "SINGLE",
+      "filters": [],
+      "attributes": [],
+      "versionCode": 1,
+      "versionName": "1.0",
+      "outputFile": "app-release.apk"
+    }
+  ],
+  "elementType": "File",
+  "baselineProfiles": [
+    {
+      "minApi": 28,
+      "maxApi": 30,
+      "baselineProfiles": [
+        "baselineProfiles/1/app-release.dm"
+      ]
+    },
+    {
+      "minApi": 31,
+      "maxApi": 2147483647,
+      "baselineProfiles": [
+        "baselineProfiles/0/app-release.dm"
+      ]
+    }
+  ],
+  "minSdkVersionForDexing": 26
+}

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

@@ -12,7 +12,7 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/Theme.Modifier"
+        android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true"
         tools:targetApi="31">
         <service

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

@@ -0,0 +1,83 @@
+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();
+        }
+    }
+
+}

+ 22 - 212
app/src/main/java/com/example/modifier/MainActivity.java

@@ -18,6 +18,10 @@ import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.graphics.Insets;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
+import androidx.navigation.NavController;
+import androidx.navigation.Navigation;
+import androidx.navigation.fragment.NavHostFragment;
+import androidx.navigation.ui.NavigationUI;
 
 import com.example.modifier.databinding.ActivityMainBinding;
 import com.google.gson.Gson;
@@ -55,48 +59,8 @@ public class MainActivity extends AppCompatActivity {
         EdgeToEdge.enable(this);
         mBinding = ActivityMainBinding.inflate(getLayoutInflater());
         setContentView(mBinding.getRoot());
-        ViewCompat.setOnApplyWindowInsetsListener(mBinding.main, (v, insets) -> {
-            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
-            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
-            return insets;
-        });
 
-        mBinding.tlIccid.setEndIconOnClickListener(v -> {
-            mBinding.etIccid.setText(RandomStringUtils.randomNumeric(20));
-        });
-        mBinding.tlImsi.setEndIconOnClickListener(v -> {
-            String mcc = mBinding.etMcc.getText().toString();
-            String mnc = mBinding.etMnc.getText().toString();
-            if (StringUtils.isEmpty(mcc) || StringUtils.isEmpty(mnc)) {
-                Toast.makeText(this, "MCC and MNC are required", Toast.LENGTH_SHORT).show();
-                return;
-            }
-            mBinding.etImsi.setText(mcc + mnc + RandomStringUtils.randomNumeric(15 - mcc.length() - mnc.length()));
-        });
-        mBinding.tlImei.setEndIconOnClickListener(v -> {
-            mBinding.etImei.setText(generateIMEI());
-        });
-        Gson gson = new Gson();
-        try {
-            File file = new File(getDataDir(), "config.json");
-            if (file.exists()) {
-                FileReader reader = new FileReader(file);
-                Config config = gson.fromJson(reader, Config.class);
-                mBinding.etNumber.setText(config.getNumber());
-                mBinding.etMcc.setText(config.getMcc());
-                mBinding.etMnc.setText(config.getMnc());
-                mBinding.etIccid.setText(config.getIccid());
-                mBinding.etImsi.setText(config.getImsi());
-                mBinding.etImei.setText(config.getImei());
-                mBinding.etCountry.setText(config.getCountry());
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
 
-        mBinding.btnSave.setOnClickListener(v -> {
-            onSave();
-        });
         mBinding.btnClear.setOnClickListener(v -> {
             onClear();
         });
@@ -169,70 +133,28 @@ public class MainActivity extends AppCompatActivity {
             });
         }, 1000);
 
+        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
+        NavController controller = navHostFragment.getNavController();
+        NavigationUI.setupWithNavController(mBinding.nav, controller);
     }
 
-    private void onSave() {
-        mBinding.btnSave.setVisibility(View.GONE);
-        mBinding.progressSave.setVisibility(View.VISIBLE);
-        executor.execute(() -> {
-            save();
-            handler.post(() -> {
-                mBinding.btnSave.setVisibility(View.VISIBLE);
-                mBinding.progressSave.setVisibility(View.GONE);
-            });
-        });
-    }
 
-    private void save() {
-        try {
-            Config config = new Config(mBinding.etNumber.getText().toString(),
+    private void onClear() {
+        mBinding.llBtn.setVisibility(View.GONE);
+        mBinding.progressClear.setVisibility(View.VISIBLE);
+        executor.execute(() -> {
+            boolean gsf = mBinding.cbGsf.isChecked();
+            boolean gms = mBinding.cbGms.isChecked();
+            boolean sms = mBinding.cbSms.isChecked();
+            Commons.clear(gsf, gms, sms);
+            Commons.save(new Config(mBinding.etNumber.getText().toString(),
                     mBinding.etMcc.getText().toString(),
                     mBinding.etMnc.getText().toString(),
                     mBinding.etIccid.getText().toString(),
                     mBinding.etImsi.getText().toString(),
                     mBinding.etImei.getText().toString(),
-                    mBinding.etCountry.getText().toString());
-            File file = new File(getDataDir(), "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();
-            }
-
-            runAsRoot(
-//                    "cp " + file.getPath() + " /data/data/com.google.android.gms/rcsConfig.json",
-//                    "echo 'copied to gms'",
-//                    "chmod 777 /data/data/com.google.android.gms/rcsConfig.json",
-//                    "cp " + file.getPath() + " /data/data/com.google.android.apps.messaging/rcsConfig.json",
-//                    "echo 'copied to sms'",
-//                    "chmod 777 /data/data/com.google.android.apps.messaging/rcsConfig.json",
-//                    "cp " + file.getPath() + " /data/data/com.kee.SIMdeviceinfo/rcsConfig.json",
-//                    "echo 'copied to siminfo'",
-//                    "chmod 777 /data/data/com.kee.SIMdeviceinfo/rcsConfig.json",
-                    "cp " + file.getPath() + " /data/data/com.android.phone/rcsConfig.json",
-                    "echo 'copied to phone'",
-                    "chmod 777 /data/data/com.android.phone/rcsConfig.json");
-
-//            runAsRoot("ls /system");
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-
-    private void onClear() {
-        mBinding.llBtn.setVisibility(View.GONE);
-        mBinding.progressClear.setVisibility(View.VISIBLE);
-        executor.execute(() -> {
-            clear();
-            save();
-            stop();
+                    mBinding.etCountry.getText().toString()));
+            Commons.stop(gsf, gms, sms);
             handler.post(() -> {
                 mBinding.llBtn.setVisibility(View.VISIBLE);
                 mBinding.progressClear.setVisibility(View.GONE);
@@ -240,36 +162,16 @@ public class MainActivity extends AppCompatActivity {
         });
     }
 
-    private void clear() {
-        try {
-            boolean gms = mBinding.cbGms.isChecked();
-            boolean sms = mBinding.cbGms.isChecked();
-            boolean gsf = mBinding.cbGsf.isChecked();
-            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'");
-            }
-            runAsRoot(cmds.toArray(new String[0]));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
 
     private void onStopClick() {
         mBinding.llBtn.setVisibility(View.GONE);
         mBinding.progressClear.setVisibility(View.VISIBLE);
 
         executor.execute(() -> {
-            stop();
+            boolean gsf = mBinding.cbGsf.isChecked();
+            boolean gms = mBinding.cbGms.isChecked();
+            boolean sms = mBinding.cbSms.isChecked();
+            Commons.stop(gsf, gms, sms);
             handler.post(() -> {
                 mBinding.llBtn.setVisibility(View.VISIBLE);
                 mBinding.progressClear.setVisibility(View.GONE);
@@ -277,97 +179,5 @@ public class MainActivity extends AppCompatActivity {
         });
     }
 
-    private void stop() {
-        try {
-            boolean gms = mBinding.cbGms.isChecked();
-            boolean sms = mBinding.cbGms.isChecked();
-            boolean gsf = mBinding.cbGsf.isChecked();
-
-            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'");
-            }
-            runAsRoot(cmds.toArray(new String[0]));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
 
-    private String runAsRoot(String... cmds) throws IOException, InterruptedException {
-        File outputDir = getCacheDir(); // context being the Activity pointer
-        File outputFile = File.createTempFile("su0000000", ".log", outputDir);
-        Log.i(TAG, "Output file: " + outputFile.getAbsolutePath());
-
-        Process p = new ProcessBuilder("su")
-                .redirectErrorStream(true)
-                .redirectOutput(outputFile)
-                .start();
-
-        DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
-        for (String cmd : cmds) {
-            outputStream.writeBytes(cmd + "\n");
-            outputStream.flush();
-            Log.i(TAG, "Running command: " + cmd);
-        }
-        outputStream.writeBytes("exit\n");
-        outputStream.flush();
-        p.waitFor();
-        String res = FileUtils.readFileToString(outputFile, "UTF-8");
-        Log.i(TAG, "Command output: \n" + res);
-        outputFile.delete();
-        return res;
-    }
-
-    String generateIMEI() {
-        int pos;
-        int[] str = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-        int sum = 0;
-        int final_digit;
-        int t;
-        int len_offset;
-        int len = 15;
-        String imei = "";
-
-        String[] rbi = new String[]{"01", "10", "30", "33", "35", "44", "45", "49", "50", "51", "52", "53", "54", "86", "91", "98", "99"};
-        String[] arr = rbi[(int) Math.floor(Math.random() * rbi.length)].split("");
-        str[0] = Integer.parseInt(arr[0]);
-        str[1] = Integer.parseInt(arr[1]);
-        pos = 2;
-
-        while (pos < len - 1) {
-            str[pos++] = (int) (Math.floor(Math.random() * 10) % 10);
-        }
-
-        len_offset = (len + 1) % 2;
-        for (pos = 0; pos < len - 1; pos++) {
-            if ((pos + len_offset) % 2 != 0) {
-                t = str[pos] * 2;
-                if (t > 9) {
-                    t -= 9;
-                }
-                sum += t;
-            } else {
-                sum += str[pos];
-            }
-        }
-
-        final_digit = (10 - (sum % 10)) % 10;
-        str[len - 1] = final_digit;
-
-        for (int d : str) {
-            imei += String.valueOf(d);
-        }
-
-        return imei;
-    }
 }

+ 10 - 2
app/src/main/java/com/example/modifier/ModifierService.java

@@ -1,9 +1,11 @@
 package com.example.modifier;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.PixelFormat;
+import android.net.Uri;
 import android.os.Build;
 import android.util.Log;
 import android.view.Gravity;
@@ -154,8 +156,14 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
     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);
+        intent.putExtra("exit_on_sent", true);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
         try {
-            Utils.runAsRoot(cmd);
+//            Utils.runAsRoot(cmd);
 
             Log.i(TAG, "Command executed successfully, waiting for app to open...");
             ScheduledFuture<Boolean> f = mExecutor.schedule(() -> {
@@ -251,7 +259,7 @@ public class ModifierService extends android.accessibilityservice.AccessibilityS
         layoutParams.x = 0;
         layoutParams.y = 800;
         layoutParams.gravity = Gravity.START | Gravity.TOP;
-        ContextThemeWrapper newContext = new ContextThemeWrapper(getApplicationContext(), R.style.FloatingWindow);
+        ContextThemeWrapper newContext = new ContextThemeWrapper(getApplicationContext(), R.style.AppTheme);
         LayoutInflater inflater = LayoutInflater.from(newContext);
         binding = FloatingWindowBinding.inflate(inflater, mLayout, true);
         windowManager.addView(mLayout, layoutParams);

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

@@ -141,4 +141,47 @@ public class Utils {
         sharedPrefs.edit().putString("unique_id", uniqueID).apply();
         return uniqueID;
     }
+
+    public static String generateIMEI() {
+        int pos;
+        int[] str = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        int sum = 0;
+        int final_digit;
+        int t;
+        int len_offset;
+        int len = 15;
+        String imei = "";
+
+        String[] rbi = new String[]{"01", "10", "30", "33", "35", "44", "45", "49", "50", "51", "52", "53", "54", "86", "91", "98", "99"};
+        String[] arr = rbi[(int) Math.floor(Math.random() * rbi.length)].split("");
+        str[0] = Integer.parseInt(arr[0]);
+        str[1] = Integer.parseInt(arr[1]);
+        pos = 2;
+
+        while (pos < len - 1) {
+            str[pos++] = (int) (Math.floor(Math.random() * 10) % 10);
+        }
+
+        len_offset = (len + 1) % 2;
+        for (pos = 0; pos < len - 1; pos++) {
+            if ((pos + len_offset) % 2 != 0) {
+                t = str[pos] * 2;
+                if (t > 9) {
+                    t -= 9;
+                }
+                sum += t;
+            } else {
+                sum += str[pos];
+            }
+        }
+
+        final_digit = (10 - (sum % 10)) % 10;
+        str[len - 1] = final_digit;
+
+        for (int d : str) {
+            imei += String.valueOf(d);
+        }
+
+        return imei;
+    }
 }

+ 66 - 0
app/src/main/java/com/example/modifier/fragments/BackupFragment.java

@@ -0,0 +1,66 @@
+package com.example.modifier.fragments;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.example.modifier.R;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link BackupFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class BackupFragment extends Fragment {
+
+    // 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";
+
+    // TODO: Rename and change types of parameters
+    private String mParam1;
+    private String mParam2;
+
+    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,
+                             Bundle savedInstanceState) {
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.fragment_backup, container, false);
+    }
+}

+ 134 - 0
app/src/main/java/com/example/modifier/fragments/CellularFragment.java

@@ -0,0 +1,134 @@
+package com.example.modifier.fragments;
+
+import android.os.Bundle;
+
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+import com.example.modifier.Config;
+import com.example.modifier.R;
+import com.example.modifier.Utils;
+import com.example.modifier.databinding.FragmentCellularBinding;
+import com.google.gson.Gson;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class CellularFragment extends Fragment {
+
+    private FragmentCellularBinding binding;
+
+    Handler handler = new Handler(Looper.getMainLooper());
+    ExecutorService executor = Executors.newFixedThreadPool(32);
+
+    public CellularFragment() {
+        // Required empty public constructor
+    }
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        binding = FragmentCellularBinding.inflate(inflater, container, false);
+        binding.tlIccid.setEndIconOnClickListener(v -> {
+            binding.etIccid.setText(RandomStringUtils.randomNumeric(20));
+        });
+        binding.tlImsi.setEndIconOnClickListener(v -> {
+            String mcc = binding.etMcc.getText().toString();
+            String mnc = binding.etMnc.getText().toString();
+            if (StringUtils.isEmpty(mcc) || StringUtils.isEmpty(mnc)) {
+                Toast.makeText(getContext(), "MCC and MNC are required", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            binding.etImsi.setText(mcc + mnc + RandomStringUtils.randomNumeric(15 - mcc.length() - mnc.length()));
+        });
+        binding.tlImei.setEndIconOnClickListener(v -> {
+            binding.etImei.setText(Utils.generateIMEI());
+        });
+        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();
+        }
+
+        binding.btnSave.setOnClickListener(v -> {
+            onSave();
+        });
+        return binding.getRoot();
+    }
+
+
+    private void onSave() {
+        binding.btnSave.setVisibility(View.GONE);
+        binding.progressSave.setVisibility(View.VISIBLE);
+        executor.execute(() -> {
+            save();
+            handler.post(() -> {
+                binding.btnSave.setVisibility(View.VISIBLE);
+                binding.progressSave.setVisibility(View.GONE);
+            });
+        });
+    }
+
+    private void save() {
+        try {
+            Config config = new Config(binding.etNumber.getText().toString(),
+                    binding.etMcc.getText().toString(),
+                    binding.etMnc.getText().toString(),
+                    binding.etIccid.getText().toString(),
+                    binding.etImsi.getText().toString(),
+                    binding.etImei.getText().toString(),
+                    binding.etCountry.getText().toString());
+            File file = new File(ContextCompat.getDataDir(getContext()), "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();
+        }
+    }
+
+}

+ 66 - 0
app/src/main/java/com/example/modifier/fragments/SettingsFragment.java

@@ -0,0 +1,66 @@
+package com.example.modifier.fragments;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.example.modifier.R;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link SettingsFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class SettingsFragment extends Fragment {
+
+    // 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";
+
+    // TODO: Rename and change types of parameters
+    private String mParam1;
+    private String mParam2;
+
+    public SettingsFragment() {
+        // 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 SettingsFragment.
+     */
+    // TODO: Rename and change types and number of parameters
+    public static SettingsFragment newInstance(String param1, String param2) {
+        SettingsFragment fragment = new SettingsFragment();
+        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,
+                             Bundle savedInstanceState) {
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.fragment_settings, container, false);
+    }
+}

+ 10 - 0
app/src/main/res/drawable/ic_refresh.xml

@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorPrimary">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M480,800Q346,800 253,707Q160,614 160,480Q160,346 253,253Q346,160 480,160Q549,160 612,188.5Q675,217 720,270L720,160L800,160L800,440L520,440L520,360L688,360Q656,304 600.5,272Q545,240 480,240Q380,240 310,310Q240,380 240,480Q240,580 310,650Q380,720 480,720Q557,720 619,676Q681,632 706,560L790,560Q762,666 676,733Q590,800 480,800Z"/>
+</vector>

+ 10 - 0
app/src/main/res/drawable/ic_settings.xml

@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M370,880L354,752Q341,747 329.5,740Q318,733 307,725L188,775L78,585L181,507Q180,500 180,493.5Q180,487 180,480Q180,473 180,466.5Q180,460 181,453L78,375L188,185L307,235Q318,227 330,220Q342,213 354,208L370,80L590,80L606,208Q619,213 630.5,220Q642,227 653,235L772,185L882,375L779,453Q780,460 780,466.5Q780,473 780,480Q780,487 780,493.5Q780,500 778,507L881,585L771,775L653,725Q642,733 630,740Q618,747 606,752L590,880L370,880ZM440,800L519,800L533,694Q564,686 590.5,670.5Q617,655 639,633L738,674L777,606L691,541Q696,527 698,511.5Q700,496 700,480Q700,464 698,448.5Q696,433 691,419L777,354L738,286L639,328Q617,305 590.5,289.5Q564,274 533,266L520,160L441,160L427,266Q396,274 369.5,289.5Q343,305 321,327L222,286L183,354L269,418Q264,433 262,448Q260,463 260,480Q260,496 262,511Q264,526 269,541L183,606L222,674L321,632Q343,655 369.5,670.5Q396,686 427,694L440,800ZM482,620Q540,620 581,579Q622,538 622,480Q622,422 581,381Q540,340 482,340Q423,340 382.5,381Q342,422 342,480Q342,538 382.5,579Q423,620 482,620ZM480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480Z"/>
+</vector>

+ 11 - 0
app/src/main/res/drawable/ic_settings_backup_restore.xml

@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal"
+    android:autoMirrored="true">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M480,560Q447,560 423.5,536.5Q400,513 400,480Q400,447 423.5,423.5Q447,400 480,400Q513,400 536.5,423.5Q560,447 560,480Q560,513 536.5,536.5Q513,560 480,560ZM480,840Q341,840 239,748.5Q137,657 122,520L204,520Q218,624 296.5,692Q375,760 480,760Q597,760 678.5,678.5Q760,597 760,480Q760,363 678.5,281.5Q597,200 480,200Q411,200 351,232Q291,264 250,320L360,320L360,400L120,400L120,160L200,160L200,254Q251,190 324.5,155Q398,120 480,120Q555,120 620.5,148.5Q686,177 734.5,225.5Q783,274 811.5,339.5Q840,405 840,480Q840,555 811.5,620.5Q783,686 734.5,734.5Q686,783 620.5,811.5Q555,840 480,840Z"/>
+</vector>

+ 10 - 0
app/src/main/res/drawable/ic_signal_cellular.xml

@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M200,800L200,560L320,560L320,800L200,800ZM440,800L440,360L560,360L560,800L440,800ZM680,800L680,160L800,160L800,800L680,800Z"/>
+</vector>

+ 0 - 9
app/src/main/res/drawable/refreshoutlined.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-  <path
-      android:pathData="M17.65,6.35A7.958,7.958 0,0 0,12 4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08A5.99,5.99 0,0 1,12 18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"
-      android:fillColor="#ffeeff"/>
-</vector>

+ 27 - 13
app/src/main/res/layout/activity_main.xml

@@ -5,12 +5,12 @@
     android:id="@+id/main"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:fitsSystemWindows="true"
     tools:context=".MainActivity">
 
     <ScrollView
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:fitsSystemWindows="true"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
@@ -22,10 +22,9 @@
 
 
             <com.google.android.material.textfield.TextInputLayout
-                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu"
+                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
                 android:hint="Server">
 
                 <com.google.android.material.textfield.MaterialAutoCompleteTextView
@@ -115,14 +114,12 @@
                 android:layout_height="wrap_content"
                 android:layout_marginTop="16dp"
                 android:hint="ICCID"
-                app:endIconDrawable="@drawable/refreshoutlined"
-                app:endIconMode="custom"
-                app:endIconTint="@color/design_default_color_primary_dark">
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_iccid"
                     android:layout_width="match_parent"
-
                     android:layout_height="wrap_content"
                     android:inputType="number"
                     android:lines="1" />
@@ -134,9 +131,8 @@
                 android:layout_height="wrap_content"
                 android:layout_marginTop="16dp"
                 android:hint="IMEI"
-                app:endIconDrawable="@drawable/refreshoutlined"
-                app:endIconMode="custom"
-                app:endIconTint="@color/design_default_color_primary_dark">
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_imei"
@@ -152,9 +148,8 @@
                 android:layout_height="wrap_content"
                 android:layout_marginTop="16dp"
                 android:hint="IMSI"
-                app:endIconDrawable="@drawable/refreshoutlined"
-                app:endIconMode="custom"
-                app:endIconTint="@color/design_default_color_primary_dark">
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
 
                 <com.google.android.material.textfield.TextInputEditText
                     android:id="@+id/et_imsi"
@@ -272,4 +267,23 @@
                 android:text="Send" />
         </LinearLayout>
     </ScrollView>
+
+    <com.google.android.material.bottomnavigation.BottomNavigationView
+        android:id="@+id/nav"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:menu="@menu/bottom_nav_menu">
+
+    </com.google.android.material.bottomnavigation.BottomNavigationView>
+
+    <fragment
+        android:id="@+id/nav_host_fragment"
+        android:name="androidx.navigation.fragment.NavHostFragment"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:defaultNavHost="true"
+        app:layout_constraintBottom_toTopOf="@id/nav"
+        app:layout_constraintTop_toTopOf="parent"
+        app:navGraph="@navigation/home_nav" />
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 2
app/src/main/res/layout/floating_window.xml

@@ -14,7 +14,6 @@
         android:layout_height="match_parent"
         android:checked="true"
         android:text="Connect"
-        android:textColor="@color/white"
         android:textSize="14sp" />
 
     <com.google.android.material.checkbox.MaterialCheckBox
@@ -24,6 +23,5 @@
         android:layout_height="wrap_content"
         android:checked="true"
         android:text="Send"
-        android:textColor="@color/white"
         android:textSize="14sp" />
 </LinearLayout>

+ 14 - 0
app/src/main/res/layout/fragment_backup.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".fragments.BackupFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="1" />
+
+</FrameLayout>

+ 167 - 0
app/src/main/res/layout/fragment_cellular.xml

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".fragments.CellularFragment">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="20dp">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:orientation="horizontal">
+
+                <com.google.android.material.textfield.TextInputLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:hint="MCC">
+
+                    <com.google.android.material.textfield.TextInputEditText
+                        android:id="@+id/et_mcc"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:inputType="number"
+                        android:lines="1" />
+                </com.google.android.material.textfield.TextInputLayout>
+
+                <com.google.android.material.textfield.TextInputLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="16dp"
+
+                    android:layout_weight="1"
+                    android:hint="MNC">
+
+                    <com.google.android.material.textfield.TextInputEditText
+                        android:id="@+id/et_mnc"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:inputType="number"
+                        android:lines="1" />
+                </com.google.android.material.textfield.TextInputLayout>
+
+                <com.google.android.material.textfield.TextInputLayout
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="16dp"
+                    android:layout_weight="1"
+                    android:hint="Country">
+
+                    <com.google.android.material.textfield.TextInputEditText
+                        android:id="@+id/et_country"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:lines="1" />
+                </com.google.android.material.textfield.TextInputLayout>
+            </LinearLayout>
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:hint="Number">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_number"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:inputType="number"
+                    android:lines="1" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:id="@+id/tl_iccid"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:hint="ICCID"
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_iccid"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:inputType="number"
+                    android:lines="1" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:id="@+id/tl_imei"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:hint="IMEI"
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_imei"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:inputType="number"
+                    android:lines="1" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:id="@+id/tl_imsi"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:hint="IMSI"
+                app:endIconDrawable="@drawable/ic_refresh"
+                app:endIconMode="custom">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_imsi"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:inputType="number"
+                    android:lines="1" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+
+            <FrameLayout
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:layout_gravity="center"
+                android:layout_marginTop="16dp"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <com.google.android.material.progressindicator.CircularProgressIndicator
+                    android:id="@+id/progress_save"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:indeterminate="true"
+                    android:visibility="visible" />
+
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/btn_save"
+                    style="@style/Widget.Material3.Button.TonalButton"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:text="Save"
+                    android:visibility="visible" />
+            </FrameLayout>
+        </LinearLayout>
+    </ScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 14 - 0
app/src/main/res/layout/fragment_settings.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".fragments.SettingsFragment">
+
+    <!-- TODO: Update blank fragment layout -->
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>

+ 15 - 0
app/src/main/res/menu/bottom_nav_menu.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/nav_cellular"
+        android:icon="@drawable/ic_signal_cellular"
+        android:title="@string/config" />
+    <item
+        android:id="@+id/nav_backup"
+        android:icon="@drawable/ic_settings_backup_restore"
+        android:title="@string/backup" />
+    <item
+        android:id="@+id/nav_settings"
+        android:icon="@drawable/ic_settings"
+        android:title="@string/settings" />
+</menu>

+ 25 - 0
app/src/main/res/navigation/home_nav.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/mobile_navigation"
+    app:startDestination="@+id/nav_cellular">
+
+    <fragment
+        android:id="@+id/nav_cellular"
+        android:name="com.example.modifier.fragments.CellularFragment"
+        android:label="@string/config"
+        tools:layout="@layout/fragment_cellular" />
+
+    <fragment
+        android:id="@+id/nav_backup"
+        android:name="com.example.modifier.fragments.BackupFragment"
+        android:label="@string/backup"
+        tools:layout="@layout/fragment_backup" />
+
+    <fragment
+        android:id="@+id/nav_settings"
+        android:name="com.example.modifier.fragments.SettingsFragment"
+        android:label="@string/settings"
+        tools:layout="@layout/fragment_settings" />
+</navigation>

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

@@ -0,0 +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_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_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_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_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_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_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_onPrimary_highContrast">#000000</color>
+    <color name="md_theme_primaryContainer_highContrast">#B5D58E</color>
+    <color name="md_theme_onPrimaryContainer_highContrast">#000000</color>
+    <color name="md_theme_secondary_highContrast">#F4FFDF</color>
+    <color name="md_theme_onSecondary_highContrast">#000000</color>
+    <color name="md_theme_secondaryContainer_highContrast">#C4CFB1</color>
+    <color name="md_theme_onSecondaryContainer_highContrast">#000000</color>
+    <color name="md_theme_tertiary_highContrast">#EAFFFC</color>
+    <color name="md_theme_onTertiary_highContrast">#000000</color>
+    <color name="md_theme_tertiaryContainer_highContrast">#A4D4D0</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_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_scrim_highContrast">#000000</color>
+    <color name="md_theme_inverseSurface_highContrast">#E2E3D8</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_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_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_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>
+</resources>

+ 98 - 0
app/src/main/res/values-night/theme_overlays.xml

@@ -0,0 +1,98 @@
+<resources>
+    <style name="ThemeOverlay.AppTheme.MediumContrast" parent="Theme.Material3.Dark.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_primary_mediumContrast</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary_mediumContrast</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer_mediumContrast</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer_mediumContrast</item>
+        <item name="colorSecondary">@color/md_theme_secondary_mediumContrast</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary_mediumContrast</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer_mediumContrast</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer_mediumContrast</item>
+        <item name="colorTertiary">@color/md_theme_tertiary_mediumContrast</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary_mediumContrast</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer_mediumContrast</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer_mediumContrast</item>
+        <item name="colorError">@color/md_theme_error_mediumContrast</item>
+        <item name="colorOnError">@color/md_theme_onError_mediumContrast</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer_mediumContrast</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer_mediumContrast</item>
+        <item name="android:colorBackground">@color/md_theme_background_mediumContrast</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground_mediumContrast</item>
+        <item name="colorSurface">@color/md_theme_surface_mediumContrast</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface_mediumContrast</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant_mediumContrast</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant_mediumContrast</item>
+        <item name="colorOutline">@color/md_theme_outline_mediumContrast</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant_mediumContrast</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface_mediumContrast</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface_mediumContrast</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary_mediumContrast</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed_mediumContrast</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed_mediumContrast</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim_mediumContrast</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant_mediumContrast</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed_mediumContrast</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed_mediumContrast</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim_mediumContrast</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant_mediumContrast</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed_mediumContrast</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed_mediumContrast</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim_mediumContrast</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant_mediumContrast</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim_mediumContrast</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright_mediumContrast</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest_mediumContrast</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow_mediumContrast</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer_mediumContrast</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh_mediumContrast</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest_mediumContrast</item>
+    </style>
+    <style name="ThemeOverlay.AppTheme.HighContrast" parent="Theme.Material3.Dark.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_primary_highContrast</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary_highContrast</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer_highContrast</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer_highContrast</item>
+        <item name="colorSecondary">@color/md_theme_secondary_highContrast</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary_highContrast</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer_highContrast</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer_highContrast</item>
+        <item name="colorTertiary">@color/md_theme_tertiary_highContrast</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary_highContrast</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer_highContrast</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer_highContrast</item>
+        <item name="colorError">@color/md_theme_error_highContrast</item>
+        <item name="colorOnError">@color/md_theme_onError_highContrast</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer_highContrast</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer_highContrast</item>
+        <item name="android:colorBackground">@color/md_theme_background_highContrast</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground_highContrast</item>
+        <item name="colorSurface">@color/md_theme_surface_highContrast</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface_highContrast</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant_highContrast</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant_highContrast</item>
+        <item name="colorOutline">@color/md_theme_outline_highContrast</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant_highContrast</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface_highContrast</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface_highContrast</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary_highContrast</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed_highContrast</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed_highContrast</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim_highContrast</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant_highContrast</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed_highContrast</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed_highContrast</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim_highContrast</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant_highContrast</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed_highContrast</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed_highContrast</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim_highContrast</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant_highContrast</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim_highContrast</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright_highContrast</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest_highContrast</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow_highContrast</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer_highContrast</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh_highContrast</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest_highContrast</item>
+    </style>
+</resources>

+ 49 - 6
app/src/main/res/values-night/themes.xml

@@ -1,7 +1,50 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Base.Theme.Modifier" parent="Theme.MaterialComponents.DayNight.NoActionBar">
-        <!-- Customize your dark theme here. -->
-        <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+<resources>
+    <style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_primary</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_error</item>
+        <item name="colorOnError">@color/md_theme_onError</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_background</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground</item>
+        <item name="colorSurface">@color/md_theme_surface</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant</item>
+        <item name="colorOutline">@color/md_theme_outline</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
     </style>
-</resources>
+</resources>

+ 142 - 4
app/src/main/res/values/colors.xml

@@ -1,5 +1,143 @@
-<?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <color name="black">#FF000000</color>
-    <color name="white">#FFFFFFFF</color>
-</resources>
+    <color name="md_theme_primary">#4C662B</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_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_onTertiary">#FFFFFF</color>
+    <color name="md_theme_tertiaryContainer">#BCECE7</color>
+    <color name="md_theme_onTertiaryContainer">#00201E</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_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_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_onPrimary_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_primaryContainer_mediumContrast">#617D3F</color>
+    <color name="md_theme_onPrimaryContainer_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_secondary_mediumContrast">#3C462F</color>
+    <color name="md_theme_onSecondary_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryContainer_mediumContrast">#6E785E</color>
+    <color name="md_theme_onSecondaryContainer_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_tertiary_mediumContrast">#1A4A47</color>
+    <color name="md_theme_onTertiary_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryContainer_mediumContrast">#4F7D79</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_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_onPrimaryFixed_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_primaryFixedDim_mediumContrast">#496429</color>
+    <color name="md_theme_onPrimaryFixedVariant_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryFixed_mediumContrast">#6E785E</color>
+    <color name="md_theme_onSecondaryFixed_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryFixedDim_mediumContrast">#555F47</color>
+    <color name="md_theme_onSecondaryFixedVariant_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryFixed_mediumContrast">#4F7D79</color>
+    <color name="md_theme_onTertiaryFixed_mediumContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryFixedDim_mediumContrast">#366460</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_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_onPrimary_highContrast">#FFFFFF</color>
+    <color name="md_theme_primaryContainer_highContrast">#314A12</color>
+    <color name="md_theme_onPrimaryContainer_highContrast">#FFFFFF</color>
+    <color name="md_theme_secondary_highContrast">#1C2511</color>
+    <color name="md_theme_onSecondary_highContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryContainer_highContrast">#3C462F</color>
+    <color name="md_theme_onSecondaryContainer_highContrast">#FFFFFF</color>
+    <color name="md_theme_tertiary_highContrast">#002725</color>
+    <color name="md_theme_onTertiary_highContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryContainer_highContrast">#1A4A47</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_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_scrim_highContrast">#000000</color>
+    <color name="md_theme_inverseSurface_highContrast">#2F312A</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_onPrimaryFixed_highContrast">#FFFFFF</color>
+    <color name="md_theme_primaryFixedDim_highContrast">#1C3300</color>
+    <color name="md_theme_onPrimaryFixedVariant_highContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryFixed_highContrast">#3C462F</color>
+    <color name="md_theme_onSecondaryFixed_highContrast">#FFFFFF</color>
+    <color name="md_theme_secondaryFixedDim_highContrast">#26301B</color>
+    <color name="md_theme_onSecondaryFixedVariant_highContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryFixed_highContrast">#1A4A47</color>
+    <color name="md_theme_onTertiaryFixed_highContrast">#FFFFFF</color>
+    <color name="md_theme_tertiaryFixedDim_highContrast">#003331</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_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>
+</resources>

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

@@ -2,4 +2,10 @@
     <string name="app_name">Modifier</string>
     <string name="accessibility_service_label">ModifierService</string>
     <string name="accessibility_service_description">ModifierService</string>
+    <string name="sim_config">SIM Config</string>
+    <string name="config">Config</string>
+    <string name="backup">Backup</string>
+    <string name="settings">Settings</string>
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
 </resources>

+ 98 - 0
app/src/main/res/values/theme_overlays.xml

@@ -0,0 +1,98 @@
+<resources>
+    <style name="ThemeOverlay.AppTheme.MediumContrast" parent="Theme.Material3.Light.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_primary_mediumContrast</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary_mediumContrast</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer_mediumContrast</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer_mediumContrast</item>
+        <item name="colorSecondary">@color/md_theme_secondary_mediumContrast</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary_mediumContrast</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer_mediumContrast</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer_mediumContrast</item>
+        <item name="colorTertiary">@color/md_theme_tertiary_mediumContrast</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary_mediumContrast</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer_mediumContrast</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer_mediumContrast</item>
+        <item name="colorError">@color/md_theme_error_mediumContrast</item>
+        <item name="colorOnError">@color/md_theme_onError_mediumContrast</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer_mediumContrast</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer_mediumContrast</item>
+        <item name="android:colorBackground">@color/md_theme_background_mediumContrast</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground_mediumContrast</item>
+        <item name="colorSurface">@color/md_theme_surface_mediumContrast</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface_mediumContrast</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant_mediumContrast</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant_mediumContrast</item>
+        <item name="colorOutline">@color/md_theme_outline_mediumContrast</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant_mediumContrast</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface_mediumContrast</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface_mediumContrast</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary_mediumContrast</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed_mediumContrast</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed_mediumContrast</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim_mediumContrast</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant_mediumContrast</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed_mediumContrast</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed_mediumContrast</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim_mediumContrast</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant_mediumContrast</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed_mediumContrast</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed_mediumContrast</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim_mediumContrast</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant_mediumContrast</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim_mediumContrast</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright_mediumContrast</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest_mediumContrast</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow_mediumContrast</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer_mediumContrast</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh_mediumContrast</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest_mediumContrast</item>
+    </style>
+    <style name="ThemeOverlay.AppTheme.HighContrast" parent="Theme.Material3.Light.NoActionBar">
+        <item name="colorPrimary">@color/md_theme_primary_highContrast</item>
+        <item name="colorOnPrimary">@color/md_theme_onPrimary_highContrast</item>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer_highContrast</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer_highContrast</item>
+        <item name="colorSecondary">@color/md_theme_secondary_highContrast</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary_highContrast</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer_highContrast</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer_highContrast</item>
+        <item name="colorTertiary">@color/md_theme_tertiary_highContrast</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary_highContrast</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer_highContrast</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer_highContrast</item>
+        <item name="colorError">@color/md_theme_error_highContrast</item>
+        <item name="colorOnError">@color/md_theme_onError_highContrast</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer_highContrast</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer_highContrast</item>
+        <item name="android:colorBackground">@color/md_theme_background_highContrast</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground_highContrast</item>
+        <item name="colorSurface">@color/md_theme_surface_highContrast</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface_highContrast</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant_highContrast</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant_highContrast</item>
+        <item name="colorOutline">@color/md_theme_outline_highContrast</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant_highContrast</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface_highContrast</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface_highContrast</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary_highContrast</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed_highContrast</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed_highContrast</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim_highContrast</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant_highContrast</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed_highContrast</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed_highContrast</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim_highContrast</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant_highContrast</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed_highContrast</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed_highContrast</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim_highContrast</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant_highContrast</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim_highContrast</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright_highContrast</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest_highContrast</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow_highContrast</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer_highContrast</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh_highContrast</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest_highContrast</item>
+    </style>
+</resources>

+ 49 - 13
app/src/main/res/values/themes.xml

@@ -1,15 +1,51 @@
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Base application theme. -->
-    <style name="Base.Theme.Modifier" parent="Theme.MaterialComponents.Light.NoActionBar">
-        <!-- Customize your light theme here. -->
-        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
-    </style>
-
-    <style name="Theme.Modifier" parent="Base.Theme.Modifier" />
-
-    <style name="FloatingWindow" parent="Theme.MaterialComponents.DayNight.NoActionBar">
-        <!-- Customize your light theme here. -->
-        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+<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>
+        <item name="colorPrimaryContainer">@color/md_theme_primaryContainer</item>
+        <item name="colorOnPrimaryContainer">@color/md_theme_onPrimaryContainer</item>
+        <item name="colorSecondary">@color/md_theme_secondary</item>
+        <item name="colorOnSecondary">@color/md_theme_onSecondary</item>
+        <item name="colorSecondaryContainer">@color/md_theme_secondaryContainer</item>
+        <item name="colorOnSecondaryContainer">@color/md_theme_onSecondaryContainer</item>
+        <item name="colorTertiary">@color/md_theme_tertiary</item>
+        <item name="colorOnTertiary">@color/md_theme_onTertiary</item>
+        <item name="colorTertiaryContainer">@color/md_theme_tertiaryContainer</item>
+        <item name="colorOnTertiaryContainer">@color/md_theme_onTertiaryContainer</item>
+        <item name="colorError">@color/md_theme_error</item>
+        <item name="colorOnError">@color/md_theme_onError</item>
+        <item name="colorErrorContainer">@color/md_theme_errorContainer</item>
+        <item name="colorOnErrorContainer">@color/md_theme_onErrorContainer</item>
+        <item name="android:colorBackground">@color/md_theme_background</item>
+        <item name="colorOnBackground">@color/md_theme_onBackground</item>
+        <item name="colorSurface">@color/md_theme_surface</item>
+        <item name="colorOnSurface">@color/md_theme_onSurface</item>
+        <item name="colorSurfaceVariant">@color/md_theme_surfaceVariant</item>
+        <item name="colorOnSurfaceVariant">@color/md_theme_onSurfaceVariant</item>
+        <item name="colorOutline">@color/md_theme_outline</item>
+        <item name="colorOutlineVariant">@color/md_theme_outlineVariant</item>
+        <item name="colorSurfaceInverse">@color/md_theme_inverseSurface</item>
+        <item name="colorOnSurfaceInverse">@color/md_theme_inverseOnSurface</item>
+        <item name="colorPrimaryInverse">@color/md_theme_inversePrimary</item>
+        <item name="colorPrimaryFixed">@color/md_theme_primaryFixed</item>
+        <item name="colorOnPrimaryFixed">@color/md_theme_onPrimaryFixed</item>
+        <item name="colorPrimaryFixedDim">@color/md_theme_primaryFixedDim</item>
+        <item name="colorOnPrimaryFixedVariant">@color/md_theme_onPrimaryFixedVariant</item>
+        <item name="colorSecondaryFixed">@color/md_theme_secondaryFixed</item>
+        <item name="colorOnSecondaryFixed">@color/md_theme_onSecondaryFixed</item>
+        <item name="colorSecondaryFixedDim">@color/md_theme_secondaryFixedDim</item>
+        <item name="colorOnSecondaryFixedVariant">@color/md_theme_onSecondaryFixedVariant</item>
+        <item name="colorTertiaryFixed">@color/md_theme_tertiaryFixed</item>
+        <item name="colorOnTertiaryFixed">@color/md_theme_onTertiaryFixed</item>
+        <item name="colorTertiaryFixedDim">@color/md_theme_tertiaryFixedDim</item>
+        <item name="colorOnTertiaryFixedVariant">@color/md_theme_onTertiaryFixedVariant</item>
+        <item name="colorSurfaceDim">@color/md_theme_surfaceDim</item>
+        <item name="colorSurfaceBright">@color/md_theme_surfaceBright</item>
+        <item name="colorSurfaceContainerLowest">@color/md_theme_surfaceContainerLowest</item>
+        <item name="colorSurfaceContainerLow">@color/md_theme_surfaceContainerLow</item>
+        <item name="colorSurfaceContainer">@color/md_theme_surfaceContainer</item>
+        <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
+        <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
     </style>
-</resources>
+</resources>

+ 4 - 0
gradle/libs.versions.toml

@@ -12,6 +12,8 @@ material = "1.11.0"
 activity = "1.8.0"
 constraintlayout = "2.1.4"
 socketIoClient = "2.0.0"
+navigationFragment = "2.7.7"
+navigationUi = "2.7.7"
 
 [libraries]
 commons-collections4 = { module = "org.apache.commons:commons-collections4", version.ref = "commonsCollections4" }
@@ -26,6 +28,8 @@ material = { group = "com.google.android.material", name = "material", version.r
 activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
 constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
 socket-io-client = { module = "io.socket:socket.io-client", version.ref = "socketIoClient" }
+navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" }
+navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigationUi" }
 
 [plugins]
 androidApplication = { id = "com.android.application", version.ref = "agp" }