|
@@ -84,10 +84,13 @@ import com.owncloud.android.utils.MimeTypeUtil;
|
|
|
import com.owncloud.android.utils.theme.CapabilityUtils;
|
|
|
import com.owncloud.android.utils.theme.ThemeColorUtils;
|
|
|
import com.owncloud.android.utils.theme.ThemeDrawableUtils;
|
|
|
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
|
|
|
|
|
|
import java.io.File;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
@@ -104,7 +107,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|
|
* This Adapter populates a RecyclerView with all files and folders in a Nextcloud instance.
|
|
|
*/
|
|
|
public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|
|
- implements DisplayUtils.AvatarGenerationListener {
|
|
|
+ implements DisplayUtils.AvatarGenerationListener, FastScrollRecyclerView.SectionedAdapter {
|
|
|
|
|
|
private static final int showFilenameColumnThreshold = 4;
|
|
|
private final ComponentsGetter transferServiceGetter;
|
|
@@ -137,6 +140,9 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
private boolean showShareAvatar = false;
|
|
|
private OCFile highlightedItem;
|
|
|
private boolean showMetadata = true;
|
|
|
+ private FileSortOrder sortOrder;
|
|
|
+
|
|
|
+ private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM yyyy", Locale.getDefault());
|
|
|
|
|
|
public OCFileListAdapter(
|
|
|
Activity activity,
|
|
@@ -370,6 +376,11 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
|
|
|
OCFile file = getItem(position);
|
|
|
|
|
|
+ if (file == null) {
|
|
|
+ Log_OC.e(this, "Cannot bind on view holder on a null file");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
boolean gridImage = MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file);
|
|
|
|
|
|
gridViewHolder.getThumbnail().setTag(file.getFileId());
|
|
@@ -770,13 +781,18 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
return output;
|
|
|
}
|
|
|
|
|
|
- public OCFile getItem(int position) {
|
|
|
+ public @Nullable
|
|
|
+ OCFile getItem(int position) {
|
|
|
int newPosition = position;
|
|
|
|
|
|
if (shouldShowHeader() && position > 0) {
|
|
|
newPosition = position - 1;
|
|
|
}
|
|
|
|
|
|
+ if (newPosition >= mFiles.size()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
return mFiles.get(newPosition);
|
|
|
}
|
|
|
|
|
@@ -812,7 +828,12 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (MimeTypeUtil.isImageOrVideo(getItem(position))) {
|
|
|
+ OCFile item = getItem(position);
|
|
|
+ if (item == null) {
|
|
|
+ return VIEWTYPE_ITEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (MimeTypeUtil.isImageOrVideo(item)) {
|
|
|
return VIEWTYPE_IMAGE;
|
|
|
} else {
|
|
|
return VIEWTYPE_ITEM;
|
|
@@ -875,7 +896,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
if (!limitToMimeType.isEmpty()) {
|
|
|
mFiles = filterByMimeType(mFiles, limitToMimeType);
|
|
|
}
|
|
|
- FileSortOrder sortOrder = preferences.getSortOrderByFolder(directory);
|
|
|
+ sortOrder = preferences.getSortOrderByFolder(directory);
|
|
|
mFiles = sortOrder.sortCloudFiles(mFiles);
|
|
|
mFilesAll.clear();
|
|
|
mFilesAll.addAll(mFiles);
|
|
@@ -941,7 +962,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
searchType == SearchType.RECENTLY_MODIFIED_SEARCH) {
|
|
|
mFiles = FileStorageUtils.sortOcFolderDescDateModifiedWithoutFavoritesFirst(mFiles);
|
|
|
} else if (searchType != SearchType.SHARED_FILTER) {
|
|
|
- FileSortOrder sortOrder = preferences.getSortOrderByFolder(folder);
|
|
|
+ sortOrder = preferences.getSortOrderByFolder(folder);
|
|
|
mFiles = sortOrder.sortCloudFiles(mFiles);
|
|
|
}
|
|
|
|
|
@@ -1067,6 +1088,8 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
preferences.setSortOrder(folder, sortOrder);
|
|
|
mFiles = sortOrder.sortCloudFiles(mFiles);
|
|
|
notifyDataSetChanged();
|
|
|
+
|
|
|
+ this.sortOrder = sortOrder;
|
|
|
}
|
|
|
|
|
|
public Set<OCFile> getCheckedItems() {
|
|
@@ -1149,7 +1172,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
if (!preferences.isShowHiddenFilesEnabled()) {
|
|
|
mFiles = filterHiddenFiles(mFiles);
|
|
|
}
|
|
|
- FileSortOrder sortOrder = preferences.getSortOrderByFolder(currentDirectory);
|
|
|
+ sortOrder = preferences.getSortOrderByFolder(currentDirectory);
|
|
|
mFiles = sortOrder.sortCloudFiles(mFiles);
|
|
|
}
|
|
|
|
|
@@ -1209,6 +1232,27 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|
|
showMetadata = bool;
|
|
|
}
|
|
|
|
|
|
+ @NonNull
|
|
|
+ @Override
|
|
|
+ public String getSectionName(int position) {
|
|
|
+ OCFile file = getItem(position);
|
|
|
+
|
|
|
+ if (file == null) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sortOrder.getType() == FileSortOrder.SortType.ALPHABET) {
|
|
|
+ return String.valueOf(file.getFileName().charAt(0)).toUpperCase(Locale.getDefault());
|
|
|
+ } else if (sortOrder.getType() == FileSortOrder.SortType.DATE) {
|
|
|
+ long milliseconds = file.getModificationTimestamp();
|
|
|
+ Date date = new Date(milliseconds);
|
|
|
+ return dateFormat.format(date);
|
|
|
+ } else {
|
|
|
+ // Size
|
|
|
+ return DisplayUtils.bytesToHumanReadable(file.getFileLength());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@VisibleForTesting
|
|
|
public void setShowShareAvatar(boolean bool) {
|
|
|
showShareAvatar = bool;
|