mirror of https://github.com/M66B/FairEmail.git
Automatic classification is a pro feature
This commit is contained in:
parent
42598dd43e
commit
d83a4d7d7c
11
FAQ.md
11
FAQ.md
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue