diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-04-24 14:50:30 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-04-24 15:12:11 +0300 |
commit | ad1375c0ce2aed19dd2c0058b996a42a4f778878 (patch) | |
tree | cac8c7f600e5ea82fed533039101f541741f8a71 /app/src/main/java | |
parent | 7edeb0be0c7faca4c6f264f0fa0fc4d05adfe014 (diff) |
#396 Filter cards
Fix memory leak when switching between boards
Diffstat (limited to 'app/src/main/java')
7 files changed, 74 insertions, 68 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java index 448d0bf3e..9c3985352 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java @@ -13,17 +13,19 @@ import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.enums.EDueType; public class FilterInformation implements Serializable { + @NonNull private EDueType dueType = EDueType.NO_FILTER; @NonNull private List<User> users = new ArrayList<>(); @NonNull private List<Label> labels = new ArrayList<>(); + @NonNull public EDueType getDueType() { return dueType; } - public void setDueType(EDueType dueType) { + public void setDueType(@NonNull EDueType dueType) { this.dueType = dueType; } @@ -37,11 +39,11 @@ public class FilterInformation implements Serializable { return labels; } - public void addAllLabels(List<Label> labels) { + public void addAllLabels(@NonNull List<Label> labels) { this.labels.addAll(labels); } - public void addAllUsers(List<User> users) { + public void addAllUsers(@NonNull List<User> users) { this.users.addAll(users); } @@ -53,13 +55,6 @@ public class FilterInformation implements Serializable { users.clear(); } - /** - * @return whether or not any filter is set - */ - public boolean hasActiveFilter() { - return (dueType != null && dueType != EDueType.NO_FILTER) || users.size() > 0 || labels.size() > 0; - } - @NotNull @Override public String toString() { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index 478f71bcd..c8f240c9e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -624,11 +624,7 @@ public class SyncManager { return dataBaseAdapter.getCardByLocalId(accountId, cardLocalId); } - public LiveData<List<FullCard>> getFullCardsForStack(long accountId, long localStackId) { - return getFullCardsForStack(accountId, localStackId, null); - } - - public LiveData<List<FullCard>> getFullCardsForStack(long accountId, long localStackId, FilterInformation filter) { + public LiveData<List<FullCard>> getFullCardsForStack(long accountId, long localStackId, @Nullable FilterInformation filter) { return dataBaseAdapter.getFullCardsForStack(accountId, localStackId, filter); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java index e7faa6dba..7a9c29613 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java @@ -645,7 +645,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener } inflater.inflate(R.menu.main_menu, menu); final FilterInformation filterInformation = viewModel.getFilterInformation().getValue(); - menu.findItem(R.id.filter).setIcon(filterInformation == null || !filterInformation.hasActiveFilter() + menu.findItem(R.id.filter).setIcon(filterInformation == null ? R.drawable.ic_filter_list_white_24dp : R.drawable.ic_filter_list_active_white_24dp); return super.onCreateOptionsMenu(menu); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java index e0980566d..b85427324 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java @@ -1,5 +1,7 @@ package it.niedermann.nextcloud.deck.ui; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; @@ -8,12 +10,14 @@ import it.niedermann.nextcloud.deck.model.internal.FilterInformation; public class MainViewModel extends ViewModel { + @NonNull private MutableLiveData<FilterInformation> filterInformation = new MutableLiveData<>(); - public void postFilterInformation(FilterInformation filterInformation) { + public void postFilterInformation(@Nullable FilterInformation filterInformation) { this.filterInformation.postValue(filterInformation); } + @NonNull public LiveData<FilterInformation> getFilterInformation() { return this.filterInformation; } 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 a6bdfdadb..518d56dde 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,10 +5,9 @@ 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.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; @@ -16,6 +15,7 @@ import androidx.lifecycle.ViewModelProvider; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.DialogFilterBinding; import it.niedermann.nextcloud.deck.model.Account; +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.MainActivity; @@ -38,10 +38,6 @@ public class FilterDialogFragment extends BrandedDialogFragment { private OverdueFilterAdapter overdueAdapter; private FilterInformation filterInformation; - @Px - private int avatarSize; - private LinearLayout.LayoutParams avatarLayoutParams; - private Account account; private long boardId; @@ -79,8 +75,7 @@ public class FilterDialogFragment extends BrandedDialogFragment { } final AlertDialog.Builder dialogBuilder = new BrandedAlertDialogBuilder(requireContext()); - - SyncManager syncManager = new SyncManager(requireActivity()); + final SyncManager syncManager = new SyncManager(requireActivity()); binding = DialogFilterBinding.inflate(requireActivity().getLayoutInflater()); @@ -95,7 +90,7 @@ public class FilterDialogFragment extends BrandedDialogFragment { @Override public void onNothingSelected(AdapterView<?> parent) { - filterInformation.setDueType(null); + filterInformation.setDueType(EDueType.NO_FILTER); } }); @@ -119,9 +114,11 @@ public class FilterDialogFragment extends BrandedDialogFragment { .setPositiveButton(R.string.simple_filter, (a, b) -> { filterInformation.clearLabels(); filterInformation.addAllLabels(labelAdapter.getSelected()); + filterInformation.clearUsers(); filterInformation.addAllUsers(userAdapter.getSelected()); - viewModel.postFilterInformation(filterInformation); + + viewModel.postFilterInformation(hasActiveFilter(filterInformation) ? filterInformation : null); }) .create(); } @@ -141,4 +138,16 @@ public class FilterDialogFragment extends BrandedDialogFragment { public void applyBrand(int mainColor, int textColor) { } + + /** + * @return whether or not the given filterInformation has any actual filters set + */ + private static boolean hasActiveFilter(@Nullable FilterInformation filterInformation) { + if (filterInformation == null) { + return false; + } + return (filterInformation.getDueType() != null && 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/OverdueFilterAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/OverdueFilterAdapter.java index 71b351e39..5de6c50c8 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/OverdueFilterAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/OverdueFilterAdapter.java @@ -37,6 +37,17 @@ public class OverdueFilterAdapter extends ArrayAdapter<EDueType> { return getView(position, convertView, parent); } + @NonNull + @Override + public EDueType getItem(int position) { + EDueType item = super.getItem(position); + if (item != null) { + return item; + } else { + return EDueType.NO_FILTER; + } + } + @NotNull @Override public View getView(int position, View convertView, @NotNull ViewGroup parent) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java index 257f185c2..796786052 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java @@ -7,7 +7,7 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; @@ -32,46 +32,20 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car private static final String KEY_STACK_ID = "stackId"; private static final String KEY_ACCOUNT = "account"; private static final String KEY_HAS_EDIT_PERMISSION = "hasEditPermission"; - private CardAdapter adapter = null; - private FragmentStackBinding binding; + private FragmentStackBinding binding; private SyncManager syncManager; private FragmentActivity activity; private OnScrollListener onScrollListener; - @Nullable - private LiveData<List<FullCard>> defaultCardsLiveData; - @Nullable - private LiveData<List<FullCard>> filteredCardsLiveData; - private Observer<List<FullCard>> cardObserver = (List<FullCard> cards) -> { - activity.runOnUiThread(() -> { - if (cards != null && cards.size() > 0) { - binding.emptyContentView.setVisibility(View.GONE); - adapter.setCardList(cards); - } else { - binding.emptyContentView.setVisibility(View.VISIBLE); - } - }); - }; + private CardAdapter adapter = null; + private LiveData<List<FullCard>> cardsLiveData; private long stackId; private long boardId; private Account account; private boolean canEdit; - public static StackFragment newInstance(long boardId, long stackId, Account account, boolean hasEditPermission) { - final Bundle args = new Bundle(); - args.putLong(KEY_BOARD_ID, boardId); - args.putLong(KEY_STACK_ID, stackId); - args.putBoolean(KEY_HAS_EDIT_PERMISSION, hasEditPermission); - args.putSerializable(KEY_ACCOUNT, account); - - StackFragment fragment = new StackFragment(); - fragment.setArguments(args); - - return fragment; - } - @Override public void onAttach(@NonNull Context context) { super.onAttach(context); @@ -119,20 +93,24 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car binding.emptyContentView.hideDescription(); } - defaultCardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId); - defaultCardsLiveData.observe(activity, cardObserver); - - viewModel.getFilterInformation().observe(activity, (filterInformation -> { - // Remove filter only if it has never been set before - if (filterInformation == null && filteredCardsLiveData != null) { - filteredCardsLiveData.removeObserver(cardObserver); - defaultCardsLiveData.observe(activity, cardObserver); + final Observer<List<FullCard>> cardsObserver = (fullCards) -> activity.runOnUiThread(() -> { + if (fullCards != null && fullCards.size() > 0) { + binding.emptyContentView.setVisibility(View.GONE); + adapter.setCardList(fullCards); } else { - defaultCardsLiveData.removeObserver(cardObserver); - filteredCardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId, filterInformation); - filteredCardsLiveData.observe(activity, cardObserver); + binding.emptyContentView.setVisibility(View.VISIBLE); } + }); + + cardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId, viewModel.getFilterInformation().getValue()); + cardsLiveData.observe(getViewLifecycleOwner(), cardsObserver); + + viewModel.getFilterInformation().observe(getViewLifecycleOwner(), (filterInformation -> { + cardsLiveData.removeObserver(cardsObserver); + cardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId, filterInformation); + cardsLiveData.observe(getViewLifecycleOwner(), cardsObserver); })); + return binding.getRoot(); } @@ -150,4 +128,17 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car public void applyBrand(int mainColor, int textColor) { this.adapter.applyBrand(mainColor, textColor); } + + public static Fragment newInstance(long boardId, long stackId, Account account, boolean hasEditPermission) { + final Bundle args = new Bundle(); + args.putLong(KEY_BOARD_ID, boardId); + args.putLong(KEY_STACK_ID, stackId); + args.putBoolean(KEY_HAS_EDIT_PERMISSION, hasEditPermission); + args.putSerializable(KEY_ACCOUNT, account); + + final StackFragment fragment = new StackFragment(); + fragment.setArguments(args); + + return fragment; + } }
\ No newline at end of file |