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);
+ }
}