Use local drafts folder if needed

pull/190/head
M66B 4 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;
final TupleFolderEx folder = items.get(pos);
if (folder.tbd != null)
if (folder.tbd != null || folder.local)
return false;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

@ -313,7 +313,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
boolean debug = prefs.getBoolean("debug", false);
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));
return 0;
}

@ -182,7 +182,8 @@ class Core {
if (!Objects.equals(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;
// 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 {
if (folder.local)
return;
if (message == null || message.uid != null)
return;
@ -850,6 +853,11 @@ class Core {
// Add message
DB db = DB.getInstance(context);
if (folder.local) {
Log.i(folder.name + " local add");
return;
}
// Drafts can change accounts
if (jargs.length() == 0 && !folder.id.equals(message.folder))
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 {
// Delete message
DB db = DB.getInstance(context);
if (folder.local) {
Log.i(folder.name + " local delete");
db.message().deleteMessage(message.id);
return;
}
try {
boolean deleted = false;
@ -1556,8 +1571,10 @@ class Core {
boolean sync_subscribed = prefs.getBoolean("sync_subscribed", false);
// Get folder names
boolean drafts = false;
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) {
Log.i(folder.name + " creating");
Folder ifolder = istore.getFolder(folder.name);
@ -1607,11 +1624,29 @@ class Core {
sync_folders = true;
} else {
local.put(folder.name, folder);
if (folder.synchronize && folder.initialize != 0)
sync_folders = true;
if (EntityFolder.DRAFTS.equals(folder.type))
drafts = 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)
return;

@ -64,7 +64,7 @@ import static eu.faircode.email.ServiceAuthenticator.AUTH_TYPE_PASSWORD;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 178,
version = 179,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -1760,6 +1760,13 @@ public abstract class DB extends RoomDatabase {
" (SELECT id FROM account" +
" 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
public Integer level = 0; // obsolete
@NonNull
public Boolean local = false;
@NonNull
public Boolean synchronize;
@NonNull
public Boolean poll = false;

@ -4343,7 +4343,8 @@ public class FragmentCompose extends FragmentBase {
dirty = true;
boolean discard_delete = prefs.getBoolean("discard_delete", false);
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);
else {
EntityOperation.queue(context, draft, EntityOperation.ADD);

@ -1466,7 +1466,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
// Get folder
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);
try {

@ -813,6 +813,7 @@
<string name="title_folder_user_only">User folders only</string>
<string name="title_folder_primary">Folders primary account</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_messages">No messages</string>
<string name="title_filters_active">One or more filters active</string>

Loading…
Cancel
Save