xiongzhu 1 년 전
부모
커밋
7635fad6c7

+ 11 - 8
app/src/main/java/com/example/modifier/BackupAdapter.java

@@ -40,19 +40,18 @@ public class BackupAdapter extends RecyclerView.Adapter<BackupAdapter.BackupView
     @Override
     public BackupAdapter.BackupViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         ItemBackupBinding binding = ItemBackupBinding.inflate(LayoutInflater.from(context), parent, false);
-        return new BackupViewHolder(binding.getRoot());
+        return new BackupViewHolder(binding);
     }
 
     @SuppressLint("DefaultLocale")
     @Override
     public void onBindViewHolder(@NonNull BackupAdapter.BackupViewHolder holder, int position) {
-        ItemBackupBinding binding = ItemBackupBinding.bind(holder.itemView);
         Backup backup = backups.get(position);
-        binding.tvNumber.setText(backup.getConfig().getNumber());
-        binding.tvTime.setText(SimpleDateFormat.getDateTimeInstance().format(backup.getDate()));
-        binding.tvInfo.setText(String.format("MCC: %s, MNC: %s, Country: %s",
+        holder.binding.tvNumber.setText(backup.getConfig().getNumber());
+        holder.binding.tvTime.setText(SimpleDateFormat.getDateTimeInstance().format(backup.getDate()));
+        holder.binding.tvInfo.setText(String.format("MCC: %s, MNC: %s, Country: %s",
                 backup.getConfig().getMcc(), backup.getConfig().getMnc(), backup.getConfig().getCountry()));
-        binding.btnRestore.setOnClickListener(v -> {
+        holder.binding.btnRestore.setOnClickListener(v -> {
             if (onRestoreListener != null) {
                 onRestoreListener.onRestore(backup);
             }
@@ -65,8 +64,12 @@ public class BackupAdapter extends RecyclerView.Adapter<BackupAdapter.BackupView
     }
 
     public class BackupViewHolder extends RecyclerView.ViewHolder {
-        public BackupViewHolder(@NonNull ViewGroup parent) {
-            super(parent);
+
+        ItemBackupBinding binding;
+
+        public BackupViewHolder(@NonNull ItemBackupBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
         }
     }
 }

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

@@ -8,11 +8,13 @@ import android.os.Looper;
 import android.provider.Settings;
 import android.text.InputFilter;
 import android.util.Log;
+import android.view.MenuItem;
 import android.view.View;
 import android.widget.ArrayAdapter;
 import android.widget.Toast;
 
 import androidx.activity.EdgeToEdge;
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.graphics.Insets;
@@ -24,6 +26,7 @@ import androidx.navigation.fragment.NavHostFragment;
 import androidx.navigation.ui.NavigationUI;
 
 import com.example.modifier.databinding.ActivityMainBinding;
+import com.google.android.material.navigation.NavigationBarView;
 import com.google.gson.Gson;
 
 import org.apache.commons.io.FileUtils;

+ 40 - 6
app/src/main/java/com/example/modifier/fragments/BackupFragment.java

@@ -19,10 +19,13 @@ import com.example.modifier.Config;
 import com.example.modifier.R;
 import com.example.modifier.Utils;
 import com.example.modifier.databinding.FragmentBackupBinding;
+import com.google.gson.Gson;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 
 import java.io.File;
+import java.io.IOException;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Date;
@@ -41,6 +44,7 @@ public class BackupFragment extends Fragment {
 
     public BackupFragment() {
         // Required empty public constructor
+        Log.i("BackupFragment", "BackupFragment created");
     }
 
 
@@ -49,12 +53,6 @@ public class BackupFragment extends Fragment {
         super.onCreate(savedInstanceState);
         backups = new ArrayList<>();
         adapter = new BackupAdapter(getContext(), backups);
-
-        for (int i = 0; i < 10; i++) {
-            Backup backup = new Backup(new Config("123000", "310", "240", "", "", "", "us"), new Date(), "/");
-            backups.add(backup);
-        }
-        adapter.notifyDataSetChanged();
     }
 
     @Override
@@ -83,6 +81,8 @@ public class BackupFragment extends Fragment {
 
         binding.rvBackup.setLayoutManager(new LinearLayoutManager(getContext()));
         binding.rvBackup.setAdapter(adapter);
+        binding.refresh.setOnRefreshListener(this::loadBackups);
+        loadBackups();
 
         return binding.getRoot();
     }
@@ -107,4 +107,38 @@ public class BackupFragment extends Fragment {
             e.printStackTrace();
         }
     }
+
+    private void loadBackups() {
+        executor.submit(() -> {
+            File backupDir = ContextCompat.getExternalFilesDirs(getContext(), "backup")[0];
+            if (backupDir.exists()) {
+                List<Backup> list = new ArrayList<>();
+                for (File file : backupDir.listFiles()) {
+                    if (file.isDirectory()) {
+                        File configFile = new File(file, "config.json");
+                        if (!configFile.exists() || !configFile.isFile()) {
+                            continue;
+                        }
+                        File dataDir = new File(file, "data");
+                        if (!dataDir.exists() || !dataDir.isDirectory()) {
+                            continue;
+                        }
+                        try {
+                            Config config = new Gson().fromJson(FileUtils.readFileToString(configFile, "UTF-8"), Config.class);
+                            list.add(new Backup(config, new Date(file.lastModified()), file.getPath()));
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+                list.sort((o1, o2) -> o2.getDate().compareTo(o1.getDate()));
+                backups.clear();
+                backups.addAll(list);
+            }
+            handler.post(() -> {
+                adapter.notifyDataSetChanged();
+                binding.refresh.setRefreshing(false);
+            });
+        });
+    }
 }

+ 10 - 0
app/src/main/res/drawable/ic_delete.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="M280,840Q247,840 223.5,816.5Q200,793 200,760L200,240L160,240L160,160L360,160L360,120L600,120L600,160L800,160L800,240L760,240L760,760Q760,793 736.5,816.5Q713,840 680,840L280,840ZM680,240L280,240L280,760Q280,760 280,760Q280,760 280,760L680,760Q680,760 680,760Q680,760 680,760L680,240ZM360,680L440,680L440,320L360,320L360,680ZM520,680L600,680L600,320L520,320L520,680ZM280,240L280,240L280,760Q280,760 280,760Q280,760 280,760L280,760Q280,760 280,760Q280,760 280,760L280,240Z"/>
+</vector>

+ 4 - 3
app/src/main/res/layout/fragment_settings.xml

@@ -21,7 +21,8 @@
             <com.google.android.material.card.MaterialCardView
                 style="@style/Widget.Material3.CardView.Filled"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content">
+                android:layout_height="wrap_content"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -66,7 +67,8 @@
                 style="@style/Widget.Material3.CardView.Filled"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp">
+                android:layout_marginTop="16dp"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -106,7 +108,6 @@
                             android:layout_width="0dp"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="16dp"
-
                             android:layout_weight="1"
                             android:hint="MNC">
 

+ 7 - 4
app/src/main/res/layout/fragment_utils.xml

@@ -21,7 +21,8 @@
             <com.google.android.material.card.MaterialCardView
                 style="@style/Widget.Material3.CardView.Filled"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content">
+                android:layout_height="wrap_content"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -90,7 +91,8 @@
                 style="@style/Widget.Material3.CardView.Filled"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp">
+                android:layout_marginTop="16dp"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -135,7 +137,8 @@
                 style="@style/Widget.Material3.CardView.Filled"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp">
+                android:layout_marginTop="16dp"
+                app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -153,9 +156,9 @@
                         android:textStyle="bold" />
 
                     <com.google.android.material.button.MaterialButton
+                        android:id="@+id/btn_clear_conv"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:id="@+id/btn_clear_conv"
                         android:text="Clear Conversations" />
                 </LinearLayout>
             </com.google.android.material.card.MaterialCardView>

+ 46 - 24
app/src/main/res/layout/item_backup.xml

@@ -10,22 +10,46 @@
         android:layout_height="wrap_content"
         android:layout_marginLeft="16dp"
         android:layout_marginTop="16dp"
-        android:layout_marginRight="16dp">
+        android:layout_marginRight="16dp"
+        app:cardBackgroundColor="?attr/colorSurfaceContainer">
 
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:padding="16dp">
+            android:paddingStart="16dp"
+            android:paddingTop="8dp"
+            android:paddingEnd="16dp">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <com.google.android.material.textview.MaterialTextView
+                    android:id="@+id/tv_number"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="123456789"
+                    android:textColor="?attr/colorPrimary"
+                    android:textSize="16sp"
+                    android:textStyle="bold"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <com.google.android.material.textview.MaterialTextView
+                    android:id="@+id/tv_time"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="2024-05-13 18:00:00"
+                    android:textColor="?attr/colorOnSurfaceVariant"
+                    android:textSize="14sp"
+                    app:layout_constraintBaseline_toBaselineOf="@id/tv_number"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
-            <com.google.android.material.textview.MaterialTextView
-                android:id="@+id/tv_number"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="123456789"
-                android:textColor="?attr/colorPrimary"
-                android:textSize="16sp"
-                android:textStyle="bold" />
 
             <com.google.android.material.textview.MaterialTextView
                 android:id="@+id/tv_info"
@@ -42,16 +66,17 @@
                 android:layout_marginTop="8dp"
                 android:orientation="horizontal">
 
-                <com.google.android.material.textview.MaterialTextView
-                    android:id="@+id/tv_time"
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/btn_del"
+                    style="@style/Widget.Material3.Button.TextButton"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="2024-05-13 18:00:00"
-                    android:textColor="?attr/colorOnSurfaceVariant"
-                    android:textSize="14sp"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
+                    android:layout_gravity="center_vertical"
+                    android:layout_marginEnd="8dp"
+                    android:text="Delete"
+                    android:textColor="?attr/colorSecondary"
+                    app:layout_constraintBaseline_toBaselineOf="@id/btn_restore"
+                    app:layout_constraintEnd_toStartOf="@id/btn_restore" />
 
                 <com.google.android.material.button.MaterialButton
                     android:id="@+id/btn_restore"
@@ -59,13 +84,10 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="center_vertical"
-                    android:minHeight="0dp"
-                    android:padding="0dp"
                     android:text="Restore"
-                    app:icon="@drawable/ic_settings_backup_restore"
-                    app:iconPadding="0dp"
-                    app:layout_constraintBaseline_toBaselineOf="@id/tv_time"
-                    app:layout_constraintEnd_toEndOf="parent" />
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
             </androidx.constraintlayout.widget.ConstraintLayout>
 
         </LinearLayout>

+ 2 - 1
app/src/main/res/navigation/home_nav.xml

@@ -9,7 +9,8 @@
         android:id="@+id/nav_settings"
         android:name="com.example.modifier.fragments.SettingsFragment"
         android:label="@string/settings"
-        tools:layout="@layout/fragment_settings" />
+        tools:layout="@layout/fragment_settings" >
+    </fragment>
 
     <fragment
         android:id="@+id/nav_utils"