Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2024-01-18 15:30:06 +0300
committerStefan Niedermann <info@niedermann.it>2024-01-18 15:30:06 +0300
commiteea21c772af0b525674837ff3aa3d1e6ec9d380b (patch)
tree641142c8920e5dc8ba3ef06ecd8518be47d53e2f /app/src/main/java/it/niedermann/nextcloud/deck/ui
parent55abed7577387ba3b2167238882e81b80ce4cba5 (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')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java7
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeAdapter.java96
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDoneTypeFragment.java47
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterViewModel.java7
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);