Got task and tag list onto one activity.

pull/14/head
Tim Su 17 years ago
parent 16efea1657
commit ba5ab848e6

@ -7,14 +7,14 @@
<meta-data android:name="com.a0soft.gphone.aTrackDog.webURL"
android:value="http://www.weloveastrid.com" />
<meta-data android:name="com.a0soft.gphone.aTrackDog.testVersion"
android:value="63" />
android:value="73" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".activities.TaskList"
<activity android:name=".activities.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -33,8 +33,6 @@
<activity android:name=".activities.TaskEdit"
android:label="@string/taskEdit_label"/>
<activity android:name=".activities.TagList"/>
<activity android:name=".activities.EditPreferences"/>

@ -90,111 +90,113 @@ public final class R {
public static final int timepicker_up_selected=0x7f020029;
}
public static final class id {
public static final int addAlert=0x7f0b0036;
public static final int addtask=0x7f0b003e;
public static final int alert_container=0x7f0b0035;
public static final int alerts_label=0x7f0b0034;
public static final int btn_tasklist=0x7f0b004f;
public static final int btn_viewtask=0x7f0b004e;
public static final int addAlert=0x7f0b003b;
public static final int addtask=0x7f0b0008;
public static final int alert_container=0x7f0b003a;
public static final int alerts_label=0x7f0b0039;
public static final int btn_tasklist=0x7f0b0051;
public static final int btn_viewtask=0x7f0b0050;
public static final int button=0x7f0b0003;
public static final int button1=0x7f0b0002;
public static final int button_layout=0x7f0b0052;
public static final int cb1=0x7f0b0041;
public static final int cell_creationDate=0x7f0b005a;
public static final int cell_definiteDueDate=0x7f0b0058;
public static final int cell_elapsed=0x7f0b0055;
public static final int cell_estimated=0x7f0b0056;
public static final int cell_notes=0x7f0b0057;
public static final int cell_preferredDueDate=0x7f0b0059;
public static final int container=0x7f0b0005;
public static final int button_layout=0x7f0b0054;
public static final int cb1=0x7f0b0043;
public static final int cell_creationDate=0x7f0b005c;
public static final int cell_definiteDueDate=0x7f0b005a;
public static final int cell_elapsed=0x7f0b0057;
public static final int cell_estimated=0x7f0b0058;
public static final int cell_notes=0x7f0b0059;
public static final int cell_preferredDueDate=0x7f0b005b;
public static final int container=0x7f0b000c;
public static final int date=0x7f0b0000;
public static final int decrement=0x7f0b0008;
public static final int definiteDueDate_date=0x7f0b0022;
public static final int definiteDueDate_label=0x7f0b0020;
public static final int definiteDueDate_notnull=0x7f0b0021;
public static final int definiteDueDate_time=0x7f0b0023;
public static final int delete=0x7f0b001e;
public static final int discard=0x7f0b001d;
public static final int edit=0x7f0b005b;
public static final int elapsedDuration=0x7f0b0030;
public static final int elapsedDuration_label=0x7f0b002f;
public static final int estimatedDuration=0x7f0b0019;
public static final int estimatedDuration_label=0x7f0b0018;
public static final int event=0x7f0b0011;
public static final int flag_after=0x7f0b003a;
public static final int flag_before=0x7f0b0038;
public static final int flag_during=0x7f0b0039;
public static final int flag_nonstop=0x7f0b003b;
public static final int flags_label=0x7f0b0037;
public static final int footer=0x7f0b000a;
public static final int forget=0x7f0b000b;
public static final int frame=0x7f0b000f;
public static final int greeting=0x7f0b004c;
public static final int hiddenUntil_date=0x7f0b002a;
public static final int hiddenUntil_label=0x7f0b0028;
public static final int hiddenUntil_notnull=0x7f0b0029;
public static final int hiddenUntil_time=0x7f0b002b;
public static final int icon_layout=0x7f0b0040;
public static final int imageLeft=0x7f0b0042;
public static final int importance=0x7f0b004b;
public static final int importance_container=0x7f0b0015;
public static final int importance_label=0x7f0b0014;
public static final int increment=0x7f0b0006;
public static final int name=0x7f0b0013;
public static final int name_label=0x7f0b0012;
public static final int notes=0x7f0b001b;
public static final int notes_label=0x7f0b001a;
public static final int notification=0x7f0b0033;
public static final int notification_label=0x7f0b0032;
public static final int numberPicker=0x7f0b0009;
public static final int preferredDueDate_date=0x7f0b0026;
public static final int preferredDueDate_label=0x7f0b0024;
public static final int preferredDueDate_notnull=0x7f0b0025;
public static final int preferredDueDate_time=0x7f0b0027;
public static final int progress=0x7f0b0054;
public static final int repeat_interval=0x7f0b002e;
public static final int repeat_label=0x7f0b002c;
public static final int repeat_value=0x7f0b002d;
public static final int row_layout=0x7f0b003f;
public static final int save=0x7f0b001c;
public static final int scroll_view=0x7f0b0050;
public static final int sync=0x7f0b000c;
public static final int tab_basic=0x7f0b0010;
public static final int tab_dates=0x7f0b001f;
public static final int tab_notification=0x7f0b0031;
public static final int taglist=0x7f0b000e;
public static final int taglist_layout=0x7f0b000d;
public static final int tags_container=0x7f0b0017;
public static final int tags_label=0x7f0b0016;
public static final int task_name=0x7f0b0044;
public static final int tasklist=0x7f0b003d;
public static final int tasklist_layout=0x7f0b003c;
public static final int taskname=0x7f0b004d;
public static final int decrement=0x7f0b000f;
public static final int definiteDueDate_date=0x7f0b0027;
public static final int definiteDueDate_label=0x7f0b0025;
public static final int definiteDueDate_notnull=0x7f0b0026;
public static final int definiteDueDate_time=0x7f0b0028;
public static final int delete=0x7f0b0023;
public static final int discard=0x7f0b0022;
public static final int edit=0x7f0b005d;
public static final int elapsedDuration=0x7f0b0035;
public static final int elapsedDuration_label=0x7f0b0034;
public static final int estimatedDuration=0x7f0b001e;
public static final int estimatedDuration_label=0x7f0b001d;
public static final int event=0x7f0b0016;
public static final int flag_after=0x7f0b003f;
public static final int flag_before=0x7f0b003d;
public static final int flag_during=0x7f0b003e;
public static final int flag_nonstop=0x7f0b0040;
public static final int flags_label=0x7f0b003c;
public static final int footer=0x7f0b0011;
public static final int forget=0x7f0b0012;
public static final int frame=0x7f0b0014;
public static final int greeting=0x7f0b004e;
public static final int hiddenUntil_date=0x7f0b002f;
public static final int hiddenUntil_label=0x7f0b002d;
public static final int hiddenUntil_notnull=0x7f0b002e;
public static final int hiddenUntil_time=0x7f0b0030;
public static final int icon_layout=0x7f0b0042;
public static final int imageLeft=0x7f0b0044;
public static final int importance=0x7f0b004d;
public static final int importance_container=0x7f0b001a;
public static final int importance_label=0x7f0b0019;
public static final int increment=0x7f0b000d;
public static final int main=0x7f0b0005;
public static final int name=0x7f0b0018;
public static final int name_label=0x7f0b0017;
public static final int notes=0x7f0b0020;
public static final int notes_label=0x7f0b001f;
public static final int notification=0x7f0b0038;
public static final int notification_label=0x7f0b0037;
public static final int numberPicker=0x7f0b0010;
public static final int preferredDueDate_date=0x7f0b002b;
public static final int preferredDueDate_label=0x7f0b0029;
public static final int preferredDueDate_notnull=0x7f0b002a;
public static final int preferredDueDate_time=0x7f0b002c;
public static final int progress=0x7f0b0056;
public static final int repeat_interval=0x7f0b0033;
public static final int repeat_label=0x7f0b0031;
public static final int repeat_value=0x7f0b0032;
public static final int row_layout=0x7f0b0041;
public static final int save=0x7f0b0021;
public static final int scroll_view=0x7f0b0052;
public static final int sync=0x7f0b0013;
public static final int tab_basic=0x7f0b0015;
public static final int tab_dates=0x7f0b0024;
public static final int tab_notification=0x7f0b0036;
public static final int taglist=0x7f0b000a;
public static final int taglist_layout=0x7f0b0009;
public static final int tags_container=0x7f0b001c;
public static final int tags_label=0x7f0b001b;
public static final int task_name=0x7f0b0046;
public static final int tasklist=0x7f0b0007;
public static final int tasklist_layout=0x7f0b0006;
public static final int tasklistwtag_layout=0x7f0b000b;
public static final int taskname=0x7f0b004f;
public static final int text1=0x7f0b0004;
public static final int text_deadlines=0x7f0b0045;
public static final int text_layout=0x7f0b0043;
public static final int text_notes=0x7f0b004a;
public static final int text_reminders=0x7f0b0048;
public static final int text_repeats=0x7f0b0047;
public static final int text_tags=0x7f0b0049;
public static final int text_times=0x7f0b0046;
public static final int text_deadlines=0x7f0b0047;
public static final int text_layout=0x7f0b0045;
public static final int text_notes=0x7f0b004c;
public static final int text_reminders=0x7f0b004a;
public static final int text_repeats=0x7f0b0049;
public static final int text_tags=0x7f0b004b;
public static final int text_times=0x7f0b0048;
public static final int time=0x7f0b0001;
public static final int timepicker_input=0x7f0b0007;
public static final int timerButton=0x7f0b0053;
public static final int view_layout=0x7f0b0051;
public static final int timepicker_input=0x7f0b000e;
public static final int timerButton=0x7f0b0055;
public static final int view_layout=0x7f0b0053;
}
public static final class layout {
public static final int edit_alert_item=0x7f030000;
public static final int edit_importance_item=0x7f030001;
public static final int edit_tag_item=0x7f030002;
public static final int importance_spinner_dropdown=0x7f030003;
public static final int n_number_picker_dialog=0x7f030004;
public static final int number_picker=0x7f030005;
public static final int number_picker_dialog=0x7f030006;
public static final int sync_footer=0x7f030007;
public static final int tag_list=0x7f030008;
public static final int task_edit=0x7f030009;
public static final int task_list=0x7f03000a;
public static final int main=0x7f030004;
public static final int n_number_picker_dialog=0x7f030005;
public static final int number_picker=0x7f030006;
public static final int number_picker_dialog=0x7f030007;
public static final int sync_footer=0x7f030008;
public static final int tag_list=0x7f030009;
public static final int task_edit=0x7f03000a;
public static final int task_list_row=0x7f03000b;
public static final int task_notify=0x7f03000c;
public static final int task_view=0x7f03000d;

@ -24,7 +24,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
@ -32,13 +31,10 @@ import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
@ -51,23 +47,22 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import com.timsu.astrid.R;
import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.activities.MainActivity.SubActivities;
import com.timsu.astrid.activities.MainActivity.SubActivity;
import com.timsu.astrid.data.tag.TagIdentifier;
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;
import com.timsu.astrid.utilities.Constants;
/** List all tags and allows a user to see all tasks for a given tag
/**
* List all tags and allows a user to see all tasks for a given tag
*
* @author Tim Su (timsu@stanfordalumni.org)
*
*/
public class TagList extends Activity {
private static final int ACTIVITY_LIST = 0;
private static final int ACTIVITY_CREATE = 1;
public class TagList extends SubActivity {
private static final int ACTIVITY_CREATE = 0;
private static final int MENU_SORT_ALPHA_ID = Menu.FIRST;
private static final int MENU_SORT_SIZE_ID = Menu.FIRST + 1;
@ -75,56 +70,22 @@ public class TagList extends Activity {
private static final int CONTEXT_DELETE_ID = Menu.FIRST + 11;
private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12;
private TagController controller;
private TaskController taskController;
private ListView listView;
private List<TagModelForView> tagArray;
private Map<Long, TaskModelForList> taskMap;
private Map<TagModelForView, Integer> tagToTaskCount;
private GestureDetector gestureDetector;
Map<TagModelForView, Integer> tagToTaskCount;
private static SortMode sortMode = SortMode.SIZE;
private static boolean sortReverse = false;
/** Called when loading up the activity for the first time */
private void onLoad() {
controller = new TagController(this);
controller.open();
taskController = new TaskController(this);
taskController.open();
listView = (ListView)findViewById(R.id.taglist);
fillData();
gestureDetector = new GestureDetector(new TagListGestureDetector());
public TagList(MainActivity parent, SubActivities code, View view) {
super(parent, code, view);
}
@Override
public void finish() {
super.finish();
}
class TagListGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
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);
finish();
return true;
}
} catch (Exception e) {
//
}
return false;
}
public void onDisplay(Bundle variables) {
listView = (ListView)findViewById(R.id.taglist);
fillData();
}
// --- stuff for sorting
@ -148,10 +109,10 @@ public class TagList extends Activity {
private void sortTagArray() {
// get all tasks
Cursor taskCursor = taskController.getActiveTaskListCursor();
Cursor taskCursor = getTaskController().getActiveTaskListCursor();
startManagingCursor(taskCursor);
List<TaskModelForList> taskArray =
taskController.createTaskListFromCursor(taskCursor);
getTaskController().createTaskListFromCursor(taskCursor);
taskMap = new HashMap<Long, TaskModelForList>();
for(TaskModelForList task : taskArray) {
if(task.isHidden())
@ -163,8 +124,8 @@ public class TagList extends Activity {
tagToTaskCount = new HashMap<TagModelForView, Integer>();
for(TagModelForView tag : tagArray) {
int count = 0;
List<TaskIdentifier> tasks = controller.getTaggedTasks(TagList.this,
tag.getTagIdentifier());
List<TaskIdentifier> tasks = getTagController().getTaggedTasks(
getParent(), tag.getTagIdentifier());
for(TaskIdentifier taskId : tasks)
if(taskMap.containsKey(taskId.getId()))
@ -189,7 +150,7 @@ public class TagList extends Activity {
private void fillData() {
Resources r = getResources();
tagArray = controller.getAllTags(this);
tagArray = getTagController().getAllTags(getParent());
// perform sort
sortTagArray();
@ -202,7 +163,7 @@ public class TagList extends Activity {
setTitle(title);
// set up our adapter
TagListAdapter tagAdapter = new TagListAdapter(this,
TagListAdapter tagAdapter = new TagListAdapter(getParent(),
android.R.layout.simple_list_item_1, tagArray);
listView.setAdapter(tagAdapter);
@ -213,10 +174,9 @@ public class TagList extends Activity {
int position, long id) {
TagModelForView tag = (TagModelForView)view.getTag();
Intent intent = new Intent(TagList.this, TaskList.class);
intent.putExtra(TaskList.TAG_TOKEN, tag.
getTagIdentifier().getId());
startActivityForResult(intent, ACTIVITY_LIST);
Bundle bundle = new Bundle();
bundle.putLong(TaskList.TAG_TOKEN, tag.getTagIdentifier().getId());
switchToActivity(SubActivities.TASK_LIST_W_TAG, bundle);
}
});
@ -244,88 +204,25 @@ public class TagList extends Activity {
});
listView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
});
listView.setOnTouchListener(getGestureListener());
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
switch(resultCode) {
case Constants.RESULT_GO_HOME:
finish();
break;
default:
fillData();
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus && TaskList.shouldCloseInstance) { // user wants to quit
finish();
}
fillData();
}
// --- list adapter
private class TagListAdapter extends ArrayAdapter<TagModelForView> {
private List<TagModelForView> objects;
private int resource;
private LayoutInflater inflater;
public TagListAdapter(Context context, int resource,
List<TagModelForView> objects) {
super(context, resource, objects);
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.objects = objects;
this.resource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
view = inflater.inflate(resource, parent, false);
setupView(view, objects.get(position));
return view;
}
public void setupView(View view, final TagModelForView tag) {
Resources r = getResources();
view.setTag(tag);
final TextView name = ((TextView)view.findViewById(android.R.id.text1));
name.setText(new StringBuilder(tag.getName()).
append(" (").append(tagToTaskCount.get(tag)).append(")"));
if(tagToTaskCount.get(tag) == 0)
name.setTextColor(r.getColor(R.color.task_list_done));
}
}
// --- ui control handlers
private void createTask(TagModelForView tag) {
Intent intent = new Intent(this, TaskEdit.class);
Intent intent = new Intent(getParent(), TaskEdit.class);
intent.putExtra(TaskEdit.TAG_NAME_TOKEN, tag.getName());
startActivityForResult(intent, ACTIVITY_CREATE);
launchActivity(intent, ACTIVITY_CREATE);
}
private void deleteTag(final TagIdentifier tagId) {
new AlertDialog.Builder(this)
new AlertDialog.Builder(getParent())
.setTitle(R.string.delete_title)
.setMessage(R.string.delete_this_tag_title)
.setIcon(android.R.drawable.ic_dialog_alert)
@ -333,7 +230,7 @@ public class TagList extends Activity {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
controller.deleteTag(tagId);
getTagController().deleteTag(tagId);
fillData();
}
})
@ -342,7 +239,7 @@ public class TagList extends Activity {
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case MENU_SORT_ALPHA_ID:
if(sortMode == SortMode.ALPHA)
@ -373,35 +270,18 @@ public class TagList extends Activity {
case CONTEXT_SHOWHIDE_ID:
tag = tagArray.get(item.getGroupId());
tag.toggleHideFromMainList();
controller.saveTag(tag);
getTagController().saveTag(tag);
fillData();
return true;
}
return super.onMenuItemSelected(featureId, item);
return false;
}
// --- creating stuff
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tag_list);
onLoad();
}
@Override
protected void onDestroy() {
super.onDestroy();
controller.close();
taskController.close();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item;
item = menu.add(Menu.NONE, MENU_SORT_ALPHA_ID, Menu.NONE,
@ -416,4 +296,47 @@ public class TagList extends Activity {
return true;
}
// --------------------------------------------------- tag list adapter
private class TagListAdapter extends ArrayAdapter<TagModelForView> {
private List<TagModelForView> objects;
private int resource;
private LayoutInflater inflater;
public TagListAdapter(Context context, int resource,
List<TagModelForView> objects) {
super(context, resource, objects);
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.objects = objects;
this.resource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null) {
view = inflater.inflate(resource, parent, false);
}
setupView(view, objects.get(position));
return view;
}
public void setupView(View view, final TagModelForView tag) {
Resources r = getResources();
view.setTag(tag);
final TextView name = ((TextView)view.findViewById(android.R.id.text1));
name.setText(new StringBuilder(tag.getName()).
append(" (").append(tagToTaskCount.get(tag)).append(")"));
if(tagToTaskCount.get(tag) == 0)
name.setTextColor(r.getColor(R.color.task_list_done));
}
}
}

@ -507,7 +507,7 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus && TaskList.shouldCloseInstance) { // user wants to quit
if(hasFocus && MainActivity.shouldCloseInstance) { // user wants to quit
finish();
}
}

@ -28,7 +28,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
@ -36,12 +35,9 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
@ -51,6 +47,8 @@ import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import com.timsu.astrid.R;
import com.timsu.astrid.activities.MainActivity.SubActivities;
import com.timsu.astrid.activities.MainActivity.SubActivity;
import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks;
import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.tag.TagIdentifier;
@ -63,17 +61,17 @@ import com.timsu.astrid.sync.Synchronizer.SynchronizerListener;
import com.timsu.astrid.utilities.Constants;
import com.timsu.astrid.utilities.DialogUtilities;
import com.timsu.astrid.utilities.Preferences;
import com.timsu.astrid.utilities.StartupReceiver;
import com.timsu.astrid.widget.NNumberPickerDialog.OnNNumberPickedListener;
/** Primary view for the Astrid Application. Lists all of the tasks in the
/**
* Primary view for the Astrid Application. Lists all of the tasks in the
* system, and allows users to edit them.
*
* @author Tim Su (timsu@stanfordalumni.org)
*
*/
public class TaskList extends Activity {
public class TaskList extends SubActivity {
// bundle tokens
public static final String TAG_TOKEN = "tag";
@ -105,9 +103,6 @@ public class TaskList extends Activity {
private static final int CONTEXT_SORT_REVERSE = Menu.FIRST + 26;
private static final int CONTEXT_SORT_GROUP = Menu.FIRST;
public static final int FLING_DIST_THRESHOLD = 100;
public static final int FLING_VEL_THRESHOLD = 300;
private static final int SORTFLAG_FILTERDONE = (1 << 5);
private static final int SORTFLAG_FILTERHIDDEN = (1 << 6);
@ -120,9 +115,6 @@ public class TaskList extends Activity {
private Map<TagIdentifier, TagModelForView> tagMap;
private ArrayList<TaskModelForList> taskArray;
private HashMap<TaskModelForList, LinkedList<TagModelForView>> taskTags;
private GestureDetector gestureDetector;
private View.OnTouchListener gestureTouchListener;
private boolean displaySyncShortcut;
// display filters
private static boolean filterShowHidden = false;
@ -131,51 +123,32 @@ public class TaskList extends Activity {
private static SortMode sortMode = SortMode.AUTO;
private static boolean sortReverse = false;
static boolean shouldCloseInstance = false;
// database controllers
private TaskController taskController;
private TagController tagController;
/* ======================================================================
* ======================================================= initialization
* ====================================================================== */
public TaskList(MainActivity parent, SubActivities code, View view) {
super(parent, code, view);
}
@Override
/** Called when loading up the activity for the first time */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.task_list);
StartupReceiver.onStartupApplication(this);
shouldCloseInstance = false;
taskController = new TaskController(this);
taskController.open();
tagController = new TagController(this);
tagController.open();
Synchronizer.setTagController(tagController);
Synchronizer.setTaskController(taskController);
/** Called when loading up the activity */
public void onDisplay(Bundle variables) {
// load tag map
tagMap = getTagController().getAllTagsAsMap(getParent());
// process the tag to filter on, if any
if(variables != null && variables.containsKey(TAG_TOKEN)) {
TagIdentifier identifier = new TagIdentifier(variables.getLong(TAG_TOKEN));
filterTag = tagMap.get(identifier);
}
setupUIComponents();
loadTaskListSort();
fillData();
// auto sync
Integer autoSyncHours = Preferences.autoSyncFrequency(this);
if(autoSyncHours != null) {
final Date lastSync = Preferences.getSyncLastSync(this);
if(lastSync == null || lastSync.getTime() +
1000L*3600*autoSyncHours < System.currentTimeMillis()) {
Synchronizer.synchronize(this, true, null);
}
}
}
public void setupUIComponents() {
public void setupUIComponents() {
listView = (ListView)findViewById(R.id.tasklist);
addButton = (Button)findViewById(R.id.addtask);
addButton.setOnClickListener(new
@ -197,52 +170,10 @@ public class TaskList extends Activity {
onCreateMoreOptionsMenu(menu);
}
});
gestureDetector = new GestureDetector(new TaskListGestureDetector());
gestureTouchListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
}
class TaskListGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
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();
return true;
}
// flick L to R
else if(e2.getX() - e1.getX() > FLING_DIST_THRESHOLD &&
Math.abs(velocityX) > FLING_VEL_THRESHOLD &&
!isTopLevelActivity()) {
setResult(RESULT_CANCELED);
finish();
return true;
}
} catch (Exception e) {
// ignore!
}
return false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item;
item = menu.add(Menu.NONE, INSERT_ID, Menu.NONE,
@ -260,14 +191,11 @@ public class TaskList extends Activity {
item.setIcon(android.R.drawable.ic_menu_myplaces);
item.setAlphabeticShortcut('t');
if(Preferences.shouldDisplaySyncButton(this)){
if(Preferences.shouldDisplaySyncButton(getParent())){
item = menu.add(Menu.NONE, SYNC_ID, Menu.NONE,
R.string.taskList_menu_syncshortcut);
item.setIcon(android.R.drawable.ic_menu_upload);
item.setAlphabeticShortcut('s');
displaySyncShortcut = true;
} else {
displaySyncShortcut = false;
}
item = menu.add(Menu.NONE, MORE_ID, Menu.NONE,
@ -278,27 +206,6 @@ public class TaskList extends Activity {
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
boolean shouldDisplaySyncShortcut = Preferences.shouldDisplaySyncButton(this);
if(shouldDisplaySyncShortcut != displaySyncShortcut) {
if(shouldDisplaySyncShortcut) {
MenuItem item = menu.add(Menu.NONE, SYNC_ID, Menu.NONE,
R.string.taskList_menu_syncshortcut);
item.setIcon(android.R.drawable.ic_menu_upload);
item.setAlphabeticShortcut('s');
} else
menu.removeItem(SYNC_ID);
displaySyncShortcut = shouldDisplaySyncShortcut;
}
return true;
}
public boolean onCreateMoreOptionsMenu(Menu menu) {
MenuItem item;
@ -376,28 +283,20 @@ public class TaskList extends Activity {
private void fillData() {
Resources r = getResources();
// load tags (they might've changed)
tagMap = tagController.getAllTagsAsMap(this);
Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(TAG_TOKEN)) {
TagIdentifier identifier = new TagIdentifier(extras.getLong(TAG_TOKEN));
filterTag = tagMap.get(identifier);
}
// get a cursor to the task list
Cursor tasksCursor;
if(filterTag != null) {
List<TaskIdentifier> tasks = tagController.getTaggedTasks(this,
List<TaskIdentifier> tasks = getTagController().getTaggedTasks(getParent(),
filterTag.getTagIdentifier());
tasksCursor = taskController.getTaskListCursorById(tasks);
tasksCursor = getTaskController().getTaskListCursorById(tasks);
} else {
if(filterShowDone)
tasksCursor = taskController.getAllTaskListCursor();
tasksCursor = getTaskController().getAllTaskListCursor();
else
tasksCursor = taskController.getActiveTaskListCursor();
tasksCursor = getTaskController().getActiveTaskListCursor();
}
startManagingCursor(tasksCursor);
taskArray = taskController.createTaskListFromCursor(tasksCursor);
taskArray = getTaskController().createTaskListFromCursor(tasksCursor);
// read tags and apply filters
int hiddenTasks = 0; // # of tasks hidden
@ -414,7 +313,7 @@ public class TaskList extends Activity {
}
// get list of tags
LinkedList<TagIdentifier> tagIds = tagController.getTaskTags(this,
LinkedList<TagIdentifier> tagIds = getTagController().getTaskTags(getParent(),
task.getTaskIdentifier());
LinkedList<TagModelForView> tags = new LinkedList<TagModelForView>();
for(TagIdentifier tagId : tagIds) {
@ -476,15 +375,13 @@ public class TaskList extends Activity {
setUpListUI();
}
private void setUpListUI() {
// set up our adapter
TaskListAdapter tasks = new TaskListAdapter(this, this,
TaskListAdapter tasks = new TaskListAdapter(getParent(),
R.layout.task_list_row, taskArray, new TaskListAdapterHooks() {
@Override
public TagController getTagController() {
return tagController;
return getTagController();
}
@Override
@ -500,7 +397,7 @@ public class TaskList extends Activity {
@Override
public TaskController getTaskController() {
return taskController;
return getTaskController();
}
@Override
@ -509,7 +406,7 @@ public class TaskList extends Activity {
}
public void onCreatedTaskListView(View v, TaskModelForList task) {
v.setOnTouchListener(gestureTouchListener);
v.setOnTouchListener(getGestureListener());
}
});
listView.setAdapter(tasks);
@ -522,10 +419,10 @@ public class TaskList extends Activity {
int position, long id) {
TaskModelForList task = (TaskModelForList)view.getTag();
Intent intent = new Intent(TaskList.this, TaskView.class);
Intent intent = new Intent(getParent(), TaskView.class);
intent.putExtra(TaskEdit.LOAD_INSTANCE_TOKEN, task.
getTaskIdentifier().getId());
startActivityForResult(intent, ACTIVITY_VIEW);
launchActivity(intent, ACTIVITY_VIEW);
}
});
@ -575,7 +472,7 @@ public class TaskList extends Activity {
}
});
listView.setOnTouchListener(gestureTouchListener);
listView.setOnTouchListener(getGestureListener());
}
/* ======================================================================
@ -584,45 +481,37 @@ public class TaskList extends Activity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Constants.RESULT_SYNCHRONIZE) {
Synchronizer.synchronize(this, false, new SynchronizerListener() {
Synchronizer.synchronize(getParent(), false, new SynchronizerListener() {
@Override
public void onSynchronizerFinished(int numServicesSynced) {
if(numServicesSynced == 0)
DialogUtilities.okDialog(TaskList.this, getResources().getString(
DialogUtilities.okDialog(getParent(), getResources().getString(
R.string.sync_no_synchronizers), null);
fillData();
}
});
} else if(requestCode == ACTIVITY_TAGS && resultCode == RESULT_CANCELED)
filterTag = null;
} else if(requestCode == ACTIVITY_TAGS)
switchToActivity(SubActivities.TAG_LIST, null);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// refresh, since stuff might have changed...
if(hasFocus) {
if(shouldCloseInstance) { // user wants to quit
shouldCloseInstance = false;
finish();
} else
fillData();
fillData();
}
}
private void createTask() {
Intent intent = new Intent(this, TaskEdit.class);
Intent intent = new Intent(getParent(), TaskEdit.class);
if(filterTag != null)
intent.putExtra(TaskEdit.TAG_NAME_TOKEN, filterTag.getName());
startActivityForResult(intent, ACTIVITY_CREATE);
launchActivity(intent, ACTIVITY_CREATE);
}
private void deleteTask(final TaskIdentifier taskId) {
new AlertDialog.Builder(this)
new AlertDialog.Builder(getParent())
.setTitle(R.string.delete_title)
.setMessage(R.string.delete_this_task_title)
.setIcon(android.R.drawable.ic_dialog_alert)
@ -630,7 +519,7 @@ public class TaskList extends Activity {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
taskController.deleteTask(taskId);
getTaskController().deleteTask(taskId);
fillData();
}
})
@ -638,19 +527,8 @@ public class TaskList extends Activity {
.show();
}
public boolean isTopLevelActivity() {
return (getIntent() == null ||
getIntent().getExtras() == null ||
!getIntent().getExtras().containsKey(TAG_TOKEN));
}
public void showTagsView() {
if(isTopLevelActivity()) {
Intent intent = new Intent(TaskList.this, TagList.class);
startActivityForResult(intent, ACTIVITY_TAGS);
} else {
finish();
}
switchToActivity(SubActivities.TAG_LIST, null);
}
/** Save the sorting mode to the preferences */
@ -665,12 +543,12 @@ public class TaskList extends Activity {
if(sortReverse)
sortId *= -1;
Preferences.setTaskListSort(this, sortId);
Preferences.setTaskListSort(getParent(), sortId);
}
/** Save the sorting mode to the preferences */
private void loadTaskListSort() {
int sortId = Preferences.getTaskListSort(this);
int sortId = Preferences.getTaskListSort(getParent());
if(sortId == 0)
return;
sortReverse = sortId < 0;
@ -685,7 +563,7 @@ public class TaskList extends Activity {
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
final TaskModelForList task;
Resources r = getResources();
@ -708,23 +586,23 @@ public class TaskList extends Activity {
return true;
case OPTIONS_SYNC_ID:
startActivityForResult(new Intent(this, SyncPreferences.class),
launchActivity(new Intent(getParent(), SyncPreferences.class),
ACTIVITY_SYNCHRONIZE);
return true;
case OPTIONS_SETTINGS_ID:
startActivity(new Intent(this, EditPreferences.class));
launchActivity(new Intent(getParent(), EditPreferences.class), 0);
return true;
case OPTIONS_HELP_ID:
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(Constants.HELP_URL));
startActivity(browserIntent);
launchActivity(browserIntent, 0);
return true;
case TaskListAdapter.CONTEXT_EDIT_ID:
task = taskArray.get(item.getGroupId());
intent = new Intent(TaskList.this, TaskEdit.class);
intent = new Intent(getParent(), TaskEdit.class);
intent.putExtra(TaskEdit.LOAD_INSTANCE_TOKEN, task.getTaskIdentifier().getId());
startActivityForResult(intent, ACTIVITY_EDIT);
launchActivity(intent, ACTIVITY_EDIT);
return true;
case TaskListAdapter.CONTEXT_DELETE_ID:
task = taskArray.get(item.getGroupId());
@ -737,12 +615,12 @@ public class TaskList extends Activity {
else {
task.stopTimerAndUpdateElapsedTime();
}
taskController.saveTask(task);
getTaskController().saveTask(task);
fillData();
return true;
case TaskListAdapter.CONTEXT_POSTPONE_ID:
task = taskArray.get(item.getGroupId());
DialogUtilities.dayHourPicker(this,
DialogUtilities.dayHourPicker(getParent(),
r.getString(R.string.taskList_postpone_dialog),
new OnNNumberPickedListener() {
public void onNumbersPicked(int[] values) {
@ -760,7 +638,7 @@ public class TaskList extends Activity {
postponeMillis);
task.setDefiniteDueDate(definite);
}
taskController.saveTask(task);
getTaskController().saveTask(task);
fillData();
}
});
@ -811,16 +689,6 @@ public class TaskList extends Activity {
return true;
}
return super.onMenuItemSelected(featureId, item);
}
@Override
protected void onDestroy() {
super.onDestroy();
taskController.close();
if(tagController != null)
tagController.close();
Synchronizer.setTagController(null);
Synchronizer.setTaskController(null);
return false;
}
}

@ -53,7 +53,8 @@ import com.timsu.astrid.utilities.DateUtilities;
import com.timsu.astrid.utilities.Preferences;
import com.timsu.astrid.utilities.TaskFieldsVisibility;
/** Adapter for displaying a list of TaskModelForList entities
/**
* Adapter for displaying a list of TaskModelForList entities
*
* @author timsu
*
@ -65,6 +66,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
public static final int CONTEXT_TIMER_ID = Menu.FIRST + 52;
public static final int CONTEXT_POSTPONE_ID = Menu.FIRST + 53;
// keys for caching task properties
private static final int KEY_NAME = 0;
private static final int KEY_DEADLINE = 1;
private static final int KEY_OVERDUE = 2;
@ -90,6 +92,12 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
private TaskModelForList recentlyCompleted = null;
/**
* Callback interface for interacting with parent activity
*
* @author timsu
*
*/
public interface TaskListAdapterHooks {
List<TaskModelForList> getTaskArray();
List<TagModelForView> getTagsFor(TaskModelForList task);
@ -99,11 +107,20 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
void onCreatedTaskListView(View v, TaskModelForList task);
}
public TaskListAdapter(Activity activity, Context context, int resource,
/**
* Constructor
*
* @param activity
* @param context
* @param resource
* @param objects
* @param hooks
*/
public TaskListAdapter(Activity activity, int resource,
List<TaskModelForList> objects, TaskListAdapterHooks hooks) {
super(context, resource, objects);
super(activity, resource, objects);
inflater = (LayoutInflater)context.getSystemService(
inflater = (LayoutInflater)activity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
this.objects = objects;
this.resource = resource;
@ -114,7 +131,9 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
alarmController = new AlertController(activity);
}
// ----------------------------------------------------------------------
// --- code for setting up each view
// ----------------------------------------------------------------------
@Override
public View getView(int position, View convertView, ViewGroup parent) {

@ -232,7 +232,7 @@ public class TaskView extends TaskModificationActivity<TaskModelForView> {
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus && TaskList.shouldCloseInstance) { // user wants to quit
if(hasFocus && MainActivity.shouldCloseInstance) { // user wants to quit
finish();
}
}

@ -60,7 +60,7 @@ public class TaskViewNotifier extends TaskView {
@Override
public void onClick(DialogInterface dialog, int which) {
setResult(Constants.RESULT_GO_HOME);
TaskList.shouldCloseInstance = true;
MainActivity.shouldCloseInstance = true;
finish();
}
})
@ -87,7 +87,7 @@ public class TaskViewNotifier extends TaskView {
repeatInterval);
setResult(Constants.RESULT_GO_HOME);
TaskList.shouldCloseInstance = true;
MainActivity.shouldCloseInstance = true;
finish();
}
});

Loading…
Cancel
Save