diff options
author | Stefan Niedermann <info@niedermann.it> | 2024-01-18 15:30:06 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2024-01-18 15:30:06 +0300 |
commit | eea21c772af0b525674837ff3aa3d1e6ec9d380b (patch) | |
tree | 641142c8920e5dc8ba3ef06ecd8518be47d53e2f /app/src/main/java/it/niedermann/nextcloud/deck/ui | |
parent | 55abed7577387ba3b2167238882e81b80ce4cba5 (diff) |
feat(done): Allow filtering for (un)done cards
Refs: #1556 https://github.com/nextcloud/deck/issues/5406
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui')
4 files changed, 157 insertions, 0 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java index 8eac0dbb4..65c7f824e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java @@ -19,6 +19,7 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.DialogFilterBinding; +import it.niedermann.nextcloud.deck.model.enums.EDoneType; import it.niedermann.nextcloud.deck.model.enums.EDueType; import it.niedermann.nextcloud.deck.ui.theme.ThemeUtils; import it.niedermann.nextcloud.deck.ui.theme.ThemedDialogFragment; @@ -32,6 +33,7 @@ public class FilterDialogFragment extends ThemedDialogFragment { private final static int[] tabTitles = new int[]{ R.string.filter_tags_title, R.string.filter_user_title, + R.string.filter_done_title, R.string.filter_duedate_title }; @@ -63,6 +65,9 @@ public class FilterDialogFragment extends ThemedDialogFragment { tab.setIcon(draft.getUsers().size() > 0 || draft.isNoAssignedUser() ? indicator : null); break; case 2: + tab.setIcon(draft.getDoneType() != EDoneType.NO_FILTER ? indicator : null); + break; + case 3: tab.setIcon(draft.getDueType() != EDueType.NO_FILTER ? indicator : null); break; default: @@ -124,6 +129,8 @@ public class FilterDialogFragment extends ThemedDialogFragment { case 1: return new FilterUserFragment(); case 2: + return new FilterDoneTypeFragment(); + case 3: return new FilterDueTypeFragment(); default: throw new IllegalArgumentException("position must be between 0 and 2 but was " + position); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeAdapter.java new file mode 100644 index 000000000..d194f78ab --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeAdapter.java @@ -0,0 +1,96 @@ +package it.niedermann.nextcloud.deck.ui.filter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.Arrays; + +import it.niedermann.nextcloud.deck.databinding.ItemFilterDonetypeBinding; +import it.niedermann.nextcloud.deck.model.enums.EDoneType; +import it.niedermann.nextcloud.deck.ui.theme.ThemeUtils; +import it.niedermann.nextcloud.deck.ui.theme.Themed; + +public class FilterDoneTypeAdapter extends RecyclerView.Adapter<FilterDoneTypeAdapter.DoneTypeViewHolder> { + @NonNull + private final EDoneType[] doneTypes = EDoneType.values(); + private int selectedDoneTypePosition; + @Nullable + private final SelectionListener<EDoneType> selectionListener; + @ColorInt + private final int color; + + @SuppressWarnings("WeakerAccess") + public FilterDoneTypeAdapter(@NonNull EDoneType selectedDoneType, @Nullable SelectionListener<EDoneType> selectionListener, @ColorInt int color) { + super(); + this.selectedDoneTypePosition = Arrays.binarySearch(doneTypes, selectedDoneType); + this.selectionListener = selectionListener; + this.color = color; + setHasStableIds(true); + } + + @NonNull + @Override + public DoneTypeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new DoneTypeViewHolder(ItemFilterDonetypeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull DoneTypeViewHolder viewHolder, int position) { + viewHolder.bind(doneTypes[position]); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return doneTypes.length; + } + + class DoneTypeViewHolder extends RecyclerView.ViewHolder implements Themed { + private final ItemFilterDonetypeBinding binding; + + DoneTypeViewHolder(@NonNull ItemFilterDonetypeBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + void bind(final EDoneType doneType) { + binding.doneType.setText(doneType.toString(binding.doneType.getContext())); + itemView.setSelected(doneTypes[selectedDoneTypePosition].equals(doneType)); + applyTheme(color); + + itemView.setOnClickListener(view -> { + final int oldSelection = selectedDoneTypePosition; + if (doneTypes[selectedDoneTypePosition].equals(doneType)) { + selectedDoneTypePosition = Arrays.binarySearch(doneTypes, EDoneType.NO_FILTER); + itemView.setSelected(false); + if (selectionListener != null) { + selectionListener.onItemSelected(EDoneType.NO_FILTER); + } + notifyItemChanged(selectedDoneTypePosition); + } else { + selectedDoneTypePosition = Arrays.binarySearch(doneTypes, doneType); + itemView.setSelected(true); + if (selectionListener != null) { + selectionListener.onItemSelected(doneType); + } + } + notifyItemChanged(oldSelection); + }); + } + + @Override + public void applyTheme(int color) { + final var utils = ThemeUtils.of(color, itemView.getContext()); + utils.deck.themeSelectedCheck(binding.selectedCheck.getContext(), binding.selectedCheck.getDrawable()); + } + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeFragment.java new file mode 100644 index 000000000..8cee39d1e --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeFragment.java @@ -0,0 +1,47 @@ +package it.niedermann.nextcloud.deck.ui.filter; + +import static java.util.Objects.requireNonNull; + +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.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import it.niedermann.nextcloud.deck.databinding.DialogFilterDoneBinding; +import it.niedermann.nextcloud.deck.model.enums.EDoneType; + +public class FilterDoneTypeFragment extends Fragment implements SelectionListener<EDoneType> { + + private FilterViewModel filterViewModel; + private DialogFilterDoneBinding binding; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = DialogFilterDoneBinding.inflate(requireActivity().getLayoutInflater()); + + filterViewModel = new ViewModelProvider(requireActivity()).get(FilterViewModel.class); + + binding.doneType.setItemAnimator(null); + filterViewModel.getCurrentBoardColor$().observe(getViewLifecycleOwner(), + color -> binding.doneType.setAdapter(new FilterDoneTypeAdapter(requireNonNull(filterViewModel.getFilterInformationDraft().getValue()).getDoneType(), this, color))); + + return binding.getRoot(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + this.binding = null; + } + + @Override + public void onItemSelected(EDoneType item) { + filterViewModel.setFilterInformationDraftDoneType(item); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterViewModel.java index 09f2f4fa1..5bd226e9f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterViewModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterViewModel.java @@ -15,6 +15,7 @@ import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.User; +import it.niedermann.nextcloud.deck.model.enums.EDoneType; import it.niedermann.nextcloud.deck.model.enums.EDueType; import it.niedermann.nextcloud.deck.model.internal.FilterInformation; import it.niedermann.nextcloud.deck.ui.viewmodel.BaseViewModel; @@ -80,6 +81,12 @@ public class FilterViewModel extends BaseViewModel { this.filterInformationDraft.postValue(newDraft); } + public void setFilterInformationDraftDoneType(@NonNull EDoneType doneType) { + final var newDraft = new FilterInformation(filterInformationDraft.getValue()); + newDraft.setDoneType(doneType); + this.filterInformationDraft.postValue(newDraft); + } + public void addFilterInformationDraftLabel(@NonNull Label label) { final var newDraft = new FilterInformation(filterInformationDraft.getValue()); newDraft.addLabel(label); |