Work on optimizing Astrid for gigantic lists. Removed all the crashing! Just have to test

a) task updates when edited
  b) task hides when deleted, nothing else is affected
  c) creating tasks works
pull/14/head
Tim Su 15 years ago
parent 33a3f2e1df
commit 81cd7de0df

@ -55,6 +55,7 @@ import com.timsu.astrid.data.tag.TagIdentifier;
import com.timsu.astrid.data.tag.TagModelForView;
import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.data.task.TaskModelForList;
import com.timsu.astrid.utilities.DialogUtilities;
/**
@ -316,7 +317,13 @@ public class TagListSubActivity extends SubActivity {
case CONTEXT_SHOWHIDE_ID:
tag = tagArray.get(item.getGroupId());
tag.toggleHideFromMainList();
getTagController().saveTag(tag);
try {
getTagController().saveTag(tag);
} catch (Exception e) {
DialogUtilities.okDialog(getParent(), "Error: You probably " +
"already have a tag named '" + tag.getName() + "'!",
null);
}
fillData();
return true;
}

@ -74,7 +74,7 @@ public class TaskList extends Activity {
private static final int MAX_FLING_OTHER_AXIS = 60;
/** Minimum velocity a fling must have to trigger motion */
private static final int FLING_VEL_THRESHOLD = 300;
private static final int FLING_VEL_THRESHOLD = 200;
// view components
private ViewFlipper viewFlipper;
@ -174,11 +174,12 @@ public class TaskList extends Activity {
}
/** Gesture detector switches between sub-activities */
private class AstridGestureDetector extends SimpleOnGestureListener {
class AstridGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
Log.i("astrid", "Got fling. X: " + (e2.getX() - e1.getX()) +
if(Constants.DEBUG)
Log.i("astrid", "Got fling. X: " + (e2.getX() - e1.getX()) +
", vel: " + velocityX);
if(Math.abs(e1.getY() - e2.getY()) > MAX_FLING_OTHER_AXIS)
@ -186,7 +187,7 @@ public class TaskList extends Activity {
// flick R to L
if(e1.getX() - e2.getX() > FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > FLING_VEL_THRESHOLD) {
Math.abs((int)velocityX) > FLING_VEL_THRESHOLD) {
switch(getCurrentSubActivity().getActivityCode()) {
case AC_TASK_LIST:
@ -199,7 +200,7 @@ public class TaskList extends Activity {
// flick L to R
else if(e2.getX() - e1.getX() > FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > FLING_VEL_THRESHOLD) {
Math.abs((int)velocityX) > FLING_VEL_THRESHOLD) {
switch(getCurrentSubActivity().getActivityCode()) {
case AC_TASK_LIST_W_TAG:
@ -231,8 +232,8 @@ public class TaskList extends Activity {
// and flip to them
switch(getCurrentSubActivity().getActivityCode()) {
case AC_TASK_LIST:
viewFlipper.setInAnimation(mInAnimationForward);
viewFlipper.setOutAnimation(mOutAnimationForward);
//viewFlipper.setInAnimation(mInAnimationForward);
//viewFlipper.setOutAnimation(mOutAnimationForward);
switch(activity) {
case AC_TAG_LIST:
viewFlipper.showNext();
@ -245,21 +246,21 @@ public class TaskList extends Activity {
case AC_TAG_LIST:
switch(activity) {
case AC_TASK_LIST:
viewFlipper.setInAnimation(mInAnimationBackward);
viewFlipper.setOutAnimation(mOutAnimationBackward);
//viewFlipper.setInAnimation(mInAnimationBackward);
//viewFlipper.setOutAnimation(mOutAnimationBackward);
viewFlipper.showPrevious();
break;
case AC_TASK_LIST_W_TAG:
viewFlipper.setInAnimation(mInAnimationForward);
viewFlipper.setOutAnimation(mOutAnimationForward);
//viewFlipper.setInAnimation(mInAnimationForward);
//viewFlipper.setOutAnimation(mOutAnimationForward);
viewFlipper.showNext();
break;
}
break;
case AC_TASK_LIST_W_TAG:
viewFlipper.setInAnimation(mInAnimationBackward);
viewFlipper.setOutAnimation(mOutAnimationBackward);
//viewFlipper.setInAnimation(mInAnimationBackward);
//viewFlipper.setOutAnimation(mOutAnimationBackward);
switch(activity) {
case AC_TAG_LIST:
viewFlipper.showPrevious();
@ -331,8 +332,8 @@ public class TaskList extends Activity {
if(hasFocus && shouldCloseInstance) { // user wants to quit
finish();
} else
getCurrentSubActivity().onWindowFocusChanged(hasFocus);
}/* else
getCurrentSubActivity().onWindowFocusChanged(hasFocus);*/
}
@Override

@ -19,8 +19,8 @@ package com.timsu.astrid.activities;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
@ -51,7 +51,6 @@ import com.timsu.astrid.R;
import com.timsu.astrid.data.alerts.AlertController;
import com.timsu.astrid.data.enums.Importance;
import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.tag.TagModelForView;
import com.timsu.astrid.data.task.TaskController;
import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.data.task.TaskModelForList;
@ -95,7 +94,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
"MM/dd HH:mm");
private final Activity activity;
private List<TaskModelForList> objects;
private ArrayList<TaskModelForList> objects;
private int resource;
private LayoutInflater inflater;
private TaskListAdapterHooks hooks;
@ -112,8 +111,8 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
*
*/
public interface TaskListAdapterHooks {
List<TaskModelForList> getTaskArray();
List<TagModelForView> getTagsFor(TaskModelForList task);
ArrayList<TaskModelForList> getTaskArray();
String getTagsFor(TaskModelForList task);
TaskController taskController();
TagController tagController();
void performItemClick(View v, int position);
@ -134,7 +133,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
* @param hooks
*/
public TaskListAdapter(Activity activity, int resource,
List<TaskModelForList> objects, TaskListAdapterHooks hooks) {
ArrayList<TaskModelForList> objects, TaskListAdapterHooks hooks) {
super(activity, resource, objects);
inflater = (LayoutInflater)activity.getSystemService(
@ -223,6 +222,9 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
private void setupView(View view, final TaskModelForList task) {
Resources r = activity.getResources();
if(task == null)
return;
view.setTag(task);
setFieldContentsAndVisibility(view, task);
@ -480,15 +482,8 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
if(visibleFields.TAGS || isExpanded) {
String cachedResult = task.getCachedLabel(KEY_TAGS);
if(cachedResult == null) {
List<TagModelForView> alltags = hooks.getTagsFor(task);
StringBuilder tagString = new StringBuilder();
for(Iterator<TagModelForView> i = alltags.iterator(); i.hasNext(); ) {
TagModelForView tag = i.next();
tagString.append(tag.getName());
if(i.hasNext())
tagString.append(", ");
}
if(alltags.size() > 0)
String tagString = hooks.getTagsFor(task);
if(!tagString.equals(""))
cachedResult = r.getString(R.string.taskList_tagsPrefix) +
" " + tagString;
else
@ -547,6 +542,26 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
}
/**
* Removes the item at the specified position in the list (not reltaed
* to task identifier number
*
* @param listView parent view to refresh
* @param position the index of the item
*/
public void removeItem(ListView listView, int position) {
View view = listView.getChildAt(position);
view.setVisibility(View.GONE);
objects.set(position, null);
}
/**
* Refresh the item given at the specified position in the list (not
* related to task identifier number)
*
* @param listView the parent view to refresh
* @param position the index of the item
*/
public void refreshItem(ListView listView, int position) {
View view = listView.getChildAt(position);
TaskModelForList task = hooks.getTaskArray().get(position);

@ -127,7 +127,7 @@ public class TaskListSubActivity extends SubActivity {
// other instance variables
private Map<TagIdentifier, TagModelForView> tagMap;
private ArrayList<TaskModelForList> taskArray;
private HashMap<TaskModelForList, LinkedList<TagModelForView>> taskTags;
private HashMap<TaskModelForList, String> taskTags;
private Long selectedTaskId = null;
private TaskModelForList selectedTask = null;
private Handler handler = null;
@ -141,7 +141,7 @@ public class TaskListSubActivity extends SubActivity {
private static SortMode sortMode = SortMode.AUTO;
private static boolean sortReverse = false;
private TagModelForView filterTag = null;
private boolean suppressReload = false;
private int editedObjectPosition = -1;
/* ======================================================================
* ======================================================= initialization
@ -174,7 +174,6 @@ public class TaskListSubActivity extends SubActivity {
reLoadRunnable = new Runnable() {
@Override
public void run() {
suppressReload = true;
handler.post(new Runnable() {
@Override
public void run() {
@ -212,7 +211,6 @@ public class TaskListSubActivity extends SubActivity {
if(variables.containsKey(NOTIF_REPEAT_TOKEN))
repeatInterval = variables.getLong(NOTIF_REPEAT_TOKEN);
flags = variables.getInt(NOTIF_FLAGS_TOKEN);
suppressReload = true;
showNotificationAlert(selectedTask,
repeatInterval, flags);
}
@ -421,10 +419,8 @@ public class TaskListSubActivity extends SubActivity {
return true;
if(filterTag == null) {
for(TagModelForView tags : taskTags.get(task)) {
if(tags != null && tags.shouldHideFromMainList())
return true;
}
if(taskTags.get(task).contains(TagModelForView.HIDDEN_FROM_MAIN_LIST_PREFIX))
return true;
}
return false;
@ -453,13 +449,13 @@ public class TaskListSubActivity extends SubActivity {
// read tags and apply filters
tagMap = getTagController().getAllTagsAsMap(getParent());
taskTags = new HashMap<TaskModelForList, LinkedList<TagModelForView>>();
taskTags = new HashMap<TaskModelForList, String>();
StringBuilder tagBuilder = new StringBuilder();
for(Iterator<TaskModelForList> i = taskArray.iterator(); i.hasNext();) {
TaskModelForList task = i.next();
if(task.isTaskCompleted()) {
if(!filterShowDone) {
if(!filterShowDone) {
if(task.isTaskCompleted()) {
i.remove();
continue;
}
@ -472,12 +468,14 @@ public class TaskListSubActivity extends SubActivity {
// get list of tags
LinkedList<TagIdentifier> tagIds = getTagController().getTaskTags(getParent(),
task.getTaskIdentifier());
LinkedList<TagModelForView> tags = new LinkedList<TagModelForView>();
for(TagIdentifier tagId : tagIds) {
TagModelForView tag = tagMap.get(tagId);
tags.add(tag);
tagBuilder.delete(0, tagBuilder.length());
for(Iterator<TagIdentifier> j = tagIds.iterator(); j.hasNext(); ) {
TagModelForView tag = tagMap.get(j.next());
tagBuilder.append(tag.getName());
if(j.hasNext())
tagBuilder.append(", ");
}
taskTags.put(task, tags);
taskTags.put(task, tagBuilder.toString());
// hide hidden
if(!filterShowHidden) {
@ -562,8 +560,8 @@ public class TaskListSubActivity extends SubActivity {
class TaskListHooks implements TaskListAdapterHooks {
private HashMap<TaskModelForList, LinkedList<TagModelForView>> myTaskTags;
private List<TaskModelForList> myTaskArray;
private HashMap<TaskModelForList, String> myTaskTags;
private ArrayList<TaskModelForList> myTaskArray;
public TaskListHooks() {
this.myTaskTags = taskTags;
@ -576,13 +574,12 @@ public class TaskListSubActivity extends SubActivity {
}
@Override
public List<TagModelForView> getTagsFor(
TaskModelForList task) {
public String getTagsFor(TaskModelForList task) {
return myTaskTags.get(task);
}
@Override
public List<TaskModelForList> getTaskArray() {
public ArrayList<TaskModelForList> getTaskArray() {
return myTaskArray;
}
@ -730,20 +727,15 @@ public class TaskListSubActivity extends SubActivity {
loadingThread.start();
}
});
} else if(requestCode == ACTIVITY_TAGS)
} else if(requestCode == ACTIVITY_TAGS) {
switchToActivity(TaskList.AC_TAG_LIST, null);
}
} else if(requestCode == ACTIVITY_EDIT && editedObjectPosition != -1) {
// refresh, since stuff might have changed...
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// refresh, since stuff might have changed...
if(hasFocus) {
if(suppressReload) {
suppressReload = false;
return;
}
// TODO reload task & tags from database
fillData();
listAdapter.refreshItem(listView, editedObjectPosition);
editedObjectPosition = -1;
}
}
@ -758,7 +750,7 @@ public class TaskListSubActivity extends SubActivity {
}
/** Show a dialog box and delete the task specified */
private void deleteTask(final TaskIdentifier taskId) {
private void deleteTask(final TaskModelForList task, final int position) {
new AlertDialog.Builder(getParent())
.setTitle(R.string.delete_title)
.setMessage(R.string.delete_this_task_title)
@ -767,9 +759,8 @@ public class TaskListSubActivity extends SubActivity {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getTaskController().deleteTask(taskId);
loadingThread = new Thread(reLoadRunnable);
loadingThread.start();
listAdapter.refreshItem(listView, position);
getTaskController().deleteTask(task.getTaskIdentifier());
}
})
.setNegativeButton(android.R.string.cancel, null)
@ -778,6 +769,8 @@ public class TaskListSubActivity extends SubActivity {
/** Take you to the task edit page */
private void editTask(TaskModelForList task) {
editedObjectPosition = taskArray.indexOf(task);
Intent intent = new Intent(getParent(), TaskEdit.class);
intent.putExtra(TaskEdit.LOAD_INSTANCE_TOKEN,
task.getTaskIdentifier().getId());
@ -802,7 +795,6 @@ public class TaskListSubActivity extends SubActivity {
@Override
public void launchActivity(Intent intent, int requestCode) {
suppressReload = false;
super.launchActivity(intent, requestCode);
}
@ -903,12 +895,11 @@ public class TaskListSubActivity extends SubActivity {
return true;
case TaskListAdapter.CONTEXT_DELETE_ID:
task = taskArray.get(item.getGroupId());
deleteTask(task.getTaskIdentifier());
deleteTask(task, item.getGroupId());
return true;
case TaskListAdapter.CONTEXT_TIMER_ID:
task = taskArray.get(item.getGroupId());
toggleTimer(task);
suppressReload = true;
return true;
case TaskListAdapter.CONTEXT_POSTPONE_ID:
task = taskArray.get(item.getGroupId());
@ -926,7 +917,6 @@ public class TaskListSubActivity extends SubActivity {
task.getHiddenUntil(), postponeMillis, false));
getTaskController().saveTask(task);
suppressReload = true;
listAdapter.refreshItem(listView, item.getGroupId());
}
});

@ -43,7 +43,6 @@ public class TaskModelForList extends AbstractTaskModel {
DEFINITE_DUE_DATE,
PREFERRED_DUE_DATE,
NOTIFICATIONS,
NOTIFICATION_FLAGS,
PROGRESS_PERCENTAGE,
COMPLETION_DATE,
CREATION_DATE,
@ -201,11 +200,6 @@ public class TaskModelForList extends AbstractTaskModel {
return super.getRepeat();
}
@Override
public int getNotificationFlags() {
return super.getNotificationFlags();
}
@Override
public Date getCreationDate() {
return super.getCreationDate();

@ -13,6 +13,8 @@ public class Constants {
/** URL of Astrid Feature Survey */
public static final String SURVEY_URL = "http://www.haveasec.com/survey/m/detail/welcome/bf25e0/";
public static final boolean DEBUG = false;
// result codes
/** Return to the task list view */
@ -20,4 +22,5 @@ public class Constants {
/** Callback to force synchronization */
public static final int RESULT_SYNCHRONIZE = Activity.RESULT_FIRST_USER + 1;
}

@ -44,7 +44,7 @@ public class Preferences {
editor.putString(r.getString(R.string.p_fontSize), "20");
}
if(!prefs.contains(r.getString(R.string.p_deadlineTime))) {
editor.putString(r.getString(R.string.p_deadlineTime), "7");
editor.putString(r.getString(R.string.p_deadlineTime), "1");
}
if(!prefs.contains(r.getString(R.string.p_notif_defaultRemind))) {
editor.putString(r.getString(R.string.p_notif_defaultRemind), "0");

Loading…
Cancel
Save