diff --git a/app/src/main/java/eu/faircode/email/AdapterIdentity.java b/app/src/main/java/eu/faircode/email/AdapterIdentity.java index 6f83f4ed17..7c27bbeefc 100644 --- a/app/src/main/java/eu/faircode/email/AdapterIdentity.java +++ b/app/src/main/java/eu/faircode/email/AdapterIdentity.java @@ -80,6 +80,7 @@ public class AdapterIdentity extends RecyclerView.Adapter> liveIdentityView(); - @Query("SELECT identity.*, account.name AS accountName FROM identity" + - " JOIN account ON account.id = identity.account") + @Query("SELECT identity.*, account.name AS accountName, folder.id AS drafts" + + " FROM identity" + + " JOIN account ON account.id = identity.account" + + " LEFT JOIN folder ON folder.account = account.id AND folder.type = '" + EntityFolder.DRAFTS + "'") LiveData> liveIdentities(); - @Query("SELECT identity.*, account.name AS accountName FROM identity" + + @Query("SELECT identity.*, account.name AS accountName, folder.id AS drafts" + + " FROM identity" + " JOIN account ON account.id = identity.account" + " JOIN folder ON folder.account = identity.account AND folder.type = '" + EntityFolder.DRAFTS + "'" + " AND identity.synchronize" + " AND account.synchronize") LiveData> liveComposableIdentities(); - @Query("SELECT identity.*, account.name AS accountName FROM identity" + + @Query("SELECT identity.*, account.name AS accountName, folder.id AS drafts" + + " FROM identity" + " JOIN account ON account.id = identity.account" + " JOIN folder ON folder.account = identity.account AND folder.type = '" + EntityFolder.DRAFTS + "'" + " WHERE (:account IS NULL OR account.id = :account)" + diff --git a/app/src/main/java/eu/faircode/email/EmailService.java b/app/src/main/java/eu/faircode/email/EmailService.java index f70b6d8d33..6b217a909f 100644 --- a/app/src/main/java/eu/faircode/email/EmailService.java +++ b/app/src/main/java/eu/faircode/email/EmailService.java @@ -635,15 +635,14 @@ public class EmailService implements AutoCloseable { EntityFolder.guessTypes(folders, getStore().getDefaultFolder().getSeparator()); boolean inbox = false; - boolean drafts = false; for (EntityFolder folder : folders) - if (EntityFolder.INBOX.equals(folder.type)) + if (EntityFolder.INBOX.equals(folder.type)) { inbox = true; - else if (EntityFolder.DRAFTS.equals(folder.type)) - drafts = true; + break; + } - if (!inbox || !drafts) - return null; + if (!inbox) + throw new IllegalArgumentException(context.getString(R.string.title_setup_no_inbox)); return folders; } diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index e27ec39213..d72b433559 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -3646,7 +3646,7 @@ public class FragmentCompose extends FragmentBase { EntityFolder drafts = db.folder().getFolderByType(selected.account, EntityFolder.DRAFTS); if (drafts == null) - throw new IllegalArgumentException(context.getString(R.string.title_no_primary_drafts)); + throw new IllegalArgumentException(context.getString(R.string.title_no_drafts)); data.draft.account = drafts.account; data.draft.folder = drafts.id; diff --git a/app/src/main/java/eu/faircode/email/FragmentGmail.java b/app/src/main/java/eu/faircode/email/FragmentGmail.java index d98ddaf435..c807a8420c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentGmail.java +++ b/app/src/main/java/eu/faircode/email/FragmentGmail.java @@ -373,9 +373,6 @@ public class FragmentGmail extends FragmentBase { null, null); folders = iservice.getFolders(); - - if (folders == null) - throw new IllegalArgumentException(context.getString(R.string.title_setup_no_system_folders)); } Long max_size; diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 95f705c160..0c7cbe5cbd 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -987,7 +987,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. @Override protected void onExecuted(Bundle args, EntityFolder drafts) { if (drafts == null) - Snackbar.make(view, R.string.title_no_primary_drafts, Snackbar.LENGTH_LONG) + Snackbar.make(view, R.string.title_no_drafts, Snackbar.LENGTH_LONG) .setGestureInsetBottomIgnored(true).show(); else { LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index f4736219aa..b3b701725b 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -485,9 +485,6 @@ public class FragmentOAuth extends FragmentBase { null, null); folders = iservice.getFolders(); - - if (folders == null) - throw new IllegalArgumentException(context.getString(R.string.title_setup_no_system_folders)); } Log.i("OAuth checking SMTP provider=" + provider.id); diff --git a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java index 30f770a6aa..38269926d5 100644 --- a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java @@ -337,9 +337,6 @@ public class FragmentQuickSetup extends FragmentBase { } folders = iservice.getFolders(); - - if (folders == null) - throw new IllegalArgumentException(context.getString(R.string.title_setup_no_system_folders)); } Long max_size = null; diff --git a/app/src/main/java/eu/faircode/email/FragmentSetup.java b/app/src/main/java/eu/faircode/email/FragmentSetup.java index 81173fc639..9eaf889983 100644 --- a/app/src/main/java/eu/faircode/email/FragmentSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentSetup.java @@ -67,7 +67,6 @@ public class FragmentSetup extends FragmentBase { private TextView tvAccountDone; private Button btnAccount; - private TextView tvNoPrimaryDrafts; private TextView tvIdentityDone; private Button btnIdentity; @@ -115,7 +114,6 @@ public class FragmentSetup extends FragmentBase { tvAccountDone = view.findViewById(R.id.tvAccountDone); btnAccount = view.findViewById(R.id.btnAccount); - tvNoPrimaryDrafts = view.findViewById(R.id.tvNoPrimaryDrafts); tvIdentityDone = view.findViewById(R.id.tvIdentityDone); btnIdentity = view.findViewById(R.id.btnIdentity); @@ -309,7 +307,6 @@ public class FragmentSetup extends FragmentBase { tvAccountDone.setText(null); tvAccountDone.setCompoundDrawables(null, null, null, null); - tvNoPrimaryDrafts.setVisibility(View.GONE); tvIdentityDone.setText(null); tvIdentityDone.setCompoundDrawables(null, null, null, null); @@ -386,25 +383,6 @@ public class FragmentSetup extends FragmentBase { btnInbox.setEnabled(done); prefs.edit().putBoolean("has_accounts", done).apply(); - - if (done) - new SimpleTask() { - @Override - protected EntityFolder onExecute(Context context, Bundle args) { - DB db = DB.getInstance(context); - return db.folder().getPrimaryDrafts(); - } - - @Override - protected void onExecuted(Bundle args, EntityFolder drafts) { - tvNoPrimaryDrafts.setVisibility(drafts == null ? View.VISIBLE : View.GONE); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(getParentFragmentManager(), ex); - } - }.execute(FragmentSetup.this, new Bundle(), "setup:drafts"); } }); diff --git a/app/src/main/java/eu/faircode/email/TupleIdentityEx.java b/app/src/main/java/eu/faircode/email/TupleIdentityEx.java index f6f371b9c9..5f1e71de90 100644 --- a/app/src/main/java/eu/faircode/email/TupleIdentityEx.java +++ b/app/src/main/java/eu/faircode/email/TupleIdentityEx.java @@ -23,13 +23,15 @@ import java.util.Objects; public class TupleIdentityEx extends EntityIdentity { public String accountName; + public Long drafts; @Override public boolean equals(Object obj) { if (obj instanceof TupleIdentityEx) { TupleIdentityEx other = (TupleIdentityEx) obj; return (super.equals(obj) && - Objects.equals(accountName, other.accountName)); + Objects.equals(accountName, other.accountName) && + Objects.equals(drafts, other.drafts)); } else return false; } diff --git a/app/src/main/res/layout/fragment_setup.xml b/app/src/main/res/layout/fragment_setup.xml index 04f443c4b1..b41e410e6a 100644 --- a/app/src/main/res/layout/fragment_setup.xml +++ b/app/src/main/res/layout/fragment_setup.xml @@ -240,17 +240,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/tvAccountDone" /> - - + app:layout_constraintTop_toBottomOf="@id/btnAccount" /> + + + app:layout_constraintTop_toBottomOf="@id/tvDrafts" /> Please try setting up an account and identity in setup steps 1 and 2 using the settings provided by your email provider Please double check your email address and password and make sure external access (IMAP/SMTP) is enabled for your account This provider requires an app password instead of the account password, please check the instructions of your provider - Inbox or draft folder not found + Inbox not found When enrolled in the advanced protection program it is not possible to use a third party email app. This is a restriction imposed by Google. An account and an identity have successfully been added You can try to configure an account and an identity below too @@ -658,7 +658,7 @@ User name missing Password missing Inbox not found - No primary account or no drafts folder + No drafts folder There is no spam folder selected for this account Sending emails requires at least one identity and a drafts folder This provider uses a proprietary email protocol and therefore it is not possible to use third party email clients