From 5ed384d29c664e7c90f346d306a4bf5ba1fed2a5 Mon Sep 17 00:00:00 2001 From: Jaisel Rahman Date: Mon, 4 May 2020 14:26:44 +0530 Subject: [PATCH] feat: made some recycler view improvements --- .../filepickersample/MainActivity.java | 4 + .../activity/DirSelectActivity.java | 34 ++++--- .../activity/FilePickerActivity.java | 39 ++++++-- .../filepicker/adapter/DirListAdapter.java | 82 ++++++++++++++--- .../adapter/FileGalleryAdapter.java | 67 +++++++++++--- .../adapter/MultiSelectionAdapter.java | 92 ++++++------------- .../loader/dir/DirLoaderCallback.java | 9 +- .../loader/dir/DirResultCallback.java | 2 +- 8 files changed, 216 insertions(+), 113 deletions(-) diff --git a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java index 3b09af7..eb17889 100644 --- a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java +++ b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java @@ -113,6 +113,10 @@ public void onClick(View v) { .setShowImages(true) .setShowAudios(true) .setShowVideos(true) + .setIgnoreNoMedia(false) + .enableVideoCapture(true) + .enableImageCapture(true) + .setIgnoreHiddenFile(false) .setMaxSelection(10) .build()); startActivityForResult(intent, FILE_REQUEST_CODE); diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/DirSelectActivity.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/DirSelectActivity.java index 6514a11..89a2849 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/DirSelectActivity.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/DirSelectActivity.java @@ -52,7 +52,7 @@ import java.io.File; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; public class DirSelectActivity extends AppCompatActivity implements DirListAdapter.OnCameraClickListener { @@ -63,18 +63,21 @@ public class DirSelectActivity extends AppCompatActivity implements DirListAdapt private static final int REQUEST_CAMERA_PERMISSION_FOR_VIDEO = 3; private static final int REQUEST_DOCUMENT = 4; private static final int REQUEST_FILE = 5; + private static final int INIT_SIZE = 6; private Configurations configs; private ArrayList dirs = new ArrayList<>(); private DirListAdapter dirAdapter; private DirResultCallback dirResultCallback = new DirResultCallback() { @Override - public void onResult(Collection dirsResult) { + public void onResult(final List dirsResult) { if (dirs != null) { - dirs.clear(); - dirs.ensureCapacity(dirsResult.size()); - dirs.addAll(dirsResult); - dirAdapter.notifyDataSetChanged(); + if (dirsResult.size() <= INIT_SIZE) { + dirAdapter.submitList(dirsResult); + } else { + dirAdapter.submitList(dirsResult.subList(0, INIT_SIZE)); + dirAdapter.submitList(dirsResult); + } } } }; @@ -126,7 +129,7 @@ protected void onCreate(Bundle savedInstanceState) { imageSize = Math.min(point.x, point.y) / configs.getPortraitSpanCount(); } - dirAdapter = new DirListAdapter(this, dirs, imageSize, + dirAdapter = new DirListAdapter(this, imageSize, configs.isImageCaptureEnabled(), configs.isVideoCaptureEnabled()); @@ -142,13 +145,20 @@ public void onClick(Dir dir) { dirAdapter.setOnCameraClickListener(this); RecyclerView recyclerView = findViewById(R.id.file_gallery); - recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount)); + recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount) { + @Override + public boolean isAutoMeasureEnabled() { + return false; + } + }); recyclerView.setAdapter(dirAdapter); recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDimensionPixelSize(R.dimen.grid_spacing), spanCount)); recyclerView.setItemAnimator(null); + recyclerView.setHasFixedSize(true); + recyclerView.setItemViewCacheSize(20); if (requestPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION)) { - loadFiles(false); + loadDirs(false); } } @@ -158,7 +168,7 @@ private boolean useDocumentUi() { && !(configs.isShowImages() || configs.isShowVideos() || configs.isShowAudios()); } - private void loadFiles(boolean restart) { + private void loadDirs(boolean restart) { DirLoader.loadDirs(this, dirResultCallback, configs, restart); } @@ -166,7 +176,7 @@ private void loadFiles(boolean restart) { public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_WRITE_PERMISSION) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - loadFiles(false); + loadDirs(false); } else { Toast.makeText(this, R.string.permission_not_given, Toast.LENGTH_SHORT).show(); finish(); @@ -196,7 +206,7 @@ public void onScanCompleted(String path, final Uri uri) { runOnUiThread(new Runnable() { @Override public void run() { - loadFiles(true); + loadDirs(true); } }); } diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java index e567d72..7f002e3 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java @@ -66,20 +66,22 @@ public class FilePickerActivity extends AppCompatActivity private static final int REQUEST_CAMERA_PERMISSION_FOR_CAMERA = 2; private static final int REQUEST_CAMERA_PERMISSION_FOR_VIDEO = 3; private static final int REQUEST_DOCUMENT = 4; + private static final int INIT_SIZE = 6; private Configurations configs; - private ArrayList mediaFiles = new ArrayList<>(); private FileGalleryAdapter fileGalleryAdapter; private int maxCount; private Long dirId = null; private FileResultCallback fileResultCallback = new FileResultCallback() { @Override - public void onResult(ArrayList filesResults) { + public void onResult(final ArrayList filesResults) { if (filesResults != null) { - mediaFiles.clear(); - mediaFiles.ensureCapacity(filesResults.size()); - mediaFiles.addAll(filesResults); - fileGalleryAdapter.notifyDataSetChanged(); + if (filesResults.size() <= INIT_SIZE) { + fileGalleryAdapter.submitList(filesResults); + } else { + fileGalleryAdapter.submitList(filesResults.subList(0, INIT_SIZE)); + fileGalleryAdapter.submitList(filesResults); + } } } }; @@ -135,9 +137,9 @@ protected void onCreate(Bundle savedInstanceState) { } boolean isSingleChoice = configs.isSingleChoiceMode(); - fileGalleryAdapter = new FileGalleryAdapter(this, mediaFiles, imageSize, - configs.isImageCaptureEnabled(), - configs.isVideoCaptureEnabled()); + fileGalleryAdapter = new FileGalleryAdapter(this, imageSize, + dirId == null && configs.isImageCaptureEnabled(), + dirId == null && configs.isVideoCaptureEnabled()); fileGalleryAdapter.enableSelection(true); fileGalleryAdapter.enableSingleClickSelection(configs.isSingleClickSelection()); fileGalleryAdapter.setOnSelectionListener(this); @@ -146,10 +148,17 @@ protected void onCreate(Bundle savedInstanceState) { fileGalleryAdapter.setSelectedItems(configs.getSelectedMediaFiles()); fileGalleryAdapter.setOnCameraClickListener(this); RecyclerView recyclerView = findViewById(R.id.file_gallery); - recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount)); + recyclerView.setLayoutManager(new GridLayoutManager(this, spanCount) { + @Override + public boolean isAutoMeasureEnabled() { + return false; + } + }); recyclerView.setAdapter(fileGalleryAdapter); recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDimensionPixelSize(R.dimen.grid_spacing), spanCount)); recyclerView.setItemAnimator(null); + recyclerView.setHasFixedSize(false); + recyclerView.setItemViewCacheSize(20); if (requestPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION)) { loadFiles(false); @@ -356,4 +365,14 @@ public void onSelectionEnd() { @Override public void onMaxReached() { } + + @Override + public void onBackPressed() { + + Intent intent = new Intent(); + intent.putExtra(MEDIA_FILES, fileGalleryAdapter.getSelectedItems()); + setResult(RESULT_CANCELED, intent); + + super.onBackPressed(); + } } diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/DirListAdapter.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/DirListAdapter.java index 4dac632..cafa25a 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/DirListAdapter.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/DirListAdapter.java @@ -29,6 +29,10 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.AsyncDifferConfig; +import androidx.recyclerview.widget.AsyncListDiffer; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -41,8 +45,8 @@ import java.io.File; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; import static android.os.Environment.DIRECTORY_MOVIES; @@ -50,9 +54,9 @@ import static android.os.Environment.getExternalStoragePublicDirectory; import static com.jaiselrahman.filepicker.activity.FilePickerActivity.TAG; -public class DirListAdapter extends RecyclerView.Adapter { +public class DirListAdapter extends RecyclerView.Adapter implements ListUpdateCallback { public static final int CAPTURE_IMAGE_VIDEO = 1; - private ArrayList mediaDirs; + // private ArrayList mediaDirs; private Activity activity; private RequestManager glideRequest; private OnClickListener onClickListener; @@ -61,10 +65,12 @@ public class DirListAdapter extends RecyclerView.Adapter mediaDirs, int imageSize, boolean showCamera, boolean showVideoCamera) { - this.mediaDirs = mediaDirs; + private AsyncListDiffer differ = new AsyncListDiffer<>(this, new AsyncDifferConfig.Builder<>(DIR_ITEM_CALLBACK).build()); + + public DirListAdapter(Activity activity, int imageSize, boolean showCamera, boolean showVideoCamera) { this.activity = activity; this.showCamera = showCamera; this.showVideoCamera = showVideoCamera; @@ -74,6 +80,11 @@ public DirListAdapter(Activity activity, ArrayList mediaDirs, int imageSize .optionalCenterCrop() .placeholder(R.drawable.ic_dir) .override(imageSize)); + + if (showCamera && showVideoCamera) + itemStartPosition = 2; + else if (showCamera || showVideoCamera) + itemStartPosition = 1; } public File getLastCapturedFile() { @@ -126,13 +137,17 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { position--; } - holder.dir = mediaDirs.get(position); + holder.dir = getItem(position); holder.dirName.setText(holder.dir.getName()); holder.dirCount.setText(String.valueOf(holder.dir.getCount())); - glideRequest.load(holder.dir.getPreview()) - .into(holder.dirPreview); + Uri preview = holder.dir.getPreview(); + if (preview != null) + glideRequest.load(holder.dir.getPreview()) + .into(holder.dirPreview); + else + holder.dirPreview.setImageResource(R.drawable.ic_dir); } private void handleCamera(final ImageView openCamera, final boolean forVideo) { @@ -193,16 +208,44 @@ public void setOnCameraClickListener(OnCameraClickListener onCameraClickListener this.onCameraClickListener = onCameraClickListener; } + private Dir getItem(int position) { + return differ.getCurrentList().get(position); + } + @Override public int getItemCount() { if (showCamera) { if (showVideoCamera) - return mediaDirs.size() + 2; - return mediaDirs.size() + 1; + return differ.getCurrentList().size() + 2; + return differ.getCurrentList().size() + 1; } else if (showVideoCamera) { - return mediaDirs.size() + 1; + return differ.getCurrentList().size() + 1; } - return mediaDirs.size(); + return differ.getCurrentList().size(); + } + + @Override + public void onInserted(int position, int count) { + notifyItemRangeInserted(itemStartPosition + position, count); + } + + @Override + public void onRemoved(int position, int count) { + notifyItemRangeRemoved(itemStartPosition + position, count); + } + + @Override + public void onMoved(int fromPosition, int toPosition) { + notifyItemMoved(itemStartPosition + fromPosition, itemStartPosition + toPosition); + } + + @Override + public void onChanged(int position, int count, Object payload) { + notifyItemRangeChanged(itemStartPosition + position, count, payload); + } + + public void submitList(List dirs) { + differ.submitList(dirs); } static class ViewHolder extends RecyclerView.ViewHolder { @@ -236,4 +279,19 @@ public interface OnCameraClickListener { public interface OnClickListener { void onClick(Dir dir); } + + private static final DiffUtil.ItemCallback DIR_ITEM_CALLBACK = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull Dir oldItem, @NonNull Dir newItem) { + return oldItem.getId() == newItem.getId(); + } + + @Override + public boolean areContentsTheSame(@NonNull Dir oldItem, @NonNull Dir newItem) { + return oldItem.getName().equals(newItem.getName()) + && oldItem.getCount() == newItem.getCount() + && (oldItem.getPreview() == null && newItem.getPreview() == null) + || oldItem.getPreview().equals(newItem.getPreview()); + } + }; } diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java index 28e9e54..4671cf5 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java @@ -29,6 +29,10 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.AsyncDifferConfig; +import androidx.recyclerview.widget.AsyncListDiffer; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -42,8 +46,8 @@ import java.io.File; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; import static android.os.Environment.DIRECTORY_MOVIES; @@ -52,9 +56,9 @@ import static com.jaiselrahman.filepicker.activity.FilePickerActivity.TAG; public class FileGalleryAdapter extends MultiSelectionAdapter - implements MultiSelectionAdapter.OnSelectionListener { + implements MultiSelectionAdapter.OnSelectionListener, + ListUpdateCallback { public static final int CAPTURE_IMAGE_VIDEO = 1; - private ArrayList mediaFiles; private Activity activity; private RequestManager glideRequest; private OnSelectionListener onSelectionListener; @@ -65,12 +69,15 @@ public class FileGalleryAdapter extends MultiSelectionAdapter mediaFiles, int imageSize, boolean showCamera, boolean showVideoCamera) { - super(mediaFiles); - this.mediaFiles = mediaFiles; + private AsyncListDiffer differ = new AsyncListDiffer<>(this, new AsyncDifferConfig.Builder<>(ITEM_CALLBACK).build()); + + public FileGalleryAdapter(Activity activity, int imageSize, boolean showCamera, boolean showVideoCamera) { this.activity = activity; this.showCamera = showCamera; this.showVideoCamera = showVideoCamera; + + setDiffer(differ); + glideRequest = Glide.with(this.activity) .applyDefaultRequestOptions(RequestOptions .sizeMultiplierOf(0.70f) @@ -134,7 +141,9 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { } super.onBindViewHolder(holder, position); - MediaFile mediaFile = mediaFiles.get(position); + + MediaFile mediaFile = getItem(position); + if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO || mediaFile.getMediaType() == MediaFile.TYPE_IMAGE) { glideRequest.load(mediaFile.getUri()) @@ -229,12 +238,12 @@ public void setOnCameraClickListener(OnCameraClickListener onCameraClickListener public int getItemCount() { if (showCamera) { if (showVideoCamera) - return mediaFiles.size() + 2; - return mediaFiles.size() + 1; + return super.getItemCount() + 2; + return super.getItemCount() + 1; } else if (showVideoCamera) { - return mediaFiles.size() + 1; + return super.getItemCount() + 1; } - return mediaFiles.size(); + return super.getItemCount(); } @Override @@ -304,7 +313,43 @@ public static class ViewHolder extends RecyclerView.ViewHolder { } } + @Override + public void onInserted(int position, int count) { + notifyItemRangeInserted(itemStartPosition + position, count); + } + + @Override + public void onRemoved(int position, int count) { + notifyItemRangeRemoved(itemStartPosition + position, count); + } + + @Override + public void onMoved(int fromPosition, int toPosition) { + notifyItemMoved(itemStartPosition + fromPosition, itemStartPosition + toPosition); + } + + @Override + public void onChanged(int position, int count, Object payload) { + notifyItemRangeChanged(itemStartPosition + position, count, payload); + } + + public void submitList(List mediaFiles) { + differ.submitList(mediaFiles); + } + public interface OnCameraClickListener { boolean onCameraClick(boolean forVideo); } + + private static final DiffUtil.ItemCallback ITEM_CALLBACK = new DiffUtil.ItemCallback() { + @Override + public boolean areItemsTheSame(@NonNull MediaFile oldItem, @NonNull MediaFile newItem) { + return oldItem.getId() == newItem.getId(); + } + + @Override + public boolean areContentsTheSame(@NonNull MediaFile oldItem, @NonNull MediaFile newItem) { + return oldItem.getName().equals(newItem.getName()); + } + }; } diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/MultiSelectionAdapter.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/MultiSelectionAdapter.java index 41afa8d..9bf7080 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/MultiSelectionAdapter.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/MultiSelectionAdapter.java @@ -20,19 +20,18 @@ import androidx.annotation.CallSuper; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.AsyncListDiffer; import androidx.recyclerview.widget.RecyclerView; import com.jaiselrahman.filepicker.model.MediaFile; import java.util.ArrayList; -import java.util.Collection; import java.util.List; @SuppressWarnings({"unused", "WeakerAccess"}) public abstract class MultiSelectionAdapter extends RecyclerView.Adapter { private static final String TAG = MultiSelectionAdapter.class.getSimpleName(); private ArrayList selectedItems = new ArrayList<>(); - private ArrayList mediaFiles; private OnItemClickListener onItemClickListener; private OnItemLongClickListener onItemLongClickListener; @@ -42,7 +41,9 @@ public abstract class MultiSelectionAdapter private boolean isSingleClickSelection = false; private boolean singleChoiceMode = false; private int maxSelection = -1; - private int itemStartPosition = 0; + protected int itemStartPosition = 0; + private AsyncListDiffer differ; + private OnSelectionListener onSelectionListener = new OnSelectionListener() { @Override public void onSelectionBegin() { @@ -54,7 +55,7 @@ public void onSelectionBegin() { @Override public void onSelected(VH viewHolder, int position) { if (singleChoiceMode && selectedItems.size() > 0) { - int pos = mediaFiles.indexOf(selectedItems.get(0)); + int pos = getCurrentList().indexOf(selectedItems.get(0)); if (pos >= 0) { removeSelection(pos); handleItemChanged(pos); @@ -80,7 +81,7 @@ public void onUnSelected(VH viewHolder, int position) { public void onSelectAll() { isSelectionStarted = true; selectedItems.clear(); - selectedItems.addAll(mediaFiles); + selectedItems.addAll(getCurrentList()); notifyDataSetChanged(); if (customOnSelectionListener != null) customOnSelectionListener.onSelectAll(); @@ -89,7 +90,7 @@ public void onSelectAll() { @Override public void onUnSelectAll() { for (int i = selectedItems.size() - 1; i >= 0; i--) { - int position = mediaFiles.indexOf(selectedItems.get(i)); + int position = getCurrentList().indexOf(selectedItems.get(i)); if (position < 0) continue; removeSelection(position); handleItemChanged(position); @@ -113,8 +114,8 @@ public void onMaxReached() { } }; - public MultiSelectionAdapter(ArrayList items) { - this.mediaFiles = items; + public void setDiffer(AsyncListDiffer differ) { + this.differ = differ; } public void setItemStartPosition(int itemStartPosition) { @@ -129,6 +130,19 @@ public void setMaxSelection(int maxSelection) { this.maxSelection = maxSelection; } + protected MediaFile getItem(int position) { + return differ.getCurrentList().get(position); + } + + protected List getCurrentList() { + return differ.getCurrentList(); + } + + @Override + public int getItemCount() { + return differ.getCurrentList().size(); + } + @CallSuper @Override public void onBindViewHolder(@NonNull final VH holder, int position) { @@ -139,7 +153,7 @@ public void onBindViewHolder(@NonNull final VH holder, int position) { public void onClick(View v) { int position = holder.getAdapterPosition() - itemStartPosition; if (enabledSelection && (isSelectionStarted || isSingleClickSelection)) { - if (selectedItems.contains(mediaFiles.get(position))) { + if (selectedItems.contains(getItem(position))) { onSelectionListener.onUnSelected(holder, position); if (selectedItems.isEmpty()) { onSelectionListener.onSelectionEnd(); @@ -153,8 +167,7 @@ public void onClick(View v) { } }); - - setItemSelected(view, position, selectedItems.contains(mediaFiles.get(position))); + setItemSelected(view, position, selectedItems.contains(getItem(position))); view.setOnLongClickListener(new View.OnLongClickListener() { @Override @@ -165,7 +178,7 @@ public boolean onLongClick(View v) { onSelectionListener.onSelectionBegin(); onSelectionListener.onSelected(holder, position); } else if (selectedItems.size() <= 1 - && selectedItems.contains(mediaFiles.get(position))) { + && selectedItems.contains(getItem(position))) { onSelectionListener.onSelectionEnd(); onSelectionListener.onUnSelected(holder, position); } @@ -268,10 +281,10 @@ public void handleItemRangeRemoved(int positionStart, int itemCount) { private void setItemSelected(View view, int position, boolean selected) { if (selected) { - if (!selectedItems.contains(mediaFiles.get(position))) - selectedItems.add(mediaFiles.get(position)); + if (!selectedItems.contains(getItem(position))) + selectedItems.add(getItem(position)); } else { - if (selectedItems.remove(mediaFiles.get(position)) + if (selectedItems.remove(getItem(position)) && selectedItems.isEmpty()) { onSelectionListener.onSelectionEnd(); } @@ -279,59 +292,12 @@ private void setItemSelected(View view, int position, boolean selected) { } private void removeSelection(int position) { - if (selectedItems.remove(mediaFiles.get(position)) + if (selectedItems.remove(getItem(position)) && selectedItems.isEmpty()) { onSelectionListener.onSelectionEnd(); } } - public boolean add(MediaFile mediaFile) { - if (mediaFiles.add(mediaFile)) { - handleItemInserted(mediaFiles.size() - 1); - return true; - } - return false; - } - - public void add(int position, MediaFile mediaFile) { - mediaFiles.add(position, mediaFile); - handleItemInserted(position); - } - - public boolean addAll(Collection itemSelection) { - int lastPosition = mediaFiles.size(); - if (mediaFiles.addAll(itemSelection)) { - handleItemRangeInserted(lastPosition, itemSelection.size()); - return true; - } - return false; - } - - public boolean addAll(int position, Collection itemCollection) { - if (mediaFiles.addAll(position, itemCollection)) { - handleItemRangeInserted(position, itemCollection.size()); - return true; - } - return false; - } - - public void remove(MediaFile item) { - int position = mediaFiles.indexOf(item); - handleItemRemoved(position); - mediaFiles.remove(position); - } - - public MediaFile remove(int position) { - handleItemRemoved(position); - return mediaFiles.remove(position); - } - - public void removeAll(Collection itemCollection) { - ArrayList removeItems = new ArrayList<>(itemCollection); - for (int i = itemCollection.size() - 1; i >= 0; i--) { - remove(removeItems.get(i)); - } - } public interface OnItemClickListener { void onClick(View v, int position); diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirLoaderCallback.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirLoaderCallback.java index 0e52b65..a2b9a90 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirLoaderCallback.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirLoaderCallback.java @@ -33,6 +33,7 @@ import com.jaiselrahman.filepicker.utils.FileUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -70,7 +71,7 @@ public void onLoadFinished(@NonNull Loader loader, Cursor data) { } } - private static Collection getDirs(Cursor data, Configurations configs) { + private static List getDirs(Cursor data, Configurations configs) { List dirs = new ArrayList<>(); List ignoredPaths = new ArrayList<>(); @@ -94,7 +95,7 @@ private static Collection getDirs(Cursor data, Configurations configs) { return dirs; } - private static Collection getDirsQ(Cursor data, Configurations configs) { + private static List getDirsQ(Cursor data, Configurations configs) { HashMap dirs = new HashMap<>(); List ignoredPaths = new ArrayList<>(); @@ -124,7 +125,7 @@ private static Collection getDirsQ(Cursor data, Configurations configs) { } } while (data.moveToNext()); - return dirs.values(); + return new ArrayList<>(dirs.values()); } @Override @@ -146,7 +147,7 @@ private static Uri getPreview(Cursor cursor) { } else if (mediaType == MEDIA_TYPE_VIDEO) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else { - contentUri = MediaStore.Files.getContentUri("external"); + return null; } return ContentUris.withAppendedId(contentUri, id); diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirResultCallback.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirResultCallback.java index baf014a..1ea463e 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirResultCallback.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/loader/dir/DirResultCallback.java @@ -26,5 +26,5 @@ import java.util.List; public interface DirResultCallback { - void onResult(@Nullable Collection dirs); + void onResult(@Nullable List dirs); }