From 3c09c367dc91c1883b90007ebbba56af8d6a366a Mon Sep 17 00:00:00 2001 From: Tim Su Date: Sun, 8 Mar 2009 08:39:18 +0000 Subject: [PATCH] Updates to task list to handle editing, creating, deleting. --- res/values/strings.xml | 2 + src/com/timsu/astrid/activities/TaskEdit.java | 2 +- .../astrid/activities/TaskListAdapter.java | 44 +++++++++---------- .../activities/TaskListSubActivity.java | 33 +++++++------- src/com/timsu/astrid/utilities/Constants.java | 5 ++- .../astrid/utilities/StartupReceiver.java | 15 +++++-- 6 files changed, 57 insertions(+), 44 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index efe657d73..b64f912d5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -117,6 +117,7 @@ Tags: Notes: Created: + Deleted Add @@ -274,6 +275,7 @@ Wish me luck!\n Loading... + Updating List... Information Question View Task diff --git a/src/com/timsu/astrid/activities/TaskEdit.java b/src/com/timsu/astrid/activities/TaskEdit.java index 998eae89c..1f36e1c62 100644 --- a/src/com/timsu/astrid/activities/TaskEdit.java +++ b/src/com/timsu/astrid/activities/TaskEdit.java @@ -540,7 +540,7 @@ public class TaskEdit extends TaskModificationTabbedActivity { private void discardButtonClick() { shouldSaveState = false; - setResult(RESULT_CANCELED); + setResult(Constants.RESULT_DISCARD); finish(); } diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src/com/timsu/astrid/activities/TaskListAdapter.java index 5fff52cc6..53fdf75da 100644 --- a/src/com/timsu/astrid/activities/TaskListAdapter.java +++ b/src/com/timsu/astrid/activities/TaskListAdapter.java @@ -98,6 +98,7 @@ public class TaskListAdapter extends ArrayAdapter { private int resource; private LayoutInflater inflater; private TaskListAdapterHooks hooks; + private TextView deletedItemView = new TextView(getContext()); private Integer fontSizePreference; private AlertController alarmController; @@ -191,6 +192,9 @@ public class TaskListAdapter extends ArrayAdapter { public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; + if(objects.get(position) == null) + return deletedItemView; + if(view == null) { view = inflater.inflate(resource, parent, false); initializeView(view); @@ -211,6 +215,7 @@ public class TaskListAdapter extends ArrayAdapter { final TextView name = ((TextView)view.findViewById(R.id.task_name)); if(fontSizePreference != null && fontSizePreference > 0) name.setTextSize(fontSizePreference); + deletedItemView.setText(getContext().getResources().getString(R.string.taskList_deleted)); } /** @@ -222,12 +227,13 @@ 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); + if(task == null) { + return; + } + final CheckBox progress = ((CheckBox)view.findViewById(R.id.cb1)); progress.setChecked(task.isTaskCompleted()); @@ -266,6 +272,11 @@ public class TaskListAdapter extends ArrayAdapter { /** Helper method to set the contents and visibility of each field */ private void setFieldContentsAndVisibility(View view, TaskModelForList task) { + if(task == null) { + view.setVisibility(View.GONE); + return; + } + Resources r = getContext().getResources(); TaskFieldsVisibility visibleFields = Preferences.getTaskFieldsVisibility(activity); boolean isExpanded = CACHE_TRUE.equals(task.getCachedLabel(KEY_EXPANDED)); @@ -542,19 +553,6 @@ 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) @@ -630,11 +628,11 @@ public class TaskListAdapter extends ArrayAdapter { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { TaskModelForList task = (TaskModelForList)v.getTag(); - int position = objects.indexOf(task); + int id = (int)task.getTaskIdentifier().getId(); - menu.add(position, CONTEXT_EDIT_ID, Menu.NONE, + menu.add(id, CONTEXT_EDIT_ID, Menu.NONE, R.string.taskList_context_edit); - menu.add(position, CONTEXT_DELETE_ID, Menu.NONE, + menu.add(id, CONTEXT_DELETE_ID, Menu.NONE, R.string.taskList_context_delete); int timerTitle; @@ -642,11 +640,11 @@ public class TaskListAdapter extends ArrayAdapter { timerTitle = R.string.taskList_context_startTimer; else timerTitle = R.string.taskList_context_stopTimer; - menu.add(position, CONTEXT_TIMER_ID, Menu.NONE, timerTitle); + menu.add(id, CONTEXT_TIMER_ID, Menu.NONE, timerTitle); if(task.getDefiniteDueDate() != null || task.getPreferredDueDate() != null) - menu.add(position, CONTEXT_POSTPONE_ID, Menu.NONE, + menu.add(id, CONTEXT_POSTPONE_ID, Menu.NONE, R.string.taskList_context_postpone); menu.setHeaderTitle(task.getName()); @@ -664,8 +662,8 @@ public class TaskListAdapter extends ArrayAdapter { } }); - Button deleteButton = (Button)view.findViewById(R.id.timer); - deleteButton.setOnClickListener(new View.OnClickListener() { + Button toggleTimerButton = (Button)view.findViewById(R.id.timer); + toggleTimerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View parent = (View)v.getParent().getParent().getParent().getParent(); diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index 7f8ba02f6..5e39fe41b 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -127,6 +127,7 @@ public class TaskListSubActivity extends SubActivity { // other instance variables private Map tagMap; private ArrayList taskArray; + private HashMap tasksById; private HashMap taskTags; private Long selectedTaskId = null; private TaskModelForList selectedTask = null; @@ -141,7 +142,6 @@ public class TaskListSubActivity extends SubActivity { private static SortMode sortMode = SortMode.AUTO; private static boolean sortReverse = false; private TagModelForView filterTag = null; - private int editedObjectPosition = -1; /* ====================================================================== * ======================================================= initialization @@ -177,6 +177,7 @@ public class TaskListSubActivity extends SubActivity { handler.post(new Runnable() { @Override public void run() { + loadingText.setText(getParent().getResources().getString(R.string.updating)); loadingText.setVisibility(View.VISIBLE); } }); @@ -451,6 +452,7 @@ public class TaskListSubActivity extends SubActivity { tagMap = getTagController().getAllTagsAsMap(getParent()); taskTags = new HashMap(); StringBuilder tagBuilder = new StringBuilder(); + tasksById = new HashMap(); for(Iterator i = taskArray.iterator(); i.hasNext();) { TaskModelForList task = i.next(); @@ -486,6 +488,8 @@ public class TaskListSubActivity extends SubActivity { } } + tasksById.put(task.getTaskIdentifier().getId(), task); + if(task.isTaskCompleted()) completedTasks++; } @@ -729,13 +733,11 @@ public class TaskListSubActivity extends SubActivity { }); } else if(requestCode == ACTIVITY_TAGS) { switchToActivity(TaskList.AC_TAG_LIST, null); - } else if(requestCode == ACTIVITY_EDIT && editedObjectPosition != -1) { + } else if((requestCode == ACTIVITY_EDIT || requestCode == ACTIVITY_CREATE) && + resultCode != Constants.RESULT_DISCARD) { // refresh, since stuff might have changed... - - // TODO reload task & tags from database - - listAdapter.refreshItem(listView, editedObjectPosition); - editedObjectPosition = -1; + loadingThread = new Thread(reLoadRunnable); + loadingThread.start(); } } @@ -750,7 +752,7 @@ public class TaskListSubActivity extends SubActivity { } /** Show a dialog box and delete the task specified */ - private void deleteTask(final TaskModelForList task, final int position) { + private void deleteTask(final TaskModelForList task) { new AlertDialog.Builder(getParent()) .setTitle(R.string.delete_title) .setMessage(R.string.delete_this_task_title) @@ -759,7 +761,8 @@ public class TaskListSubActivity extends SubActivity { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - listAdapter.refreshItem(listView, position); + listAdapter.remove(task); + taskArray.remove(task); getTaskController().deleteTask(task.getTaskIdentifier()); } }) @@ -769,8 +772,6 @@ 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()); @@ -890,19 +891,19 @@ public class TaskListSubActivity extends SubActivity { // --- list context menu items case TaskListAdapter.CONTEXT_EDIT_ID: - task = taskArray.get(item.getGroupId()); + task = tasksById.get((long)item.getGroupId()); editTask(task); return true; case TaskListAdapter.CONTEXT_DELETE_ID: - task = taskArray.get(item.getGroupId()); - deleteTask(task, item.getGroupId()); + task = tasksById.get((long)item.getGroupId()); + deleteTask(task); return true; case TaskListAdapter.CONTEXT_TIMER_ID: - task = taskArray.get(item.getGroupId()); + task = tasksById.get((long)item.getGroupId()); toggleTimer(task); return true; case TaskListAdapter.CONTEXT_POSTPONE_ID: - task = taskArray.get(item.getGroupId()); + task = tasksById.get((long)item.getGroupId()); DialogUtilities.dayHourPicker(getParent(), r.getString(R.string.taskList_postpone_dialog), new OnNNumberPickedListener() { diff --git a/src/com/timsu/astrid/utilities/Constants.java b/src/com/timsu/astrid/utilities/Constants.java index 39c65c2e6..be498df7a 100644 --- a/src/com/timsu/astrid/utilities/Constants.java +++ b/src/com/timsu/astrid/utilities/Constants.java @@ -20,7 +20,10 @@ public class Constants { /** Return to the task list view */ public static final int RESULT_GO_HOME = Activity.RESULT_FIRST_USER; + /** Discard changes */ + public static final int RESULT_DISCARD = Activity.RESULT_FIRST_USER + 1; + /** Callback to force synchronization */ - public static final int RESULT_SYNCHRONIZE = Activity.RESULT_FIRST_USER + 1; + public static final int RESULT_SYNCHRONIZE = Activity.RESULT_FIRST_USER + 2; } diff --git a/src/com/timsu/astrid/utilities/StartupReceiver.java b/src/com/timsu/astrid/utilities/StartupReceiver.java index 852cef71d..9b664091d 100644 --- a/src/com/timsu/astrid/utilities/StartupReceiver.java +++ b/src/com/timsu/astrid/utilities/StartupReceiver.java @@ -18,7 +18,7 @@ public class StartupReceiver extends BroadcastReceiver { } /** Called when this application is started up */ - public static void onStartupApplication(Context context) { + public static void onStartupApplication(final Context context) { if(hasStartedUp) return; @@ -34,9 +34,18 @@ public class StartupReceiver extends BroadcastReceiver { // if we just got upgraded, set the alarms boolean justUpgraded = latestSetVersion != version; + final int finalVersion = version; if(justUpgraded) { - Notifications.scheduleAllAlarms(context); - Preferences.setCurrentVersion(context, version); + new Thread(new Runnable() { + @Override + public void run() { + Notifications.scheduleAllAlarms(context); + + // do this after all alarms are scheduled, so if we're + // interrupted, the thread will resume later + Preferences.setCurrentVersion(context, finalVersion); + } + }).start(); } Preferences.setPreferenceDefaults(context);