Use filter adapter in google task list picker

pull/645/head
Alex Baker 6 years ago
parent 0ca7a89711
commit 12c906dc47

@ -4,15 +4,13 @@ import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.adapter.FilterAdapter;
import org.tasks.data.GoogleTaskList;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.GoogleTaskListSelectionHandler;
import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeCache;
import javax.inject.Inject;
@ -33,9 +31,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment {
public static final String EXTRA_SELECTED = "extra_selected";
@Inject DialogBuilder dialogBuilder;
@Inject GtasksListService gtasksListService;
@Inject ThemeCache themeCache;
@Inject ThemeAccent themeAccent;
@Inject FilterAdapter filterAdapter;
private GoogleTaskListSelectionHandler handler;
@ -43,8 +39,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
GoogleTaskList selected = arguments.getParcelable(EXTRA_SELECTED);
return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService,
selected, themeAccent, list -> handler.selectedList(list));
return createDialog(filterAdapter, dialogBuilder, selected, list -> handler.selectedList(list));
}
@Override

@ -2,29 +2,22 @@ package org.tasks.activities;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.GtasksFilter;
import org.tasks.R;
import org.tasks.data.GoogleTaskList;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.GoogleTaskListSelectionHandler;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeCache;
import org.tasks.ui.SingleCheckedArrayAdapter;
import java.util.List;
import javax.inject.Inject;
import static com.google.common.collect.Lists.transform;
public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
public static SupportGoogleTaskListPicker newSupportGoogleTaskListPicker(GoogleTaskList selected) {
@ -40,9 +33,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
private static final String EXTRA_SELECTED = "extra_selected";
@Inject DialogBuilder dialogBuilder;
@Inject GtasksListService gtasksListService;
@Inject ThemeCache themeCache;
@Inject ThemeAccent themeAccent;
@Inject FilterAdapter filterAdapter;
private GoogleTaskListSelectionHandler handler;
@ -51,8 +42,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
GoogleTaskList selected = arguments == null ? null : arguments.getParcelable(EXTRA_SELECTED);
return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService,
selected, themeAccent, list -> handler.selectedList(list));
return createDialog(filterAdapter, dialogBuilder, selected, list -> handler.selectedList(list));
}
@Override
@ -62,33 +52,16 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
handler = (GoogleTaskListSelectionHandler) activity;
}
public static AlertDialog createDialog(Context context, ThemeCache themeCache,
DialogBuilder dialogBuilder, GtasksListService gtasksListService,
GoogleTaskList selected, ThemeAccent themeAccent,
final GoogleTaskListSelectionHandler handler) {
final List<GoogleTaskList> lists = gtasksListService.getLists();
List<String> listNames = transform(lists, GoogleTaskList::getTitle);
SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, listNames, themeAccent) {
@Override
protected int getDrawable(int position) {
return R.drawable.ic_cloud_black_24dp;
}
@Override
protected int getDrawableColor(int position) {
GoogleTaskList list = lists.get(position);
int color = list.getColor();
return color >= 0
? themeCache.getThemeColor(color).getPrimaryColor()
: super.getDrawableColor(position);
}
};
int selectedIndex = selected == null ? -1 : listNames.indexOf(selected.getTitle());
public static AlertDialog createDialog(FilterAdapter filterAdapter, DialogBuilder dialogBuilder,
GoogleTaskList selected, GoogleTaskListSelectionHandler handler) {
filterAdapter.populateRemoteListPicker();
int selectedIndex = filterAdapter.indexOf(new GtasksFilter(selected));
return dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, selectedIndex, (dialog, which) -> {
handler.selectedList(lists.get(which));
.setSingleChoiceItems(filterAdapter, selectedIndex, (dialog, which) -> {
FilterListItem item = filterAdapter.getItem(which);
if (item instanceof GtasksFilter) {
handler.selectedList(((GtasksFilter) item).getList());
}
dialog.dismiss();
})
.show();

@ -274,7 +274,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
public void restart() {
Intent intent = getIntent();
intent.putExtra(TaskListActivity.OPEN_FILTER, getCurrentFilter());
intent.putExtra(TaskListActivity.OPEN_FILTER, filter);
finish();
startActivity(intent);
}
@ -476,11 +476,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@Override
public void sortChanged() {
localBroadcastManager.broadcastRefresh();
onFilterItemClicked(getCurrentFilter());
}
public Filter getCurrentFilter() {
return filter;
onFilterItemClicked(filter);
}
@Override

@ -0,0 +1,41 @@
package com.todoroo.astrid.adapter;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.RelativeLayout;
public class CheckableRelativeLayout extends RelativeLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
private boolean checked = false;
public CheckableRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean b) {
if (b != checked) {
checked = b;
refreshDrawableState();
}
}
public void toggle() {
setChecked(!checked);
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
}

@ -9,15 +9,20 @@ import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.TextView;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.core.CustomFilterActivity;
@ -37,11 +42,13 @@ import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache;
import org.tasks.ui.NavigationDrawerFragment;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import static android.support.v4.content.ContextCompat.getColor;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
public class FilterAdapter extends ArrayAdapter<FilterListItem> {
@ -54,12 +61,15 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
private final FilterProvider filterProvider;
private final FilterCounter filterCounter;
private final Activity activity;
private final Theme theme;
private final Locale locale;
private final FilterListUpdateReceiver filterListUpdateReceiver = new FilterListUpdateReceiver();
private final List<FilterListItem> items = new ArrayList<>();
private boolean navigationDrawer;
private boolean remoteListPicker;
private Filter selected;
/** layout inflater */
private final LayoutInflater inflater;
private final ThemeCache themeCache;
@ -70,6 +80,7 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
this.filterProvider = filterProvider;
this.filterCounter = filterCounter;
this.activity = activity;
this.theme = theme;
this.locale = locale;
this.inflater = theme.getLayoutInflater(activity);
this.themeCache = themeCache;
@ -91,7 +102,9 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
@Override
public void add(FilterListItem item) {
super.add(item);
// load sizes
items.add(item);
if (navigationDrawer && item instanceof Filter) {
filterCounter.registerFilter((Filter) item);
}
@ -118,6 +131,15 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
viewHolder.name = convertView.findViewById(R.id.name);
viewHolder.icon = convertView.findViewById(R.id.icon);
viewHolder.size = convertView.findViewById(R.id.size);
if (preLollipop()) {
ColorStateList tintList = new ColorStateList(new int[][]{
new int[]{-android.R.attr.state_checked}, new int[]{android.R.attr.state_checked}},
new int[]{ResourcesCompat.getColor(activity.getResources(), android.R.color.transparent, null), theme.getThemeAccent().getAccentColor()});
Drawable original = ContextCompat.getDrawable(activity, R.drawable.ic_check_black_24dp);
Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTintList(wrapped, tintList);
viewHolder.name.setCheckMarkDrawable(wrapped);
}
break;
case SEPARATOR:
convertView = inflater.inflate(R.layout.filter_adapter_separator, parent, false);
@ -133,9 +155,21 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
return convertView;
}
public void setSelected(Filter selected) {
this.selected = selected;
}
public Filter getSelected() {
return selected;
}
public int indexOf(FilterListItem item) {
return items.indexOf(item);
}
public static class ViewHolder {
public FilterListItem item;
public TextView name;
public CheckedTextView name;
public ImageView icon;
public TextView size;
public View view;
@ -152,14 +186,6 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
switch(item.getItemType()) {
case ITEM:
populateItem(viewHolder);
if (activity instanceof TaskListActivity) {
Filter selected = ((TaskListActivity) activity).getCurrentFilter();
if (selected != null && selected.equals(viewHolder.item)) {
convertView.setBackgroundColor(getColor(activity, R.color.drawer_color_selected));
}
}
break;
case SUBHEADER:
populateHeader(viewHolder);
@ -214,6 +240,24 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
}
}
@Override
public void clear() {
super.clear();
items.clear();
}
public void populateRemoteListPicker() {
clear();
remoteListPicker = true;
for (Filter filter : filterProvider.getGoogleTaskFilters()) {
add(filter);
}
notifyDataSetChanged();
}
public void populateList() {
clear();
@ -282,7 +326,12 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
return;
}
viewHolder.view.setBackgroundResource(0);
if (!remoteListPicker && selected != null && selected.equals(filter)) {
viewHolder.view.setBackgroundColor(getColor(activity, R.color.drawer_color_selected));
} else {
viewHolder.view.setBackgroundResource(0);
}
viewHolder.icon.setImageResource(filter.icon);
viewHolder.icon.setColorFilter(filter.tint >= 0
? themeCache.getThemeColor(filter.tint).getPrimaryColor()
@ -298,7 +347,7 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
countInt = filterCounter.get(filter);
viewHolder.size.setText(locale.formatNumber(countInt));
}
viewHolder.size.setVisibility(countInt > 0 ? View.VISIBLE : View.INVISIBLE);
viewHolder.size.setVisibility(countInt > 0 ? View.VISIBLE : View.GONE);
}
private void populateHeader(ViewHolder viewHolder) {

@ -21,7 +21,7 @@ public class GtasksFilter extends Filter {
private static final int CLOUD = R.drawable.ic_cloud_black_24dp;
private long storeId;
private GoogleTaskList list;
private GtasksFilter() {
super();
@ -29,7 +29,7 @@ public class GtasksFilter extends Filter {
public GtasksFilter(GoogleTaskList list) {
super(list.getTitle(), getQueryTemplate(list), getValuesForNewTasks(list));
storeId = list.getId();
this.list = list;
tint = list.getColor();
icon = CLOUD;
}
@ -43,7 +43,7 @@ public class GtasksFilter extends Filter {
}
public long getStoreId() {
return storeId;
return list.getId();
}
private static QueryTemplate getQueryTemplate(GoogleTaskList list) {
@ -71,13 +71,13 @@ public class GtasksFilter extends Filter {
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeLong(storeId);
dest.writeParcelable(list, 0);
}
@Override
protected void readFromParcel(Parcel source) {
super.readFromParcel(source);
storeId = source.readLong();
list = source.readParcelable(getClass().getClassLoader());
}
/**
@ -103,4 +103,8 @@ public class GtasksFilter extends Filter {
return new GtasksFilter[size];
}
};
public GoogleTaskList getList() {
return list;
}
}

@ -52,8 +52,6 @@ public class NavigationDrawerFragment extends InjectingFragment {
private ListView mDrawerListView;
private View mFragmentContainerView;
private Filter selected = null;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject FilterAdapter adapter;
@ -62,7 +60,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
selected = savedInstanceState.getParcelable(TOKEN_LAST_SELECTED);
adapter.setSelected(savedInstanceState.getParcelable(TOKEN_LAST_SELECTED));
}
}
@ -141,7 +139,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
}
public void setSelected(Filter selected) {
this.selected = selected;
adapter.setSelected(selected);
}
@Override
@ -161,8 +159,8 @@ public class NavigationDrawerFragment extends InjectingFragment {
private void selectItem(int position) {
FilterListItem item = adapter.getItem(position);
if (item instanceof Filter) {
if (!item.equals(selected)) {
selected = (Filter) item;
if (!item.equals(adapter.getSelected())) {
adapter.setSelected((Filter) item);
if (mCallbacks != null) {
mCallbacks.onFilterItemClicked(item);
}
@ -197,7 +195,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(TOKEN_LAST_SELECTED, selected);
outState.putParcelable(TOKEN_LAST_SELECTED, adapter.getSelected());
}
public void closeDrawer() {

@ -1,10 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<com.todoroo.astrid.adapter.CheckableRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="12dp"
android:paddingTop="12dp">
android:paddingTop="12dp"
android:paddingLeft="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first"
android:paddingRight="0dp"
android:paddingEnd="0dp">
<TextView
android:id="@+id/size"
@ -13,13 +17,13 @@
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingLeft="0dp"
android:paddingStart="0dp"
android:paddingRight="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:gravity="end"
android:fontFamily="@string/font_fontFamily_medium"
android:minEms="3"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first"
android:textColor="?android:attr/textColorSecondary"
tools:ignore="UnusedAttribute" />
@ -31,14 +35,10 @@
android:layout_alignParentStart="true"
android:layout_gravity="center_vertical"
android:alpha="?attr/alpha_secondary"
android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_second"
android:paddingStart="@dimen/keyline_first"
android:scaleType="center"
android:tint="?attr/icon_tint" />
<TextView
<CheckedTextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@ -47,10 +47,17 @@
android:layout_toLeftOf="@id/size"
android:layout_toRightOf="@id/icon"
android:layout_toStartOf="@id/size"
android:paddingLeft="@dimen/keyline_second"
android:paddingStart="@dimen/keyline_second"
android:paddingRight="@dimen/keyline_first"
android:paddingEnd="@dimen/keyline_first"
android:gravity="start"
android:duplicateParentState="true"
android:textAlignment="viewStart"
android:checked="false"
android:ellipsize="end"
android:checkMark="@drawable/checkmark"
android:checkMarkTint="?colorAccent"
android:fontFamily="@string/font_fontFamily_medium"
android:lines="1"
android:singleLine="true"
@ -58,4 +65,4 @@
android:textSize="14sp"
tools:ignore="UnusedAttribute" />
</RelativeLayout>
</com.todoroo.astrid.adapter.CheckableRelativeLayout>

@ -11,7 +11,7 @@
style="@style/horizontal_divider"
android:layout_gravity="top" />
<TextView
<CheckedTextView
android:paddingRight="0dp"
android:paddingEnd="0dp"
android:paddingLeft="@dimen/keyline_first"
@ -26,6 +26,7 @@
android:textAlignment="viewStart"
android:fontFamily="@string/font_fontFamily_medium"
android:alpha="0.54"
android:clickable="false"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
tools:ignore="UnusedAttribute" />

Loading…
Cancel
Save