diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-04-09 21:33:01 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2021-04-10 14:38:50 +0300 |
commit | 961a7a5e212dbd1b58516eb89a4f95c0292a8045 (patch) | |
tree | 6fbefb4e4a1b8d3d439610ddb7a3a719c5a7511d /app/src/main/java/it/niedermann/nextcloud | |
parent | b630a63f0133223c8d5d9266224f4ffae5b64ec0 (diff) |
#690 Upcoming cards
Use new method for UpcomingCardsWidget
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java | 7 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java | 4 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActivity.java (renamed from app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActvitiy.java) | 24 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsAdapter.java | 52 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsUtil.java | 64 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsViewModel.java | 3 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java | 79 |
7 files changed, 105 insertions, 128 deletions
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 84f282f4b..7a1d49486 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 @@ -1897,10 +1897,15 @@ public class SyncManager { } @WorkerThread - public LiveData<List<UpcomingCardsAdapterItem>> getCardsForFilterWidget(@NonNull FilterWidget filterWidget) { + public LiveData<List<UpcomingCardsAdapterItem>> getCardsForUpcomingCards() { return dataBaseAdapter.getCardsForUpcomingCard(); } + @WorkerThread + public List<UpcomingCardsAdapterItem> getCardsForUpcomingCardsForWidget() { + return dataBaseAdapter.getCardsForUpcomingCardForWidget(); + } + // # single card widget /** 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 4d3bc7eab..ee3be1cb9 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 @@ -101,7 +101,7 @@ import it.niedermann.nextcloud.deck.ui.stack.EditStackListener; import it.niedermann.nextcloud.deck.ui.stack.OnScrollListener; import it.niedermann.nextcloud.deck.ui.stack.StackAdapter; import it.niedermann.nextcloud.deck.ui.stack.StackFragment; -import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsActvitiy; +import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsActivity; import it.niedermann.nextcloud.deck.util.CustomAppGlideModule; import it.niedermann.nextcloud.deck.util.DrawerMenuUtil; @@ -700,7 +700,7 @@ public class MainActivity extends AppCompatActivity implements DeleteStackListen startActivity(ArchivedBoardsActvitiy.createIntent(MainActivity.this, mainViewModel.getCurrentAccount())); break; case MENU_ID_UPCOMING_CARDS: - startActivity(UpcomingCardsActvitiy.createIntent(MainActivity.this)); + startActivity(UpcomingCardsActivity.createIntent(MainActivity.this)); break; default: setCurrentBoard(boardsList.get(item.getItemId())); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActvitiy.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActivity.java index 8663f3013..30575af29 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActvitiy.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsActivity.java @@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.ui.upcomingcards; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -12,10 +13,7 @@ import androidx.lifecycle.ViewModelProvider; import it.niedermann.nextcloud.deck.databinding.ActivityUpcomingCardsBinding; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; -public class UpcomingCardsActvitiy extends AppCompatActivity { - - private UpcomingCardsViewModel viewModel; - private ActivityUpcomingCardsBinding binding; +public class UpcomingCardsActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -23,19 +21,29 @@ public class UpcomingCardsActvitiy extends AppCompatActivity { Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); - binding = ActivityUpcomingCardsBinding.inflate(getLayoutInflater()); + final ActivityUpcomingCardsBinding binding = ActivityUpcomingCardsBinding.inflate(getLayoutInflater()); + final UpcomingCardsViewModel viewModel = new ViewModelProvider(this).get(UpcomingCardsViewModel.class); + setContentView(binding.getRoot()); setSupportActionBar(binding.toolbar); final UpcomingCardsAdapter adapter = new UpcomingCardsAdapter(this, getSupportFragmentManager()); binding.recyclerView.setAdapter(adapter); - viewModel = new ViewModelProvider(this).get(UpcomingCardsViewModel.class); - viewModel.getUpcomingCards().observe(this, adapter::setItems); + viewModel.getUpcomingCards().observe(this, items -> { + if (items.size() > 0) { + binding.recyclerView.setVisibility(View.VISIBLE); + binding.emptyContentView.setVisibility(View.GONE); + } else { + binding.recyclerView.setVisibility(View.GONE); + binding.emptyContentView.setVisibility(View.VISIBLE); + } + adapter.setItems(items); + }); } @NonNull public static Intent createIntent(@NonNull Context context) { - return new Intent(context, UpcomingCardsActvitiy.class) + return new Intent(context, UpcomingCardsActivity.class) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsAdapter.java index 4395742d5..f97c10cbe 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsAdapter.java @@ -11,18 +11,14 @@ import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.ItemCardCompactBinding; import it.niedermann.nextcloud.deck.databinding.ItemCardDefaultBinding; import it.niedermann.nextcloud.deck.databinding.ItemCardDefaultOnlyTitleBinding; import it.niedermann.nextcloud.deck.databinding.ItemSectionBinding; -import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.ui.card.AbstractCardViewHolder; import it.niedermann.nextcloud.deck.ui.card.CompactCardViewHolder; @@ -31,7 +27,6 @@ import it.niedermann.nextcloud.deck.ui.card.DefaultCardViewHolder; import it.niedermann.nextcloud.deck.ui.card.EditActivity; import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; -import static it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsUtil.getDueType; public class UpcomingCardsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { @@ -140,52 +135,7 @@ public class UpcomingCardsAdapter extends RecyclerView.Adapter<RecyclerView.View public void setItems(@NonNull List<UpcomingCardsAdapterItem> items) { this.items.clear(); - - final Comparator<UpcomingCardsAdapterItem> comparator = Comparator.comparing((card -> { - if (card != null && - card.getFullCard() != null && - card.getFullCard().getCard() != null && - card.getFullCard().getCard().getDueDate() != null) { - return card.getFullCard().getCard().getDueDate(); - } - return null; - }), Comparator.nullsLast(Comparator.naturalOrder())); - - comparator.thenComparing(card -> { - if (card != null && - card.getFullCard() != null && - card.getFullCard().getCard().getDueDate() != null) { - - final Card c = card.getFullCard().getCard(); - - if (c.getLastModified() == null && c.getLastModifiedLocal() != null) { - return c.getLastModifiedLocal(); - } else if (c.getLastModified() != null && c.getLastModifiedLocal() == null) { - return c.getLastModified(); - } else { - return c.getLastModifiedLocal().toEpochMilli() > c.getLastModified().toEpochMilli() ? - c.getLastModifiedLocal() : c.getLastModified(); - } - } - return null; - }, Comparator.nullsLast(Comparator.naturalOrder())); - - Collections.sort( - items, - comparator - ); - - EUpcomingDueType lastDueType = null; - for (UpcomingCardsAdapterItem filterWidgetCard : items) { - final EUpcomingDueType nextDueType = getDueType(filterWidgetCard.getFullCard().getCard().getDueDate()); - DeckLog.info(filterWidgetCard.getFullCard().getCard().getTitle() + ":", nextDueType.name()); - if (!nextDueType.equals(lastDueType)) { - this.items.add(new UpcomingCardsAdapterSectionItem(nextDueType.toString(activity))); - lastDueType = nextDueType; - } - this.items.add(filterWidgetCard); - } - + this.items.addAll(UpcomingCardsUtil.addDueDateSeparators(activity, items)); notifyDataSetChanged(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsUtil.java index 515afec78..d8c2a327c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsUtil.java @@ -1,11 +1,21 @@ package it.niedermann.nextcloud.deck.ui.upcomingcards; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.model.Card; import static java.time.temporal.ChronoUnit.DAYS; @@ -35,4 +45,58 @@ public class UpcomingCardsUtil { return EUpcomingDueType.OVERDUE; } } + + /** + * @return a {@link Collection} of the given {@param items}, separated by {@param UpcomingCardsAdapterSectionItem}. + */ + public static Collection<Object> addDueDateSeparators(@NonNull Context context, @NonNull List<UpcomingCardsAdapterItem> items) { + final Collection<Object> ret = new ArrayList<>(); + + final Comparator<UpcomingCardsAdapterItem> comparator = Comparator.comparing((card -> { + if (card != null && + card.getFullCard() != null && + card.getFullCard().getCard() != null && + card.getFullCard().getCard().getDueDate() != null) { + return card.getFullCard().getCard().getDueDate(); + } + return null; + }), Comparator.nullsLast(Comparator.naturalOrder())); + + comparator.thenComparing(card -> { + if (card != null && + card.getFullCard() != null && + card.getFullCard().getCard().getDueDate() != null) { + + final Card c = card.getFullCard().getCard(); + + if (c.getLastModified() == null && c.getLastModifiedLocal() != null) { + return c.getLastModifiedLocal(); + } else if (c.getLastModified() != null && c.getLastModifiedLocal() == null) { + return c.getLastModified(); + } else { + return c.getLastModifiedLocal().toEpochMilli() > c.getLastModified().toEpochMilli() ? + c.getLastModifiedLocal() : c.getLastModified(); + } + } + return null; + }, Comparator.nullsLast(Comparator.naturalOrder())); + + Collections.sort( + items, + comparator + ); + + EUpcomingDueType lastDueType = null; + for (UpcomingCardsAdapterItem filterWidgetCard : items) { + final EUpcomingDueType nextDueType = getDueType(filterWidgetCard.getFullCard().getCard().getDueDate()); + DeckLog.info(filterWidgetCard.getFullCard().getCard().getTitle() + ":", nextDueType.name()); + if (!nextDueType.equals(lastDueType)) { + ret.add(new UpcomingCardsAdapterSectionItem(nextDueType.toString(context))); + lastDueType = nextDueType; + } + ret.add(filterWidgetCard); + } + + return ret; + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsViewModel.java index 3e9482a57..b53e25115 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsViewModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/upcomingcards/UpcomingCardsViewModel.java @@ -9,7 +9,6 @@ import androidx.lifecycle.LiveData; import java.util.List; import java.util.stream.Collectors; -import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import static androidx.lifecycle.Transformations.map; @@ -26,7 +25,7 @@ public class UpcomingCardsViewModel extends AndroidViewModel { public LiveData<List<UpcomingCardsAdapterItem>> getUpcomingCards() { // FIXME remove mapping after https://github.com/stefan-niedermann/nextcloud-deck/issues/923 - return map(this.syncManager.getCardsForFilterWidget(new FilterWidget()), (cards) -> + return map(this.syncManager.getCardsForUpcomingCards(), (cards) -> cards.stream().filter(card -> card.getAccount() != null).collect(Collectors.toList()) ); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java index deaaf6712..6a6d8ade3 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java @@ -10,22 +10,19 @@ import android.widget.RemoteViewsService; import androidx.annotation.NonNull; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.NoSuchElementException; +import java.util.stream.Collectors; import it.niedermann.android.util.DimensionUtil; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.full.FullCard; -import it.niedermann.nextcloud.deck.model.widget.filter.dto.FilterWidgetCard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.ui.card.EditActivity; -import it.niedermann.nextcloud.deck.ui.upcomingcards.EUpcomingDueType; - -import static it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsUtil.getDueType; +import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsAdapterItem; +import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsAdapterSectionItem; +import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsUtil; public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFactory { private final Context context; @@ -53,51 +50,10 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact @Override public void onDataSetChanged() { try { - final List<FilterWidgetCard> response = syncManager.getCardsForFilterWidget(appWidgetId); + final List<UpcomingCardsAdapterItem> response = syncManager.getCardsForUpcomingCardsForWidget().stream().filter(card -> card.getAccount() != null).collect(Collectors.toList()); DeckLog.verbose(UpcomingWidgetFactory.class.getSimpleName(), "with id", appWidgetId, "fetched", response.size(), "cards from the database."); data.clear(); - final Comparator<FilterWidgetCard> comparator = Comparator.comparing((card -> { - if (card != null && - card.getCard() != null && - card.getCard().getCard() != null && - card.getCard().getCard().getDueDate() != null) { - return card.getCard().getCard().getDueDate(); - } - return null; - }), Comparator.nullsLast(Comparator.naturalOrder())); - comparator.thenComparing(card -> { - if (card != null && - card.getCard() != null && - card.getCard().getCard().getDueDate() != null) { - - Card c = card.getCard().getCard(); - - if (c.getLastModified() == null && c.getLastModifiedLocal() != null) { - return c.getLastModifiedLocal(); - } else if (c.getLastModified() != null && c.getLastModifiedLocal() == null) { - return c.getLastModified(); - } else { - return c.getLastModifiedLocal().toEpochMilli() > c.getLastModified().toEpochMilli() ? - c.getLastModifiedLocal() : c.getLastModified(); - } - } - return null; - }, Comparator.nullsLast(Comparator.naturalOrder())); - - Collections.sort( - response, - comparator - ); - EUpcomingDueType lastDueType = null; - for (FilterWidgetCard filterWidgetCard : response) { - final EUpcomingDueType nextDueType = getDueType(filterWidgetCard.getCard().getCard().getDueDate()); - DeckLog.info(filterWidgetCard.getCard().getCard().getTitle() + ":", nextDueType.name()); - if (!nextDueType.equals(lastDueType)) { - data.add(new Separator(nextDueType.toString(context))); - lastDueType = nextDueType; - } - data.add(filterWidgetCard); - } + data.addAll(UpcomingCardsUtil.addDueDateSeparators(context, response)); } catch (NoSuchElementException e) { DeckLog.error("No", UpcomingWidget.class.getSimpleName(), "for appWidgetId", appWidgetId, "found."); DeckLog.logError(e); @@ -121,17 +77,17 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact return null; } final RemoteViews widget_entry; - if (data.get(i).getClass() == Separator.class) { - final Separator separator = (Separator) data.get(i); + if (data.get(i).getClass() == UpcomingCardsAdapterSectionItem.class || data.get(i) instanceof UpcomingCardsAdapterSectionItem) { + final UpcomingCardsAdapterSectionItem separator = (UpcomingCardsAdapterSectionItem) data.get(i); widget_entry = new RemoteViews(context.getPackageName(), R.layout.widget_separator); - widget_entry.setTextViewText(R.id.widget_entry_content_tv, separator.title); - if(i == 0) { + widget_entry.setTextViewText(R.id.widget_entry_content_tv, separator.getTitle()); + if (i == 0) { widget_entry.setViewPadding(R.id.widget_entry_content_tv, headerHorizontalPadding, 0, headerHorizontalPadding, 0); } else { widget_entry.setViewPadding(R.id.widget_entry_content_tv, headerHorizontalPadding, headerVerticalPaddingNth, headerHorizontalPadding, 0); } - } else { - final FullCard card = ((FilterWidgetCard) data.get(i)).getCard(); + } else if (data.get(i).getClass() == UpcomingCardsAdapterItem.class || data.get(i) instanceof UpcomingCardsAdapterItem) { + final FullCard card = ((UpcomingCardsAdapterItem) data.get(i)).getFullCard(); widget_entry = new RemoteViews(context.getPackageName(), R.layout.widget_stack_entry); widget_entry.setTextViewText(R.id.widget_entry_content_tv, card.getCard().getTitle()); @@ -139,6 +95,9 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact final Intent intent = EditActivity.createEditCardIntent(context, syncManager.readAccountDirectly(card.getAccountId()), syncManager.getBoardLocalIdByLocalCardIdDirectly(localCardId), localCardId); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); widget_entry.setOnClickFillInIntent(R.id.widget_stack_entry, intent); + } else { + DeckLog.logError(new IllegalStateException("Expected items to be instance of " + UpcomingCardsAdapterSectionItem.class.getSimpleName() + " or " + UpcomingCardsAdapterItem.class.getSimpleName())); + return null; } return widget_entry; } @@ -162,12 +121,4 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact public boolean hasStableIds() { return true; } - - private static class Separator { - public String title; - - private Separator(String title) { - this.title = title; - } - } } |