Astrid 1.11.3

- deleted unused files
   - fix bug with tasks w/ notif flags but no notifications
   - added sorting options
pull/14/head
Tim Su 16 years ago
parent c5b92dcd94
commit 836429d700

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid"
android:versionCode="46"
android:versionName="1.11.2">
android:versionCode="47"
android:versionName="1.11.3">
<meta-data android:name="com.a0soft.gphone.aTrackDog.webURL"
android:value="http://www.weloveastrid.com" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false"
android:drawable="@drawable/highlight_selected" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/transparent_button_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/transparent_button_transition" />
</selector>

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/highlight_pressed" />
<item android:drawable="@drawable/highlight_longpress" />
</transition>

@ -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"/>
<TextView android:id="@+id/importance_label"
@ -100,6 +101,7 @@
android:scrollbars="vertical"
android:gravity="top"
android:hint="@string/notes_hint"
android:autoText="true"
android:capitalize="sentences"
android:singleLine="false" />

@ -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" />
</LinearLayout>

@ -86,7 +86,7 @@
<string name="taskList_menu_insert">Add</string>
<string name="taskList_menu_tags">Tags</string>
<string name="taskList_menu_filters">Filters</string>
<string name="taskList_menu_filters">Display</string>
<string name="taskList_menu_more">More</string>
<string name="taskList_menu_settings">Settings</string>
<string name="taskList_menu_help">Help</string>
@ -96,10 +96,14 @@
<string name="taskList_context_startTimer">Start Timer</string>
<string name="taskList_context_stopTimer">Stop Timer</string>
<string name="taskList_filter_title">Filters</string>
<string name="taskList_filter_title">Sort/Filters</string>
<string name="taskList_filter_hidden">Hidden/Blocked Tasks</string>
<string name="taskList_filter_done">Completed Tasks</string>
<string name="taskList_filter_tagged">Tagged \'%s\'</string>
<string name="taskList_sort_auto">Auto Sort</string>
<string name="taskList_sort_alpha">Sort By Name</string>
<string name="taskList_sort_duedate">Sort By Due Date</string>
<string name="taskList_sort_reverse">Sort Reverse</string>
<!-- TaskEdit -->
<skip />

@ -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<TagModelForView> tagArray;
private Map<Long, TaskModelForList> taskMap;
private Map<TagModelForView, Integer> 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

@ -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<TagIdentifier, TagModelForView> tagMap;
private List<TaskModelForList> taskArray;
private Map<TaskModelForList, List<TagModelForView>> 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<TaskModelForList>() {
@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);

@ -47,10 +47,11 @@ public class TaskController extends AbstractController {
public List<TaskModelForNotify> getTasksWithNotifications() {
List<TaskModelForNotify> list = new ArrayList<TaskModelForNotify>();
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 */

@ -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<TaskModelForList> sortTaskList(List<TaskModelForList> list) {
final HashMap<TaskModelForList, Integer> weights = new
HashMap<TaskModelForList, Integer>();
// first, load everything
for(Iterator<TaskModelForList> i = list.iterator(); i.hasNext(); ) {
TaskModelForList task = i.next();
weights.put(task, task.getWeight());
}
// now sort
Collections.sort(list, new Comparator<TaskModelForList>() {
@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) {

Loading…
Cancel
Save