diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-05-12 16:01:09 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-05-12 22:31:07 +0300 |
commit | 737aa7055a2d3d20704ad28a201a7d873d664595 (patch) | |
tree | 0e5a7a189049e6f88f13f2d4078bae9a6413cdc1 | |
parent | 7228d9de8c3699fb28c31fedfbf263474a80b47b (diff) |
#217 SingleCardWidget
Add database table
7 files changed, 132 insertions, 64 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/full/FullSingleCardWidgetModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/full/FullSingleCardWidgetModel.java index 5e9ff2fe7..c9786f4d2 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/full/FullSingleCardWidgetModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/full/FullSingleCardWidgetModel.java @@ -1,6 +1,7 @@ package it.niedermann.nextcloud.deck.model.full; import androidx.room.Embedded; +import androidx.room.Ignore; import androidx.room.Relation; import it.niedermann.nextcloud.deck.model.Account; @@ -11,10 +12,10 @@ public class FullSingleCardWidgetModel { @Embedded private SingleCardWidgetModel model; - @Relation(parentColumn = "localId", entityColumn = "accountId") + @Relation(parentColumn = "accountId", entityColumn = "id") private Account account; - @Relation(parentColumn = "localId", entityColumn = "cardId") + @Ignore private FullCard fullCard; public SingleCardWidgetModel getModel() { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/singlecard/SingleCardWidgetModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/singlecard/SingleCardWidgetModel.java index f96ef4266..fcaab380b 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/singlecard/SingleCardWidgetModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/singlecard/SingleCardWidgetModel.java @@ -12,9 +12,6 @@ import it.niedermann.nextcloud.deck.model.Card; @Entity( indices = { - @Index("widgetId"), - @Index("accountId"), - @Index("boardId"), @Index("cardId") }, foreignKeys = { 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 cc98490d7..2d9fdd758 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 @@ -1292,21 +1292,21 @@ public class SyncManager { * Creates a new entry in the database, if row with given widgetId does not yet exist. */ public void addOrUpdateSingleCardWidget(int widgetId, long accountId, long boardId, long localCardId) { - // TODO implement async + doAsync(() -> dataBaseAdapter.createSingleCardWidget(widgetId, accountId, boardId, localCardId)); } @WorkerThread public FullSingleCardWidgetModel getSingleCardWidgetModelDirectly(int widgetId) throws NoSuchElementException { - // TODO if widgetId not found throw NoSuchElementException - throw new NoSuchElementException(); - // TODO else grab data and put it into model, return model - // SingleCardWidgetModel model = new SingleCardWidgetModel(); - // return model; + final FullSingleCardWidgetModel model = dataBaseAdapter.getFullSingleCardWidgetModel(widgetId); + if (model == null) { + throw new NoSuchElementException(); + } + return model; } @WorkerThread public void deleteSingleCardWidgetModel(int widgetId) { - // TODO implement synchronous + dataBaseAdapter.deleteSingleCardWidget(widgetId); } private static class BooleanResultHolder { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index ae3fef8a4..577b7dbed 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.model.AccessControl; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Attachment; @@ -27,6 +28,7 @@ import it.niedermann.nextcloud.deck.model.enums.DBStatus; import it.niedermann.nextcloud.deck.model.enums.EDueType; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.model.full.FullCard; +import it.niedermann.nextcloud.deck.model.full.FullSingleCardWidgetModel; import it.niedermann.nextcloud.deck.model.full.FullStack; import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity; import it.niedermann.nextcloud.deck.model.interfaces.IRemoteEntity; @@ -34,6 +36,7 @@ import it.niedermann.nextcloud.deck.model.internal.FilterInformation; import it.niedermann.nextcloud.deck.model.ocs.Activity; import it.niedermann.nextcloud.deck.model.ocs.comment.DeckComment; import it.niedermann.nextcloud.deck.model.ocs.comment.Mention; +import it.niedermann.nextcloud.deck.model.widget.singlecard.SingleCardWidgetModel; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.widget.singlecard.SingleCardWidget; @@ -488,7 +491,10 @@ public class DataBaseAdapter { public void updateCard(Card card, boolean setStatus) { markAsEditedIfNeeded(card, setStatus); db.getCardDao().update(card); - SingleCardWidget.notifyDatasetChanged(context); + if (db.getSingleCardWidgetModelDao().containsCardLocalId(card.getLocalId())) { + DeckLog.info("Notifying widget about card changes for \"" + card.getTitle() + "\""); + SingleCardWidget.notifyDatasetChanged(context); + } } public long createAccessControl(long accountId, AccessControl entity) { @@ -812,4 +818,41 @@ public class DataBaseAdapter { public LiveData<Boolean> hasArchivedBoards(long accountId) { return LiveDataHelper.postCustomValue(distinctUntilChanged(db.getBoardDao().countArchivedBoards(accountId)), data -> data != null && data > 0); } + + + // ------------------- + // Widgets + // ------------------- + + public long createSingleCardWidget(int widgetId, long accountId, long boardLocalId, long cardLocalId) { + SingleCardWidgetModel model = new SingleCardWidgetModel(); + model.setWidgetId(widgetId); + model.setAccountId(accountId); + model.setBoardId(boardLocalId); + model.setCardId(cardLocalId); + return db.getSingleCardWidgetModelDao().insert(model); + } + + public void updateSingleCardWidget(int widgetId, long accountId, long boardLocalId, long cardLocalId) { + SingleCardWidgetModel model = new SingleCardWidgetModel(); + model.setWidgetId(widgetId); + model.setAccountId(accountId); + model.setBoardId(boardLocalId); + model.setCardId(cardLocalId); + db.getSingleCardWidgetModelDao().update(model); + } + + public FullSingleCardWidgetModel getFullSingleCardWidgetModel(int widgetId) { + FullSingleCardWidgetModel model = db.getSingleCardWidgetModelDao().getFullCardByRemoteIdDirectly(widgetId); + if (model != null) { + model.setFullCard(db.getCardDao().getFullCardByLocalIdDirectly(model.getAccount().getId(), model.getModel().getCardId())); + } + return model; + } + + public void deleteSingleCardWidget(int widgetId) { + SingleCardWidgetModel model = new SingleCardWidgetModel(); + model.setWidgetId(widgetId); + db.getSingleCardWidgetModelDao().delete(model); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java index 73ffc801d..048a5c3f1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java @@ -31,6 +31,7 @@ import it.niedermann.nextcloud.deck.model.enums.DBStatus; import it.niedermann.nextcloud.deck.model.ocs.Activity; import it.niedermann.nextcloud.deck.model.ocs.comment.DeckComment; import it.niedermann.nextcloud.deck.model.ocs.comment.Mention; +import it.niedermann.nextcloud.deck.model.widget.singlecard.SingleCardWidgetModel; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.AccessControlDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.AccountDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.ActivityDao; @@ -46,6 +47,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.JoinCardWit import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.LabelDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.MentionDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.PermissionDao; +import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.SingleCardWidgetModelDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.StackDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.UserDao; @@ -68,6 +70,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.UserDao; Activity.class, DeckComment.class, Mention.class, + SingleCardWidgetModel.class, }, exportSchema = false, version = 11 @@ -209,4 +212,6 @@ public abstract class DeckDatabase extends RoomDatabase { public abstract CommentDao getCommentDao(); public abstract MentionDao getMentionDao(); + + public abstract SingleCardWidgetModelDao getSingleCardWidgetModelDao(); }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/SingleCardWidgetModelDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/SingleCardWidgetModelDao.java new file mode 100644 index 000000000..0c2a485c1 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/SingleCardWidgetModelDao.java @@ -0,0 +1,20 @@ +package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao; + +import androidx.room.Dao; +import androidx.room.Query; +import androidx.room.Transaction; + +import it.niedermann.nextcloud.deck.model.full.FullSingleCardWidgetModel; +import it.niedermann.nextcloud.deck.model.widget.singlecard.SingleCardWidgetModel; + +@Dao +public interface SingleCardWidgetModelDao extends GenericDao<SingleCardWidgetModel> { + + @Transaction + @Query("SELECT * FROM singlecardwidgetmodel WHERE widgetId = :widgetId") + FullSingleCardWidgetModel getFullCardByRemoteIdDirectly(final int widgetId); + + @Transaction + @Query("SELECT EXISTS (SELECT 1 FROM singlecardwidgetmodel WHERE cardId = :cardLocalId)") + boolean containsCardLocalId(final Long cardLocalId); +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/singlecard/SingleCardWidget.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/singlecard/SingleCardWidget.java index 4ba5f8a01..dfc8ac275 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/singlecard/SingleCardWidget.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/singlecard/SingleCardWidget.java @@ -27,58 +27,60 @@ public class SingleCardWidget extends AppWidgetProvider { final SyncManager syncManager = new SyncManager(context); for (int appWidgetId : appWidgetIds) { - try { - final FullSingleCardWidgetModel fullModel = syncManager.getSingleCardWidgetModelDirectly(appWidgetId); - - final Intent intent = EditActivity.createEditCardIntent(context, fullModel.getAccount(), fullModel.getModel().getBoardId(), fullModel.getFullCard().getLocalId()); - final PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT); - final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_single_card); - - views.setOnClickPendingIntent(R.id.title, pendingIntent); - - views.setTextViewText(R.id.title, fullModel.getFullCard().getCard().getTitle()); - - if (fullModel.getFullCard().getCard().getDueDate() != null) { - views.setTextViewText(R.id.card_due_date, DateUtil.getRelativeDateTimeString(context, fullModel.getFullCard().getCard().getDueDate().getTime())); - // TODO Use multiple views for background colors and only set the necessary to View.VISIBLE - // https://stackoverflow.com/a/3376537 - // Because otherwise using Reflection is the only way - views.setViewVisibility(R.id.card_due_date, View.VISIBLE); - } else { - views.setViewVisibility(R.id.card_due_date, View.GONE); + new Thread(() -> { + try { + final FullSingleCardWidgetModel fullModel = syncManager.getSingleCardWidgetModelDirectly(appWidgetId); + + final Intent intent = EditActivity.createEditCardIntent(context, fullModel.getAccount(), fullModel.getModel().getBoardId(), fullModel.getFullCard().getLocalId()); + final PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT); + final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_single_card); + + views.setOnClickPendingIntent(R.id.widget_card, pendingIntent); + + views.setTextViewText(R.id.title, fullModel.getFullCard().getCard().getTitle()); + + if (fullModel.getFullCard().getCard().getDueDate() != null) { + views.setTextViewText(R.id.card_due_date, DateUtil.getRelativeDateTimeString(context, fullModel.getFullCard().getCard().getDueDate().getTime())); + // TODO Use multiple views for background colors and only set the necessary to View.VISIBLE + // https://stackoverflow.com/a/3376537 + // Because otherwise using Reflection is the only way + views.setViewVisibility(R.id.card_due_date, View.VISIBLE); + } else { + views.setViewVisibility(R.id.card_due_date, View.GONE); + } + + + final String counterMaxValue = context.getString(R.string.counter_max_value); + + final int attachmentsCount = fullModel.getFullCard().getAttachments().size(); + if (attachmentsCount == 0) { + views.setViewVisibility(R.id.card_count_attachments, View.GONE); + } else { + views.setViewVisibility(R.id.card_count_attachments, View.VISIBLE); + setupCounter(views, R.id.card_count_attachments, attachmentsCount, counterMaxValue); + } + + final int commentsCount = fullModel.getFullCard().getCommentCount(); + if (commentsCount == 0) { + views.setViewVisibility(R.id.card_count_comments, View.GONE); + } else { + setupCounter(views, R.id.card_count_comments, commentsCount, counterMaxValue); + views.setViewVisibility(R.id.card_count_comments, View.VISIBLE); + } + + final Card.TaskStatus taskStatus = fullModel.getFullCard().getCard().getTaskStatus(); + if (taskStatus.taskCount > 0) { + views.setTextViewText(R.id.card_count_tasks, context.getResources().getString(R.string.task_count, String.valueOf(taskStatus.doneCount), String.valueOf(taskStatus.taskCount))); + views.setViewVisibility(R.id.card_count_tasks, View.VISIBLE); + } else { + views.setViewVisibility(R.id.card_count_tasks, View.GONE); + } + + awm.updateAppWidget(appWidgetId, views); + } catch (NoSuchElementException e) { + // onUpdate has been triggered before the user finished configuring the widget } - - - final String counterMaxValue = context.getString(R.string.counter_max_value); - - final int attachmentsCount = fullModel.getFullCard().getAttachments().size(); - if (attachmentsCount == 0) { - views.setViewVisibility(R.id.card_count_attachments, View.GONE); - } else { - views.setViewVisibility(R.id.card_count_attachments, View.VISIBLE); - setupCounter(views, R.id.card_count_attachments, attachmentsCount, counterMaxValue); - } - - final int commentsCount = fullModel.getFullCard().getCommentCount(); - if (commentsCount == 0) { - views.setViewVisibility(R.id.card_count_comments, View.GONE); - } else { - setupCounter(views, R.id.card_count_comments, commentsCount, counterMaxValue); - views.setViewVisibility(R.id.card_count_comments, View.VISIBLE); - } - - final Card.TaskStatus taskStatus = fullModel.getFullCard().getCard().getTaskStatus(); - if (taskStatus.taskCount > 0) { - views.setTextViewText(R.id.card_count_tasks, context.getResources().getString(R.string.task_count, String.valueOf(taskStatus.doneCount), String.valueOf(taskStatus.taskCount))); - views.setViewVisibility(R.id.card_count_tasks, View.VISIBLE); - } else { - views.setViewVisibility(R.id.card_count_tasks, View.GONE); - } - - awm.updateAppWidget(appWidgetId, views); - } catch (NoSuchElementException e) { - // onUpdate has been triggered before the user finished configuring the widget - } + }).start(); } } |