Change location of chips

* All chips in group
* Chips on left side
gtask_related_email
Alex Baker 6 years ago
parent b7c90d021d
commit c6cce3a745

@ -91,10 +91,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
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);

@ -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<String> tagUuids = tags != null ? newArrayList(tags.split(",")) : Lists.newArrayList();
boolean hideListChip = isRemoteList || indent > 0;
private void setupChips(boolean isRemoteList, boolean hideSubtaskChip) {
List<Chip> 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() {
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());
setupSubtasksChip();
}
}
@OnClick(R.id.rowBody)

@ -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,

@ -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<Chip> getChips(
Activity activity, String caldav, String googleTask, Iterable<String> tagUuids) {
Activity activity, boolean hideListChips, boolean hideSubtaskChip, TaskContainer task) {
assertMainThread();
List<Chip> 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));
}
}
Iterable<TagFilter> tagFilters =
filter(transform(tagUuids, tagDatas::get), Predicates.notNull());
for (TagFilter tagFilter : orderByName.sortedCopy(tagFilters)) {
chips.add(newTagChip(activity, tagFilter));
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())));
}
}
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);

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/ChipStyle"
android:textColor="?android:textColorSecondary"
app:chipBackgroundColor="?android:attr/colorBackground"
app:chipIconTint="@color/icon_tint"
app:chipStrokeColor="?android:textColorSecondary"
app:chipStrokeWidth="@dimen/chip_stroke"
app:iconEndPadding="0dp"
app:iconStartPadding="@dimen/chip_text_padding" />

@ -92,57 +92,17 @@
android:textSize="@dimen/task_edit_text_size"
android:visibility="gone"/>
<com.google.android.material.chip.Chip
android:id="@+id/location_chip"
style="@style/ChipStyle"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:layout_marginStart="@dimen/keyline_content_inset"
android:layout_marginEnd="@dimen/keyline_first"
android:layout_marginLeft="@dimen/keyline_content_inset"
android:layout_marginRight="@dimen/keyline_first"
android:layout_gravity="center_vertical|end"
android:textColor="?android:textColorSecondary"
android:visibility="gone"
app:chipBackgroundColor="?android:attr/colorBackground"
app:chipIcon="@drawable/ic_outline_place_24px"
app:chipIconTint="@color/icon_tint"
app:chipStrokeColor="?android:textColorSecondary"
app:chipStrokeWidth="@dimen/chip_stroke"
app:iconEndPadding="0dp"
app:iconStartPadding="@dimen/chip_text_padding"
/>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:layout_marginStart="@dimen/keyline_first"
android:layout_marginEnd="@dimen/keyline_content_inset"
android:layout_marginLeft="@dimen/keyline_first"
android:layout_marginRight="@dimen/keyline_content_inset"
android:layout_gravity="end"
android:visibility="gone"
app:chipSpacingHorizontal="@dimen/chip_spacing"
app:chipSpacingVertical="@dimen/chip_spacing"/>
<com.google.android.material.chip.Chip
android:id="@+id/subtasks_chip"
style="@style/ChipStyle"
android:layout_marginTop="@dimen/task_list_item_spacing"
android:layout_marginStart="@dimen/keyline_content_inset"
android:layout_marginEnd="@dimen/keyline_first"
android:layout_marginLeft="@dimen/keyline_content_inset"
android:layout_marginRight="@dimen/keyline_first"
android:layout_gravity="center_vertical|end"
android:textColor="?android:textColorSecondary"
android:visibility="gone"
app:chipBackgroundColor="?android:attr/colorBackground"
app:chipIcon="@drawable/ic_outline_place_24px"
app:chipIconTint="@color/icon_tint"
app:chipStrokeColor="?android:textColorSecondary"
app:chipStrokeWidth="@dimen/chip_stroke"
app:iconEndPadding="0dp"
app:iconStartPadding="@dimen/chip_text_padding"/>
app:chipSpacingHorizontal="@dimen/chip_spacing"
app:chipSpacingVertical="@dimen/chip_spacing"/>
</LinearLayout>
Loading…
Cancel
Save