From 7a5b4d27e11f70891dcdbeb5e810b0afeb59f485 Mon Sep 17 00:00:00 2001 From: Daniel Applebaum Date: Sat, 7 Feb 2009 19:41:33 +0000 Subject: [PATCH] Changed terminology from Thread to Sort. Added sorting on sender, flag, unread and attachments. Really, really, needs better icons. --- res/drawable/ic_menu_reverse_sort.png | Bin 0 -> 1095 bytes res/drawable/ic_menu_set_sort.png | Bin 0 -> 2074 bytes res/menu/folder_message_list_option.xml | 55 ++++-- res/values/strings.xml | 29 ++- .../android/email/MessagingController.java | 62 ++++++- .../email/activity/FolderMessageList.java | 170 ++++++++++++------ 6 files changed, 246 insertions(+), 70 deletions(-) create mode 100644 res/drawable/ic_menu_reverse_sort.png create mode 100644 res/drawable/ic_menu_set_sort.png diff --git a/res/drawable/ic_menu_reverse_sort.png b/res/drawable/ic_menu_reverse_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..aaf4ce512ab156f78749ab374d3a36712fc893fc GIT binary patch literal 1095 zcmV-N1i1T&P)F9d_#ics!o6JBT7XWvs8SLy{!eY&O_zHVh37aYvA* zyU_Ufc=;59!5~wozrP=WKmdXuz~yp5(=@JyB}F1e;y)LF!{LC>=Yu3k=<4cXPap`8 zBngyK3=9l#Et(@aayQ8tfv8(bOifK;dwUz{bQU3DvcHYm zkiX8GQX6p&3?hs0; zW!0!qtsjjnMo6O|X1U*^07~w|sO`y9HNN5m9^L_-i=DVgkmJ*1a<`Fbz=a6o*I0;S zE%d;Z003KCTln+y&pkc2$Bk?@3%A>i>FH?zz|71H-j2LAWp{akO3g1ctX8q!q-Hku zh5;V95x3Fr_TJt1Q$fJS#zu2eJddx|+f}pjN7DeFvb=n$e*rKke*vrRYk-q;TR8v# N002ovPDHLkV1l3|@&*6^ literal 0 HcmV?d00001 diff --git a/res/drawable/ic_menu_set_sort.png b/res/drawable/ic_menu_set_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..ef076b6933203fe372eb8583162191773fd75939 GIT binary patch literal 2074 zcmV+#2<7*QP)yUh(AL&QTU*<*fq!N# zUlbclF7 zPSZlIz#67jJ>d$w^YF6dN{dAdyHE+*eamgQ_w<9L!6hNJj+E zDi5Buo-D@{gsIUf`*n8S2|z`4Mb@1qB_%i<4ouVJ-o1MqJ$jTACr&J#Lh*PUx7&?j z7$lR)%zQ8yBp3`5>4@M9_=sr?(`oW>=pmc7Y~uBwzm8*-BMne(;3Z2URm#fB@OV7b z*4Es^~SW=A?Alu9Wip{%S7(=^$* zaU-djlupk~lMi@$M8~6)mX@-4^JYxbWMpK7l9Cb(!yq1y6OYH~>gpm82ox7arBvwY z>0x|)Jc~YioA>hNf4`)rriOLv)=@{D-v7`2jG(@NPx1+!a-=9PFDLdm#@OH(JKx!v zS-W-X7WePpCzVPuIXTJL*x3Bo<}0V8(I}mN=*)Z{of^$rcez}+UG6M?`vN{Glwo}V zACZoTCXJ*x%_q7Wc|1aUd;6TweeK#chK7b18yn-;v13cKKzVsNo40OeWMqWd*;#6+ z$+s9sWYq>&^Ri_O`$e*JoSdwYq;<5X5wF5Lp@aplStCMPF}#bQLG(F~0Y z!yqx8Pz(IKz=sQ9q!#jtd=^`lT4>+CeXLuz4u`{m!{IwrBWD4!+ybph%^Av1zI3CHz**BQNp6C(c$4?rl+Sd zO%si&8cAbNME)uwABzZp2RO0_ji-SNOB{<5AdyJ0%CSm`qayNHL_V}E_)FWiBLF>L z^~?vlXyA($ARG*9RaupaNI&qNs@AJ&r-=N_2B=$A8&&nNjhgu~anZmRoXEn#umXt4 zT_7|Sp9;HNE=siI2iBY&Pzcy9B1cs9Ora8DIfrurz;CK*$QSUPZ*OnM?RMkBr3k2M zwTS#8!wHd(EbF|q^TnONE(Uz0BQhsBE{Hy{N1~E@viokSCmw! z6@^MgWE{AVK70F%+o)>D?h8u^scG=@0iR<5o5n8zVc_pTgR1Tg2gCma8i90S@|=jo zt-q^*>2&BjaNxkXUE6oPud1(Dk!dlxfQ16jOCjqAe`bXXcl+AWsM{AbkFtxAFJwZ;5XL(^S~>W?EGkyn9FZELSt{C>?Ib%Bto-c38Zy_vOQ0%SS~A~Ti{zqP=As;X~W7TIH+nFd0Z z&-B~76p@YyyPI~?eY1OI1;|6A_f+*w5%~&u!2&oSA|Xq_$8&zl!j_z#wn6@Vt616;XMu1q zoB?J3q_vm}?2~_d0xpOXe|m{w;BWP3&h2g9yK({)s&{e)0_g4QC7Dce>Cz=!xH4Vq z)vH&NRzwaJ<=YlOLZ?F+!0C!IO`Ehv{jGj3U%t$}JNL3X%XL*uJetUVap6jIS=%a3 zJ6&=QMmi!HKgeAR2g6J}n#jxlMV8UUSwK}Y8n=qKyxp{1>*NBqJNMP@tJyp?3@%)_ zka=k>rruxld!SHjFgo&kKeiG|EBP`l60B3GndW*X=e@x!v*=h z)PIStNG+81iG1}HU3ur0N>&9KlCS@_mKHYo&W#<07*qoM6N<$ Ef*>31Z2$lO literal 0 HcmV?d00001 diff --git a/res/menu/folder_message_list_option.xml b/res/menu/folder_message_list_option.xml index f163c1c7e..1c5800848 100644 --- a/res/menu/folder_message_list_option.xml +++ b/res/menu/folder_message_list_option.xml @@ -1,17 +1,48 @@ - - + + + + + + + + + + + + - + diff --git a/res/values/strings.xml b/res/values/strings.xml index 81e790c28..201815f3a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -60,8 +60,8 @@ Add attachment Dump settings Empty Trash - Thread - Unthread + Choose sort + Reverse sort About Account options @@ -115,7 +115,7 @@ Welcome to K-9 Mail setup. K-9 is an open source email client for Android based * Better IMAP support * Saving attachments to SD * Empty Trash - * Threading + * Message sorting * ...and more \nPlease note that K-9 does not support most free hotmail accounts and, like many email clients, has some quirks when talking to Microsoft Exchange. \nSubmit bug reports, contribute new features and ask questions at http://code.google.com/p/k9mail @@ -356,6 +356,27 @@ Welcome to K-9 Mail setup. K-9 is an open source email client for Android based Deleted Items Folder Set the deleted items folder + + Earliest messages first + Latest messages first + Sender alphabetical + Sender reverse alphabetical + Subject alphabetical + Subject reverse alphabetical + Flagged messages first + Unflagged messages first + Unread messages first + Read messages first + Messages with attachments first + Messages without attachments first + + Sort by... + Date + Sender + Subject + Flag + Read/unread + Attachments Remove The account \"%s\" will be removed from Email. @@ -376,6 +397,6 @@ Welcome to K-9 Mail setup. K-9 is an open source email client for Android based Message\u000AK, N - Next Message\u000AZ - Zoom Out\u000AShift-Z - Zoom In\u000aG - Flag Del (or D) - Delete\u000AR - - Reply\u000AA - Reply All\u000AC - Compose\u000AF - Forward\u000aG - Flag\u000AT - Thread\u000AQ + Reply\u000AA - Reply All\u000AC - Compose\u000AF - Forward\u000aG - Flag\u000AO - Sort type\u000AI - Sort order\u000AQ - Return to Accounts diff --git a/src/com/android/email/MessagingController.java b/src/com/android/email/MessagingController.java index b55ed78b8..2637d2aac 100644 --- a/src/com/android/email/MessagingController.java +++ b/src/com/android/email/MessagingController.java @@ -108,7 +108,44 @@ public class MessagingController implements Runnable { //private Set mListeners = Collections.synchronizedSet(new HashSet()); private Set mListeners = new CopyOnWriteArraySet(); - private boolean threading = false; + private HashMap sortAscending = new HashMap(); + + public enum SORT_TYPE { + SORT_DATE(R.string.sort_earliest_first, R.string.sort_latest_first, false), + SORT_SUBJECT(R.string.sort_subject_alpha, R.string.sort_subject_re_alpha, true), + SORT_SENDER(R.string.sort_sender_alpha, R.string.sort_sender_re_alpha, true), + SORT_UNREAD(R.string.sort_unread_first, R.string.sort_unread_last, true), + SORT_FLAGGED(R.string.sort_flagged_first, R.string.sort_flagged_last, true), + SORT_ATTACHMENT(R.string.sort_attach_first, R.string.sort_unattached_first, true); + + private int ascendingToast; + private int descendingToast; + private boolean defaultAscending; + + SORT_TYPE(int ascending, int descending, boolean ndefaultAscending) + { + ascendingToast = ascending; + descendingToast = descending; + defaultAscending = ndefaultAscending; + } + + public int getToast(boolean ascending) + { + if (ascending) + { + return ascendingToast; + } + else + { + return descendingToast; + } + } + public boolean isDefaultAscending() + { + return defaultAscending; + } + }; + private SORT_TYPE sortType = SORT_TYPE.SORT_DATE; private MessagingListener checkMailListener = null; @@ -2503,13 +2540,28 @@ s * critical data as fast as possible, and then we'll fill in the de } } - public boolean isThreading() + public SORT_TYPE getSortType() { - return threading; + return sortType; } - public void setThreading(boolean threading) + public void setSortType(SORT_TYPE sortType) { - this.threading = threading; + this.sortType = sortType; + } + + public boolean isSortAscending(SORT_TYPE sortType) + { + Boolean sortAsc = sortAscending.get(sortType); + if (sortAsc == null) + { + return sortType.isDefaultAscending(); + } + else return sortAsc; + } + + public void setSortAscending(SORT_TYPE sortType, boolean nsortAscending) + { + sortAscending.put(sortType, nsortAscending); } } diff --git a/src/com/android/email/activity/FolderMessageList.java b/src/com/android/email/activity/FolderMessageList.java index 75f2d85f1..6ce637ffb 100644 --- a/src/com/android/email/activity/FolderMessageList.java +++ b/src/com/android/email/activity/FolderMessageList.java @@ -1,10 +1,12 @@ package com.android.email.activity; +import java.lang.reflect.Array; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.EnumMap; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; @@ -41,6 +43,7 @@ import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import com.android.email.Account; import com.android.email.Email; import com.android.email.MessagingController; +import static com.android.email.MessagingController.SORT_TYPE; import com.android.email.MessagingListener; import com.android.email.R; import com.android.email.Utility; @@ -130,8 +133,6 @@ public class FolderMessageList extends ExpandableListActivity private LayoutInflater mInflater; private Account mAccount; - - private Menu optionsMenu = null; /** @@ -152,7 +153,9 @@ public class FolderMessageList extends ExpandableListActivity private DateFormat timeFormat = null; - private boolean thread = false; + private SORT_TYPE sortType = SORT_TYPE.SORT_DATE; + private boolean sortAscending = true; + private boolean sortDateAscending = false; private DateFormat getDateFormat() { @@ -577,6 +580,9 @@ public class FolderMessageList extends ExpandableListActivity { super.onResume(); clearFormats(); + sortType = MessagingController.getInstance(getApplication()).getSortType(); + sortAscending = MessagingController.getInstance(getApplication()).isSortAscending(sortType); + sortDateAscending = MessagingController.getInstance(getApplication()).isSortAscending(SORT_TYPE.SORT_DATE); MessagingController.getInstance(getApplication()).addListener( mAdapter.mListener); @@ -585,9 +591,7 @@ public class FolderMessageList extends ExpandableListActivity NotificationManager notifMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notifMgr.cancel(mAccount.getAccountNumber()); - thread = MessagingController.getInstance(getApplication()).isThreading(); - - + } @Override @@ -644,7 +648,8 @@ public class FolderMessageList extends ExpandableListActivity case KeyEvent.KEYCODE_C: { onCompose(); return true;} case KeyEvent.KEYCODE_Q: { onAccounts(); return true; } case KeyEvent.KEYCODE_S: { onEditAccount(); return true; } - case KeyEvent.KEYCODE_T: { onToggleThread(); return true; } + case KeyEvent.KEYCODE_O: { onCycleSort(); return true; } + case KeyEvent.KEYCODE_I: { onToggleSortAscending(); return true; } case KeyEvent.KEYCODE_H: { Toast toast = Toast.makeText(this, R.string.message_list_help_key, Toast.LENGTH_LONG); toast.show(); @@ -785,19 +790,57 @@ public class FolderMessageList extends ExpandableListActivity MessageCompose.actionCompose(this, mAccount); } - private void onToggleThread() + private void changeSort(SORT_TYPE newSortType) { - thread = !thread; - - for (FolderInfoHolder folder : mAdapter.mFolders) - { - Collections.sort(folder.messages); - } - mAdapter.notifyDataSetChanged(); - setMenuThread(); - MessagingController.getInstance(getApplication()).setThreading(thread); - + sortType = newSortType; + MessagingController.getInstance(getApplication()).setSortType(sortType); + sortAscending = MessagingController.getInstance(getApplication()).isSortAscending(sortType); + sortDateAscending = MessagingController.getInstance(getApplication()).isSortAscending(SORT_TYPE.SORT_DATE); + reSort(); } + + private void reSort() + { + int toastString = sortType.getToast(sortAscending); + + Toast toast = Toast.makeText(this, toastString, Toast.LENGTH_SHORT); + toast.show(); + + for (FolderInfoHolder folder : mAdapter.mFolders) + { + Collections.sort(folder.messages); + } + mAdapter.notifyDataSetChanged(); + + } + + private void onCycleSort() + { + SORT_TYPE[] sorts = SORT_TYPE.values(); + int curIndex = 0; + for (int i = 0; i < sorts.length; i++) + { + if (sorts[i] == sortType) + { + curIndex = i; + break; + } + } + curIndex++; + if (curIndex == sorts.length) + { + curIndex = 0; + } + + changeSort(sorts[curIndex]); + } + + private void onToggleSortAscending() + { + sortAscending = !sortAscending; + MessagingController.getInstance(getApplication()).setSortAscending(sortType, sortAscending); + reSort(); + } private void onDelete(MessageInfoHolder holder) { @@ -908,41 +951,43 @@ public class FolderMessageList extends ExpandableListActivity case R.id.account_settings: onEditAccount(); return true; - case R.id.thread: - onToggleThread(); + case R.id.set_sort_date: + changeSort(SORT_TYPE.SORT_DATE); return true; - case R.id.empty_trash: - onEmptyTrash(mAccount); - return true; + case R.id.set_sort_subject: + changeSort(SORT_TYPE.SORT_SUBJECT); + return true; + case R.id.set_sort_sender: + changeSort(SORT_TYPE.SORT_SENDER); + return true; + case R.id.set_sort_flag: + changeSort(SORT_TYPE.SORT_FLAGGED); + return true; + case R.id.set_sort_unread: + changeSort(SORT_TYPE.SORT_UNREAD); + return true; + case R.id.set_sort_attach: + changeSort(SORT_TYPE.SORT_ATTACHMENT); + return true; + case R.id.reverse_sort: + onToggleSortAscending(); + return true; + case R.id.empty_trash: + onEmptyTrash(mAccount); + return true; default: return super.onOptionsItemSelected(item); - } - } + } + } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.folder_message_list_option, menu); - optionsMenu = menu; - setMenuThread(); return true; } - - private void setMenuThread() - { - Menu menu = optionsMenu; - if (menu != null) - { - MenuItem threadItem = menu.findItem(R.id.thread); - if (threadItem != null) - { - threadItem.setTitle(thread ? R.string.unthread_action : R.string.thread_action); - threadItem.setIcon(thread ? R.drawable.ic_menu_unthread : R.drawable.ic_menu_thread); - } - } - } @Override public boolean onContextItemSelected(MenuItem item) @@ -1082,6 +1127,7 @@ public class FolderMessageList extends ExpandableListActivity } } + private String truncateStatus(String mess) { if (mess != null && mess.length() > 27) @@ -1977,9 +2023,13 @@ public class FolderMessageList extends ExpandableListActivity } } + @Override public int compareTo(MessageInfoHolder o) { - if (thread) + int ascender = (sortAscending ? 1 : -1); + int comparison = 0; + + if (sortType == SORT_TYPE.SORT_SUBJECT) { if (compareSubject == null) { @@ -1989,15 +2039,35 @@ public class FolderMessageList extends ExpandableListActivity { o.compareSubject = stripPrefixes(o.subject).toLowerCase(); } - int subjCompare = this.compareSubject.compareTo(o.compareSubject); - if (subjCompare != 0) - { - return subjCompare; - } + comparison = this.compareSubject.compareTo(o.compareSubject); } - - return this.compareDate.compareTo(o.compareDate) * -1; - } + else if (sortType == SORT_TYPE.SORT_SENDER) + { + comparison = this.sender.toLowerCase().compareTo(o.sender.toLowerCase()); + } + else if (sortType == SORT_TYPE.SORT_FLAGGED) + { + comparison = (this.flagged ? 0 : 1) - (o.flagged ? 0 : 1); + + } + else if (sortType == SORT_TYPE.SORT_UNREAD) + { + comparison = (this.read ? 1 : 0) - (o.read ? 1 : 0); + } + else if (sortType == SORT_TYPE.SORT_ATTACHMENT) + { + comparison = (this.hasAttachments ? 0 : 1) - (o.hasAttachments ? 0 : 1); + + } + if (comparison != 0) + { + return comparison * ascender; + } + + int dateAscender = (sortDateAscending ? 1 : -1); + + return this.compareDate.compareTo(o.compareDate) * dateAscender; + } Pattern pattern = null; String patternString = "^ *(re|fw|fwd): *"; private String stripPrefixes(String in)