diff --git a/app/src/googleplay/java/org/tasks/injection/ActivityComponent.java b/app/src/googleplay/java/org/tasks/injection/ActivityComponent.java index b2d0afb2e..7e708b7cf 100644 --- a/app/src/googleplay/java/org/tasks/injection/ActivityComponent.java +++ b/app/src/googleplay/java/org/tasks/injection/ActivityComponent.java @@ -1,5 +1,7 @@ package org.tasks.injection; +import android.arch.lifecycle.ViewModel; + import com.todoroo.astrid.activity.BeastModePreferences; import com.todoroo.astrid.activity.ShareLinkActivity; import com.todoroo.astrid.activity.TaskListActivity; @@ -37,6 +39,7 @@ import org.tasks.reminders.MissedCallActivity; import org.tasks.reminders.NotificationActivity; import org.tasks.reminders.SnoozeActivity; import org.tasks.themes.Theme; +import org.tasks.ui.TaskListViewModel; import org.tasks.voice.VoiceCommandActivity; import org.tasks.widget.ShortcutConfigActivity; import org.tasks.widget.WidgetConfigActivity; @@ -130,4 +133,6 @@ public interface ActivityComponent { void inject(GoogleTaskListSettingsActivity googleTaskListSettingsActivity); void inject(TaskerCreateTaskActivity taskerCreateTaskActivity); + + void inject(TaskListViewModel taskListViewModel); } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 443bca279..f8adbc127 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.activity; import android.annotation.SuppressLint; +import android.arch.lifecycle.ViewModelProviders; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; @@ -59,6 +60,7 @@ import org.tasks.ui.DeadlineControlSet; import org.tasks.ui.EmptyTaskEditFragment; import org.tasks.ui.NavigationDrawerFragment; import org.tasks.ui.PriorityControlSet; +import org.tasks.ui.TaskListViewModel; import javax.inject.Inject; @@ -102,6 +104,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements @BindView(R.id.detail) FrameLayout detail; private NavigationDrawerFragment navigationDrawer; + private TaskListViewModel viewModel; /** For indicating the new list screen should be launched at fragment setup time */ public static final String TOKEN_CREATE_NEW_LIST_NAME = "newListName"; //$NON-NLS-1$ @@ -123,6 +126,10 @@ public class TaskListActivity extends InjectingAppCompatActivity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + viewModel = ViewModelProviders.of(this).get(TaskListViewModel.class); + + getComponent().inject(viewModel); + currentNightMode = getNightMode(); setContentView(R.layout.task_list_activity); @@ -300,6 +307,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements } if(item instanceof Filter) { + viewModel.clear(); startActivity(TaskIntents.getTaskListIntent(this, (Filter) item)); } } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 5805c6137..e4fe05596 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.activity; import android.app.Activity; +import android.arch.lifecycle.ViewModelProviders; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -47,7 +48,6 @@ import org.tasks.R; import org.tasks.activities.FilterSettingsActivity; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; -import org.tasks.data.TaskListDataProvider; import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.SortDialog; import org.tasks.gtasks.SyncAdapterHelper; @@ -61,6 +61,7 @@ import org.tasks.tasklist.ViewHolderFactory; import org.tasks.ui.CheckBoxes; import org.tasks.ui.MenuColorizer; import org.tasks.ui.ProgressDialogAsyncTask; +import org.tasks.ui.TaskListViewModel; import java.util.List; @@ -105,7 +106,6 @@ public class TaskListFragment extends InjectingFragment implements @Inject DialogBuilder dialogBuilder; @Inject CheckBoxes checkBoxes; @Inject TaskCreator taskCreator; - @Inject protected TaskListDataProvider taskListDataProvider; @Inject TimerPlugin timerPlugin; @Inject ViewHolderFactory viewHolderFactory; @Inject protected Tracker tracker; @@ -118,6 +118,8 @@ public class TaskListFragment extends InjectingFragment implements @BindView(R.id.task_list_coordinator) CoordinatorLayout coordinatorLayout; @BindView(R.id.recycler_view) RecyclerView recyclerView; + private TaskListViewModel taskListViewModel; + private TaskAdapter taskAdapter = null; private TaskListRecyclerAdapter recyclerAdapter; private final RefreshReceiver refreshReceiver = new RefreshReceiver(); @@ -169,6 +171,8 @@ public class TaskListFragment extends InjectingFragment implements @Override public void onAttach(Activity activity) { + taskListViewModel = ViewModelProviders.of(getActivity()).get(TaskListViewModel.class); + super.onAttach(activity); callbacks = (TaskListFragmentCallbackHandler) activity; @@ -347,24 +351,22 @@ public class TaskListFragment extends InjectingFragment implements public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - taskListDataProvider.getLiveData(filter, taskProperties()) - .observe(getActivity(), list -> { - if (list.isEmpty()) { - swipeRefreshLayout.setVisibility(View.GONE); - emptyRefreshLayout.setVisibility(View.VISIBLE); - } else { - swipeRefreshLayout.setVisibility(View.VISIBLE); - emptyRefreshLayout.setVisibility(View.GONE); - } + taskListViewModel.getTasks(filter, taskProperties()).observe(getActivity(), list -> { + if (list.isEmpty()) { + swipeRefreshLayout.setVisibility(View.GONE); + emptyRefreshLayout.setVisibility(View.VISIBLE); + } else { + swipeRefreshLayout.setVisibility(View.VISIBLE); + emptyRefreshLayout.setVisibility(View.GONE); + } - // stash selected items - Bundle saveState = recyclerAdapter.getSaveState(); + // stash selected items + Bundle saveState = recyclerAdapter.getSaveState(); - recyclerAdapter.setList(list); + recyclerAdapter.setList(list); - recyclerAdapter.restoreSaveState(saveState); - } - ); + recyclerAdapter.restoreSaveState(saveState); + }); ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); recyclerAdapter.applyToRecyclerView(recyclerView); @@ -431,7 +433,7 @@ public class TaskListFragment extends InjectingFragment implements public void loadTaskListContent(boolean animate) { recyclerAdapter.setAnimate(animate); - taskListDataProvider.invalidate(); + taskListViewModel.invalidate(); } protected TaskAdapter createTaskAdapter() { diff --git a/app/src/main/java/org/tasks/data/TaskListDataProvider.java b/app/src/main/java/org/tasks/ui/TaskListViewModel.java similarity index 77% rename from app/src/main/java/org/tasks/data/TaskListDataProvider.java rename to app/src/main/java/org/tasks/ui/TaskListViewModel.java index a0be53337..1a2deef18 100644 --- a/app/src/main/java/org/tasks/data/TaskListDataProvider.java +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.java @@ -1,6 +1,7 @@ -package org.tasks.data; +package org.tasks.ui; import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.ViewModel; import android.arch.paging.LivePagedListBuilder; import android.arch.paging.LivePagedListProvider; import android.arch.paging.PagedList; @@ -15,6 +16,9 @@ import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; +import org.tasks.data.LimitOffsetDataSource; +import org.tasks.data.Tag; +import org.tasks.data.TaskAttachment; import org.tasks.preferences.Preferences; import javax.inject.Inject; @@ -22,19 +26,30 @@ import javax.inject.Inject; import static com.todoroo.astrid.activity.TaskListFragment.FILE_METADATA_JOIN; import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN; -public class TaskListDataProvider { +public class TaskListViewModel extends ViewModel { + + @Inject TaskDao taskDao; + @Inject Preferences preferences; - private final TaskDao taskDao; - private final Preferences preferences; private LimitOffsetDataSource latest; + private LiveData> tasks; + private Filter filter; + + public void clear() { + tasks = null; + latest = null; + filter = null; + } - @Inject - public TaskListDataProvider(TaskDao taskDao, Preferences preferences) { - this.taskDao = taskDao; - this.preferences = preferences; + public LiveData> getTasks(Filter filter, Property[] properties) { + if (tasks == null || !filter.equals(this.filter)) { + this.filter = filter; + tasks = getLiveData(filter, properties); + } + return tasks; } - public LiveData> getLiveData(Filter filter, Property[] properties) { + private LiveData> getLiveData(Filter filter, Property[] properties) { return new LivePagedListBuilder<>( new LivePagedListProvider() { @Override