Fixed swipe to work over a TaskList row, updated the notification for all tasks to search for tasks w/ alerts.

pull/14/head
Tim Su 17 years ago
parent 836429d700
commit 79be2aed86

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid" package="com.timsu.astrid"
android:versionCode="47" android:versionCode="55"
android:versionName="1.11.3"> android:versionName="1.11.10">
<meta-data android:name="com.a0soft.gphone.aTrackDog.webURL" <meta-data android:name="com.a0soft.gphone.aTrackDog.webURL"
android:value="http://www.weloveastrid.com" /> android:value="http://www.weloveastrid.com" />
<meta-data android:name="com.a0soft.gphone.aTrackDog.testVersion" <meta-data android:name="com.a0soft.gphone.aTrackDog.testVersion"
android:value="45" /> android:value="48" />
<uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/> <!-- uses-permission android:name="android.permission.INTERNET"/-->
<application android:icon="@drawable/icon" android:label="@string/app_name"> <application android:icon="@drawable/icon" android:label="@string/app_name">

@ -32,6 +32,7 @@ import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.GestureDetector; import android.view.GestureDetector;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -74,8 +75,6 @@ public class TagList extends Activity {
private static final int CONTEXT_DELETE_ID = Menu.FIRST + 11; private static final int CONTEXT_DELETE_ID = Menu.FIRST + 11;
private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12; private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12;
private static final int FLING_THRESHOLD = 50;
private TagController controller; private TagController controller;
private TaskController taskController; private TaskController taskController;
private ListView listView; private ListView listView;
@ -101,22 +100,23 @@ public class TagList extends Activity {
gestureDetector = new GestureDetector(new TagListGestureDetector()); gestureDetector = new GestureDetector(new TagListGestureDetector());
} }
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (gestureDetector.onTouchEvent(ev)) {
return true;
}
return super.onTouchEvent(ev);
}
class TagListGestureDetector extends GestureDetector.SimpleOnGestureListener { class TagListGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > FLING_THRESHOLD) { try {
Log.i("astrid", "Got fling. X: " + (e2.getX() - e1.getX()) +
", vel: " + velocityX);
// flick L to R
if(e2.getX() - e1.getX() > TaskList.FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > TaskList.FLING_VEL_THRESHOLD) {
setResult(RESULT_CANCELED); setResult(RESULT_CANCELED);
finish(); finish();
return true; return true;
} }
} catch (Exception e) {
//
}
return false; return false;
} }
@ -237,6 +237,16 @@ public class TagList extends Activity {
menu.setHeaderTitle(tagArray.get(position).getName()); menu.setHeaderTitle(tagArray.get(position).getName());
} }
}); });
listView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
});
} }
@Override @Override

@ -35,6 +35,7 @@ import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.GestureDetector; import android.view.GestureDetector;
import android.view.Menu; import android.view.Menu;
@ -95,7 +96,8 @@ public class TaskList extends Activity {
private static final int CONTEXT_SORT_REVERSE = Menu.FIRST + 26; private static final int CONTEXT_SORT_REVERSE = Menu.FIRST + 26;
private static final int CONTEXT_SORT_GROUP = Menu.FIRST; private static final int CONTEXT_SORT_GROUP = Menu.FIRST;
private static final int FLING_THRESHOLD = 50; public static final int FLING_DIST_THRESHOLD = 100;
public static final int FLING_VEL_THRESHOLD = 300;
// UI components // UI components
private TaskController controller; private TaskController controller;
@ -109,6 +111,7 @@ public class TaskList extends Activity {
private List<TaskModelForList> taskArray; private List<TaskModelForList> taskArray;
private Map<TaskModelForList, List<TagModelForView>> taskTags; private Map<TaskModelForList, List<TagModelForView>> taskTags;
private GestureDetector gestureDetector; private GestureDetector gestureDetector;
private View.OnTouchListener gestureTouchListener;
// display filters // display filters
private static boolean filterShowHidden = false; private static boolean filterShowHidden = false;
@ -163,28 +166,41 @@ public class TaskList extends Activity {
// TODO Synchronizer.authenticate(this); // TODO Synchronizer.authenticate(this);
gestureDetector = new GestureDetector(new TaskListGestureDetector()); gestureDetector = new GestureDetector(new TaskListGestureDetector());
} gestureTouchListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
@Override if (gestureDetector.onTouchEvent(event)) {
public boolean onTouchEvent(MotionEvent ev) {
if (gestureDetector.onTouchEvent(ev)) {
return true; return true;
} }
return super.onTouchEvent(ev); return false;
}
};
} }
class TaskListGestureDetector extends GestureDetector.SimpleOnGestureListener { class TaskListGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e2.getX() - e1.getX() > FLING_THRESHOLD) { try {
Log.i("astrid", "Got fling. X: " + (e2.getX() - e1.getX()) +
", vel: " + velocityX);
// flick R to L
if(e1.getX() - e2.getX() > FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > FLING_VEL_THRESHOLD) {
showTagsView(); showTagsView();
return true; return true;
} else if(e1.getX() - e2.getX() > FLING_THRESHOLD && }
// flick L to R
else if(e2.getX() - e1.getX() > FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > FLING_VEL_THRESHOLD &&
!isTopLevelActivity()) { !isTopLevelActivity()) {
setResult(RESULT_CANCELED); setResult(RESULT_CANCELED);
finish(); finish();
return true; return true;
} }
} catch (Exception e) {
// ignore!
}
return false; return false;
} }
@ -425,6 +441,10 @@ public class TaskList extends Activity {
public void performItemClick(View v, int position) { public void performItemClick(View v, int position) {
listView.performItemClick(v, position, 0); listView.performItemClick(v, position, 0);
} }
public void onCreatedTaskListView(View v, TaskModelForList task) {
v.setOnTouchListener(gestureTouchListener);
}
}); });
listView.setAdapter(tasks); listView.setAdapter(tasks);
listView.setItemsCanFocus(true); listView.setItemsCanFocus(true);
@ -488,6 +508,8 @@ public class TaskList extends Activity {
item.setChecked(sortReverse); item.setChecked(sortReverse);
} }
}); });
listView.setOnTouchListener(gestureTouchListener);
} }
/* ====================================================================== /* ======================================================================
@ -546,7 +568,8 @@ public class TaskList extends Activity {
} }
public boolean isTopLevelActivity() { public boolean isTopLevelActivity() {
return (getIntent().getExtras() == null || return (getIntent() == null ||
getIntent().getExtras() == null ||
!getIntent().getExtras().containsKey(TAG_TOKEN)); !getIntent().getExtras().containsKey(TAG_TOKEN));
} }
@ -618,8 +641,7 @@ public class TaskList extends Activity {
return true; return true;
case CONTEXT_FILTER_TAG: case CONTEXT_FILTER_TAG:
filterTag = null; filterTag = null;
setResult(Constants.RESULT_GO_HOME); fillData();
finish();
return true; return true;
case CONTEXT_SORT_AUTO: case CONTEXT_SORT_AUTO:
if(sortMode == SortMode.AUTO) if(sortMode == SortMode.AUTO)

@ -71,6 +71,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
TaskController getTaskController(); TaskController getTaskController();
TagController getTagController(); TagController getTagController();
void performItemClick(View v, int position); void performItemClick(View v, int position);
void onCreatedTaskListView(View v, TaskModelForList task);
} }
public TaskListAdapter(Activity activity, Context context, int resource, public TaskListAdapter(Activity activity, Context context, int resource,
@ -188,6 +189,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
} }
setTaskAppearance(task, name, progress); setTaskAppearance(task, name, progress);
hooks.onCreatedTaskListView(view, task);
} }
private void addListeners(final int position, final View view) { private void addListeners(final int position, final View view) {

@ -20,8 +20,10 @@
package com.timsu.astrid.data.alerts; package com.timsu.astrid.data.alerts;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
@ -45,7 +47,8 @@ public class AlertController extends AbstractController {
new String[] { taskId.idAsString() }, null, null, null); new String[] { taskId.idAsString() }, null, null, null);
return cursor; return cursor;
} }
/** Get a list of tag identifiers for the given task */
/** Get a list of alerts for the given task */
public List<Date> getTaskAlerts(TaskIdentifier public List<Date> getTaskAlerts(TaskIdentifier
taskId) throws SQLException { taskId) throws SQLException {
List<Date> list = new LinkedList<Date>(); List<Date> list = new LinkedList<Date>();
@ -67,6 +70,28 @@ public class AlertController extends AbstractController {
} }
} }
/** Get a list of alerts that are set for the future */
public Set<TaskIdentifier> getTasksWithActiveAlerts() throws SQLException {
Set<TaskIdentifier> list = new HashSet<TaskIdentifier>();
Cursor cursor = alertDatabase.query(ALERT_TABLE_NAME,
Alert.FIELD_LIST, Alert.DATE + " > ?",
new String[] { Long.toString(System.currentTimeMillis()) }, null, null, null);
try {
if(cursor.getCount() == 0)
return list;
do {
cursor.moveToNext();
list.add(new Alert(cursor).getTask());
} while(!cursor.isLast());
return list;
} finally {
cursor.close();
}
}
/** Remove all alerts from the task */ /** Remove all alerts from the task */
public boolean removeAlerts(TaskIdentifier taskId) public boolean removeAlerts(TaskIdentifier taskId)
throws SQLException{ throws SQLException{

@ -21,7 +21,9 @@ package com.timsu.astrid.data.task;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import android.app.Activity; import android.app.Activity;
import android.content.ContentValues; import android.content.ContentValues;
@ -44,8 +46,8 @@ public class TaskController extends AbstractController {
// --- task list operations // --- task list operations
/** Return a list of all active tasks with notifications */ /** Return a list of all active tasks with notifications */
public List<TaskModelForNotify> getTasksWithNotifications() { public Set<TaskModelForNotify> getTasksWithNotifications() {
List<TaskModelForNotify> list = new ArrayList<TaskModelForNotify>(); Set<TaskModelForNotify> list = new HashSet<TaskModelForNotify>();
Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST, Cursor cursor = database.query(TASK_TABLE_NAME, TaskModelForNotify.FIELD_LIST,
String.format("%s < %d AND (%s != 0 OR %s != 0)", String.format("%s < %d AND (%s != 0 OR %s != 0)",
AbstractTaskModel.PROGRESS_PERCENTAGE, AbstractTaskModel.PROGRESS_PERCENTAGE,

@ -3,6 +3,7 @@ package com.timsu.astrid.utilities;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set;
import android.app.Activity; import android.app.Activity;
import android.app.AlarmManager; import android.app.AlarmManager;
@ -97,17 +98,31 @@ public class Notifications extends BroadcastReceiver {
} }
public static void scheduleAllAlarms(Context context) { public static void scheduleAllAlarms(Context context) {
try {
TaskController taskController = new TaskController(context); TaskController taskController = new TaskController(context);
taskController.open(); taskController.open();
AlertController alertController = new AlertController(context); AlertController alertController = new AlertController(context);
alertController.open(); alertController.open();
List<TaskModelForNotify> tasks = taskController.getTasksWithNotifications(); Set<TaskModelForNotify> tasks = taskController.getTasksWithNotifications();
Set<TaskIdentifier> tasksWithAlerts = alertController.getTasksWithActiveAlerts();
for(TaskIdentifier taskId : tasksWithAlerts) {
try {
tasks.add(taskController.fetchTaskForNotify(taskId));
} catch (Exception e) {
// task was deleted or something
}
}
for(TaskModelForNotify task : tasks) for(TaskModelForNotify task : tasks)
updateAlarm(context, taskController, alertController, task); updateAlarm(context, taskController, alertController, task);
alertController.close(); alertController.close();
taskController.close(); taskController.close();
} catch (Exception e) {
Log.e("astrid", "Error scheduling alarms", e);
}
} }
/** Schedules the next notification for this task */ /** Schedules the next notification for this task */

Loading…
Cancel
Save