Retain scroll position in task list

pull/645/head
Alex Baker 8 years ago
parent d20b8b4fdf
commit 948e79c15a

@ -1,5 +1,7 @@
package org.tasks.injection; package org.tasks.injection;
import android.arch.lifecycle.ViewModel;
import com.todoroo.astrid.activity.BeastModePreferences; import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.activity.ShareLinkActivity; import com.todoroo.astrid.activity.ShareLinkActivity;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
@ -37,6 +39,7 @@ import org.tasks.reminders.MissedCallActivity;
import org.tasks.reminders.NotificationActivity; import org.tasks.reminders.NotificationActivity;
import org.tasks.reminders.SnoozeActivity; import org.tasks.reminders.SnoozeActivity;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.ui.TaskListViewModel;
import org.tasks.voice.VoiceCommandActivity; import org.tasks.voice.VoiceCommandActivity;
import org.tasks.widget.ShortcutConfigActivity; import org.tasks.widget.ShortcutConfigActivity;
import org.tasks.widget.WidgetConfigActivity; import org.tasks.widget.WidgetConfigActivity;
@ -130,4 +133,6 @@ public interface ActivityComponent {
void inject(GoogleTaskListSettingsActivity googleTaskListSettingsActivity); void inject(GoogleTaskListSettingsActivity googleTaskListSettingsActivity);
void inject(TaskerCreateTaskActivity taskerCreateTaskActivity); void inject(TaskerCreateTaskActivity taskerCreateTaskActivity);
void inject(TaskListViewModel taskListViewModel);
} }

@ -6,6 +6,7 @@
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
@ -59,6 +60,7 @@ import org.tasks.ui.DeadlineControlSet;
import org.tasks.ui.EmptyTaskEditFragment; import org.tasks.ui.EmptyTaskEditFragment;
import org.tasks.ui.NavigationDrawerFragment; import org.tasks.ui.NavigationDrawerFragment;
import org.tasks.ui.PriorityControlSet; import org.tasks.ui.PriorityControlSet;
import org.tasks.ui.TaskListViewModel;
import javax.inject.Inject; import javax.inject.Inject;
@ -102,6 +104,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@BindView(R.id.detail) FrameLayout detail; @BindView(R.id.detail) FrameLayout detail;
private NavigationDrawerFragment navigationDrawer; private NavigationDrawerFragment navigationDrawer;
private TaskListViewModel viewModel;
/** For indicating the new list screen should be launched at fragment setup time */ /** 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$ 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) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
viewModel = ViewModelProviders.of(this).get(TaskListViewModel.class);
getComponent().inject(viewModel);
currentNightMode = getNightMode(); currentNightMode = getNightMode();
setContentView(R.layout.task_list_activity); setContentView(R.layout.task_list_activity);
@ -300,6 +307,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
} }
if(item instanceof Filter) { if(item instanceof Filter) {
viewModel.clear();
startActivity(TaskIntents.getTaskListIntent(this, (Filter) item)); startActivity(TaskIntents.getTaskListIntent(this, (Filter) item));
} }
} }

@ -6,6 +6,7 @@
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import android.app.Activity; import android.app.Activity;
import android.arch.lifecycle.ViewModelProviders;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -47,7 +48,6 @@ import org.tasks.R;
import org.tasks.activities.FilterSettingsActivity; import org.tasks.activities.FilterSettingsActivity;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking; import org.tasks.analytics.Tracking;
import org.tasks.data.TaskListDataProvider;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.SortDialog; import org.tasks.dialogs.SortDialog;
import org.tasks.gtasks.SyncAdapterHelper; import org.tasks.gtasks.SyncAdapterHelper;
@ -61,6 +61,7 @@ import org.tasks.tasklist.ViewHolderFactory;
import org.tasks.ui.CheckBoxes; import org.tasks.ui.CheckBoxes;
import org.tasks.ui.MenuColorizer; import org.tasks.ui.MenuColorizer;
import org.tasks.ui.ProgressDialogAsyncTask; import org.tasks.ui.ProgressDialogAsyncTask;
import org.tasks.ui.TaskListViewModel;
import java.util.List; import java.util.List;
@ -105,7 +106,6 @@ public class TaskListFragment extends InjectingFragment implements
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject CheckBoxes checkBoxes; @Inject CheckBoxes checkBoxes;
@Inject TaskCreator taskCreator; @Inject TaskCreator taskCreator;
@Inject protected TaskListDataProvider taskListDataProvider;
@Inject TimerPlugin timerPlugin; @Inject TimerPlugin timerPlugin;
@Inject ViewHolderFactory viewHolderFactory; @Inject ViewHolderFactory viewHolderFactory;
@Inject protected Tracker tracker; @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.task_list_coordinator) CoordinatorLayout coordinatorLayout;
@BindView(R.id.recycler_view) RecyclerView recyclerView; @BindView(R.id.recycler_view) RecyclerView recyclerView;
private TaskListViewModel taskListViewModel;
private TaskAdapter taskAdapter = null; private TaskAdapter taskAdapter = null;
private TaskListRecyclerAdapter recyclerAdapter; private TaskListRecyclerAdapter recyclerAdapter;
private final RefreshReceiver refreshReceiver = new RefreshReceiver(); private final RefreshReceiver refreshReceiver = new RefreshReceiver();
@ -169,6 +171,8 @@ public class TaskListFragment extends InjectingFragment implements
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
taskListViewModel = ViewModelProviders.of(getActivity()).get(TaskListViewModel.class);
super.onAttach(activity); super.onAttach(activity);
callbacks = (TaskListFragmentCallbackHandler) activity; callbacks = (TaskListFragmentCallbackHandler) activity;
@ -347,8 +351,7 @@ public class TaskListFragment extends InjectingFragment implements
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
taskListDataProvider.getLiveData(filter, taskProperties()) taskListViewModel.getTasks(filter, taskProperties()).observe(getActivity(), list -> {
.observe(getActivity(), list -> {
if (list.isEmpty()) { if (list.isEmpty()) {
swipeRefreshLayout.setVisibility(View.GONE); swipeRefreshLayout.setVisibility(View.GONE);
emptyRefreshLayout.setVisibility(View.VISIBLE); emptyRefreshLayout.setVisibility(View.VISIBLE);
@ -363,8 +366,7 @@ public class TaskListFragment extends InjectingFragment implements
recyclerAdapter.setList(list); recyclerAdapter.setList(list);
recyclerAdapter.restoreSaveState(saveState); recyclerAdapter.restoreSaveState(saveState);
} });
);
((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
recyclerAdapter.applyToRecyclerView(recyclerView); recyclerAdapter.applyToRecyclerView(recyclerView);
@ -431,7 +433,7 @@ public class TaskListFragment extends InjectingFragment implements
public void loadTaskListContent(boolean animate) { public void loadTaskListContent(boolean animate) {
recyclerAdapter.setAnimate(animate); recyclerAdapter.setAnimate(animate);
taskListDataProvider.invalidate(); taskListViewModel.invalidate();
} }
protected TaskAdapter createTaskAdapter() { protected TaskAdapter createTaskAdapter() {

@ -1,6 +1,7 @@
package org.tasks.data; package org.tasks.ui;
import android.arch.lifecycle.LiveData; import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.arch.paging.LivePagedListBuilder; import android.arch.paging.LivePagedListBuilder;
import android.arch.paging.LivePagedListProvider; import android.arch.paging.LivePagedListProvider;
import android.arch.paging.PagedList; 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.dao.TaskDao;
import com.todoroo.astrid.data.Task; 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 org.tasks.preferences.Preferences;
import javax.inject.Inject; 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.FILE_METADATA_JOIN;
import static com.todoroo.astrid.activity.TaskListFragment.TAGS_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 LimitOffsetDataSource latest;
private LiveData<PagedList<Task>> tasks;
private Filter filter;
public void clear() {
tasks = null;
latest = null;
filter = null;
}
@Inject public LiveData<PagedList<Task>> getTasks(Filter filter, Property<?>[] properties) {
public TaskListDataProvider(TaskDao taskDao, Preferences preferences) { if (tasks == null || !filter.equals(this.filter)) {
this.taskDao = taskDao; this.filter = filter;
this.preferences = preferences; tasks = getLiveData(filter, properties);
}
return tasks;
} }
public LiveData<PagedList<Task>> getLiveData(Filter filter, Property<?>[] properties) { private LiveData<PagedList<Task>> getLiveData(Filter filter, Property<?>[] properties) {
return new LivePagedListBuilder<>( return new LivePagedListBuilder<>(
new LivePagedListProvider<Integer, Task>() { new LivePagedListProvider<Integer, Task>() {
@Override @Override
Loading…
Cancel
Save