diff options
author | Stefan Niedermann <info@niedermann.it> | 2024-01-21 15:21:53 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2024-01-21 15:21:53 +0300 |
commit | 19fbf6f00df82ef075daf7c575d3bba002ba8ff7 (patch) | |
tree | 1abd850c199c88edda739999bd5c8858be323de8 /app/src | |
parent | 397be5e18af27cfa6e82ae97011429f3e0090884 (diff) |
feat(attachment): Open file attachments in Nextcloud Files app
Refs: #1561
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src')
3 files changed, 36 insertions, 7 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentAdapter.java index 57fe8d1e3..3a1ebff15 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentAdapter.java @@ -2,7 +2,7 @@ package it.niedermann.nextcloud.deck.ui.card.attachments; import static androidx.lifecycle.Transformations.distinctUntilChanged; import static androidx.recyclerview.widget.RecyclerView.NO_ID; -import static it.niedermann.nextcloud.deck.util.AttachmentUtil.openAttachmentInBrowser; +import static it.niedermann.nextcloud.deck.util.AttachmentUtil.openAttachment; import android.app.Activity; import android.view.LayoutInflater; @@ -112,7 +112,7 @@ public class CardAttachmentAdapter extends RecyclerView.Adapter<AttachmentViewHo } case VIEW_TYPE_DEFAULT: default: { - onClickListener = (event) -> openAttachmentInBrowser(account, context, cardRemoteId, attachment); + onClickListener = (event) -> openAttachment(account, context, cardRemoteId, attachment); break; } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/DefaultAttachmentViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/DefaultAttachmentViewHolder.java index 21f858218..505fdf335 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/DefaultAttachmentViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/DefaultAttachmentViewHolder.java @@ -1,7 +1,7 @@ package it.niedermann.nextcloud.deck.ui.card.attachments; import static it.niedermann.nextcloud.deck.util.AttachmentUtil.getIconForMimeType; -import static it.niedermann.nextcloud.deck.util.AttachmentUtil.openAttachmentInBrowser; +import static it.niedermann.nextcloud.deck.util.AttachmentUtil.openAttachment; import android.text.format.Formatter; import android.view.MenuInflater; @@ -40,7 +40,7 @@ public class DefaultAttachmentViewHolder extends AttachmentViewHolder { public void bind(@NonNull Account account, @NonNull MenuInflater menuInflater, @NonNull FragmentManager fragmentManager, Long cardRemoteId, Attachment attachment, @Nullable View.OnClickListener onClickListener, @ColorInt int color) { super.bind(account, menuInflater, fragmentManager, cardRemoteId, attachment, onClickListener, color); getPreview().setImageResource(getIconForMimeType(attachment.getMimetype())); - itemView.setOnClickListener((event) -> openAttachmentInBrowser(account, itemView.getContext(), cardRemoteId, attachment)); + itemView.setOnClickListener((event) -> openAttachment(account, itemView.getContext(), cardRemoteId, attachment)); binding.filename.setText(attachment.getBasename()); binding.filesize.setText(Formatter.formatFileSize(binding.filesize.getContext(), attachment.getFilesize())); if (attachment.getLastModifiedLocal() != null) { 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 aba73a11e..a9c25dcf7 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 @@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.util; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.text.TextUtils; import android.widget.Toast; @@ -11,6 +12,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.Px; +import com.nextcloud.android.sso.model.FilesAppType; + +import java.util.Optional; + import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Account; @@ -57,23 +62,47 @@ public class AttachmentUtil { } /** - * Tries to open the given {@link Attachment} in web browser. Displays a toast on failure. + * Tries to open the given {@link Attachment} in the Nextcloud Android app with a fallback to the web browser. + * Displays a toast on failure. */ - public static void openAttachmentInBrowser(@NonNull Account account, @NonNull Context context, Long cardRemoteId, Attachment attachment) { + public static void openAttachment(@NonNull Account account, @NonNull Context context, @Nullable Long cardRemoteId, Attachment attachment) { if (cardRemoteId == null) { Toast.makeText(context, R.string.card_does_not_yet_exist, Toast.LENGTH_LONG).show(); DeckLog.logError(new IllegalArgumentException("cardRemoteId must not be null.")); return; } + final var intent = generateNextcloudFilesIntent(context.getPackageManager(), account, attachment) + .orElse(generateBrowserIntent(account, cardRemoteId, attachment)); + try { - context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(getCopyDownloadUrl(account, cardRemoteId, attachment)))); + context.startActivity(intent); } catch (IllegalArgumentException e) { Toast.makeText(context, R.string.attachment_does_not_yet_exist, Toast.LENGTH_LONG).show(); DeckLog.logError(new IllegalArgumentException("attachmentRemoteId must not be null.")); } } + private static Optional<Intent> generateNextcloudFilesIntent(@NonNull PackageManager packageManager, @NonNull Account account, Attachment attachment) { + for (final var type : FilesAppType.values()) { + final var intent = new Intent(Intent.ACTION_VIEW) + .setClassName(type.packageId, "com.owncloud.android.ui.activity.FileDisplayActivity") + .putExtra("KEY_FILE_ID", String.valueOf(attachment.getFileId())) + .putExtra("KEY_ACCOUNT", account.getName()); + + if (packageManager.resolveActivity(intent, 0) != null) { + return Optional.of(intent); + } + } + + return Optional.empty(); + } + + private static Intent generateBrowserIntent(@NonNull Account account, long cardRemoteId, @NonNull Attachment attachment) { + return new Intent(Intent.ACTION_VIEW) + .setData(Uri.parse(getCopyDownloadUrl(account, cardRemoteId, attachment))); + } + public static String getCopyDownloadUrl(@NonNull Account account, @NonNull Long cardRemoteId, @NonNull Attachment attachment) { if (attachment.getId() == null) { throw new IllegalArgumentException("attachment id must not be null"); |