diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-12-14 22:56:51 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-12-14 22:56:51 +0300 |
commit | dd9ca5945816b1ca276634730eaab149ef1808bb (patch) | |
tree | fda42139acc91da4a0668de257bdc3ef0536461f /app/src/main/java | |
parent | b8c2247c7a0dbc90eb779bff32bb7ef1b2dbd34a (diff) |
Minor refactorings
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java')
7 files changed, 93 insertions, 69 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java index c309213d2..b98ceeb91 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java @@ -7,6 +7,7 @@ import androidx.room.Index; import androidx.room.PrimaryKey; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import it.niedermann.nextcloud.deck.model.Account; @@ -37,6 +38,15 @@ public class FilterWidgetAccount { private Long accountId; private boolean includeNoUser = true; + public FilterWidgetAccount() { + // Default constructor + } + + @Ignore + public FilterWidgetAccount(Long accountId) { + this.accountId = accountId; + } + @Ignore private List<FilterWidgetBoard> boards = new ArrayList<>(); @@ -59,6 +69,11 @@ public class FilterWidgetAccount { this.users = users; } + @Ignore + public void setUsers(FilterWidgetUser user) { + this.users = Collections.singletonList(user); + } + public Long getId() { return id; } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetUser.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetUser.java index 003fd84f3..9fd69aa85 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetUser.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetUser.java @@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.model.widget.filter; import androidx.room.Entity; import androidx.room.ForeignKey; +import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; @@ -32,6 +33,15 @@ public class FilterWidgetUser { private Long filterAccountId; private Long userId; + public FilterWidgetUser() { + // Default constructor + } + + @Ignore + public FilterWidgetUser(Long userId) { + this.userId = userId; + } + public Long getId() { return id; } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/dto/FilterWidgetCard.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/dto/FilterWidgetCard.java index 24e5e6a21..2aaebb129 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/dto/FilterWidgetCard.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/dto/FilterWidgetCard.java @@ -10,6 +10,7 @@ public class FilterWidgetCard { private Board board; public FilterWidgetCard() { + // Default constructor } public FilterWidgetCard(FullCard card, Stack stack, Board board) { 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 99899db63..a802aec90 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 @@ -61,7 +61,6 @@ import it.niedermann.nextcloud.deck.model.ocs.comment.DeckComment; import it.niedermann.nextcloud.deck.model.ocs.comment.OcsComment; import it.niedermann.nextcloud.deck.model.ocs.comment.full.FullDeckComment; import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProjectResource; -import it.niedermann.nextcloud.deck.model.widget.filter.EWidgetType; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; import it.niedermann.nextcloud.deck.model.widget.filter.dto.FilterWidgetCard; import it.niedermann.nextcloud.deck.persistence.sync.adapters.ServerAdapter; @@ -1989,10 +1988,6 @@ public class SyncManager { }); } - public List<Integer> getFilterWidgetIDsByType(EWidgetType type) { - return dataBaseAdapter.getFilterWidgetIDsByType(type); - } - public boolean filterWidgetExists(int id) { return dataBaseAdapter.filterWidgetExists(id); } 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 919ee7431..398786dd3 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 @@ -64,14 +64,15 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHe import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.widget.singlecard.SingleCardWidget; import it.niedermann.nextcloud.deck.ui.widget.stack.StackWidget; +import it.niedermann.nextcloud.deck.ui.widget.upcoming.UpcomingWidget; import static androidx.lifecycle.Transformations.distinctUntilChanged; public class DataBaseAdapter { - private DeckDatabase db; + private final DeckDatabase db; @NonNull - private Context context; + private final Context context; public DataBaseAdapter(@NonNull Context applicationContext) { this.context = applicationContext; @@ -357,8 +358,6 @@ public class DataBaseAdapter { join.setStatus(status.getId()); db.getJoinCardWithLabelDao().insert(join); } - - } public void deleteJoinedLabelsForCard(long localCardId) { @@ -456,13 +455,21 @@ public class DataBaseAdapter { public WrappedLiveData<Account> createAccount(Account account) { return LiveDataHelper.wrapInLiveData(() -> { long id = db.getAccountDao().insert(account); - // TODO Add account to UpcomingWidgets + new Thread(() -> { + DeckLog.verbose("Adding new created account " + id + " to all instances of " + EWidgetType.UPCOMING_WIDGET.name()); + for (FilterWidget widget : getFilterWidgetsByType(EWidgetType.UPCOMING_WIDGET)) { + widget.getAccounts().add(new FilterWidgetAccount(id)); + updateFilterWidgetDirectly(widget); + } + UpcomingWidget.notifyDatasetChanged(context); + }).start(); return readAccountDirectly(id); }); } public void deleteAccount(long id) { db.getAccountDao().deleteById(id); + notifyAllWidgets(); } public void updateAccount(Account account) { @@ -520,10 +527,12 @@ public class DataBaseAdapter { public void deleteBoard(Board board, boolean setStatus) { markAsDeletedIfNeeded(board, setStatus); db.getBoardDao().update(board); + notifyAllWidgets(); } public void deleteBoardPhysically(Board board) { db.getBoardDao().delete(board); + notifyAllWidgets(); } public void updateBoard(Board board, boolean setStatus) { @@ -555,11 +564,13 @@ public class DataBaseAdapter { public void deleteStack(Stack stack, boolean setStatus) { markAsDeletedIfNeeded(stack, setStatus); db.getStackDao().update(stack); + notifyAllWidgets(); } @WorkerThread public void deleteStackPhysically(Stack stack) { db.getStackDao().delete(stack); + notifyAllWidgets(); } @WorkerThread @@ -643,6 +654,8 @@ public class DataBaseAdapter { DeckLog.info("Notifying " + SingleCardWidget.class.getSimpleName() + " about card changes for \"" + card.getTitle() + "\""); SingleCardWidget.notifyDatasetChanged(context); } + // TODO check if necessary + UpcomingWidget.notifyDatasetChanged(context); notifyStackWidgetsIfNeeded(card.getTitle(), card.getStackId(), originalStackLocalId); } @@ -1213,16 +1226,12 @@ public class DataBaseAdapter { board = db.getBoardDao().getBoardByLocalIdDirectly(stackId); boardCache.put(stackId, board); } - FilterWidgetCard filterWidgetCard = new FilterWidgetCard(); - filterWidgetCard.setCard(fullCard); - filterWidgetCard.setBoard(board); - filterWidgetCard.setStack(stack); - result.add(filterWidgetCard); + result.add(new FilterWidgetCard(fullCard, stack, board)); } return result; } - public List<FilterWidget> getFilterWidgetIDsByType(EWidgetType type) { + public List<FilterWidget> getFilterWidgetsByType(EWidgetType type) { List<Integer> ids = db.getFilterWidgetDao().getFilterWidgetIdsByType(type.getId()); List<FilterWidget> widgets = new ArrayList<>(ids.size()); for (Integer id : ids) { @@ -1306,4 +1315,10 @@ public class DataBaseAdapter { } } } + + private void notifyAllWidgets() { + SingleCardWidget.notifyDatasetChanged(context); + StackWidget.notifyDatasetChanged(context); + UpcomingWidget.notifyDatasetChanged(context); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java index 22e338298..bdf76df68 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java @@ -9,9 +9,9 @@ import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; -import java.util.Collections; +import androidx.annotation.NonNull; + import java.util.List; -import java.util.NoSuchElementException; import java.util.stream.Collectors; import it.niedermann.nextcloud.deck.DeckLog; @@ -22,7 +22,6 @@ import it.niedermann.nextcloud.deck.model.widget.filter.EWidgetType; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; -import it.niedermann.nextcloud.deck.model.widget.filter.dto.FilterWidgetCard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.ui.MainActivity; import it.niedermann.nextcloud.deck.ui.card.EditActivity; @@ -34,44 +33,6 @@ public class UpcomingWidget extends AppWidgetProvider { private static final int PENDING_INTENT_OPEN_APP_RQ = 0; private static final int PENDING_INTENT_EDIT_CARD_RQ = 1; - static void updateAppWidget(Context context, AppWidgetManager awm, int[] appWidgetIds) { - final SyncManager syncManager = new SyncManager(context); - - for (int appWidgetId : appWidgetIds) { - new Thread(() -> { - try { - syncManager.getCardsForFilterWidget(appWidgetId, new IResponseCallback<List<FilterWidgetCard>>(null) { - @Override - public void onResponse(List<FilterWidgetCard> response) { - - final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_upcoming); - - final Intent serviceIntent = new Intent(context, UpcomingWidgetService.class); - serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); - - final Intent intent = new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(context.getPackageName(), MainActivity.class.getName())); - final PendingIntent pendingIntent = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_APP_RQ, intent, PendingIntent.FLAG_UPDATE_CURRENT); - final PendingIntent templatePI = PendingIntent.getActivity(context, PENDING_INTENT_EDIT_CARD_RQ, - new Intent(context, EditActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); - - views.setOnClickPendingIntent(R.id.widget_upcoming_header_rl, pendingIntent); - views.setPendingIntentTemplate(R.id.upcoming_widget_lv, templatePI); - views.setRemoteAdapter(R.id.upcoming_widget_lv, serviceIntent); - views.setEmptyView(R.id.upcoming_widget_lv, R.id.widget_upcoming_placeholder_iv); - - awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.upcoming_widget_lv); - awm.updateAppWidget(appWidgetId, views); - } - }); - } catch (NoSuchElementException e) { - // onUpdate has been triggered before the user finished configuring the widget - DeckLog.warn("Caught " + NoSuchElementException.class.getSimpleName() + " for " + UpcomingWidget.class.getSimpleName() + " with ID " + appWidgetId); - } - }).start(); - } - } - @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); @@ -80,7 +41,7 @@ public class UpcomingWidget extends AppWidgetProvider { for (int appWidgetId : appWidgetIds) { new Thread(() -> { if (syncManager.filterWidgetExists(appWidgetId)) { - DeckLog.verbose(UpcomingWidget.class.getSimpleName() + "with id " + appWidgetId + " already exists, update instead."); + DeckLog.warn(UpcomingWidget.class.getSimpleName() + "with id " + appWidgetId + " already exists, perform update instead."); updateAppWidget(context, appWidgetManager, appWidgetIds); } else { final List<Account> accountsList = syncManager.readAccountsDirectly(); @@ -88,22 +49,20 @@ public class UpcomingWidget extends AppWidgetProvider { config.setWidgetType(EWidgetType.UPCOMING_WIDGET); config.setId(appWidgetId); config.setAccounts(accountsList.stream().map(account -> { - final FilterWidgetAccount fwa = new FilterWidgetAccount(); - fwa.setAccountId(account.getId()); - final FilterWidgetUser fwu = new FilterWidgetUser(); - fwu.setUserId(syncManager.getUserByUidDirectly(account.getId(), account.getUserName()).getId()); - fwa.setUsers(Collections.singletonList(fwu)); + final FilterWidgetAccount fwa = new FilterWidgetAccount(account.getId()); + fwa.setUsers(new FilterWidgetUser(syncManager.getUserByUidDirectly(account.getId(), account.getUserName()).getId())); return fwa; }).collect(Collectors.toList())); syncManager.createFilterWidget(config, new IResponseCallback<Integer>(null) { @Override public void onResponse(Integer response) { - DeckLog.verbose("Created " + UpcomingWidget.class.getSimpleName() + "with id " + appWidgetId); + DeckLog.verbose("Successfully created " + UpcomingWidget.class.getSimpleName() + "with id " + appWidgetId); updateAppWidget(context, appWidgetManager, appWidgetIds); } @Override public void onError(Throwable throwable) { + DeckLog.error("Error while creating " + UpcomingWidget.class.getSimpleName() + "with id " + appWidgetId); super.onError(throwable); onDeleted(context, appWidgetIds); } @@ -124,9 +83,12 @@ public class UpcomingWidget extends AppWidgetProvider { if (intent.hasExtra(BUNDLE_KEY)) { if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) { if (intent.getExtras() != null) { - updateAppWidget(context, awm, new int[]{intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)}); + int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); + DeckLog.verbose(ACTION_APPWIDGET_UPDATE + " for " + UpcomingWidget.class.getSimpleName() + " with id " + appWidgetId + ", perform update."); + updateAppWidget(context, awm, new int[]{appWidgetId}); } } else { + DeckLog.warn(ACTION_APPWIDGET_UPDATE + " for " + UpcomingWidget.class.getSimpleName() + " without id, perform update for all widgets of this type."); updateAppWidget(context, awm, awm.getAppWidgetIds(new ComponentName(context, UpcomingWidget.class))); } } @@ -140,15 +102,41 @@ public class UpcomingWidget extends AppWidgetProvider { final SyncManager syncManager = new SyncManager(context); for (int appWidgetId : appWidgetIds) { + DeckLog.info("Delete " + UpcomingWidget.class.getSimpleName() + " with id " + appWidgetId); syncManager.deleteFilterWidget(appWidgetId, new IResponseCallback<Boolean>(null) { @Override public void onResponse(Boolean response) { - + DeckLog.verbose("Successfully deleted " + UpcomingWidget.class.getSimpleName() + " with id " + appWidgetId); } }); } } + private static void updateAppWidget(@NonNull Context context, @NonNull AppWidgetManager awm, int[] appWidgetIds) { + for (int appWidgetId : appWidgetIds) { + new Thread(() -> { + final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_upcoming); + + final Intent serviceIntent = new Intent(context, UpcomingWidgetService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + final Intent intent = new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(context.getPackageName(), MainActivity.class.getName())); + final PendingIntent pendingIntent = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_APP_RQ, intent, PendingIntent.FLAG_UPDATE_CURRENT); + final PendingIntent templatePI = PendingIntent.getActivity(context, PENDING_INTENT_EDIT_CARD_RQ, + new Intent(context, EditActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + + views.setOnClickPendingIntent(R.id.widget_upcoming_header_rl, pendingIntent); + views.setPendingIntentTemplate(R.id.upcoming_widget_lv, templatePI); + views.setRemoteAdapter(R.id.upcoming_widget_lv, serviceIntent); + views.setEmptyView(R.id.upcoming_widget_lv, R.id.widget_upcoming_placeholder_iv); + + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.upcoming_widget_lv); + awm.updateAppWidget(appWidgetId, views); + }).start(); + } + } + /** * Updates UI data of all {@link UpcomingWidget} instances */ 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 b871f811f..b54cfed69 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 @@ -45,7 +45,7 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact syncManager.getCardsForFilterWidget(appWidgetId, new IResponseCallback<List<FilterWidgetCard>>(null) { @Override public void onResponse(List<FilterWidgetCard> response) { - DeckLog.log("Result: " + response.size()); + DeckLog.verbose(UpcomingWidgetFactory.class.getSimpleName() + " with id " + appWidgetId + " fetched " + response.size() + " cards from the database."); data.clear(); Collections.sort(response, (card1, card2) -> { if (card1 == null || card1.getCard() == null || card1.getCard().getCard().getDueDate() == null) { @@ -128,8 +128,8 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact } private void notifyAppWidgetUpdate(RemoteViews views) { - AppWidgetManager awm = AppWidgetManager.getInstance(context); - int[] appWidgetIds = awm.getAppWidgetIds(new ComponentName(context, UpcomingWidget.class)); + final AppWidgetManager awm = AppWidgetManager.getInstance(context); + final int[] appWidgetIds = awm.getAppWidgetIds(new ComponentName(context, UpcomingWidget.class)); awm.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.upcoming_widget_lv); awm.updateAppWidget(appWidgetId, views); } |