Automatic classification is a pro feature

This commit is contained in:
M66B 2021-01-04 11:30:08 +01:00
parent 42598dd43e
commit d83a4d7d7c
7 changed files with 36 additions and 10 deletions

11
FAQ.md
View File

@ -3415,22 +3415,25 @@ Message classification will attempt to automatically group emails into classes,
using [Bayesian statistics](https://en.wikipedia.org/wiki/Bayesian_statistics). using [Bayesian statistics](https://en.wikipedia.org/wiki/Bayesian_statistics).
In the context of FairEmail, a folder is a class. In the context of FairEmail, a folder is a class.
You can enable 'learning' mode in the miscellaneous settings. You can enable message classification in the miscellaneous settings.
This will enable learning mode only.
Each folder has an option to enable auto classification. Each folder has an option to enable automatic message classification.
When this is turned on, new messages in other folders which the classifier thinks belong to that folder will be automatically moved. When this is turned on, new messages in other folders which the classifier thinks belong to that folder will be automatically moved.
Classification should be considered as a best guess - it might be a wrong guess, or the classifier might not be confident enough to make any guess. Classification should be considered as a best guess - it might be a wrong guess, or the classifier might not be confident enough to make any guess.
If the classifier is unsure, it will simply leave an email where it is. If the classifier is unsure, it will simply leave an email where it is.
Classification will be done for new messages in the inbox, spam folder and user folders only. Classification will be done for new messages in the inbox, spam folder and user folders only.
You can clear local messages (long press a folder in the folder list) and synchronize the messages again to classify existing messages. You can clear local messages (long press a folder in the folder list of an account) and synchronize the messages again to classify existing messages.
Moving a message on the device will reclassify the message. Moving a message on the device will reclassify the message.
Moving a message from another email client will not result in reclassification because IMAP does not support MOVED notifications. Moving a message from another email client will not result in reclassification because IMAP does not support 'moved' notifications.
Classification is optimized to use as little resources as possible, but will inevitably use some extra battery power. Classification is optimized to use as little resources as possible, but will inevitably use some extra battery power.
Automatic message classification is a pro feature, except for the spam folder.
<br /> <br />
## Get support ## Get support

View File

@ -79,6 +79,7 @@ All pro features are convenience or advanced features.
* Accept/decline calendar invitations * Accept/decline calendar invitations
* Add message to calendar * Add message to calendar
* Filter rules * Filter rules
* Automatic message classification
* Search indexing, search on server * Search indexing, search on server
* Keyword management * Keyword management
* S/MIME sign/encrypt * S/MIME sign/encrypt

View File

@ -96,6 +96,7 @@ All pro features are convenience or advanced features.
* Accept/decline calendar invitations * Accept/decline calendar invitations
* Add message to calendar * Add message to calendar
* Filter rules ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq71)) * Filter rules ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq71))
* Automatic message classification ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq163))
* Search indexing, search on server ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq13)) * Search indexing, search on server ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq13))
* Keyword management * Keyword management
* S/MIME sign/encrypt ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq12)) * S/MIME sign/encrypt ([instructions](https://github.com/M66B/FairEmail/blob/master/FAQ.md#user-content-faq12))

View File

@ -70,6 +70,7 @@ public class FragmentFolder extends FragmentBase {
private TextView tvPoll; private TextView tvPoll;
private CheckBox cbDownload; private CheckBox cbDownload;
private CheckBox cbAutoClassify; private CheckBox cbAutoClassify;
private TextView tvAutoClassifyPro;
private Button btnInfo; private Button btnInfo;
private EditText etSyncDays; private EditText etSyncDays;
private EditText etKeepDays; private EditText etKeepDays;
@ -131,6 +132,7 @@ public class FragmentFolder extends FragmentBase {
tvPoll = view.findViewById(R.id.tvPoll); tvPoll = view.findViewById(R.id.tvPoll);
cbDownload = view.findViewById(R.id.cbDownload); cbDownload = view.findViewById(R.id.cbDownload);
cbAutoClassify = view.findViewById(R.id.cbAutoClassify); cbAutoClassify = view.findViewById(R.id.cbAutoClassify);
tvAutoClassifyPro = view.findViewById(R.id.tvAutoClassifyPro);
btnInfo = view.findViewById(R.id.btnInfo); btnInfo = view.findViewById(R.id.btnInfo);
etSyncDays = view.findViewById(R.id.etSyncDays); etSyncDays = view.findViewById(R.id.etSyncDays);
etKeepDays = view.findViewById(R.id.etKeepDays); etKeepDays = view.findViewById(R.id.etKeepDays);
@ -177,6 +179,8 @@ public class FragmentFolder extends FragmentBase {
} }
}); });
Helper.linkPro(tvAutoClassifyPro);
btnInfo.setOnClickListener(new View.OnClickListener() { btnInfo.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -218,6 +222,7 @@ public class FragmentFolder extends FragmentBase {
tvParent.setText(parent); tvParent.setText(parent);
grpParent.setVisibility(parent == null ? View.GONE : View.VISIBLE); grpParent.setVisibility(parent == null ? View.GONE : View.VISIBLE);
cbAutoClassify.setVisibility(View.GONE); cbAutoClassify.setVisibility(View.GONE);
tvAutoClassifyPro.setVisibility(View.GONE);
grpAutoDelete.setVisibility(View.GONE); grpAutoDelete.setVisibility(View.GONE);
btnSave.setEnabled(false); btnSave.setEnabled(false);
pbSave.setVisibility(View.GONE); pbSave.setVisibility(View.GONE);
@ -300,15 +305,19 @@ public class FragmentFolder extends FragmentBase {
Helper.setViewsEnabled(view, true); Helper.setViewsEnabled(view, true);
boolean always = (!ondemand && (pollInterval == 0 || exempted)); boolean always = (!ondemand && (pollInterval == 0 || exempted));
boolean canAutoClassify = (imap &&
MessageClassifier.isEnabled(getContext()) &&
(folder == null || MessageClassifier.canClassify(folder.type)));
boolean isJunk = (folder != null && EntityFolder.JUNK.equals(folder.type));
etName.setEnabled(folder == null || EntityFolder.USER.equals(folder.type)); etName.setEnabled(folder == null || EntityFolder.USER.equals(folder.type));
cbPoll.setEnabled(cbSynchronize.isChecked() && always); cbPoll.setEnabled(cbSynchronize.isChecked() && always);
etPoll.setEnabled(cbSynchronize.isChecked() && always); etPoll.setEnabled(cbSynchronize.isChecked() && always);
tvPoll.setEnabled(cbSynchronize.isChecked() && always); tvPoll.setEnabled(cbSynchronize.isChecked() && always);
grpPoll.setVisibility(imap && cbPoll.isEnabled() && cbPoll.isChecked() ? View.VISIBLE : View.GONE); grpPoll.setVisibility(imap && cbPoll.isEnabled() && cbPoll.isChecked() ? View.VISIBLE : View.GONE);
cbAutoClassify.setVisibility(MessageClassifier.isEnabled(getContext()) && cbAutoClassify.setEnabled(canAutoClassify && (isJunk || ActivityBilling.isPro(getContext())));
(folder == null || MessageClassifier.canClassify(folder.type)) cbAutoClassify.setVisibility(canAutoClassify ? View.VISIBLE : View.GONE);
? View.VISIBLE : View.GONE); tvAutoClassifyPro.setVisibility(canAutoClassify && !cbAutoClassify.isEnabled() ? View.VISIBLE : View.GONE);
etKeepDays.setEnabled(!cbKeepAll.isChecked()); etKeepDays.setEnabled(!cbKeepAll.isChecked());
cbAutoDelete.setEnabled(!cbKeepAll.isChecked()); cbAutoDelete.setEnabled(!cbKeepAll.isChecked());
cbAutoDelete.setText(folder != null && EntityFolder.TRASH.equals(folder.type) cbAutoDelete.setText(folder != null && EntityFolder.TRASH.equals(folder.type)

View File

@ -110,7 +110,8 @@ public class MessageClassifier {
if (classified != null) { if (classified != null) {
EntityFolder f = db.folder().getFolderByName(account.id, classified); EntityFolder f = db.folder().getFolderByName(account.id, classified);
if (f != null && !f.id.equals(folder.id) && f.auto_classify) if (f != null && !f.id.equals(folder.id) && f.auto_classify &&
(EntityFolder.JUNK.equals(f.type) || ActivityBilling.isPro(context)))
try { try {
db.beginTransaction(); db.beginTransaction();

View File

@ -206,6 +206,16 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbDownload" /> app:layout_constraintTop_toBottomOf="@id/cbDownload" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvAutoClassifyPro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_pro_feature"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="?android:attr/textColorLink"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbAutoClassify" />
<!-- after --> <!-- after -->
<eu.faircode.email.FixedTextView <eu.faircode.email.FixedTextView
@ -216,7 +226,7 @@
android:text="@string/title_sync_days" android:text="@string/title_sync_days"
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbAutoClassify" /> app:layout_constraintTop_toBottomOf="@id/tvAutoClassifyPro" />
<eu.faircode.email.FixedTextView <eu.faircode.email.FixedTextView
android:id="@+id/tvSyncDaysRemark" android:id="@+id/tvSyncDaysRemark"
@ -364,7 +374,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:constraint_referenced_ids=" app:constraint_referenced_ids="
cbSynchronize,cbPoll,cbDownload,cbAutoClassify, cbSynchronize,cbPoll,cbDownload,
tvSyncDays,tvSyncDaysRemark,btnInfo,etSyncDays, tvSyncDays,tvSyncDaysRemark,btnInfo,etSyncDays,
tvKeepDays,tvKeepDaysRemark,etKeepDays,cbKeepAll" /> tvKeepDays,tvKeepDaysRemark,etKeepDays,cbKeepAll" />

View File

@ -79,6 +79,7 @@ All pro features are convenience or advanced features.
* Accept/decline calendar invitations * Accept/decline calendar invitations
* Add message to calendar * Add message to calendar
* Filter rules * Filter rules
* Automatic message classification
* Search indexing, search on server * Search indexing, search on server
* Keyword management * Keyword management
* S/MIME sign/encrypt * S/MIME sign/encrypt