diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-04-23 15:21:48 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-04-24 15:12:11 +0300 |
commit | bd897e0087dc9c0cbd87df171792b4b682185bf7 (patch) | |
tree | 5183312afd315c174b88fdd874a4efd9ada148e2 /app/src/main | |
parent | 87e8310af269b25b8b248bcfd63d12b6e43818b2 (diff) |
#396 Filter cards
Diffstat (limited to 'app/src/main')
6 files changed, 81 insertions, 69 deletions
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 01c568bb5..d79d7d2be 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 @@ -34,6 +34,7 @@ import androidx.core.util.Pair; import androidx.core.view.GravityCompat; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; import androidx.viewpager2.widget.ViewPager2; import com.bumptech.glide.Glide; @@ -81,7 +82,6 @@ import it.niedermann.nextcloud.deck.ui.branding.BrandedAlertDialogBuilder; import it.niedermann.nextcloud.deck.ui.card.CardAdapter; import it.niedermann.nextcloud.deck.ui.card.EditActivity; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; -import it.niedermann.nextcloud.deck.ui.filter.FilterChangeListener; import it.niedermann.nextcloud.deck.ui.filter.FilterDialogFragment; import it.niedermann.nextcloud.deck.ui.settings.SettingsActivity; import it.niedermann.nextcloud.deck.ui.stack.DeleteStackDialogFragment; @@ -111,11 +111,13 @@ import static it.niedermann.nextcloud.deck.util.DrawerMenuUtil.MENU_ID_ADD_BOARD import static it.niedermann.nextcloud.deck.util.DrawerMenuUtil.MENU_ID_SETTINGS; import static it.niedermann.nextcloud.deck.util.ExceptionUtil.handleHttpRequestFailedException; -public class MainActivity extends BrandedActivity implements DeleteStackListener, EditStackListener, DeleteBoardListener, EditBoardListener, OnScrollListener, OnNavigationItemSelectedListener, DrawerAccountListener, FilterChangeListener { +public class MainActivity extends BrandedActivity implements DeleteStackListener, EditStackListener, DeleteBoardListener, EditBoardListener, OnScrollListener, OnNavigationItemSelectedListener, DrawerAccountListener { protected ActivityMainBinding binding; protected NavHeaderMainBinding headerBinding; + private MainViewModel viewModel; + protected static final int ACTIVITY_ABOUT = 1; protected static final int ACTIVITY_SETTINGS = 2; @@ -162,6 +164,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener headerBinding = NavHeaderMainBinding.bind(binding.navigationView.getHeaderView(0)); setContentView(binding.getRoot()); + viewModel = new ViewModelProvider(this).get(MainViewModel.class); addList = getString(R.string.add_list); addBoard = getString(R.string.add_board); @@ -918,11 +921,4 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener syncManager.deleteBoard(board); binding.drawerLayout.closeDrawer(GravityCompat.START); } - - @Override - public void onFilterChanged(FilterInformation filterInformation) { - DeckLog.info("Filter changed: " + filterInformation); - this.filterInformation = filterInformation; - stackAdapter.onFilterChanged(filterInformation); - } }
\ No newline at end of file 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 new file mode 100644 index 000000000..e0980566d --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java @@ -0,0 +1,20 @@ +package it.niedermann.nextcloud.deck.ui; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import it.niedermann.nextcloud.deck.model.internal.FilterInformation; + +public class MainViewModel extends ViewModel { + + private MutableLiveData<FilterInformation> filterInformation = new MutableLiveData<>(); + + public void postFilterInformation(FilterInformation filterInformation) { + this.filterInformation.postValue(filterInformation); + } + + public LiveData<FilterInformation> getFilterInformation() { + return this.filterInformation; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterChangeListener.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterChangeListener.java deleted file mode 100644 index 50c26ba86..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterChangeListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.filter; - -import it.niedermann.nextcloud.deck.model.internal.FilterInformation; - -public interface FilterChangeListener { - void onFilterChanged(FilterInformation 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 57fe8578f..253ce6d1c 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 @@ -10,12 +10,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; +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.internal.FilterInformation; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.ui.MainActivity; +import it.niedermann.nextcloud.deck.ui.MainViewModel; import it.niedermann.nextcloud.deck.ui.branding.BrandedAlertDialogBuilder; import it.niedermann.nextcloud.deck.ui.branding.BrandedDialogFragment; @@ -25,7 +28,8 @@ public class FilterDialogFragment extends BrandedDialogFragment { private static final String KEY_BOARD_ID = "board_id"; private static final String KEY_FILTER_INFORMATION = "filterInformation"; - private FilterChangeListener filterChangeListener; + private MainViewModel viewModel; + private DialogFilterBinding binding; private SyncManager syncManager; @@ -39,8 +43,8 @@ public class FilterDialogFragment extends BrandedDialogFragment { public void onAttach(@NonNull Context context) { super.onAttach(context); - if (!(requireActivity() instanceof FilterChangeListener)) { - throw new IllegalArgumentException("Caller must implement" + FilterChangeListener.class.getSimpleName()); + if (!(requireActivity() instanceof MainActivity)) { + throw new IllegalArgumentException("Dialog must be called from " + MainActivity.class.getSimpleName()); } final Bundle args = getArguments(); @@ -49,7 +53,6 @@ public class FilterDialogFragment extends BrandedDialogFragment { throw new IllegalArgumentException(KEY_ACCOUNT + " and " + KEY_BOARD_ID + " must be provided as arguments"); } - this.filterChangeListener = (FilterChangeListener) requireActivity(); this.boardId = args.getLong(KEY_BOARD_ID); this.account = (Account) args.getSerializable(KEY_ACCOUNT); @@ -70,6 +73,8 @@ public class FilterDialogFragment extends BrandedDialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + viewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class); + final AlertDialog.Builder dialogBuilder = new BrandedAlertDialogBuilder(requireContext()); binding = DialogFilterBinding.inflate(requireActivity().getLayoutInflater()); @@ -91,7 +96,7 @@ public class FilterDialogFragment extends BrandedDialogFragment { return dialogBuilder .setView(binding.getRoot()) .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.simple_filter, (a, b) -> filterChangeListener.onFilterChanged(filterInformation)) + .setPositiveButton(R.string.simple_filter, (a, b) -> viewModel.postFilterInformation(filterInformation)) .create(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackAdapter.java index 88e063bce..726613dbe 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackAdapter.java @@ -10,17 +10,13 @@ import java.util.List; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.full.FullStack; -import it.niedermann.nextcloud.deck.model.internal.FilterInformation; -import it.niedermann.nextcloud.deck.ui.filter.FilterChangeListener; -public class StackAdapter extends FragmentStateAdapter implements FilterChangeListener { +public class StackAdapter extends FragmentStateAdapter { @NonNull private List<FullStack> stackList = new ArrayList<>(); private Account account; private long boardId; private boolean canEdit; - @NonNull - private FilterInformation filterInformation; public StackAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); @@ -53,7 +49,7 @@ public class StackAdapter extends FragmentStateAdapter implements FilterChangeLi @NonNull @Override public Fragment createFragment(int position) { - return StackFragment.newInstance(boardId, stackList.get(position).getLocalId(), account, canEdit, filterInformation); + return StackFragment.newInstance(boardId, stackList.get(position).getLocalId(), account, canEdit); } public void setStacks(@NonNull List<FullStack> fullStacks, @NonNull Account currentAccount, long currentBoardId, boolean currentBoardHasEditPermission) { @@ -63,10 +59,4 @@ public class StackAdapter extends FragmentStateAdapter implements FilterChangeLi this.canEdit = currentBoardHasEditPermission; notifyDataSetChanged(); } - - @Override - public void onFilterChanged(FilterInformation filterInformation) { - this.filterInformation = filterInformation; - notifyDataSetChanged(); - } }
\ No newline at end of file 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 74909bf08..3732ecb61 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 @@ -1,6 +1,5 @@ package it.niedermann.nextcloud.deck.ui.stack; -import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; @@ -8,7 +7,10 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import java.util.List; @@ -17,8 +19,8 @@ import it.niedermann.android.crosstabdnd.DragAndDropTab; import it.niedermann.nextcloud.deck.databinding.FragmentStackBinding; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.full.FullCard; -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.BrandedFragment; import it.niedermann.nextcloud.deck.ui.card.CardAdapter; import it.niedermann.nextcloud.deck.ui.card.SelectCardListener; @@ -29,33 +31,41 @@ 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 static final String KEY_FILTER_INFORMATION = "filterInformation"; private CardAdapter adapter = null; - @Nullable - FilterInformation filterInformation; + private FragmentStackBinding binding; + + MainViewModel viewModel; private SyncManager syncManager; - private Activity activity; + private FragmentActivity activity; private OnScrollListener onScrollListener; + private LiveData<List<FullCard>> defaultCardsLiveData; + 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 long stackId; private long boardId; private Account account; private boolean canEdit; - private FragmentStackBinding binding; - - public static StackFragment newInstance(long boardId, long stackId, Account account, boolean hasEditPermission, @Nullable FilterInformation filterInformation) { - Bundle bundle = new Bundle(); - bundle.putLong(KEY_BOARD_ID, boardId); - bundle.putLong(KEY_STACK_ID, stackId); - bundle.putBoolean(KEY_HAS_EDIT_PERMISSION, hasEditPermission); - bundle.putSerializable(KEY_ACCOUNT, account); - if (filterInformation != null) { - bundle.putSerializable(KEY_FILTER_INFORMATION, filterInformation); - } + 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(bundle); + fragment.setArguments(args); return fragment; } @@ -73,12 +83,6 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car stackId = args.getLong(KEY_STACK_ID); account = (Account) args.getSerializable(KEY_ACCOUNT); canEdit = args.getBoolean(KEY_HAS_EDIT_PERMISSION); - if (args.containsKey(KEY_FILTER_INFORMATION)) { - final Object info = args.getSerializable(KEY_FILTER_INFORMATION); - if (info != null) { - filterInformation = (FilterInformation) args.getSerializable(KEY_FILTER_INFORMATION); - } - } if (context instanceof OnScrollListener) { this.onScrollListener = (OnScrollListener) context; @@ -90,6 +94,8 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car binding = FragmentStackBinding.inflate(inflater, container, false); activity = requireActivity(); + viewModel = new ViewModelProvider(activity).get(MainViewModel.class); + syncManager = new SyncManager(activity); adapter = new CardAdapter(requireContext(), account, boardId, stackId, canEdit, syncManager, this, (requireActivity() instanceof SelectCardListener) ? (SelectCardListener) requireActivity() : null); @@ -111,17 +117,19 @@ public class StackFragment extends BrandedFragment implements DragAndDropTab<Car binding.emptyContentView.hideDescription(); } - // TODO use FilterInformation - syncManager.getFullCardsForStack(account.getId(), stackId).observe(getViewLifecycleOwner(), (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); - } - }); - }); + defaultCardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId); + defaultCardsLiveData.observe(getViewLifecycleOwner(), cardObserver); + + viewModel.getFilterInformation().observe(activity, (filterInformation -> { + if (filterInformation == null) { + filteredCardsLiveData.removeObserver(cardObserver); + defaultCardsLiveData.observe(getViewLifecycleOwner(), cardObserver); + } else { + defaultCardsLiveData.removeObserver(cardObserver); + filteredCardsLiveData = syncManager.getFullCardsForStack(account.getId(), stackId, filterInformation); + filteredCardsLiveData.observe(getViewLifecycleOwner(), cardObserver); + } + })); return binding.getRoot(); } |