Added sorting by name, date or size ascending/descending
authortobiasKaminsky <tobias@kaminsky.me>
Sun, 14 Sep 2014 13:51:09 +0000 (15:51 +0200)
committertobiasKaminsky <tobias@kaminsky.me>
Sun, 14 Sep 2014 13:51:09 +0000 (15:51 +0200)
res/menu/main_menu.xml
res/values-de/strings.xml
res/values/strings.xml
src/com/owncloud/android/datamodel/OCFile.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

index 979d730..506ed15 100644 (file)
         android:orderInCategory="2"
         android:showAsAction="never"
         android:title="@string/actionbar_settings"/>
         android:orderInCategory="2"
         android:showAsAction="never"
         android:title="@string/actionbar_settings"/>
+    <item
+        android:id="@+id/action_sort"
+        android:orderInCategory="2"
+        android:showAsAction="never"
+        android:title="@string/actionbar_sort"/>
 
     <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item> -->
 
 
     <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item> -->
 
index c20c88f..bc9313d 100644 (file)
   <string name="actionbar_settings">Einstellungen</string>
   <string name="actionbar_see_details">Details</string>
   <string name="actionbar_send_file">Senden</string>
   <string name="actionbar_settings">Einstellungen</string>
   <string name="actionbar_see_details">Details</string>
   <string name="actionbar_send_file">Senden</string>
+  <string name="actionbar_sort">Sortieren</string>
+  <string name="actionbar_sort_title">Sortieren nach</string>
+  <string-array name="actionbar_sortby">
+       <item>Dateiname - aufsteigend</item>
+       <item>Dateiname - absteigend</item>
+       <item>Datum - aufsteigend</item>
+       <item>Datum - absteigend</item>
+       <item>Dateigröße - aufsteigend</item>
+       <item>Dateigröße - absteigend</item>
+  </string-array>
   <string name="prefs_category_general">Allgemein</string>
   <string name="prefs_category_more">Mehr</string>
   <string name="prefs_accounts">Konten</string>
   <string name="prefs_category_general">Allgemein</string>
   <string name="prefs_category_more">Mehr</string>
   <string name="prefs_accounts">Konten</string>
index 4091080..d9cd374 100644 (file)
     <string name="actionbar_settings">Settings</string>
     <string name="actionbar_see_details">Details</string>
     <string name="actionbar_send_file">Send</string>
     <string name="actionbar_settings">Settings</string>
     <string name="actionbar_see_details">Details</string>
     <string name="actionbar_send_file">Send</string>
+    <string name="actionbar_sort">Sort</string>
+    <string name="actionbar_sort_title">Sort by</string>
+    <string-array name="actionbar_sortby">
+       <item>Filename - ascending</item>
+       <item>Filename - descending</item>
+       <item>Date - ascending</item>
+       <item>Date - descending</item>
+       <item>Filesize - ascending</item>
+       <item>Filesize - descending</item>
+    </string-array>
     <string name="prefs_category_general">General</string>
     <string name="prefs_category_more">More</string>
     <string name="prefs_accounts">Accounts</string>
     <string name="prefs_category_general">General</string>
     <string name="prefs_category_more">More</string>
     <string name="prefs_accounts">Accounts</string>
index 92168ff..03ec163 100644 (file)
@@ -446,7 +446,7 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         } else if (another.isFolder()) {
             return 1;
         }
         } else if (another.isFolder()) {
             return 1;
         }
-        return getRemotePath().toLowerCase().compareTo(another.getRemotePath().toLowerCase());
+        return new AlphanumComparator().compare(this, another);
     }
 
     @Override
     }
 
     @Override
index 6329833..c86380d 100644 (file)
@@ -491,6 +491,38 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener {
             }
             break;
         }
             }
             break;
         }
+        case R.id.action_sort: {
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle(R.string.actionbar_sort_title)
+            .setItems(R.array.actionbar_sortby, new DialogInterface.OnClickListener() {
+                public void onClick(DialogInterface dialog, int which) {
+                    Log_OC.d("default view", " number " + which + "clicked");
+                    switch (which){
+                    case 0:
+                        sortByName(true);
+                        break;
+                    case 1:
+                        sortByName(false);
+                        break;
+                    case 2:
+                        sortByDate(true);
+                        break;
+                    case 3:
+                        sortByDate(false);
+                        break;
+                    case 4:
+                        sortBySize(true);
+                        break;
+                    case 5:
+                        sortBySize(false);
+                        break;
+                    }
+                }
+            });
+            builder.create();
+            builder.show();
+            break;
+        }
         default:
             retval = super.onOptionsItemSelected(item);
         }
         default:
             retval = super.onOptionsItemSelected(item);
         }
@@ -1725,5 +1757,17 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener {
             }
         }
     }
             }
         }
     }
+    
+    private void sortByDate(boolean ascending){
+        getListOfFilesFragment().sortByDate(ascending);
+    }
+
+    private void sortBySize(boolean ascending){
+        getListOfFilesFragment().sortBySize(ascending);
+    }
+
+    private void sortByName(boolean ascending){
+        getListOfFilesFragment().sortByName(ascending);
+    }
 
 }
 
 }
index 65a9c83..bab3d85 100644 (file)
@@ -17,6 +17,8 @@
  */\r
 package com.owncloud.android.ui.adapter;\r
 \r
  */\r
 package com.owncloud.android.ui.adapter;\r
 \r
+import java.util.Collections;\r
+import java.util.Comparator;\r
 import java.util.Vector;\r
 \r
 import android.accounts.Account;\r
 import java.util.Vector;\r
 \r
 import android.accounts.Account;\r
@@ -58,6 +60,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
     private FileDataStorageManager mStorageManager;
     private Account mAccount;
     private ComponentsGetter mTransferServiceGetter;\r
     private FileDataStorageManager mStorageManager;
     private Account mAccount;
     private ComponentsGetter mTransferServiceGetter;\r
+    public enum sortOrders { NAME, DATE, SIZE }\r
+    private sortOrders sort = sortOrders.NAME;\r
+    private boolean sortAscending = true;\r
     \r
     public FileListListAdapter(\r
             boolean justFolders, \r
     \r
     public FileListListAdapter(\r
             boolean justFolders, \r
@@ -243,6 +248,32 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         } else {\r
             mFiles = null;\r
         }\r
         } else {\r
             mFiles = null;\r
         }\r
+\r
+        sortDirectory();\r
+    }\r
+    \r
+    /**\r
+     * Sorts all filenames, regarding last user decision \r
+     */\r
+    private void sortDirectory(){\r
+        switch (sort){\r
+        case NAME:\r
+            sortByName();\r
+            break;\r
+\r
+        case SIZE:\r
+            sortBySize();\r
+            break;\r
+\r
+        case DATE:\r
+            sortByDate();\r
+            break;\r
+        }\r
+\r
+        if (!sortAscending){\r
+            Collections.reverse(mFiles);\r
+        }\r
+\r
         notifyDataSetChanged();\r
     }\r
     \r
         notifyDataSetChanged();\r
     }\r
     \r
@@ -276,4 +307,53 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
         return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)\r
                 && file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));\r
     }\r
         return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME)\r
                 && file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));\r
     }\r
+\r
+    private void sortByDate(){\r
+        Collections.sort(mFiles, new Comparator<OCFile>() {\r
+            public int compare(OCFile o1, OCFile o2) {\r
+                if (o1.isFolder() && o2.isFolder()) {\r
+                    return Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp());\r
+                }\r
+                else if (o1.isFolder()) {\r
+                    return -1;\r
+                } else if (o2.isFolder()) {\r
+                    return 1;\r
+                } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){\r
+                    return 0;\r
+                } else {\r
+                    return Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp());\r
+                }\r
+            }\r
+        });\r
+    }\r
+\r
+    private void sortBySize(){\r
+        Collections.sort(mFiles, new Comparator<OCFile>() {\r
+            public int compare(OCFile o1, OCFile o2) {\r
+                if (o1.isFolder() && o2.isFolder()) {\r
+                    return o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase());\r
+                }\r
+                else if (o1.isFolder()) {\r
+                    return -1;\r
+                } else if (o2.isFolder()) {\r
+                    return 1;\r
+                } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){\r
+                    return 0;\r
+                } else {\r
+                    return Long.compare(o1.getFileLength(), o2.getFileLength());\r
+                }\r
+            }\r
+        });\r
+    }\r
+\r
+    private void sortByName(){\r
+        Collections.sort(mFiles);\r
+    }\r
+\r
+    public void setSortOrder(sortOrders order, boolean descending) {\r
+        sort = order;\r
+        sortAscending = descending;\r
+\r
+        sortDirectory();\r
+    }    \r
 }\r
 }\r
index c11e864..72d9fb4 100644 (file)
@@ -37,6 +37,7 @@ import com.owncloud.android.files.FileMenuFilter;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.MoveActivity;
 import com.owncloud.android.ui.adapter.FileListListAdapter;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.MoveActivity;
 import com.owncloud.android.ui.adapter.FileListListAdapter;
+import com.owncloud.android.ui.adapter.FileListListAdapter.sortOrders;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
@@ -385,5 +386,16 @@ public class OCFileListFragment extends ExtendedListFragment {
             mFile = directory;
         }
     }
             mFile = directory;
         }
     }
+    
+    public void sortByDate(boolean descending){
+        mAdapter.setSortOrder(sortOrders.DATE, descending);
+    }
+
+    public void sortBySize(boolean descending){
+        mAdapter.setSortOrder(sortOrders.SIZE, descending);
+    }
 
 
+    public void sortByName(boolean descending){
+        mAdapter.setSortOrder(sortOrders.NAME, descending);
+    } 
 }
 }