mirror of https://github.com/tasks/tasks
Convert navigation drawer to Kotlin
parent
20ca1c6486
commit
71721f982a
@ -1,176 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012 Todoroo Inc
|
|
||||||
*
|
|
||||||
* See the file "LICENSE" for the full license governing this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.todoroo.astrid.adapter;
|
|
||||||
|
|
||||||
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.api.FilterListItem;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.billing.Inventory;
|
|
||||||
import org.tasks.data.CaldavDao;
|
|
||||||
import org.tasks.data.GoogleTaskDao;
|
|
||||||
import org.tasks.filters.NavigationDrawerSubheader;
|
|
||||||
import org.tasks.locale.Locale;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.themes.ColorProvider;
|
|
||||||
|
|
||||||
public class FilterAdapter extends BaseAdapter {
|
|
||||||
|
|
||||||
private static final String TOKEN_FILTERS = "token_filters";
|
|
||||||
private static final String TOKEN_SELECTED = "token_selected";
|
|
||||||
private static final int VIEW_TYPE_COUNT = FilterListItem.Type.values().length;
|
|
||||||
private final Activity activity;
|
|
||||||
private final Locale locale;
|
|
||||||
private final Inventory inventory;
|
|
||||||
private final ColorProvider colorProvider;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final GoogleTaskDao googleTaskDao;
|
|
||||||
private final CaldavDao caldavDao;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
private Filter selected = null;
|
|
||||||
private List<FilterListItem> items = new ArrayList<>();
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public FilterAdapter(
|
|
||||||
Activity activity,
|
|
||||||
Locale locale,
|
|
||||||
Inventory inventory,
|
|
||||||
ColorProvider colorProvider,
|
|
||||||
Preferences preferences,
|
|
||||||
GoogleTaskDao googleTaskDao,
|
|
||||||
CaldavDao caldavDao,
|
|
||||||
LocalBroadcastManager localBroadcastManager) {
|
|
||||||
this.activity = activity;
|
|
||||||
this.locale = locale;
|
|
||||||
this.inventory = inventory;
|
|
||||||
this.colorProvider = colorProvider;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.caldavDao = caldavDao;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void save(Bundle outState) {
|
|
||||||
outState.putParcelableArrayList(TOKEN_FILTERS, getItems());
|
|
||||||
outState.putParcelable(TOKEN_SELECTED, selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void restore(Bundle savedInstanceState) {
|
|
||||||
items = savedInstanceState.getParcelableArrayList(TOKEN_FILTERS);
|
|
||||||
selected = savedInstanceState.getParcelable(TOKEN_SELECTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setData(List<FilterListItem> items, @Nullable Filter selected) {
|
|
||||||
assertMainThread();
|
|
||||||
this.items = items;
|
|
||||||
this.selected = selected;
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
assertMainThread();
|
|
||||||
return items.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FilterListItem getItem(int position) {
|
|
||||||
assertMainThread();
|
|
||||||
return items.get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Create or reuse a view */
|
|
||||||
private View newView(View convertView, ViewGroup parent, FilterListItem.Type viewType) {
|
|
||||||
if (convertView == null) {
|
|
||||||
convertView =
|
|
||||||
LayoutInflater.from(parent.getContext()).inflate(viewType.layout, parent, false);
|
|
||||||
ViewHolder viewHolder;
|
|
||||||
switch (viewType) {
|
|
||||||
case ITEM:
|
|
||||||
viewHolder =
|
|
||||||
new FilterViewHolder(
|
|
||||||
convertView, false, locale, activity, inventory, colorProvider, null);
|
|
||||||
break;
|
|
||||||
case SEPARATOR:
|
|
||||||
viewHolder = new FilterViewHolder(convertView);
|
|
||||||
break;
|
|
||||||
case SUBHEADER:
|
|
||||||
viewHolder =
|
|
||||||
new SubheaderViewHolder(
|
|
||||||
convertView,
|
|
||||||
activity,
|
|
||||||
preferences,
|
|
||||||
googleTaskDao,
|
|
||||||
caldavDao,
|
|
||||||
localBroadcastManager);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new RuntimeException();
|
|
||||||
}
|
|
||||||
convertView.setTag(viewHolder);
|
|
||||||
}
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ArrayList<FilterListItem> getItems() {
|
|
||||||
assertMainThread();
|
|
||||||
return new ArrayList<>(items);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
|
|
||||||
FilterListItem item = getItem(position);
|
|
||||||
convertView = newView(convertView, parent, item.getItemType());
|
|
||||||
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
|
|
||||||
switch (item.getItemType()) {
|
|
||||||
case ITEM:
|
|
||||||
((FilterViewHolder) viewHolder).bind(item, item.equals(selected), 0);
|
|
||||||
break;
|
|
||||||
case SUBHEADER:
|
|
||||||
((SubheaderViewHolder) viewHolder).bind((NavigationDrawerSubheader) item);
|
|
||||||
break;
|
|
||||||
case SEPARATOR:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getViewTypeCount() {
|
|
||||||
return VIEW_TYPE_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled(int position) {
|
|
||||||
return getItem(position).getItemType() == FilterListItem.Type.ITEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemViewType(int position) {
|
|
||||||
return getItem(position).getItemType().ordinal();
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Todoroo Inc
|
||||||
|
*
|
||||||
|
* See the file "LICENSE" for the full license governing this code.
|
||||||
|
*/
|
||||||
|
package com.todoroo.astrid.adapter
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.BaseAdapter
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.todoroo.andlib.utility.AndroidUtilities
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.api.FilterListItem
|
||||||
|
import com.todoroo.astrid.api.FilterListItem.Type.*
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.billing.Inventory
|
||||||
|
import org.tasks.data.CaldavDao
|
||||||
|
import org.tasks.data.GoogleTaskDao
|
||||||
|
import org.tasks.filters.NavigationDrawerSubheader
|
||||||
|
import org.tasks.locale.Locale
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import org.tasks.themes.ColorProvider
|
||||||
|
import java.util.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class FilterAdapter @Inject constructor(
|
||||||
|
private val activity: Activity,
|
||||||
|
private val locale: Locale,
|
||||||
|
private val inventory: Inventory,
|
||||||
|
private val colorProvider: ColorProvider,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val caldavDao: CaldavDao,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager) : BaseAdapter() {
|
||||||
|
private var selected: Filter? = null
|
||||||
|
private var items: List<FilterListItem> = ArrayList()
|
||||||
|
|
||||||
|
fun save(outState: Bundle) {
|
||||||
|
outState.putParcelableArrayList(TOKEN_FILTERS, getItems())
|
||||||
|
outState.putParcelable(TOKEN_SELECTED, selected)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun restore(savedInstanceState: Bundle) {
|
||||||
|
items = savedInstanceState.getParcelableArrayList(TOKEN_FILTERS) ?: ArrayList()
|
||||||
|
selected = savedInstanceState.getParcelable(TOKEN_SELECTED)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setData(items: List<FilterListItem>, selected: Filter?) {
|
||||||
|
AndroidUtilities.assertMainThread()
|
||||||
|
this.items = items
|
||||||
|
this.selected = selected
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCount(): Int {
|
||||||
|
AndroidUtilities.assertMainThread()
|
||||||
|
return items.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItem(position: Int): FilterListItem {
|
||||||
|
AndroidUtilities.assertMainThread()
|
||||||
|
return items[position]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemId(position: Int) = position.toLong()
|
||||||
|
|
||||||
|
/** Create or reuse a view */
|
||||||
|
private fun newView(convertView: View?, parent: ViewGroup, viewType: FilterListItem.Type): View {
|
||||||
|
return if (convertView != null) {
|
||||||
|
convertView
|
||||||
|
} else {
|
||||||
|
val newView = LayoutInflater.from(parent.context).inflate(viewType.layout, parent, false)
|
||||||
|
newView.tag = when (viewType) {
|
||||||
|
ITEM -> FilterViewHolder(
|
||||||
|
newView, false, locale, activity, inventory, colorProvider, null)
|
||||||
|
SEPARATOR -> FilterViewHolder(newView)
|
||||||
|
SUBHEADER -> SubheaderViewHolder(
|
||||||
|
newView,
|
||||||
|
activity,
|
||||||
|
preferences,
|
||||||
|
googleTaskDao,
|
||||||
|
caldavDao,
|
||||||
|
localBroadcastManager)
|
||||||
|
}
|
||||||
|
newView
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getItems(): ArrayList<FilterListItem> {
|
||||||
|
AndroidUtilities.assertMainThread()
|
||||||
|
return ArrayList(items)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
||||||
|
val item = getItem(position)
|
||||||
|
val view = newView(convertView, parent, item.itemType)
|
||||||
|
val viewHolder = view.tag as RecyclerView.ViewHolder
|
||||||
|
when (item.itemType) {
|
||||||
|
ITEM -> (viewHolder as FilterViewHolder).bind(item, item == selected, 0)
|
||||||
|
SUBHEADER -> (viewHolder as SubheaderViewHolder).bind((item as NavigationDrawerSubheader))
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getViewTypeCount() = VIEW_TYPE_COUNT
|
||||||
|
|
||||||
|
override fun isEnabled(position: Int) = getItem(position).itemType == ITEM
|
||||||
|
|
||||||
|
override fun getItemViewType(position: Int) = getItem(position).itemType.ordinal
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TOKEN_FILTERS = "token_filters"
|
||||||
|
private const val TOKEN_SELECTED = "token_selected"
|
||||||
|
private val VIEW_TYPE_COUNT = values().size
|
||||||
|
}
|
||||||
|
}
|
@ -1,137 +0,0 @@
|
|||||||
package com.todoroo.astrid.adapter;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.CheckedTextView;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import com.todoroo.astrid.api.CaldavFilter;
|
|
||||||
import com.todoroo.astrid.api.CustomFilter;
|
|
||||||
import com.todoroo.astrid.api.FilterListItem;
|
|
||||||
import com.todoroo.astrid.api.GtasksFilter;
|
|
||||||
import com.todoroo.astrid.api.TagFilter;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.billing.Inventory;
|
|
||||||
import org.tasks.filters.PlaceFilter;
|
|
||||||
import org.tasks.locale.Locale;
|
|
||||||
import org.tasks.themes.ColorProvider;
|
|
||||||
import org.tasks.themes.CustomIcons;
|
|
||||||
import org.tasks.themes.DrawableUtil;
|
|
||||||
import org.tasks.themes.ThemeColor;
|
|
||||||
|
|
||||||
public class FilterViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@BindView(R.id.row)
|
|
||||||
View row;
|
|
||||||
|
|
||||||
@BindView(R.id.text)
|
|
||||||
CheckedTextView text;
|
|
||||||
|
|
||||||
@BindView(R.id.icon)
|
|
||||||
ImageView icon;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@BindView(R.id.size)
|
|
||||||
TextView size;
|
|
||||||
|
|
||||||
private OnClick onClick;
|
|
||||||
private boolean navigationDrawer;
|
|
||||||
private Locale locale;
|
|
||||||
private Activity activity;
|
|
||||||
private View itemView;
|
|
||||||
private Inventory inventory;
|
|
||||||
private ColorProvider colorProvider;
|
|
||||||
|
|
||||||
FilterViewHolder(
|
|
||||||
@NonNull View itemView,
|
|
||||||
boolean navigationDrawer,
|
|
||||||
Locale locale,
|
|
||||||
Activity activity,
|
|
||||||
Inventory inventory,
|
|
||||||
ColorProvider colorProvider,
|
|
||||||
OnClick onClick) {
|
|
||||||
super(itemView);
|
|
||||||
this.inventory = inventory;
|
|
||||||
this.colorProvider = colorProvider;
|
|
||||||
|
|
||||||
ButterKnife.bind(this, itemView);
|
|
||||||
|
|
||||||
this.itemView = itemView;
|
|
||||||
this.navigationDrawer = navigationDrawer;
|
|
||||||
this.locale = locale;
|
|
||||||
this.activity = activity;
|
|
||||||
this.onClick = onClick;
|
|
||||||
|
|
||||||
if (navigationDrawer) {
|
|
||||||
text.setCheckMarkDrawable(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterViewHolder(@NonNull View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void bind(FilterListItem filter, boolean selected, Integer count) {
|
|
||||||
if (navigationDrawer) {
|
|
||||||
itemView.setSelected(selected);
|
|
||||||
} else {
|
|
||||||
text.setChecked(selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
int icon = getIcon(filter);
|
|
||||||
this.icon.setImageDrawable(DrawableUtil.getWrapped(activity, icon));
|
|
||||||
this.icon.getDrawable().setTint(getColor(filter));
|
|
||||||
text.setText(filter.listingTitle);
|
|
||||||
|
|
||||||
if (count == null || count == 0) {
|
|
||||||
size.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
size.setText(locale.formatNumber(count));
|
|
||||||
size.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (onClick != null) {
|
|
||||||
row.setOnClickListener(v -> onClick.onClick(filter));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getColor(FilterListItem filter) {
|
|
||||||
if (filter.tint != 0) {
|
|
||||||
ThemeColor color = colorProvider.getThemeColor(filter.tint, true);
|
|
||||||
if (color.isFree() || inventory.purchasedThemes()) {
|
|
||||||
return color.getPrimaryColor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return activity.getColor(R.color.text_primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getIcon(FilterListItem filter) {
|
|
||||||
if (filter.icon < 1000 || inventory.hasPro()) {
|
|
||||||
Integer icon = CustomIcons.getIconResId(filter.icon);
|
|
||||||
if (icon != null) {
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (filter instanceof TagFilter) {
|
|
||||||
return R.drawable.ic_outline_label_24px;
|
|
||||||
} else if (filter instanceof GtasksFilter || filter instanceof CaldavFilter) {
|
|
||||||
return R.drawable.ic_outline_cloud_24px;
|
|
||||||
} else if (filter instanceof CustomFilter) {
|
|
||||||
return R.drawable.ic_outline_filter_list_24px;
|
|
||||||
} else if (filter instanceof PlaceFilter) {
|
|
||||||
return R.drawable.ic_outline_place_24px;
|
|
||||||
} else {
|
|
||||||
return filter.icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OnClick {
|
|
||||||
void onClick(@Nullable FilterListItem item);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,109 @@
|
|||||||
|
package com.todoroo.astrid.adapter
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.CheckedTextView
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import butterknife.BindView
|
||||||
|
import butterknife.ButterKnife
|
||||||
|
import com.todoroo.astrid.api.*
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.billing.Inventory
|
||||||
|
import org.tasks.filters.PlaceFilter
|
||||||
|
import org.tasks.locale.Locale
|
||||||
|
import org.tasks.themes.ColorProvider
|
||||||
|
import org.tasks.themes.CustomIcons.getIconResId
|
||||||
|
import org.tasks.themes.DrawableUtil
|
||||||
|
|
||||||
|
class FilterViewHolder : RecyclerView.ViewHolder {
|
||||||
|
@BindView(R.id.row)
|
||||||
|
lateinit var row: View
|
||||||
|
|
||||||
|
@BindView(R.id.text)
|
||||||
|
lateinit var text: CheckedTextView
|
||||||
|
|
||||||
|
@BindView(R.id.icon)
|
||||||
|
lateinit var icon: ImageView
|
||||||
|
|
||||||
|
@BindView(R.id.size)
|
||||||
|
lateinit var size: TextView
|
||||||
|
|
||||||
|
private var onClick: ((FilterListItem?) -> Unit)? = null
|
||||||
|
private var navigationDrawer = false
|
||||||
|
private var locale: Locale? = null
|
||||||
|
private var activity: Activity? = null
|
||||||
|
private var inventory: Inventory? = null
|
||||||
|
private var colorProvider: ColorProvider? = null
|
||||||
|
|
||||||
|
internal constructor(
|
||||||
|
itemView: View,
|
||||||
|
navigationDrawer: Boolean,
|
||||||
|
locale: Locale,
|
||||||
|
activity: Activity,
|
||||||
|
inventory: Inventory,
|
||||||
|
colorProvider: ColorProvider,
|
||||||
|
onClick: ((FilterListItem?) -> Unit)?) : super(itemView) {
|
||||||
|
this.inventory = inventory
|
||||||
|
this.colorProvider = colorProvider
|
||||||
|
ButterKnife.bind(this, itemView)
|
||||||
|
this.navigationDrawer = navigationDrawer
|
||||||
|
this.locale = locale
|
||||||
|
this.activity = activity
|
||||||
|
this.onClick = onClick
|
||||||
|
if (navigationDrawer) {
|
||||||
|
text.checkMarkDrawable = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal constructor(itemView: View) : super(itemView)
|
||||||
|
|
||||||
|
fun bind(filter: FilterListItem, selected: Boolean, count: Int?) {
|
||||||
|
if (navigationDrawer) {
|
||||||
|
itemView.isSelected = selected
|
||||||
|
} else {
|
||||||
|
text.isChecked = selected
|
||||||
|
}
|
||||||
|
val icon = getIcon(filter)
|
||||||
|
this.icon.setImageDrawable(DrawableUtil.getWrapped(activity, icon))
|
||||||
|
this.icon.drawable.setTint(getColor(filter))
|
||||||
|
text.text = filter.listingTitle
|
||||||
|
if (count == null || count == 0) {
|
||||||
|
size.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
size.text = locale!!.formatNumber(count)
|
||||||
|
size.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
row.setOnClickListener {
|
||||||
|
onClick?.invoke(filter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getColor(filter: FilterListItem): Int {
|
||||||
|
if (filter.tint != 0) {
|
||||||
|
val color = colorProvider!!.getThemeColor(filter.tint, true)
|
||||||
|
if (color.isFree || inventory!!.purchasedThemes()) {
|
||||||
|
return color.primaryColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return activity!!.getColor(R.color.text_primary)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIcon(filter: FilterListItem): Int {
|
||||||
|
if (filter.icon < 1000 || inventory!!.hasPro()) {
|
||||||
|
val icon = getIconResId(filter.icon)
|
||||||
|
if (icon != null) {
|
||||||
|
return icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return when (filter) {
|
||||||
|
is TagFilter -> R.drawable.ic_outline_label_24px
|
||||||
|
is GtasksFilter -> R.drawable.ic_outline_cloud_24px
|
||||||
|
is CaldavFilter -> R.drawable.ic_outline_cloud_24px
|
||||||
|
is CustomFilter -> R.drawable.ic_outline_filter_list_24px
|
||||||
|
is PlaceFilter -> R.drawable.ic_outline_place_24px
|
||||||
|
else -> filter.icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012 Todoroo Inc
|
|
||||||
*
|
|
||||||
* See the file "LICENSE" for the full license governing this code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.todoroo.astrid.adapter;
|
|
||||||
|
|
||||||
import static com.google.common.base.Objects.equal;
|
|
||||||
import static com.todoroo.astrid.api.FilterListItem.Type.ITEM;
|
|
||||||
import static com.todoroo.astrid.api.FilterListItem.Type.SUBHEADER;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.recyclerview.widget.AsyncListDiffer;
|
|
||||||
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
|
|
||||||
import com.todoroo.astrid.adapter.FilterViewHolder.OnClick;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.api.FilterListItem;
|
|
||||||
import com.todoroo.astrid.api.FilterListItem.Type;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.billing.Inventory;
|
|
||||||
import org.tasks.data.CaldavDao;
|
|
||||||
import org.tasks.data.GoogleTaskDao;
|
|
||||||
import org.tasks.filters.NavigationDrawerSubheader;
|
|
||||||
import org.tasks.locale.Locale;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.themes.ColorProvider;
|
|
||||||
|
|
||||||
public class NavigationDrawerAdapter extends RecyclerView.Adapter<ViewHolder> {
|
|
||||||
|
|
||||||
private static final String TOKEN_SELECTED = "token_selected";
|
|
||||||
private final Activity activity;
|
|
||||||
private final Locale locale;
|
|
||||||
private final Inventory inventory;
|
|
||||||
private final ColorProvider colorProvider;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final GoogleTaskDao googleTaskDao;
|
|
||||||
private final CaldavDao caldavDao;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
private OnClick onClick;
|
|
||||||
private Filter selected = null;
|
|
||||||
|
|
||||||
private final AsyncListDiffer<FilterListItem> differ;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public NavigationDrawerAdapter(
|
|
||||||
Activity activity,
|
|
||||||
Locale locale,
|
|
||||||
Inventory inventory,
|
|
||||||
ColorProvider colorProvider,
|
|
||||||
Preferences preferences,
|
|
||||||
GoogleTaskDao googleTaskDao,
|
|
||||||
CaldavDao caldavDao,
|
|
||||||
LocalBroadcastManager localBroadcastManager) {
|
|
||||||
this.activity = activity;
|
|
||||||
this.locale = locale;
|
|
||||||
this.inventory = inventory;
|
|
||||||
this.colorProvider = colorProvider;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.caldavDao = caldavDao;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
|
|
||||||
differ = new AsyncListDiffer<>(this, new DiffCallback());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOnClick(OnClick onClick) {
|
|
||||||
this.onClick = onClick;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void save(Bundle outState) {
|
|
||||||
outState.putParcelable(TOKEN_SELECTED, selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void restore(Bundle savedInstanceState) {
|
|
||||||
selected = savedInstanceState.getParcelable(TOKEN_SELECTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return differ.getCurrentList().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelected(Filter selected) {
|
|
||||||
this.selected = selected;
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
Type type = Type.values()[viewType];
|
|
||||||
View view = LayoutInflater.from(parent.getContext()).inflate(type.layout, parent, false);
|
|
||||||
if (type == ITEM) {
|
|
||||||
return new FilterViewHolder(
|
|
||||||
view, true, locale, activity, inventory, colorProvider, this::onClickFilter);
|
|
||||||
} else if (type == SUBHEADER) {
|
|
||||||
return new SubheaderViewHolder(
|
|
||||||
view, activity, preferences, googleTaskDao, caldavDao, localBroadcastManager);
|
|
||||||
} else {
|
|
||||||
return new FilterViewHolder(view);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onClickFilter(@Nullable FilterListItem filter) {
|
|
||||||
onClick.onClick(equal(filter, selected) ? null : filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
|
|
||||||
FilterListItem item = getItem(position);
|
|
||||||
Type type = item.getItemType();
|
|
||||||
if (type == ITEM) {
|
|
||||||
((FilterViewHolder) holder).bind(item, item.equals(selected), Math.max(item.count, 0));
|
|
||||||
} else if (type == SUBHEADER) {
|
|
||||||
((SubheaderViewHolder) holder).bind((NavigationDrawerSubheader) item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemViewType(int position) {
|
|
||||||
return getItem(position).getItemType().ordinal();
|
|
||||||
}
|
|
||||||
|
|
||||||
private FilterListItem getItem(int position) {
|
|
||||||
return differ.getCurrentList().get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void submitList(List<FilterListItem> filterListItems) {
|
|
||||||
differ.submitList(filterListItems);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class DiffCallback extends ItemCallback<FilterListItem> {
|
|
||||||
@Override
|
|
||||||
public boolean areItemsTheSame(
|
|
||||||
@NonNull FilterListItem oldItem, @NonNull FilterListItem newItem) {
|
|
||||||
return oldItem.areItemsTheSame(newItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean areContentsTheSame(
|
|
||||||
@NonNull FilterListItem oldItem, @NonNull FilterListItem newItem) {
|
|
||||||
return oldItem.areContentsTheSame(newItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Todoroo Inc
|
||||||
|
*
|
||||||
|
* See the file "LICENSE" for the full license governing this code.
|
||||||
|
*/
|
||||||
|
package com.todoroo.astrid.adapter
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.AsyncListDiffer
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.api.FilterListItem
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.billing.Inventory
|
||||||
|
import org.tasks.data.CaldavDao
|
||||||
|
import org.tasks.data.GoogleTaskDao
|
||||||
|
import org.tasks.filters.NavigationDrawerSubheader
|
||||||
|
import org.tasks.locale.Locale
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import org.tasks.themes.ColorProvider
|
||||||
|
import javax.inject.Inject
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
|
class NavigationDrawerAdapter @Inject constructor(
|
||||||
|
private val activity: Activity,
|
||||||
|
private val locale: Locale,
|
||||||
|
private val inventory: Inventory,
|
||||||
|
private val colorProvider: ColorProvider,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val caldavDao: CaldavDao,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager)
|
||||||
|
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
|
|
||||||
|
private lateinit var onClick: (FilterListItem?) -> Unit
|
||||||
|
private var selected: Filter? = null
|
||||||
|
private val differ = AsyncListDiffer(this, DiffCallback())
|
||||||
|
|
||||||
|
fun setOnClick(onClick: (FilterListItem?) -> Unit) {
|
||||||
|
this.onClick = onClick
|
||||||
|
}
|
||||||
|
|
||||||
|
fun save(outState: Bundle) {
|
||||||
|
outState.putParcelable(TOKEN_SELECTED, selected)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun restore(savedInstanceState: Bundle) {
|
||||||
|
selected = savedInstanceState.getParcelable(TOKEN_SELECTED)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemId(position: Int) = position.toLong()
|
||||||
|
|
||||||
|
override fun getItemCount() = differ.currentList.size
|
||||||
|
|
||||||
|
fun setSelected(selected: Filter?) {
|
||||||
|
this.selected = selected
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
|
val type = FilterListItem.Type.values()[viewType]
|
||||||
|
val view = LayoutInflater.from(parent.context).inflate(type.layout, parent, false)
|
||||||
|
return when (type) {
|
||||||
|
FilterListItem.Type.ITEM -> FilterViewHolder(
|
||||||
|
view, true, locale, activity, inventory, colorProvider) { filter: FilterListItem? -> onClickFilter(filter) }
|
||||||
|
FilterListItem.Type.SUBHEADER -> SubheaderViewHolder(
|
||||||
|
view, activity, preferences, googleTaskDao, caldavDao, localBroadcastManager)
|
||||||
|
else -> FilterViewHolder(view)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onClickFilter(filter: FilterListItem?) = onClick.invoke(if (filter == selected) null else filter)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||||
|
val item = getItem(position)
|
||||||
|
val type = item.itemType
|
||||||
|
if (type == FilterListItem.Type.ITEM) {
|
||||||
|
(holder as FilterViewHolder).bind(item, item == selected, max(item.count, 0))
|
||||||
|
} else if (type == FilterListItem.Type.SUBHEADER) {
|
||||||
|
(holder as SubheaderViewHolder).bind((item as NavigationDrawerSubheader))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemViewType(position: Int) = getItem(position).itemType.ordinal
|
||||||
|
|
||||||
|
private fun getItem(position: Int) = differ.currentList[position]
|
||||||
|
|
||||||
|
fun submitList(filterListItems: List<FilterListItem>) = differ.submitList(filterListItems)
|
||||||
|
|
||||||
|
private class DiffCallback : DiffUtil.ItemCallback<FilterListItem>() {
|
||||||
|
override fun areItemsTheSame(old: FilterListItem, new: FilterListItem) = old.areItemsTheSame(new)
|
||||||
|
|
||||||
|
override fun areContentsTheSame(old: FilterListItem, new: FilterListItem) = old.areContentsTheSame(new)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TOKEN_SELECTED = "token_selected"
|
||||||
|
}
|
||||||
|
}
|
@ -1,83 +0,0 @@
|
|||||||
package com.todoroo.astrid.adapter;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import butterknife.OnClick;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.data.CaldavDao;
|
|
||||||
import org.tasks.data.GoogleTaskDao;
|
|
||||||
import org.tasks.filters.NavigationDrawerSubheader;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
import org.tasks.preferences.SyncPreferences;
|
|
||||||
import org.tasks.themes.DrawableUtil;
|
|
||||||
|
|
||||||
class SubheaderViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final GoogleTaskDao googleTaskDao;
|
|
||||||
private final CaldavDao caldavDao;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
@BindView(R.id.text)
|
|
||||||
TextView text;
|
|
||||||
|
|
||||||
@BindView(R.id.icon_error)
|
|
||||||
ImageView errorIcon;
|
|
||||||
|
|
||||||
private NavigationDrawerSubheader subheader;
|
|
||||||
|
|
||||||
SubheaderViewHolder(
|
|
||||||
@NonNull View itemView,
|
|
||||||
Activity activity,
|
|
||||||
Preferences preferences,
|
|
||||||
GoogleTaskDao googleTaskDao,
|
|
||||||
CaldavDao caldavDao,
|
|
||||||
LocalBroadcastManager localBroadcastManager) {
|
|
||||||
super(itemView);
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.caldavDao = caldavDao;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
|
|
||||||
ButterKnife.bind(this, itemView);
|
|
||||||
|
|
||||||
errorIcon.setOnClickListener(
|
|
||||||
v -> activity.startActivity(new Intent(activity, SyncPreferences.class)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnClick(R.id.subheader_row)
|
|
||||||
public void onClick() {
|
|
||||||
boolean collapsed = !subheader.isCollapsed();
|
|
||||||
switch (subheader.getSubheaderType()) {
|
|
||||||
case PREFERENCE:
|
|
||||||
preferences.setBoolean((int) subheader.getId(), collapsed);
|
|
||||||
break;
|
|
||||||
case GOOGLE_TASKS:
|
|
||||||
googleTaskDao.setCollapsed(subheader.getId(), collapsed);
|
|
||||||
break;
|
|
||||||
case CALDAV:
|
|
||||||
caldavDao.setCollapsed(subheader.getId(), collapsed);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
localBroadcastManager.broadcastRefreshList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void bind(NavigationDrawerSubheader subheader) {
|
|
||||||
this.subheader = subheader;
|
|
||||||
text.setText(subheader.listingTitle);
|
|
||||||
errorIcon.setVisibility(subheader.error ? View.VISIBLE : View.GONE);
|
|
||||||
DrawableUtil.setRightDrawable(
|
|
||||||
itemView.getContext(),
|
|
||||||
text,
|
|
||||||
subheader.isCollapsed()
|
|
||||||
? R.drawable.ic_keyboard_arrow_up_black_18dp
|
|
||||||
: R.drawable.ic_keyboard_arrow_down_black_18dp);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,66 @@
|
|||||||
|
package com.todoroo.astrid.adapter
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import butterknife.BindView
|
||||||
|
import butterknife.ButterKnife
|
||||||
|
import butterknife.OnClick
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.data.CaldavDao
|
||||||
|
import org.tasks.data.GoogleTaskDao
|
||||||
|
import org.tasks.filters.NavigationDrawerSubheader
|
||||||
|
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import org.tasks.preferences.SyncPreferences
|
||||||
|
import org.tasks.themes.DrawableUtil
|
||||||
|
|
||||||
|
internal class SubheaderViewHolder(
|
||||||
|
itemView: View,
|
||||||
|
activity: Activity,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val caldavDao: CaldavDao,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager)
|
||||||
|
: RecyclerView.ViewHolder(itemView) {
|
||||||
|
|
||||||
|
@BindView(R.id.text)
|
||||||
|
lateinit var text: TextView
|
||||||
|
|
||||||
|
@BindView(R.id.icon_error)
|
||||||
|
lateinit var errorIcon: ImageView
|
||||||
|
|
||||||
|
private lateinit var subheader: NavigationDrawerSubheader
|
||||||
|
|
||||||
|
@OnClick(R.id.subheader_row)
|
||||||
|
fun onClick() {
|
||||||
|
val collapsed = !subheader.isCollapsed
|
||||||
|
when (subheader.subheaderType) {
|
||||||
|
SubheaderType.PREFERENCE -> preferences.setBoolean(subheader.id.toInt(), collapsed)
|
||||||
|
SubheaderType.GOOGLE_TASKS -> googleTaskDao.setCollapsed(subheader.id, collapsed)
|
||||||
|
SubheaderType.CALDAV -> caldavDao.setCollapsed(subheader.id, collapsed)
|
||||||
|
}
|
||||||
|
localBroadcastManager.broadcastRefreshList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bind(subheader: NavigationDrawerSubheader) {
|
||||||
|
this.subheader = subheader
|
||||||
|
text.text = subheader.listingTitle
|
||||||
|
errorIcon.visibility = if (subheader.error) View.VISIBLE else View.GONE
|
||||||
|
DrawableUtil.setRightDrawable(
|
||||||
|
itemView.context,
|
||||||
|
text,
|
||||||
|
if (subheader.isCollapsed) R.drawable.ic_keyboard_arrow_up_black_18dp else R.drawable.ic_keyboard_arrow_down_black_18dp)
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
ButterKnife.bind(this, itemView)
|
||||||
|
errorIcon.setOnClickListener {
|
||||||
|
activity.startActivity(Intent(activity, SyncPreferences::class.java))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,114 +0,0 @@
|
|||||||
package com.todoroo.astrid.adapter;
|
|
||||||
|
|
||||||
import static org.tasks.Strings.isNullOrEmpty;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import com.todoroo.astrid.api.CaldavFilter;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.api.GtasksFilter;
|
|
||||||
import com.todoroo.astrid.api.TagFilter;
|
|
||||||
import com.todoroo.astrid.core.BuiltInFilterExposer;
|
|
||||||
import com.todoroo.astrid.dao.TaskDao;
|
|
||||||
import com.todoroo.astrid.data.Task;
|
|
||||||
import com.todoroo.astrid.subtasks.SubtasksFilterUpdater;
|
|
||||||
import com.todoroo.astrid.subtasks.SubtasksHelper;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.data.CaldavDao;
|
|
||||||
import org.tasks.data.GoogleTaskDao;
|
|
||||||
import org.tasks.data.TagData;
|
|
||||||
import org.tasks.data.TaskListMetadata;
|
|
||||||
import org.tasks.data.TaskListMetadataDao;
|
|
||||||
import org.tasks.injection.ForApplication;
|
|
||||||
import org.tasks.preferences.Preferences;
|
|
||||||
|
|
||||||
public class TaskAdapterProvider {
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private final Preferences preferences;
|
|
||||||
private final TaskListMetadataDao taskListMetadataDao;
|
|
||||||
private final TaskDao taskDao;
|
|
||||||
private final GoogleTaskDao googleTaskDao;
|
|
||||||
private final CaldavDao caldavDao;
|
|
||||||
private final SubtasksHelper subtasksHelper;
|
|
||||||
private final LocalBroadcastManager localBroadcastManager;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public TaskAdapterProvider(
|
|
||||||
@ForApplication Context context,
|
|
||||||
Preferences preferences,
|
|
||||||
TaskListMetadataDao taskListMetadataDao,
|
|
||||||
TaskDao taskDao,
|
|
||||||
GoogleTaskDao googleTaskDao,
|
|
||||||
CaldavDao caldavDao,
|
|
||||||
SubtasksHelper subtasksHelper,
|
|
||||||
LocalBroadcastManager localBroadcastManager) {
|
|
||||||
this.context = context;
|
|
||||||
this.preferences = preferences;
|
|
||||||
this.taskListMetadataDao = taskListMetadataDao;
|
|
||||||
this.taskDao = taskDao;
|
|
||||||
this.googleTaskDao = googleTaskDao;
|
|
||||||
this.caldavDao = caldavDao;
|
|
||||||
this.subtasksHelper = subtasksHelper;
|
|
||||||
this.localBroadcastManager = localBroadcastManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaskAdapter createTaskAdapter(Filter filter) {
|
|
||||||
if (preferences.isManualSort()) {
|
|
||||||
if (filter instanceof TagFilter) {
|
|
||||||
return createManualTagTaskAdapter((TagFilter) filter);
|
|
||||||
} else if (filter instanceof GtasksFilter) {
|
|
||||||
return new GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager);
|
|
||||||
} else if (filter instanceof CaldavFilter) {
|
|
||||||
return new CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager);
|
|
||||||
} else if (subtasksHelper.shouldUseSubtasksFragmentForFilter(filter)) {
|
|
||||||
return createManualFilterTaskAdapter(filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new TaskAdapter(preferences.addTasksToTop(), googleTaskDao, caldavDao, taskDao, localBroadcastManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
private TaskAdapter createManualTagTaskAdapter(TagFilter filter) {
|
|
||||||
TagData tagData = filter.getTagData();
|
|
||||||
String tdId = tagData.getRemoteId();
|
|
||||||
TaskListMetadata list = taskListMetadataDao.fetchByTagOrFilter(tagData.getRemoteId());
|
|
||||||
if (list == null && !Task.isUuidEmpty(tdId)) {
|
|
||||||
list = new TaskListMetadata();
|
|
||||||
list.setTagUuid(tdId);
|
|
||||||
taskListMetadataDao.createNew(list);
|
|
||||||
}
|
|
||||||
SubtasksFilterUpdater updater = new SubtasksFilterUpdater(taskListMetadataDao, taskDao);
|
|
||||||
updater.initialize(list, filter);
|
|
||||||
return new AstridTaskAdapter(list, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
private TaskAdapter createManualFilterTaskAdapter(Filter filter) {
|
|
||||||
String filterId = null;
|
|
||||||
String prefId = null;
|
|
||||||
if (BuiltInFilterExposer.isInbox(context, filter)) {
|
|
||||||
filterId = TaskListMetadata.FILTER_ID_ALL;
|
|
||||||
prefId = SubtasksFilterUpdater.ACTIVE_TASKS_ORDER;
|
|
||||||
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {
|
|
||||||
filterId = TaskListMetadata.FILTER_ID_TODAY;
|
|
||||||
prefId = SubtasksFilterUpdater.TODAY_TASKS_ORDER;
|
|
||||||
}
|
|
||||||
if (isNullOrEmpty(filterId)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
TaskListMetadata list = taskListMetadataDao.fetchByTagOrFilter(filterId);
|
|
||||||
if (list == null) {
|
|
||||||
String defaultOrder = preferences.getStringValue(prefId);
|
|
||||||
if (isNullOrEmpty(defaultOrder)) {
|
|
||||||
defaultOrder = "[]"; // $NON-NLS-1$
|
|
||||||
}
|
|
||||||
defaultOrder = SubtasksHelper.convertTreeToRemoteIds(taskDao, defaultOrder);
|
|
||||||
list = new TaskListMetadata();
|
|
||||||
list.setFilter(filterId);
|
|
||||||
list.setTaskIds(defaultOrder);
|
|
||||||
taskListMetadataDao.createNew(list);
|
|
||||||
}
|
|
||||||
SubtasksFilterUpdater updater = new SubtasksFilterUpdater(taskListMetadataDao, taskDao);
|
|
||||||
updater.initialize(list, filter);
|
|
||||||
return new AstridTaskAdapter(list, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,92 @@
|
|||||||
|
package com.todoroo.astrid.adapter
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.todoroo.astrid.api.CaldavFilter
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.api.GtasksFilter
|
||||||
|
import com.todoroo.astrid.api.TagFilter
|
||||||
|
import com.todoroo.astrid.core.BuiltInFilterExposer
|
||||||
|
import com.todoroo.astrid.dao.TaskDao
|
||||||
|
import com.todoroo.astrid.data.Task.Companion.isUuidEmpty
|
||||||
|
import com.todoroo.astrid.subtasks.SubtasksFilterUpdater
|
||||||
|
import com.todoroo.astrid.subtasks.SubtasksHelper
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.Strings.isNullOrEmpty
|
||||||
|
import org.tasks.data.CaldavDao
|
||||||
|
import org.tasks.data.GoogleTaskDao
|
||||||
|
import org.tasks.data.TaskListMetadata
|
||||||
|
import org.tasks.data.TaskListMetadataDao
|
||||||
|
import org.tasks.injection.ForApplication
|
||||||
|
import org.tasks.preferences.Preferences
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class TaskAdapterProvider @Inject constructor(
|
||||||
|
@param:ForApplication private val context: Context,
|
||||||
|
private val preferences: Preferences,
|
||||||
|
private val taskListMetadataDao: TaskListMetadataDao,
|
||||||
|
private val taskDao: TaskDao,
|
||||||
|
private val googleTaskDao: GoogleTaskDao,
|
||||||
|
private val caldavDao: CaldavDao,
|
||||||
|
private val subtasksHelper: SubtasksHelper,
|
||||||
|
private val localBroadcastManager: LocalBroadcastManager) {
|
||||||
|
fun createTaskAdapter(filter: Filter): TaskAdapter {
|
||||||
|
if (preferences.isManualSort) {
|
||||||
|
when {
|
||||||
|
filter is TagFilter -> return createManualTagTaskAdapter(filter)
|
||||||
|
filter is GtasksFilter -> return GoogleTaskManualSortAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager)
|
||||||
|
filter is CaldavFilter -> return CaldavManualSortTaskAdapter(googleTaskDao, caldavDao, taskDao, localBroadcastManager)
|
||||||
|
subtasksHelper.shouldUseSubtasksFragmentForFilter(filter) -> {
|
||||||
|
val adapter = createManualFilterTaskAdapter(filter)
|
||||||
|
if (adapter != null) {
|
||||||
|
return adapter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TaskAdapter(preferences.addTasksToTop(), googleTaskDao, caldavDao, taskDao, localBroadcastManager)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createManualTagTaskAdapter(filter: TagFilter): TaskAdapter {
|
||||||
|
val tagData = filter.tagData
|
||||||
|
val tdId = tagData.remoteId
|
||||||
|
var list = taskListMetadataDao.fetchByTagOrFilter(tagData.remoteId!!)
|
||||||
|
if (list == null && !isUuidEmpty(tdId)) {
|
||||||
|
list = TaskListMetadata()
|
||||||
|
list.tagUuid = tdId
|
||||||
|
taskListMetadataDao.createNew(list)
|
||||||
|
}
|
||||||
|
val updater = SubtasksFilterUpdater(taskListMetadataDao, taskDao)
|
||||||
|
updater.initialize(list, filter)
|
||||||
|
return AstridTaskAdapter(list!!, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createManualFilterTaskAdapter(filter: Filter): TaskAdapter? {
|
||||||
|
var filterId: String? = null
|
||||||
|
var prefId: String? = null
|
||||||
|
if (BuiltInFilterExposer.isInbox(context, filter)) {
|
||||||
|
filterId = TaskListMetadata.FILTER_ID_ALL
|
||||||
|
prefId = SubtasksFilterUpdater.ACTIVE_TASKS_ORDER
|
||||||
|
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {
|
||||||
|
filterId = TaskListMetadata.FILTER_ID_TODAY
|
||||||
|
prefId = SubtasksFilterUpdater.TODAY_TASKS_ORDER
|
||||||
|
}
|
||||||
|
if (filterId.isNullOrBlank()) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
var list = taskListMetadataDao.fetchByTagOrFilter(filterId)
|
||||||
|
if (list == null) {
|
||||||
|
var defaultOrder = preferences.getStringValue(prefId)
|
||||||
|
if (isNullOrEmpty(defaultOrder)) {
|
||||||
|
defaultOrder = "[]" // $NON-NLS-1$
|
||||||
|
}
|
||||||
|
defaultOrder = SubtasksHelper.convertTreeToRemoteIds(taskDao, defaultOrder)
|
||||||
|
list = TaskListMetadata()
|
||||||
|
list.filter = filterId
|
||||||
|
list.taskIds = defaultOrder
|
||||||
|
taskListMetadataDao.createNew(list)
|
||||||
|
}
|
||||||
|
val updater = SubtasksFilterUpdater(taskListMetadataDao, taskDao)
|
||||||
|
updater.initialize(list, filter)
|
||||||
|
return AstridTaskAdapter(list, filter, updater, googleTaskDao, caldavDao, taskDao, localBroadcastManager)
|
||||||
|
}
|
||||||
|
}
|
@ -1,241 +0,0 @@
|
|||||||
package org.tasks.ui;
|
|
||||||
|
|
||||||
import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread;
|
|
||||||
import static org.tasks.LocalBroadcastManager.REFRESH;
|
|
||||||
import static org.tasks.LocalBroadcastManager.REFRESH_LIST;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.drawerlayout.widget.DrawerLayout;
|
|
||||||
import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import com.todoroo.astrid.adapter.NavigationDrawerAdapter;
|
|
||||||
import com.todoroo.astrid.api.Filter;
|
|
||||||
import com.todoroo.astrid.api.FilterListItem;
|
|
||||||
import com.todoroo.astrid.dao.TaskDao;
|
|
||||||
import io.reactivex.Single;
|
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
|
||||||
import io.reactivex.disposables.CompositeDisposable;
|
|
||||||
import io.reactivex.disposables.Disposable;
|
|
||||||
import io.reactivex.schedulers.Schedulers;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.tasks.LocalBroadcastManager;
|
|
||||||
import org.tasks.R;
|
|
||||||
import org.tasks.billing.PurchaseActivity;
|
|
||||||
import org.tasks.dialogs.NewFilterDialog;
|
|
||||||
import org.tasks.filters.FilterProvider;
|
|
||||||
import org.tasks.filters.NavigationDrawerAction;
|
|
||||||
import org.tasks.injection.FragmentComponent;
|
|
||||||
import org.tasks.injection.InjectingFragment;
|
|
||||||
import org.tasks.intents.TaskIntents;
|
|
||||||
|
|
||||||
public class NavigationDrawerFragment extends InjectingFragment {
|
|
||||||
|
|
||||||
public static final int FRAGMENT_NAVIGATION_DRAWER = R.id.navigation_drawer;
|
|
||||||
public static final int REQUEST_NEW_LIST = 10100;
|
|
||||||
public static final int REQUEST_SETTINGS = 10101;
|
|
||||||
public static final int REQUEST_PURCHASE = 10102;
|
|
||||||
public static final int REQUEST_DONATE = 10103;
|
|
||||||
public static final int REQUEST_NEW_PLACE = 10104;
|
|
||||||
public static final int REQUEST_NEW_FILTER = 101015;
|
|
||||||
private static final String FRAG_TAG_NEW_FILTER = "frag_tag_new_filter";
|
|
||||||
|
|
||||||
private final RefreshReceiver refreshReceiver = new RefreshReceiver();
|
|
||||||
@Inject LocalBroadcastManager localBroadcastManager;
|
|
||||||
@Inject NavigationDrawerAdapter adapter;
|
|
||||||
@Inject FilterProvider filterProvider;
|
|
||||||
@Inject TaskDao taskDao;
|
|
||||||
/** A pointer to the current callbacks instance (the Activity). */
|
|
||||||
private DrawerLayout mDrawerLayout;
|
|
||||||
|
|
||||||
private RecyclerView recyclerView;
|
|
||||||
private View mFragmentContainerView;
|
|
||||||
private CompositeDisposable disposables;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
if (savedInstanceState != null) {
|
|
||||||
adapter.restore(savedInstanceState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
|
|
||||||
getActivity().setDefaultKeyMode(Activity.DEFAULT_KEYS_SEARCH_LOCAL);
|
|
||||||
|
|
||||||
setUpList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(
|
|
||||||
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
||||||
View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
|
|
||||||
recyclerView = layout.findViewById(R.id.recycler_view);
|
|
||||||
((ScrimInsetsFrameLayout) layout.findViewById(R.id.scrim_layout))
|
|
||||||
.setOnInsetsCallback(insets -> recyclerView.setPadding(0, insets.top, 0, 0));
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpList() {
|
|
||||||
adapter.setOnClick(this::onFilterItemSelected);
|
|
||||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
|
||||||
recyclerView.setAdapter(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onFilterItemSelected(@Nullable FilterListItem item) {
|
|
||||||
mDrawerLayout.addDrawerListener(
|
|
||||||
new SimpleDrawerListener() {
|
|
||||||
@Override
|
|
||||||
public void onDrawerClosed(View drawerView) {
|
|
||||||
mDrawerLayout.removeDrawerListener(this);
|
|
||||||
if (item instanceof Filter) {
|
|
||||||
FragmentActivity activity = getActivity();
|
|
||||||
if (activity != null) {
|
|
||||||
activity.startActivity(TaskIntents.getTaskListIntent(activity, (Filter) item));
|
|
||||||
}
|
|
||||||
} else if (item instanceof NavigationDrawerAction) {
|
|
||||||
NavigationDrawerAction action = (NavigationDrawerAction) item;
|
|
||||||
if (action.requestCode == REQUEST_PURCHASE) {
|
|
||||||
startActivity(new Intent(getContext(), PurchaseActivity.class));
|
|
||||||
} else if (action.requestCode == REQUEST_DONATE) {
|
|
||||||
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://tasks.org/donate")));
|
|
||||||
} else if (action.requestCode == REQUEST_NEW_FILTER) {
|
|
||||||
NewFilterDialog.Companion.newFilterDialog()
|
|
||||||
.show(getParentFragmentManager(), FRAG_TAG_NEW_FILTER);
|
|
||||||
} else {
|
|
||||||
getActivity().startActivityForResult(action.intent, action.requestCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (item instanceof Filter) {
|
|
||||||
new ViewModelProvider(getActivity()).get(TaskListViewModel.class).setFilter((Filter) item);
|
|
||||||
}
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDrawerOpen() {
|
|
||||||
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Users of this fragment must call this method to set up the navigation drawer interactions.
|
|
||||||
*
|
|
||||||
* @param drawerLayout The DrawerLayout containing this fragment's UI.
|
|
||||||
*/
|
|
||||||
public void setUp(DrawerLayout drawerLayout) {
|
|
||||||
mFragmentContainerView = getActivity().findViewById(FRAGMENT_NAVIGATION_DRAWER);
|
|
||||||
mDrawerLayout = drawerLayout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelected(Filter selected) {
|
|
||||||
adapter.setSelected(selected);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
|
|
||||||
localBroadcastManager.unregisterReceiver(refreshReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart() {
|
|
||||||
super.onStart();
|
|
||||||
|
|
||||||
disposables = new CompositeDisposable();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop() {
|
|
||||||
super.onStop();
|
|
||||||
|
|
||||||
disposables.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void inject(FragmentComponent component) {
|
|
||||||
component.inject(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
|
|
||||||
adapter.save(outState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void closeDrawer() {
|
|
||||||
if (mDrawerLayout != null) {
|
|
||||||
mDrawerLayout.setDrawerListener(null);
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void close() {
|
|
||||||
mDrawerLayout.closeDrawer(mFragmentContainerView);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void openDrawer() {
|
|
||||||
if (mDrawerLayout != null) {
|
|
||||||
mDrawerLayout.openDrawer(mFragmentContainerView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
localBroadcastManager.registerRefreshListReceiver(refreshReceiver);
|
|
||||||
|
|
||||||
disposables.add(updateFilters());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Disposable updateFilters() {
|
|
||||||
return Single.fromCallable(() -> filterProvider.getItems(true))
|
|
||||||
.map(this::refreshFilterCount)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(adapter::submitList);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<FilterListItem> refreshFilterCount(List<FilterListItem> items) {
|
|
||||||
assertNotMainThread();
|
|
||||||
|
|
||||||
for (FilterListItem item : items) {
|
|
||||||
if (item instanceof Filter && item.count == -1) {
|
|
||||||
item.count = taskDao.count((Filter) item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class RefreshReceiver extends BroadcastReceiver {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
if (intent == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String action = intent.getAction();
|
|
||||||
if (REFRESH.equals(action) || REFRESH_LIST.equals(action)) {
|
|
||||||
disposables.add(updateFilters());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,193 @@
|
|||||||
|
package org.tasks.ui
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Rect
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.drawerlayout.widget.DrawerLayout
|
||||||
|
import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.todoroo.andlib.utility.AndroidUtilities
|
||||||
|
import com.todoroo.astrid.adapter.NavigationDrawerAdapter
|
||||||
|
import com.todoroo.astrid.api.Filter
|
||||||
|
import com.todoroo.astrid.api.FilterListItem
|
||||||
|
import com.todoroo.astrid.dao.TaskDao
|
||||||
|
import io.reactivex.Single
|
||||||
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import org.tasks.LocalBroadcastManager
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.billing.PurchaseActivity
|
||||||
|
import org.tasks.dialogs.NewFilterDialog.Companion.newFilterDialog
|
||||||
|
import org.tasks.filters.FilterProvider
|
||||||
|
import org.tasks.filters.NavigationDrawerAction
|
||||||
|
import org.tasks.injection.FragmentComponent
|
||||||
|
import org.tasks.injection.InjectingFragment
|
||||||
|
import org.tasks.intents.TaskIntents
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class NavigationDrawerFragment : InjectingFragment() {
|
||||||
|
private val refreshReceiver = RefreshReceiver()
|
||||||
|
|
||||||
|
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
|
||||||
|
@Inject lateinit var adapter: NavigationDrawerAdapter
|
||||||
|
@Inject lateinit var filterProvider: FilterProvider
|
||||||
|
@Inject lateinit var taskDao: TaskDao
|
||||||
|
|
||||||
|
private lateinit var recyclerView: RecyclerView
|
||||||
|
private lateinit var mDrawerLayout: DrawerLayout
|
||||||
|
private var disposables: CompositeDisposable? = null
|
||||||
|
private var mFragmentContainerView: View? = null
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
adapter.restore(savedInstanceState)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
|
super.onActivityCreated(savedInstanceState)
|
||||||
|
requireActivity().setDefaultKeyMode(Activity.DEFAULT_KEYS_SEARCH_LOCAL)
|
||||||
|
setUpList()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
val layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false)
|
||||||
|
recyclerView = layout.findViewById(R.id.recycler_view)
|
||||||
|
(layout.findViewById<View>(R.id.scrim_layout) as ScrimInsetsFrameLayout)
|
||||||
|
.setOnInsetsCallback { insets: Rect -> recyclerView.setPadding(0, insets.top, 0, 0) }
|
||||||
|
return layout
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setUpList() {
|
||||||
|
adapter.setOnClick { item: FilterListItem? -> onFilterItemSelected(item) }
|
||||||
|
recyclerView.layoutManager = LinearLayoutManager(context)
|
||||||
|
recyclerView.adapter = adapter
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onFilterItemSelected(item: FilterListItem?) {
|
||||||
|
mDrawerLayout.addDrawerListener(
|
||||||
|
object : SimpleDrawerListener() {
|
||||||
|
override fun onDrawerClosed(drawerView: View) {
|
||||||
|
mDrawerLayout.removeDrawerListener(this)
|
||||||
|
if (item is Filter) {
|
||||||
|
activity?.startActivity(TaskIntents.getTaskListIntent(activity, item))
|
||||||
|
} else if (item is NavigationDrawerAction) {
|
||||||
|
when (item.requestCode) {
|
||||||
|
REQUEST_PURCHASE -> startActivity(Intent(context, PurchaseActivity::class.java))
|
||||||
|
REQUEST_DONATE -> startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://tasks.org/donate")))
|
||||||
|
REQUEST_NEW_FILTER -> newFilterDialog().show(parentFragmentManager, FRAG_TAG_NEW_FILTER)
|
||||||
|
else -> activity?.startActivityForResult(item.intent, item.requestCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (item is Filter) {
|
||||||
|
ViewModelProvider(requireActivity()).get(TaskListViewModel::class.java).setFilter((item as Filter?)!!)
|
||||||
|
}
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
val isDrawerOpen: Boolean
|
||||||
|
get() = mDrawerLayout.isDrawerOpen(mFragmentContainerView!!)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Users of this fragment must call this method to set up the navigation drawer interactions.
|
||||||
|
*
|
||||||
|
* @param drawerLayout The DrawerLayout containing this fragment's UI.
|
||||||
|
*/
|
||||||
|
fun setUp(drawerLayout: DrawerLayout) {
|
||||||
|
mFragmentContainerView = requireActivity().findViewById(FRAGMENT_NAVIGATION_DRAWER)
|
||||||
|
mDrawerLayout = drawerLayout
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setSelected(selected: Filter?) = adapter.setSelected(selected)
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
localBroadcastManager.unregisterReceiver(refreshReceiver)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
super.onStart()
|
||||||
|
disposables = CompositeDisposable()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
disposables?.dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun inject(component: FragmentComponent) = component.inject(this)
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
super.onSaveInstanceState(outState)
|
||||||
|
adapter.save(outState)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun closeDrawer() {
|
||||||
|
mDrawerLayout.setDrawerListener(null)
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun close() = mDrawerLayout.closeDrawer(mFragmentContainerView!!)
|
||||||
|
|
||||||
|
fun openDrawer() = mDrawerLayout.openDrawer(mFragmentContainerView!!)
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
localBroadcastManager.registerRefreshListReceiver(refreshReceiver)
|
||||||
|
disposables?.add(updateFilters())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateFilters() =
|
||||||
|
Single.fromCallable { filterProvider.getItems(true) }
|
||||||
|
.map { items: List<FilterListItem> -> refreshFilterCount(items) }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(adapter::submitList)
|
||||||
|
|
||||||
|
private fun refreshFilterCount(items: List<FilterListItem>): List<FilterListItem> {
|
||||||
|
AndroidUtilities.assertNotMainThread()
|
||||||
|
for (item in items) {
|
||||||
|
if (item is Filter && item.count == -1) {
|
||||||
|
item.count = taskDao.count(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return items
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class RefreshReceiver : BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context, intent: Intent?) {
|
||||||
|
if (intent == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val action = intent.action
|
||||||
|
if (LocalBroadcastManager.REFRESH == action || LocalBroadcastManager.REFRESH_LIST == action) {
|
||||||
|
disposables?.add(updateFilters())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val FRAGMENT_NAVIGATION_DRAWER = R.id.navigation_drawer
|
||||||
|
const val REQUEST_NEW_LIST = 10100
|
||||||
|
const val REQUEST_SETTINGS = 10101
|
||||||
|
const val REQUEST_PURCHASE = 10102
|
||||||
|
const val REQUEST_DONATE = 10103
|
||||||
|
const val REQUEST_NEW_PLACE = 10104
|
||||||
|
const val REQUEST_NEW_FILTER = 101015
|
||||||
|
private const val FRAG_TAG_NEW_FILTER = "frag_tag_new_filter"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue