diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-11-05 01:00:59 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-11-05 01:00:59 +0300 |
commit | 57d0efd5d0c87d28d6ae000ba847a80b1fe7d85f (patch) | |
tree | 87fd39f42f0eff2deeb8e75c2a00b1034cd0b356 /app/src/main/java/it/niedermann/nextcloud/deck | |
parent | 55583196b325f671584481a5cdb49ddea835a697 (diff) |
Enhance file picker
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck')
6 files changed, 79 insertions, 51 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java index fe06160d2..0900dd5ce 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java @@ -344,7 +344,7 @@ public class CardAttachmentsFragment extends BrandedFragment implements Attachme // // TODO Only usable with Scoped Storage // pickerAdapter = new FileAdapter(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeFilePicker); // } else { - pickerAdapter = new FileAdapterLegacy(uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeFilePicker); + pickerAdapter = new FileAdapterLegacy(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeFilePicker); // } binding.pickerRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); binding.pickerRecyclerView.setAdapter(pickerAdapter); 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 9d72990a5..2b5358eb9 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 @@ -10,13 +10,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.FragmentManager; -import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.ItemAttachmentDefaultBinding; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Attachment; -import it.niedermann.nextcloud.deck.util.AttachmentUtil; import it.niedermann.nextcloud.deck.util.DateUtil; -import it.niedermann.nextcloud.deck.util.MimeTypeUtil; + +import static it.niedermann.nextcloud.deck.util.AttachmentUtil.getIconForMimeType; +import static it.niedermann.nextcloud.deck.util.AttachmentUtil.openAttachmentInBrowser; public class DefaultAttachmentViewHolder extends AttachmentViewHolder { private final ItemAttachmentDefaultBinding binding; @@ -39,20 +39,8 @@ 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 mainColor) { super.bind(account, menuInflater, fragmentManager, cardRemoteId, attachment, onClickListener, mainColor); - - if (MimeTypeUtil.isAudio(attachment.getMimetype())) { - getPreview().setImageResource(R.drawable.ic_music_note_grey600_24dp); - } else if (MimeTypeUtil.isVideo(attachment.getMimetype())) { - getPreview().setImageResource(R.drawable.ic_local_movies_grey600_24dp); - } else if (MimeTypeUtil.isPdf(attachment.getMimetype())) { - getPreview().setImageResource(R.drawable.ic_baseline_picture_as_pdf_24); - } else if (MimeTypeUtil.isContact(attachment.getMimetype())) { - getPreview().setImageResource(R.drawable.ic_baseline_contact_mail_24); - } else { - getPreview().setImageResource(R.drawable.ic_attach_file_grey600_24dp); - } - - itemView.setOnClickListener((event) -> AttachmentUtil.openAttachmentInBrowser(itemView.getContext(), account.getUrl(), cardRemoteId, attachment.getId())); + getPreview().setImageResource(getIconForMimeType(attachment.getMimetype())); + itemView.setOnClickListener((event) -> openAttachmentInBrowser(itemView.getContext(), account.getUrl(), cardRemoteId, attachment.getId())); 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/ui/card/attachments/picker/FileAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java index 3e42f15d0..46e00fc95 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java @@ -15,11 +15,13 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.function.Consumer; +import it.niedermann.nextcloud.deck.databinding.ItemAttachmentDefaultBinding; import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; -import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; import static android.provider.MediaStore.Downloads.DATE_ADDED; +import static android.provider.MediaStore.Downloads.DATE_MODIFIED; import static android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI; +import static android.provider.MediaStore.Downloads.MIME_TYPE; import static android.provider.MediaStore.Downloads.SIZE; import static android.provider.MediaStore.Downloads.TITLE; import static android.provider.MediaStore.Downloads._ID; @@ -30,11 +32,15 @@ public class FileAdapter extends AbstractCursorPickerAdapter<RecyclerView.ViewHo private final int displayNameColumnIndex; private final int sizeColumnIndex; + private final int modifiedColumnIndex; + private final int mimeTypeColumnIndex; - public FileAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { - super(context, onSelect, onSelectPicker, _ID, requireNonNull(context.getContentResolver().query(EXTERNAL_CONTENT_URI, new String[]{_ID, TITLE, SIZE}, null, null, DATE_ADDED + " DESC"))); + private FileAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { + super(context, onSelect, onSelectPicker, _ID, requireNonNull(context.getContentResolver().query(EXTERNAL_CONTENT_URI, new String[]{_ID, TITLE, SIZE, DATE_MODIFIED, MIME_TYPE}, null, null, DATE_ADDED + " DESC"))); displayNameColumnIndex = cursor.getColumnIndex(TITLE); sizeColumnIndex = cursor.getColumnIndex(SIZE); + modifiedColumnIndex = cursor.getColumnIndex(DATE_MODIFIED); + mimeTypeColumnIndex = cursor.getColumnIndex(MIME_TYPE); notifyItemRangeInserted(0, getItemCount()); } @@ -45,7 +51,7 @@ public class FileAdapter extends AbstractCursorPickerAdapter<RecyclerView.ViewHo case VIEW_TYPE_ITEM_NATIVE: return new FileNativeItemViewHolder(ItemPickerNativeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); case VIEW_TYPE_ITEM: - return new FileItemViewHolder(ItemPickerUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + return new FileItemViewHolder(ItemAttachmentDefaultBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); default: throw new IllegalStateException("Unknown viewType " + viewType); } @@ -62,8 +68,10 @@ public class FileAdapter extends AbstractCursorPickerAdapter<RecyclerView.ViewHo bindExecutor.execute(() -> { final long id = getItemId(position); final String name = cursor.getString(displayNameColumnIndex); + final String mimeType = cursor.getString(mimeTypeColumnIndex); final long size = cursor.getLong(sizeColumnIndex); - new Handler(Looper.getMainLooper()).post(() -> ((FileItemViewHolder) holder).bind(ContentUris.withAppendedId(MediaStore.Files.getContentUri("external"), id), name, size, onSelect)); + final long modified = cursor.getLong(modifiedColumnIndex); + new Handler(Looper.getMainLooper()).post(() -> ((FileItemViewHolder) holder).bind(ContentUris.withAppendedId(MediaStore.Files.getContentUri("external"), id), name, mimeType, size, modified, onSelect)); }); break; } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java index 6d5f9eb7f..a338e9d75 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java @@ -1,12 +1,12 @@ package it.niedermann.nextcloud.deck.ui.card.attachments.picker; +import android.content.Context; import android.net.Uri; import android.os.Environment; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import java.io.File; @@ -14,8 +14,9 @@ import java.util.Arrays; import java.util.List; import java.util.function.Consumer; +import it.niedermann.nextcloud.deck.databinding.ItemAttachmentDefaultBinding; import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; -import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; +import it.niedermann.nextcloud.deck.util.AttachmentUtil; import static java.util.Collections.reverseOrder; import static java.util.Comparator.comparingLong; @@ -26,14 +27,17 @@ import static java.util.stream.Collectors.toList; public class FileAdapterLegacy extends AbstractPickerAdapter<RecyclerView.ViewHolder> { @NonNull - List<File> files; - @Nullable - protected Consumer<Uri> onSelect; - @Nullable - protected Runnable openNativePicker; + private final Context context; + @NonNull + private final List<File> files; + @NonNull + protected final Consumer<Uri> onSelect; + @NonNull + protected final Runnable openNativePicker; - public FileAdapterLegacy(@NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker) { + public FileAdapterLegacy(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker) { // TODO run in separate thread? + this.context = context; this.onSelect = onSelect; this.openNativePicker = openNativePicker; this.files = Arrays.stream(requireNonNull(requireNonNull(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)).listFiles())) @@ -49,7 +53,7 @@ public class FileAdapterLegacy extends AbstractPickerAdapter<RecyclerView.ViewHo case VIEW_TYPE_ITEM_NATIVE: return new FileNativeItemViewHolder(ItemPickerNativeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); case VIEW_TYPE_ITEM: - return new FileItemViewHolder(ItemPickerUserBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + return new FileItemViewHolder(ItemAttachmentDefaultBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); default: throw new IllegalStateException("Unknown viewType " + viewType); } @@ -65,7 +69,7 @@ public class FileAdapterLegacy extends AbstractPickerAdapter<RecyclerView.ViewHo case VIEW_TYPE_ITEM: { final File file = files.get(position - 1); if (file.isFile()) { - ((FileItemViewHolder) holder).bind(Uri.fromFile(file), file.getName(), file.length(), onSelect); + ((FileItemViewHolder) holder).bind(Uri.fromFile(file), file.getName(), AttachmentUtil.getMimeType(file.getAbsolutePath()), file.length(), file.lastModified(), onSelect); } else { ((FileItemViewHolder) holder).bindError(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileItemViewHolder.java index a493bb2be..50733dfbe 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileItemViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileItemViewHolder.java @@ -1,44 +1,42 @@ package it.niedermann.nextcloud.deck.ui.card.attachments.picker; import android.net.Uri; -import android.text.format.Formatter; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; - import java.util.function.Consumer; import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; +import it.niedermann.nextcloud.deck.databinding.ItemAttachmentDefaultBinding; + +import static android.text.format.Formatter.formatFileSize; +import static it.niedermann.nextcloud.deck.util.AttachmentUtil.getIconForMimeType; +import static it.niedermann.nextcloud.deck.util.DateUtil.getRelativeDateTimeString; public class FileItemViewHolder extends RecyclerView.ViewHolder { - private final ItemPickerUserBinding binding; + private final ItemAttachmentDefaultBinding binding; - public FileItemViewHolder(@NonNull ItemPickerUserBinding binding) { + public FileItemViewHolder(@NonNull ItemAttachmentDefaultBinding binding) { super(binding.getRoot()); this.binding = binding; } - public void bind(@NonNull Uri uri, @NonNull String displayName, long size, @Nullable Consumer<Uri> onSelect) { + public void bind(@NonNull Uri uri, @NonNull String name, String mimeType, long size, long modified, @Nullable Consumer<Uri> onSelect) { itemView.setOnClickListener(onSelect == null ? null : (v) -> onSelect.accept(uri)); - binding.displayName.setText(displayName); - binding.contactInformation.setText(Formatter.formatFileSize(itemView.getContext(), size)); - Glide.with(itemView.getContext()) - .load(R.drawable.ic_attach_file_grey600_24dp) - .placeholder(R.drawable.ic_person_grey600_24dp) - .apply(RequestOptions.circleCropTransform()) - .into(binding.avatar); + binding.filename.setText(name); + binding.filesize.setText(formatFileSize(binding.filesize.getContext(), size)); + binding.modified.setText(getRelativeDateTimeString(binding.modified.getContext(), modified)); + binding.preview.setImageResource(getIconForMimeType(mimeType)); } public void bindError() { + binding.filename.setText(R.string.simple_exception); + binding.filesize.setText(null); + binding.modified.setText(null); itemView.setOnClickListener(null); - Glide.with(itemView.getContext()) - .load(R.drawable.ic_person_grey600_24dp) - .into(binding.avatar); + binding.preview.setImageResource(R.drawable.ic_attach_file_grey600_24dp); } } 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 6a7807d50..2baec8e92 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 @@ -3,8 +3,11 @@ package it.niedermann.nextcloud.deck.util; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.text.TextUtils; +import android.webkit.MimeTypeMap; import android.widget.Toast; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -105,4 +108,31 @@ public class AttachmentUtil { return cacheFile; } + + @DrawableRes + public static int getIconForMimeType(@NonNull String mimeType) { + if (TextUtils.isEmpty(mimeType)) { + return R.drawable.ic_attach_file_grey600_24dp; + } else if (MimeTypeUtil.isAudio(mimeType)) { + return R.drawable.ic_music_note_grey600_24dp; + } else if (MimeTypeUtil.isVideo(mimeType)) { + return R.drawable.ic_local_movies_grey600_24dp; + } else if (MimeTypeUtil.isPdf(mimeType)) { + return R.drawable.ic_baseline_picture_as_pdf_24; + } else if (MimeTypeUtil.isContact(mimeType)) { + return R.drawable.ic_baseline_contact_mail_24; + } else { + return R.drawable.ic_attach_file_grey600_24dp; + } + } + + public static String getMimeType(@Nullable String url) { + String type = null; + String extension = MimeTypeMap.getFileExtensionFromUrl(url); + if (extension != null) { + type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + return type; + } + } |