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-05-12 16:01:09 +0300
committerNiedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com>2020-05-12 22:31:07 +0300
commit737aa7055a2d3d20704ad28a201a7d873d664595 (patch)
tree0e5a7a189049e6f88f13f2d4078bae9a6413cdc1
parent7228d9de8c3699fb28c31fedfbf263474a80b47b (diff)
#217 SingleCardWidget
Add database table
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/full/FullSingleCardWidgetModel.java5
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/widget/singlecard/SingleCardWidgetModel.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java14
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java45
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java5
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/SingleCardWidgetModelDao.java20
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/singlecard/SingleCardWidget.java104
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();
}
}