From c6cce3a745d43977b7fdd8676961a7b97018f1fc Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 3 Dec 2019 13:48:20 -0600 Subject: [PATCH] Change location of chips * All chips in group * Chips on left side --- .../tasklist/TaskListRecyclerAdapter.java | 5 +- .../java/org/tasks/tasklist/ViewHolder.java | 87 ++++--------------- .../org/tasks/tasklist/ViewHolderFactory.java | 5 -- .../main/java/org/tasks/ui/ChipProvider.java | 59 +++++++++---- app/src/main/res/layout/chip_button.xml | 11 +++ .../main/res/layout/task_adapter_row_body.xml | 44 +--------- 6 files changed, 73 insertions(+), 138 deletions(-) create mode 100644 app/src/main/res/layout/chip_button.xml diff --git a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index da8849490..ab9336054 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -91,10 +91,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter public void onBindViewHolder(@NonNull ViewHolder holder, int position) { TaskContainer task = getItem(position); if (task != null) { - holder.bindView(task, isRemoteList); - if (!adapter.supportsManualSorting()) { - holder.setupSubtasksChip(); - } + holder.bindView(task, isRemoteList, adapter.supportsManualSorting()); holder.setMoving(false); int indent = adapter.getIndent(task); task.setIndent(indent); diff --git a/app/src/main/java/org/tasks/tasklist/ViewHolder.java b/app/src/main/java/org/tasks/tasklist/ViewHolder.java index fe036c2db..f49c17bde 100644 --- a/app/src/main/java/org/tasks/tasklist/ViewHolder.java +++ b/app/src/main/java/org/tasks/tasklist/ViewHolder.java @@ -1,7 +1,5 @@ package org.tasks.tasklist; -import static com.google.common.collect.Lists.newArrayList; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastKitKat; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static com.todoroo.andlib.utility.DateUtilities.getAbbreviatedRelativeDateWithTime; @@ -24,7 +22,6 @@ import butterknife.OnClick; import butterknife.OnLongClick; import com.google.android.material.chip.Chip; import com.google.android.material.chip.ChipGroup; -import com.google.common.collect.Lists; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.service.TaskCompleter; import com.todoroo.astrid.ui.CheckableImageView; @@ -33,7 +30,6 @@ import org.tasks.R; import org.tasks.data.Location; import org.tasks.data.TaskContainer; import org.tasks.dialogs.Linkify; -import org.tasks.locale.Locale; import org.tasks.preferences.Preferences; import org.tasks.ui.CheckBoxes; import org.tasks.ui.ChipProvider; @@ -72,28 +68,20 @@ public class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.completeBox) CheckableImageView completeBox; - @BindView(R.id.location_chip) - Chip locationChip; - @BindView(R.id.chip_group) ChipGroup chipGroup; @BindView(R.id.hidden_status) ImageView hidden; - @BindView(R.id.subtasks_chip) - Chip subtasksChip; - private int indent; private boolean selected; private boolean moving; - private boolean isRemoteList; private int minIndent; private int maxIndent; ViewHolder( Activity context, - Locale locale, ViewGroup view, Preferences preferences, int fontSize, @@ -145,14 +133,6 @@ public class ViewHolder extends RecyclerView.ViewHolder { int fontSizeDetails = Math.max(10, fontSize - 2); dueDate.setTextSize(fontSizeDetails); - if (atLeastJellybeanMR1()) { - chipGroup.setLayoutDirection( - locale.isRtl() ? View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL); - } else { - MarginLayoutParams lp = (MarginLayoutParams) chipGroup.getLayoutParams(); - lp.setMargins(lp.rightMargin, lp.topMargin, lp.leftMargin, lp.bottomMargin); - } - view.setTag(this); for (int i = 0; i < view.getChildCount(); i++) { view.getChildAt(i).setTag(this); @@ -203,9 +183,8 @@ public class ViewHolder extends RecyclerView.ViewHolder { return Math.round(indent * getShiftSize()); } - void bindView(TaskContainer task, boolean isRemoteList) { + void bindView(TaskContainer task, boolean isRemoteList, boolean hideSubtasks) { this.task = task; - this.isRemoteList = isRemoteList; this.indent = task.indent; nameView.setText(task.getTitle()); @@ -213,8 +192,7 @@ public class ViewHolder extends RecyclerView.ViewHolder { setupTitleAndCheckbox(); setupDueDate(); if (preferences.getBoolean(R.string.p_show_list_indicators, true)) { - setupLocation(); - setupTags(); + setupChips(isRemoteList, hideSubtasks); } if (preferences.getBoolean(R.string.p_show_description, true)) { description.setText(task.getNotes()); @@ -230,22 +208,6 @@ public class ViewHolder extends RecyclerView.ViewHolder { } } - void setupSubtasksChip() { - if (task.hasChildren()) { - subtasksChip.setVisibility(View.VISIBLE); - subtasksChip.setText( - context - .getResources() - .getQuantityString(R.plurals.subtask_count, task.children, task.children)); - subtasksChip.setChipIconResource( - task.isCollapsed() - ? R.drawable.ic_keyboard_arrow_up_black_24dp - : R.drawable.ic_keyboard_arrow_down_black_24dp); - } else { - subtasksChip.setVisibility(View.GONE); - } - } - private void setupTitleAndCheckbox() { if (task.isCompleted()) { nameView.setEnabled(false); @@ -275,48 +237,33 @@ public class ViewHolder extends RecyclerView.ViewHolder { } } - private void setupLocation() { - if (task.hasLocation()) { - locationChip.setText(task.getLocation().getDisplayName()); - locationChip.setTag(task.getLocation()); - locationChip.setOnClickListener(v -> { - Location location = (Location) v.getTag(); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(location.getGeoUri())); - context.startActivity(intent); - }); - locationChip.setVisibility(View.VISIBLE); - } else { - locationChip.setVisibility(View.GONE); - } - } - - private void setupTags() { - String tags = task.getTagsString(); - List tagUuids = tags != null ? newArrayList(tags.split(",")) : Lists.newArrayList(); - boolean hideListChip = isRemoteList || indent > 0; + private void setupChips(boolean isRemoteList, boolean hideSubtaskChip) { List chips = - chipProvider.getChips( - context, - hideListChip ? null : task.getCaldav(), - hideListChip ? null : task.getGoogleTaskList(), - tagUuids); + chipProvider.getChips(context, isRemoteList || indent > 0, hideSubtaskChip, task); if (chips.isEmpty()) { chipGroup.setVisibility(View.GONE); } else { chipGroup.removeAllViews(); for (Chip chip : chips) { - chip.setOnClickListener(view -> callback.onClick((Filter) view.getTag())); + chip.setOnClickListener(this::onChipClick); chipGroup.addView(chip); } chipGroup.setVisibility(View.VISIBLE); } } - @OnClick(R.id.subtasks_chip) - void toggleSubtasks() { - callback.toggleSubtasks(task, !task.isCollapsed()); - setupSubtasksChip(); + private void onChipClick(View v) { + Object tag = v.getTag(); + if (tag instanceof Filter) { + callback.onClick((Filter) tag); + } else if (tag instanceof Location) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(((Location) tag).getGeoUri())); + context.startActivity(intent); + } else if (tag instanceof TaskContainer) { + TaskContainer task = (TaskContainer) tag; + callback.toggleSubtasks(task, !task.isCollapsed()); + } } @OnClick(R.id.rowBody) diff --git a/app/src/main/java/org/tasks/tasklist/ViewHolderFactory.java b/app/src/main/java/org/tasks/tasklist/ViewHolderFactory.java index 062d569c9..b4cf1e29e 100644 --- a/app/src/main/java/org/tasks/tasklist/ViewHolderFactory.java +++ b/app/src/main/java/org/tasks/tasklist/ViewHolderFactory.java @@ -15,7 +15,6 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.dialogs.Linkify; import org.tasks.injection.ForActivity; -import org.tasks.locale.Locale; import org.tasks.preferences.Preferences; import org.tasks.ui.ChipProvider; @@ -24,7 +23,6 @@ public class ViewHolderFactory { private final int textColorSecondary; private final int textColorOverdue; private final Context context; - private final Locale locale; private final ChipProvider chipProvider; private final int fontSize; private final TaskCompleter taskCompleter; @@ -38,13 +36,11 @@ public class ViewHolderFactory { @Inject public ViewHolderFactory( @ForActivity Context context, - Locale locale, Preferences preferences, ChipProvider chipProvider, TaskCompleter taskCompleter, Linkify linkify) { this.context = context; - this.locale = locale; this.chipProvider = chipProvider; this.taskCompleter = taskCompleter; this.preferences = preferences; @@ -61,7 +57,6 @@ public class ViewHolderFactory { ViewHolder newViewHolder(ViewGroup parent, ViewHolder.ViewHolderCallbacks callbacks) { return new ViewHolder( (Activity) context, - locale, (ViewGroup) LayoutInflater.from(context).inflate(R.layout.task_adapter_row_simple, parent, false), preferences, diff --git a/app/src/main/java/org/tasks/ui/ChipProvider.java b/app/src/main/java/org/tasks/ui/ChipProvider.java index 5ce0e5ff5..f11c06045 100644 --- a/app/src/main/java/org/tasks/ui/ChipProvider.java +++ b/app/src/main/java/org/tasks/ui/ChipProvider.java @@ -1,7 +1,7 @@ package org.tasks.ui; -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Lists.transform; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import android.app.Activity; @@ -10,7 +10,6 @@ import android.content.res.ColorStateList; import androidx.annotation.LayoutRes; import androidx.core.content.res.ResourcesCompat; import com.google.android.material.chip.Chip; -import com.google.common.base.Predicates; import com.google.common.base.Strings; import com.google.common.collect.Ordering; import com.todoroo.astrid.api.CaldavFilter; @@ -31,6 +30,7 @@ import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; import org.tasks.data.TagData; import org.tasks.data.TagDataDao; +import org.tasks.data.TaskContainer; import org.tasks.injection.ApplicationScope; import org.tasks.injection.ForApplication; import org.tasks.themes.ThemeCache; @@ -99,25 +99,43 @@ public class ChipProvider { } public List getChips( - Activity activity, String caldav, String googleTask, Iterable tagUuids) { + Activity activity, boolean hideListChips, boolean hideSubtaskChip, TaskContainer task) { assertMainThread(); List chips = new ArrayList<>(); - if (!Strings.isNullOrEmpty(googleTask)) { - GtasksFilter googleTaskFilter = googleTaskLists.get(googleTask); - if (googleTaskFilter != null) { - chips.add(newTagChip(activity, googleTaskFilter)); - } - } else if (!Strings.isNullOrEmpty(caldav)) { - CaldavFilter caldavFilter = caldavCalendars.get(caldav); - if (caldavFilter != null) { - chips.add(newTagChip(activity, caldavFilter)); + if (!hideSubtaskChip && task.hasChildren()) { + chips.add( + newIconChip( + activity, + 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), + task)); + } + if (task.hasLocation()) { + chips.add( + newIconChip( + activity, + R.drawable.ic_outline_place_24px, + task.getLocation().getDisplayName(), + task.getLocation())); + } + if (!hideListChips) { + if (!Strings.isNullOrEmpty(task.getGoogleTaskList())) { + chips.add(newTagChip(activity, googleTaskLists.get(task.getGoogleTaskList()))); + } else if (!Strings.isNullOrEmpty(task.getCaldav())) { + chips.add(newTagChip(activity, caldavCalendars.get(task.getCaldav()))); } } - Iterable tagFilters = - filter(transform(tagUuids, tagDatas::get), Predicates.notNull()); - for (TagFilter tagFilter : orderByName.sortedCopy(tagFilters)) { - chips.add(newTagChip(activity, tagFilter)); + String tags = task.getTagsString(); + if (!Strings.isNullOrEmpty(tags)) { + chips.addAll( + transform( + orderByName.sortedCopy(transform(newArrayList(tags.split(",")), tagDatas::get)), + tag -> newTagChip(activity, tag))); } return chips; @@ -131,6 +149,13 @@ public class ChipProvider { apply(chip, tagData.getName(), tagData.getColor()); } + private Chip newIconChip(Activity activity, int icon, String text, Object tag) { + Chip chip = newChip(activity, R.layout.chip_button, tag); + chip.setChipIconResource(icon); + chip.setText(text); + return chip; + } + private Chip newTagChip(Activity activity, Filter filter) { Chip chip = newChip(activity, R.layout.chip_tag, filter); apply(chip, filter.listingTitle, filter.tint); diff --git a/app/src/main/res/layout/chip_button.xml b/app/src/main/res/layout/chip_button.xml new file mode 100644 index 000000000..4628fc5cc --- /dev/null +++ b/app/src/main/res/layout/chip_button.xml @@ -0,0 +1,11 @@ + + diff --git a/app/src/main/res/layout/task_adapter_row_body.xml b/app/src/main/res/layout/task_adapter_row_body.xml index 762890899..b3de491eb 100644 --- a/app/src/main/res/layout/task_adapter_row_body.xml +++ b/app/src/main/res/layout/task_adapter_row_body.xml @@ -92,57 +92,17 @@ android:textSize="@dimen/task_edit_text_size" android:visibility="gone"/> - - - - + app:chipSpacingHorizontal="@dimen/chip_spacing" + app:chipSpacingVertical="@dimen/chip_spacing"/> \ No newline at end of file