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 14:50:30 +0300
committerNiedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com>2020-04-24 15:12:11 +0300
commitad1375c0ce2aed19dd2c0058b996a42a4f778878 (patch)
treecac8c7f600e5ea82fed533039101f541741f8a71 /app/src/main/java
parent7edeb0be0c7faca4c6f264f0fa0fc4d05adfe014 (diff)
#396 Filter cards
Fix memory leak when switching between boards
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java15
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java6
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java6
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterDialogFragment.java29
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/OverdueFilterAdapter.java11
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java73
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