From 836429d700faf24e90badf7b4d22ca9abcea5f7c Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 12 Jan 2009 19:29:45 +0000 Subject: [PATCH] Astrid 1.11.3 - deleted unused files - fix bug with tasks w/ notif flags but no notifications - added sorting options --- AndroidManifest.xml | 4 +- res/drawable/bullet_blue.png | Bin 312 -> 0 bytes res/drawable/bullet_error.png | Bin 454 -> 0 bytes res/drawable/bullet_orange.png | Bin 283 -> 0 bytes res/drawable/bullet_pink.png | Bin 305 -> 0 bytes res/drawable/bullet_red.png | Bin 287 -> 0 bytes res/drawable/bullet_star.png | Bin 374 -> 0 bytes res/drawable/bullet_white.png | Bin 232 -> 0 bytes res/drawable/highlight_longpress.9.png | Bin 3017 -> 0 bytes res/drawable/highlight_pressed.9.png | Bin 1103 -> 0 bytes res/drawable/highlight_selected.9.png | Bin 1145 -> 0 bytes res/drawable/transparent_button.xml | 10 -- .../transparent_button_transition.xml | 21 --- res/layout/task_edit.xml | 2 + res/layout/task_view.xml | 1 + res/values/strings.xml | 8 +- src/com/timsu/astrid/activities/TagList.java | 32 +++- src/com/timsu/astrid/activities/TaskList.java | 166 ++++++++++++++++-- .../astrid/data/task/TaskController.java | 7 +- .../astrid/data/task/TaskModelForList.java | 40 +---- 20 files changed, 203 insertions(+), 88 deletions(-) delete mode 100644 res/drawable/bullet_blue.png delete mode 100644 res/drawable/bullet_error.png delete mode 100644 res/drawable/bullet_orange.png delete mode 100644 res/drawable/bullet_pink.png delete mode 100644 res/drawable/bullet_red.png delete mode 100644 res/drawable/bullet_star.png delete mode 100644 res/drawable/bullet_white.png delete mode 100644 res/drawable/highlight_longpress.9.png delete mode 100644 res/drawable/highlight_pressed.9.png delete mode 100644 res/drawable/highlight_selected.9.png delete mode 100644 res/drawable/transparent_button.xml delete mode 100644 res/drawable/transparent_button_transition.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fd7a2e5e5..bffacf4d4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="47" + android:versionName="1.11.3"> diff --git a/res/drawable/bullet_blue.png b/res/drawable/bullet_blue.png deleted file mode 100644 index 0b7b765573fbbb29d1423a01347eb4724e2af92a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBj4G4t6W0FWd7$%6E9WIEGl9emiM5 z=b-=w*Zw32fh&i+Tw)Hyv7h96B*ytdMDl=|@eNJ0vULe8g4~}!EjsyoXM?NC+=|oD zGCSID7n}=J_sx37&al=$HTkeWM8ej7O~?I7A#yvPz6j!E&^fe{_gQU4X8&Vf*455z z0%5Zgyy~xQej|MN+Zu^2wi>PRcN^e_Qb|yHTjOOghro1+%3eFJ|M5HR9`H`l4w_VxuP+1ggr}>Y%Q~loCIA`NY$5;v diff --git a/res/drawable/bullet_error.png b/res/drawable/bullet_error.png deleted file mode 100644 index bca2b491fd4a72918c37eb218bf9655d7f514750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP);<5v0zO%9O+HCOhCe@lCtqI|U`n(Bw>E`n0X60GiU=_L{j`ZeTrWl7@6TVgmzQ|3 z5;Op46VsoczbZwwqJ7S==^_3_&=Ox0MY;dOCY;|ap-3z08F!}8RFQf3;+NC07*qoM6N<$g0j}hYXATM diff --git a/res/drawable/bullet_orange.png b/res/drawable/bullet_orange.png deleted file mode 100644 index fa63024e55bdde1851f2067dee1a6cad2e9115ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=;^>lFzu{izqk|8%^q0F(5@h6w@ zuSbE=i9QOwKvPc#-iPCap~BwXFHIr_gU^WCH%x0(Cm8h3e{9o}5`YUO%{ zPiLR-*D%CfK42<(c~V-?1q(}8{p2N#A`c~!wa4X-$LfsZ0%WH-1^Zy?%r3<3e~Rbycg=S_Egdz d?>~Yc*m~Z+JF!m3&mHJ+22WQ%mvv4FO#s^$Z2kZM diff --git a/res/drawable/bullet_pink.png b/res/drawable/bullet_pink.png deleted file mode 100644 index 811bc8fa6ccd2d95002677a13e2b95bec16e3bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBj4G4h{wtW5wV?pwLE77sn8b({Cs3 z8uni2 z_KQ(lnY`x-XDY#DW^u;K&o-|vHe`x?xbw1zYx$2><(A#;6QU!sSfhO( ioL~suuJh6Vfb_?jd)=>7iZy|bXYh3Ob6Mw<&;$Tq>~Ep~ diff --git a/res/drawable/bullet_star.png b/res/drawable/bullet_star.png deleted file mode 100644 index 475c58a88ee6532ae544e0661572543b99ae9e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBj4G4t7iFhWT4g1BJeMx;TbdoPIlb zV-{1Ofb07`yfaL@dp8PjdnzinL}cl=McjNMuk)wL!Op?^|3Uj3T1$OrnJDI^uT)T* z+WO}6+iL5{TD={5H@BE~2d;SF1U%M^dTC4oMTB~p(M08fe)eWl!gx0@yOczY$p6JUu zr8&CK{0+~E-Fy*Cm=sQJb2C%Dcdos_Q*>oW>StRP?@W2G=kW*hKRryI+~(`p0}KHM MPgg&ebxsLQ04d#zz5oCK diff --git a/res/drawable/bullet_white.png b/res/drawable/bullet_white.png deleted file mode 100644 index b6648ae10b57c7dbead602148534b18ed08f35a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 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 LNkvXXu0mjflqZiH diff --git a/res/drawable/highlight_pressed.9.png b/res/drawable/highlight_pressed.9.png deleted file mode 100644 index 9bd2b50c0540394c1b0ad2b650878daf88b68171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1103 zcmV-V1hD&wP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOM- z0wp++}2G+cZs+0KjPm zAi&bL7Z(8M|LNHQY>ce}0OvDslG~9fun2HbU;%IuVA1Wz|K{a3#xOsQk3Q8HTl9o87v8s8`F{R&*Jz_;%=5|$e}^K5LuFf+eE zqdkW9Oc@7onm6PC;O(w6GaM!?W@H#k@?F&T=Bzcd{d5>E`xBRBQ$`GrFr_}Brg-b) zI&w$oWFeF>!!n3Kj65CGfH8}~QREiugUm2kA}9#~)*4ERZzc`0)1eOvCxJ{SGW@Tx zhC-afw8oK`x;lh{g^N(rg6LURRRjHkVd_nUED>ULL>$>?5YiXur>R4cbzzaY_uDY% z^|J%47^M)Q%vVI4G-KSIdF%TlhGA%r2!RYeJZ8EkLaI3@-i>~9 z4xk+rH>n`RD0mx)?Sc3;;`ew0y$6J(Xw5+Ak0ehds0z8SSXNGp^4bVSyhvJuH5-mK z@es;lr|~44A!e4dlpqR$gHA<%G}0kW#3M4t5`;5*ge-@;M?H%N4IO{b-HrMGy%|dO4)}<05WCr0#K$?Y6 z!b{H^fGI>s3vpXi*zht{Nf0W!6kdmvFtL@of+iVqBa%q{OdUFs#w%%b^p#eQ)gjO4 zcp|3>Q|(x6nIpvdAx)||SqkkP7MseakwVsbphxPMbj$x}0eNp9wGd)z%KC&Jso_X9 zNhLBmB#O4Hh4vm;JWc9nnVDuwUm8W*dcdbJfus83L9b!;op;Y?tUbwEpFvvcG(A>M z5y(FRC%aE4I{AcCI8lcliD`W^E2mX)z(Itp1E`2Ug-|5(?CqKtyhcb`k`Os%x^fC9 z!vragnQrue5h)rY%_^rFm|k{qEr?Czm$b0=FdyGOL^lG_B~=zlOMzfEN}v#8Hqas= z5yF}N5LS=7!K*N(obrD7R_oTx^Gop^Yjh8qrO-+$b0vP%ppKCu#D*P_r8^QLvCdrW zgZ2@U8r0=D4UXAnMcztB5dBXf`pZhjgb<0I6m-)=Mi?s>F~chV3;ao#wu6lnsyE+^ zepS*7uP;d|pZcMwuyt*rs(|@fT}S VG&18L!1VwC002ovPDHLkV1ma5=W+l5 diff --git a/res/drawable/highlight_selected.9.png b/res/drawable/highlight_selected.9.png deleted file mode 100644 index ecf0cada9ffd810fc9afc5bc7448184e16798ffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1145 zcmV-<1cv*GP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOM- z0wp2vhI=Fc00a3+L_t(&-o08$j@vL0EEz3826FIxA%Dpu^1__*rMzJd0c3y;CANeZ&@qkbEB>HJrBKsBmnUCZC47rVhXHLyLa+vrTIVFYH&S}2MWCJ zP)z{v=O?x|0hS%9UEAY1jPvLkdsySaICo@wS724(`>$P$^X@>){pF>4ad8B071RO6 zY9Z?u!FfI2F6Tvn_3!Q03An+wXdrak8GAizmjHbU&ebu2xZA}CeX}&5n??QZjKLxdeC908I>?rnZx8X396KX55X89 zLr0QOj;11L&oj!+;102T2t+oYlM=-~c z;e2V;&C*2rg^o(7(|v}T)>1P`lMw;4KIg>8C9CCnp_gPZCMn9G0UAX=5E|qx_1~+> zJcEqLqAfz2I6H!}pFvI>Dl>tmHz=%`mFCW1VNp;M`e|nY8`N@}i;y_w{RkbrsWY6Z zwKv5e5Sm9_VNjC;Td=5gO5n?H)9KN(#6N03lEmqI1=knfIm}oYAqts~jOAH6m{|A9NR-P4v^vi$>?tb5^U-~c zlko>aY-A~&4y>f213Aa)!(ZF>oO!O4vI0XyIdz`1lq=0R5pv??A;w8dCmocGcCVmR z8A6^AvZmkOTzsZHtcyuNQsgr+FdKoJjOy1gNSIH&_D8!B#}r1gd&R;0!6kzOD3__<$4N8B^*|R zADnA!0PrYRljR&uys|ApX8K$oS7HjmluWg}S3Ga)A9lfkcuzB$(O!{%Ji$yM*e^<~ zZT)i;su^WuuoxXFlO#?l{vK<)PNswtvtO`k&)iQ>V zz{p}%+a4Ox2Si8|$-;dW9T_7Zk(#D$+b~TN@I{|d{>Nk5whjLP<(^(rJ%GIP00000 LNkvXXu0mjfD4PCX diff --git a/res/drawable/transparent_button.xml b/res/drawable/transparent_button.xml deleted file mode 100644 index 8dd9d38ac..000000000 --- a/res/drawable/transparent_button.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/res/drawable/transparent_button_transition.xml b/res/drawable/transparent_button_transition.xml deleted file mode 100644 index 8e4478192..000000000 --- a/res/drawable/transparent_button_transition.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/res/layout/task_edit.xml b/res/layout/task_edit.xml index c2287020c..7bc9b9aa7 100644 --- a/res/layout/task_edit.xml +++ b/res/layout/task_edit.xml @@ -43,6 +43,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/name_hint" + android:autoText="true" android:capitalize="words"/> diff --git a/res/layout/task_view.xml b/res/layout/task_view.xml index 5ea9a1b55..94f716991 100644 --- a/res/layout/task_view.xml +++ b/res/layout/task_view.xml @@ -126,6 +126,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="5px" + android:autoLink="all" android:textAppearance="?android:attr/textAppearanceSmall" android:colorForeground="@color/view_table_values" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 6227f532d..817470e30 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -86,7 +86,7 @@ Add Tags - Filters + Display More Settings Help @@ -96,10 +96,14 @@ Start Timer Stop Timer - Filters + Sort/Filters Hidden/Blocked Tasks Completed Tasks Tagged \'%s\' + Auto Sort + Sort By Name + Sort By Due Date + Sort Reverse diff --git a/src/com/timsu/astrid/activities/TagList.java b/src/com/timsu/astrid/activities/TagList.java index 784446018..2c23b8c0a 100644 --- a/src/com/timsu/astrid/activities/TagList.java +++ b/src/com/timsu/astrid/activities/TagList.java @@ -33,9 +33,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.os.Bundle; import android.view.ContextMenu; +import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; @@ -72,6 +74,8 @@ public class TagList extends Activity { private static final int CONTEXT_DELETE_ID = Menu.FIRST + 11; private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12; + private static final int FLING_THRESHOLD = 50; + private TagController controller; private TaskController taskController; private ListView listView; @@ -79,8 +83,10 @@ public class TagList extends Activity { private List tagArray; private Map taskMap; private Map tagToTaskCount; - private SortMode sortMode = SortMode.SIZE; - private boolean sortReverse = false; + private GestureDetector gestureDetector; + + private static SortMode sortMode = SortMode.SIZE; + private static boolean sortReverse = false; /** Called when loading up the activity for the first time */ private void onLoad() { @@ -92,6 +98,28 @@ public class TagList extends Activity { listView = (ListView)findViewById(R.id.taglist); fillData(); + gestureDetector = new GestureDetector(new TagListGestureDetector()); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (gestureDetector.onTouchEvent(ev)) { + return true; + } + return super.onTouchEvent(ev); + } + + class TagListGestureDetector extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + if(e1.getX() - e2.getX() > FLING_THRESHOLD) { + setResult(RESULT_CANCELED); + finish(); + return true; + } + + return false; + } } // --- stuff for sorting diff --git a/src/com/timsu/astrid/activities/TaskList.java b/src/com/timsu/astrid/activities/TaskList.java index 5505db9a0..01fc989e8 100644 --- a/src/com/timsu/astrid/activities/TaskList.java +++ b/src/com/timsu/astrid/activities/TaskList.java @@ -18,6 +18,8 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.timsu.astrid.activities; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -34,8 +36,10 @@ import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.ContextMenu; +import android.view.GestureDetector; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnCreateContextMenuListener; @@ -85,6 +89,13 @@ public class TaskList extends Activity { private static final int CONTEXT_FILTER_HIDDEN = Menu.FIRST + 20; private static final int CONTEXT_FILTER_DONE = Menu.FIRST + 21; private static final int CONTEXT_FILTER_TAG = Menu.FIRST + 22; + private static final int CONTEXT_SORT_AUTO = Menu.FIRST + 23; + private static final int CONTEXT_SORT_ALPHA = Menu.FIRST + 24; + private static final int CONTEXT_SORT_DUEDATE = Menu.FIRST + 25; + private static final int CONTEXT_SORT_REVERSE = Menu.FIRST + 26; + private static final int CONTEXT_SORT_GROUP = Menu.FIRST; + + private static final int FLING_THRESHOLD = 50; // UI components private TaskController controller; @@ -97,9 +108,14 @@ public class TaskList extends Activity { private Map tagMap; private List taskArray; private Map> taskTags; - private boolean filterShowHidden = false; - private boolean filterShowDone = false; - private TagModelForView filterTag = null; + private GestureDetector gestureDetector; + + // display filters + private static boolean filterShowHidden = false; + private static boolean filterShowDone = false; + private static TagModelForView filterTag = null; + private static SortMode sortMode = SortMode.AUTO; + private static boolean sortReverse = false; static boolean shouldCloseInstance = false; @@ -145,6 +161,33 @@ public class TaskList extends Activity { fillData(); // TODO Synchronizer.authenticate(this); + + gestureDetector = new GestureDetector(new TaskListGestureDetector()); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (gestureDetector.onTouchEvent(ev)) { + return true; + } + return super.onTouchEvent(ev); + } + + class TaskListGestureDetector extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + if(e2.getX() - e1.getX() > FLING_THRESHOLD) { + showTagsView(); + return true; + } else if(e1.getX() - e2.getX() > FLING_THRESHOLD && + !isTopLevelActivity()) { + setResult(RESULT_CANCELED); + finish(); + return true; + } + + return false; + } } @Override @@ -192,6 +235,43 @@ public class TaskList extends Activity { return true; } + private enum SortMode { + ALPHA { + @Override + int compareTo(TaskModelForList arg0, TaskModelForList arg1) { + return arg0.getName().compareTo(arg1.getName()); + } + }, + DUEDATE { + long getDueDate(TaskModelForList task) { + Date definite = task.getDefiniteDueDate(); + Date preferred = task.getPreferredDueDate(); + if(definite != null && preferred != null) { + if(preferred.before(new Date())) + return definite.getTime(); + return preferred.getTime(); + } else if(definite != null) + return definite.getTime(); + else if(preferred != null) + return preferred.getTime(); + else + return new Date(2020,1,1).getTime(); + } + @Override + int compareTo(TaskModelForList arg0, TaskModelForList arg1) { + return (int)((getDueDate(arg0) - getDueDate(arg1))/1000); + } + }, + AUTO { + @Override + int compareTo(TaskModelForList arg0, TaskModelForList arg1) { + return arg0.getTaskWeight() - arg1.getTaskWeight(); + } + }; + + abstract int compareTo(TaskModelForList arg0, TaskModelForList arg1); + }; + /* ====================================================================== * ====================================================== populating list * ====================================================================== */ @@ -275,6 +355,17 @@ public class TaskList extends Activity { } int activeTasks = taskArray.size() - completedTasks; + // sort task list + // do sort + Collections.sort(taskArray, new Comparator() { + @Override + public int compare(TaskModelForList arg0, TaskModelForList arg1) { + return sortMode.compareTo(arg0, arg1); + } + }); + if(sortReverse) + Collections.reverse(taskArray); + // hide "add" button if we have a few tasks if(taskArray.size() > 4) addButton.setVisibility(View.GONE); @@ -303,6 +394,8 @@ public class TaskList extends Activity { setUpListUI(); } + + private void setUpListUI() { // set up our adapter TaskListAdapter tasks = new TaskListAdapter(this, this, @@ -358,6 +451,7 @@ public class TaskList extends Activity { if(menu.hasVisibleItems()) return; Resources r = getResources(); + menu.setHeaderTitle(R.string.taskList_filter_title); MenuItem item = menu.add(Menu.NONE, CONTEXT_FILTER_HIDDEN, Menu.NONE, R.string.taskList_filter_hidden); @@ -377,7 +471,21 @@ public class TaskList extends Activity { item.setChecked(true); } - menu.setHeaderTitle(R.string.taskList_filter_title); + item = menu.add(CONTEXT_SORT_GROUP, CONTEXT_SORT_AUTO, Menu.NONE, + R.string.taskList_sort_auto); + item.setChecked(sortMode == SortMode.AUTO); + item = menu.add(CONTEXT_SORT_GROUP, CONTEXT_SORT_ALPHA, Menu.NONE, + R.string.taskList_sort_alpha); + item.setChecked(sortMode == SortMode.ALPHA); + item = menu.add(CONTEXT_SORT_GROUP, CONTEXT_SORT_DUEDATE, Menu.NONE, + R.string.taskList_sort_duedate); + item.setChecked(sortMode == SortMode.DUEDATE); + menu.setGroupCheckable(CONTEXT_SORT_GROUP, true, true); + + item = menu.add(CONTEXT_SORT_GROUP, CONTEXT_SORT_REVERSE, Menu.NONE, + R.string.taskList_sort_reverse); + item.setCheckable(true); + item.setChecked(sortReverse); } }); } @@ -394,6 +502,9 @@ public class TaskList extends Activity { if(resultCode == Constants.RESULT_SYNCHRONIZE) { // TODO Synchronizer.performSync(this, true); } + + if(requestCode == ACTIVITY_TAGS && resultCode == RESULT_CANCELED) + filterTag = null; } @Override @@ -434,6 +545,20 @@ public class TaskList extends Activity { .show(); } + public boolean isTopLevelActivity() { + return (getIntent().getExtras() == null || + !getIntent().getExtras().containsKey(TAG_TOKEN)); + } + + public void showTagsView() { + if(isTopLevelActivity()) { + Intent intent = new Intent(TaskList.this, TagList.class); + startActivityForResult(intent, ACTIVITY_TAGS); + } else { + finish(); + } + } + @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { Intent intent; @@ -447,12 +572,7 @@ public class TaskList extends Activity { listView.showContextMenu(); return true; case TAGS_ID: - if(filterTag == null) { - intent = new Intent(TaskList.this, TagList.class); - startActivityForResult(intent, ACTIVITY_TAGS); - } else { - finish(); - } + showTagsView(); return true; case MORE_ID: layout.showContextMenu(); @@ -497,9 +617,35 @@ public class TaskList extends Activity { fillData(); return true; case CONTEXT_FILTER_TAG: + filterTag = null; setResult(Constants.RESULT_GO_HOME); finish(); return true; + case CONTEXT_SORT_AUTO: + if(sortMode == SortMode.AUTO) + return true; + sortReverse = false; + sortMode = SortMode.AUTO; + fillData(); + return true; + case CONTEXT_SORT_ALPHA: + if(sortMode == SortMode.ALPHA) + return true; + sortReverse = false; + sortMode = SortMode.ALPHA; + fillData(); + return true; + case CONTEXT_SORT_DUEDATE: + if(sortMode == SortMode.DUEDATE) + return true; + sortReverse = false; + sortMode = SortMode.DUEDATE; + fillData(); + return true; + case CONTEXT_SORT_REVERSE: + sortReverse = !sortReverse; + fillData(); + return true; } return super.onMenuItemSelected(featureId, item); diff --git a/src/com/timsu/astrid/data/task/TaskController.java b/src/com/timsu/astrid/data/task/TaskController.java index 65e6e2ab4..e00a128cc 100644 --- a/src/com/timsu/astrid/data/task/TaskController.java +++ b/src/com/timsu/astrid/data/task/TaskController.java @@ -47,10 +47,11 @@ public class TaskController extends AbstractController { public List getTasksWithNotifications() { List list = new ArrayList(); Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST, - String.format("%s < %d AND %s != 0", + String.format("%s < %d AND (%s != 0 OR %s != 0)", AbstractTaskModel.PROGRESS_PERCENTAGE, AbstractTaskModel.COMPLETE_PERCENTAGE, - AbstractTaskModel.NOTIFICATIONS), null, null, null, null, null); + AbstractTaskModel.NOTIFICATIONS, + AbstractTaskModel.NOTIFICATION_FLAGS), null, null, null, null, null); if(cursor.getCount() == 0) return list; @@ -112,7 +113,7 @@ public class TaskController extends AbstractController { list.add(new TaskModelForList(cursor)); } while(!cursor.isLast()); - return TaskModelForList.sortTaskList(list); + return list; } /** Create a weighted list of tasks from the db cursor given */ diff --git a/src/com/timsu/astrid/data/task/TaskModelForList.java b/src/com/timsu/astrid/data/task/TaskModelForList.java index 2d0e4cf30..765feb39e 100644 --- a/src/com/timsu/astrid/data/task/TaskModelForList.java +++ b/src/com/timsu/astrid/data/task/TaskModelForList.java @@ -19,12 +19,7 @@ */ package com.timsu.astrid.data.task; -import java.util.Collections; -import java.util.Comparator; import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import android.content.Context; import android.database.Cursor; @@ -51,43 +46,12 @@ public class TaskModelForList extends AbstractTaskModel { HIDDEN_UNTIL, }; - /** Takes the incoming list of task models and weights it, removing hidden - * tasks if desired. This mutates the list */ - static List sortTaskList(List list) { - final HashMap weights = new - HashMap(); - - // first, load everything - for(Iterator i = list.iterator(); i.hasNext(); ) { - TaskModelForList task = i.next(); - - weights.put(task, task.getWeight()); - } - - // now sort - Collections.sort(list, new Comparator() { - @Override - public int compare(TaskModelForList a, TaskModelForList b) { - return weights.get(a) - weights.get(b); - } - }); - - return list; - } - /** Get the weighted score for this task. Smaller is more important */ - private int getWeight() { + public int getTaskWeight() { int weight = 0; // importance - weight += getImportance().ordinal() * 60; - - // estimated time left - int secondsLeft = getEstimatedSeconds() - getElapsedSeconds(); - if(secondsLeft > 0) - weight += secondsLeft / 120; - else - weight += 3600 / 120; // default if no time set + weight += getImportance().ordinal() * 80; // looming absolute deadline if(getDefiniteDueDate() != null) {