Added support for local seen/flagged for read only folders

pull/194/merge
M66B 3 years ago
parent a550246050
commit 80b2fae146

@ -1690,10 +1690,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
flags_background && flagged && !expanded
? ColorUtils.setAlphaComponent(color, 127) : Color.TRANSPARENT);
if (flags || message.ui_flagged)
ibFlagged.setVisibility(message.folderReadOnly ? View.INVISIBLE : View.VISIBLE);
else
ibFlagged.setVisibility(View.GONE);
ibFlagged.setVisibility(flags || message.ui_flagged ? View.VISIBLE : View.GONE);
}
private void bindContactInfo(TupleMessageEx message, ContactInfo[] info, Address[] addresses) {
@ -1951,7 +1948,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean keywords = (!message.folderReadOnly && message.uid != null &&
message.accountProtocol == EntityAccount.TYPE_IMAP);
boolean labels = (data.isGmail && move && !inTrash && !inJunk && !outbox);
boolean seen = (!(message.folderReadOnly || message.uid == null) ||
boolean seen = (message.uid != null ||
message.accountProtocol == EntityAccount.TYPE_POP);
int froms = (message.from == null ? 0 : message.from.length);
@ -2897,7 +2894,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSeenBottom.setImageResource(message.ui_seen
? R.drawable.twotone_mail_24 : R.drawable.twotone_drafts_24);
ibSeenBottom.setVisibility(!(message.folderReadOnly || message.uid == null) ||
ibSeenBottom.setVisibility(message.uid != null ||
message.accountProtocol == EntityAccount.TYPE_POP
? View.VISIBLE : View.GONE);
}
@ -3540,7 +3537,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean doubletap = prefs.getBoolean("doubletap", true);
if (!doubletap ||
message.folderReadOnly ||
(message.uid == null && message.accountProtocol == EntityAccount.TYPE_IMAP) ||
EntityFolder.OUTBOX.equals(message.folderType)) {
lbm.sendBroadcast(viewThread);
@ -3613,7 +3609,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
@Override
public boolean onLongClick(View view) {
final TupleMessageEx message = getMessage();
if (message == null || message.folderReadOnly)
if (message == null)
return false;
int id = view.getId();
@ -3634,12 +3630,18 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
onActionOpenFull(message);
return true;
} else if (id == R.id.ibMove) {
if (message.folderReadOnly)
return false;
onActionMoveAccount(message, ibMove);
return true;
} else if (id == R.id.ibMoveBottom) {
if (message.folderReadOnly)
return false;
onActionMoveAccount(message, ibMoveBottom);
return true;
} else if (id == R.id.ibTrash || id == R.id.ibTrashBottom) {
if (message.folderReadOnly)
return false;
if (EntityFolder.OUTBOX.equals(message.folderType))
return false;
onActionTrash(message, true);
@ -4704,7 +4706,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu.getMenu().findItem(R.id.menu_unseen)
.setTitle(message.ui_seen ? R.string.title_unseen : R.string.title_seen)
.setIcon(message.ui_seen ? R.drawable.twotone_drafts_24 : R.drawable.twotone_mail_24)
.setEnabled((message.uid != null && !message.folderReadOnly) ||
.setEnabled(message.uid != null ||
message.accountProtocol != EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_hide)
@ -4713,7 +4715,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu.getMenu().findItem(R.id.menu_flag_color)
.setVisible(flags_background)
.setEnabled((message.uid != null && !message.folderReadOnly) ||
.setEnabled(message.uid != null ||
message.accountProtocol != EntityAccount.TYPE_IMAP);
int i = (message.importance == null ? EntityMessage.PRIORITIY_NORMAL : message.importance);

@ -815,6 +815,9 @@ class Core {
// Mark message (un)seen
DB db = DB.getInstance(context);
if (folder.read_only)
return;
if (!ifolder.getPermanentFlags().contains(Flags.Flag.SEEN)) {
db.message().setMessageSeen(message.id, false);
db.message().setMessageUiSeen(message.id, false);
@ -846,6 +849,9 @@ class Core {
// Star/unstar message
DB db = DB.getInstance(context);
if (folder.read_only)
return;
if (!ifolder.getPermanentFlags().contains(Flags.Flag.FLAGGED)) {
db.message().setMessageFlagged(message.id, false);
db.message().setMessageUiFlagged(message.id, false, null);
@ -905,6 +911,7 @@ class Core {
private static void onKeyword(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, JSONException {
// Set/reset user flag
// https://tools.ietf.org/html/rfc3501#section-2.3.2
String keyword = jargs.getString(0);
boolean set = jargs.getBoolean(1);
@ -3941,7 +3948,7 @@ class Core {
}
}
if ((!message.seen.equals(seen) || !message.ui_seen.equals(seen)) &&
if ((!message.seen.equals(seen) || (!folder.read_only && !message.ui_seen.equals(seen))) &&
db.operation().getOperationCount(folder.id, message.id, EntityOperation.SEEN) == 0) {
update = true;
message.seen = seen;
@ -3961,7 +3968,7 @@ class Core {
syncSimilar = true;
}
if ((!message.flagged.equals(flagged) || !message.ui_flagged.equals(flagged)) &&
if ((!message.flagged.equals(flagged) || (!folder.read_only && !message.ui_flagged.equals(flagged))) &&
db.operation().getOperationCount(folder.id, message.id, EntityOperation.FLAG) == 0) {
update = true;
message.flagged = flagged;

@ -1810,7 +1810,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
@Override
public void setExpanded(TupleMessageEx message, boolean value, boolean scroll) {
// Prevent flicker
if (value && message.accountAutoSeen && !message.folderReadOnly) {
if (value && message.accountAutoSeen) {
message.unseen = 0;
message.ui_seen = true;
message.visible_unseen = 0;
@ -5795,7 +5795,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (account.auto_seen)
EntityOperation.queue(context, message, EntityOperation.SEEN, true);
} else {
if (account.auto_seen && !folder.read_only)
if (account.auto_seen)
EntityOperation.queue(context, message, EntityOperation.SEEN, true);
if (!message.content)

@ -1550,12 +1550,14 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
if (BuildConfig.DEBUG && "Postausgang".equals(folder.name))
throw new ReadOnlyFolderException(ifolder);
ifolder.open(Folder.READ_WRITE);
db.folder().setFolderReadOnly(folder.id, ifolder.getUIDNotSticky());
folder.read_only = ifolder.getUIDNotSticky();
db.folder().setFolderReadOnly(folder.id, folder.read_only);
} catch (ReadOnlyFolderException ex) {
Log.w(folder.name + " read only");
try {
ifolder.open(Folder.READ_ONLY);
db.folder().setFolderReadOnly(folder.id, true);
folder.read_only = true;
db.folder().setFolderReadOnly(folder.id, folder.read_only);
} catch (Throwable ex1) {
db.folder().setFolderError(folder.id, Log.formatThrowable(ex1));
throw ex1;
@ -1909,12 +1911,15 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
try {
ifolder.open(Folder.READ_WRITE);
if (ifolder instanceof IMAPFolder)
db.folder().setFolderReadOnly(folder.id, ((IMAPFolder) ifolder).getUIDNotSticky());
if (ifolder instanceof IMAPFolder) {
folder.read_only = ((IMAPFolder) ifolder).getUIDNotSticky();
db.folder().setFolderReadOnly(folder.id, folder.read_only);
}
} catch (ReadOnlyFolderException ex) {
Log.w(folder.name + " read only");
ifolder.open(Folder.READ_ONLY);
db.folder().setFolderReadOnly(folder.id, true);
folder.read_only = true;
db.folder().setFolderReadOnly(folder.id, folder.read_only);
}
db.folder().setFolderState(folder.id, "connected");

Loading…
Cancel
Save