diff --git a/api/src/com/todoroo/astrid/api/Filter.java b/api/src/com/todoroo/astrid/api/Filter.java
index 70c19888c..6d7af4959 100644
--- a/api/src/com/todoroo/astrid/api/Filter.java
+++ b/api/src/com/todoroo/astrid/api/Filter.java
@@ -102,6 +102,8 @@ public class Filter extends FilterListItem {
this.valuesForNewTasks = valuesForNewTasks;
}
+
+
/**
* Utility constructor
*
diff --git a/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java b/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java
index a2619b3af..2dc07e324 100644
--- a/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java
+++ b/astrid/plugin-src/com/timsu/astrid/C2DMReceiver.java
@@ -235,7 +235,7 @@ public class C2DMReceiver extends BroadcastReceiver {
}
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- notifyIntent.putExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_C2DM);
+ notifyIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_C2DM);
PendingIntent pendingIntent = PendingIntent.getActivity(context,
notifId, notifyIntent, 0);
diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java
index 9270b7feb..24b2b8a43 100644
--- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java
+++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java
@@ -309,7 +309,7 @@ public class TagUpdatesFragment extends ListFragment {
private void refreshActivity(boolean manual) {
if (actFmPreferenceService.isLoggedIn()) {
final ProgressBarSyncResultCallback callback = new ProgressBarSyncResultCallback(
- getActivity(), R.id.comments_progressBar, new Runnable() {
+ getActivity(), this, R.id.comments_progressBar, new Runnable() {
@Override
public void run() {
refreshUpdatesList();
diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java
index 300e8deb5..38b05bce4 100644
--- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java
+++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java
@@ -179,8 +179,8 @@ public class TagViewFragment extends TaskListFragment {
}
TaskListActivity activity = (TaskListActivity) getActivity();
- String tag = activity.getIntent().getStringExtra(EXTRA_TAG_NAME);
- long remoteId = activity.getIntent().getLongExtra(EXTRA_TAG_REMOTE_ID, 0);
+ String tag = extras.getString(EXTRA_TAG_NAME);
+ long remoteId = extras.getLong(EXTRA_TAG_REMOTE_ID, 0);
if(tag == null && remoteId == 0)
return;
@@ -206,8 +206,8 @@ public class TagViewFragment extends TaskListFragment {
super.onNewIntent(intent);
- if (activity.getIntent().getBooleanExtra(TOKEN_START_ACTIVITY, false)) {
- activity.getIntent().removeExtra(TOKEN_START_ACTIVITY);
+ if (extras.getBoolean(TOKEN_START_ACTIVITY, false)) {
+ extras.remove(TOKEN_START_ACTIVITY);
activity.showComments();
}
}
@@ -238,6 +238,11 @@ public class TagViewFragment extends TaskListFragment {
updateCommentCount();
}
+ @Override
+ public void requestCommentCountUpdate() {
+ updateCommentCount();
+ }
+
private void updateCommentCount() {
if (tagData != null) {
long lastViewedComments = Preferences.getLong(TagUpdatesFragment.UPDATES_LAST_VIEWED + tagData.getValue(TagData.REMOTE_ID), 0);
@@ -258,7 +263,9 @@ public class TagViewFragment extends TaskListFragment {
@Override
- protected void initiateAutomaticSync() {
+ public void initiateAutomaticSync() {
+ if (!isCurrentTaskListFragment())
+ return;
if (tagData != null) {
long lastAutoSync = Preferences.getLong(LAST_FETCH_KEY + tagData.getId(), 0);
if(DateUtilities.now() - lastAutoSync > DateUtilities.ONE_HOUR)
@@ -270,7 +277,7 @@ public class TagViewFragment extends TaskListFragment {
private void refreshData(final boolean manual) {
((TextView)taskListView.findViewById(android.R.id.empty)).setText(R.string.DLG_loading);
- syncService.synchronizeList(tagData, manual, new ProgressBarSyncResultCallback(getActivity(),
+ syncService.synchronizeList(tagData, manual, new ProgressBarSyncResultCallback(getActivity(), this,
R.id.progressBar, new Runnable() {
@Override
public void run() {
@@ -468,6 +475,7 @@ public class TagViewFragment extends TaskListFragment {
return;
filter = TagFilterExposer.filterFromTagData(getActivity(), tagData);
getActivity().getIntent().putExtra(TOKEN_FILTER, filter);
+ extras.putParcelable(TOKEN_FILTER, filter);
Activity activity = getActivity();
if (activity instanceof TaskListActivity) {
((TaskListActivity) activity).setListsTitle(filter.title);
diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java
index 624e078d4..8d918a459 100644
--- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java
+++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java
@@ -22,7 +22,6 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate;
-import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer;
import com.todoroo.astrid.api.Filter;
@@ -72,7 +71,6 @@ public class GtasksFilterExposer extends BroadcastReceiver implements AstridFilt
filter.listingIcon = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.gtasks_icon)).getBitmap();
filter.customTaskList = new ComponentName(ContextManager.getContext(), GtasksListFragment.class);
Bundle extras = new Bundle();
- extras.putBoolean(TaskListFragment.TOKEN_OVERRIDE_ANIM, true);
extras.putLong(GtasksListFragment.TOKEN_STORE_ID, list.getId());
filter.customExtras = extras;
diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java
index 377441ce4..6e7c39c29 100644
--- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java
+++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListFragment.java
@@ -70,7 +70,9 @@ public class GtasksListFragment extends SubtasksListFragment {
}
@Override
- protected void initiateAutomaticSync() {
+ public void initiateAutomaticSync() {
+ if (!isCurrentTaskListFragment())
+ return;
if (list != null && DateUtilities.now() - list.getValue(GtasksList.LAST_SYNC) > DateUtilities.ONE_HOUR) {
syncService.synchronizeList(list, false, syncActionHelper.syncResultCallback);
}
diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java
index ecab8b894..57a900f95 100644
--- a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java
+++ b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java
@@ -120,7 +120,7 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL
// hide quick add
getView().findViewById(R.id.taskListFooter).setVisibility(View.GONE);
- String title = getActivity().getIntent().getStringExtra(Notifications.EXTRAS_TEXT);
+ String title = extras.getString(Notifications.EXTRAS_TEXT);
new ReminderDialog((AstridActivity) getActivity(), taskId, title).show();
}
diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
index 415f810ec..4dcb10671 100644
--- a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
+++ b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
@@ -25,7 +25,6 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.activity.TaskListActivity;
-import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
@@ -181,7 +180,7 @@ public class Notifications extends BroadcastReceiver {
notifyIntent.putExtra(NotificationFragment.TOKEN_ID, id);
notifyIntent.putExtra(EXTRAS_TEXT, text);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
- notifyIntent.putExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_NOTIFICATION);
+ notifyIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_NOTIFICATION);
requestNotification((int)id, notifyIntent, type, title, text, ringTimes);
return true;
diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java
index 5a14610b9..8437bd9e9 100644
--- a/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java
+++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagFilterExposer.java
@@ -30,7 +30,6 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.TagViewFragment;
-import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer;
import com.todoroo.astrid.api.Filter;
@@ -114,7 +113,6 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
Bundle extras = new Bundle();
extras.putString(TagViewFragment.EXTRA_TAG_NAME, tag.tag);
extras.putLong(TagViewFragment.EXTRA_TAG_REMOTE_ID, tag.remoteId);
- extras.putBoolean(TaskListFragment.TOKEN_OVERRIDE_ANIM, true);
filter.customExtras = extras;
return filter;
diff --git a/astrid/res/layout/task_list_wrapper_activity.xml b/astrid/res/layout/task_list_wrapper_activity.xml
index 7f3cc135c..c66aab46c 100644
--- a/astrid/res/layout/task_list_wrapper_activity.xml
+++ b/astrid/res/layout/task_list_wrapper_activity.xml
@@ -5,4 +5,8 @@
android:layout_height="match_parent"
style="@style/Content"
android:id="@+id/tasklist_fragment_container">
+
\ No newline at end of file
diff --git a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java
index d3d4b80b1..7ac64277b 100644
--- a/astrid/src/com/todoroo/astrid/activity/AstridActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/AstridActivity.java
@@ -145,21 +145,12 @@ public class AstridActivity extends FragmentActivity
if(item instanceof Filter) {
Filter filter = (Filter)item;
- if(filter instanceof FilterWithCustomIntent) {
- int lastSelectedList = intent.getIntExtra(FilterListFragment.TOKEN_LAST_SELECTED, 0);
- intent = ((FilterWithCustomIntent)filter).getCustomIntent();
- intent.putExtra(FilterListFragment.TOKEN_LAST_SELECTED, lastSelectedList);
- } else {
- intent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
- }
-
- setIntent(intent);
+ Bundle extras = configureIntentAndExtrasWithFilter(intent, filter);
if (fragmentLayout == LAYOUT_TRIPLE && getTaskEditFragment() != null) {
onBackPressed(); // remove the task edit fragment when switching between lists
}
-
- setupTasklistFragmentWithFilter(filter);
+ setupTasklistFragmentWithFilter(filter, extras);
// no animation for dualpane-layout
AndroidUtilities.callOverridePendingTransition(this, 0, 0);
@@ -176,6 +167,23 @@ public class AstridActivity extends FragmentActivity
}
}
+ protected Bundle configureIntentAndExtrasWithFilter(Intent intent, Filter filter) {
+ if(filter instanceof FilterWithCustomIntent) {
+ int lastSelectedList = intent.getIntExtra(FilterListFragment.TOKEN_LAST_SELECTED, 0);
+ intent = ((FilterWithCustomIntent)filter).getCustomIntent();
+ intent.putExtra(FilterListFragment.TOKEN_LAST_SELECTED, lastSelectedList);
+ } else {
+ intent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
+ }
+
+ setIntent(intent);
+
+ Bundle extras = intent.getExtras();
+ if (extras != null)
+ extras = (Bundle) extras.clone();
+ return extras;
+ }
+
public void setupActivityFragment(TagData tagData) {
if (fragmentLayout == LAYOUT_SINGLE)
return;
@@ -190,7 +198,7 @@ public class AstridActivity extends FragmentActivity
transaction.commit();
}
- public final void setupTasklistFragmentWithFilter(Filter filter) {
+ public void setupTasklistFragmentWithFilter(Filter filter, Bundle extras) {
Class> customTaskList = TaskListFragment.class;
if(filter == null || CoreFilterExposer.isInbox(filter)) {
@@ -200,27 +208,15 @@ public class AstridActivity extends FragmentActivity
customTaskList = SubtasksListFragment.class;
}
- setupTasklistFragmentWithFilterAndCustomTaskList(filter, customTaskList);
+ setupTasklistFragmentWithFilterAndCustomTaskList(filter, extras, customTaskList);
}
- public final void setupTasklistFragmentWithFilterAndCustomTaskList(Filter filter, Class> customTaskList) {
- Class> component = customTaskList;
- if (filter == null)
- getIntent().removeExtra(TaskListFragment.TOKEN_FILTER);
- else
- getIntent().putExtra(TaskListFragment.TOKEN_FILTER, filter);
- if (filter instanceof FilterWithCustomIntent) {
- try {
- component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName());
- } catch (Exception e) {
- // Invalid
- }
- }
- FragmentManager manager = getSupportFragmentManager();
- FragmentTransaction transaction = manager.beginTransaction();
+ public void setupTasklistFragmentWithFilterAndCustomTaskList(Filter filter, Bundle extras, Class> customTaskList) {
+ TaskListFragment newFragment = TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customTaskList);
try {
- TaskListFragment newFragment = (TaskListFragment) component.newInstance();
+ FragmentManager manager = getSupportFragmentManager();
+ FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.tasklist_fragment_container, newFragment,
TaskListFragment.TAG_TASKLIST_FRAGMENT);
transaction.commit();
@@ -299,8 +295,8 @@ public class AstridActivity extends FragmentActivity
}
}
- protected Fragment setupFragment(String tag, int container, Class extends Fragment> cls) {
- FragmentManager fm = getSupportFragmentManager();
+ protected Fragment setupFragment(String tag, int container, Class extends Fragment> cls, boolean createImmediate) {
+ final FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag(tag);
if(fragment == null) {
try {
@@ -317,6 +313,13 @@ public class AstridActivity extends FragmentActivity
else
ft.replace(container, fragment, tag);
ft.commit();
+ if (createImmediate)
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ fm.executePendingTransactions();
+ }
+ });
}
return fragment;
}
diff --git a/astrid/src/com/todoroo/astrid/activity/FilterListFragment.java b/astrid/src/com/todoroo/astrid/activity/FilterListFragment.java
index 400e407c1..ce44160ae 100644
--- a/astrid/src/com/todoroo/astrid/activity/FilterListFragment.java
+++ b/astrid/src/com/todoroo/astrid/activity/FilterListFragment.java
@@ -122,6 +122,8 @@ public class FilterListFragment extends ListFragment {
// Check that the container activity has implemented the callback interface
try {
mListener = (OnFilterItemClickedListener) activity;
+ adapter = new FilterAdapter(getActivity(), null,
+ R.layout.filter_adapter_row, false);
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFilterItemClickedListener"); //$NON-NLS-1$
@@ -257,8 +259,7 @@ public class FilterListFragment extends ListFragment {
/** Sets up the coach list adapter */
protected void setUpList() {
- adapter = new FilterAdapter(getActivity(), getListView(),
- R.layout.filter_adapter_row, false);
+ adapter.setListView(getListView());
setListAdapter(adapter);
adapter.setLastSelected(mSelectedIndex);
diff --git a/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java b/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java
index 7be0f763c..690904818 100644
--- a/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/ShortcutActivity.java
@@ -87,8 +87,8 @@ public class ShortcutActivity extends Activity {
Intent taskListIntent = new Intent(this, TaskListActivity.class);
- if(extras != null && extras.containsKey(TaskListFragment.TOKEN_SOURCE))
- taskListIntent.putExtra(TaskListFragment.TOKEN_SOURCE, extras.getInt(TaskListFragment.TOKEN_SOURCE));
+ if(extras != null && extras.containsKey(TaskListActivity.TOKEN_SOURCE))
+ taskListIntent.putExtra(TaskListActivity.TOKEN_SOURCE, extras.getInt(TaskListActivity.TOKEN_SOURCE));
if(extras != null && extras.containsKey(TOKEN_CUSTOM_CLASS)) {
taskListIntent.putExtras(intent.getExtras());
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
index a9754d30a..47d4cf0cf 100644
--- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
@@ -9,6 +9,7 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.ActionBar;
import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.KeyEvent;
@@ -29,31 +30,43 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagUpdatesFragment;
import com.todoroo.astrid.actfm.TagViewFragment;
+import com.todoroo.astrid.adapter.FilterAdapter;
+import com.todoroo.astrid.adapter.TaskListFragmentPagerAdapter;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
+import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.CustomFilterExposer;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.NotificationFragment;
+import com.todoroo.astrid.service.StatisticsConstants;
+import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.ui.DateChangedAlerts;
import com.todoroo.astrid.ui.FragmentPopover;
import com.todoroo.astrid.ui.MainMenuPopover;
import com.todoroo.astrid.ui.MainMenuPopover.MainMenuListener;
+import com.todoroo.astrid.ui.TaskListFragmentPager;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
-public class TaskListActivity extends AstridActivity implements MainMenuListener {
+public class TaskListActivity extends AstridActivity implements MainMenuListener, OnPageChangeListener {
public static final String TOKEN_SELECTED_FILTER = "selectedFilter"; //$NON-NLS-1$
+ /** token for indicating source of TLA launch */
+ public static final String TOKEN_SOURCE = "source"; //$NON-NLS-1$
+
private View listsNav;
private ImageView listsNavDisclosure;
private TextView lists;
private ImageView mainMenu;
private Button commentsButton;
+ private TaskListFragmentPager tlfPager;
+ private TaskListFragmentPagerAdapter tlfPagerAdapter;
+
private FragmentPopover listsPopover;
private FragmentPopover editPopover;
private FragmentPopover commentsPopover;
@@ -141,15 +154,63 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener
commentsButton.setOnClickListener(commentsButtonClickListener);
Filter savedFilter = getIntent().getParcelableExtra(TaskListFragment.TOKEN_FILTER);
+ if (savedFilter == null)
+ savedFilter = CoreFilterExposer.buildInboxFilter(getResources());
+
+ Bundle extras = getIntent().getExtras();
+ if (extras != null)
+ extras = (Bundle) extras.clone();
+
+ if (fragmentLayout == LAYOUT_SINGLE) {
+ FilterListFragment flf = getFilterListFragment();
+ if (flf == null)
+ throw new RuntimeException("Filterlist fragment was null, needs to exist to construct the fragment pager"); //$NON-NLS-1$
+ FilterAdapter adapter = flf.adapter;
+ tlfPager = (TaskListFragmentPager) findViewById(R.id.pager);
+ tlfPagerAdapter = new TaskListFragmentPagerAdapter(getSupportFragmentManager(), adapter);
+ tlfPager.setAdapter(tlfPagerAdapter);
+ tlfPager.setOnPageChangeListener(this);
+ }
- if (getIntent().getIntExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_DEFAULT) ==
+ if (getIntent().getIntExtra(TOKEN_SOURCE, Constants.SOURCE_DEFAULT) ==
Constants.SOURCE_NOTIFICATION)
- setupTasklistFragmentWithFilterAndCustomTaskList(savedFilter, NotificationFragment.class);
+ setupTasklistFragmentWithFilterAndCustomTaskList(savedFilter, extras, NotificationFragment.class);
else
- setupTasklistFragmentWithFilter(savedFilter);
+ setupTasklistFragmentWithFilter(savedFilter, extras);
if (savedFilter != null)
setListsTitle(savedFilter.title);
+
+ if (getIntent().hasExtra(TOKEN_SOURCE)) {
+ trackActivitySource();
+ }
+ }
+
+ @Override
+ public TaskListFragment getTaskListFragment() {
+ if (fragmentLayout == LAYOUT_SINGLE) {
+ return tlfPager.getCurrentFragment();
+ } else {
+ return super.getTaskListFragment();
+ }
+ }
+
+ @Override
+ public void setupTasklistFragmentWithFilter(Filter filter, Bundle extras) {
+ if (fragmentLayout == LAYOUT_SINGLE) {
+ tlfPager.showFilter(filter);
+ } else {
+ super.setupTasklistFragmentWithFilter(filter, extras);
+ }
+ }
+
+ @Override
+ public void setupTasklistFragmentWithFilterAndCustomTaskList(Filter filter, Bundle extras, Class> customTaskList) {
+ if (fragmentLayout == LAYOUT_SINGLE) {
+ tlfPager.showFilterWithCustomTaskList(filter, customTaskList);
+ } else {
+ super.setupTasklistFragmentWithFilterAndCustomTaskList(filter, extras, customTaskList);
+ }
}
/**
@@ -175,13 +236,13 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener
}
setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT,
- R.id.filterlist_fragment_container, FilterListFragment.class);
+ R.id.filterlist_fragment_container, FilterListFragment.class, false);
} else {
fragmentLayout = LAYOUT_SINGLE;
actionBar.setDisplayHomeAsUpEnabled(true);
listsNav.setOnClickListener(popupMenuClickListener);
createListsPopover();
- setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, FilterListFragment.class));
+ setupPopoverWithFilterList((FilterListFragment) setupFragment(FilterListFragment.TAG_FILTERLIST_FRAGMENT, 0, FilterListFragment.class, true));
}
}
@@ -275,6 +336,11 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener
if (listsPopover != null)
listsPopover.dismiss();
setCommentsCount(0);
+
+ if (fragmentLayout == LAYOUT_SINGLE) {
+ tlfPager.showFilter((Filter) item);
+ return true;
+ }
return super.onFilterItemClicked(item);
}
@@ -338,6 +404,25 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener
lists.setText(item.title);
}
+ @Override
+ public void onPageSelected(int position) {
+ if (tlfPagerAdapter != null) {
+ configureIntentAndExtrasWithFilter(getIntent(), tlfPagerAdapter.getFilter(position));
+ setListsTitle(tlfPagerAdapter.getPageTitle(position).toString());
+
+ TaskListFragment fragment = getTaskListFragment();
+ fragment.initiateAutomaticSync();
+ fragment.requestCommentCountUpdate();
+ }
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset,
+ int positionOffsetPixels) { /* Nothing */ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) { /* Nothing */ }
+
public void setCommentsCount(int count) {
TypedValue tv = new TypedValue();
@@ -478,6 +563,31 @@ public class TaskListActivity extends AstridActivity implements MainMenuListener
}
}
+ /**
+ * Report who launched this activity
+ */
+ protected void trackActivitySource() {
+ switch (getIntent().getIntExtra(TOKEN_SOURCE,
+ Constants.SOURCE_DEFAULT)) {
+ case Constants.SOURCE_NOTIFICATION:
+ StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_NOTIFICATION);
+ break;
+ case Constants.SOURCE_OTHER:
+ StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_OTHER);
+ break;
+ case Constants.SOURCE_PPWIDGET:
+ StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_PPW);
+ break;
+ case Constants.SOURCE_WIDGET:
+ StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_WIDGET);
+ break;
+ case Constants.SOURCE_C2DM:
+ StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_C2DM);
+ break;
+ }
+ getIntent().putExtra(TOKEN_SOURCE, Constants.SOURCE_DEFAULT); // Only report source once
+ }
+
@Override
public void mainMenuItemSelected(int item, Intent customIntent) {
TaskListFragment tlf = getTaskListFragment();
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java
index 09aed5a19..724d8fd71 100644
--- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java
@@ -28,6 +28,7 @@ import android.support.v4.app.SupportActivity;
import android.support.v4.view.Menu;
import android.support.v4.view.MenuItem;
import android.text.TextUtils;
+import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
@@ -68,6 +69,7 @@ import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
+import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.api.TaskDecoration;
import com.todoroo.astrid.core.CoreFilterExposer;
@@ -146,10 +148,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
/** token for passing a {@link Filter} object through extras */
public static final String TOKEN_FILTER = "filter"; //$NON-NLS-1$
- /** token for indicating source of TLA launch */
- public static final String TOKEN_SOURCE = "source"; //$NON-NLS-1$
-
- public static final String TOKEN_OVERRIDE_ANIM = "finishAnim"; //$NON-NLS-1$
+ private static final String TOKEN_EXTRAS = "extras"; //$NON-NLS-1$
// --- instance variables
@@ -184,10 +183,10 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
protected Filter filter;
protected int sortFlags;
protected int sortSort;
- protected boolean overrideFinishAnim;
protected QuickAddBar quickAddBar;
private Timer backgroundTimer;
+ protected Bundle extras;
private boolean isInbox;
private final TaskListContextMenuExtensionLoader contextMenuExtensionLoader = new TaskListContextMenuExtensionLoader();
@@ -206,6 +205,57 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
AstridDependencyInjector.initialize();
}
+ /**
+ * Instantiates and returns an instance of TaskListFragment (or some subclass). Custom types of
+ * TaskListFragment can be created, with the following precedence:
+ *
+ * --If the filter is of type {@link FilterWithCustomIntent}, the task list type it specifies will be used
+ * --Otherwise, the specified customComponent will be used
+ *
+ * See also: instantiateWithFilterAndExtras(Filter, Bundle) which uses TaskListFragment as the default
+ * custom component.
+ * @param filter
+ * @param extras
+ * @param customComponent
+ * @return
+ */
+ @SuppressWarnings("nls")
+ public static TaskListFragment instantiateWithFilterAndExtras(Filter filter, Bundle extras, Class> customComponent) {
+ Class> component = customComponent;
+ if (filter instanceof FilterWithCustomIntent) {
+ try {
+ component = Class.forName(((FilterWithCustomIntent) filter).customTaskList.getClassName());
+ } catch (Exception e) {
+ // Invalid
+ }
+ }
+ TaskListFragment newFragment;
+ try {
+ newFragment = (TaskListFragment) component.newInstance();
+ } catch (java.lang.InstantiationException e) {
+ Log.e("tla-instantiate", "tla-instantiate", e);
+ newFragment = new TaskListFragment();
+ } catch (IllegalAccessException e) {
+ Log.e("tla-instantiate", "tla-instantiate", e);
+ newFragment = new TaskListFragment();
+ }
+ Bundle args = new Bundle();
+ args.putBundle(TOKEN_EXTRAS, extras);
+ newFragment.setArguments(args);
+ return newFragment;
+ }
+
+ /**
+ * Convenience method for calling instantiateWithFilterAndExtras(Filter, Bundle, Class>) with
+ * TaskListFragment as the default component
+ * @param filter
+ * @param extras
+ * @return
+ */
+ public static TaskListFragment instantiateWithFilterAndExtras(Filter filter, Bundle extras) {
+ return instantiateWithFilterAndExtras(filter, extras, TaskListFragment.class);
+ }
+
/**
* Container Activity must implement this interface and we ensure that it
* does during the onAttach() callback
@@ -242,6 +292,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
public void onCreate(Bundle savedInstanceState) {
DependencyInjectionService.getInstance().inject(this);
super.onCreate(savedInstanceState);
+ extras = getArguments() != null ? getArguments().getBundle(TOKEN_EXTRAS) : null;
}
/*
@@ -287,10 +338,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
upgradeService.showChangeLog(getActivity(),
Preferences.getInt(AstridPreferences.P_UPGRADE_FROM, -1));
- if (getActivity().getIntent().hasExtra(TOKEN_SOURCE)) {
- trackActivitySource();
- }
-
getActivity().runOnUiThread(new Runnable() {
public void run() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
@@ -313,31 +360,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
});
}
- /**
- * Report who launched this activity
- */
- protected void trackActivitySource() {
- switch (getActivity().getIntent().getIntExtra(TOKEN_SOURCE,
- Constants.SOURCE_DEFAULT)) {
- case Constants.SOURCE_NOTIFICATION:
- StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_NOTIFICATION);
- break;
- case Constants.SOURCE_OTHER:
- StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_OTHER);
- break;
- case Constants.SOURCE_PPWIDGET:
- StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_PPW);
- break;
- case Constants.SOURCE_WIDGET:
- StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_WIDGET);
- break;
- case Constants.SOURCE_C2DM:
- StatisticsService.reportEvent(StatisticsConstants.LAUNCH_FROM_C2DM);
- break;
- }
- getActivity().getIntent().putExtra(TOKEN_SOURCE, Constants.SOURCE_DEFAULT); // Only report source once
- }
-
/**
* @return the current tag you are viewing, or null if you're not viewing a tag
*/
@@ -346,12 +368,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
}
protected void onNewIntent(Intent intent) {
- Bundle extras = intent.getExtras();
- if (extras != null) {
- overrideFinishAnim = extras.getBoolean(TOKEN_OVERRIDE_ANIM);
- } else {
- overrideFinishAnim = false;
- }
String intentAction = intent.getAction();
if (Intent.ACTION_SEARCH.equals(intentAction)) {
String query = intent.getStringExtra(SearchManager.QUERY).trim();
@@ -361,17 +377,14 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
"%" + //$NON-NLS-1$
query.toUpperCase() + "%")), //$NON-NLS-1$
null);
- intent = new Intent(getActivity(), TaskListActivity.class);
- intent.putExtra(TaskListFragment.TOKEN_FILTER, searchFilter);
- startActivity(intent);
+ Intent searchIntent = new Intent(getActivity(), TaskListActivity.class);
+ searchIntent.putExtra(TaskListFragment.TOKEN_FILTER, searchFilter);
+ startActivity(searchIntent);
getActivity().finish();
- if (overrideFinishAnim) {
- AndroidUtilities.callOverridePendingTransition(getActivity(),
- R.anim.slide_right_in, R.anim.slide_right_out);
- }
return;
} else if (extras != null && extras.containsKey(TOKEN_FILTER)) {
filter = extras.getParcelable(TOKEN_FILTER);
+ extras.remove(TOKEN_FILTER); // Otherwise writing this filter to parcel gives infinite recursion
} else {
filter = CoreFilterExposer.buildInboxFilter(getResources());
}
@@ -421,6 +434,8 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
Activity activity = getActivity();
if (activity == null)
return;
+ if (!isCurrentTaskListFragment())
+ return;
boolean isTablet = AndroidUtilities.isTabletSized(activity);
if (activity instanceof TaskListActivity)
@@ -625,8 +640,24 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
initiateAutomaticSync();
}
- protected void initiateAutomaticSync() {
- syncActionHelper.initiateAutomaticSync(filter);
+ protected boolean isCurrentTaskListFragment() {
+ AstridActivity activity = (AstridActivity) getActivity();
+ if (activity != null) {
+ return activity.getTaskListFragment() == this;
+ }
+ return false;
+ }
+
+ public void initiateAutomaticSync() {
+ if (isCurrentTaskListFragment())
+ syncActionHelper.initiateAutomaticSync(filter);
+ }
+
+ // Subclasses should override this
+ public void requestCommentCountUpdate() {
+ TaskListActivity activity = (TaskListActivity) getActivity();
+ if (activity != null)
+ activity.setCommentsCount(0);
}
@Override
@@ -686,16 +717,16 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
@Override
public void onReceive(Context context, Intent intent) {
try {
- Bundle extras = intent.getExtras();
- long taskId = extras.getLong(AstridApiConstants.EXTRAS_TASK_ID);
- String addOn = extras.getString(AstridApiConstants.EXTRAS_ADDON);
+ Bundle receivedExtras = intent.getExtras();
+ long taskId = receivedExtras.getLong(AstridApiConstants.EXTRAS_TASK_ID);
+ String addOn = receivedExtras.getString(AstridApiConstants.EXTRAS_ADDON);
if (AstridApiConstants.BROADCAST_SEND_DECORATIONS.equals(intent.getAction())) {
- TaskDecoration deco = extras.getParcelable(AstridApiConstants.EXTRAS_RESPONSE);
+ TaskDecoration deco = receivedExtras.getParcelable(AstridApiConstants.EXTRAS_RESPONSE);
taskAdapter.decorationManager.addNew(taskId, addOn, deco,
null);
} else if (AstridApiConstants.BROADCAST_SEND_DETAILS.equals(intent.getAction())) {
- String detail = extras.getString(AstridApiConstants.EXTRAS_RESPONSE);
+ String detail = receivedExtras.getString(AstridApiConstants.EXTRAS_RESPONSE);
taskAdapter.addDetails(taskId, detail);
}
} catch (Exception e) {
@@ -714,10 +745,6 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
if (requestCode == ACTIVITY_SETTINGS) {
if (resultCode == EditPreferences.RESULT_CODE_THEME_CHANGED) {
getActivity().finish();
- if (overrideFinishAnim) {
- AndroidUtilities.callOverridePendingTransition(getActivity(),
- R.anim.slide_right_in, R.anim.slide_right_out);
- }
getActivity().startActivity(getActivity().getIntent());
TasksWidget.updateWidgets(getActivity());
} else if (resultCode == SyncProviderPreferences.RESULT_CODE_SYNCHRONIZE) {
@@ -1215,11 +1242,11 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
protected void toggleDragDrop(boolean newState) {
if(newState)
- ((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(null,
- SubtasksListFragment.class);
+ ((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(filter,
+ extras, SubtasksListFragment.class);
else
- ((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(null,
- TaskListFragment.class);
+ ((AstridActivity)getActivity()).setupTasklistFragmentWithFilterAndCustomTaskList(filter,
+ extras, TaskListFragment.class);
}
protected boolean isDraggable() {
diff --git a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
index 67fce6c32..b26d2af61 100644
--- a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
+++ b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
@@ -56,6 +56,10 @@ import com.todoroo.astrid.tags.TagService;
public class FilterAdapter extends ArrayAdapter {
+ public static interface FilterDataSourceChangedListener {
+ public void filterDataSourceChanged();
+ }
+
// --- style constants
public int filterStyle = R.style.TextAppearance_FLA_Filter;
@@ -70,7 +74,7 @@ public class FilterAdapter extends ArrayAdapter {
protected final Activity activity;
/** owner listview */
- protected final ListView listView;
+ protected ListView listView;
/** display metrics for scaling icons */
private final DisplayMetrics metrics = new DisplayMetrics();
@@ -99,6 +103,9 @@ public class FilterAdapter extends ArrayAdapter {
private final HashMap filterCounts;
+ private FilterDataSourceChangedListener listener;
+
+
// Previous solution involved a queue of filters and a filterSizeLoadingThread. The filterSizeLoadingThread had
// a few problems: how to make sure that the thread is resumed when the controlling activity is resumed, and
// how to make sure that the the filterQueue does not accumulate filters without being processed. I am replacing
@@ -186,6 +193,13 @@ public class FilterAdapter extends ArrayAdapter {
offerFilter(item);
}
+ public int addOrLookup(Filter filter) {
+ int index = getPosition(filter);
+ if (index >= 0) return index;
+ add(filter);
+ return getCount() - 1;
+ }
+
public void setLastSelected(int lastSelected) {
mSelectedIndex = lastSelected;
}
@@ -226,6 +240,14 @@ public class FilterAdapter extends ArrayAdapter {
});
}
+ public void setDataSourceChangedListener(FilterDataSourceChangedListener listener) {
+ this.listener = listener;
+ }
+
+ public void setListView(ListView listView) {
+ this.listView = listView;
+ }
+
/**
* Create or reuse a view
* @param convertView
@@ -347,10 +369,10 @@ public class FilterAdapter extends ArrayAdapter {
if (filter instanceof FilterCategory) {
Filter[] children = ((FilterCategory) filter).children;
for (Filter f : children) {
- add(f);
+ addOrLookup(f);
}
} else if (filter instanceof Filter){
- add((Filter) filter);
+ addOrLookup((Filter) filter);
}
}
@@ -405,6 +427,13 @@ public class FilterAdapter extends ArrayAdapter {
}
}
+ @Override
+ public void notifyDataSetChanged() {
+ super.notifyDataSetChanged();
+ if (listener != null)
+ listener.filterDataSourceChanged();
+ }
+
/**
* Broadcast a request for lists. The request is sent to every
* application registered to listen for this broadcast. Each application
@@ -433,8 +462,7 @@ public class FilterAdapter extends ArrayAdapter {
IntentFilter bladeFilter = new IntentFilter(AstridApiConstants.BROADCAST_SEND_FILTERS);
bladeFilter.setPriority(1);
activity.registerReceiver(bladeFilterReceiver, bladeFilter);
- if(getCount() == 0)
- getLists();
+ getLists();
}
/**
diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskListFragmentPagerAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskListFragmentPagerAdapter.java
new file mode 100644
index 000000000..2d2936b70
--- /dev/null
+++ b/astrid/src/com/todoroo/astrid/adapter/TaskListFragmentPagerAdapter.java
@@ -0,0 +1,121 @@
+package com.todoroo.astrid.adapter;
+
+import java.util.HashMap;
+
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+
+import com.todoroo.astrid.activity.TaskListFragment;
+import com.todoroo.astrid.adapter.FilterAdapter.FilterDataSourceChangedListener;
+import com.todoroo.astrid.api.Filter;
+import com.todoroo.astrid.api.FilterWithCustomIntent;
+
+public class TaskListFragmentPagerAdapter extends FragmentStatePagerAdapter implements FilterDataSourceChangedListener {
+
+ private final HashMap positionToFragment;
+ private final HashMap> customTaskLists;
+
+ private final FilterAdapter filterAdapter; // Shares an adapter instance with the filter list fragment
+
+ public TaskListFragmentPagerAdapter(FragmentManager fm, FilterAdapter filterAdapter) {
+ super(fm);
+ this.filterAdapter = filterAdapter;
+ filterAdapter.setDataSourceChangedListener(this);
+ positionToFragment = new HashMap();
+ customTaskLists = new HashMap>();
+ }
+
+ @Override
+ public void filterDataSourceChanged() {
+ notifyDataSetChanged();
+ }
+
+ /**
+ * Instantiates and returns a fragment for the filter at the specified position.
+ * Also maps the position to the fragment in a cache for later lookup
+ */
+ @Override
+ public Fragment getItem(int position) {
+ Filter filter = filterAdapter.getItem(position);
+ Fragment fragment = getFragmentForFilter(filter);
+ positionToFragment.put(position, fragment);
+ return fragment;
+ }
+
+ /**
+ * Lookup the fragment for the specified position
+ * @param position
+ * @return
+ */
+ public Fragment lookupFragmentForPosition(int position) {
+ return positionToFragment.get(position);
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return filterAdapter.getItem(position).title;
+ }
+
+ /**
+ * Adds the specified filter to the data source if it doesn't exist,
+ * returning the position of that filter regardless
+ * @param filter
+ * @return
+ */
+ public int addOrLookup(Filter filter) {
+ return filterAdapter.addOrLookup(filter);
+ }
+
+ /**
+ * Get the filter at the specified position
+ * @param position
+ * @return
+ */
+ public Filter getFilter(int position) {
+ return filterAdapter.getItem(position);
+ }
+
+ @Override
+ public int getCount() {
+ return filterAdapter.getCount();
+ }
+
+ public void setCustomTaskListForFilter(Filter f, Class> customTaskList) {
+ customTaskLists.put(f, customTaskList);
+ notifyDataSetChanged();
+ }
+
+ public void clearCustomTaskListForFilter(Filter f) {
+ customTaskLists.remove(f);
+ }
+
+ private Fragment getFragmentForFilter(Filter filter) {
+ Bundle extras = getExtrasForFilter(filter);
+ Class> customList = customTaskLists.get(filter);
+ if (customList == null)
+ customList = TaskListFragment.class;
+ return TaskListFragment.instantiateWithFilterAndExtras(filter, extras, customList);
+ }
+
+ // Constructs extras corresponding to the specified filter that can be used as arguments to the fragment
+ private Bundle getExtrasForFilter(Filter filter) {
+ Bundle extras;
+ if (filter instanceof FilterWithCustomIntent) {
+ extras = ((FilterWithCustomIntent) filter).customExtras;
+ } else {
+ extras = new Bundle();
+ }
+ if (filter != null)
+ extras.putParcelable(TaskListFragment.TOKEN_FILTER, filter);
+ return extras;
+ }
+
+ @Override
+ public Parcelable saveState() {
+ return null; // Don't save state
+ }
+
+}
diff --git a/astrid/src/com/todoroo/astrid/helper/ProgressBarSyncResultCallback.java b/astrid/src/com/todoroo/astrid/helper/ProgressBarSyncResultCallback.java
index 625d59ac3..3446846cf 100644
--- a/astrid/src/com/todoroo/astrid/helper/ProgressBarSyncResultCallback.java
+++ b/astrid/src/com/todoroo/astrid/helper/ProgressBarSyncResultCallback.java
@@ -3,6 +3,7 @@ package com.todoroo.astrid.helper;
import java.util.concurrent.atomic.AtomicInteger;
import android.app.Activity;
+import android.support.v4.app.Fragment;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ProgressBar;
@@ -18,9 +19,9 @@ public class ProgressBarSyncResultCallback extends SyncResultCallbackAdapter {
private final AtomicInteger providers = new AtomicInteger(0);
- public ProgressBarSyncResultCallback(Activity activity,
+ public ProgressBarSyncResultCallback(Activity activity, Fragment fragment,
int progressBarId, Runnable onFinished) {
- this.progressBar = (ProgressBar) activity.findViewById(progressBarId);
+ this.progressBar = (ProgressBar) fragment.getView().findViewById(progressBarId);
this.activity = activity;
this.onFinished = onFinished;
diff --git a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java
index f3a6796ff..31411f42e 100644
--- a/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java
+++ b/astrid/src/com/todoroo/astrid/helper/SyncActionHelper.java
@@ -73,7 +73,7 @@ public class SyncActionHelper {
this.activity = activity;
this.fragment = fragment;
- syncResultCallback = new ProgressBarSyncResultCallback(activity,
+ syncResultCallback = new ProgressBarSyncResultCallback(activity, fragment,
R.id.progressBar, new Runnable() {
@Override
public void run() {
diff --git a/astrid/src/com/todoroo/astrid/ui/TaskListFragmentPager.java b/astrid/src/com/todoroo/astrid/ui/TaskListFragmentPager.java
new file mode 100644
index 000000000..407871fb8
--- /dev/null
+++ b/astrid/src/com/todoroo/astrid/ui/TaskListFragmentPager.java
@@ -0,0 +1,55 @@
+package com.todoroo.astrid.ui;
+
+import android.content.Context;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+
+import com.todoroo.astrid.activity.TaskListFragment;
+import com.todoroo.astrid.adapter.TaskListFragmentPagerAdapter;
+import com.todoroo.astrid.api.Filter;
+
+public class TaskListFragmentPager extends ViewPager {
+
+ public TaskListFragmentPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void setAdapter(PagerAdapter adapter) {
+ if (!(adapter instanceof TaskListFragmentPagerAdapter))
+ throw new ClassCastException("TaskListFragmentPager requires an adapter of type TaskListFragmentPagerAdapter"); //$NON-NLS-1$
+ super.setAdapter(adapter);
+ }
+
+ /**
+ * Show the supplied filter, adding it to the data source if it doesn't exist
+ * @param f
+ */
+ public void showFilter(Filter f) {
+ TaskListFragmentPagerAdapter adapter = (TaskListFragmentPagerAdapter) getAdapter();
+ showFilter(adapter.addOrLookup(f));
+ }
+
+ public void showFilterWithCustomTaskList(Filter f, Class> customTaskList) {
+ TaskListFragmentPagerAdapter adapter = (TaskListFragmentPagerAdapter) getAdapter();
+ adapter.setCustomTaskListForFilter(f, customTaskList);
+ showFilter(adapter.addOrLookup(f));
+ }
+
+ /**
+ * Show the filter at the supplied index, with animation
+ * @param index
+ */
+ public void showFilter(int index) {
+ setCurrentItem(index, true);
+ }
+
+ /**
+ * Returns the currently showing fragment
+ * @return
+ */
+ public TaskListFragment getCurrentFragment() {
+ return (TaskListFragment) ((TaskListFragmentPagerAdapter) getAdapter()).lookupFragmentForPosition(getCurrentItem());
+ }
+}
diff --git a/astrid/src/com/todoroo/astrid/widget/TasksWidget.java b/astrid/src/com/todoroo/astrid/widget/TasksWidget.java
index ad85fabce..cdefa00a2 100644
--- a/astrid/src/com/todoroo/astrid/widget/TasksWidget.java
+++ b/astrid/src/com/todoroo/astrid/widget/TasksWidget.java
@@ -219,7 +219,7 @@ public class TasksWidget extends AppWidgetProvider {
Bundle extras = AndroidUtilities.bundleFromSerializedString(serializedExtras);
listIntent.putExtras(extras);
}
- listIntent.putExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_WIDGET);
+ listIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_WIDGET);
listIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
if(filter != null) {
listIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter);