Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2020-11-05 01:00:59 +0300
committerStefan Niedermann <info@niedermann.it>2020-11-05 01:00:59 +0300
commit57d0efd5d0c87d28d6ae000ba847a80b1fe7d85f (patch)
tree87fd39f42f0eff2deeb8e75c2a00b1034cd0b356 /app/src/main/java/it
parent55583196b325f671584481a5cdb49ddea835a697 (diff)
Enhance file picker
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java/it')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/DefaultAttachmentViewHolder.java22
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapter.java18
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java24
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileItemViewHolder.java34
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java30
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;
+ }
+
}