Allow multiple select over accounts

pull/147/head
M66B 7 years ago
parent c74a94fa45
commit 28047e3f05

@ -308,7 +308,6 @@ public class FragmentMessages extends FragmentBase {
swipeRefresh.setEnabled(false); swipeRefresh.setEnabled(false);
fabMore.show(); fabMore.show();
} else { } else {
predicate.clearAccount();
fabMore.hide(); fabMore.hide();
swipeRefresh.setEnabled(pull); swipeRefresh.setEnabled(pull);
} }
@ -770,36 +769,46 @@ public class FragmentMessages extends FragmentBase {
long fid = args.getLong("folder"); long fid = args.getLong("folder");
long[] ids = args.getLongArray("ids"); long[] ids = args.getLongArray("ids");
Boolean[] result = new Boolean[10]; Boolean[] result = new Boolean[12];
for (int i = 0; i < result.length; i++) for (int i = 0; i < result.length; i++)
result[i] = false; result[i] = false;
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
long account = -1; List<Long> accounts = new ArrayList<>();
for (long id : ids) { for (long id : ids) {
EntityMessage message = db.message().getMessage(id); EntityMessage message = db.message().getMessage(id);
if (message != null) { if (message != null) {
account = message.account; if (!accounts.contains(message.account))
accounts.add(message.account);
result[message.ui_seen ? 1 : 0] = true; result[message.ui_seen ? 1 : 0] = true;
result[message.flagged ? 3 : 2] = true; result[message.flagged ? 3 : 2] = true;
} }
} }
EntityFolder archive = db.folder().getFolderByType(account, EntityFolder.ARCHIVE); EntityFolder archive = null;
EntityFolder trash = db.folder().getFolderByType(account, EntityFolder.TRASH); EntityFolder trash = null;
EntityFolder junk = null;
if (accounts.size() == 1) {
archive = db.folder().getFolderByType(accounts.get(0), EntityFolder.ARCHIVE);
trash = db.folder().getFolderByType(accounts.get(0), EntityFolder.TRASH);
junk = db.folder().getFolderByType(accounts.get(0), EntityFolder.JUNK);
}
result[4] = (archive != null); result[4] = (archive != null);
result[5] = (trash != null); result[5] = (trash != null);
result[6] = (junk != null);
EntityFolder folder = db.folder().getFolder(fid); EntityFolder folder = db.folder().getFolder(fid);
if (folder != null) { if (folder != null) {
result[6] = EntityFolder.ARCHIVE.equals(folder.type); result[7] = EntityFolder.ARCHIVE.equals(folder.type);
result[7] = EntityFolder.TRASH.equals(folder.type); result[8] = EntityFolder.TRASH.equals(folder.type);
result[8] = EntityFolder.JUNK.equals(folder.type); result[9] = EntityFolder.JUNK.equals(folder.type);
result[9] = EntityFolder.DRAFTS.equals(folder.type); result[10] = EntityFolder.DRAFTS.equals(folder.type);
} }
result[11] = (accounts.size() == 1);
return result; return result;
} }
@ -807,9 +816,9 @@ public class FragmentMessages extends FragmentBase {
protected void onExecuted(Bundle args, final Boolean[] result) { protected void onExecuted(Bundle args, final Boolean[] result) {
PopupMenu popupMenu = new PopupMenu(getContext(), fabMore); PopupMenu popupMenu = new PopupMenu(getContext(), fabMore);
if (result[0] && !result[9]) if (result[0] && !result[10]) // Unseen, not draft
popupMenu.getMenu().add(Menu.NONE, action_seen, 1, R.string.title_seen); popupMenu.getMenu().add(Menu.NONE, action_seen, 1, R.string.title_seen);
if (result[1] && !result[9]) if (result[1] && !result[10]) // Seen, not draft
popupMenu.getMenu().add(Menu.NONE, action_unseen, 2, R.string.title_unseen); popupMenu.getMenu().add(Menu.NONE, action_unseen, 2, R.string.title_unseen);
popupMenu.getMenu().add(Menu.NONE, action_snooze, 3, R.string.title_snooze); popupMenu.getMenu().add(Menu.NONE, action_snooze, 3, R.string.title_snooze);
@ -819,18 +828,19 @@ public class FragmentMessages extends FragmentBase {
if (result[3]) if (result[3])
popupMenu.getMenu().add(Menu.NONE, action_unflag, 5, R.string.title_unflag); popupMenu.getMenu().add(Menu.NONE, action_unflag, 5, R.string.title_unflag);
if (result[4] && !result[6] && !result[9]) // has archive and not is archive if (result[4] && !result[7] && !result[10]) // has archive and not is archive/drafts
popupMenu.getMenu().add(Menu.NONE, action_archive, 6, R.string.title_archive); popupMenu.getMenu().add(Menu.NONE, action_archive, 6, R.string.title_archive);
if (result[7]) // is trash if (result[8]) // is trash
popupMenu.getMenu().add(Menu.NONE, action_delete, 7, R.string.title_delete); popupMenu.getMenu().add(Menu.NONE, action_delete, 7, R.string.title_delete);
else if (result[5]) // has trash
if (!result[8] && result[5]) // not trash and has trash
popupMenu.getMenu().add(Menu.NONE, action_trash, 8, R.string.title_trash); popupMenu.getMenu().add(Menu.NONE, action_trash, 8, R.string.title_trash);
if (!result[8] && !result[9]) if (result[6] && !result[9] && !result[10]) // has junk and not junk/drafts
popupMenu.getMenu().add(Menu.NONE, action_junk, 9, R.string.title_spam); popupMenu.getMenu().add(Menu.NONE, action_junk, 9, R.string.title_spam);
if (!result[9]) if (!result[10])
popupMenu.getMenu().add(Menu.NONE, action_move, 10, R.string.title_move); popupMenu.getMenu().add(Menu.NONE, action_move, 10, R.string.title_move);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@ -865,7 +875,10 @@ public class FragmentMessages extends FragmentBase {
onActionJunkSelection(); onActionJunkSelection();
return true; return true;
case action_move: case action_move:
onActionMoveSelection(); if (result[11]) // single account
onActionMoveSelection();
else
Snackbar.make(view, R.string.title_no_cross_account, Snackbar.LENGTH_LONG).show();
return true; return true;
default: default:
return false; return false;

@ -25,25 +25,18 @@ import androidx.recyclerview.widget.RecyclerView;
public class SelectionPredicateMessage extends SelectionTracker.SelectionPredicate<Long> { public class SelectionPredicateMessage extends SelectionTracker.SelectionPredicate<Long> {
private RecyclerView recyclerView; private RecyclerView recyclerView;
private long account = -1;
SelectionPredicateMessage(RecyclerView recyclerView) { SelectionPredicateMessage(RecyclerView recyclerView) {
this.recyclerView = recyclerView; this.recyclerView = recyclerView;
} }
void clearAccount() {
account = -1;
}
@Override @Override
public boolean canSetStateForKey(@NonNull Long key, boolean nextState) { public boolean canSetStateForKey(@NonNull Long key, boolean nextState) {
AdapterMessage adapter = (AdapterMessage) recyclerView.getAdapter(); AdapterMessage adapter = (AdapterMessage) recyclerView.getAdapter();
TupleMessageEx message = adapter.getItemForKey(key); TupleMessageEx message = adapter.getItemForKey(key);
if (message != null && message.uid != null && (account < 0 || account == message.account)) { if (message != null && message.uid != null)
account = message.account;
return true; return true;
}
return false; return false;
} }
@ -53,10 +46,8 @@ public class SelectionPredicateMessage extends SelectionTracker.SelectionPredica
AdapterMessage adapter = (AdapterMessage) recyclerView.getAdapter(); AdapterMessage adapter = (AdapterMessage) recyclerView.getAdapter();
TupleMessageEx message = adapter.getItemAtPosition(position); TupleMessageEx message = adapter.getItemAtPosition(position);
if (message != null && message.uid != null && (account < 0 || account == message.account)) { if (message != null && message.uid != null)
account = message.account;
return true; return true;
}
return false; return false;
} }

@ -299,6 +299,7 @@
<string name="title_no_stream">An outdated app sent a file path instead of a file stream</string> <string name="title_no_stream">An outdated app sent a file path instead of a file stream</string>
<string name="title_no_contacts">Contact picker not available</string> <string name="title_no_contacts">Contact picker not available</string>
<string name="title_no_internet">No internet connection</string> <string name="title_no_internet">No internet connection</string>
<string name="title_no_cross_account">Moving to another account is not supported</string>
<string name="title_raw_saved">Raw message saved</string> <string name="title_raw_saved">Raw message saved</string>
<string name="title_attachment_saved">Attachment saved</string> <string name="title_attachment_saved">Attachment saved</string>
<string name="title_attachments_saved">Attachments saved</string> <string name="title_attachments_saved">Attachments saved</string>

Loading…
Cancel
Save