From 966794f169f9a88f311807dae822ff2966112094 Mon Sep 17 00:00:00 2001 From: cketti Date: Fri, 2 Nov 2012 09:30:23 +0100 Subject: [PATCH] Don't create (throw-away) Message objects when starting action mode --- .../fsck/k9/fragment/MessageListFragment.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/com/fsck/k9/fragment/MessageListFragment.java b/src/com/fsck/k9/fragment/MessageListFragment.java index 328b69086..9e9d00467 100644 --- a/src/com/fsck/k9/fragment/MessageListFragment.java +++ b/src/com/fsck/k9/fragment/MessageListFragment.java @@ -6,8 +6,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.EnumMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Future; import android.app.Activity; @@ -2218,23 +2220,41 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick menu.findItem(R.id.spam).setVisible(true); menu.findItem(R.id.copy).setVisible(true); - // hide uncapable - /* - * TODO think of a better way then looping over all - * messages. - */ - Message[] messages = getCheckedMessages(); - Account account; + Set accountUuids = getAccountUuidsForSelected(); - for (Message message : messages) { - account = message.getFolder().getAccount(); - setContextCapabilities(account, menu); + for (String accountUuid : accountUuids) { + Account account = mPreferences.getAccount(accountUuid); + if (account != null) { + setContextCapabilities(account, menu); + } } } return true; } + /** + * Get the set of account UUIDs for the selected messages. + */ + private Set getAccountUuidsForSelected() { + int maxAccounts = mAccountUuids.length; + Set accountUuids = new HashSet(maxAccounts); + + for (int position = 0, end = mAdapter.getCount(); position < end; position++) { + if (mSelected.get(position, false)) { + Cursor cursor = (Cursor) mAdapter.getItem(position); + String accountUuid = cursor.getString(ACCOUNT_UUID_COLUMN); + accountUuids.add(accountUuid); + + if (accountUuids.size() == mAccountUuids.length) { + break; + } + } + } + + return accountUuids; + } + @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null;