diff options
author | stefan-niedermann <info@niedermann.it> | 2020-03-07 21:24:43 +0300 |
---|---|---|
committer | stefan-niedermann <info@niedermann.it> | 2020-03-07 21:24:43 +0300 |
commit | f180824ec20453fe281d859bdd04aac53684ae16 (patch) | |
tree | c635b2ce5e2b2a5ad54f395970b5b120d35f21d1 /app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java | |
parent | 656f1d4cc1596a7b6b5fc4b2aa28d8726956acc7 (diff) |
Make attachment viewer swipeable
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java new file mode 100644 index 000000000..7b07abbfd --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardAttachmentAdapter.java @@ -0,0 +1,245 @@ +package it.niedermann.nextcloud.deck.ui.card; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.text.format.Formatter; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.core.app.ActivityOptionsCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; + +import java.util.List; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemAttachmentDefaultBinding; +import it.niedermann.nextcloud.deck.databinding.ItemAttachmentImageBinding; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.Attachment; +import it.niedermann.nextcloud.deck.model.enums.DBStatus; +import it.niedermann.nextcloud.deck.ui.AttachmentsActivity; +import it.niedermann.nextcloud.deck.util.AttachmentUtil; +import it.niedermann.nextcloud.deck.util.DateUtil; +import it.niedermann.nextcloud.deck.util.DeleteDialogBuilder; + +import static android.content.Context.CLIPBOARD_SERVICE; +import static androidx.constraintlayout.widget.Constraints.TAG; +import static it.niedermann.nextcloud.deck.ui.AttachmentsActivity.BUNDLE_KEY_CURRENT_ATTACHMENT_LOCAL_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_ACCOUNT_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ID; + +public class CardAttachmentAdapter extends RecyclerView.Adapter<CardAttachmentAdapter.AttachmentViewHolder> { + + public static final int VIEW_TYPE_DEFAULT = 2; + public static final int VIEW_TYPE_IMAGE = 1; + + private final MenuInflater menuInflator; + private final Account account; + private final long cardRemoteId; + private final long cardLocalId; + @NonNull + private List<Attachment> attachments; + @NonNull + private AttachmentDeletedListener attachmentDeletedListener; + private Context context; + + CardAttachmentAdapter(@NonNull MenuInflater menuInflator, @NonNull AttachmentDeletedListener attachmentDeletedListener, @NonNull Account account, long cardLocalId, long cardRemoteId, @NonNull List<Attachment> attachments) { + super(); + this.menuInflator = menuInflator; + this.attachmentDeletedListener = attachmentDeletedListener; + this.attachments = attachments; + this.account = account; + this.cardRemoteId = cardRemoteId; + this.cardLocalId = cardLocalId; + } + + @NonNull + @Override + public AttachmentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + this.context = parent.getContext(); + //noinspection SwitchStatementWithTooFewBranches + switch (viewType) { + case VIEW_TYPE_IMAGE: { + return new ImageAttachmentViewHolder(ItemAttachmentImageBinding.inflate(LayoutInflater.from(context), parent, false)); + } + default: { + return new DefaultAttachmentViewHolder(ItemAttachmentDefaultBinding.inflate(LayoutInflater.from(context), parent, false)); + } + } + } + + @Override + public void onBindViewHolder(@NonNull AttachmentViewHolder holder, int position) { + Attachment attachment = attachments.get(position); + int viewType = getItemViewType(position); + String uri = AttachmentUtil.getUrl(account.getUrl(), cardRemoteId, attachment.getId()); + holder.setNotSyncedYetStatus(attachment.getStatusEnum() == DBStatus.UP_TO_DATE); + holder.getRootView().setOnCreateContextMenuListener((menu, v, menuInfo) -> { + menuInflator.inflate(R.menu.attachment_menu, menu); + menu.findItem(R.id.delete).setOnMenuItemClickListener(item -> { + new DeleteDialogBuilder(context) + .setTitle(context.getString(R.string.delete_something, attachment.getFilename())) + .setMessage(R.string.attachment_delete_message) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.simple_delete, (dialog, which) -> attachmentDeletedListener.onAttachmentDeleted(attachment)) + .show(); + return false; + }); + menu.findItem(android.R.id.copyUrl).setOnMenuItemClickListener(item -> { + final ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText(attachment.getFilename(), uri); + if (clipboardManager != null) { + clipboardManager.setPrimaryClip(clipData); + Toast.makeText(context, R.string.simple_copied, Toast.LENGTH_SHORT).show(); + } else { + Log.e(TAG, "clipboardManager is null"); + } + return false; + }); + }); + + if (attachment.getMimetype() != null) { + if (attachment.getMimetype().startsWith("image")) { + Glide.with(context) + .load(uri) + .error(R.drawable.ic_image_grey600_24dp) + .into(holder.getPreview()); + holder.getPreview().setImageResource(R.drawable.ic_image_grey600_24dp); + holder.getPreview().getRootView().setOnClickListener((v) -> { + Intent intent = new Intent(context, AttachmentsActivity.class); + intent.putExtra(BUNDLE_KEY_ACCOUNT_ID, account.getId()); + intent.putExtra(BUNDLE_KEY_LOCAL_ID, cardLocalId); + intent.putExtra(BUNDLE_KEY_CURRENT_ATTACHMENT_LOCAL_ID, attachment.getLocalId()); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && context instanceof Activity) { + String transitionName = context.getString(R.string.transition_attachment_preview, String.valueOf(attachment.getLocalId())); + holder.getPreview().setTransitionName(transitionName); + context.startActivity(intent, ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) context, holder.getPreview(), transitionName).toBundle()); + } else { + context.startActivity(intent); + } + }); + } else if (attachment.getMimetype().startsWith("audio")) { + holder.getPreview().setImageResource(R.drawable.ic_music_note_grey600_24dp); + } else if (attachment.getMimetype().startsWith("video")) { + holder.getPreview().setImageResource(R.drawable.ic_local_movies_grey600_24dp); + } + } + + //noinspection SwitchStatementWithTooFewBranches + switch (viewType) { + case VIEW_TYPE_IMAGE: { + ImageAttachmentViewHolder imageHolder = (ImageAttachmentViewHolder) holder; + break; + } + default: { + DefaultAttachmentViewHolder defaultHolder = (DefaultAttachmentViewHolder) holder; + defaultHolder.binding.filename.getRootView().setOnClickListener((event) -> { + Intent openURL = new Intent(Intent.ACTION_VIEW); + openURL.setData(Uri.parse(AttachmentUtil.getUrl(account.getUrl(), cardRemoteId, attachment.getId()))); + context.startActivity(openURL); + }); + defaultHolder.binding.filename.setText(attachment.getBasename()); + defaultHolder.binding.filesize.setText(Formatter.formatFileSize(context, attachment.getFilesize())); + if (attachment.getLastModifiedLocal() != null) { + defaultHolder.binding.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModifiedLocal().getTime())); + defaultHolder.binding.modified.setVisibility(View.VISIBLE); + } else if (attachment.getLastModified() != null) { + defaultHolder.binding.modified.setText(DateUtil.getRelativeDateTimeString(context, attachment.getLastModified().getTime())); + defaultHolder.binding.modified.setVisibility(View.VISIBLE); + } else { + defaultHolder.binding.modified.setVisibility(View.GONE); + } + break; + } + } + } + + @Override + public int getItemViewType(int position) { + String mimeType = attachments.get(position).getMimetype(); + return (mimeType != null && mimeType.startsWith("image")) ? VIEW_TYPE_IMAGE : VIEW_TYPE_DEFAULT; + } + + @Override + public int getItemCount() { + return attachments.size(); + } + + static abstract class AttachmentViewHolder extends RecyclerView.ViewHolder { + AttachmentViewHolder(@NonNull View itemView) { + super(itemView); + } + + abstract protected View getRootView(); + + abstract protected ImageView getPreview(); + + abstract protected void setNotSyncedYetStatus(boolean synced); + } + + static class DefaultAttachmentViewHolder extends AttachmentViewHolder { + ItemAttachmentDefaultBinding binding; + + private DefaultAttachmentViewHolder(ItemAttachmentDefaultBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + @Override + protected View getRootView() { + return binding.getRoot(); + } + + @Override + protected ImageView getPreview() { + return binding.preview; + } + + @Override + protected void setNotSyncedYetStatus(boolean synced) { + binding.notSyncedYet.setVisibility(synced ? View.GONE : View.VISIBLE); + } + } + + static class ImageAttachmentViewHolder extends AttachmentViewHolder { + private ItemAttachmentImageBinding binding; + + private ImageAttachmentViewHolder(ItemAttachmentImageBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + @Override + protected View getRootView() { + return binding.getRoot(); + } + + @Override + protected ImageView getPreview() { + return binding.preview; + } + + @Override + protected void setNotSyncedYetStatus(boolean synced) { + binding.notSyncedYet.setVisibility(synced ? View.GONE : View.VISIBLE); + } + } + + public interface AttachmentDeletedListener { + void onAttachmentDeleted(Attachment attachment); + } +} |