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-05-02 22:16:47 +0300
committerStefan Niedermann <info@niedermann.it>2020-05-02 22:16:47 +0300
commitb784be03e6f63e9089ee0ac07179bb7f15ffc2a3 (patch)
treed5fc826dd3aff28856e43a217745e9d0ce06d776 /app/src/main/java/it/niedermann/nextcloud/deck/ui/filter
parentf30dde0702dff5163582e8df4f1ae4cbab28e534 (diff)
Filter based on tabs
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/FilterAssigneesFragment.java48
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java109
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDuedateFragment.java51
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsFragment.java45
4 files changed, 188 insertions, 65 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterAssigneesFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterAssigneesFragment.java
new file mode 100644
index 000000000..388a0d266
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterAssigneesFragment.java
@@ -0,0 +1,48 @@
+package it.niedermann.nextcloud.deck.ui.filter;
+
+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.R;
+import it.niedermann.nextcloud.deck.databinding.DialogFilterAssigneesBinding;
+import it.niedermann.nextcloud.deck.model.internal.FilterInformation;
+import it.niedermann.nextcloud.deck.persistence.sync.SyncManager;
+import it.niedermann.nextcloud.deck.ui.MainViewModel;
+
+import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce;
+import static it.niedermann.nextcloud.deck.util.DimensionUtil.dpToPx;
+
+public class FilterAssigneesFragment extends Fragment {
+
+ private FilterInformation filterInformation;
+ private DialogFilterAssigneesBinding binding;
+ private MainViewModel mainViewModel;
+ private UserFilterAdapter userAdapter;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+
+ binding = DialogFilterAssigneesBinding.inflate(requireActivity().getLayoutInflater());
+ mainViewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
+ final SyncManager syncManager = new SyncManager(requireActivity());
+
+ this.filterInformation = mainViewModel.getFilterInformation().getValue();
+ if (this.filterInformation == null) {
+ this.filterInformation = new FilterInformation();
+ }
+ observeOnce(syncManager.findProposalsForUsersToAssign(mainViewModel.getCurrentAccount().getId(), mainViewModel.getCurrentBoardLocalId()), requireActivity(), (users) -> {
+ userAdapter = new UserFilterAdapter(dpToPx(requireContext(), R.dimen.avatar_size), mainViewModel.getCurrentAccount(), users, this.filterInformation.getUsers());
+ binding.users.setNestedScrollingEnabled(false);
+ binding.users.setAdapter(userAdapter);
+ });
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+}
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 a912892bd..7388b0bbe 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
@@ -2,93 +2,55 @@ package it.niedermann.nextcloud.deck.ui.filter;
import android.app.Dialog;
import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.ViewModelProvider;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import com.google.android.material.tabs.TabLayoutMediator;
import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.databinding.DialogFilterBinding;
-import it.niedermann.nextcloud.deck.model.enums.EDueType;
-import it.niedermann.nextcloud.deck.model.internal.FilterInformation;
-import it.niedermann.nextcloud.deck.persistence.sync.SyncManager;
import it.niedermann.nextcloud.deck.ui.MainViewModel;
+import it.niedermann.nextcloud.deck.ui.branding.BrandedActivity;
import it.niedermann.nextcloud.deck.ui.branding.BrandedAlertDialogBuilder;
import it.niedermann.nextcloud.deck.ui.branding.BrandedDialogFragment;
-import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce;
-import static it.niedermann.nextcloud.deck.util.DimensionUtil.dpToPx;
-
public class FilterDialogFragment extends BrandedDialogFragment {
private DialogFilterBinding binding;
- private MainViewModel viewModel;
- private LabelFilterAdapter labelAdapter;
- private UserFilterAdapter userAdapter;
- private OverdueFilterAdapter overdueAdapter;
- private FilterInformation filterInformation;
+ private MainViewModel mainViewModel;
+
+ private final static int[] tabTitles = new int[]{
+ R.string.filter_tags_title,
+ R.string.filter_assignees_title,
+ R.string.filter_duedate_title
+ };
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- viewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
- this.filterInformation = viewModel.getFilterInformation().getValue();
- if (this.filterInformation == null) {
- this.filterInformation = new FilterInformation();
- }
+ mainViewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
final AlertDialog.Builder dialogBuilder = new BrandedAlertDialogBuilder(requireContext());
- final SyncManager syncManager = new SyncManager(requireActivity());
binding = DialogFilterBinding.inflate(requireActivity().getLayoutInflater());
-
- overdueAdapter = new OverdueFilterAdapter(requireContext());
- binding.overdue.setAdapter(overdueAdapter);
- binding.overdue.setSelection(overdueAdapter.getPosition(this.filterInformation.getDueType()));
- binding.overdue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- filterInformation.setDueType(overdueAdapter.getItem(position));
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- filterInformation.setDueType(EDueType.NO_FILTER);
- }
- });
-
- observeOnce(syncManager.findProposalsForLabelsToAssign(viewModel.getCurrentAccount().getId(), viewModel.getCurrentBoardLocalId()), requireActivity(), (labels) -> {
- labelAdapter = new LabelFilterAdapter(labels, this.filterInformation.getLabels());
- binding.labels.setNestedScrollingEnabled(false);
- binding.labels.setAdapter(labelAdapter);
- });
-
- observeOnce(syncManager.findProposalsForUsersToAssign(viewModel.getCurrentAccount().getId(), viewModel.getCurrentBoardLocalId()), requireActivity(), (users) -> {
- userAdapter = new UserFilterAdapter(dpToPx(requireContext(), R.dimen.avatar_size), viewModel.getCurrentAccount(), users, this.filterInformation.getUsers());
- binding.users.setNestedScrollingEnabled(false);
- binding.users.setAdapter(userAdapter);
- });
+ binding.viewPager.setAdapter(new TabsPagerAdapter(getChildFragmentManager(), getLifecycle()));
+ new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(tabTitles[position])).attach();
return dialogBuilder
.setTitle(R.string.simple_filter)
.setView(binding.getRoot())
.setNeutralButton(android.R.string.cancel, null)
- .setNegativeButton(R.string.simple_clear, (a, b) -> viewModel.postFilterInformation(null))
- .setPositiveButton(R.string.simple_filter, (a, b) -> {
- filterInformation.clearLabels();
- filterInformation.addAllLabels(labelAdapter.getSelected());
-
- filterInformation.clearUsers();
- filterInformation.addAllUsers(userAdapter.getSelected());
-
- viewModel.postFilterInformation(hasActiveFilter(filterInformation) ? filterInformation : null);
- })
+ .setNegativeButton(R.string.simple_clear, (a, b) -> mainViewModel.postFilterInformation(null))
+ .setPositiveButton(R.string.simple_filter, null)
.create();
}
@@ -98,16 +60,33 @@ public class FilterDialogFragment extends BrandedDialogFragment {
@Override
public void applyBrand(int mainColor, int textColor) {
-
+ binding.tabLayout.setSelectedTabIndicatorColor(BrandedActivity.getSecondaryForegroundColorDependingOnTheme(requireContext(), mainColor));
}
- /**
- * @return whether or not the given filterInformation has any actual filters set
- */
- private static boolean hasActiveFilter(@Nullable FilterInformation filterInformation) {
- if (filterInformation == null) {
- return false;
+ private static class TabsPagerAdapter extends FragmentStateAdapter {
+
+ TabsPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
+ super(fragmentManager, lifecycle);
+ }
+
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ switch (position) {
+ case 0:
+ return new FilterLabelsFragment();
+ case 1:
+ return new FilterAssigneesFragment();
+ case 2:
+ return new FilterDuedateFragment();
+ default:
+ throw new IllegalArgumentException("position must be between 0 and 2");
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return tabTitles.length;
}
- return filterInformation.getDueType() != EDueType.NO_FILTER || filterInformation.getUsers().size() > 0 || filterInformation.getLabels().size() > 0;
}
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDuedateFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDuedateFragment.java
new file mode 100644
index 000000000..54970d1c3
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDuedateFragment.java
@@ -0,0 +1,51 @@
+package it.niedermann.nextcloud.deck.ui.filter;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModelProvider;
+
+import it.niedermann.nextcloud.deck.databinding.DialogFilterDuedateBinding;
+import it.niedermann.nextcloud.deck.model.enums.EDueType;
+import it.niedermann.nextcloud.deck.model.internal.FilterInformation;
+import it.niedermann.nextcloud.deck.ui.MainViewModel;
+
+public class FilterDuedateFragment extends Fragment {
+
+ private FilterInformation filterInformation;
+ private DialogFilterDuedateBinding binding;
+ private MainViewModel mainViewModel;
+ private OverdueFilterAdapter overdueAdapter;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ binding = DialogFilterDuedateBinding.inflate(requireActivity().getLayoutInflater());
+ mainViewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
+ overdueAdapter = new OverdueFilterAdapter(requireContext());
+ binding.overdue.setAdapter(overdueAdapter);
+ this.filterInformation = mainViewModel.getFilterInformation().getValue();
+ if (this.filterInformation == null) {
+ this.filterInformation = new FilterInformation();
+ }
+ binding.overdue.setSelection(overdueAdapter.getPosition(this.filterInformation.getDueType()));
+ binding.overdue.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ filterInformation.setDueType(overdueAdapter.getItem(position));
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ filterInformation.setDueType(EDueType.NO_FILTER);
+ }
+ });
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsFragment.java
new file mode 100644
index 000000000..bf4b5edbf
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsFragment.java
@@ -0,0 +1,45 @@
+package it.niedermann.nextcloud.deck.ui.filter;
+
+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.DialogFilterLabelsBinding;
+import it.niedermann.nextcloud.deck.model.internal.FilterInformation;
+import it.niedermann.nextcloud.deck.persistence.sync.SyncManager;
+import it.niedermann.nextcloud.deck.ui.MainViewModel;
+
+import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce;
+
+public class FilterLabelsFragment extends Fragment {
+
+ private FilterInformation filterInformation;
+ private DialogFilterLabelsBinding binding;
+ private MainViewModel mainViewModel;
+ private LabelFilterAdapter labelAdapter;
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ binding = DialogFilterLabelsBinding.inflate(requireActivity().getLayoutInflater());
+ mainViewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
+ final SyncManager syncManager = new SyncManager(requireActivity());
+
+ this.filterInformation = mainViewModel.getFilterInformation().getValue();
+ if (this.filterInformation == null) {
+ this.filterInformation = new FilterInformation();
+ }
+ observeOnce(syncManager.findProposalsForLabelsToAssign(mainViewModel.getCurrentAccount().getId(), mainViewModel.getCurrentBoardLocalId()), requireActivity(), (labels) -> {
+ labelAdapter = new LabelFilterAdapter(labels, this.filterInformation.getLabels());
+ binding.labels.setNestedScrollingEnabled(false);
+ binding.labels.setAdapter(labelAdapter);
+ });
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+}