Put task content loading into a separate thread.

pull/14/head
Tim Su 17 years ago
parent 959741120b
commit 833afde0a1

@ -2,7 +2,7 @@
<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="87" android:versionCode="87"
android:versionName="2.4.0"> android:versionName="2.4.1">
<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" />

@ -29,6 +29,13 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent"> android:layout_height="fill_parent">
<TextView android:id="@+id/loading"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/loading"
style="@style/TextAppearance.TaskList_Task"
android:gravity="center_vertical"/>
<ListView android:id="@+id/tasklist" <ListView android:id="@+id/tasklist"
android:layout_weight="1" android:layout_weight="1"
@ -39,6 +46,7 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:visibility="gone"
android:text="@string/addtask_label"/> android:text="@string/addtask_label"/>
</LinearLayout> </LinearLayout>
@ -48,11 +56,19 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent"> android:layout_height="fill_parent">
<TextView android:id="@+id/loading"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/loading"
style="@style/TextAppearance.TaskList_Task"
android:gravity="center_vertical"/>
<ListView android:id="@+id/taglist" <ListView android:id="@+id/taglist"
android:layout_weight="1" android:layout_weight="1"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>
<!-- task list w/ tag--> <!-- task list w/ tag-->
@ -60,7 +76,14 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent"> android:layout_height="fill_parent">
<TextView android:id="@+id/loading"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="@string/loading"
style="@style/TextAppearance.TaskList_Task"
android:gravity="center_vertical"/>
<ListView android:id="@+id/tasklist" <ListView android:id="@+id/tasklist"
android:layout_weight="1" android:layout_weight="1"
android:layout_width="fill_parent" android:layout_width="fill_parent"

@ -118,7 +118,7 @@
<string name="taskList_menu_more">More</string> <string name="taskList_menu_more">More</string>
<string name="taskList_menu_sync">Synchronization</string> <string name="taskList_menu_sync">Synchronization</string>
<string name="taskList_menu_settings">Settings</string> <string name="taskList_menu_settings">Settings</string>
<string name="taskList_menu_help">Online Help</string> <string name="taskList_menu_help">Help (opens in Browser)</string>
<string name="taskList_menu_survey">Take Astrid\'s Survey!</string> <string name="taskList_menu_survey">Take Astrid\'s Survey!</string>
<string name="taskList_menu_tips">Quick Tips</string> <string name="taskList_menu_tips">Quick Tips</string>
@ -263,6 +263,7 @@ Wish me luck!\n
<!-- Dialog Boxes --> <!-- Dialog Boxes -->
<skip /> <skip />
<string name="loading">Loading...</string>
<string name="information_title">Information</string> <string name="information_title">Information</string>
<string name="question_title">Question</string> <string name="question_title">Question</string>
<string name="notify_yes">View Task</string> <string name="notify_yes">View Task</string>

@ -29,7 +29,6 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import com.timsu.astrid.activities.TaskList.ActivityCode;
import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskController;
@ -40,10 +39,10 @@ import com.timsu.astrid.data.task.TaskController;
*/ */
abstract public class SubActivity { abstract public class SubActivity {
private TaskList parent; private TaskList parent;
ActivityCode code; int code;
private View view; private View view;
public SubActivity(TaskList parent, ActivityCode code, View view) { public SubActivity(TaskList parent, int code, View view) {
this.parent = parent; this.parent = parent;
this.code = code; this.code = code;
this.view = view; this.view = view;
@ -122,13 +121,13 @@ abstract public class SubActivity {
return parent.gestureListener; return parent.gestureListener;
} }
public void switchToActivity(ActivityCode activity, Bundle state) { public void switchToActivity(int activity, Bundle state) {
parent.switchToActivity(activity, state); parent.switchToActivity(activity, state);
} }
// --- internal methods // --- internal methods
protected ActivityCode getActivityCode() { protected int getActivityCode() {
return code; return code;
} }

@ -21,8 +21,8 @@ package com.timsu.astrid.activities;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
@ -31,6 +31,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.os.Handler;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -42,20 +43,20 @@ import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener; import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.activities.TaskList.ActivityCode;
import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagIdentifier;
import com.timsu.astrid.data.tag.TagModelForView; import com.timsu.astrid.data.tag.TagModelForView;
import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.data.task.TaskModelForList; import com.timsu.astrid.data.task.TaskModelForList;
/** /**
* 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) * @author Tim Su (timsu@stanfordalumni.org)
@ -71,21 +72,32 @@ public class TagListSubActivity extends SubActivity {
private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12; private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12;
private ListView listView; private ListView listView;
private List<TagModelForView> tagArray; private LinkedList<TagModelForView> tagArray;
private Map<Long, TaskModelForList> taskMap; private HashMap<Long, TaskModelForList> taskMap;
Map<TagModelForView, Integer> tagToTaskCount; HashMap<TagModelForView, Integer> tagToTaskCount;
private Handler handler;
private TextView loadingText;
private static SortMode sortMode = SortMode.SIZE; private static SortMode sortMode = SortMode.SIZE;
private static boolean sortReverse = false; private static boolean sortReverse = false;
public TagListSubActivity(TaskList parent, ActivityCode code, View view) { public TagListSubActivity(TaskList parent, int code, View view) {
super(parent, code, view); super(parent, code, view);
} }
@Override @Override
public void onDisplay(Bundle variables) { public void onDisplay(Bundle variables) {
listView = (ListView)findViewById(R.id.taglist); listView = (ListView)findViewById(R.id.taglist);
fillData(); handler = new Handler();
loadingText = (TextView)findViewById(R.id.loading);
// time to go!
new Thread(new Runnable() {
@Override
public void run() {
fillData();
}
}).start();
} }
// --- stuff for sorting // --- stuff for sorting
@ -148,24 +160,43 @@ public class TagListSubActivity extends SubActivity {
/** Fill in the Tag List with our tags */ /** Fill in the Tag List with our tags */
private void fillData() { private void fillData() {
Resources r = getResources();
tagArray = getTagController().getAllTags(getParent()); tagArray = getTagController().getAllTags(getParent());
// perform sort // perform sort
sortTagArray(); sortTagArray();
handler.post(new Runnable() {
@Override
public void run() {
// set up our adapter
final TagListAdapter tagAdapter = new TagListAdapter(getParent(),
android.R.layout.simple_list_item_1, tagArray,
tagToTaskCount);
// set up ui components
setUpListUI(tagAdapter);
loadingText.setVisibility(View.GONE);
}
});
}
/** Set up list handlers and adapter. run on the UI thread */
private void setUpListUI(ListAdapter adapter) {
// set up the title // set up the title
Resources r = getResources();
StringBuilder title = new StringBuilder(). StringBuilder title = new StringBuilder().
append(r.getString(R.string.tagList_titlePrefix)). append(r.getString(R.string.tagList_titlePrefix)).
append(" ").append(r.getQuantityString(R.plurals.Ntags, append(" ").append(r.getQuantityString(R.plurals.Ntags,
tagArray.size(), tagArray.size())); tagArray.size(), tagArray.size()));
setTitle(title); final CharSequence finalTitle = title;
handler.post(new Runnable() {
@Override
public void run() {
setTitle(finalTitle);
}
});
// set up our adapter listView.setAdapter(adapter);
TagListAdapter tagAdapter = new TagListAdapter(getParent(),
android.R.layout.simple_list_item_1, tagArray);
listView.setAdapter(tagAdapter);
// list view listener // list view listener
listView.setOnItemClickListener(new OnItemClickListener() { listView.setOnItemClickListener(new OnItemClickListener() {
@ -176,7 +207,7 @@ public class TagListSubActivity extends SubActivity {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putLong(TaskListSubActivity.TAG_TOKEN, tag.getTagIdentifier().getId()); bundle.putLong(TaskListSubActivity.TAG_TOKEN, tag.getTagIdentifier().getId());
switchToActivity(ActivityCode.TASK_LIST_W_TAG, bundle); switchToActivity(TaskList.AC_TASK_LIST_W_TAG, bundle);
} }
}); });
@ -237,15 +268,15 @@ public class TagListSubActivity extends SubActivity {
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
@Override @Override
/** Handle back button by moving to task list */ /** Handle back button by moving to task list */
protected boolean onKeyDown(int keyCode, KeyEvent event) { protected boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) { if(keyCode == KeyEvent.KEYCODE_BACK) {
switchToActivity(ActivityCode.TASK_LIST, null); switchToActivity(TaskList.AC_TASK_LIST, null);
return true; return true;
} }
return false; return false;
} }
@ -308,22 +339,25 @@ public class TagListSubActivity extends SubActivity {
return true; return true;
} }
// --------------------------------------------------- tag list adapter // --------------------------------------------------- tag list adapter
private class TagListAdapter extends ArrayAdapter<TagModelForView> { private class TagListAdapter extends ArrayAdapter<TagModelForView> {
private List<TagModelForView> objects; private List<TagModelForView> objects;
private int resource; private int resource;
private LayoutInflater inflater; private LayoutInflater inflater;
private HashMap<TagModelForView, Integer> tagCount;
public TagListAdapter(Context context, int resource, public TagListAdapter(Context context, int resource,
List<TagModelForView> objects) { List<TagModelForView> objects, HashMap<TagModelForView, Integer>
tagToTaskCount) {
super(context, resource, objects); super(context, resource, objects);
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.objects = objects; this.objects = objects;
this.resource = resource; this.resource = resource;
this.tagCount = tagToTaskCount;
} }
@Override @Override
@ -344,12 +378,12 @@ public class TagListSubActivity extends SubActivity {
final TextView name = ((TextView)view.findViewById(android.R.id.text1)); final TextView name = ((TextView)view.findViewById(android.R.id.text1));
name.setText(new StringBuilder(tag.getName()). name.setText(new StringBuilder(tag.getName()).
append(" (").append(tagToTaskCount.get(tag)).append(")")); append(" (").append(tagCount.get(tag)).append(")"));
if(tagToTaskCount.get(tag) == 0) if(tagCount.get(tag) == 0)
name.setTextColor(r.getColor(R.color.task_list_done)); name.setTextColor(r.getColor(R.color.task_list_done));
else else
name.setTextColor(r.getColor(android.R.color.white)); name.setTextColor(r.getColor(android.R.color.white));
} }
} }

@ -53,12 +53,10 @@ import com.timsu.astrid.utilities.StartupReceiver;
*/ */
public class TaskList extends Activity { public class TaskList extends Activity {
/** Enum for the different pages that we can display */ // constants for the different pages that we can display
public enum ActivityCode { public static final int AC_TASK_LIST = 0;
TASK_LIST, public static final int AC_TAG_LIST = 1;
TAG_LIST, public static final int AC_TASK_LIST_W_TAG = 2;
TASK_LIST_W_TAG
};
/** Bundle Key: activity code id of current activity */ /** Bundle Key: activity code id of current activity */
private static final String LAST_ACTIVITY_TAG = "l"; private static final String LAST_ACTIVITY_TAG = "l";
@ -142,7 +140,7 @@ public class TaskList extends Activity {
// if we have no filter tag, we're not on the last task // if we have no filter tag, we're not on the last task
if(getCurrentSubActivity() == taskListWTag && if(getCurrentSubActivity() == taskListWTag &&
((TaskListSubActivity)taskListWTag).getFilterTag() == null) { ((TaskListSubActivity)taskListWTag).getFilterTag() == null) {
switchToActivity(ActivityCode.TASK_LIST, null); switchToActivity(AC_TASK_LIST, null);
} }
} }
@ -150,11 +148,11 @@ public class TaskList extends Activity {
private void setupUIComponents() { private void setupUIComponents() {
gestureDetector = new GestureDetector(new AstridGestureDetector()); gestureDetector = new GestureDetector(new AstridGestureDetector());
viewFlipper = (ViewFlipper)findViewById(R.id.main); viewFlipper = (ViewFlipper)findViewById(R.id.main);
taskList = new TaskListSubActivity(this, ActivityCode.TASK_LIST, taskList = new TaskListSubActivity(this, AC_TASK_LIST,
findViewById(R.id.tasklist_layout)); findViewById(R.id.tasklist_layout));
tagList = new TagListSubActivity(this, ActivityCode.TAG_LIST, tagList = new TagListSubActivity(this, AC_TAG_LIST,
findViewById(R.id.taglist_layout)); findViewById(R.id.taglist_layout));
taskListWTag = new TaskListSubActivity(this, ActivityCode.TASK_LIST_W_TAG, taskListWTag = new TaskListSubActivity(this, AC_TASK_LIST_W_TAG,
findViewById(R.id.tasklistwtag_layout)); findViewById(R.id.tasklistwtag_layout));
mInAnimationForward = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); mInAnimationForward = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
@ -185,8 +183,8 @@ public class TaskList extends Activity {
Math.abs(velocityX) > FLING_VEL_THRESHOLD) { Math.abs(velocityX) > FLING_VEL_THRESHOLD) {
switch(getCurrentSubActivity().getActivityCode()) { switch(getCurrentSubActivity().getActivityCode()) {
case TASK_LIST: case AC_TASK_LIST:
switchToActivity(ActivityCode.TAG_LIST, null); switchToActivity(AC_TAG_LIST, null);
return true; return true;
default: default:
return false; return false;
@ -198,11 +196,11 @@ public class TaskList extends Activity {
Math.abs(velocityX) > FLING_VEL_THRESHOLD) { Math.abs(velocityX) > FLING_VEL_THRESHOLD) {
switch(getCurrentSubActivity().getActivityCode()) { switch(getCurrentSubActivity().getActivityCode()) {
case TASK_LIST_W_TAG: case AC_TASK_LIST_W_TAG:
switchToActivity(ActivityCode.TAG_LIST, null); switchToActivity(AC_TAG_LIST, null);
return true; return true;
case TAG_LIST: case AC_TAG_LIST:
switchToActivity(ActivityCode.TASK_LIST, null); switchToActivity(AC_TASK_LIST, null);
return true; return true;
default: default:
return false; return false;
@ -221,31 +219,31 @@ public class TaskList extends Activity {
* ====================================================================== */ * ====================================================================== */
/** Switches to another activity, with appropriate animation */ /** Switches to another activity, with appropriate animation */
void switchToActivity(ActivityCode activity, Bundle variables) { void switchToActivity(int activity, Bundle variables) {
closeOptionsMenu(); closeOptionsMenu();
// and flip to them // and flip to them
switch(getCurrentSubActivity().getActivityCode()) { switch(getCurrentSubActivity().getActivityCode()) {
case TASK_LIST: case AC_TASK_LIST:
viewFlipper.setInAnimation(mInAnimationForward); viewFlipper.setInAnimation(mInAnimationForward);
viewFlipper.setOutAnimation(mOutAnimationForward); viewFlipper.setOutAnimation(mOutAnimationForward);
switch(activity) { switch(activity) {
case TAG_LIST: case AC_TAG_LIST:
viewFlipper.showNext(); viewFlipper.showNext();
break; break;
case TASK_LIST_W_TAG: case AC_TASK_LIST_W_TAG:
viewFlipper.setDisplayedChild(taskListWTag.code.ordinal()); viewFlipper.setDisplayedChild(taskListWTag.code);
} }
break; break;
case TAG_LIST: case AC_TAG_LIST:
switch(activity) { switch(activity) {
case TASK_LIST: case AC_TASK_LIST:
viewFlipper.setInAnimation(mInAnimationBackward); viewFlipper.setInAnimation(mInAnimationBackward);
viewFlipper.setOutAnimation(mOutAnimationBackward); viewFlipper.setOutAnimation(mOutAnimationBackward);
viewFlipper.showPrevious(); viewFlipper.showPrevious();
break; break;
case TASK_LIST_W_TAG: case AC_TASK_LIST_W_TAG:
viewFlipper.setInAnimation(mInAnimationForward); viewFlipper.setInAnimation(mInAnimationForward);
viewFlipper.setOutAnimation(mOutAnimationForward); viewFlipper.setOutAnimation(mOutAnimationForward);
viewFlipper.showNext(); viewFlipper.showNext();
@ -253,28 +251,28 @@ public class TaskList extends Activity {
} }
break; break;
case TASK_LIST_W_TAG: case AC_TASK_LIST_W_TAG:
viewFlipper.setInAnimation(mInAnimationBackward); viewFlipper.setInAnimation(mInAnimationBackward);
viewFlipper.setOutAnimation(mOutAnimationBackward); viewFlipper.setOutAnimation(mOutAnimationBackward);
switch(activity) { switch(activity) {
case TAG_LIST: case AC_TAG_LIST:
viewFlipper.showPrevious(); viewFlipper.showPrevious();
break; break;
case TASK_LIST: case AC_TASK_LIST:
viewFlipper.setDisplayedChild(taskList.code.ordinal()); viewFlipper.setDisplayedChild(taskList.code);
} }
break; break;
} }
// initialize the components // initialize the components
switch(activity) { switch(activity) {
case TASK_LIST: case AC_TASK_LIST:
taskList.onDisplay(variables); taskList.onDisplay(variables);
break; break;
case TAG_LIST: case AC_TAG_LIST:
tagList.onDisplay(variables); tagList.onDisplay(variables);
break; break;
case TASK_LIST_W_TAG: case AC_TASK_LIST_W_TAG:
taskListWTag.onDisplay(variables); taskListWTag.onDisplay(variables);
} }
@ -293,7 +291,7 @@ public class TaskList extends Activity {
@Override @Override
protected void onSaveInstanceState(Bundle outState) { protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putInt(LAST_ACTIVITY_TAG, getCurrentSubActivity().code.ordinal()); outState.putInt(LAST_ACTIVITY_TAG, getCurrentSubActivity().code);
outState.putBundle(LAST_BUNDLE_TAG, lastActivityBundle); outState.putBundle(LAST_BUNDLE_TAG, lastActivityBundle);
} }
@ -316,7 +314,7 @@ public class TaskList extends Activity {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Constants.RESULT_GO_HOME) { if(resultCode == Constants.RESULT_GO_HOME) {
switchToActivity(ActivityCode.TASK_LIST, null); switchToActivity(AC_TASK_LIST, null);
} else } else
getCurrentSubActivity().onActivityResult(requestCode, resultCode, data); getCurrentSubActivity().onActivityResult(requestCode, resultCode, data);
} }

@ -339,7 +339,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
if(timeLeft < FULL_DATE_THRESHOLD) if(timeLeft < FULL_DATE_THRESHOLD)
label.append(DateUtilities.getDurationString(r, label.append(DateUtilities.getDurationString(r,
(int)Math.abs(timeLeft/1000), 1)); (int)Math.abs(timeLeft), 1));
else else
label.append(DateUtilities.getFormattedDate(r, label.append(DateUtilities.getFormattedDate(r,
task.getDefiniteDueDate())); task.getDefiniteDueDate()));
@ -362,7 +362,7 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
if(timeLeft < FULL_DATE_THRESHOLD) if(timeLeft < FULL_DATE_THRESHOLD)
label.append(DateUtilities.getDurationString(r, label.append(DateUtilities.getDurationString(r,
(int)Math.abs(timeLeft/1000), 1)); (int)Math.abs(timeLeft), 1));
else else
label.append(DateUtilities.getFormattedDate(r, label.append(DateUtilities.getFormattedDate(r,
task.getPreferredDueDate())); task.getPreferredDueDate()));

@ -32,10 +32,12 @@ import java.util.Random;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Resources; 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.os.Handler;
import android.util.Log; import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -46,9 +48,9 @@ import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener; import android.view.View.OnCreateContextMenuListener;
import android.widget.Button; import android.widget.Button;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.activities.TaskList.ActivityCode;
import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks; import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks;
import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagController;
import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagIdentifier;
@ -109,13 +111,17 @@ public class TaskListSubActivity extends SubActivity {
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;
// other constants
private static final int SORTFLAG_FILTERDONE = (1 << 5); private static final int SORTFLAG_FILTERDONE = (1 << 5);
private static final int SORTFLAG_FILTERHIDDEN = (1 << 6); private static final int SORTFLAG_FILTERHIDDEN = (1 << 6);
private static final int HIDE_ADD_BTN_PORTRAIT = 4;
private static final int HIDE_ADD_BTN_LANDSCPE = 2;
// UI components // UI components
private ListView listView; private ListView listView;
private Button addButton; private Button addButton;
private View layout; private View layout;
private TextView loadingText;
// other instance variables // other instance variables
private Map<TagIdentifier, TagModelForView> tagMap; private Map<TagIdentifier, TagModelForView> tagMap;
@ -123,6 +129,7 @@ public class TaskListSubActivity extends SubActivity {
private HashMap<TaskModelForList, LinkedList<TagModelForView>> taskTags; private HashMap<TaskModelForList, LinkedList<TagModelForView>> taskTags;
private Long selectedTaskId = null; private Long selectedTaskId = null;
private TaskModelForList selectedTask = null; private TaskModelForList selectedTask = null;
private Handler handler;
// display filters // display filters
private static boolean filterShowHidden = false; private static boolean filterShowHidden = false;
@ -135,7 +142,7 @@ public class TaskListSubActivity extends SubActivity {
* ======================================================= initialization * ======================================================= initialization
* ====================================================================== */ * ====================================================================== */
public TaskListSubActivity(TaskList parent, ActivityCode code, View view) { public TaskListSubActivity(TaskList parent, int code, View view) {
super(parent, code, view); super(parent, code, view);
} }
@ -158,8 +165,15 @@ public class TaskListSubActivity extends SubActivity {
} }
setupUIComponents(); setupUIComponents();
loadTaskListSort();
fillData(); // time to go!
new Thread(new Runnable() {
@Override
public void run() {
loadTaskListSort();
fillData();
}
}).start();
if(variables != null && variables.containsKey(NOTIF_FLAGS_TOKEN)) { if(variables != null && variables.containsKey(NOTIF_FLAGS_TOKEN)) {
long repeatInterval = 0; long repeatInterval = 0;
@ -177,7 +191,10 @@ public class TaskListSubActivity extends SubActivity {
/** Initialize UI components */ /** Initialize UI components */
public void setupUIComponents() { public void setupUIComponents() {
listView = (ListView)findViewById(R.id.tasklist); handler = new Handler();
listView = (ListView)findViewById(R.id.tasklist);
loadingText = (TextView)findViewById(R.id.loading);
addButton = (Button)findViewById(R.id.addtask); addButton = (Button)findViewById(R.id.addtask);
addButton.setOnClickListener(new addButton.setOnClickListener(new
View.OnClickListener() { View.OnClickListener() {
@ -381,8 +398,6 @@ public class TaskListSubActivity extends SubActivity {
/** Fill in the Task List with our tasks */ /** Fill in the Task List with our tasks */
private void fillData() { private void fillData() {
Resources r = getResources();
// get a cursor to the task list // get a cursor to the task list
Cursor tasksCursor; Cursor tasksCursor;
if(filterTag != null) { if(filterTag != null) {
@ -443,7 +458,6 @@ public class TaskListSubActivity extends SubActivity {
int activeTasks = taskArray.size() - completedTasks; int activeTasks = taskArray.size() - completedTasks;
// sort task list // sort task list
// do sort
Collections.sort(taskArray, new Comparator<TaskModelForList>() { Collections.sort(taskArray, new Comparator<TaskModelForList>() {
@Override @Override
public int compare(TaskModelForList arg0, TaskModelForList arg1) { public int compare(TaskModelForList arg0, TaskModelForList arg1) {
@ -453,32 +467,53 @@ public class TaskListSubActivity extends SubActivity {
if(sortReverse) if(sortReverse)
Collections.reverse(taskArray); Collections.reverse(taskArray);
// hide "add" button if we have a few tasks handler.post(new Runnable() {
if(taskArray.size() > 4) @Override
addButton.setVisibility(View.GONE); public void run() {
else // hide "add" button if we have too many tasks
addButton.setVisibility(View.VISIBLE); int threshold = HIDE_ADD_BTN_PORTRAIT;
if(getParent().getWindowManager().getDefaultDisplay().getOrientation() ==
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
threshold = HIDE_ADD_BTN_LANDSCPE;
if(taskArray.size() > threshold)
addButton.setVisibility(View.GONE);
else
addButton.setVisibility(View.VISIBLE);
}
});
// set up the title // set up the title
StringBuilder title = new StringBuilder(). final int finalCompleted = completedTasks;
append(r.getString(R.string.taskList_titlePrefix)).append(" "); final int finalActive = activeTasks;
if(filterTag != null) { final int finalHidden = hiddenTasks;
title.append(r.getString(R.string.taskList_titleTagPrefix, handler.post(new Runnable() {
filterTag.getName())).append(" "); @Override
} public void run() {
Resources r = getResources();
StringBuilder title = new StringBuilder().
append(r.getString(R.string.taskList_titlePrefix)).append(" ");
if(filterTag != null) {
title.append(r.getString(R.string.taskList_titleTagPrefix,
filterTag.getName())).append(" ");
}
if(finalCompleted > 0)
title.append(r.getQuantityString(R.plurals.NactiveTasks,
finalActive, finalActive, taskArray.size()));
else
title.append(r.getQuantityString(R.plurals.Ntasks,
taskArray.size(), taskArray.size()));
if(finalHidden > 0)
title.append(" (+").append(finalHidden).append(" ").
append(r.getString(R.string.taskList_hiddenSuffix)).append(")");
setTitle(title);
setUpListUI();
loadingText.setVisibility(View.GONE);
}
});
if(completedTasks > 0)
title.append(r.getQuantityString(R.plurals.NactiveTasks,
activeTasks, activeTasks, taskArray.size()));
else
title.append(r.getQuantityString(R.plurals.Ntasks,
taskArray.size(), taskArray.size()));
if(hiddenTasks > 0)
title.append(" (+").append(hiddenTasks).append(" ").
append(r.getString(R.string.taskList_hiddenSuffix)).append(")");
setTitle(title);
setUpListUI();
} }
/** Set up the adapter for our task list */ /** Set up the adapter for our task list */
@ -628,18 +663,28 @@ public class TaskListSubActivity extends SubActivity {
if(numServicesSynced == 0) if(numServicesSynced == 0)
DialogUtilities.okDialog(getParent(), getResources().getString( DialogUtilities.okDialog(getParent(), getResources().getString(
R.string.sync_no_synchronizers), null); R.string.sync_no_synchronizers), null);
fillData(); new Thread(new Runnable() {
@Override
public void run() {
fillData();
}
});
} }
}); });
} else if(requestCode == ACTIVITY_TAGS) } else if(requestCode == ACTIVITY_TAGS)
switchToActivity(ActivityCode.TAG_LIST, null); switchToActivity(TaskList.AC_TAG_LIST, null);
} }
@Override @Override
public void onWindowFocusChanged(boolean hasFocus) { public void onWindowFocusChanged(boolean hasFocus) {
// refresh, since stuff might have changed... // refresh, since stuff might have changed...
if(hasFocus) { if(hasFocus) {
fillData(); new Thread(new Runnable() {
@Override
public void run() {
fillData();
}
});
} }
} }
@ -692,7 +737,7 @@ public class TaskListSubActivity extends SubActivity {
/** Show the tags view */ /** Show the tags view */
public void showTagsView() { public void showTagsView() {
switchToActivity(ActivityCode.TAG_LIST, null); switchToActivity(TaskList.AC_TAG_LIST, null);
} }
/** Save the sorting mode to the preferences */ /** Save the sorting mode to the preferences */
@ -823,7 +868,7 @@ public class TaskListSubActivity extends SubActivity {
fillData(); fillData();
return true; return true;
case CONTEXT_FILTER_TAG: case CONTEXT_FILTER_TAG:
switchToActivity(ActivityCode.TASK_LIST, null); switchToActivity(TaskList.AC_TASK_LIST, null);
return true; return true;
case CONTEXT_SORT_AUTO: case CONTEXT_SORT_AUTO:
if(sortMode == SortMode.AUTO) if(sortMode == SortMode.AUTO)

Loading…
Cancel
Save