From 81cd7de0df4408626b3df3ee2a4f129af4a4f6f7 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Sat, 7 Mar 2009 03:59:52 +0000 Subject: [PATCH] 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 --- .../astrid/activities/TagListSubActivity.java | 9 ++- src/com/timsu/astrid/activities/TaskList.java | 31 ++++---- .../astrid/activities/TaskListAdapter.java | 45 ++++++++---- .../activities/TaskListSubActivity.java | 72 ++++++++----------- .../astrid/data/task/TaskModelForList.java | 6 -- src/com/timsu/astrid/utilities/Constants.java | 3 + .../timsu/astrid/utilities/Preferences.java | 2 +- 7 files changed, 89 insertions(+), 79 deletions(-) diff --git a/src/com/timsu/astrid/activities/TagListSubActivity.java b/src/com/timsu/astrid/activities/TagListSubActivity.java index c85520ffc..9ff6a1937 100644 --- a/src/com/timsu/astrid/activities/TagListSubActivity.java +++ b/src/com/timsu/astrid/activities/TagListSubActivity.java @@ -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; } diff --git a/src/com/timsu/astrid/activities/TaskList.java b/src/com/timsu/astrid/activities/TaskList.java index a260bbb80..153e8ee5e 100644 --- a/src/com/timsu/astrid/activities/TaskList.java +++ b/src/com/timsu/astrid/activities/TaskList.java @@ -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 diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src/com/timsu/astrid/activities/TaskListAdapter.java index c64d12531..5fff52cc6 100644 --- a/src/com/timsu/astrid/activities/TaskListAdapter.java +++ b/src/com/timsu/astrid/activities/TaskListAdapter.java @@ -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 { "MM/dd HH:mm"); private final Activity activity; - private List objects; + private ArrayList objects; private int resource; private LayoutInflater inflater; private TaskListAdapterHooks hooks; @@ -112,8 +111,8 @@ public class TaskListAdapter extends ArrayAdapter { * */ public interface TaskListAdapterHooks { - List getTaskArray(); - List getTagsFor(TaskModelForList task); + ArrayList getTaskArray(); + String getTagsFor(TaskModelForList task); TaskController taskController(); TagController tagController(); void performItemClick(View v, int position); @@ -134,7 +133,7 @@ public class TaskListAdapter extends ArrayAdapter { * @param hooks */ public TaskListAdapter(Activity activity, int resource, - List objects, TaskListAdapterHooks hooks) { + ArrayList objects, TaskListAdapterHooks hooks) { super(activity, resource, objects); inflater = (LayoutInflater)activity.getSystemService( @@ -223,6 +222,9 @@ public class TaskListAdapter extends ArrayAdapter { 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 { if(visibleFields.TAGS || isExpanded) { String cachedResult = task.getCachedLabel(KEY_TAGS); if(cachedResult == null) { - List alltags = hooks.getTagsFor(task); - StringBuilder tagString = new StringBuilder(); - for(Iterator 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 { } + /** + * 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); diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index c4197cadd..7f8ba02f6 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -127,7 +127,7 @@ public class TaskListSubActivity extends SubActivity { // other instance variables private Map tagMap; private ArrayList taskArray; - private HashMap> taskTags; + private HashMap 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>(); - + taskTags = new HashMap(); + StringBuilder tagBuilder = new StringBuilder(); for(Iterator 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 tagIds = getTagController().getTaskTags(getParent(), task.getTaskIdentifier()); - LinkedList tags = new LinkedList(); - for(TagIdentifier tagId : tagIds) { - TagModelForView tag = tagMap.get(tagId); - tags.add(tag); + tagBuilder.delete(0, tagBuilder.length()); + for(Iterator 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> myTaskTags; - private List myTaskArray; + private HashMap myTaskTags; + private ArrayList myTaskArray; public TaskListHooks() { this.myTaskTags = taskTags; @@ -576,13 +574,12 @@ public class TaskListSubActivity extends SubActivity { } @Override - public List getTagsFor( - TaskModelForList task) { + public String getTagsFor(TaskModelForList task) { return myTaskTags.get(task); } @Override - public List getTaskArray() { + public ArrayList 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()); } }); diff --git a/src/com/timsu/astrid/data/task/TaskModelForList.java b/src/com/timsu/astrid/data/task/TaskModelForList.java index fee56a989..2b9cca30c 100644 --- a/src/com/timsu/astrid/data/task/TaskModelForList.java +++ b/src/com/timsu/astrid/data/task/TaskModelForList.java @@ -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(); diff --git a/src/com/timsu/astrid/utilities/Constants.java b/src/com/timsu/astrid/utilities/Constants.java index ae6363d0d..39c65c2e6 100644 --- a/src/com/timsu/astrid/utilities/Constants.java +++ b/src/com/timsu/astrid/utilities/Constants.java @@ -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; + } diff --git a/src/com/timsu/astrid/utilities/Preferences.java b/src/com/timsu/astrid/utilities/Preferences.java index a2bf8a469..a99138e28 100644 --- a/src/com/timsu/astrid/utilities/Preferences.java +++ b/src/com/timsu/astrid/utilities/Preferences.java @@ -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");