Use local drafts folder if needed

pull/190/head
M66B 5 years ago
parent 92dac6a771
commit 997a51fb70

File diff suppressed because it is too large Load Diff

@ -468,7 +468,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
return false; return false;
final TupleFolderEx folder = items.get(pos); final TupleFolderEx folder = items.get(pos);
if (folder.tbd != null) if (folder.tbd != null || folder.local)
return false; return false;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

@ -313,7 +313,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
boolean debug = prefs.getBoolean("debug", false); boolean debug = prefs.getBoolean("debug", false);
final EntityFolder browsable = db.folder().getBrowsableFolder(folder, criteria != null); final EntityFolder browsable = db.folder().getBrowsableFolder(folder, criteria != null);
if (browsable == null || !browsable.selectable) { if (browsable == null || !browsable.selectable || browsable.local) {
Log.w("Boundary not browsable=" + (folder != null)); Log.w("Boundary not browsable=" + (folder != null));
return 0; return 0;
} }

@ -182,7 +182,8 @@ class Core {
if (!Objects.equals(folder.id, op.folder)) if (!Objects.equals(folder.id, op.folder))
throw new IllegalArgumentException("Invalid folder=" + folder.id + "/" + op.folder); throw new IllegalArgumentException("Invalid folder=" + folder.id + "/" + op.folder);
if (ifolder != null && !ifolder.isOpen()) if (account.protocol == EntityAccount.TYPE_IMAP &&
!folder.local && ifolder != null && !ifolder.isOpen())
break; break;
// Fetch most recent copy of message // Fetch most recent copy of message
@ -578,6 +579,8 @@ class Core {
} }
private static void ensureUid(Context context, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws MessagingException { private static void ensureUid(Context context, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws MessagingException {
if (folder.local)
return;
if (message == null || message.uid != null) if (message == null || message.uid != null)
return; return;
@ -850,6 +853,11 @@ class Core {
// Add message // Add message
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
if (folder.local) {
Log.i(folder.name + " local add");
return;
}
// Drafts can change accounts // Drafts can change accounts
if (jargs.length() == 0 && !folder.id.equals(message.folder)) if (jargs.length() == 0 && !folder.id.equals(message.folder))
throw new IllegalArgumentException("Message folder changed"); throw new IllegalArgumentException("Message folder changed");
@ -1260,6 +1268,13 @@ class Core {
private static void onDelete(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException { private static void onDelete(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException {
// Delete message // Delete message
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
if (folder.local) {
Log.i(folder.name + " local delete");
db.message().deleteMessage(message.id);
return;
}
try { try {
boolean deleted = false; boolean deleted = false;
@ -1556,8 +1571,10 @@ class Core {
boolean sync_subscribed = prefs.getBoolean("sync_subscribed", false); boolean sync_subscribed = prefs.getBoolean("sync_subscribed", false);
// Get folder names // Get folder names
boolean drafts = false;
Map<String, EntityFolder> local = new HashMap<>(); Map<String, EntityFolder> local = new HashMap<>();
for (EntityFolder folder : db.folder().getFolders(account.id, false, false)) List<EntityFolder> folders = db.folder().getFolders(account.id, false, false);
for (EntityFolder folder : folders)
if (folder.tbc != null) { if (folder.tbc != null) {
Log.i(folder.name + " creating"); Log.i(folder.name + " creating");
Folder ifolder = istore.getFolder(folder.name); Folder ifolder = istore.getFolder(folder.name);
@ -1607,11 +1624,29 @@ class Core {
sync_folders = true; sync_folders = true;
} else { } else {
local.put(folder.name, folder); if (EntityFolder.DRAFTS.equals(folder.type))
if (folder.synchronize && folder.initialize != 0) drafts = true;
sync_folders = true; if (!folder.local) {
local.put(folder.name, folder);
if (folder.synchronize && folder.initialize != 0)
sync_folders = true;
}
} }
Log.i("Local folder count=" + local.size()); Log.i("Local folder count=" + local.size() + " drafts=" + drafts);
if (!drafts) {
EntityFolder d = new EntityFolder();
d.account = account.id;
d.name = context.getString(R.string.title_folder_local_drafts);
d.type = EntityFolder.DRAFTS;
d.local = true;
d.setProperties();
d.synchronize = false;
d.download = false;
d.sync_days = Integer.MAX_VALUE;
d.keep_days = Integer.MAX_VALUE;
db.folder().insertFolder(d);
}
if (!sync_folders) if (!sync_folders)
return; return;

@ -64,7 +64,7 @@ import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_PASSWORD;
// https://developer.android.com/topic/libraries/architecture/room.html // https://developer.android.com/topic/libraries/architecture/room.html
@Database( @Database(
version = 178, version = 179,
entities = { entities = {
EntityIdentity.class, EntityIdentity.class,
EntityAccount.class, EntityAccount.class,
@ -1760,6 +1760,13 @@ public abstract class DB extends RoomDatabase {
" (SELECT id FROM account" + " (SELECT id FROM account" +
" WHERE host IN ('imap.arcor.de'))"); " WHERE host IN ('imap.arcor.de'))");
} }
})
.addMigrations(new Migration(178, 179) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `folder` ADD COLUMN `local` INTEGER NOT NULL DEFAULT 0");
}
}); });
} }

@ -77,6 +77,8 @@ public class EntityFolder extends EntityOrder implements Serializable {
@NonNull @NonNull
public Integer level = 0; // obsolete public Integer level = 0; // obsolete
@NonNull @NonNull
public Boolean local = false;
@NonNull
public Boolean synchronize; public Boolean synchronize;
@NonNull @NonNull
public Boolean poll = false; public Boolean poll = false;

@ -4343,7 +4343,8 @@ public class FragmentCompose extends FragmentBase {
dirty = true; dirty = true;
boolean discard_delete = prefs.getBoolean("discard_delete", false); boolean discard_delete = prefs.getBoolean("discard_delete", false);
EntityFolder trash = db.folder().getFolderByType(draft.account, EntityFolder.TRASH); EntityFolder trash = db.folder().getFolderByType(draft.account, EntityFolder.TRASH);
if (empty || trash == null || discard_delete) EntityFolder drafts = db.folder().getFolderByType(draft.account, EntityFolder.DRAFTS);
if (empty || trash == null || discard_delete || (drafts != null && drafts.local))
EntityOperation.queue(context, draft, EntityOperation.DELETE); EntityOperation.queue(context, draft, EntityOperation.DELETE);
else { else {
EntityOperation.queue(context, draft, EntityOperation.ADD); EntityOperation.queue(context, draft, EntityOperation.ADD);

@ -1466,7 +1466,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
// Get folder // Get folder
Folder ifolder = mapFolders.get(folder); // null when polling Folder ifolder = mapFolders.get(folder); // null when polling
boolean canOpen = (account.protocol == EntityAccount.TYPE_IMAP || EntityFolder.INBOX.equals(folder.type)); boolean canOpen = (EntityFolder.INBOX.equals(folder.type) ||
(account.protocol == EntityAccount.TYPE_IMAP && !folder.local));
final boolean shouldClose = (ifolder == null && canOpen); final boolean shouldClose = (ifolder == null && canOpen);
try { try {

@ -813,6 +813,7 @@
<string name="title_folder_user_only">User folders only</string> <string name="title_folder_user_only">User folders only</string>
<string name="title_folder_primary">Folders primary account</string> <string name="title_folder_primary">Folders primary account</string>
<string name="title_folders_unified">Unified inbox folders</string> <string name="title_folders_unified">Unified inbox folders</string>
<string name="title_folder_local_drafts">Local drafts</string>
<string name="title_no_folders">No folders</string> <string name="title_no_folders">No folders</string>
<string name="title_no_messages">No messages</string> <string name="title_no_messages">No messages</string>
<string name="title_filters_active">One or more filters active</string> <string name="title_filters_active">One or more filters active</string>

Loading…
Cancel
Save