Compact subtask chip, fix edit screen chip theme

pull/935/head
Alex Baker 6 years ago
parent bfdf23d1f4
commit b139941f90

@ -147,7 +147,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
if (tagData == null) { if (tagData == null) {
continue; continue;
} }
Chip chip = chipProvider.newClosableChip(getActivity(), tagData); Chip chip = chipProvider.newClosableChip(tagData);
chipProvider.apply(chip, tagData); chipProvider.apply(chip, tagData);
chip.setOnClickListener(view -> onClickRow()); chip.setOnClickListener(view -> onClickRow());
chip.setOnCloseIconClickListener( chip.setOnCloseIconClickListener(

@ -3,7 +3,6 @@ package org.tasks.tasklist;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Paint; import android.graphics.Paint;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
@ -15,19 +14,19 @@ import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.OnClick; import butterknife.OnClick;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.ui.CheckableImageView; import com.todoroo.astrid.ui.CheckableImageView;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.TaskContainer; import org.tasks.data.TaskContainer;
import org.tasks.locale.Locale;
import org.tasks.ui.CheckBoxProvider; import org.tasks.ui.CheckBoxProvider;
import org.tasks.ui.ChipProvider;
public class SubtaskViewHolder extends RecyclerView.ViewHolder { public class SubtaskViewHolder extends RecyclerView.ViewHolder {
private final Activity context;
private final Locale locale;
private final Callbacks callbacks; private final Callbacks callbacks;
private final DisplayMetrics metrics; private final DisplayMetrics metrics;
private final ChipProvider chipProvider;
private final CheckBoxProvider checkBoxProvider; private final CheckBoxProvider checkBoxProvider;
public TaskContainer task; public TaskContainer task;
@ -41,23 +40,21 @@ public class SubtaskViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.completeBox) @BindView(R.id.completeBox)
CheckableImageView completeBox; CheckableImageView completeBox;
@BindView(R.id.chip_button) @BindView(R.id.chip_group)
Chip chip; ChipGroup chipGroup;
private int indent; private int indent;
SubtaskViewHolder( SubtaskViewHolder(
Activity context,
Locale locale,
ViewGroup view, ViewGroup view,
Callbacks callbacks, Callbacks callbacks,
DisplayMetrics metrics, DisplayMetrics metrics,
ChipProvider chipProvider,
CheckBoxProvider checkBoxProvider) { CheckBoxProvider checkBoxProvider) {
super(view); super(view);
this.context = context;
this.locale = locale;
this.callbacks = callbacks; this.callbacks = callbacks;
this.metrics = metrics; this.metrics = metrics;
this.chipProvider = chipProvider;
this.checkBoxProvider = checkBoxProvider; this.checkBoxProvider = checkBoxProvider;
ButterKnife.bind(this, view); ButterKnife.bind(this, view);
@ -79,14 +76,13 @@ public class SubtaskViewHolder extends RecyclerView.ViewHolder {
this.task = task; this.task = task;
setIndent(task.indent); setIndent(task.indent);
if (task.hasChildren()) { if (task.hasChildren()) {
chip.setText(locale.formatNumber(task.children)); chipGroup.removeAllViews();
chip.setVisibility(View.VISIBLE); Chip child = chipProvider.newSubtaskChip(task, true);
chip.setChipIconResource( child.setOnClickListener(v -> callbacks.toggleSubtask(task.getId(), !task.isCollapsed()));
task.isCollapsed() chipGroup.addView(child);
? R.drawable.ic_keyboard_arrow_up_black_24dp chipGroup.setVisibility(View.VISIBLE);
: R.drawable.ic_keyboard_arrow_down_black_24dp);
} else { } else {
chip.setVisibility(View.GONE); chipGroup.setVisibility(View.GONE);
} }
nameView.setText(task.getTitle()); nameView.setText(task.getTitle());
@ -112,11 +108,6 @@ public class SubtaskViewHolder extends RecyclerView.ViewHolder {
callbacks.openSubtask(task.getTask()); callbacks.openSubtask(task.getTask());
} }
@OnClick(R.id.chip_button)
void toggleSubtasks(View v) {
callbacks.toggleSubtask(task.getId(), !task.isCollapsed());
}
@OnClick(R.id.completeBox) @OnClick(R.id.completeBox)
void onCompleteBoxClick(View v) { void onCompleteBoxClick(View v) {
if (task == null) { if (task == null) {

@ -13,16 +13,16 @@ import androidx.recyclerview.widget.RecyclerView;
import java.util.List; import java.util.List;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.TaskContainer; import org.tasks.data.TaskContainer;
import org.tasks.locale.Locale;
import org.tasks.tasklist.SubtaskViewHolder.Callbacks; import org.tasks.tasklist.SubtaskViewHolder.Callbacks;
import org.tasks.ui.CheckBoxProvider; import org.tasks.ui.CheckBoxProvider;
import org.tasks.ui.ChipProvider;
public class SubtasksRecyclerAdapter extends RecyclerView.Adapter<SubtaskViewHolder> public class SubtasksRecyclerAdapter extends RecyclerView.Adapter<SubtaskViewHolder>
implements ListUpdateCallback { implements ListUpdateCallback {
private final DisplayMetrics metrics; private final DisplayMetrics metrics;
private final Activity activity; private final Activity activity;
private final Locale locale; private final ChipProvider chipProvider;
private final CheckBoxProvider checkBoxProvider; private final CheckBoxProvider checkBoxProvider;
private final Callbacks callbacks; private final Callbacks callbacks;
private final AsyncListDiffer<TaskContainer> differ; private final AsyncListDiffer<TaskContainer> differ;
@ -30,11 +30,11 @@ public class SubtasksRecyclerAdapter extends RecyclerView.Adapter<SubtaskViewHol
public SubtasksRecyclerAdapter( public SubtasksRecyclerAdapter(
Activity activity, Activity activity,
Locale locale, ChipProvider chipProvider,
CheckBoxProvider checkBoxProvider, CheckBoxProvider checkBoxProvider,
SubtaskViewHolder.Callbacks callbacks) { SubtaskViewHolder.Callbacks callbacks) {
this.activity = activity; this.activity = activity;
this.locale = locale; this.chipProvider = chipProvider;
this.checkBoxProvider = checkBoxProvider; this.checkBoxProvider = checkBoxProvider;
this.callbacks = callbacks; this.callbacks = callbacks;
differ = differ =
@ -49,7 +49,7 @@ public class SubtasksRecyclerAdapter extends RecyclerView.Adapter<SubtaskViewHol
ViewGroup view = ViewGroup view =
(ViewGroup) (ViewGroup)
LayoutInflater.from(activity).inflate(R.layout.subtask_adapter_row_body, parent, false); LayoutInflater.from(activity).inflate(R.layout.subtask_adapter_row_body, parent, false);
return new SubtaskViewHolder(activity, locale, view, callbacks, metrics, checkBoxProvider); return new SubtaskViewHolder(view, callbacks, metrics, chipProvider, checkBoxProvider);
} }
@Override @Override

@ -263,13 +263,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
} }
private void setupChips(Filter filter, boolean hideSubtaskChip) { private void setupChips(Filter filter, boolean hideSubtaskChip) {
List<Chip> chips = List<Chip> chips = chipProvider.getChips(filter, indent > 0, hideSubtaskChip, task);
chipProvider.getChips(
context,
filter,
indent > 0,
hideSubtaskChip,
task);
if (chips.isEmpty()) { if (chips.isEmpty()) {
chipGroup.setVisibility(View.GONE); chipGroup.setVisibility(View.GONE);
} else { } else {

@ -7,7 +7,6 @@ import static com.google.common.collect.Sets.newHashSet;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -29,7 +28,7 @@ import org.tasks.R;
import org.tasks.billing.Inventory; import org.tasks.billing.Inventory;
import org.tasks.data.TagData; import org.tasks.data.TagData;
import org.tasks.data.TaskContainer; import org.tasks.data.TaskContainer;
import org.tasks.injection.ForActivity; import org.tasks.locale.Locale;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ColorProvider; import org.tasks.themes.ColorProvider;
import org.tasks.themes.CustomIcons; import org.tasks.themes.CustomIcons;
@ -37,10 +36,12 @@ import org.tasks.themes.ThemeColor;
public class ChipProvider { public class ChipProvider {
private final Activity activity;
private final Inventory inventory; private final Inventory inventory;
private final int iconAlpha; private final int iconAlpha;
private final ChipListCache lists; private final ChipListCache lists;
private final ColorProvider colorProvider; private final ColorProvider colorProvider;
private final Locale locale;
private final Ordering<TagFilter> orderByName = private final Ordering<TagFilter> orderByName =
new Ordering<TagFilter>() { new Ordering<TagFilter>() {
@Override @Override
@ -54,16 +55,19 @@ public class ChipProvider {
@Inject @Inject
public ChipProvider( public ChipProvider(
@ForActivity Context context, Activity activity,
Inventory inventory, Inventory inventory,
ChipListCache lists, ChipListCache lists,
Preferences preferences, Preferences preferences,
ColorProvider colorProvider) { ColorProvider colorProvider,
Locale locale) {
this.activity = activity;
this.inventory = inventory; this.inventory = inventory;
iconAlpha = iconAlpha =
(int) (255 * ResourcesCompat.getFloat(context.getResources(), R.dimen.alpha_secondary)); (int) (255 * ResourcesCompat.getFloat(activity.getResources(), R.dimen.alpha_secondary));
this.lists = lists; this.lists = lists;
this.colorProvider = colorProvider; this.colorProvider = colorProvider;
this.locale = locale;
setStyle(preferences.getIntegerFromString(R.string.p_chip_style, 0)); setStyle(preferences.getIntegerFromString(R.string.p_chip_style, 0));
setAppearance(preferences.getIntegerFromString(R.string.p_chip_appearance, 0)); setAppearance(preferences.getIntegerFromString(R.string.p_chip_appearance, 0));
@ -78,8 +82,25 @@ public class ChipProvider {
showIcon = appearance != 1; showIcon = appearance != 1;
} }
public Chip newSubtaskChip(TaskContainer task, boolean compact) {
Chip chip = newChip(task);
apply(
chip,
task.isCollapsed()
? R.drawable.ic_keyboard_arrow_up_black_24dp
: R.drawable.ic_keyboard_arrow_down_black_24dp,
compact
? locale.formatNumber(task.children)
: activity
.getResources()
.getQuantityString(R.plurals.subtask_count, task.children, task.children),
0,
true,
true);
return chip;
}
public List<Chip> getChips( public List<Chip> getChips(
Activity activity,
Filter filter, Filter filter,
boolean isSubtask, boolean isSubtask,
boolean hideSubtaskChip, boolean hideSubtaskChip,
@ -88,22 +109,10 @@ public class ChipProvider {
List<Chip> chips = new ArrayList<>(); List<Chip> chips = new ArrayList<>();
if (!hideSubtaskChip && task.hasChildren()) { if (!hideSubtaskChip && task.hasChildren()) {
Chip chip = newChip(activity, task); chips.add(newSubtaskChip(task, !showText));
apply(
chip,
task.isCollapsed()
? R.drawable.ic_keyboard_arrow_up_black_24dp
: R.drawable.ic_keyboard_arrow_down_black_24dp,
activity
.getResources()
.getQuantityString(R.plurals.subtask_count, task.children, task.children),
0,
true,
true);
chips.add(chip);
} }
if (task.hasLocation()) { if (task.hasLocation()) {
Chip chip = newChip(activity, task.getLocation()); Chip chip = newChip(task.getLocation());
apply(chip, R.drawable.ic_outline_place_24px, task.getLocation().getDisplayName(), 0, showText, showIcon); apply(chip, R.drawable.ic_outline_place_24px, task.getLocation().getDisplayName(), 0, showText, showIcon);
chips.add(chip); chips.add(chip);
} }
@ -111,13 +120,11 @@ public class ChipProvider {
if (!Strings.isNullOrEmpty(task.getGoogleTaskList()) && !(filter instanceof GtasksFilter)) { if (!Strings.isNullOrEmpty(task.getGoogleTaskList()) && !(filter instanceof GtasksFilter)) {
chips.add( chips.add(
newChip( newChip(
activity,
lists.getGoogleTaskList(task.getGoogleTaskList()), lists.getGoogleTaskList(task.getGoogleTaskList()),
R.drawable.ic_outline_cloud_24px)); R.drawable.ic_outline_cloud_24px));
} else if (!Strings.isNullOrEmpty(task.getCaldav()) && !(filter instanceof CaldavFilter)) { } else if (!Strings.isNullOrEmpty(task.getCaldav()) && !(filter instanceof CaldavFilter)) {
chips.add( chips.add(
newChip( newChip(lists.getCaldavList(task.getCaldav()), R.drawable.ic_outline_cloud_24px));
activity, lists.getCaldavList(task.getCaldav()), R.drawable.ic_outline_cloud_24px));
} }
} }
String tagString = task.getTagsString(); String tagString = task.getTagsString();
@ -129,7 +136,7 @@ public class ChipProvider {
chips.addAll( chips.addAll(
transform( transform(
orderByName.sortedCopy(filter(transform(tags, lists::getTag), Predicates.notNull())), orderByName.sortedCopy(filter(transform(tags, lists::getTag), Predicates.notNull())),
tag -> newChip(activity, tag, R.drawable.ic_outline_label_24px))); tag -> newChip(tag, R.drawable.ic_outline_label_24px)));
} }
removeIf(chips, Predicates.isNull()); removeIf(chips, Predicates.isNull());
@ -156,33 +163,33 @@ public class ChipProvider {
true); true);
} }
private @Nullable Chip newChip(Activity activity, Filter filter, int defIcon) { private @Nullable Chip newChip(Filter filter, int defIcon) {
return newChip(activity, filter, defIcon, showText, showIcon); return newChip(filter, defIcon, showText, showIcon);
} }
Chip newChip(Activity activity, Filter filter, int defIcon, boolean showText, boolean showIcon) { Chip newChip(Filter filter, int defIcon, boolean showText, boolean showIcon) {
if (filter == null) { if (filter == null) {
return null; return null;
} }
Chip chip = newChip(activity, filter); Chip chip = newChip(filter);
apply(chip, getIcon(filter.icon, defIcon), filter.listingTitle, filter.tint, showText, showIcon); apply(chip, getIcon(filter.icon, defIcon), filter.listingTitle, filter.tint, showText, showIcon);
return chip; return chip;
} }
public Chip newClosableChip(Activity activity, Object tag) { public Chip newClosableChip(Object tag) {
Chip chip = getChip(activity); Chip chip = getChip();
chip.setCloseIconVisible(true); chip.setCloseIconVisible(true);
chip.setTag(tag); chip.setTag(tag);
return chip; return chip;
} }
private Chip newChip(Activity activity, Object tag) { private Chip newChip(@Nullable Object tag) {
Chip chip = getChip(activity); Chip chip = getChip();
chip.setTag(tag); chip.setTag(tag);
return chip; return chip;
} }
private Chip getChip(Activity activity) { private Chip getChip() {
return (Chip) return (Chip)
activity activity
.getLayoutInflater() .getLayoutInflater()

@ -219,7 +219,7 @@ public class RemoteListFragment extends TaskEditControlFragment {
chipGroup.setVisibility(View.VISIBLE); chipGroup.setVisibility(View.VISIBLE);
chipGroup.removeAllViews(); chipGroup.removeAllViews();
Chip chip = Chip chip =
chipProvider.newChip(getActivity(), selectedList, R.drawable.ic_outline_cloud_24px, true, true); chipProvider.newChip(selectedList, R.drawable.ic_outline_cloud_24px, true, true);
chip.setCloseIconVisible(true); chip.setCloseIconVisible(true);
chip.setOnClickListener(v -> openPicker()); chip.setOnClickListener(v -> openPicker());
chip.setOnCloseIconClickListener(v -> setSelected(null)); chip.setOnCloseIconClickListener(v -> setSelected(null));

@ -73,6 +73,7 @@ public class SubtaskControlSet extends TaskEditControlFragment implements Callba
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
@Inject Locale locale; @Inject Locale locale;
@Inject CheckBoxProvider checkBoxProvider; @Inject CheckBoxProvider checkBoxProvider;
@Inject ChipProvider chipProvider;
private TaskListViewModel viewModel; private TaskListViewModel viewModel;
private final RefreshReceiver refreshReceiver = new RefreshReceiver(); private final RefreshReceiver refreshReceiver = new RefreshReceiver();
@ -106,7 +107,7 @@ public class SubtaskControlSet extends TaskEditControlFragment implements Callba
} }
} }
recyclerAdapter = new SubtasksRecyclerAdapter(activity, locale, checkBoxProvider, this); recyclerAdapter = new SubtasksRecyclerAdapter(activity, chipProvider, checkBoxProvider, this);
if (task.getId() > 0) { if (task.getId() > 0) {
recyclerAdapter.submitList(viewModel.getValue()); recyclerAdapter.submitList(viewModel.getValue());
viewModel.setFilter(new Filter("subtasks", getQueryTemplate(task)), true); viewModel.setFilter(new Filter("subtasks", getQueryTemplate(task)), true);

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rowBody" android:id="@+id/rowBody"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -17,21 +16,19 @@
android:paddingEnd="@dimen/keyline_first" android:paddingEnd="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" /> android:paddingRight="@dimen/keyline_first" />
<com.google.android.material.chip.Chip <com.google.android.material.chip.ChipGroup
android:id="@+id/chip_button" android:id="@+id/chip_group"
style="@style/ChipStyle" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true" />
android:textColor="?android:textColorSecondary"
app:chipIconTint="@color/icon_tint"
app:chipStrokeColor="?android:textColorSecondary"/>
<TextView <TextView
android:id="@+id/title" android:id="@+id/title"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toStartOf="@id/chip_button" android:layout_toStartOf="@id/chip_group"
android:layout_toLeftOf="@id/chip_button" android:layout_toLeftOf="@id/chip_group"
android:layout_toEndOf="@id/completeBox" android:layout_toEndOf="@id/completeBox"
android:layout_toRightOf="@id/completeBox" android:layout_toRightOf="@id/completeBox"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"

Loading…
Cancel
Save