Retain scroll position in task list

synthesis
Alex Baker 6 years ago
parent d20b8b4fdf
commit 948e79c15a

@ -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);
}

@ -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));
}
}

@ -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() {

@ -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<PagedList<Task>> 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<PagedList<Task>> getTasks(Filter filter, Property<?>[] properties) {
if (tasks == null || !filter.equals(this.filter)) {
this.filter = filter;
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<>(
new LivePagedListProvider<Integer, Task>() {
@Override
Loading…
Cancel
Save