diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-03-09 19:15:06 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2021-03-10 18:16:20 +0300 |
commit | 9d6a6bc1a92ef706833506b8553fe702b50a48e9 (patch) | |
tree | 7a38a92ed3206e1522a7180ec97296419ca46d6f | |
parent | 0aa214fc6078201c6bfb69fdeb6801a4c8b66bb2 (diff) |
Enhance support for file attachments (Deck 1.3.0)
Signed-off-by: Stefan Niedermann <info@niedermann.it>
10 files changed, 83 insertions, 21 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java index 1f0148b91..32e340f0f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/DeckAPI.java @@ -132,12 +132,12 @@ public interface DeckAPI { Observable<List<Attachment>> getAttachments(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId); @Multipart - @POST("boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments?type=deck_file") - Observable<Attachment> uploadAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Part MultipartBody.Part type, @Part MultipartBody.Part attachment); + @POST("boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments") + Observable<Attachment> uploadAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Part MultipartBody.Part type, @Part MultipartBody.Part attachment); @Multipart - @PUT("boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments?type=deck_file") - Observable<Attachment> updateAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Path("attachmentId") long attachmentId, @Part MultipartBody.Part type, @Part MultipartBody.Part attachment); + @PUT("boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments") + Observable<Attachment> updateAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Path("attachmentId") long attachmentId, @Part MultipartBody.Part type, @Part MultipartBody.Part attachment); @DELETE("boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}") Observable<Void> deleteAttachment(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Path("attachmentId") long attachmentId); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java index e759f27d4..791b7a4c6 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java @@ -23,6 +23,7 @@ import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.Stack; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.enums.ActivityType; +import it.niedermann.nextcloud.deck.model.enums.EAttachmentType; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.model.full.FullStack; @@ -457,7 +458,7 @@ public class JsonToEntityParser { makeTraceableIfFails(() -> { a.setId(e.get("id").getAsLong()); a.setCardId(e.get("cardId").getAsLong()); - a.setType(e.get("type").getAsString()); + a.setType(EAttachmentType.findByValue(e.get("type").getAsString())); a.setEtag(getNullAsNull(e.get("ETag"))); a.setData(e.get("data").getAsString()); a.setLastModified(getTimestampFromLong(e.get("lastModified"))); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java index 7eabcbe70..ec41d4ef7 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java @@ -8,6 +8,7 @@ import androidx.room.Index; import java.io.Serializable; import java.time.Instant; +import it.niedermann.nextcloud.deck.model.enums.EAttachmentType; import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity; @Entity(inheritSuperIndices = true, @@ -24,7 +25,8 @@ import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity; public class Attachment extends AbstractRemoteEntity implements Comparable<Attachment>, Serializable { private long cardId; - private String type = "deck_file"; + // TODO use EAttachmentType + private EAttachmentType type = EAttachmentType.DECK_FILE; private String data; private Instant createdAt; private String createdBy; @@ -48,11 +50,11 @@ public class Attachment extends AbstractRemoteEntity implements Comparable<Attac this.cardId = cardId; } - public String getType() { + public EAttachmentType getType() { return type; } - public void setType(String type) { + public void setType(EAttachmentType type) { this.type = type; } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EAttachmentType.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EAttachmentType.java new file mode 100644 index 000000000..60b43c719 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EAttachmentType.java @@ -0,0 +1,32 @@ +package it.niedermann.nextcloud.deck.model.enums; + +public enum EAttachmentType { + // Do not change values. They match the Deck server apps values. + DECK_FILE(1, "deck_file"), + FILE(2, "file"); + + private final int id; + private final String value; + + EAttachmentType(int id, String value) { + this.id = id; + this.value = value; + } + + public int getId() { + return id; + } + + public static EAttachmentType findByValue(String value) { + for (EAttachmentType s : EAttachmentType.values()) { + if (s.value.equals(value)) { + return s; + } + } + throw new IllegalArgumentException("unknown " + EAttachmentType.class.getSimpleName() + " value: " + value); + } + + public String getValue() { + return value; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java index c6b943946..91817b73e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java @@ -157,9 +157,7 @@ public class Version implements Comparable<Version> { * @see <a href="https://github.com/nextcloud/deck/pull/2638">documentation in PR</a> */ public boolean supportsFileAttachments() { - return false; -// TODO depends on https://github.com/nextcloud/deck/pull/2638 -// return isGreaterOrEqualTo(VERSION_1_3_0); + return isGreaterOrEqualTo(VERSION_1_3_0); } /** diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java index bff8ddfdb..f96ff1da0 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java @@ -24,11 +24,13 @@ import it.niedermann.nextcloud.deck.api.IResponseCallback; import it.niedermann.nextcloud.deck.api.RequestHelper; import it.niedermann.nextcloud.deck.exceptions.OfflineException; import it.niedermann.nextcloud.deck.model.AccessControl; +import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Attachment; import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.Stack; +import it.niedermann.nextcloud.deck.model.enums.EAttachmentType; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.model.full.FullStack; @@ -281,10 +283,14 @@ public class ServerAdapter { } // ## ATTACHMENTS - public void uploadAttachment(Long remoteBoardId, long remoteStackId, long remoteCardId, String contentType, File attachment, IResponseCallback<Attachment> responseCallback) { - ensureInternetConnection(); - MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", attachment.getName(), RequestBody.create(MediaType.parse(getMimeType(attachment)), attachment)); - MultipartBody.Part typePart = MultipartBody.Part.createFormData("type", null, RequestBody.create(MediaType.parse(TEXT_PLAIN), "deck_file")); + public void uploadAttachment(Long remoteBoardId, long remoteStackId, long remoteCardId, File attachment, IResponseCallback<Attachment> responseCallback) { + ensureInternetConnection(); + final Account account = responseCallback.getAccount(); + final String type = (account != null && account.getServerDeckVersionAsObject().supportsFileAttachments()) + ? EAttachmentType.FILE.getValue() + : EAttachmentType.DECK_FILE.getValue(); + final MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", attachment.getName(), RequestBody.create(MediaType.parse(getMimeType(attachment)), attachment)); + final MultipartBody.Part typePart = MultipartBody.Part.createFormData("type", null, RequestBody.create(MediaType.parse(TEXT_PLAIN), type)); RequestHelper.request(provider, () -> provider.getDeckAPI().uploadAttachment(remoteBoardId, remoteStackId, remoteCardId, typePart, filePart), responseCallback); } @@ -304,9 +310,13 @@ public class ServerAdapter { public void updateAttachment(Long remoteBoardId, long remoteStackId, long remoteCardId, long remoteAttachmentId, String contentType, Uri attachmentUri, IResponseCallback<Attachment> responseCallback) { ensureInternetConnection(); - File attachment = new File(attachmentUri.getPath()); - MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", attachment.getName(), RequestBody.create(MediaType.parse(contentType), attachment)); - MultipartBody.Part typePart = MultipartBody.Part.createFormData("type", attachment.getName(), RequestBody.create(MediaType.parse(TEXT_PLAIN), "deck_file")); + final File attachment = new File(attachmentUri.getPath()); + final Account account = responseCallback.getAccount(); + final String type = (account != null && account.getServerDeckVersionAsObject().supportsFileAttachments()) + ? EAttachmentType.FILE.getValue() + : EAttachmentType.DECK_FILE.getValue(); + final MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", attachment.getName(), RequestBody.create(MediaType.parse(contentType), attachment)); + final MultipartBody.Part typePart = MultipartBody.Part.createFormData("type", attachment.getName(), RequestBody.create(MediaType.parse(TEXT_PLAIN), type)); RequestHelper.request(provider, () -> provider.getDeckAPI().updateAttachment(remoteBoardId, remoteStackId, remoteCardId, remoteAttachmentId, typePart, filePart), responseCallback); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java index 19bc32fbe..cdf11493b 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; import androidx.room.TypeConverter; import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.model.enums.EAttachmentType; import it.niedermann.nextcloud.deck.model.enums.EDueType; import it.niedermann.nextcloud.deck.model.enums.ESortCriteria; import it.niedermann.nextcloud.deck.model.widget.filter.EWidgetType; @@ -50,4 +51,17 @@ public class EnumConverter { public static Integer fromSortCriteriaEnum(@Nullable ESortCriteria value) { return value == null ? null : value.getId(); } + + // #### EAttachmentType + @TypeConverter + @Nullable + public static EAttachmentType toEAttachmentType(@Nullable String value) { + return value == null ? null : EAttachmentType.findByValue(value); + } + + @TypeConverter + @Nullable + public static String fromEAttachmentType(@Nullable EAttachmentType value) { + return value == null ? null : value.getValue(); + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/DataPropagationHelper.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/DataPropagationHelper.java index 782b6d951..0c22466f0 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/DataPropagationHelper.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/DataPropagationHelper.java @@ -35,7 +35,7 @@ public class DataPropagationHelper { boolean connected = serverAdapter.hasInternetConnection(); if (connected) { try { - provider.createOnServer(serverAdapter, dataBaseAdapter, accountId, new IResponseCallback<T>(new Account(accountId)) { + provider.createOnServer(serverAdapter, dataBaseAdapter, accountId, new IResponseCallback<T>(callback.getAccount()) { @Override public void onResponse(T response) { new Thread(() -> { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AttachmentDataProvider.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AttachmentDataProvider.java index 781f7b1f4..4a2b2c613 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AttachmentDataProvider.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/helpers/providers/AttachmentDataProvider.java @@ -1,5 +1,6 @@ package it.niedermann.nextcloud.deck.persistence.sync.helpers.providers; +import android.annotation.SuppressLint; import android.net.Uri; import java.io.File; @@ -67,7 +68,7 @@ public class AttachmentDataProvider extends AbstractSyncDataProvider<Attachment> @Override public void createOnServer(ServerAdapter serverAdapter, DataBaseAdapter dataBaseAdapter, long accountId, IResponseCallback<Attachment> responder, Attachment entity) { File file = new File(entity.getLocalPath()); - serverAdapter.uploadAttachment(board.getId(), stack.getId(), card.getId(), entity.getType(), file, new IResponseCallback<Attachment>(responder.getAccount()) { + serverAdapter.uploadAttachment(board.getId(), stack.getId(), card.getId(), file, new IResponseCallback<Attachment>(responder.getAccount()) { @Override public void onResponse(Attachment response) { if (file.delete()) { @@ -77,6 +78,7 @@ public class AttachmentDataProvider extends AbstractSyncDataProvider<Attachment> } } + @SuppressLint("MissingSuperCall") @Override public void onError(Throwable throwable) { if (!file.delete()) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java index 041e0de11..d6d8dcb50 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java @@ -22,6 +22,7 @@ import java.io.InputStream; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Attachment; +import it.niedermann.nextcloud.deck.model.enums.EAttachmentType; import it.niedermann.nextcloud.deck.model.ocs.Version; /** @@ -39,7 +40,9 @@ public class AttachmentUtil { * the {@link Attachment} itself will be returned instead. */ public static String getThumbnailUrl(@NonNull Version version, @NonNull String accountUrl, @NonNull Long cardRemoteId, @NonNull Attachment attachment, @Px int previewSize) { - return version.supportsFileAttachments() && !TextUtils.isEmpty(String.valueOf(attachment.getFileId())) + return version.supportsFileAttachments() && + EAttachmentType.FILE.equals(attachment.getType()) && + !TextUtils.isEmpty(attachment.getFileId()) ? accountUrl + "/index.php/core/preview?fileId=" + attachment.getFileId() + "&x=" + previewSize + "&y=" + previewSize : getRemoteOrLocalUrl(accountUrl, cardRemoteId, attachment); } |