From 0bfc49c1e52993c1fd4b6b815e46a60c773b7401 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 18 Jan 2019 08:23:53 +0000 Subject: [PATCH] Rule refactoring --- .../java/eu/faircode/email/ActivityView.java | 22 +-- .../java/eu/faircode/email/AdapterFolder.java | 17 ++- .../java/eu/faircode/email/AdapterRule.java | 10 +- .../main/java/eu/faircode/email/DaoRule.java | 5 +- .../java/eu/faircode/email/EntityRule.java | 8 - .../java/eu/faircode/email/FragmentRule.java | 143 ++++-------------- .../java/eu/faircode/email/FragmentRules.java | 26 +++- .../eu/faircode/email/ServiceSynchronize.java | 45 +++--- .../eu/faircode/email/ViewModelBrowse.java | 6 +- app/src/main/res/layout/fragment_rule.xml | 74 +-------- app/src/main/res/layout/item_rule.xml | 18 +-- app/src/main/res/values/strings.xml | 7 +- 12 files changed, 136 insertions(+), 245 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index cb8bee2624..0a5b3269bc 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -130,6 +130,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB static final String ACTION_STORE_RAW = BuildConfig.APPLICATION_ID + ".STORE_RAW"; static final String ACTION_EDIT_FOLDER = BuildConfig.APPLICATION_ID + ".EDIT_FOLDER"; static final String ACTION_EDIT_ANSWER = BuildConfig.APPLICATION_ID + ".EDIT_ANSWER"; + static final String ACTION_EDIT_RULES = BuildConfig.APPLICATION_ID + ".EDIT_RULES"; static final String ACTION_EDIT_RULE = BuildConfig.APPLICATION_ID + ".EDIT_RULE"; static final String ACTION_STORE_ATTACHMENT = BuildConfig.APPLICATION_ID + ".STORE_ATTACHMENT"; static final String ACTION_STORE_ATTACHMENTS = BuildConfig.APPLICATION_ID + ".STORE_ATTACHMENTS"; @@ -184,9 +185,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB case R.string.menu_answers: onMenuAnswers(); break; - case R.string.menu_rules: - onMenuRules(); - break; case R.string.menu_operations: onMenuOperations(); break; @@ -304,7 +302,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB drawerArray.add(new DrawerItem(R.layout.item_drawer_separator)); drawerArray.add(new DrawerItem(ActivityView.this, R.layout.item_drawer, R.drawable.baseline_reply_24, R.string.menu_answers)); - drawerArray.add(new DrawerItem(ActivityView.this, R.layout.item_drawer, R.drawable.baseline_filter_list_24, R.string.menu_rules)); drawerArray.add(new DrawerItem(ActivityView.this, R.layout.item_drawer, R.drawable.baseline_list_24, R.string.menu_operations)); drawerArray.add(new DrawerItem(ActivityView.this, R.layout.item_drawer, R.drawable.baseline_settings_applications_24, R.string.menu_setup)); @@ -479,6 +476,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB iff.addAction(ACTION_STORE_RAW); iff.addAction(ACTION_EDIT_FOLDER); iff.addAction(ACTION_EDIT_ANSWER); + iff.addAction(ACTION_EDIT_RULES); iff.addAction(ACTION_EDIT_RULE); iff.addAction(ACTION_STORE_ATTACHMENT); iff.addAction(ACTION_STORE_ATTACHMENTS); @@ -877,12 +875,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB fragmentTransaction.commit(); } - private void onMenuRules() { - FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); - fragmentTransaction.replace(R.id.content_frame, new FragmentRules()).addToBackStack("rules"); - fragmentTransaction.commit(); - } - private void onMenuOperations() { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.content_frame, new FragmentOperations()).addToBackStack("operations"); @@ -1021,6 +1013,8 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB onEditFolder(intent); else if (ACTION_EDIT_ANSWER.equals(action)) onEditAnswer(intent); + else if (ACTION_EDIT_RULES.equals(action)) + onEditRules(intent); else if (ACTION_EDIT_RULE.equals(action)) onEditRule(intent); else if (ACTION_STORE_ATTACHMENT.equals(action)) @@ -1115,6 +1109,14 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB fragmentTransaction.commit(); } + private void onEditRules(Intent intent) { + FragmentRules fragment = new FragmentRules(); + fragment.setArguments(intent.getExtras()); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("rules"); + fragmentTransaction.commit(); + } + private void onEditRule(Intent intent) { FragmentRule fragment = new FragmentRule(); fragment.setArguments(intent.getExtras()); diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 00df71e3a5..0594f64177 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -84,6 +84,7 @@ public class AdapterFolder extends RecyclerView.Adapter { public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private View itemView; private TextView tvName; - private TextView tvFolder; + private TextView tvOrder; ViewHolder(View itemView) { super(itemView); this.itemView = itemView.findViewById(R.id.clItem); tvName = itemView.findViewById(R.id.tvName); - tvFolder = itemView.findViewById(R.id.tvFolder); + tvOrder = itemView.findViewById(R.id.tvOrder); } private void wire() { @@ -72,7 +72,7 @@ public class AdapterRule extends RecyclerView.Adapter { private void bindTo(TupleRuleEx rule) { itemView.setActivated(!rule.enabled); tvName.setText(rule.name); - tvFolder.setText(rule.folderName + "/" + rule.accountName); + tvOrder.setText(Integer.toString(rule.order)); } @Override @@ -86,7 +86,9 @@ public class AdapterRule extends RecyclerView.Adapter { LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); lbm.sendBroadcast( new Intent(ActivityView.ACTION_EDIT_RULE) - .putExtra("id", rule.id)); + .putExtra("id", rule.id) + .putExtra("account", rule.account) + .putExtra("folder", rule.folder)); } } diff --git a/app/src/main/java/eu/faircode/email/DaoRule.java b/app/src/main/java/eu/faircode/email/DaoRule.java index 98ddad1067..3e794fa2d0 100644 --- a/app/src/main/java/eu/faircode/email/DaoRule.java +++ b/app/src/main/java/eu/faircode/email/DaoRule.java @@ -43,8 +43,9 @@ public interface DaoRule { @Query("SELECT rule.*, folder.account, folder.name AS folderName, account.name AS accountName FROM rule" + " JOIN folder ON folder.id = rule.folder" + - " JOIN account ON account.id = folder.account") - LiveData> liveRules(); + " JOIN account ON account.id = folder.account" + + " WHERE rule.folder = :folder") + LiveData> liveRules(long folder); @Insert long insertRule(EntityRule rule); diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index d6e4155d3c..7fa5024eb7 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -72,7 +72,6 @@ public class EntityRule { JSONObject jcondition = new JSONObject(condition); String sender = jcondition.optString("sender", null); String subject = jcondition.optString("subject", null); - String text = jcondition.optString("text", null); boolean regex = jcondition.optBoolean("regex", false); if (sender != null && message.from != null) { @@ -84,13 +83,6 @@ public class EntityRule { if (matches(subject, message.subject, regex)) return true; } - - if (text != null && message.content) { - String body = message.read(context); - String santized = HtmlHelper.sanitize(body, true); - if (matches(text, santized, regex)) - return true; - } } catch (JSONException ex) { Log.e(ex); } diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 519412cf7c..471b77beff 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -52,11 +52,8 @@ public class FragmentRule extends FragmentBase { private EditText etName; private EditText etOrder; private CheckBox cbEnabled; - private Spinner spAccount; - private Spinner spFolder; private EditText etSender; private EditText etSubject; - private EditText etText; private Spinner spAction; private Spinner spTarget; private BottomNavigationView bottom_navigation; @@ -64,12 +61,12 @@ public class FragmentRule extends FragmentBase { private Group grpReady; private Group grpMove; - private ArrayAdapter adapterAccount; - private ArrayAdapter adapterFolder; private ArrayAdapter adapterAction; private ArrayAdapter adapterTarget; private long id = -1; + private long account = -1; + private long folder = -1; @Override public void onCreate(Bundle savedInstanceState) { @@ -77,7 +74,9 @@ public class FragmentRule extends FragmentBase { // Get arguments Bundle args = getArguments(); - id = (args == null ? -1 : args.getLong("id", -1)); + id = args.getLong("id", -1); + account = args.getLong("account", -1); + folder = args.getLong("folder", -1); } @Override @@ -89,11 +88,8 @@ public class FragmentRule extends FragmentBase { etName = view.findViewById(R.id.etName); etOrder = view.findViewById(R.id.etOrder); cbEnabled = view.findViewById(R.id.cbEnabled); - spAccount = view.findViewById(R.id.spAccount); - spFolder = view.findViewById(R.id.spFolder); etSender = view.findViewById(R.id.etSender); etSubject = view.findViewById(R.id.etSubject); - etText = view.findViewById(R.id.etText); spAction = view.findViewById(R.id.spAction); spTarget = view.findViewById(R.id.spTarget); bottom_navigation = view.findViewById(R.id.bottom_navigation); @@ -101,14 +97,6 @@ public class FragmentRule extends FragmentBase { grpReady = view.findViewById(R.id.grpReady); grpMove = view.findViewById(R.id.grpMove); - adapterAccount = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList()); - adapterAccount.setDropDownViewResource(R.layout.spinner_item1_dropdown); - spAccount.setAdapter(adapterAccount); - - adapterFolder = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList()); - adapterFolder.setDropDownViewResource(R.layout.spinner_item1_dropdown); - spFolder.setAdapter(adapterFolder); - adapterAction = new ArrayAdapter<>(getContext(), R.layout.spinner_item1, android.R.id.text1, new ArrayList()); adapterAction.setDropDownViewResource(R.layout.spinner_item1_dropdown); spAction.setAdapter(adapterAction); @@ -123,19 +111,6 @@ public class FragmentRule extends FragmentBase { actions.add(new Action(EntityRule.TYPE_MOVE, getString(R.string.title_move))); adapterAction.addAll(actions); - spAccount.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView adapterView, View view, int position, long id) { - EntityAccount account = (EntityAccount) adapterView.getAdapter().getItem(position); - onAccountSelected(account.id); - } - - @Override - public void onNothingSelected(AdapterView parent) { - onAccountSelected(-1); - } - }); - spAction.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int position, long id) { @@ -190,18 +165,23 @@ public class FragmentRule extends FragmentBase { public void onActivityCreated(@Nullable final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - new SimpleTask>() { + Bundle args = new Bundle(); + args.putLong("account", account); + + new SimpleTask>() { @Override - protected List onExecute(Context context, Bundle args) { - return DB.getInstance(context).account().getAccounts(true); + protected List onExecute(Context context, Bundle args) { + long account = args.getLong("account"); + return DB.getInstance(context).folder().getFolders(account); } @Override - protected void onExecuted(Bundle args, List accounts) { - if (accounts == null) - accounts = new ArrayList<>(); + protected void onExecuted(Bundle args, List folders) { + if (folders == null) + folders = new ArrayList<>(); - adapterAccount.addAll(accounts); + adapterTarget.clear(); + adapterTarget.addAll(folders); Bundle rargs = new Bundle(); rargs.putLong("id", id); @@ -224,7 +204,6 @@ public class FragmentRule extends FragmentBase { cbEnabled.setChecked(rule == null ? true : rule.enabled); etSender.setText(jcondition.optString("sender")); etSubject.setText(jcondition.optString("subject")); - etText.setText(jcondition.optString("text")); int type = jaction.optInt("type", -1); for (int pos = 0; pos < adapterAction.getCount(); pos++) @@ -233,26 +212,26 @@ public class FragmentRule extends FragmentBase { break; } - bottom_navigation.findViewById(R.id.action_delete).setVisibility(rule == null ? View.GONE : View.VISIBLE); - if (rule == null) { grpReady.setVisibility(View.VISIBLE); bottom_navigation.setVisibility(View.VISIBLE); pbWait.setVisibility(View.GONE); } else { - spAccount.setTag(rule.account); - spFolder.setTag(rule.folder); - - if (type == EntityRule.TYPE_MOVE) - spTarget.setTag(jaction.getLong("target")); - - for (int pos = 0; pos < adapterAccount.getCount(); pos++) - if (adapterAccount.getItem(pos).id.equals(rule.account)) { - spAccount.setSelection(pos); - onAccountSelected(rule.account); - break; - } + if (type == EntityRule.TYPE_MOVE) { + long target = jaction.optLong("target", -1); + for (int pos = 0; pos < adapterTarget.getCount(); pos++) + if (adapterTarget.getItem(pos).id.equals(target)) { + spTarget.setSelection(pos); + break; + } + grpMove.setVisibility(View.VISIBLE); + } } + + grpReady.setVisibility(View.VISIBLE); + bottom_navigation.findViewById(R.id.action_delete).setVisibility(rule == null ? View.GONE : View.VISIBLE); + bottom_navigation.setVisibility(View.VISIBLE); + pbWait.setVisibility(View.GONE); } catch (JSONException ex) { Log.e(ex); } @@ -269,58 +248,7 @@ public class FragmentRule extends FragmentBase { protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(this, null, "rule:accounts"); - } - - private void onAccountSelected(long account) { - Bundle args = new Bundle(); - args.putLong("account", account); - - new SimpleTask>() { - @Override - protected List onExecute(Context context, Bundle args) { - long account = args.getLong("account"); - return DB.getInstance(context).folder().getFolders(account); - } - - @Override - protected void onExecuted(Bundle args, List folders) { - adapterFolder.clear(); - adapterFolder.addAll(folders); - - adapterTarget.clear(); - adapterTarget.addAll(folders); - - long account = args.getLong("account"); - if (account == (Long) spAccount.getTag()) { - Long folder = (Long) spFolder.getTag(); - for (int pos = 0; pos < folders.size(); pos++) - if (folders.get(pos).id.equals(folder)) { - spFolder.setSelection(pos); - break; - } - - Long target = (Long) spTarget.getTag(); - for (int pos = 0; pos < folders.size(); pos++) - if (folders.get(pos).id.equals(target)) { - spTarget.setSelection(pos); - break; - } - } else { - spFolder.setSelection(0); - spTarget.setSelection(0); - } - - grpReady.setVisibility(View.VISIBLE); - bottom_navigation.setVisibility(View.VISIBLE); - pbWait.setVisibility(View.GONE); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); - } - }.execute(FragmentRule.this, args, "rule:folders"); + }.execute(this, args, "rule:accounts"); } private void onActionTrash() { @@ -370,19 +298,14 @@ public class FragmentRule extends FragmentBase { try { Helper.setViewsEnabled(view, false); - EntityFolder folder = (EntityFolder) spFolder.getSelectedItem(); - String sender = etSender.getText().toString(); String subject = etSubject.getText().toString(); - String text = etText.getText().toString(); JSONObject jcondition = new JSONObject(); if (!TextUtils.isEmpty(sender)) jcondition.put("sender", sender); if (!TextUtils.isEmpty(subject)) jcondition.put("subject", subject); - if (!TextUtils.isEmpty(text)) - jcondition.put("text", text); Action action = (Action) spAction.getSelectedItem(); @@ -397,7 +320,7 @@ public class FragmentRule extends FragmentBase { Bundle args = new Bundle(); args.putLong("id", id); - args.putLong("folder", folder == null ? -1 : folder.id); + args.putLong("folder", folder); args.putString("name", etName.getText().toString()); args.putString("order", etOrder.getText().toString()); args.putBoolean("enabled", cbEnabled.isChecked()); diff --git a/app/src/main/java/eu/faircode/email/FragmentRules.java b/app/src/main/java/eu/faircode/email/FragmentRules.java index b39a68762f..0c807b8c16 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRules.java +++ b/app/src/main/java/eu/faircode/email/FragmentRules.java @@ -45,10 +45,23 @@ public class FragmentRules extends FragmentBase { private AdapterRule adapter; + private long account; + private long folder; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Get arguments + Bundle args = getArguments(); + account = args.getLong("account", -1); + folder = args.getLong("folder", -1); + } + @Override @Nullable public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - setSubtitle(R.string.menu_rules); + setSubtitle(R.string.title_edit_rules); View view = inflater.inflate(R.layout.fragment_rules, container, false); @@ -70,8 +83,15 @@ public class FragmentRules extends FragmentBase { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + Bundle args = new Bundle(); + args.putLong("account", account); + args.putLong("folder", folder); + + FragmentRule fragment = new FragmentRule(); + fragment.setArguments(args); + FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); - fragmentTransaction.replace(R.id.content_frame, new FragmentRule()).addToBackStack("rule"); + fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("rule"); fragmentTransaction.commit(); } }); @@ -88,7 +108,7 @@ public class FragmentRules extends FragmentBase { super.onActivityCreated(savedInstanceState); DB db = DB.getInstance(getContext()); - db.rule().liveRules().observe(getViewLifecycleOwner(), new Observer>() { + db.rule().liveRules(folder).observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(List rules) { if (rules == null) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index e4186c9ca8..3187dc971a 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1027,7 +1027,9 @@ public class ServiceSynchronize extends LifecycleService { db.beginTransaction(); message = synchronizeMessage( ServiceSynchronize.this, - folder, ifolder, (IMAPMessage) imessage, false); + folder, ifolder, (IMAPMessage) imessage, + false, + db.rule().getEnabledRules(folder.id)); db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -1038,8 +1040,7 @@ public class ServiceSynchronize extends LifecycleService { downloadMessage(ServiceSynchronize.this, folder, ifolder, (IMAPMessage) imessage, message.id, - db.folder().getFolderDownload(folder.id), - db.rule().getEnabledRules(folder.id)); + db.folder().getFolderDownload(folder.id)); db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -1116,7 +1117,9 @@ public class ServiceSynchronize extends LifecycleService { db.beginTransaction(); message = synchronizeMessage( ServiceSynchronize.this, - folder, ifolder, (IMAPMessage) e.getMessage(), false); + folder, ifolder, (IMAPMessage) e.getMessage(), + false, + db.rule().getEnabledRules(folder.id)); db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -1127,8 +1130,7 @@ public class ServiceSynchronize extends LifecycleService { downloadMessage(ServiceSynchronize.this, folder, ifolder, (IMAPMessage) e.getMessage(), message.id, - db.folder().getFolderDownload(folder.id), - db.rule().getEnabledRules(folder.id)); + db.folder().getFolderDownload(folder.id)); db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -2232,6 +2234,8 @@ public class ServiceSynchronize extends LifecycleService { Log.i(folder.name + " delete local uid=" + uid + " count=" + count); } + List rules = db.rule().getEnabledRules(folder.id); + fp.add(FetchProfile.Item.ENVELOPE); // fp.add(FetchProfile.Item.FLAGS); fp.add(FetchProfile.Item.CONTENT_INFO); // body structure @@ -2269,7 +2273,8 @@ public class ServiceSynchronize extends LifecycleService { EntityMessage message = synchronizeMessage( this, folder, ifolder, (IMAPMessage) isub[j], - false); + false, + rules); ids[from + j] = message.id; db.setTransactionSuccessful(); } catch (MessageRemovedException ex) { @@ -2304,8 +2309,6 @@ public class ServiceSynchronize extends LifecycleService { db.folder().setFolderSyncState(folder.id, "downloading"); - List rules = db.rule().getEnabledRules(folder.id); - //fp.add(IMAPFolder.FetchProfileItem.MESSAGE); // Download messages/attachments @@ -2323,7 +2326,8 @@ public class ServiceSynchronize extends LifecycleService { downloadMessage( this, folder, ifolder, (IMAPMessage) isub[j], - ids[from + j], download, rules); + ids[from + j], + download); db.setTransactionSuccessful(); } catch (FolderClosedException ex) { throw ex; @@ -2358,7 +2362,8 @@ public class ServiceSynchronize extends LifecycleService { static EntityMessage synchronizeMessage( Context context, EntityFolder folder, IMAPFolder ifolder, IMAPMessage imessage, - boolean browsed) throws MessagingException, IOException { + boolean browsed, + List rules) throws MessagingException, IOException { long uid = ifolder.getUID(imessage); if (imessage.isExpunged()) { @@ -2375,6 +2380,7 @@ public class ServiceSynchronize extends LifecycleService { boolean answered = helper.getAnsered(); boolean flagged = helper.getFlagged(); String[] keywords = helper.getKeywords(); + boolean filter = false; DB db = DB.getInstance(context); @@ -2405,6 +2411,7 @@ public class ServiceSynchronize extends LifecycleService { if (dup.uid == null) { Log.i(folder.name + " set uid=" + uid); dup.uid = uid; + filter = true; } else if (dup.uid != uid) { if (EntityFolder.DRAFTS.equals(folder.type)) { Log.i(folder.name + " deleting previous uid=" + dup.uid); @@ -2429,6 +2436,9 @@ public class ServiceSynchronize extends LifecycleService { message = dup; } } + + if (message == null) + filter = true; } if (message == null) { @@ -2575,13 +2585,18 @@ public class ServiceSynchronize extends LifecycleService { db.folder().setFolderKeywords(folder.id, DB.Converters.fromStringArray(fkeywords.toArray(new String[0]))); } + if (filter) + for (EntityRule rule : rules) + if (rule.matches(context, message)) + rule.execute(context, db, message); + return message; } static void downloadMessage( Context context, EntityFolder folder, IMAPFolder ifolder, IMAPMessage imessage, - long id, boolean download, List rules) throws MessagingException, IOException { + long id, boolean download) throws MessagingException, IOException { DB db = DB.getInstance(context); EntityMessage message = db.message().getMessage(id); if (message == null) @@ -2590,7 +2605,7 @@ public class ServiceSynchronize extends LifecycleService { if (message.setContactInfo(context)) db.message().updateMessage(message); - if (download || rules.size() > 0) { + if (download) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); long maxSize = prefs.getInt("download", 32768); if (maxSize == 0) @@ -2638,10 +2653,6 @@ public class ServiceSynchronize extends LifecycleService { db.message().setMessageWarning(message.id, parts.getWarnings()); Log.i(folder.name + " downloaded message id=" + message.id + " size=" + message.size); } - - for (EntityRule rule : rules) - if (rule.matches(context, message)) - rule.execute(context, db, message); } for (int i = 0; i < attachments.size(); i++) { diff --git a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java index d103c5cdd7..18314ac33b 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java +++ b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java @@ -229,10 +229,12 @@ public class ViewModelBrowse extends ViewModel { EntityMessage message = db.message().getMessageByUid(state.fid, uid); if (message == null) { message = ServiceSynchronize.synchronizeMessage(state.context, - folder, state.ifolder, (IMAPMessage) isub[j], true); + folder, state.ifolder, (IMAPMessage) isub[j], + true, + new ArrayList()); ServiceSynchronize.downloadMessage(state.context, folder, state.ifolder, (IMAPMessage) isub[j], message.id, - false, new ArrayList()); + false); count++; } db.message().setMessageFound(message.account, message.thread); diff --git a/app/src/main/res/layout/fragment_rule.xml b/app/src/main/res/layout/fragment_rule.xml index f9485acf8b..0e6d36c735 100644 --- a/app/src/main/res/layout/fragment_rule.xml +++ b/app/src/main/res/layout/fragment_rule.xml @@ -67,56 +67,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/etOrder" /> - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/cbEnabled" /> - - - - + app:layout_constraintTop_toBottomOf="@id/etSubject" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/tvName" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 87111f3415..5a95c860cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,6 @@ Setup Templates - Rules Operations Legend Support @@ -224,6 +223,7 @@ Delete local messages Empty trash Edit properties + Edit rules Delete all trashed messages permanently? Delete operations with an error message? @@ -382,17 +382,14 @@ $email$ will be replaced by the sender email address Name - Account - Folder - The texts of messages in the selected folder will always be downloaded Order Enabled Sender Subject - Text Action Target Mark as read + Folder Rule name missing Mark read