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>2020-04-24 12:08:58 +0300
committerNiedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com>2020-04-24 15:12:11 +0300
commit9c719f71585c10f6d6e4cce207abe4ab8e587ad0 (patch)
tree7bc31220be2cd12b072c2facd6b82bacf1708897 /app/src/main/java/it/niedermann/nextcloud/deck/ui/filter
parentd0e9f234fce30abfb667a936d0f51ffa45055388 (diff)
#396 Filter cards
Remember label and user filter
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui/filter')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java47
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/LabelFilterAdapter.java40
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/UserFilterAdapter.java109
3 files changed, 109 insertions, 87 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 b3b3eea47..f5817c4ef 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
@@ -5,13 +5,14 @@ import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
+import android.widget.LinearLayout;
import androidx.annotation.NonNull;
+import androidx.annotation.Px;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
-import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.databinding.DialogFilterBinding;
import it.niedermann.nextcloud.deck.model.Account;
@@ -29,12 +30,17 @@ public class FilterDialogFragment extends BrandedDialogFragment {
private static final String KEY_ACCOUNT = "account";
private static final String KEY_BOARD_ID = "board_id";
+ private DialogFilterBinding binding;
private MainViewModel viewModel;
private LabelFilterAdapter labelAdapter;
private UserFilterAdapter userAdapter;
private OverdueFilterAdapter overdueAdapter;
private FilterInformation filterInformation;
+ @Px
+ private int avatarSize;
+ private LinearLayout.LayoutParams avatarLayoutParams;
+
private Account account;
private long boardId;
@@ -73,14 +79,12 @@ public class FilterDialogFragment extends BrandedDialogFragment {
final AlertDialog.Builder dialogBuilder = new BrandedAlertDialogBuilder(requireContext());
- final DialogFilterBinding binding = DialogFilterBinding.inflate(requireActivity().getLayoutInflater());
+ SyncManager syncManager = new SyncManager(requireActivity());
+
+ binding = DialogFilterBinding.inflate(requireActivity().getLayoutInflater());
overdueAdapter = new OverdueFilterAdapter(requireContext());
- userAdapter = new UserFilterAdapter(requireContext());
-
binding.overdue.setAdapter(overdueAdapter);
- binding.people.setAdapter(userAdapter);
-
binding.overdue.setSelection(overdueAdapter.getPosition(this.filterInformation.getDueType()));
binding.overdue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
@@ -94,32 +98,16 @@ public class FilterDialogFragment extends BrandedDialogFragment {
}
});
- SyncManager syncManager = new SyncManager(requireActivity());
-
observeOnce(syncManager.findProposalsForLabelsToAssign(account.getId(), boardId), requireActivity(), (labels) -> {
- labelAdapter = new LabelFilterAdapter(requireContext(), labels, this.filterInformation.getLabelIDs());
+ labelAdapter = new LabelFilterAdapter(requireContext(), labels, this.filterInformation.getLabels());
binding.labels.setNestedScrollingEnabled(false);
binding.labels.setAdapter(labelAdapter);
});
observeOnce(syncManager.findProposalsForUsersToAssign(account.getId(), boardId), requireActivity(), (users) -> {
- userAdapter.addAll(users);
- userAdapter.notifyDataSetChanged();
- for (long userId : this.filterInformation.getUserIDs()) {
- binding.people.setSelection(userAdapter.getPosition(userId));
- }
- binding.people.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- DeckLog.info("clicked position: " + position);
- filterInformation.addUserId(userAdapter.getItemId(position));
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- // Nothing to do
- }
- });
+ userAdapter = new UserFilterAdapter(requireContext(), account, users, this.filterInformation.getUsers());
+ binding.users.setNestedScrollingEnabled(false);
+ binding.users.setAdapter(userAdapter);
});
return dialogBuilder
@@ -128,9 +116,10 @@ public class FilterDialogFragment extends BrandedDialogFragment {
.setNeutralButton(android.R.string.cancel, null)
.setNegativeButton(R.string.simple_clear, (a, b) -> viewModel.postFilterInformation(null))
.setPositiveButton(R.string.simple_filter, (a, b) -> {
- // Nach dieser Zeile ist labelAdapter.getSelected() leer
- filterInformation.clearLabelIds();
- filterInformation.addAllLabelIds(labelAdapter.getSelected());
+ filterInformation.clearLabels();
+ filterInformation.addAllLabels(labelAdapter.getSelected());
+ filterInformation.clearUsers();
+ filterInformation.addAllUsers(userAdapter.getSelected());
viewModel.postFilterInformation(filterInformation);
})
.create();
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/LabelFilterAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/LabelFilterAdapter.java
index 184603bb6..82a75cec9 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/LabelFilterAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/LabelFilterAdapter.java
@@ -1,21 +1,23 @@
package it.niedermann.nextcloud.deck.ui.filter;
import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
+import com.google.android.material.chip.Chip;
+
import java.util.ArrayList;
import java.util.List;
import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.model.Label;
-import it.niedermann.nextcloud.deck.util.ViewUtil;
+import it.niedermann.nextcloud.deck.util.ColorUtil;
@SuppressWarnings("WeakerAccess")
public class LabelFilterAdapter extends RecyclerView.Adapter<LabelFilterAdapter.LabelViewHolder> {
@@ -24,13 +26,13 @@ public class LabelFilterAdapter extends RecyclerView.Adapter<LabelFilterAdapter.
@NonNull
private final List<Label> labels = new ArrayList<>();
@NonNull
- private final List<Long> selectedLabelIds = new ArrayList<>();
+ private final List<Label> selectedLabels = new ArrayList<>();
- public LabelFilterAdapter(@NonNull Context context, @NonNull List<Label> labels, @NonNull List<Long> selectedLabelIds) {
+ public LabelFilterAdapter(@NonNull Context context, @NonNull List<Label> labels, @NonNull List<Label> selectedLabels) {
super();
this.context = context;
this.labels.addAll(labels);
- this.selectedLabelIds.addAll(selectedLabelIds);
+ this.selectedLabels.addAll(selectedLabels);
setHasStableIds(true);
notifyDataSetChanged();
}
@@ -43,7 +45,7 @@ public class LabelFilterAdapter extends RecyclerView.Adapter<LabelFilterAdapter.
@NonNull
@Override
public LabelViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
- View view = LayoutInflater.from(context).inflate(R.layout.item_label, viewGroup, false);
+ View view = LayoutInflater.from(context).inflate(R.layout.item_filter_label, viewGroup, false);
return new LabelViewHolder(view);
}
@@ -57,32 +59,34 @@ public class LabelFilterAdapter extends RecyclerView.Adapter<LabelFilterAdapter.
return labels.size();
}
- public List<Long> getSelected() {
- return selectedLabelIds;
+ public List<Label> getSelected() {
+ return selectedLabels;
}
class LabelViewHolder extends RecyclerView.ViewHolder {
// TODO Use ViewBinding
- private TextView textView;
- private ImageView imageView;
+ private Chip chip;
LabelViewHolder(@NonNull View itemView) {
super(itemView);
- textView = itemView.findViewById(R.id.displayname);
- imageView = itemView.findViewById(R.id.label);
+ chip = itemView.findViewById(R.id.label);
}
void bind(final Label label) {
- imageView.setImageDrawable(ViewUtil.getTintedImageView(imageView.getContext(), R.drawable.ic_label_grey600_24dp, "#" + label.getColor()));
- textView.setText(label.getTitle());
+ chip.setText(label.getTitle());
+ final int labelColor = Color.parseColor("#" + label.getColor());
+ chip.setChipBackgroundColor(ColorStateList.valueOf(labelColor));
+ final int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
+ chip.setTextColor(color);
+ itemView.setSelected(selectedLabels.contains(label));
itemView.setOnClickListener(view -> {
- if (selectedLabelIds.contains(label.getLocalId())) {
- selectedLabelIds.remove(label.getLocalId());
+ if (selectedLabels.contains(label)) {
+ selectedLabels.remove(label);
itemView.setSelected(false);
} else {
- selectedLabelIds.add(label.getLocalId());
+ selectedLabels.add(label);
itemView.setSelected(true);
}
});
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/UserFilterAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/UserFilterAdapter.java
index d1baa900f..49cb5ae6a 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/UserFilterAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/UserFilterAdapter.java
@@ -4,68 +4,97 @@ import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
+import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.NoSuchElementException;
+import java.util.ArrayList;
+import java.util.List;
+import it.niedermann.nextcloud.deck.R;
+import it.niedermann.nextcloud.deck.model.Account;
import it.niedermann.nextcloud.deck.model.User;
+import it.niedermann.nextcloud.deck.util.ViewUtil;
-public class UserFilterAdapter extends ArrayAdapter<User> {
+import static it.niedermann.nextcloud.deck.util.DimensionUtil.dpToPx;
+@SuppressWarnings("WeakerAccess")
+public class UserFilterAdapter extends RecyclerView.Adapter<UserFilterAdapter.UserViewHolder> {
+ final int avatarSize;
+ @NonNull
+ private final Context context;
+ @NonNull
+ private final Account account;
@NonNull
- private final LayoutInflater inflater;
+ private final List<User> users = new ArrayList<>();
+ @NonNull
+ private final List<User> selectedUsers = new ArrayList<>();
- @SuppressWarnings("WeakerAccess")
- public UserFilterAdapter(@NonNull Context context) {
- super(context, android.R.layout.simple_list_item_multiple_choice, android.R.id.text1);
- inflater = LayoutInflater.from(context);
+ public UserFilterAdapter(@NonNull Context context, @NonNull Account account, @NonNull List<User> users, @NonNull List<User> selectedUsers) {
+ super();
+ this.account = account;
+ this.context = context;
+ this.users.addAll(users);
+ this.selectedUsers.addAll(selectedUsers);
+ setHasStableIds(true);
+ notifyDataSetChanged();
+ avatarSize = dpToPx(context, R.dimen.avatar_size);
}
@Override
- public boolean hasStableIds() {
- return true;
+ public long getItemId(int position) {
+ return users.get(position).getLocalId();
}
+ @NonNull
@Override
- public long getItemId(int position) {
- final User user = getItem(position);
- if(user == null) {
- throw new NoSuchElementException();
- }
- return user.getLocalId();
+ public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ View view = LayoutInflater.from(context).inflate(R.layout.item_filter_user, viewGroup, false);
+ return new UserViewHolder(view);
}
@Override
- public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
- return getView(position, convertView, parent);
+ public void onBindViewHolder(@NonNull UserViewHolder viewHolder, int position) {
+ viewHolder.bind(users.get(position));
}
- @SuppressWarnings("WeakerAccess")
- public int getPosition(long labelId) {
- for (int i = 0; i < getCount(); i++) {
- if (getItemId(i) == labelId) {
- return i;
- }
- }
- throw new NoSuchElementException();
+ @Override
+ public int getItemCount() {
+ return users.size();
}
- @NotNull
- @Override
- public View getView(int position, View convertView, @NotNull ViewGroup parent) {
- final View view;
- if (convertView == null) {
- view = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
- } else {
- view = convertView;
+ public List<User> getSelected() {
+ return selectedUsers;
+ }
+
+ class UserViewHolder extends RecyclerView.ViewHolder {
+
+ // TODO Use ViewBinding
+ private TextView displayName;
+ private ImageView avatar;
+
+ UserViewHolder(@NonNull View itemView) {
+ super(itemView);
+ displayName = itemView.findViewById(R.id.displayName);
+ avatar = itemView.findViewById(R.id.avatar);
+ }
+
+ void bind(final User user) {
+ displayName.setText(user.getDisplayname());
+ ViewUtil.addAvatar(avatar, account.getUrl(), user.getUid(), avatarSize, R.drawable.ic_person_grey600_24dp);
+ itemView.setSelected(selectedUsers.contains(user));
+
+ itemView.setOnClickListener(view -> {
+ if (selectedUsers.contains(user)) {
+ selectedUsers.remove(user);
+ itemView.setSelected(false);
+ } else {
+ selectedUsers.add(user);
+ itemView.setSelected(true);
+ }
+ });
}
- ((TextView) view.findViewById(android.R.id.text1)).setText(getItem(position).getDisplayname());
- return view;
}
-}
+} \ No newline at end of file