diff --git a/res/layout/accounts_item.xml b/res/layout/accounts_item.xml index 6e52ffdcb..b6457a5ad 100644 --- a/res/layout/accounts_item.xml +++ b/res/layout/accounts_item.xml @@ -5,8 +5,7 @@ android:layout_height="?android:attr/listPreferredItemHeight" android:orientation="horizontal" android:gravity="center_vertical" - - android:paddingRight="4dip"> + android:paddingRight="6dip"> - + android:layout_height="fill_parent" + android:orientation="vertical" + android:paddingLeft="6dip" + android:paddingTop="6dip" + android:paddingBottom="0dip" + android:paddingRight="6dip" + android:gravity="right" + > + + + diff --git a/res/layout/folder_list_item.xml b/res/layout/folder_list_item.xml index 6128e4be5..35734ee02 100644 --- a/res/layout/folder_list_item.xml +++ b/res/layout/folder_list_item.xml @@ -6,8 +6,6 @@ android:orientation="horizontal" android:gravity="center_vertical" android:background="@android:color/transparent" - - android:paddingRight="4dip"> - + android:layout_height="fill_parent" + android:orientation="vertical" + android:paddingLeft="6dip" + android:paddingTop="6dip" + android:paddingBottom="0dip" + android:paddingRight="6dip" + android:gravity="right" + > + + + diff --git a/src/com/fsck/k9/Account.java b/src/com/fsck/k9/Account.java index 3d3cd8a49..908d1723d 100644 --- a/src/com/fsck/k9/Account.java +++ b/src/com/fsck/k9/Account.java @@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; * Account stores all of the settings for a single account defined by the user. It is able to save * and delete itself given a Preferences to work with. Each account is defined by a UUID. */ -public class Account +public class Account implements BaseAccount { public static final String EXPUNGE_IMMEDIATELY = "EXPUNGE_IMMEDIATELY"; public static final String EXPUNGE_MANUALLY = "EXPUNGE_MANUALLY"; diff --git a/src/com/fsck/k9/BaseAccount.java b/src/com/fsck/k9/BaseAccount.java new file mode 100644 index 000000000..4d7eda82a --- /dev/null +++ b/src/com/fsck/k9/BaseAccount.java @@ -0,0 +1,10 @@ +package com.fsck.k9; + +public interface BaseAccount +{ + public String getEmail(); + public void setEmail(String email); + public String getDescription(); + public void setDescription(String description); + public String getUuid(); +} diff --git a/src/com/fsck/k9/MessagingController.java b/src/com/fsck/k9/MessagingController.java index b1699924d..eea907fb3 100644 --- a/src/com/fsck/k9/MessagingController.java +++ b/src/com/fsck/k9/MessagingController.java @@ -696,22 +696,27 @@ public class MessagingController implements Runnable } } + public void searchLocalMessages(SearchAccount searchAccount, final Message[] messages, final MessagingListener listener) + { + searchLocalMessages(searchAccount, searchAccount.getQuery(), messages, searchAccount.isIntegrate(), + searchAccount.getRequiredFlags(), searchAccount.getForbiddenFlags(), listener); + } + /** * Find all messages in any local account which match the query 'query' - * - * @param account + * @param account TODO * @param query * @param listener + * @param account + * * @throws MessagingException */ - public void searchLocalMessages(final String query, final Message[] messages, final boolean integrate, final Flag[] requiredFlags, final Flag[] forbiddenFlags, - final MessagingListener listener) + public void searchLocalMessages(final BaseAccount baseAccount, final String query, final Message[] messages, final boolean integrate, final Flag[] requiredFlags, + final Flag[] forbiddenFlags, final MessagingListener listener) { - if (listener == null) - { - return; - } + final AccountStats stats = new AccountStats(); + threadPool.execute(new Runnable() { public void run() @@ -733,8 +738,10 @@ public class MessagingController implements Runnable break; } - - listener.listLocalMessagesStarted(account, null); + if (listener != null) + { + listener.listLocalMessagesStarted(account, null); + } if (integrate || displayableOnly) { @@ -784,10 +791,21 @@ public class MessagingController implements Runnable } messages.add(message); - listener.listLocalMessagesAddMessages(account, null, messages); + stats.unreadMessageCount += (message.isSet(Flag.SEEN) == false) ? 1 : 0; + stats.flaggedMessageCount += (message.isSet(Flag.FLAGGED)) ? 1 : 0; + if (listener != null) + { + listener.listLocalMessagesAddMessages(account, null, messages); + } } - public void messagesFinished(int number) {} + public void messagesFinished(int number) + { + if (baseAccount != null) + { + listener.accountStatusChanged(baseAccount, stats); + } + } }; try @@ -798,12 +816,18 @@ public class MessagingController implements Runnable } catch (Exception e) { - listener.listLocalMessagesFailed(account, null, e.getMessage()); + if (listener != null) + { + listener.listLocalMessagesFailed(account, null, e.getMessage()); + } addErrorMessage(account, null, e); } finally { - listener.listLocalMessagesFinished(account, null); + if (listener != null) + { + listener.listLocalMessagesFinished(account, null); + } } } } @@ -3376,7 +3400,7 @@ public class MessagingController implements Runnable } } - public void getAccountUnreadCount(final Context context, final Account account, + public void getAccountStats(final Context context, final Account account, final MessagingListener l) { Runnable unreadRunnable = new Runnable() @@ -3397,10 +3421,9 @@ public class MessagingController implements Runnable } }; - - put("getAccountUnreadCount:" + account.getDescription(), l, unreadRunnable); + put("getAccountStats:" + account.getDescription(), l, unreadRunnable); } - + public void getFolderUnreadMessageCount(final Account account, final String folderName, final MessagingListener l) { diff --git a/src/com/fsck/k9/MessagingListener.java b/src/com/fsck/k9/MessagingListener.java index 463c5d59e..c824a9211 100644 --- a/src/com/fsck/k9/MessagingListener.java +++ b/src/com/fsck/k9/MessagingListener.java @@ -18,10 +18,10 @@ import java.util.List; public class MessagingListener { - public void accountStatusChanged(Account account, AccountStats stats) + public void accountStatusChanged(BaseAccount account, AccountStats stats) { } - + public void accountSizeChanged(Account account, long oldSize, long newSize) { } diff --git a/src/com/fsck/k9/SearchAccount.java b/src/com/fsck/k9/SearchAccount.java new file mode 100644 index 000000000..31f064f5c --- /dev/null +++ b/src/com/fsck/k9/SearchAccount.java @@ -0,0 +1,89 @@ +/** + * + */ +package com.fsck.k9; + +import java.util.UUID; + +import android.content.Context; + +import com.fsck.k9.mail.Flag; +import com.fsck.k9.mail.Message; + +public class SearchAccount implements BaseAccount +{ + private Flag[] mRequiredFlags = null; + private Flag[] mForbiddenFlags = null; + private String email = null; + private String description = null; + private String query = ""; + private boolean integrate = false; + private String mUuid = UUID.randomUUID().toString(); + + public SearchAccount(Context context, boolean nintegrate, Flag[] requiredFlags, Flag[] forbiddenFlags) + { + mRequiredFlags = requiredFlags; + mForbiddenFlags = forbiddenFlags; + integrate = nintegrate; + } + + @Override + public synchronized String getEmail() + { + return email; + } + + @Override + public synchronized void setEmail(String email) + { + this.email = email; + } + + public Flag[] getRequiredFlags() + { + return mRequiredFlags; + } + + public Flag[] getForbiddenFlags() + { + return mForbiddenFlags; + } + + public boolean isIntegrate() + { + return integrate; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + public String getUuid() + { + return mUuid; + } + public void setUuid(String nUuid) + { + mUuid = nUuid; + } + + public void setIntegrate(boolean integrate) + { + this.integrate = integrate; + } +} \ No newline at end of file diff --git a/src/com/fsck/k9/activity/Accounts.java b/src/com/fsck/k9/activity/Accounts.java index b60dc3d83..e4ed5830e 100644 --- a/src/com/fsck/k9/activity/Accounts.java +++ b/src/com/fsck/k9/activity/Accounts.java @@ -30,10 +30,9 @@ import java.util.concurrent.ConcurrentHashMap; public class Accounts extends K9ListActivity implements OnItemClickListener, OnClickListener { private static final int DIALOG_REMOVE_ACCOUNT = 1; - //private ConcurrentHashMap unreadMessageCounts = new ConcurrentHashMap(); private ConcurrentHashMap accountStats = new ConcurrentHashMap(); - private ConcurrentHashMap pendingWork = new ConcurrentHashMap(); + private ConcurrentHashMap pendingWork = new ConcurrentHashMap(); private Account mSelectedContextAccount; private int mUnreadMessageCount = 0; @@ -155,7 +154,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC } } @Override - public void accountStatusChanged(Account account, AccountStats stats) + public void accountStatusChanged(BaseAccount account, AccountStats stats) { AccountStats oldStats = accountStats.get(account.getUuid()); int oldUnreadMessageCount = 0; @@ -164,8 +163,10 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC oldUnreadMessageCount = oldStats.unreadMessageCount; } accountStats.put(account.getUuid(), stats); - // unreadMessageCounts.put(account.getUuid(), stats.unreadMessageCount); - mUnreadMessageCount += stats.unreadMessageCount - oldUnreadMessageCount; + if (account instanceof Account) + { + mUnreadMessageCount += stats.unreadMessageCount - oldUnreadMessageCount; + } mHandler.dataChanged(); pendingWork.remove(account); @@ -195,7 +196,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC int numNewMessages) { super.synchronizeMailboxFinished(account, folder, totalMessagesInMailbox, numNewMessages); - MessagingController.getInstance(getApplication()).getAccountUnreadCount(Accounts.this, account, mListener); + MessagingController.getInstance(getApplication()).getAccountStats(Accounts.this, account, mListener); mHandler.progress(false); @@ -280,7 +281,6 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC }; - //private static String UNREAD_MESSAGE_COUNTS = "unreadMessageCounts"; private static String ACCOUNT_STATS = "accountStats"; private static String SELECTED_CONTEXT_ACCOUNT = "selectedContextAccount"; @@ -390,9 +390,9 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC private void refresh() { - Account[] accounts = Preferences.getPreferences(this).getAccounts(); + BaseAccount[] accounts = Preferences.getPreferences(this).getAccounts(); - Account[] newAccounts = new Account[accounts.length + 4]; + BaseAccount[] newAccounts = new BaseAccount[accounts.length + 4]; newAccounts[0] = integratedInboxAccount; newAccounts[1] = integratedInboxStarredAccount; newAccounts[2] = unreadAccount; @@ -401,19 +401,26 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC mAdapter = new AccountsAdapter(newAccounts); getListView().setAdapter(mAdapter); - if (accounts.length > 0) + if (newAccounts.length > 0) { mHandler.progress(Window.PROGRESS_START); } pendingWork.clear(); - mUnreadMessageCount = 0; - accountStats.clear(); - for (Account account : accounts) + for (BaseAccount account : newAccounts) { pendingWork.put(account, "true"); - MessagingController.getInstance(getApplication()).getAccountUnreadCount(Accounts.this, account, mListener); - + if (account instanceof Account) + { + Account realAccount = (Account)account; + MessagingController.getInstance(getApplication()).getAccountStats(Accounts.this, realAccount, mListener); + } + else if (account instanceof SearchAccount) + { + SearchAccount searchAccount = (SearchAccount)account; + + MessagingController.getInstance(getApplication()).searchLocalMessages(searchAccount, null, mListener); + } } } @@ -468,20 +475,24 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC } } - private void onOpenAccount(Account account) + private void onOpenAccount(BaseAccount account) { if (account instanceof SearchAccount) { SearchAccount searchAccount = (SearchAccount)account; MessageList.actionHandle(this, searchAccount.getDescription(), "", searchAccount.isIntegrate(), searchAccount.getRequiredFlags(), searchAccount.getForbiddenFlags()); } - else if (K9.FOLDER_NONE.equals(account.getAutoExpandFolderName())) - { - FolderList.actionHandleAccount(this, account); - } else { - MessageList.actionHandleFolder(this, account, account.getAutoExpandFolderName()); + Account realAccount = (Account)account; + if (K9.FOLDER_NONE.equals(realAccount.getAutoExpandFolderName())) + { + FolderList.actionHandleAccount(this, realAccount); + } + else + { + MessageList.actionHandleFolder(this, realAccount, realAccount.getAutoExpandFolderName()); + } } } @@ -617,7 +628,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC public void onItemClick(AdapterView parent, View view, int position, long id) { - Account account = (Account)parent.getItemAtPosition(position); + BaseAccount account = (BaseAccount)parent.getItemAtPosition(position); onOpenAccount(account); } @@ -719,7 +730,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC getMenuInflater().inflate(R.menu.accounts_context, menu); AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - Account account = (Account) mAdapter.getItem(info.position); + BaseAccount account = mAdapter.getItem(info.position); if (account instanceof SearchAccount) { for (int i = 0; i < menu.size(); i++) @@ -733,9 +744,9 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC } } - class AccountsAdapter extends ArrayAdapter + class AccountsAdapter extends ArrayAdapter { - public AccountsAdapter(Account[] accounts) + public AccountsAdapter(BaseAccount[] accounts) { super(Accounts.this, 0, accounts); } @@ -743,7 +754,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC @Override public View getView(int position, View convertView, ViewGroup parent) { - Account account = getItem(position); + BaseAccount account = getItem(position); View view; if (convertView != null) { @@ -760,6 +771,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC holder.description = (TextView) view.findViewById(R.id.description); holder.email = (TextView) view.findViewById(R.id.email); holder.newMessageCount = (TextView) view.findViewById(R.id.new_message_count); + holder.flaggedMessageCount = (TextView) view.findViewById(R.id.flagged_message_count); holder.chip = view.findViewById(R.id.chip); @@ -767,10 +779,9 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC } AccountStats stats = accountStats.get(account.getUuid()); - if (stats != null) + if (stats != null && account instanceof Account) { - holder.email.setText(SizeFormatter.formatSize(Accounts.this, stats.size) - + (stats.flaggedMessageCount > 0 ? " / " + stats.flaggedMessageCount + "*" : "")); + holder.email.setText(SizeFormatter.formatSize(Accounts.this, stats.size)); } else { @@ -796,30 +807,37 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC unreadMessageCount = stats.unreadMessageCount; holder.newMessageCount.setText(Integer.toString(unreadMessageCount)); holder.newMessageCount.setVisibility(unreadMessageCount > 0 ? View.VISIBLE : View.GONE); + + holder.flaggedMessageCount.setText(Integer.toString(stats.flaggedMessageCount)); + holder.flaggedMessageCount.setVisibility(stats.flaggedMessageCount > 0 ? View.VISIBLE : View.GONE); } else { - //holder.newMessageCount.setText("-"); holder.newMessageCount.setVisibility(View.GONE); + holder.flaggedMessageCount.setVisibility(View.GONE); } - if (!(account instanceof SearchAccount)) + if (account instanceof Account) { - holder.chip.setBackgroundResource(K9.COLOR_CHIP_RES_IDS[account.getAccountNumber() % K9.COLOR_CHIP_RES_IDS.length]); - } + Account realAccount = (Account)account; + holder.chip.setBackgroundResource(K9.COLOR_CHIP_RES_IDS[realAccount.getAccountNumber() % K9.COLOR_CHIP_RES_IDS.length]); + if (unreadMessageCount == null) + { + holder.chip.getBackground().setAlpha(0); + } + else if (unreadMessageCount == 0) + { + holder.chip.getBackground().setAlpha(127); + } + else + { + holder.chip.getBackground().setAlpha(255); + } - if (unreadMessageCount == null) + } + else { holder.chip.getBackground().setAlpha(0); } - else if (unreadMessageCount == 0) - { - holder.chip.getBackground().setAlpha(127); - } - else - { - holder.chip.getBackground().setAlpha(255); - } - return view; } @@ -829,50 +847,8 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC public TextView description; public TextView email; public TextView newMessageCount; + public TextView flaggedMessageCount; public View chip; } } - - private class SearchAccount extends Account - { - private Flag[] mRequiredFlags = null; - private Flag[] mForbiddenFlags = null; - private String email = null; - private boolean mIntegrate = false; - - private SearchAccount(Context context, boolean integrate, Flag[] requiredFlags, Flag[] forbiddenFlags) - { - super(context); - mRequiredFlags = requiredFlags; - mForbiddenFlags = forbiddenFlags; - mIntegrate = integrate; - } - - @Override - public synchronized String getEmail() - { - return email; - } - - @Override - public synchronized void setEmail(String email) - { - this.email = email; - } - - public Flag[] getRequiredFlags() - { - return mRequiredFlags; - } - - public Flag[] getForbiddenFlags() - { - return mForbiddenFlags; - } - - public boolean isIntegrate() - { - return mIntegrate; - } - } } diff --git a/src/com/fsck/k9/activity/FolderList.java b/src/com/fsck/k9/activity/FolderList.java index 736801d01..e83471c3c 100644 --- a/src/com/fsck/k9/activity/FolderList.java +++ b/src/com/fsck/k9/activity/FolderList.java @@ -343,7 +343,7 @@ public class FolderList extends K9ListActivity MessagingController.getInstance(getApplication()).addListener(mAdapter.mListener); //mAccount.refresh(Preferences.getPreferences(this)); - MessagingController.getInstance(getApplication()).getAccountUnreadCount(this, mAccount, mAdapter.mListener); + MessagingController.getInstance(getApplication()).getAccountStats(this, mAccount, mAdapter.mListener); onRefresh(!REFRESH_REMOTE); @@ -759,8 +759,12 @@ public class FolderList extends K9ListActivity private ActivityListener mListener = new ActivityListener() { @Override - public void accountStatusChanged(Account account, AccountStats stats) + public void accountStatusChanged(BaseAccount account, AccountStats stats) { + if (!account.equals(mAccount)) + { + return; + } mUnreadMessageCount = stats.unreadMessageCount; mHandler.refreshTitle(); } @@ -1181,6 +1185,7 @@ public class FolderList extends K9ListActivity holder = new FolderViewHolder(); holder.folderName = (TextView) view.findViewById(R.id.folder_name); holder.newMessageCount = (TextView) view.findViewById(R.id.folder_unread_message_count); + holder.flaggedMessageCount = (TextView) view.findViewById(R.id.folder_flagged_message_count); holder.folderStatus = (TextView) view.findViewById(R.id.folder_status); holder.chip = view.findViewById(R.id.chip); holder.rawFolderName = folder.name; @@ -1217,18 +1222,8 @@ public class FolderList extends K9ListActivity statusText = getString(R.string.folder_push_active_symbol) + " "+ statusText; } - if (folder.flaggedMessageCount > 0) - { - if (statusText == null) - { - statusText = ""; - } - statusText += " / " + folder.flaggedMessageCount + "*"; - } if (statusText != null) { - - holder.folderStatus.setText(statusText); holder.folderStatus.setVisibility(View.VISIBLE); } @@ -1248,6 +1243,17 @@ public class FolderList extends K9ListActivity { holder.newMessageCount.setVisibility(View.GONE); } + + if (folder.flaggedMessageCount > 0) + { + holder.flaggedMessageCount.setText(Integer + .toString(folder.flaggedMessageCount)); + holder.flaggedMessageCount.setVisibility(View.VISIBLE); + } + else + { + holder.flaggedMessageCount.setVisibility(View.GONE); + } holder.chip.setBackgroundResource(K9.COLOR_CHIP_RES_IDS[mAccount.getAccountNumber() % K9.COLOR_CHIP_RES_IDS.length]); @@ -1407,6 +1413,7 @@ public class FolderList extends K9ListActivity public TextView folderStatus; public TextView newMessageCount; + public TextView flaggedMessageCount; public String rawFolderName; public View chip; diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java index 15a5b3c89..bcc89a0cb 100644 --- a/src/com/fsck/k9/activity/MessageList.java +++ b/src/com/fsck/k9/activity/MessageList.java @@ -462,7 +462,7 @@ public class MessageList } else if (mQueryString != null) { - mController.searchLocalMessages(mQueryString, null, mIntegrate, mQueryFlags, mForbiddenFlags, mAdapter.mListener); + mController.searchLocalMessages(null, mQueryString, null, mIntegrate, mQueryFlags, mForbiddenFlags, mAdapter.mListener); } mHandler.refreshTitle();