Animate expand/collapse in nav drawer

pull/996/head
Alex Baker 5 years ago
parent 56a682a25d
commit 1f244eae25

@ -7,7 +7,6 @@
package com.todoroo.astrid.adapter; package com.todoroo.astrid.adapter;
import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.equal;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import static com.todoroo.astrid.api.FilterListItem.Type.ITEM; import static com.todoroo.astrid.api.FilterListItem.Type.ITEM;
import static com.todoroo.astrid.api.FilterListItem.Type.SUBHEADER; import static com.todoroo.astrid.api.FilterListItem.Type.SUBHEADER;
@ -18,15 +17,15 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.AsyncListDiffer;
import androidx.recyclerview.widget.DiffUtil.ItemCallback; import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder; import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.todoroo.astrid.adapter.FilterViewHolder.OnClick; import com.todoroo.astrid.adapter.FilterViewHolder.OnClick;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.FilterListItem.Type; import com.todoroo.astrid.api.FilterListItem.Type;
import java.util.HashMap; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.billing.Inventory; import org.tasks.billing.Inventory;
@ -39,7 +38,7 @@ import org.tasks.themes.ColorProvider;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeAccent;
public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHolder> { public class NavigationDrawerAdapter extends RecyclerView.Adapter<ViewHolder> {
private static final String TOKEN_SELECTED = "token_selected"; private static final String TOKEN_SELECTED = "token_selected";
private final Activity activity; private final Activity activity;
@ -54,7 +53,8 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
private final LayoutInflater inflater; private final LayoutInflater inflater;
private OnClick onClick; private OnClick onClick;
private Filter selected = null; private Filter selected = null;
private Map<Filter, Integer> counts = new HashMap<>();
private AsyncListDiffer<FilterListItem> differ;
@Inject @Inject
public NavigationDrawerAdapter( public NavigationDrawerAdapter(
@ -67,7 +67,6 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
GoogleTaskDao googleTaskDao, GoogleTaskDao googleTaskDao,
CaldavDao caldavDao, CaldavDao caldavDao,
LocalBroadcastManager localBroadcastManager) { LocalBroadcastManager localBroadcastManager) {
super(new DiffCallback());
this.activity = activity; this.activity = activity;
this.accent = theme.getThemeAccent(); this.accent = theme.getThemeAccent();
this.locale = locale; this.locale = locale;
@ -78,6 +77,8 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
this.caldavDao = caldavDao; this.caldavDao = caldavDao;
this.localBroadcastManager = localBroadcastManager; this.localBroadcastManager = localBroadcastManager;
this.inflater = theme.getLayoutInflater(activity); this.inflater = theme.getLayoutInflater(activity);
differ = new AsyncListDiffer<>(this, new DiffCallback());
} }
public void setOnClick(OnClick onClick) { public void setOnClick(OnClick onClick) {
@ -92,17 +93,16 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
selected = savedInstanceState.getParcelable(TOKEN_SELECTED); selected = savedInstanceState.getParcelable(TOKEN_SELECTED);
} }
public void setCounts(Map<Filter, Integer> counts) {
assertMainThread();
this.counts = counts;
notifyDataSetChanged();
}
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
return position; return position;
} }
@Override
public int getItemCount() {
return differ.getCurrentList().size();
}
public Filter getSelected() { public Filter getSelected() {
return selected; return selected;
} }
@ -137,8 +137,7 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
FilterListItem item = getItem(position); FilterListItem item = getItem(position);
Type type = item.getItemType(); Type type = item.getItemType();
if (type == ITEM) { if (type == ITEM) {
((FilterViewHolder) holder) ((FilterViewHolder) holder).bind(item, item.equals(selected), Math.max(item.count, 0));
.bind(item, item.equals(selected), item.count >= 0 ? item.count : counts.get(item));
} else if (type == SUBHEADER) { } else if (type == SUBHEADER) {
((SubheaderViewHolder) holder).bind((NavigationDrawerSubheader) item); ((SubheaderViewHolder) holder).bind((NavigationDrawerSubheader) item);
} }
@ -149,9 +148,12 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, ViewHol
return getItem(position).getItemType().ordinal(); return getItem(position).getItemType().ordinal();
} }
@Override private FilterListItem getItem(int position) {
public FilterListItem getItem(int position) { return differ.getCurrentList().get(position);
return super.getItem(position); }
public void submitList(List<FilterListItem> filterListItems) {
differ.submitList(filterListItems);
} }
private static class DiffCallback extends ItemCallback<FilterListItem> { private static class DiffCallback extends ItemCallback<FilterListItem> {

@ -1,6 +1,5 @@
package org.tasks.ui; package org.tasks.ui;
import static com.google.common.collect.Iterables.filter;
import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop; import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
@ -34,9 +33,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.R; import org.tasks.R;
@ -215,23 +212,21 @@ public class NavigationDrawerFragment extends InjectingFragment {
private Disposable updateFilters() { private Disposable updateFilters() {
return Single.fromCallable(() -> filterProvider.getItems(true)) return Single.fromCallable(() -> filterProvider.getItems(true))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(adapter::submitList)
.observeOn(Schedulers.io())
.map(this::refreshFilterCount) .map(this::refreshFilterCount)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(adapter::setCounts); .subscribe(adapter::submitList);
} }
private Map<Filter, Integer> refreshFilterCount(List<FilterListItem> items) { private List<FilterListItem> refreshFilterCount(List<FilterListItem> items) {
assertNotMainThread(); assertNotMainThread();
Map<Filter, Integer> result = new HashMap<>(); for (FilterListItem item : items) {
for (FilterListItem item : filter(items, i -> i instanceof Filter && i.count == -1)) { if (item instanceof Filter && item.count == -1) {
result.put((Filter) item, taskDao.count((Filter) item)); item.count = taskDao.count((Filter) item);
}
} }
return result; return items;
} }
private class RefreshReceiver extends BroadcastReceiver { private class RefreshReceiver extends BroadcastReceiver {

Loading…
Cancel
Save