BackupAdapter.kt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.example.modifier.adapter;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.content.pm.PackageManager;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.ViewGroup;
  8. import android.widget.Toast;
  9. import androidx.annotation.NonNull;
  10. import androidx.recyclerview.widget.RecyclerView;
  11. import com.example.modifier.model.Backup;
  12. import com.example.modifier.Global;
  13. import com.example.modifier.Utils;
  14. import com.example.modifier.databinding.ItemBackupBinding;
  15. import com.google.android.material.dialog.MaterialAlertDialogBuilder;
  16. import java.io.File;
  17. import java.text.SimpleDateFormat;
  18. import java.util.List;
  19. public class BackupAdapter extends RecyclerView.Adapter<BackupAdapter.BackupViewHolder> {
  20. private Context context;
  21. private List<Backup> backups;
  22. public BackupAdapter(Context context, List<Backup> backups) {
  23. this.context = context;
  24. this.backups = backups;
  25. }
  26. @NonNull
  27. @Override
  28. public BackupAdapter.BackupViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  29. ItemBackupBinding binding = ItemBackupBinding.inflate(LayoutInflater.from(context), parent, false);
  30. return new BackupViewHolder(binding);
  31. }
  32. @SuppressLint("DefaultLocale")
  33. @Override
  34. public void onBindViewHolder(@NonNull BackupAdapter.BackupViewHolder holder, int position) {
  35. Backup backup = backups.get(position);
  36. holder.binding.tvNumber.setText(backup.getConfig().getNumber());
  37. holder.binding.tvTime.setText(SimpleDateFormat.getDateTimeInstance().format(backup.getDate()));
  38. holder.binding.tvInfo.setText(String.format("MCC: %s, MNC: %s, Country: %s",
  39. backup.getConfig().getMcc(), backup.getConfig().getMcc(), backup.getConfig().getMcc()));
  40. holder.binding.btnRestore.setOnClickListener(v -> {
  41. new MaterialAlertDialogBuilder(context)
  42. .setTitle("Restore backup")
  43. .setMessage("Are you sure you want to restore this backup?")
  44. .setPositiveButton("Yes", (dialog, which) -> {
  45. new Thread(() -> {
  46. try {
  47. PackageManager packageManager = context.getPackageManager();
  48. int uid = packageManager.getApplicationInfo("com.google.android.apps.messaging", 0).uid;
  49. int gmsUid = packageManager.getApplicationInfo("com.google.android.gms", 0).uid;
  50. Global.suspend(false, true, true);
  51. Global.save(backup.getConfig(), false);
  52. Utils.runAsRoot("pm clear com.google.android.apps.messaging",
  53. "cp -rf " + backup.getPath() + "/data/* /data/data/com.google.android.apps.messaging/",
  54. "chown -R " + uid + ":" + uid + " /data/data/com.google.android.apps.messaging/*",
  55. "cp -rf " + backup.getPath() + "/gmsData/* /data/data/com.google.android.gms/",
  56. "chown -R " + gmsUid + ":" + gmsUid + " /data/data/com.google.android.gms/*");
  57. Global.unsuspend(false, true, true);
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. }).start();
  62. })
  63. .setNegativeButton("No", null)
  64. .show();
  65. });
  66. holder.binding.btnDel.setOnClickListener(v -> {
  67. new MaterialAlertDialogBuilder(context)
  68. .setTitle("Delete backup")
  69. .setMessage("Are you sure you want to delete this backup?")
  70. .setPositiveButton("Yes", (dialog, which) -> {
  71. File file = new File(backup.getPath());
  72. if (file.exists()) {
  73. try {
  74. Utils.runAsRoot("rm -rf " + backup.getPath());
  75. backups.remove(backup);
  76. notifyItemRemoved(position);
  77. } catch (Exception e) {
  78. e.printStackTrace();
  79. Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
  80. }
  81. } else {
  82. Log.e("BackupAdapter", "File not found");
  83. }
  84. })
  85. .setNegativeButton("No", null)
  86. .show();
  87. });
  88. }
  89. @Override
  90. public int getItemCount() {
  91. return backups.size();
  92. }
  93. public class BackupViewHolder extends RecyclerView.ViewHolder {
  94. ItemBackupBinding binding;
  95. public BackupViewHolder(@NonNull ItemBackupBinding binding) {
  96. super(binding.getRoot());
  97. this.binding = binding;
  98. }
  99. }
  100. }