diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogSync.java b/app/src/main/java/eu/faircode/email/FragmentDialogSync.java index 971764f1df..10e1a13f2d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogSync.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogSync.java @@ -33,17 +33,30 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import java.util.Arrays; +import java.util.List; + public class FragmentDialogSync extends FragmentDialogBase { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - String name = getArguments().getString("name"); + Bundle args = getArguments(); + long fid = args.getLong("folder"); + String name = args.getString("name"); + String type = args.getString("type"); View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_sync, null); final TextView tvFolder = view.findViewById(R.id.tvFolder); final EditText etMonths = view.findViewById(R.id.etMonths); - tvFolder.setText(name); + if (fid < 0) { + if (TextUtils.isEmpty(type)) + tvFolder.setText(R.string.title_folder_unified); + else + tvFolder.setText(EntityFolder.localizeType(getContext(), type)); + } else + tvFolder.setText(name); + etMonths.setText(null); return new AlertDialog.Builder(getContext()) @@ -67,26 +80,35 @@ public class FragmentDialogSync extends FragmentDialogBase { new SimpleTask() { @Override protected Void onExecute(Context context, Bundle args) { - int months = args.getInt("months", -1); long fid = args.getLong("folder"); + String type = args.getString("type"); + int months = args.getInt("months", -1); DB db = DB.getInstance(context); try { db.beginTransaction(); - EntityFolder folder = db.folder().getFolder(fid); - if (folder == null || !folder.selectable) - return null; - - if (months == 0) { - db.folder().setFolderInitialize(folder.id, Integer.MAX_VALUE); - db.folder().setFolderKeep(folder.id, Integer.MAX_VALUE); - } else if (months > 0) { - db.folder().setFolderInitialize(folder.id, months * 30); - db.folder().setFolderKeep(folder.id, Math.max(folder.keep_days, months * 30)); + List folders; + if (fid < 0) + folders = db.folder().getFoldersUnified(type, false); + else { + EntityFolder folder = db.folder().getFolder(fid); + if (folder == null || !folder.selectable) + return null; + folders = Arrays.asList(folder); } - EntityOperation.sync(context, folder.id, true); + for (EntityFolder folder : folders) { + if (months == 0) { + db.folder().setFolderInitialize(folder.id, Integer.MAX_VALUE); + db.folder().setFolderKeep(folder.id, Integer.MAX_VALUE); + } else if (months > 0) { + db.folder().setFolderInitialize(folder.id, months * 30); + db.folder().setFolderKeep(folder.id, Math.max(folder.keep_days, months * 30)); + } + + EntityOperation.sync(context, folder.id, true); + } db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index a80dc97d47..79cb80bb81 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -4149,6 +4149,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. menu.findItem(R.id.menu_select_found).setVisible(viewType == AdapterMessage.ViewType.SEARCH); menu.findItem(R.id.menu_mark_all_read).setVisible(folder); + menu.findItem(R.id.menu_sync_more).setVisible(folder); menu.findItem(R.id.menu_force_sync).setVisible(viewType == AdapterMessage.ViewType.UNIFIED); menu.findItem(R.id.menu_force_send).setVisible(outbox); @@ -4250,6 +4251,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. } else if (itemId == R.id.menu_mark_all_read) { onMenuMarkAllRead(); return true; + } else if (itemId == R.id.menu_sync_more) { + onMenuSyncMore(); + return true; } else if (itemId == R.id.menu_force_sync) { onMenuForceSync(); return true; @@ -4512,6 +4516,40 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. }.execute(FragmentMessages.this, args, "message:read"); } + private void onMenuSyncMore() { + Bundle args = new Bundle(); + args.putLong("folder", folder); + args.putString("type", type); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + long fid = args.getLong("folder"); + if (fid < 0) + return null; + + DB db = DB.getInstance(context); + EntityFolder folder = db.folder().getFolder(fid); + if (folder != null) + args.putString("name", folder.getDisplayName(context)); + + return null; + } + + @Override + protected void onExecuted(Bundle args, Void data) { + FragmentDialogSync sync = new FragmentDialogSync(); + sync.setArguments(args); + sync.show(getParentFragmentManager(), "folder:months"); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(this, args, "folder:months"); + } + private void onMenuForceSync() { ServiceSynchronize.reload(getContext(), null, true, "force sync"); ToastEx.makeText(getContext(), R.string.title_executing, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/res/menu/menu_messages.xml b/app/src/main/res/menu/menu_messages.xml index 3035e00519..c1835ef6f6 100644 --- a/app/src/main/res/menu/menu_messages.xml +++ b/app/src/main/res/menu/menu_messages.xml @@ -138,6 +138,11 @@ android:title="@string/title_mark_all_read" app:showAsAction="never" /> + +