From 480a54bfa1ce966ca2d9d41a812bb4d7b50fd4cf Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 23 Feb 2009 04:17:13 +0000 Subject: [PATCH] Fixes caused by thread stuff. --- res/values/strings.xml | 1 + .../timsu/astrid/activities/SubActivity.java | 4 + .../astrid/activities/TaskListAdapter.java | 2 +- .../activities/TaskListSubActivity.java | 173 +++++++++++------- .../astrid/data/enums/RepeatInterval.java | 6 + .../astrid/data/task/AbstractTaskModel.java | 4 +- .../astrid/data/task/TaskController.java | 2 +- .../astrid/data/task/TaskModelForList.java | 5 + 8 files changed, 122 insertions(+), 75 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 20f70ca21..c3b55209e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -36,6 +36,7 @@ Day(s) Week(s) Month(s) + Hour(s) diff --git a/src/com/timsu/astrid/activities/SubActivity.java b/src/com/timsu/astrid/activities/SubActivity.java index 4e3d7b590..e587c2ad3 100644 --- a/src/com/timsu/astrid/activities/SubActivity.java +++ b/src/com/timsu/astrid/activities/SubActivity.java @@ -77,6 +77,10 @@ abstract public class SubActivity { return false; } + void onSaveInstanceState(Bundle outState) { + // + } + // --- pass-through to activity methods public Resources getResources() { diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src/com/timsu/astrid/activities/TaskListAdapter.java index 92a00624a..045edd71d 100644 --- a/src/com/timsu/astrid/activities/TaskListAdapter.java +++ b/src/com/timsu/astrid/activities/TaskListAdapter.java @@ -279,7 +279,7 @@ public class TaskListAdapter extends ArrayAdapter { String cachedResult = task.getCachedLabel(KEY_NAME); if(cachedResult == null) { String nameValue = task.getName(); - if(task.getHiddenUntil() != null && task.getHiddenUntil().after(new Date())) { + if(task.getHiddenUntil() != null && task.getHiddenUntil().getTime() > System.currentTimeMillis()) { nameValue = "(" + r.getString(R.string.taskList_hiddenPrefix) + ") " + nameValue; task.putCachedLabel(KEY_HIDDEN, CACHE_TRUE); } diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index 3f079e467..7b7266d98 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -129,7 +129,8 @@ public class TaskListSubActivity extends SubActivity { private HashMap> taskTags; private Long selectedTaskId = null; private TaskModelForList selectedTask = null; - private Handler handler; + private Handler handler = null; + private Thread loadingThread = null; // display filters private static boolean filterShowHidden = false; @@ -137,6 +138,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; /* ====================================================================== * ======================================================= initialization @@ -167,7 +169,7 @@ public class TaskListSubActivity extends SubActivity { setupUIComponents(); // time to go! - new Thread(new Runnable() { + loadingThread = new Thread(new Runnable() { @Override public void run() { loadTaskListSort(); @@ -185,13 +187,16 @@ 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); } }); } + loadingThread = null; } - }).start(); + }); + loadingThread.start(); } @@ -295,7 +300,7 @@ public class TaskListSubActivity extends SubActivity { Date definite = task.getDefiniteDueDate(); Date preferred = task.getPreferredDueDate(); if(definite != null && preferred != null) { - if(preferred.before(new Date())) + if(preferred.getTime() < System.currentTimeMillis()) return definite.getTime(); return preferred.getTime(); } else if(definite != null) @@ -403,7 +408,7 @@ public class TaskListSubActivity extends SubActivity { } /** Fill in the Task List with our tasks */ - private void fillData() { + private synchronized void fillData() { // get a cursor to the task list Cursor tasksCursor; if(filterTag != null) { @@ -519,63 +524,73 @@ public class TaskListSubActivity extends SubActivity { loadingText.setVisibility(View.GONE); } }); - } - /** Set up the adapter for our task list */ - private void setUpListUI() { - // set up our adapter - TaskListAdapter tasks = new TaskListAdapter(getParent(), - R.layout.task_list_row, taskArray, new TaskListAdapterHooks() { - @Override - public TagController tagController() { - return getTagController(); - } + class TaskListHooks implements TaskListAdapterHooks { - @Override - public List getTagsFor( - TaskModelForList task) { - return taskTags.get(task); - } + private HashMap> myTaskTags; + private List myTaskArray; - @Override - public List getTaskArray() { - return taskArray; - } + public TaskListHooks() { + this.myTaskTags = taskTags; + this.myTaskArray = taskArray; + } - @Override - public TaskController taskController() { - return getTaskController(); - } + @Override + public TagController tagController() { + return getTagController(); + } - @Override - public void performItemClick(View v, int position) { - listView.performItemClick(v, position, 0); - } + @Override + public List getTagsFor( + TaskModelForList task) { + return myTaskTags.get(task); + } - public void onCreatedTaskListView(View v, TaskModelForList task) { - v.setOnTouchListener(getGestureListener()); - } + @Override + public List getTaskArray() { + return myTaskArray; + } - @Override - public void editItem(TaskModelForList task) { - editTask(task); - } + @Override + public TaskController taskController() { + return getTaskController(); + } - @Override - public void toggleTimerOnItem(TaskModelForList task) { - toggleTimer(task); - } + @Override + public void performItemClick(View v, int position) { + listView.performItemClick(v, position, 0); + } - @Override - public void setSelectedItem(TaskIdentifier taskId) { - if(taskId == null) { - selectedTaskId = null; - selectedTask = null; - } else - selectedTaskId = taskId.getId(); - } - }); + public void onCreatedTaskListView(View v, TaskModelForList task) { + v.setOnTouchListener(getGestureListener()); + } + + @Override + public void editItem(TaskModelForList task) { + editTask(task); + } + + @Override + public void toggleTimerOnItem(TaskModelForList task) { + toggleTimer(task); + } + + @Override + public void setSelectedItem(TaskIdentifier taskId) { + if(taskId == null) { + selectedTaskId = null; + selectedTask = null; + } else + selectedTaskId = taskId.getId(); + } + } + + /** Set up the adapter for our task list */ + private void setUpListUI() { + // set up our adapter + TaskListAdapter tasks = new TaskListAdapter(getParent(), + R.layout.task_list_row, taskArray, new TaskListHooks()); listView.setAdapter(tasks); listView.setItemsCanFocus(true); @@ -660,21 +675,24 @@ public class TaskListSubActivity extends SubActivity { return false; } + @Override + protected void onSaveInstanceState(Bundle outState) { + if(loadingThread != null) + loadingThread.stop(); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == Constants.RESULT_SYNCHRONIZE) { Synchronizer.synchronize(getParent(), false, new SynchronizerListener() { @Override public void onSynchronizerFinished(int numServicesSynced) { - if(numServicesSynced == 0) + if(numServicesSynced == 0) { DialogUtilities.okDialog(getParent(), getResources().getString( R.string.sync_no_synchronizers), null); - new Thread(new Runnable() { - @Override - public void run() { - fillData(); - } - }); + return; + } + fillData(); } }); } else if(requestCode == ACTIVITY_TAGS) @@ -685,6 +703,11 @@ public class TaskListSubActivity extends SubActivity { public void onWindowFocusChanged(boolean hasFocus) { // refresh, since stuff might have changed... if(hasFocus) { + if(suppressReload) { + suppressReload = false; + return; + } + fillData(); } } @@ -772,6 +795,19 @@ public class TaskListSubActivity extends SubActivity { sortMode = SortMode.values()[sortId - 1]; } + /** Compute date after postponing tasks */ + private Date computePostponeDate(Date input, long postponeMillis, + boolean shiftFromTodayIfPast) { + if(input != null) { + if(shiftFromTodayIfPast && input.getTime() < System.currentTimeMillis()) + input = new Date(); + input = new Date(input.getTime() + + postponeMillis); + } + + return input; + } + @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { final TaskModelForList task; @@ -839,18 +875,13 @@ public class TaskListSubActivity extends SubActivity { public void onNumbersPicked(int[] values) { long postponeMillis = (values[0] * 24 + values[1]) * 3600L * 1000; - Date preferred = task.getPreferredDueDate(); - if(preferred != null) { - preferred = new Date(preferred.getTime() + - postponeMillis); - task.setPreferredDueDate(preferred); - } - Date definite = task.getDefiniteDueDate(); - if(definite != null) { - definite = new Date(definite.getTime() + - postponeMillis); - task.setDefiniteDueDate(definite); - } + task.setPreferredDueDate(computePostponeDate( + task.getPreferredDueDate(), postponeMillis, true)); + task.setDefiniteDueDate(computePostponeDate( + task.getDefiniteDueDate(), postponeMillis, true)); + task.setHiddenUntil(computePostponeDate( + task.getHiddenUntil(), postponeMillis, false)); + getTaskController().saveTask(task); fillData(); } diff --git a/src/com/timsu/astrid/data/enums/RepeatInterval.java b/src/com/timsu/astrid/data/enums/RepeatInterval.java index 12b9e8837..dd1239013 100644 --- a/src/com/timsu/astrid/data/enums/RepeatInterval.java +++ b/src/com/timsu/astrid/data/enums/RepeatInterval.java @@ -45,6 +45,12 @@ public enum RepeatInterval { input.setMonth(input.getMonth() + number); } }, + HOURS(R.string.repeat_hours) { + @Override + public void offsetDateBy(Date input, int number) { + input.setHours(input.getHours() + number); + } + }, ; diff --git a/src/com/timsu/astrid/data/task/AbstractTaskModel.java b/src/com/timsu/astrid/data/task/AbstractTaskModel.java index b0c3153a5..ac433d56f 100644 --- a/src/com/timsu/astrid/data/task/AbstractTaskModel.java +++ b/src/com/timsu/astrid/data/task/AbstractTaskModel.java @@ -382,7 +382,7 @@ public abstract class AbstractTaskModel extends AbstractModel { protected boolean isHidden() { if(getHiddenUntil() == null) return false; - return getHiddenUntil().after(new Date()); + return getHiddenUntil().getTime() > System.currentTimeMillis(); } protected Date getCreationDate() { @@ -522,7 +522,7 @@ public abstract class AbstractTaskModel extends AbstractModel { protected void putDate(String fieldName, Date date) { if(date == null) - putIfChangedFromDatabase(fieldName, (Long)null); + putIfChangedFromDatabase(fieldName, 0); else putIfChangedFromDatabase(fieldName, date.getTime()); } diff --git a/src/com/timsu/astrid/data/task/TaskController.java b/src/com/timsu/astrid/data/task/TaskController.java index 1479ea9f0..fc503bc54 100644 --- a/src/com/timsu/astrid/data/task/TaskController.java +++ b/src/com/timsu/astrid/data/task/TaskController.java @@ -259,7 +259,7 @@ public class TaskController extends AbstractController { // task timer was updated, update notification bar if(values.containsKey(AbstractTaskModel.TIMER_START)) { // show notification bar if timer was started - if(values.get(AbstractTaskModel.TIMER_START) != null) { + if(values.getAsLong(AbstractTaskModel.TIMER_START) != 0) { Notifications.showTimingNotification(context, task.getTaskIdentifier(), task.getName()); } else { diff --git a/src/com/timsu/astrid/data/task/TaskModelForList.java b/src/com/timsu/astrid/data/task/TaskModelForList.java index d9d3a99b4..5b4413396 100644 --- a/src/com/timsu/astrid/data/task/TaskModelForList.java +++ b/src/com/timsu/astrid/data/task/TaskModelForList.java @@ -243,4 +243,9 @@ public class TaskModelForList extends AbstractTaskModel { public void setImportance(Importance importance) { super.setImportance(importance); } + + @Override + public void setHiddenUntil(Date hiddenUntil) { + super.setHiddenUntil(hiddenUntil); + } }