Browse Source

Fastscroll for all lists

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 3 years ago
parent
commit
cf932e69e7

+ 2 - 0
app/build.gradle

@@ -281,6 +281,8 @@ dependencies {
     implementation "com.google.android.exoplayer:exoplayer:$exoplayerVersion"
     implementation "com.google.android.exoplayer:extension-okhttp:$exoplayerVersion"
 
+    implementation 'com.simplecityapps:recyclerview-fastscroll:2.0.1'
+    
     // Shimmer animation
     implementation 'com.elyeproj.libraries:loaderviewlibrary:2.0.0'
 

+ 4 - 4
app/src/main/java/com/owncloud/android/ui/EmptyRecyclerView.java

@@ -25,14 +25,14 @@ import android.content.Context;
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
+
 import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.RecyclerView;
 
 /**
- * Extends RecyclerView to show a custom view if no data is available
- * Inspired by http://alexzh.com/tutorials/how-to-setemptyview-to-recyclerview
+ * Extends RecyclerView to show a custom view if no data is available Inspired by http://alexzh.com/tutorials/how-to-setemptyview-to-recyclerview
  */
-public class EmptyRecyclerView extends RecyclerView {
+public class EmptyRecyclerView extends FastScrollRecyclerView {
     private View mEmptyView;
     private boolean hasFooter = false;
 

+ 41 - 2
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -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;
@@ -138,6 +141,8 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
     private OCFile highlightedItem;
     private boolean showMetadata = true;
 
+    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
+
     public OCFileListAdapter(
         Activity activity,
         User user,
@@ -770,13 +775,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);
     }
 
@@ -1209,6 +1219,35 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         showMetadata = bool;
     }
 
+    @NonNull
+    @Override
+    public String getSectionName(int position) {
+        // sort
+        Enum<FileSortOrder.SortType> sortOrderType;
+        if (ocFileListFragmentInterface.isGalleryFragment()) {
+            sortOrderType = FileSortOrder.SortType.DATE;
+        } else {
+            sortOrderType = preferences.getSortOrderByFolder(currentDirectory).getType();
+        }
+
+        OCFile file = getItem(position);
+
+        if (file == null) {
+            return "";
+        }
+
+        if (sortOrderType == FileSortOrder.SortType.ALPHABET) {
+            return String.valueOf(file.getFileName().charAt(0));
+        } else if (sortOrderType == 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;

+ 5 - 0
app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java

@@ -229,4 +229,9 @@ public class GalleryFragment extends OCFileListFragment {
             }
         }
     }
+
+    @Override
+    public boolean isGalleryFragment() {
+        return true;
+    }
 }

+ 5 - 0
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -1656,6 +1656,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
         return searchFragment;
     }
 
+    @Override
+    public boolean isGalleryFragment() {
+        return false;
+    }
+
     /**
      * De-/select all elements in the current list view.
      *

+ 2 - 0
app/src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java

@@ -50,4 +50,6 @@ public interface OCFileListFragmentInterface {
     void onHeaderClicked();
 
     boolean isSearchFragment();
+
+    boolean isGalleryFragment();
 }

+ 19 - 0
app/src/main/java/com/owncloud/android/utils/FileSortOrder.kt

@@ -38,6 +38,10 @@ open class FileSortOrder(@JvmField var name: String, var isAscending: Boolean) {
         trashBinView, localFileListView
     }
 
+    enum class SortType {
+        SIZE, ALPHABET, DATE
+    }
+
     companion object {
         const val sort_a_to_z_id = "sort_a_to_z"
         const val sort_z_to_a_id = "sort_z_to_a"
@@ -106,4 +110,19 @@ open class FileSortOrder(@JvmField var name: String, var isAscending: Boolean) {
     open fun sortTrashbinFiles(files: MutableList<TrashbinFile>): List<TrashbinFile> {
         return files
     }
+
+    open fun getType(): Enum<SortType> {
+        return when (name) {
+            sort_z_to_a_id,
+            sort_a_to_z_id -> SortType.ALPHABET
+
+            sort_small_to_big_id,
+            sort_big_to_small_id -> SortType.SIZE
+
+            sort_new_to_old_id,
+            sort_old_to_new_id -> SortType.DATE
+
+            else -> SortType.ALPHABET
+        }
+    }
 }

+ 6 - 1
app/src/main/res/layout/list_fragment.xml

@@ -33,7 +33,12 @@
         <com.owncloud.android.ui.EmptyRecyclerView
             android:id="@+id/list_root"
             android:layout_width="match_parent"
-            android:layout_height="match_parent" />
+            android:layout_height="match_parent"
+            app:fastScrollPopupBgColor="@color/color_accent"
+            app:fastScrollPopupTextColor="@color/login_text_color"
+            app:fastScrollThumbColor="@color/color_accent"
+            app:fastScrollAutoHide="true"
+            app:fastScrollAutoHideDelay="1500" />
     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <include