diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-11-05 00:26:18 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-11-05 00:26:18 +0300 |
commit | 55583196b325f671584481a5cdb49ddea835a697 (patch) | |
tree | ed5e4dff7c1e2e46c2c958dc6c813c6c82498a29 /app/src/main/java | |
parent | 20b0b08adfed542bd9583bdd7cb0b3a0c4953f25 (diff) |
Enhance file picker
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main/java')
10 files changed, 214 insertions, 114 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 efbee761a..fe06160d2 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 @@ -53,9 +53,10 @@ import it.niedermann.nextcloud.deck.ui.branding.BrandedFragment; import it.niedermann.nextcloud.deck.ui.branding.BrandedSnackbar; import it.niedermann.nextcloud.deck.ui.card.EditCardViewModel; import it.niedermann.nextcloud.deck.ui.card.attachments.picker.AbstractPickerAdapter; -import it.niedermann.nextcloud.deck.ui.card.attachments.picker.ContactAdapter; +import it.niedermann.nextcloud.deck.ui.card.attachments.picker.ContactAdapterAbstract; import it.niedermann.nextcloud.deck.ui.card.attachments.picker.FileAdapter; -import it.niedermann.nextcloud.deck.ui.card.attachments.picker.GalleryAdapter; +import it.niedermann.nextcloud.deck.ui.card.attachments.picker.FileAdapterLegacy; +import it.niedermann.nextcloud.deck.ui.card.attachments.picker.GalleryAdapterAbstract; import it.niedermann.nextcloud.deck.ui.exception.ExceptionDialogFragment; import it.niedermann.nextcloud.deck.ui.takephoto.TakePhotoActivity; import it.niedermann.nextcloud.deck.util.DeckColorUtil; @@ -307,12 +308,12 @@ public class CardAttachmentsFragment extends BrandedFragment implements Attachme } private void showGalleryPicker() { - if (!(pickerAdapter instanceof GalleryAdapter)) { + if (!(pickerAdapter instanceof GalleryAdapterAbstract)) { if (isPermissionRequestNeeded(READ_EXTERNAL_STORAGE) || isPermissionRequestNeeded(CAMERA)) { requestPermissions(new String[]{READ_EXTERNAL_STORAGE, CAMERA}, REQUEST_CODE_PICK_GALLERY_PERMISSION); } else { unbindPickerAdapter(); - pickerAdapter = new GalleryAdapter(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeCameraPicker, getViewLifecycleOwner()); + pickerAdapter = new GalleryAdapterAbstract(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeCameraPicker, getViewLifecycleOwner()); binding.pickerRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 3)); binding.pickerRecyclerView.setAdapter(pickerAdapter); } @@ -320,12 +321,12 @@ public class CardAttachmentsFragment extends BrandedFragment implements Attachme } private void showContactPicker() { - if (!(pickerAdapter instanceof ContactAdapter)) { + if (!(pickerAdapter instanceof ContactAdapterAbstract)) { if (isPermissionRequestNeeded(READ_CONTACTS)) { requestPermissions(new String[]{READ_CONTACTS}, REQUEST_CODE_PICK_CONTACT_PICKER_PERMISSION); } else { unbindPickerAdapter(); - pickerAdapter = new ContactAdapter(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_CONTACT, RESULT_OK, new Intent().setData(uri)), this::openNativeContactPicker); + pickerAdapter = new ContactAdapterAbstract(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_CONTACT, RESULT_OK, new Intent().setData(uri)), this::openNativeContactPicker); binding.pickerRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); binding.pickerRecyclerView.setAdapter(pickerAdapter); } @@ -333,13 +334,18 @@ public class CardAttachmentsFragment extends BrandedFragment implements Attachme } private void showFilePicker() { - if (!(pickerAdapter instanceof FileAdapter)) { + if (!(pickerAdapter instanceof FileAdapter) && !(pickerAdapter instanceof FileAdapterLegacy)) { if (isPermissionRequestNeeded(READ_EXTERNAL_STORAGE)) { requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, REQUEST_CODE_PICK_FILE_PERMISSION); } else { unbindPickerAdapter(); if (SDK_INT >= LOLLIPOP) { - pickerAdapter = new FileAdapter(requireContext(), uri -> onActivityResult(REQUEST_CODE_PICK_FILE, RESULT_OK, new Intent().setData(uri)), this::openNativeFilePicker); +// if (SDK_INT >= Build.VERSION_CODES.Q) { +// // 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); +// } binding.pickerRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); binding.pickerRecyclerView.setAdapter(pickerAdapter); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractCursorPickerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractCursorPickerAdapter.java new file mode 100644 index 000000000..1890f5111 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractCursorPickerAdapter.java @@ -0,0 +1,96 @@ +package it.niedermann.nextcloud.deck.ui.card.attachments.picker; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Consumer; + +import static android.database.Cursor.FIELD_TYPE_INTEGER; +import static android.database.Cursor.FIELD_TYPE_NULL; +import static androidx.recyclerview.widget.RecyclerView.NO_ID; +import static java.util.Objects.requireNonNull; + +/** + * An {@link RecyclerView.Adapter} which provides previews of one type of files and also an option to open a native dialog. + * <p> + * Example: Previews for images of the gallery as well a one option to take a photo + */ +public abstract class AbstractCursorPickerAdapter<T extends RecyclerView.ViewHolder> extends AbstractPickerAdapter<T> { + + private final int count; + protected final int columnIndex; + private final int columnIndexType; + @NonNull + protected final Consumer<Uri> onSelect; + @NonNull + protected final Runnable openNativePicker; + @NonNull + protected final Cursor cursor; + @NonNull + protected final ContentResolver contentResolver; + + /** + * Should be used to bind heavy operations like when dealing with {@link Bitmap}. + * This must only be one {@link Thread} because otherwise the cursor might change while fetching data from it. + */ + @NonNull + protected final ExecutorService bindExecutor = Executors.newFixedThreadPool(1); + + public AbstractCursorPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, Uri subject, String idColumn, String sortOrder) { + this(context, onSelect, openNativePicker, subject, idColumn, new String[]{idColumn}, sortOrder); + } + + public AbstractCursorPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, Uri subject, String idColumn, String[] requestedColumns, String sortOrder) { + this(context, onSelect, openNativePicker, idColumn, requireNonNull(context.getContentResolver().query(subject, requestedColumns, null, null, sortOrder))); + } + + public AbstractCursorPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, String idColumn, @NonNull Cursor cursor) { + this.contentResolver = context.getContentResolver(); + this.onSelect = onSelect; + this.openNativePicker = openNativePicker; + this.cursor = cursor; + this.cursor.moveToFirst(); + this.columnIndex = this.cursor.getColumnIndex(idColumn); + this.count = cursor.getCount(); + this.columnIndexType = (this.count > 0) ? this.cursor.getType(columnIndex) : FIELD_TYPE_NULL; + setHasStableIds(true); + } + + /** + * Moves the {@link #cursor} to the given position + */ + @Override + public long getItemId(int position) { + if (cursor.moveToPosition(position - 1)) { + //noinspection SwitchStatementWithTooFewBranches + switch (columnIndexType) { + case FIELD_TYPE_INTEGER: + return cursor.getLong(columnIndex); + default: + throw new IllegalStateException("Unknown type for columnIndex \"" + columnIndex + "\": " + columnIndexType); + } + } else { + return NO_ID; + } + } + + @Override + public int getItemCount() { + return count; + } + + /** + * Call this method when the {@link AbstractCursorPickerAdapter} is no longer need to free resources. + */ + public void onDestroy() { + cursor.close(); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java index f4eca487b..d04065aa4 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/AbstractPickerAdapter.java @@ -1,95 +1,12 @@ package it.niedermann.nextcloud.deck.ui.card.attachments.picker; -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.Uri; - -import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.function.Consumer; - -import static android.database.Cursor.FIELD_TYPE_INTEGER; -import static android.database.Cursor.FIELD_TYPE_NULL; -import static androidx.recyclerview.widget.RecyclerView.NO_ID; -import static java.util.Objects.requireNonNull; - -/** - * An {@link RecyclerView.Adapter} which provides previews of one type of files and also an option to open a native dialog. - * <p> - * Example: Previews for images of the gallery as well a one option to take a photo - */ public abstract class AbstractPickerAdapter<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> { protected static final int VIEW_TYPE_ITEM = 0; protected static final int VIEW_TYPE_ITEM_NATIVE = 1; - private final int count; - protected final int columnIndex; - private final int columnIndexType; - @NonNull - protected final Consumer<Uri> onSelect; - @NonNull - protected final Runnable openNativePicker; - @NonNull - protected final Cursor cursor; - @NonNull - protected final ContentResolver contentResolver; - - /** - * Should be used to bind heavy operations like when dealing with {@link Bitmap}. - * This must only be one {@link Thread} because otherwise the cursor might change while fetching data from it. - */ - @NonNull - protected final ExecutorService bindExecutor = Executors.newFixedThreadPool(1); - - public AbstractPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, Uri subject, String idColumn, String sortOrder) { - this(context, onSelect, openNativePicker, subject, idColumn, new String[]{idColumn}, sortOrder); - } - - public AbstractPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, Uri subject, String idColumn, String[] requestedColumns, String sortOrder) { - this(context, onSelect, openNativePicker, idColumn, requireNonNull(context.getContentResolver().query(subject, requestedColumns, null, null, sortOrder))); - } - - public AbstractPickerAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, String idColumn, @NonNull Cursor cursor) { - this.contentResolver = context.getContentResolver(); - this.onSelect = onSelect; - this.openNativePicker = openNativePicker; - this.cursor = cursor; - this.cursor.moveToFirst(); - this.columnIndex = this.cursor.getColumnIndex(idColumn); - this.count = cursor.getCount(); - this.columnIndexType = (this.count > 0) ? this.cursor.getType(columnIndex) : FIELD_TYPE_NULL; - setHasStableIds(true); - } - - /** - * Moves the {@link #cursor} to the given position - */ - @Override - public long getItemId(int position) { - if (cursor.moveToPosition(position - 1)) { - //noinspection SwitchStatementWithTooFewBranches - switch (columnIndexType) { - case FIELD_TYPE_INTEGER: - return cursor.getLong(columnIndex); - default: - throw new IllegalStateException("Unknown type for columnIndex \"" + columnIndex + "\": " + columnIndexType); - } - } else { - return NO_ID; - } - } - - @Override - public int getItemCount() { - return count; - } - @Override public int getItemViewType(int position) { return position == 0 @@ -100,7 +17,5 @@ public abstract class AbstractPickerAdapter<T extends RecyclerView.ViewHolder> e /** * Call this method when the {@link AbstractPickerAdapter} is no longer need to free resources. */ - public void onDestroy() { - cursor.close(); - } + public abstract void onDestroy(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapterAbstract.java index ba6eeb6c6..b7b35dae5 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactAdapterAbstract.java @@ -31,13 +31,13 @@ import static android.provider.ContactsContract.Contacts.DISPLAY_NAME; import static android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY; import static android.provider.ContactsContract.Contacts._ID; -public class ContactAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> { +public class ContactAdapterAbstract extends AbstractCursorPickerAdapter<RecyclerView.ViewHolder> { private final int lookupKeyColumnIndex; private final int displayNameColumnIndex; - public ContactAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { + public ContactAdapterAbstract(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { super(context, onSelect, onSelectPicker, CONTENT_URI, _ID, new String[]{_ID, LOOKUP_KEY, DISPLAY_NAME}, SORT_KEY_PRIMARY); lookupKeyColumnIndex = cursor.getColumnIndex(LOOKUP_KEY); displayNameColumnIndex = cursor.getColumnIndex(DISPLAY_NAME); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java index 73e129637..a1d7d5921 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/ContactNativeItemViewHolder.java @@ -17,7 +17,7 @@ public class ContactNativeItemViewHolder extends RecyclerView.ViewHolder { public void bind(@NonNull Runnable onOpenMajorPicker) { binding.title.setText(R.string.show_all_contacts); - binding.subtitle.setText(R.string.your_contacts); + binding.subtitle.setText(R.string.contacts); itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); } } 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 c5287bf9c..3e42f15d0 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 @@ -6,11 +6,11 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.provider.MediaStore; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.recyclerview.widget.RecyclerView; import java.util.function.Consumer; @@ -18,24 +18,21 @@ import java.util.function.Consumer; import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; -import static android.provider.BaseColumns._ID; -import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE; -import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE; -import static android.provider.MediaStore.Files.FileColumns.TITLE; -import static android.provider.MediaStore.MediaColumns.DATE_ADDED; -import static android.provider.MediaStore.MediaColumns.SIZE; +import static android.provider.MediaStore.Downloads.DATE_ADDED; +import static android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI; +import static android.provider.MediaStore.Downloads.SIZE; +import static android.provider.MediaStore.Downloads.TITLE; +import static android.provider.MediaStore.Downloads._ID; import static java.util.Objects.requireNonNull; -public class FileAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> { +@RequiresApi(api = 29) +public class FileAdapter extends AbstractCursorPickerAdapter<RecyclerView.ViewHolder> { private final int displayNameColumnIndex; private final int sizeColumnIndex; - private final static String[] excludedMediaTypes = new String[]{ - String.valueOf(MEDIA_TYPE_IMAGE) - }; public FileAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable onSelectPicker) { - super(context, onSelect, onSelectPicker, _ID, requireNonNull(context.getContentResolver().query(MediaStore.Files.getContentUri("external"), new String[]{_ID, TITLE, SIZE}, MEDIA_TYPE + " NOT IN (" + TextUtils.join(",", excludedMediaTypes) + ") ", null, DATE_ADDED + " DESC"))); + super(context, onSelect, onSelectPicker, _ID, requireNonNull(context.getContentResolver().query(EXTERNAL_CONTENT_URI, new String[]{_ID, TITLE, SIZE}, null, null, DATE_ADDED + " DESC"))); displayNameColumnIndex = cursor.getColumnIndex(TITLE); sizeColumnIndex = cursor.getColumnIndex(SIZE); notifyItemRangeInserted(0, getItemCount()); 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 new file mode 100644 index 000000000..6d5f9eb7f --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileAdapterLegacy.java @@ -0,0 +1,85 @@ +package it.niedermann.nextcloud.deck.ui.card.attachments.picker; + +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; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import it.niedermann.nextcloud.deck.databinding.ItemPickerNativeBinding; +import it.niedermann.nextcloud.deck.databinding.ItemPickerUserBinding; + +import static java.util.Collections.reverseOrder; +import static java.util.Comparator.comparingLong; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.toList; + +@Deprecated +public class FileAdapterLegacy extends AbstractPickerAdapter<RecyclerView.ViewHolder> { + + @NonNull + List<File> files; + @Nullable + protected Consumer<Uri> onSelect; + @Nullable + protected Runnable openNativePicker; + + public FileAdapterLegacy(@NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker) { + // TODO run in separate thread? + this.onSelect = onSelect; + this.openNativePicker = openNativePicker; + this.files = Arrays.stream(requireNonNull(requireNonNull(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)).listFiles())) + .sorted(reverseOrder(comparingLong(File::lastModified))) + .collect(toList()); + + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType) { + 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)); + default: + throw new IllegalStateException("Unknown viewType " + viewType); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case VIEW_TYPE_ITEM_NATIVE: { + ((FileNativeItemViewHolder) holder).bind(openNativePicker); + break; + } + 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); + } else { + ((FileItemViewHolder) holder).bindError(); + } + break; + } + } + } + + @Override + public int getItemCount() { + return files.size(); + } + + public void onDestroy() { + // Let GarbageCollection do this stuff... + } +} 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 6273ea1dc..a493bb2be 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 @@ -4,6 +4,7 @@ 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; @@ -23,8 +24,8 @@ public class FileItemViewHolder extends RecyclerView.ViewHolder { this.binding = binding; } - public void bind(@NonNull Uri uri, @NonNull String displayName, long size, @NonNull Consumer<Uri> onSelect) { - itemView.setOnClickListener((v) -> onSelect.accept(uri)); + public void bind(@NonNull Uri uri, @NonNull String displayName, long size, @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()) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java index e036f79bf..79129f26a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/FileNativeItemViewHolder.java @@ -17,7 +17,7 @@ public class FileNativeItemViewHolder extends RecyclerView.ViewHolder { public void bind(Runnable onOpenMajorPicker) { binding.title.setText(R.string.show_all_files); - binding.subtitle.setText(R.string.recent); + binding.subtitle.setText(R.string.downloads); itemView.setOnClickListener((v) -> onOpenMajorPicker.run()); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapterAbstract.java index fddd87f51..d47187cd0 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/picker/GalleryAdapterAbstract.java @@ -27,7 +27,7 @@ import static android.os.Build.VERSION_CODES.Q; import static android.provider.BaseColumns._ID; import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; -public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolder> { +public class GalleryAdapterAbstract extends AbstractCursorPickerAdapter<RecyclerView.ViewHolder> { @NonNull private final LifecycleOwner lifecycleOwner; @@ -37,7 +37,7 @@ public class GalleryAdapter extends AbstractPickerAdapter<RecyclerView.ViewHolde ? MediaStore.Images.Media.DATE_TAKEN : MediaStore.Images.Media.DATE_ADDED; - public GalleryAdapter(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, @NonNull LifecycleOwner lifecycleOwner) { + public GalleryAdapterAbstract(@NonNull Context context, @NonNull Consumer<Uri> onSelect, @NonNull Runnable openNativePicker, @NonNull LifecycleOwner lifecycleOwner) { super(context, onSelect, openNativePicker, EXTERNAL_CONTENT_URI, _ID, sortOrder + " DESC"); this.lifecycleOwner = lifecycleOwner; notifyItemRangeInserted(0, getItemCount()); |