diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-04-24 12:08:58 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-04-24 15:12:11 +0300 |
commit | 9c719f71585c10f6d6e4cce207abe4ab8e587ad0 (patch) | |
tree | 7bc31220be2cd12b072c2facd6b82bacf1708897 /app/src/main/java/it/niedermann/nextcloud/deck/ui/filter | |
parent | d0e9f234fce30abfb667a936d0f51ffa45055388 (diff) |
#396 Filter cards
Remember label and user filter
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui/filter')
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 |