xiongzhu 1 vuosi sitten
vanhempi
commit
b9067d2109

+ 0 - 91
app/src/main/java/com/example/modifier/MainActivity.java

@@ -48,7 +48,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 public class MainActivity extends AppCompatActivity {
-    private static final String TAG = "SpooferModule";
     ActivityMainBinding mBinding;
     ExecutorService executor = Executors.newFixedThreadPool(32);
     Handler handler = new Handler(Looper.getMainLooper());
@@ -60,52 +59,6 @@ public class MainActivity extends AppCompatActivity {
         mBinding = ActivityMainBinding.inflate(getLayoutInflater());
         setContentView(mBinding.getRoot());
 
-
-        mBinding.btnClear.setOnClickListener(v -> {
-            onClear();
-        });
-        mBinding.btnStop.setOnClickListener(v -> {
-            onStopClick();
-        });
-        mBinding.btnSend.setOnClickListener(v -> {
-            String otp = mBinding.etOtp.getText().toString();
-            Intent intent = new Intent();
-            intent.setAction("com.example.modifier.sms");
-            intent.putExtra("sender", "3538");
-            intent.putExtra("message", "Your Messenger verification code is G-" + otp);
-            sendBroadcast(intent);
-        });
-
-        Set<String> defServers = new HashSet<>();
-        defServers.add("http://192.168.6.215:3000");
-        defServers.add("http://192.168.50.135:3000");
-        SharedPreferences prefs = getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE);
-        Set<String> servers = new HashSet<>(prefs.getStringSet("servers", defServers));
-        mBinding.etServer.setSimpleItems(servers.toArray(new String[0]));
-        mBinding.etServer.setThreshold(1000);
-        if (prefs.contains("server")) {
-            mBinding.etServer.setText(prefs.getString("server", ""));
-        }
-        mBinding.btnServer.setOnClickListener(v -> {
-            String server = mBinding.etServer.getText().toString();
-            if (StringUtils.isEmpty(server)) {
-                Toast.makeText(this, "Server is required", Toast.LENGTH_SHORT).show();
-                return;
-            }
-            prefs.edit().putString("server", server).apply();
-            Toast.makeText(this, "Server saved", Toast.LENGTH_SHORT).show();
-
-            servers.add(server);
-            prefs.edit().putStringSet("servers", servers).apply();
-            mBinding.etServer.setSimpleItems(servers.toArray(new String[0]));
-
-            ModifierService modifierService = ModifierService.getInstance();
-            if (modifierService != null) {
-                modifierService.connect(server);
-            }
-        });
-
-
         handler.postDelayed(() -> {
             executor.execute(() -> {
                 if (Utils.hasRootAccess()) {
@@ -116,7 +69,6 @@ public class MainActivity extends AppCompatActivity {
                             startActivity(intent);
                             handler.postDelayed(this::finish, 1000);
                         }
-
                     }
                 } else {
                     handler.post(() -> {
@@ -137,47 +89,4 @@ public class MainActivity extends AppCompatActivity {
         NavController controller = navHostFragment.getNavController();
         NavigationUI.setupWithNavController(mBinding.nav, controller);
     }
-
-
-    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()));
-            Commons.stop(gsf, gms, sms);
-            handler.post(() -> {
-                mBinding.llBtn.setVisibility(View.VISIBLE);
-                mBinding.progressClear.setVisibility(View.GONE);
-            });
-        });
-    }
-
-
-    private void onStopClick() {
-        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.stop(gsf, gms, sms);
-            handler.post(() -> {
-                mBinding.llBtn.setVisibility(View.VISIBLE);
-                mBinding.progressClear.setVisibility(View.GONE);
-            });
-        });
-    }
-
-
 }

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

@@ -8,6 +8,13 @@ import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.accessibility.AccessibilityManager;
+import android.widget.Button;
+
+import androidx.appcompat.widget.AppCompatButton;
+
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.progressindicator.CircularProgressIndicatorSpec;
+import com.google.android.material.progressindicator.IndeterminateDrawable;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -184,4 +191,11 @@ public class Utils {
 
         return imei;
     }
+
+    public static void addProgressIndicator(Context context, MaterialButton button) {
+        CircularProgressIndicatorSpec spec = new CircularProgressIndicatorSpec(context, null, 0,
+                com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall);
+        IndeterminateDrawable progressIndicatorDrawable = IndeterminateDrawable.createCircularDrawable(context, spec);
+        button.setIcon(progressIndicatorDrawable);
+    }
 }

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

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

+ 163 - 37
app/src/main/java/com/example/modifier/fragments/SettingsFragment.java

@@ -1,66 +1,192 @@
 package com.example.modifier.fragments;
 
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.SharedPreferences;
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+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.BuildConfig;
+import com.example.modifier.Config;
+import com.example.modifier.ModifierService;
 import com.example.modifier.R;
+import com.example.modifier.Utils;
+import com.example.modifier.databinding.FragmentSettingsBinding;
+import com.google.android.material.progressindicator.CircularProgressIndicatorSpec;
+import com.google.android.material.progressindicator.IndeterminateDrawable;
+import com.google.gson.Gson;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
-/**
- * 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";
+    private FragmentSettingsBinding binding;
 
-    // TODO: Rename and change types of parameters
-    private String mParam1;
-    private String mParam2;
+    Handler handler = new Handler(Looper.getMainLooper());
+    ExecutorService executor = Executors.newFixedThreadPool(32);
 
     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);
-        }
+
     }
 
+    @SuppressLint("SetTextI18n")
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-        // Inflate the layout for this fragment
-        return inflater.inflate(R.layout.fragment_settings, container, false);
+        binding = FragmentSettingsBinding.inflate(inflater, container, false);
+        binding.tlIccid.setEndIconOnClickListener(v -> {
+            binding.etIccid.setText(RandomStringUtils.randomNumeric(20));
+        });
+        binding.tlImsi.setEndIconOnClickListener(v -> {
+            String mcc = Optional.ofNullable(binding.etMcc.getText()).map(Objects::toString).orElse("");
+            String mnc = Optional.ofNullable(binding.etMnc.getText()).map(Objects::toString).orElse("");
+            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();
+        });
+
+        Set<String> defServers = new HashSet<>();
+        defServers.add("http://192.168.6.215:3000");
+        defServers.add("http://192.168.50.135:3000");
+        SharedPreferences prefs = getContext().getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
+        Set<String> servers = new HashSet<>(prefs.getStringSet("servers", defServers));
+        binding.etServer.setSimpleItems(servers.toArray(new String[0]));
+        binding.etServer.setThreshold(1000);
+        if (prefs.contains("server")) {
+            binding.etServer.setText(prefs.getString("server", ""));
+        }
+        binding.btnServer.setOnClickListener(v -> {
+            String server = binding.etServer.getText().toString();
+            if (StringUtils.isEmpty(server)) {
+                Toast.makeText(getContext(), "Server is required", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            prefs.edit().putString("server", server).apply();
+
+            servers.add(server);
+            prefs.edit().putStringSet("servers", servers).apply();
+            binding.etServer.setSimpleItems(servers.toArray(new String[0]));
+
+            ModifierService modifierService = ModifierService.getInstance();
+            if (modifierService != null) {
+                modifierService.connect(server);
+            }
+
+            Utils.addProgressIndicator(getContext(), binding.btnServer);
+            binding.btnServer.setEnabled(false);
+            handler.postDelayed(() -> {
+                binding.btnServer.setIconResource(R.drawable.ic_done);
+                binding.btnServer.setText("OK");
+                handler.postDelayed(() -> {
+                    binding.btnServer.setEnabled(true);
+                    binding.btnServer.setIcon(null);
+                    binding.btnServer.setText("Save");
+                }, 1500);
+            }, 500);
+        });
+
+
+        return binding.getRoot();
+    }
+
+    private void onSave() {
+        Utils.addProgressIndicator(getContext(), binding.btnSave);
+        binding.btnSave.setEnabled(false);
+        executor.execute(() -> {
+            save();
+            handler.post(() -> {
+                binding.btnSave.setIconResource(R.drawable.ic_done);
+                binding.btnSave.setText("OK");
+                handler.postDelayed(() -> {
+                    binding.btnSave.setEnabled(true);
+                    binding.btnSave.setIcon(null);
+                    binding.btnSave.setText("Save");
+                }, 1500);
+            });
+        });
+    }
+
+    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();
+        }
     }
 }

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

@@ -0,0 +1,113 @@
+package com.example.modifier.fragments;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import com.example.modifier.Commons;
+import com.example.modifier.R;
+import com.example.modifier.Utils;
+import com.example.modifier.databinding.FragmentUtilsBinding;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class UtilsFragment extends Fragment {
+
+    private FragmentUtilsBinding binding;
+
+    Handler handler = new Handler(Looper.getMainLooper());
+    ExecutorService executor = Executors.newFixedThreadPool(32);
+
+    public UtilsFragment() {
+    }
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+    }
+
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        binding = FragmentUtilsBinding.inflate(inflater, container, false);
+        binding.btnClear.setOnClickListener(v -> {
+            onClear();
+        });
+        binding.btnStop.setOnClickListener(v -> {
+            onStopClick();
+        });
+        binding.btnSend.setOnClickListener(v -> {
+            binding.btnSend.setEnabled(false);
+            Utils.addProgressIndicator(getContext(), binding.btnSend);
+            handler.post(() -> {
+                String otp = binding.etOtp.getText().toString();
+                Intent intent = new Intent();
+                intent.setAction("com.example.modifier.sms");
+                intent.putExtra("sender", "3538");
+                intent.putExtra("message", "Your Messenger verification code is G-" + otp);
+                getContext().sendBroadcast(intent);
+
+                binding.btnSend.setIconResource(R.drawable.ic_done);
+                binding.btnSend.setText("OK");
+                handler.postDelayed(() -> {
+                    binding.btnSend.setEnabled(true);
+                    binding.btnSend.setIcon(null);
+                    binding.btnSend.setText("Send");
+                }, 1500);
+            });
+        });
+        return binding.getRoot();
+    }
+
+    private void onClear() {
+        binding.btnClear.setEnabled(false);
+        Utils.addProgressIndicator(getContext(), binding.btnClear);
+        executor.execute(() -> {
+            boolean gsf = binding.cbGsf.isChecked();
+            boolean gms = binding.cbGms.isChecked();
+            boolean sms = binding.cbSms.isChecked();
+            Commons.clear(gsf, gms, sms);
+            Commons.stop(gsf, gms, sms);
+            handler.post(() -> {
+                binding.btnClear.setIconResource(R.drawable.ic_done);
+                binding.btnClear.setText("OK");
+                handler.postDelayed(() -> {
+                    binding.btnClear.setEnabled(true);
+                    binding.btnClear.setIcon(null);
+                    binding.btnClear.setText("Clear");
+                }, 1500);
+            });
+        });
+    }
+
+
+    private void onStopClick() {
+        binding.btnStop.setEnabled(false);
+        Utils.addProgressIndicator(getContext(), binding.btnStop);
+        executor.execute(() -> {
+            boolean gsf = binding.cbGsf.isChecked();
+            boolean gms = binding.cbGms.isChecked();
+            boolean sms = binding.cbSms.isChecked();
+            Commons.stop(gsf, gms, sms);
+            handler.post(() -> {
+                binding.btnStop.setIconResource(R.drawable.ic_done);
+                binding.btnStop.setText("OK");
+                handler.postDelayed(() -> {
+                    binding.btnStop.setEnabled(true);
+                    binding.btnStop.setIcon(null);
+                    binding.btnStop.setText("Stop");
+                }, 1500);
+            });
+        });
+    }
+}

+ 10 - 0
app/src/main/res/drawable/ic_add.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="M440,520L200,520L200,440L440,440L440,200L520,200L520,440L760,440L760,520L520,520L520,760L440,760L440,520Z"/>
+</vector>

+ 10 - 0
app/src/main/res/drawable/ic_done.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="M382,720L154,492L211,435L382,606L749,239L806,296L382,720Z"/>
+</vector>

+ 10 - 0
app/src/main/res/drawable/ic_handyman.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="M754,879Q746,879 739,876.5Q732,874 726,868L522,664Q516,658 513.5,651Q511,644 511,636Q511,628 513.5,621Q516,614 522,608L607,523Q613,517 620,514.5Q627,512 635,512Q643,512 650,514.5Q657,517 663,523L867,727Q873,733 875.5,740Q878,747 878,755Q878,763 875.5,770Q873,777 867,783L782,868Q776,874 769,876.5Q762,879 754,879ZM754,784L783,755L636,608L607,637L754,784ZM205,880Q197,880 189.5,877Q182,874 176,868L92,784Q86,778 83,770.5Q80,763 80,755Q80,747 83,740Q86,733 92,727L304,515L389,515L423,481L258,316L201,316L80,195L193,82L314,203L314,260L479,425L595,309L552,266L608,210L495,210L467,182L609,40L637,68L637,181L693,125L835,267Q852,284 861,305.5Q870,327 870,351Q870,375 861,397Q852,419 835,436L750,351L694,407L652,365L445,572L445,656L233,868Q227,874 220,877Q213,880 205,880ZM205,784L375,614L375,585L346,585L176,755L205,784ZM205,784L176,755L176,755L191,769L205,784L205,784ZM754,784L754,784L783,755L783,755L754,784Z"/>
+</vector>

+ 0 - 261
app/src/main/res/layout/activity_main.xml

@@ -7,267 +7,6 @@
     android:layout_height="match_parent"
     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">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:padding="20dp">
-
-
-            <com.google.android.material.textfield.TextInputLayout
-                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:hint="Server">
-
-                <com.google.android.material.textfield.MaterialAutoCompleteTextView
-                    android:id="@+id/et_server"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content" />
-
-            </com.google.android.material.textfield.TextInputLayout>
-
-
-            <com.google.android.material.button.MaterialButton
-                android:id="@+id/btn_server"
-                android:layout_width="match_parent"
-                android:layout_height="56dp"
-                android:layout_marginTop="16dp"
-                android:text="Save" />
-
-            <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>
-
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="70dp"
-                android:layout_marginTop="32dp"
-                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:indeterminate="true"
-                    android:visibility="gone" />
-
-                <com.google.android.material.button.MaterialButton
-                    android:id="@+id/btn_save"
-                    android:layout_width="match_parent"
-                    android:layout_height="56dp"
-                    android:text="Save" />
-            </LinearLayout>
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:gravity="center"
-                android:orientation="horizontal">
-
-                <CheckBox
-                    android:id="@+id/cb_gsf"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="GSF"></CheckBox>
-
-                <CheckBox
-                    android:id="@+id/cb_gms"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="GMS"></CheckBox>
-
-                <CheckBox
-                    android:id="@+id/cb_sms"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="SMS"></CheckBox>
-            </LinearLayout>
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="70dp"
-                android:gravity="center"
-                android:orientation="vertical">
-
-                <com.google.android.material.progressindicator.CircularProgressIndicator
-                    android:id="@+id/progress_clear"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:indeterminate="true"
-                    android:visibility="gone" />
-
-                <LinearLayout
-                    android:id="@+id/ll_btn"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:orientation="horizontal">
-
-                    <com.google.android.material.button.MaterialButton
-                        android:id="@+id/btn_clear"
-                        android:layout_width="0dp"
-                        android:layout_height="56dp"
-                        android:layout_weight="1"
-                        android:text="Clear" />
-
-                    <com.google.android.material.button.MaterialButton
-                        android:id="@+id/btn_stop"
-                        android:layout_width="0dp"
-                        android:layout_height="56dp"
-                        android:layout_marginLeft="16dp"
-                        android:layout_weight="1"
-                        android:text="Stop" />
-                </LinearLayout>
-
-
-            </LinearLayout>
-
-            <com.google.android.material.textfield.TextInputLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:hint="OTP">
-
-                <com.google.android.material.textfield.TextInputEditText
-                    android:id="@+id/et_otp"
-                    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.button.MaterialButton
-                android:id="@+id/btn_send"
-                android:layout_width="match_parent"
-                android:layout_height="56dp"
-                android:layout_marginTop="16dp"
-                android:text="Send" />
-        </LinearLayout>
-    </ScrollView>
-
     <com.google.android.material.bottomnavigation.BottomNavigationView
         android:id="@+id/nav"
         android:layout_width="match_parent"

+ 25 - 5
app/src/main/res/layout/fragment_backup.xml

@@ -1,14 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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.BackupFragment">
 
-    <!-- TODO: Update blank fragment layout -->
-    <TextView
+    <ScrollView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:text="1" />
+        android:clipToPadding="false"
+        android:fitsSystemWindows="true">
 
-</FrameLayout>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="20dp">
+
+        </LinearLayout>
+    </ScrollView>
+
+    <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
+        android:id="@+id/extended_fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|end"
+        android:layout_margin="16dp"
+        android:text="New Backup"
+        app:icon="@drawable/ic_add"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -1,167 +0,0 @@
-<?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>

+ 207 - 5
app/src/main/res/layout/fragment_settings.xml

@@ -1,14 +1,216 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<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.SettingsFragment">
 
-    <!-- TODO: Update blank fragment layout -->
-    <TextView
+    <ScrollView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:text="@string/hello_blank_fragment" />
+        android:clipToPadding="false"
+        android:fitsSystemWindows="true">
 
-</FrameLayout>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="20dp">
+
+            <com.google.android.material.card.MaterialCardView
+                style="@style/Widget.Material3.CardView.Filled"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="Server Settings"
+                        android:textColor="?attr/colorPrimary"
+                        android:textSize="14sp"
+                        android:textStyle="bold" />
+
+                    <com.google.android.material.textfield.TextInputLayout
+                        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:hint="Server">
+
+                        <com.google.android.material.textfield.MaterialAutoCompleteTextView
+                            android:id="@+id/et_server"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content" />
+
+                    </com.google.android.material.textfield.TextInputLayout>
+
+                    <com.google.android.material.button.MaterialButton
+                        android:id="@+id/btn_server"
+                        android:layout_width="120dp"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="16dp"
+                        android:text="Save" />
+                </LinearLayout>
+            </com.google.android.material.card.MaterialCardView>
+
+
+            <com.google.android.material.card.MaterialCardView
+                style="@style/Widget.Material3.CardView.Filled"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="SIM Settings"
+                        android:textColor="?attr/colorPrimary"
+                        android:textSize="14sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        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>
+
+
+                    <com.google.android.material.button.MaterialButton
+                        android:id="@+id/btn_save"
+                        android:layout_width="120dp"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="16dp"
+                        android:text="Save"
+                        android:visibility="visible" />
+                </LinearLayout>
+            </com.google.android.material.card.MaterialCardView>
+        </LinearLayout>
+    </ScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -0,0 +1,136 @@
+<?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.UtilsFragment">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:clipToPadding="false"
+        android:fitsSystemWindows="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="20dp">
+
+            <com.google.android.material.card.MaterialCardView
+                style="@style/Widget.Material3.CardView.Filled"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="App &amp; Data"
+                        android:textColor="?attr/colorPrimary"
+                        android:textSize="14sp"
+                        android:textStyle="bold" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:orientation="horizontal">
+
+                        <CheckBox
+                            android:id="@+id/cb_gsf"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="GSF" />
+
+                        <CheckBox
+                            android:id="@+id/cb_gms"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="GMS" />
+
+                        <CheckBox
+                            android:id="@+id/cb_sms"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="SMS" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <com.google.android.material.button.MaterialButton
+                            android:id="@+id/btn_clear"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:text="Clear" />
+
+                        <com.google.android.material.button.MaterialButton
+                            android:id="@+id/btn_stop"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="16dp"
+                            android:layout_weight="1"
+                            android:text="Stop" />
+                    </LinearLayout>
+                </LinearLayout>
+            </com.google.android.material.card.MaterialCardView>
+
+            <com.google.android.material.card.MaterialCardView
+                style="@style/Widget.Material3.CardView.Filled"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:padding="16dp">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="16dp"
+                        android:text="Fake OTP"
+                        android:textColor="?attr/colorPrimary"
+                        android:textSize="14sp"
+                        android:textStyle="bold" />
+
+                    <com.google.android.material.textfield.TextInputLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:hint="OTP">
+
+                        <com.google.android.material.textfield.TextInputEditText
+                            android:id="@+id/et_otp"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center"
+                            android:inputType="number"
+                            android:lines="1" />
+                    </com.google.android.material.textfield.TextInputLayout>
+
+                    <com.google.android.material.button.MaterialButton
+                        android:id="@+id/btn_send"
+                        android:layout_width="120dp"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginTop="16dp"
+                        android:text="Send" />
+                </LinearLayout>
+            </com.google.android.material.card.MaterialCardView>
+        </LinearLayout>
+    </ScrollView>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 7 - 7
app/src/main/res/menu/bottom_nav_menu.xml

@@ -1,15 +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" />
+        android:id="@+id/nav_settings"
+        android:icon="@drawable/ic_settings"
+        android:title="@string/settings" />
+    <item
+        android:id="@+id/nav_utils"
+        android:icon="@drawable/ic_handyman"
+        android:title="@string/utils" />
     <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>

+ 11 - 10
app/src/main/res/navigation/home_nav.xml

@@ -3,13 +3,19 @@
     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">
+    app:startDestination="@+id/nav_settings">
 
     <fragment
-        android:id="@+id/nav_cellular"
-        android:name="com.example.modifier.fragments.CellularFragment"
-        android:label="@string/config"
-        tools:layout="@layout/fragment_cellular" />
+        android:id="@+id/nav_settings"
+        android:name="com.example.modifier.fragments.SettingsFragment"
+        android:label="@string/settings"
+        tools:layout="@layout/fragment_settings" />
+
+    <fragment
+        android:id="@+id/nav_utils"
+        android:name="com.example.modifier.fragments.UtilsFragment"
+        android:label="@string/utils"
+        tools:layout="@layout/fragment_utils" />
 
     <fragment
         android:id="@+id/nav_backup"
@@ -17,9 +23,4 @@
         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>

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

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