diff --git a/app/src/main/java/eu/faircode/email/DaoFolder.java b/app/src/main/java/eu/faircode/email/DaoFolder.java index a90c5b0c54..98e967ccd5 100644 --- a/app/src/main/java/eu/faircode/email/DaoFolder.java +++ b/app/src/main/java/eu/faircode/email/DaoFolder.java @@ -263,6 +263,13 @@ public interface DaoFolder { boolean synchronize, boolean poll, boolean download, int sync_days, int keep_days, boolean auto_delete); + @Query("UPDATE folder" + + " SET `sync_days` = :sync_days" + + ", `keep_days` = :keep_days" + + " WHERE account = :account" + + " AND type = '" + EntityFolder.USER + "'") + int setFolderProperties(long account, int sync_days, int keep_days); + @Query("UPDATE folder SET keywords = :keywords WHERE id = :id") int setFolderKeywords(long id, String keywords); diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index 0ebaba4ba0..70ccbd9d02 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -19,7 +19,9 @@ package eu.faircode.email; Copyright 2018-2019 by Marcel Bokhorst (M66B) */ +import android.app.Dialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; @@ -32,11 +34,15 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentTransaction; @@ -401,6 +407,8 @@ public class FragmentFolders extends FragmentBase { public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.menu_compact).setChecked(compact); menu.findItem(R.id.menu_show_hidden).setChecked(show_hidden); + menu.findItem(R.id.menu_apply_all).setVisible(account >= 0); + super.onPrepareOptionsMenu(menu); } @@ -413,6 +421,9 @@ public class FragmentFolders extends FragmentBase { case R.id.menu_show_hidden: onMenuShowHidden(); return true; + case R.id.menu_apply_all: + onMenuApplyToAll(); + return true; default: return super.onOptionsItemSelected(item); } @@ -434,6 +445,15 @@ public class FragmentFolders extends FragmentBase { adapter.setShowHidden(show_hidden); } + private void onMenuApplyToAll() { + Bundle args = new Bundle(); + args.putLong("account", account); + + FragmentDialogApply fragment = new FragmentDialogApply(); + fragment.setArguments(args); + fragment.show(getParentFragmentManager(), "folders:apply"); + } + @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -596,4 +616,62 @@ public class FragmentFolders extends FragmentBase { } }.execute(this, args, "folder:delete"); } + + public static class FragmentDialogApply extends FragmentDialogBase { + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_folder_all, null); + final EditText etSyncDays = view.findViewById(R.id.etSyncDays); + final EditText etKeepDays = view.findViewById(R.id.etKeepDays); + final CheckBox cbKeepAll = view.findViewById(R.id.cbKeepAll); + + cbKeepAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + etKeepDays.setEnabled(!isChecked); + } + }); + + return new AlertDialog.Builder(getContext()) + .setView(view) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle args = getArguments(); + args.putString("sync", etSyncDays.getText().toString()); + args.putString("keep", cbKeepAll.isChecked() + ? Integer.toString(Integer.MAX_VALUE) + : etKeepDays.getText().toString()); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) throws Throwable { + long account = args.getLong("account"); + String sync = args.getString("sync"); + String keep = args.getString("keep"); + + if (TextUtils.isEmpty(sync)) + sync = "7"; + if (TextUtils.isEmpty(keep)) + keep = "30"; + + DB db = DB.getInstance(context); + db.folder().setFolderProperties( + account, Integer.parseInt(sync), Integer.parseInt(keep)); + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentDialogApply.this, args, "folders:all"); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .create(); + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_folder_all.xml b/app/src/main/res/layout/dialog_folder_all.xml new file mode 100644 index 0000000000..d95e472134 --- /dev/null +++ b/app/src/main/res/layout/dialog_folder_all.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_folders.xml b/app/src/main/res/menu/menu_folders.xml index f18dbb817e..b95aa2aa10 100644 --- a/app/src/main/res/menu/menu_folders.xml +++ b/app/src/main/res/menu/menu_folders.xml @@ -20,4 +20,9 @@ android:checkable="true" android:title="@string/title_show_folders" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e583ffb34c..ed35e150d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -475,6 +475,7 @@ Folder name Display name Show hidden folders + Apply to all … Hide folder Show in unified inbox Show in navigation menu