From 46e60a7e7e465b59e38d409634bb2e00b988e650 Mon Sep 17 00:00:00 2001 From: desperateCoder Date: Sat, 27 Jun 2020 22:59:55 +0200 Subject: #498 implemented readAccountsForHostWithReadAccessToBoard() --- .../deck/persistence/sync/SyncManager.java | 20 +++++++++++++- .../sync/adapters/db/DataBaseAdapter.java | 8 ++++++ .../sync/adapters/db/dao/AccountDao.java | 6 ++++ .../partial/BoardWitAclDownSyncDataProvider.java | 32 ++++++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/partial/BoardWitAclDownSyncDataProvider.java (limited to 'app/src') 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 59de21fe3..e42fcbd0e 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 @@ -8,6 +8,7 @@ import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import androidx.core.util.Pair; import androidx.lifecycle.LiveData; +import androidx.lifecycle.MediatorLiveData; import androidx.lifecycle.MutableLiveData; import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; @@ -61,6 +62,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.CardPropa import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.DeckCommentsDataProvider; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.LabelDataProvider; import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.StackDataProvider; +import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.partial.BoardWitAclDownSyncDataProvider; import it.niedermann.nextcloud.deck.util.DateUtil; import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; @@ -304,7 +306,23 @@ public class SyncManager { * - and have the permission to read the board with the given {@param boardRemoteId} (aka the {@link Board} is shared with this {@link User}). */ public LiveData> readAccountsForHostWithReadAccessToBoard(String host, long boardRemoteId) { - throw new UnsupportedOperationException("Not yet implemented"); + MediatorLiveData> liveData = new MediatorLiveData<>(); + liveData.addSource(dataBaseAdapter.readAccountsForHostWithReadAccessToBoard(host, boardRemoteId), accounts -> { + liveData.postValue(accounts); + doAsync(() -> { + for (Account account : accounts) { + new SyncHelper(serverAdapter, dataBaseAdapter, null) + .setResponseCallback(new IResponseCallback(account) { + @Override + public void onResponse(Boolean response) { + liveData.postValue(dataBaseAdapter.readAccountsForHostWithReadAccessToBoardDirectly(host, boardRemoteId)); + } + }).doSyncFor(new BoardWitAclDownSyncDataProvider()); + } + }); + }); + + return liveData; } public void refreshCapabilities(IResponseCallback callback) { 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 4c0366c93..0b36922dd 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 @@ -869,4 +869,12 @@ public class DataBaseAdapter { model.setWidgetId(widgetId); db.getSingleCardWidgetModelDao().delete(model); } + + public LiveData> readAccountsForHostWithReadAccessToBoard(String host, long boardRemoteId) { + return db.getAccountDao().readAccountsForHostWithReadAccessToBoard("%"+host+"%", boardRemoteId); + } + + public List readAccountsForHostWithReadAccessToBoardDirectly(String host, long boardRemoteId) { + return db.getAccountDao().readAccountsForHostWithReadAccessToBoardDirectly("%"+host+"%", boardRemoteId); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java index 515ecc0a4..6ebe4a8f3 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java @@ -36,4 +36,10 @@ public interface AccountDao extends GenericDao { @Query("SELECT * from account") List getAllAccountsDirectly(); + + @Query("SELECT * from account a where a.url like :hostLike and exists (select 1 from board b where b.id = :boardRemoteId and a.id = b.accountId)") + LiveData> readAccountsForHostWithReadAccessToBoard(String hostLike, long boardRemoteId); + + @Query("SELECT * from account a where a.url like :hostLike and exists (select 1 from board b where b.id = :boardRemoteId and a.id = b.accountId)") + List readAccountsForHostWithReadAccessToBoardDirectly(String hostLike, long boardRemoteId); } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/partial/BoardWitAclDownSyncDataProvider.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/partial/BoardWitAclDownSyncDataProvider.java new file mode 100644 index 000000000..326d257ab --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/partial/BoardWitAclDownSyncDataProvider.java @@ -0,0 +1,32 @@ +package it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.partial; + +import java.util.List; + +import it.niedermann.nextcloud.deck.api.IResponseCallback; +import it.niedermann.nextcloud.deck.model.AccessControl; +import it.niedermann.nextcloud.deck.model.full.FullBoard; +import it.niedermann.nextcloud.deck.persistence.sync.adapters.ServerAdapter; +import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.DataBaseAdapter; +import it.niedermann.nextcloud.deck.persistence.sync.helpers.SyncHelper; +import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.AccessControlDataProvider; +import it.niedermann.nextcloud.deck.persistence.sync.helpers.providers.BoardDataProvider; + +public class BoardWitAclDownSyncDataProvider extends BoardDataProvider { + + @Override + public void goDeeper(SyncHelper syncHelper, FullBoard existingEntity, FullBoard entityFromServer, IResponseCallback callback) { + + List acl = entityFromServer.getParticipants(); + if (acl != null && !acl.isEmpty()){ + for (AccessControl ac : acl){ + ac.setBoardId(existingEntity.getLocalId()); + } + syncHelper.doSyncFor(new AccessControlDataProvider(this, existingEntity, acl)); + } + } + + @Override + public void goDeeperForUpSync(SyncHelper syncHelper, ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, IResponseCallback callback) { + // do nothing! + } +} -- cgit v1.2.3 From 4a958c29ec5e846cb21b9f7978e548913d1e6067 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 27 Jun 2020 23:00:17 +0200 Subject: #560 Discussion: Use @WorkerThread instead of ...Directly convention --- .../deck/persistence/sync/SyncManager.java | 66 +++++++++++++++++++++- .../sync/adapters/db/DataBaseAdapter.java | 42 ++++++++++++-- 2 files changed, 99 insertions(+), 9 deletions(-) (limited to 'app/src') 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 e42fcbd0e..a75790413 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 @@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.persistence.sync; import android.content.Context; import android.database.sqlite.SQLiteConstraintException; +import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; @@ -77,10 +78,12 @@ public class SyncManager { @NonNull private ServerAdapter serverAdapter; + @AnyThread public SyncManager(@NonNull Context context) { this(context, null); } + @AnyThread public SyncManager(@NonNull Context context, @Nullable String ssoAccountName) { appContext = context.getApplicationContext(); LastSyncUtil.init(appContext); @@ -88,10 +91,12 @@ public class SyncManager { this.serverAdapter = new ServerAdapter(appContext, ssoAccountName); } + @AnyThread private void doAsync(Runnable r) { new Thread(r).start(); } + @AnyThread public MutableLiveData synchronizeCardByRemoteId(long cardRemoteId, Account account) { MutableLiveData liveData = new MutableLiveData<>(); doAsync(() -> { @@ -118,10 +123,12 @@ public class SyncManager { } // TODO if the card does not exist yet, try to synchronize it first, instead of directly returning null. If sync failed, return null. + @AnyThread public LiveData getLocalBoardIdByCardRemoteIdAndAccount(long cardRemoteId, Account account) { return dataBaseAdapter.getLocalBoardIdByCardRemoteIdAndAccountId(cardRemoteId, account.getId()); } + @AnyThread public boolean synchronizeEverything() { List accounts = dataBaseAdapter.getAllAccountsDirectly(); if (accounts.size() > 0) { @@ -154,6 +161,7 @@ public class SyncManager { return true; } + @AnyThread public void synchronize(IResponseCallback responseCallback) { if (responseCallback == null || responseCallback.getAccount() == null || @@ -258,10 +266,12 @@ public class SyncManager { // return remoteEntity; // } + @AnyThread public LiveData hasAccounts() { return dataBaseAdapter.hasAccounts(); } + @AnyThread public WrappedLiveData createAccount(Account accout) { return dataBaseAdapter.createAccount(accout); } @@ -281,14 +291,17 @@ public class SyncManager { dataBaseAdapter.updateAccount(account); } + @AnyThread public LiveData readAccount(long id) { return dataBaseAdapter.readAccount(id); } + @AnyThread public LiveData readAccount(String name) { return dataBaseAdapter.readAccount(name); } + @AnyThread public LiveData> readAccounts() { return dataBaseAdapter.readAccounts(); } @@ -305,6 +318,7 @@ public class SyncManager { * - located at the given {@param host} * - and have the permission to read the board with the given {@param boardRemoteId} (aka the {@link Board} is shared with this {@link User}). */ + @AnyThread public LiveData> readAccountsForHostWithReadAccessToBoard(String host, long boardRemoteId) { MediatorLiveData> liveData = new MediatorLiveData<>(); liveData.addSource(dataBaseAdapter.readAccountsForHostWithReadAccessToBoard(host, boardRemoteId), accounts -> { @@ -325,6 +339,7 @@ public class SyncManager { return liveData; } + @AnyThread public void refreshCapabilities(IResponseCallback callback) { doAsync(() -> { try { @@ -392,6 +407,7 @@ public class SyncManager { * @param archived Decides whether only archived or not-archived boards for the specified account will be returned * @return all archived or non-archived Boards depending on archived parameter */ + @AnyThread public LiveData> getBoards(long accountId, boolean archived) { return dataBaseAdapter.getBoards(accountId, archived); } @@ -401,6 +417,7 @@ public class SyncManager { * @param archived Decides whether only archived or not-archived boards for the specified account will be returned * @return all archived or non-archived FullBoards depending on archived parameter */ + @AnyThread public LiveData> getFullBoards(long accountId, boolean archived) { return dataBaseAdapter.getFullBoards(accountId, archived); } @@ -411,14 +428,17 @@ public class SyncManager { * @param accountId ID of the account * @return all non-archived Boards with edit permission */ + @AnyThread public LiveData> getBoardsWithEditPermission(long accountId) { return dataBaseAdapter.getBoardsWithEditPermission(accountId); } + @AnyThread public LiveData hasArchivedBoards(long accountId) { return dataBaseAdapter.hasArchivedBoards(accountId); } + @AnyThread public LiveData createBoard(long accountId, Board board) { MutableLiveData liveData = new MutableLiveData<>(); doAsync(() -> { @@ -450,10 +470,12 @@ public class SyncManager { * Owner of the target {@link Board} will be the {@link User} with the {@link Account} of {@param targetAccountId}. * Does not clone any {@link Card} or {@link AccessControl} from the origin {@link Board}. */ + @AnyThread public LiveData cloneBoard(long originAccountId, long originBoardLocalId, long targetAccountId, String targetBoardTitle, String targetBoardColor) { throw new UnsupportedOperationException("Not yet implemented"); } + @AnyThread public LiveData> syncActivitiesForCard(Card card) { doAsync(() -> { if (serverAdapter.hasInternetConnection()) { @@ -473,6 +495,7 @@ public class SyncManager { return dataBaseAdapter.getActivitiesForCard(card.getLocalId()); } + @AnyThread public void addCommentToCard(long accountId, long cardId, DeckComment comment) { doAsync(() -> { Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); @@ -487,6 +510,7 @@ public class SyncManager { }); } + @AnyThread public void updateComment(long accountId, long localCardId, long localCommentId, String comment) { doAsync(() -> { Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); @@ -503,6 +527,7 @@ public class SyncManager { }); } + @AnyThread public WrappedLiveData deleteComment(long accountId, long localCardId, long localCommentId) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -520,6 +545,7 @@ public class SyncManager { return dataBaseAdapter.getFullCommentsForLocalCardId(localCardId); } + @AnyThread public WrappedLiveData deleteBoard(Board board) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -531,6 +557,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData updateBoard(FullBoard board) { WrappedLiveData liveData = new WrappedLiveData<>(); long accountId = board.getAccountId(); @@ -559,6 +586,7 @@ public class SyncManager { return dataBaseAdapter.getStack(accountId, localStackId); } + @AnyThread public WrappedLiveData createAccessControl(long accountId, AccessControl entity) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -575,6 +603,7 @@ public class SyncManager { return liveData; } + @WorkerThread public AccessControl getAccessControlByRemoteIdDirectly(long accountId, Long id) { return dataBaseAdapter.getAccessControlByRemoteIdDirectly(accountId, id); } @@ -583,6 +612,7 @@ public class SyncManager { return dataBaseAdapter.getAccessControlByLocalBoardId(accountId, id); } + @AnyThread public WrappedLiveData updateAccessControl(AccessControl entity) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -594,6 +624,7 @@ public class SyncManager { return liveData; } + @AnyThread private IResponseCallback getCallbackToLiveDataConverter(Account account, WrappedLiveData liveData) { return new IResponseCallback(account) { @Override @@ -608,6 +639,7 @@ public class SyncManager { }; } + @AnyThread public WrappedLiveData deleteAccessControl(AccessControl entity) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -637,7 +669,7 @@ public class SyncManager { return dataBaseAdapter.getFullBoardById(accountId, localId); } - + @AnyThread public WrappedLiveData createStack(long accountId, Stack stack) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -654,6 +686,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData deleteStack(long accountId, long stackLocalId, long boardLocalId) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -665,6 +698,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData updateStack(FullStack stack) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -676,6 +710,7 @@ public class SyncManager { } + @AnyThread private void updateStack(@NonNull Account account, @NonNull FullBoard board, @NonNull FullStack stack, @Nullable WrappedLiveData liveData) { doAsync(() -> { new DataPropagationHelper(serverAdapter, dataBaseAdapter).updateEntity(new StackDataProvider(null, board), stack, new IResponseCallback(account) { @@ -701,6 +736,7 @@ public class SyncManager { * * @param stackLocalIds The first item of the pair will be updated first */ + @AnyThread public void swapStackOrder(long accountId, long boardLocalId, @NonNull Pair stackLocalIds) { if (stackLocalIds.first == null || stackLocalIds.second == null) { throw new IllegalArgumentException("Given stackLocalIds must not be null"); @@ -771,8 +807,8 @@ public class SyncManager { // return liveData; // } + @AnyThread public LiveData createFullCard(long accountId, long localBoardId, long localStackId, FullCard card) { - MutableLiveData liveData = new MutableLiveData<>(); doAsync(() -> { Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); @@ -820,6 +856,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData deleteCard(Card card) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -835,6 +872,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData archiveCard(FullCard card) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -851,6 +889,7 @@ public class SyncManager { new DataPropagationHelper(serverAdapter, dataBaseAdapter).updateEntity(new CardDataProvider(null, board, stack), card, callback); } + @AnyThread public WrappedLiveData dearchiveCard(FullCard card) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -863,6 +902,7 @@ public class SyncManager { return liveData; } + @AnyThread public WrappedLiveData archiveCardsInStack(long accountId, long stackLocalId) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -900,6 +940,7 @@ public class SyncManager { return liveData; } + @AnyThread public void archiveBoard(Board board) { doAsync(() -> { FullBoard b = dataBaseAdapter.getFullBoardByLocalIdDirectly(board.getAccountId(), board.getLocalId()); @@ -908,6 +949,7 @@ public class SyncManager { }); } + @AnyThread public void dearchiveBoard(Board board) { doAsync(() -> { FullBoard b = dataBaseAdapter.getFullBoardByLocalIdDirectly(board.getAccountId(), board.getLocalId()); @@ -916,6 +958,7 @@ public class SyncManager { }); } + @AnyThread public WrappedLiveData updateCard(FullCard card) { WrappedLiveData liveData = new WrappedLiveData<>(); doAsync(() -> { @@ -989,10 +1032,12 @@ public class SyncManager { * https://github.com/stefan-niedermann/nextcloud-deck/issues/453 */ @SuppressWarnings("JavadocReference") + @AnyThread public WrappedLiveData moveCard(long originAccountId, long originCardLocalId, long targetAccountId, long targetBoardLocalId, long targetStackLocalId) { throw new UnsupportedOperationException("Not yet implemented"); } + @AnyThread public WrappedLiveData