Browse Source

defined new way of addressing and storing sort orders

- defined string constants for all sort orders
- defined new SortOrder classes to handle sorting
- store/retrieve string constant in/from preferences
- cleaned up related code
Sven R. Kunze 7 years ago
parent
commit
4b5e4b96a9

+ 9 - 29
src/main/java/com/owncloud/android/db/PreferenceManager.java

@@ -25,7 +25,7 @@ import android.content.SharedPreferences;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.ui.activity.ComponentsGetter;
-import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileSortOrder;
 
 
 /**
 /**
  * Helper to simplify reading of Preferences all around the app
  * Helper to simplify reading of Preferences all around the app
@@ -36,8 +36,7 @@ public abstract class PreferenceManager {
      * Value handled by the app without direct access in the UI.
      * Value handled by the app without direct access in the UI.
      */
      */
     private static final String AUTO_PREF__LAST_UPLOAD_PATH = "last_upload_path";
     private static final String AUTO_PREF__LAST_UPLOAD_PATH = "last_upload_path";
-    private static final String AUTO_PREF__SORT_ORDER = "sort_order";
-    private static final String AUTO_PREF__SORT_ASCENDING = "sort_ascending";
+    private static final String AUTO_PREF__SORT_ORDER_NAME = "sort_order_name";
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_MAP_URL = "prefs_upload_file_extension_map_url";
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_MAP_URL = "prefs_upload_file_extension_map_url";
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_URL = "prefs_upload_file_extension_url";
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_URL = "prefs_upload_file_extension_url";
     private static final String AUTO_PREF__UPLOADER_BEHAVIOR = "prefs_uploader_behaviour";
     private static final String AUTO_PREF__UPLOADER_BEHAVIOR = "prefs_uploader_behaviour";
@@ -199,40 +198,21 @@ public abstract class PreferenceManager {
      * Gets the sort order which the user has set last.
      * Gets the sort order which the user has set last.
      *
      *
      * @param context Caller {@link Context}, used to access to shared preferences manager.
      * @param context Caller {@link Context}, used to access to shared preferences manager.
-     * @return sort order     the sort order, default is {@link FileStorageUtils#SORT_NAME} (sort by name)
+     * @return sort order     the sort order, default is {@link FileSortOrder#sort_a_to_z} (sort by name)
      */
      */
-    public static int getSortOrder(Context context) {
-        return getDefaultSharedPreferences(context).getInt(AUTO_PREF__SORT_ORDER, FileStorageUtils.SORT_NAME);
+    public static FileSortOrder getSortOrder(Context context) {
+        String name = getDefaultSharedPreferences(context).getString(AUTO_PREF__SORT_ORDER_NAME, FileSortOrder.sort_a_to_z.mName);
+        return FileSortOrder.sortOrders.get(name);
     }
     }
 
 
     /**
     /**
      * Save the sort order which the user has set last.
      * Save the sort order which the user has set last.
      *
      *
      * @param context Caller {@link Context}, used to access to shared preferences manager.
      * @param context Caller {@link Context}, used to access to shared preferences manager.
-     * @param order   the sort order
+     * @param sortOrder   the sort order
      */
      */
-    public static void setSortOrder(Context context, int order) {
-        saveIntPreference(context, AUTO_PREF__SORT_ORDER, order);
-    }
-
-    /**
-     * Gets the ascending order flag which the user has set last.
-     *
-     * @param context Caller {@link Context}, used to access to shared preferences manager.
-     * @return ascending order     the ascending order, default is true
-     */
-    public static boolean getSortAscending(Context context) {
-        return getDefaultSharedPreferences(context).getBoolean(AUTO_PREF__SORT_ASCENDING, true);
-    }
-
-    /**
-     * Saves the ascending order flag which the user has set last.
-     *
-     * @param context   Caller {@link Context}, used to access to shared preferences manager.
-     * @param ascending flag if sorting is ascending or descending
-     */
-    public static void setSortAscending(Context context, boolean ascending) {
-        saveBooleanPreference(context, AUTO_PREF__SORT_ASCENDING, ascending);
+    public static void setSortOrder(Context context, FileSortOrder sortOrder) {
+        saveStringPreference(context, AUTO_PREF__SORT_ORDER_NAME, sortOrder.mName);
     }
     }
 
 
     /**
     /**

+ 4 - 40
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -106,6 +106,7 @@ import com.owncloud.android.ui.preview.PreviewVideoActivity;
 import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.ErrorMessageAdapter;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.PushUtils;
 import com.owncloud.android.utils.PushUtils;
@@ -120,7 +121,6 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
 
 
-import static com.owncloud.android.db.PreferenceManager.getSortAscending;
 import static com.owncloud.android.db.PreferenceManager.getSortOrder;
 import static com.owncloud.android.db.PreferenceManager.getSortOrder;
 
 
 /**
 /**
@@ -778,8 +778,7 @@ public class FileDisplayActivity extends HookActivity
                 ft.addToBackStack(null);
                 ft.addToBackStack(null);
 
 
                 SortingOrderDialogFragment mSortingOrderDialogFragment = SortingOrderDialogFragment.newInstance(
                 SortingOrderDialogFragment mSortingOrderDialogFragment = SortingOrderDialogFragment.newInstance(
-                        getSortOrder(this),
-                        getSortAscending(this)
+                        getSortOrder(this)
                 );
                 );
                 mSortingOrderDialogFragment.show(ft, SORT_ORDER_DIALOG_TAG);
                 mSortingOrderDialogFragment.show(ft, SORT_ORDER_DIALOG_TAG);
 
 
@@ -1168,31 +1167,8 @@ public class FileDisplayActivity extends HookActivity
     }
     }
 
 
     @Override
     @Override
-    public void onSortingOrderChosen(int selection) {
-        switch (selection) {
-            case SortingOrderDialogFragment.BY_NAME_ASC:
-                sortByName(true);
-                break;
-            case SortingOrderDialogFragment.BY_NAME_DESC:
-                sortByName(false);
-                break;
-            case SortingOrderDialogFragment.BY_MODIFICATION_DATE_ASC:
-                sortByDate(true);
-                break;
-            case SortingOrderDialogFragment.BY_MODIFICATION_DATE_DESC:
-                sortByDate(false);
-                break;
-            case SortingOrderDialogFragment.BY_SIZE_ASC:
-                sortBySize(true);
-                break;
-            case SortingOrderDialogFragment.BY_SIZE_DESC:
-                sortBySize(false);
-                break;
-            default: // defaulting to alphabetical-ascending
-                Log_OC.w(TAG, "Unknown sort order, defaulting to alphabetical-ascending!");
-                sortByName(true);
-                break;
-        }
+    public void onSortingOrderChosen(FileSortOrder selection) {
+        getListOfFilesFragment().sortFiles(selection);
     }
     }
 
 
     private class SyncBroadcastReceiver extends BroadcastReceiver {
     private class SyncBroadcastReceiver extends BroadcastReceiver {
@@ -2179,18 +2155,6 @@ public class FileDisplayActivity extends HookActivity
         }
         }
     }
     }
 
 
-    private void sortByDate(boolean ascending) {
-        getListOfFilesFragment().sortByDate(ascending);
-    }
-
-    private void sortBySize(boolean ascending) {
-        getListOfFilesFragment().sortBySize(ascending);
-    }
-
-    private void sortByName(boolean ascending) {
-        getListOfFilesFragment().sortByName(ascending);
-    }
-
     private boolean isGridView() {
     private boolean isGridView() {
         return getListOfFilesFragment().isGridEnabled();
         return getListOfFilesFragment().isGridEnabled();
     }
     }

+ 3 - 5
src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -94,7 +94,7 @@ import com.owncloud.android.ui.helpers.UriUploader;
 import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.ErrorMessageAdapter;
-import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
 import java.io.File;
 import java.io.File;
@@ -823,10 +823,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
     }
     }
 
 
     private Vector<OCFile> sortFileList(Vector<OCFile> files) {
     private Vector<OCFile> sortFileList(Vector<OCFile> files) {
-        // Read sorting order, default to sort by name ascending
-        FileStorageUtils.mSortOrder = PreferenceManager.getSortOrder(this);
-        FileStorageUtils.mSortAscending = PreferenceManager.getSortAscending(this);
-        return FileStorageUtils.sortOcFolder(files);
+        FileSortOrder sortOrder = PreferenceManager.getSortOrder(this);
+        return sortOrder.sortCloudFiles(files);
     }
     }
 
 
     private String generatePath(Stack<String> dirs) {
     private String generatePath(Stack<String> dirs) {

+ 4 - 28
src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -55,12 +55,12 @@ import com.owncloud.android.ui.dialog.SortingOrderDialogFragment;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.fragment.LocalFileListFragment;
 import com.owncloud.android.ui.fragment.LocalFileListFragment;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.AnalyticsUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
 import java.io.File;
 import java.io.File;
 
 
-import static com.owncloud.android.db.PreferenceManager.getSortAscending;
 import static com.owncloud.android.db.PreferenceManager.getSortOrder;
 import static com.owncloud.android.db.PreferenceManager.getSortOrder;
 
 
 
 
@@ -241,8 +241,7 @@ public class UploadFilesActivity extends FileActivity implements
                 ft.addToBackStack(null);
                 ft.addToBackStack(null);
 
 
                 SortingOrderDialogFragment mSortingOrderDialogFragment = SortingOrderDialogFragment.newInstance(
                 SortingOrderDialogFragment mSortingOrderDialogFragment = SortingOrderDialogFragment.newInstance(
-                        getSortOrder(this),
-                        getSortAscending(this)
+                        getSortOrder(this)
                 );
                 );
                 mSortingOrderDialogFragment.show(ft, SORT_ORDER_DIALOG_TAG);
                 mSortingOrderDialogFragment.show(ft, SORT_ORDER_DIALOG_TAG);
 
 
@@ -267,31 +266,8 @@ public class UploadFilesActivity extends FileActivity implements
     }
     }
 
 
     @Override
     @Override
-    public void onSortingOrderChosen(int selection) {
-        switch (selection) {
-            case SortingOrderDialogFragment.BY_NAME_ASC:
-                mFileListFragment.sortByName(true);
-                break;
-            case SortingOrderDialogFragment.BY_NAME_DESC:
-                mFileListFragment.sortByName(false);
-                break;
-            case SortingOrderDialogFragment.BY_MODIFICATION_DATE_ASC:
-                mFileListFragment.sortByDate(true);
-                break;
-            case SortingOrderDialogFragment.BY_MODIFICATION_DATE_DESC:
-                mFileListFragment.sortByDate(false);
-                break;
-            case SortingOrderDialogFragment.BY_SIZE_ASC:
-                mFileListFragment.sortBySize(true);
-                break;
-            case SortingOrderDialogFragment.BY_SIZE_DESC:
-                mFileListFragment.sortBySize(false);
-                break;
-            default: // defaulting to alphabetical-ascending
-                Log_OC.w(TAG, "Unknown sort order, defaulting to alphabetical-ascending!");
-                mFileListFragment.sortByName(true);
-                break;
-        }
+    public void onSortingOrderChosen(FileSortOrder selection) {
+        mFileListFragment.sortFiles(selection);
     }
     }
     
     
     @Override
     @Override

+ 10 - 16
src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -64,6 +64,7 @@ import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
 import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
@@ -108,10 +109,6 @@ public class FileListListAdapter extends BaseAdapter {
 
 
         mTransferServiceGetter = transferServiceGetter;
         mTransferServiceGetter = transferServiceGetter;
 
 
-        // Read sorting order, default to sort by name ascending
-        FileStorageUtils.mSortOrder = PreferenceManager.getSortOrder(mContext);
-        FileStorageUtils.mSortAscending = PreferenceManager.getSortAscending(mContext);
-
         // initialise thumbnails cache on background thread
         // initialise thumbnails cache on background thread
         new ThumbnailsCacheManager.InitDiskCacheTask().execute();
         new ThumbnailsCacheManager.InitDiskCacheTask().execute();
     }
     }
@@ -482,7 +479,8 @@ public class FileListListAdapter extends BaseAdapter {
             if (!PreferenceManager.showHiddenFilesEnabled(mContext)) {
             if (!PreferenceManager.showHiddenFilesEnabled(mContext)) {
                 mFiles = filterHiddenFiles(mFiles);
                 mFiles = filterHiddenFiles(mFiles);
             }
             }
-            mFiles = FileStorageUtils.sortOcFolder(mFiles);
+            FileSortOrder sortOrder = PreferenceManager.getSortOrder(mContext);
+            mFiles = sortOrder.sortCloudFiles(mFiles);
             mFilesAll.clear();
             mFilesAll.clear();
             mFilesAll.addAll(mFiles);
             mFilesAll.addAll(mFiles);
 
 
@@ -524,7 +522,8 @@ public class FileListListAdapter extends BaseAdapter {
                 !searchType.equals(ExtendedListFragment.SearchType.PHOTOS_SEARCH_FILTER) &&
                 !searchType.equals(ExtendedListFragment.SearchType.PHOTOS_SEARCH_FILTER) &&
                 !searchType.equals(ExtendedListFragment.SearchType.RECENTLY_MODIFIED_SEARCH) &&
                 !searchType.equals(ExtendedListFragment.SearchType.RECENTLY_MODIFIED_SEARCH) &&
                 !searchType.equals(ExtendedListFragment.SearchType.RECENTLY_MODIFIED_SEARCH_FILTER)) {
                 !searchType.equals(ExtendedListFragment.SearchType.RECENTLY_MODIFIED_SEARCH_FILTER)) {
-            mFiles = FileStorageUtils.sortOcFolder(mFiles);
+            FileSortOrder sortOrder = PreferenceManager.getSortOrder(mContext);
+            mFiles = sortOrder.sortCloudFiles(mFiles);
         } else {
         } else {
             mFiles = FileStorageUtils.sortOcFolderDescDateModified(mFiles);
             mFiles = FileStorageUtils.sortOcFolderDescDateModified(mFiles);
         }
         }
@@ -642,15 +641,9 @@ public class FileListListAdapter extends BaseAdapter {
     }
     }
 
 
 
 
-    public void setSortOrder(Integer order, boolean ascending) {
-
-        PreferenceManager.setSortOrder(mContext, order);
-        PreferenceManager.setSortAscending(mContext, ascending);
-
-        FileStorageUtils.mSortOrder = order;
-        FileStorageUtils.mSortAscending = ascending;
-
-        mFiles = FileStorageUtils.sortOcFolder(mFiles);
+    public void setSortOrder(FileSortOrder sortOrder) {
+        PreferenceManager.setSortOrder(mContext, sortOrder);
+        mFiles = sortOrder.sortCloudFiles(mFiles);
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
 
 
@@ -714,7 +707,8 @@ public class FileListListAdapter extends BaseAdapter {
                 if (!PreferenceManager.showHiddenFilesEnabled(mContext)) {
                 if (!PreferenceManager.showHiddenFilesEnabled(mContext)) {
                     mFiles = filterHiddenFiles(mFiles);
                     mFiles = filterHiddenFiles(mFiles);
                 }
                 }
-                mFiles = FileStorageUtils.sortOcFolder(mFiles);
+                FileSortOrder sortOrder = PreferenceManager.getSortOrder(mContext);
+                mFiles = sortOrder.sortCloudFiles(mFiles);
             }
             }
 
 
             notifyDataSetChanged();
             notifyDataSetChanged();

+ 6 - 15
src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -37,7 +37,7 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 
 
 import java.io.File;
 import java.io.File;
@@ -65,11 +65,6 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
     public LocalFileListAdapter(boolean localFolderPickerMode, File directory, Context context) {
     public LocalFileListAdapter(boolean localFolderPickerMode, File directory, Context context) {
         mContext = context;
         mContext = context;
         mLocalFolderPicker = localFolderPickerMode;
         mLocalFolderPicker = localFolderPickerMode;
-
-        // Read sorting order, default to sort by name ascending
-        FileStorageUtils.mSortOrder = PreferenceManager.getSortOrder(context);
-        FileStorageUtils.mSortAscending =PreferenceManager.getSortAscending(context);
-
         swapDirectory(directory);
         swapDirectory(directory);
     }
     }
 
 
@@ -298,7 +293,8 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
                 }
                 }
             });
             });
 
 
-            mFiles = FileStorageUtils.sortLocalFolder(mFiles);
+            FileSortOrder sortOrder = PreferenceManager.getSortOrder(mContext);
+            mFiles = sortOrder.sortLocalFiles(mFiles);
 
 
             // Fetch preferences for showing hidden files
             // Fetch preferences for showing hidden files
             boolean showHiddenFiles = PreferenceManager.showHiddenFilesEnabled(mContext);
             boolean showHiddenFiles = PreferenceManager.showHiddenFilesEnabled(mContext);
@@ -313,14 +309,9 @@ public class LocalFileListAdapter extends BaseAdapter implements FilterableListA
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
 
 
-    public void setSortOrder(Integer order, boolean ascending) {
-        PreferenceManager.setSortOrder(mContext, order);
-        PreferenceManager.setSortAscending(mContext, ascending);
-
-        FileStorageUtils.mSortOrder = order;
-        FileStorageUtils.mSortAscending = ascending;
-
-        mFiles = FileStorageUtils.sortLocalFolder(mFiles);
+    public void setSortOrder(FileSortOrder sortOrder) {
+        PreferenceManager.setSortOrder(mContext, sortOrder);
+        mFiles = sortOrder.sortLocalFiles(mFiles);
         notifyDataSetChanged();
         notifyDataSetChanged();
     }
     }
 
 

+ 48 - 121
src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java

@@ -35,6 +35,7 @@ import android.widget.TextView;
 
 
 import com.owncloud.android.R;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
 /**
 /**
@@ -45,40 +46,17 @@ public class SortingOrderDialogFragment extends DialogFragment {
     private final static String TAG = SortingOrderDialogFragment.class.getSimpleName();
     private final static String TAG = SortingOrderDialogFragment.class.getSimpleName();
 
 
     private static final String KEY_SORT_ORDER = "SORT_ORDER";
     private static final String KEY_SORT_ORDER = "SORT_ORDER";
-    private static final String KEY_ASCENDING = "ASCENDING";
-
-    public static final int BY_NAME_ASC = 0;
-    public static final int BY_NAME_DESC = 1;
-    public static final int BY_MODIFICATION_DATE_ASC = 2;
-    public static final int BY_MODIFICATION_DATE_DESC = 3;
-    public static final int BY_SIZE_ASC = 4;
-    public static final int BY_SIZE_DESC = 5;
 
 
     private View mView = null;
     private View mView = null;
-    private ImageButton mSortByNameAscendingButton = null;
-    private ImageButton mSortByNameDescendingButton = null;
-    private ImageButton mSortBySizeAscendingButton = null;
-    private ImageButton mSortBySizeDescendingButton = null;
-    private ImageButton mSortByModificationDateAscendingButton = null;
-    private ImageButton mSortByModificationDateDescendingButton = null;
-
-    private TextView mSortByNameAscendingText = null;
-    private TextView mSortByNameDescendingText = null;
-    private TextView mSortBySizeAscendingText = null;
-    private TextView mSortBySizeDescendingText = null;
-    private TextView mSortByModificationDateAscendingText = null;
-    private TextView mSortByModificationDateDescendingText = null;
-
-    private int mSortOrder;
-    private boolean mSortAscending;
+    private View[] mTaggedViews;
     private AppCompatButton mCancel;
     private AppCompatButton mCancel;
+    private String mCurrentSortOrderName;
 
 
-    public static SortingOrderDialogFragment newInstance(int sortOrder, boolean ascending) {
+    public static SortingOrderDialogFragment newInstance(FileSortOrder sortOrder) {
         SortingOrderDialogFragment dialogFragment = new SortingOrderDialogFragment();
         SortingOrderDialogFragment dialogFragment = new SortingOrderDialogFragment();
 
 
         Bundle args = new Bundle();
         Bundle args = new Bundle();
-        args.putInt(KEY_SORT_ORDER, sortOrder);
-        args.putBoolean(KEY_ASCENDING, ascending);
+        args.putString(KEY_SORT_ORDER, sortOrder.mName);
         dialogFragment.setArguments(args);
         dialogFragment.setArguments(args);
 
 
         dialogFragment.setStyle(STYLE_NORMAL, R.style.Theme_ownCloud_Dialog);
         dialogFragment.setStyle(STYLE_NORMAL, R.style.Theme_ownCloud_Dialog);
@@ -93,9 +71,7 @@ public class SortingOrderDialogFragment extends DialogFragment {
         setRetainInstance(true);
         setRetainInstance(true);
 
 
         mView = null;
         mView = null;
-
-        mSortOrder = getArguments().getInt(KEY_SORT_ORDER, BY_NAME_ASC);
-        mSortAscending = getArguments().getBoolean(KEY_ASCENDING, true);
+        mCurrentSortOrderName = getArguments().getString(KEY_SORT_ORDER, FileSortOrder.sort_a_to_z.mName);
     }
     }
 
 
     @Override
     @Override
@@ -116,36 +92,34 @@ public class SortingOrderDialogFragment extends DialogFragment {
      * @param view the parent view
      * @param view the parent view
      */
      */
     private void setupDialogElements(View view) {
     private void setupDialogElements(View view) {
-        // find/saves UI elements
-        mSortByNameAscendingButton = (ImageButton) view.findViewById(R.id.sortByNameAscending);
-        mSortByNameDescendingButton = (ImageButton) view.findViewById(R.id.sortByNameDescending);
-        mSortByModificationDateAscendingButton = (ImageButton) view.findViewById(R.id.sortByModificationDateAscending);
-        mSortByModificationDateDescendingButton = (ImageButton) view.findViewById(R.id.sortByModificationDateDescending);
-        mSortBySizeAscendingButton = (ImageButton) view.findViewById(R.id.sortBySizeAscending);
-        mSortBySizeDescendingButton = (ImageButton) view.findViewById(R.id.sortBySizeDescending);
         mCancel = (AppCompatButton) view.findViewById(R.id.cancel);
         mCancel = (AppCompatButton) view.findViewById(R.id.cancel);
         mCancel.setTextColor(ThemeUtils.primaryAccentColor());
         mCancel.setTextColor(ThemeUtils.primaryAccentColor());
 
 
-        mSortByNameAscendingText = (TextView) view.findViewById(R.id.sortByNameAZText);
-        mSortByNameDescendingText = (TextView) view.findViewById(R.id.sortByNameZAText);
-        mSortByModificationDateAscendingText = (TextView) view.findViewById(R.id.sortByModificationDateOldestFirstText);
-        mSortByModificationDateDescendingText = (TextView) view.findViewById(R.id.sortByModificationDateNewestFirstText);
-        mSortBySizeAscendingText = (TextView) view.findViewById(R.id.sortBySizeSmallestFirstText);
-        mSortBySizeDescendingText = (TextView) view.findViewById(R.id.sortBySizeBiggestFirstText);
-
-        mSortByNameAscendingButton.setTag(BY_NAME_ASC);
-        mSortByNameDescendingButton.setTag(BY_NAME_DESC);
-        mSortByModificationDateAscendingButton.setTag(BY_MODIFICATION_DATE_ASC);
-        mSortByModificationDateDescendingButton.setTag(BY_MODIFICATION_DATE_DESC);
-        mSortBySizeAscendingButton.setTag(BY_SIZE_ASC);
-        mSortBySizeDescendingButton.setTag(BY_SIZE_DESC);
-
-        mSortByNameAscendingText.setTag(BY_NAME_ASC);
-        mSortByNameDescendingText.setTag(BY_NAME_DESC);
-        mSortByModificationDateAscendingText.setTag(BY_MODIFICATION_DATE_ASC);
-        mSortByModificationDateDescendingText.setTag(BY_MODIFICATION_DATE_DESC);
-        mSortBySizeAscendingText.setTag(BY_SIZE_ASC);
-        mSortBySizeDescendingText.setTag(BY_SIZE_DESC);
+        mTaggedViews = new View[12];
+        mTaggedViews[0] = view.findViewById(R.id.sortByNameAscending);
+        mTaggedViews[0].setTag(FileSortOrder.sort_a_to_z);
+        mTaggedViews[1] = view.findViewById(R.id.sortByNameAZText);
+        mTaggedViews[1].setTag(FileSortOrder.sort_a_to_z);
+        mTaggedViews[2] = view.findViewById(R.id.sortByNameDescending);
+        mTaggedViews[2].setTag(FileSortOrder.sort_z_to_a);
+        mTaggedViews[3] = view.findViewById(R.id.sortByNameZAText);
+        mTaggedViews[3].setTag(FileSortOrder.sort_z_to_a);
+        mTaggedViews[4] = view.findViewById(R.id.sortByModificationDateAscending);
+        mTaggedViews[4].setTag(FileSortOrder.sort_old_to_new);
+        mTaggedViews[5] = view.findViewById(R.id.sortByModificationDateOldestFirstText);
+        mTaggedViews[5].setTag(FileSortOrder.sort_old_to_new);
+        mTaggedViews[6] = view.findViewById(R.id.sortByModificationDateDescending);
+        mTaggedViews[6].setTag(FileSortOrder.sort_new_to_old);
+        mTaggedViews[7] = view.findViewById(R.id.sortByModificationDateNewestFirstText);
+        mTaggedViews[7].setTag(FileSortOrder.sort_new_to_old);
+        mTaggedViews[8] = view.findViewById(R.id.sortBySizeAscending);
+        mTaggedViews[8].setTag(FileSortOrder.sort_small_to_big);
+        mTaggedViews[9] = view.findViewById(R.id.sortBySizeSmallestFirstText);
+        mTaggedViews[9].setTag(FileSortOrder.sort_small_to_big);
+        mTaggedViews[10] = view.findViewById(R.id.sortBySizeDescending);
+        mTaggedViews[10].setTag(FileSortOrder.sort_big_to_small);
+        mTaggedViews[11] = view.findViewById(R.id.sortBySizeBiggestFirstText);
+        mTaggedViews[11].setTag(FileSortOrder.sort_big_to_small);
 
 
         setupActiveOrderSelection();
         setupActiveOrderSelection();
     }
     }
@@ -154,58 +128,21 @@ public class SortingOrderDialogFragment extends DialogFragment {
      * tints the icon reflecting the actual sorting choice in the apps primary color.
      * tints the icon reflecting the actual sorting choice in the apps primary color.
      */
      */
     private void setupActiveOrderSelection() {
     private void setupActiveOrderSelection() {
-        if (mSortAscending) {
-            switch (mSortOrder) {
-                case 0:
-                    colorActiveSortingIconAndText(mSortByNameAscendingButton,
-                            mSortByNameAscendingText);
-                    break;
-                case 1:
-                    colorActiveSortingIconAndText(mSortByModificationDateAscendingButton,
-                            mSortByModificationDateAscendingText);
-                    break;
-                case 2:
-                    colorActiveSortingIconAndText(mSortBySizeAscendingButton,
-                            mSortBySizeAscendingText);
-                    break;
-                default: //do nothing
-                    Log_OC.w(TAG, "Unknown sort order " + mSortOrder);
-                    break;
+        final int color = ThemeUtils.primaryAccentColor();
+        for (View view: mTaggedViews) {
+            if (!((FileSortOrder)view.getTag()).mName.equals(mCurrentSortOrderName)) {
+                continue;
+            }
+            if (view instanceof ImageButton) {
+                ThemeUtils.colorImageButton((ImageButton)view, color);
             }
             }
-        } else {
-            switch (mSortOrder) {
-                case 0:
-                    colorActiveSortingIconAndText(mSortByNameDescendingButton,
-                            mSortByNameDescendingText);
-                    break;
-                case 1:
-                    colorActiveSortingIconAndText(mSortByModificationDateDescendingButton,
-                            mSortByModificationDateDescendingText);
-                    break;
-                case 2:
-                    colorActiveSortingIconAndText(mSortBySizeDescendingButton,
-                            mSortBySizeDescendingText);
-                    break;
-                default: //do nothing
-                    Log_OC.w(TAG, "Unknown sort order " + mSortOrder);
-                    break;
+            if (view instanceof TextView) {
+                ((TextView)view).setTextColor(color);
+                ((TextView)view).setTypeface(Typeface.DEFAULT_BOLD);
             }
             }
         }
         }
     }
     }
 
 
-    /**
-     * Sets the text color and tint the icon of given text view and image button.
-     *
-     * @param imageButton the image button, the icon to be tinted
-     * @param textView    the text view, the text color to be set
-     */
-    private void colorActiveSortingIconAndText(ImageButton imageButton, TextView textView) {
-        int color = ThemeUtils.primaryAccentColor();
-        ThemeUtils.colorImageButton(imageButton, color);
-        textView.setTextColor(color);
-        textView.setTypeface(Typeface.DEFAULT_BOLD);
-    }
-
     /**
     /**
      * setup all listeners.
      * setup all listeners.
      */
      */
@@ -217,21 +154,11 @@ public class SortingOrderDialogFragment extends DialogFragment {
             }
             }
         });
         });
 
 
-        OnSortingOrderClickListener sortingClickListener = new OnSortingOrderClickListener();
-
-        mSortByNameAscendingButton.setOnClickListener(sortingClickListener);
-        mSortByNameDescendingButton.setOnClickListener(sortingClickListener);
-        mSortByModificationDateAscendingButton.setOnClickListener(sortingClickListener);
-        mSortByModificationDateDescendingButton.setOnClickListener(sortingClickListener);
-        mSortBySizeAscendingButton.setOnClickListener(sortingClickListener);
-        mSortBySizeDescendingButton.setOnClickListener(sortingClickListener);
+        OnSortOrderClickListener sortOrderClickListener = new OnSortOrderClickListener();
 
 
-        mSortByNameAscendingText.setOnClickListener(sortingClickListener);
-        mSortByNameDescendingText.setOnClickListener(sortingClickListener);
-        mSortByModificationDateAscendingText.setOnClickListener(sortingClickListener);
-        mSortByModificationDateDescendingText.setOnClickListener(sortingClickListener);
-        mSortBySizeAscendingText.setOnClickListener(sortingClickListener);
-        mSortBySizeDescendingText.setOnClickListener(sortingClickListener);
+        for (View view : mTaggedViews) {
+            view.setOnClickListener(sortOrderClickListener);
+        }
     }
     }
 
 
     @Override
     @Override
@@ -249,15 +176,15 @@ public class SortingOrderDialogFragment extends DialogFragment {
         super.onDestroyView();
         super.onDestroyView();
     }
     }
 
 
-    private class OnSortingOrderClickListener implements View.OnClickListener {
+    private class OnSortOrderClickListener implements View.OnClickListener {
         @Override
         @Override
         public void onClick(View v) {
         public void onClick(View v) {
             dismissAllowingStateLoss();
             dismissAllowingStateLoss();
-            ((SortingOrderDialogFragment.OnSortingOrderListener) getActivity()).onSortingOrderChosen((int) v.getTag());
+            ((SortingOrderDialogFragment.OnSortingOrderListener) getActivity()).onSortingOrderChosen((FileSortOrder) v.getTag());
         }
         }
     }
     }
 
 
     public interface OnSortingOrderListener {
     public interface OnSortingOrderListener {
-        void onSortingOrderChosen(int selection);
+        void onSortingOrderChosen(FileSortOrder selection);
     }
     }
 }
 }

+ 3 - 11
src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -39,7 +39,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.adapter.LocalFileListAdapter;
 import com.owncloud.android.ui.adapter.LocalFileListAdapter;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.AnalyticsUtils;
-import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
 import java.io.File;
 import java.io.File;
@@ -284,16 +284,8 @@ public class LocalFileListFragment extends ExtendedListFragment {
         return result.toArray(new String[result.size()]);
         return result.toArray(new String[result.size()]);
     }
     }
 
 
-    public void sortByName(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_NAME, descending);
-    }
-
-    public void sortByDate(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_DATE, descending);
-    }
-
-    public void sortBySize(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending);
+    public void sortFiles(FileSortOrder sortOrder) {
+        mAdapter.setSortOrder(sortOrder);
     }
     }
 
 
     /**
     /**

+ 3 - 11
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -94,7 +94,7 @@ import com.owncloud.android.ui.preview.PreviewMediaFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
@@ -1192,16 +1192,8 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi
         return output;
         return output;
     }
     }
 
 
-    public void sortByName(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_NAME, descending);
-    }
-
-    public void sortByDate(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_DATE, descending);
-    }
-
-    public void sortBySize(boolean descending) {
-        mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending);
+    public void sortFiles(FileSortOrder sortOrder) {
+        mAdapter.setSortOrder(sortOrder);
     }
     }
 
 
     /**
     /**

+ 2 - 3
src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java

@@ -29,6 +29,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.VirtualFolderType;
 import com.owncloud.android.datamodel.VirtualFolderType;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.FileSortOrderByName;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 
 
 import java.util.HashMap;
 import java.util.HashMap;
@@ -79,9 +80,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
         mAccount = account;
         mAccount = account;
         mStorageManager = storageManager;
         mStorageManager = storageManager;
         mImageFiles = mStorageManager.getFolderImages(parentFolder, onlyOnDevice);
         mImageFiles = mStorageManager.getFolderImages(parentFolder, onlyOnDevice);
-        
-        mImageFiles = FileStorageUtils.sortOcFolder(mImageFiles);
-        
+        mImageFiles = FileSortOrderByName.sort_a_to_z.sortCloudFiles(mImageFiles);
         mObsoleteFragments = new HashSet<Object>();
         mObsoleteFragments = new HashSet<Object>();
         mObsoletePositions = new HashSet<Integer>();
         mObsoletePositions = new HashSet<Integer>();
         mDownloadErrors = new HashSet<Integer>();
         mDownloadErrors = new HashSet<Integer>();

+ 92 - 0
src/main/java/com/owncloud/android/utils/FileSortOrder.java

@@ -0,0 +1,92 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Sven R. Kunze
+ * Copyright (C) 2017 Sven R. Kunze
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.utils;
+
+import com.owncloud.android.datamodel.OCFile;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * Created by srkunze on 28.08.17.
+ */
+
+public class FileSortOrder {
+    public static final FileSortOrder sort_a_to_z = new FileSortOrderByName("sort_a_to_z", true);
+    public static final FileSortOrder sort_z_to_a = new FileSortOrderByName("sort_z_to_a", false);
+    public static final FileSortOrder sort_old_to_new = new FileSortOrderByDate("sort_old_to_new", true);
+    public static final FileSortOrder sort_new_to_old = new FileSortOrderByDate("sort_new_to_old", false);
+    public static final FileSortOrder sort_small_to_big = new FileSortOrderBySize("sort_small_to_big", true);
+    public static final FileSortOrder sort_big_to_small = new FileSortOrderBySize("sort_big_to_small", false);
+
+    public static final Map<String, FileSortOrder> sortOrders;
+    static {
+        sortOrders = new HashMap<String, FileSortOrder>();
+        sortOrders.put(sort_a_to_z.mName, sort_a_to_z);
+        sortOrders.put(sort_z_to_a.mName, sort_z_to_a);
+        sortOrders.put(sort_old_to_new.mName, sort_old_to_new);
+        sortOrders.put(sort_new_to_old.mName, sort_new_to_old);
+        sortOrders.put(sort_small_to_big.mName, sort_small_to_big);
+        sortOrders.put(sort_big_to_small.mName, sort_big_to_small);
+    }
+
+    public String mName;
+    public boolean mAscending;
+
+    public FileSortOrder(String name, boolean ascending) {
+        mName = name;
+        mAscending = ascending;
+    }
+
+    public Vector<OCFile> sortCloudFiles(Vector<OCFile> files) {
+        return sortCloudFilesByFavourite(files);
+    }
+
+    public File[] sortLocalFiles(File[] files) {
+        return files;
+    }
+
+    /**
+     * Sorts list by Favourites.
+     *
+     * @param files files to sort
+     */
+    public static Vector<OCFile> sortCloudFilesByFavourite(Vector<OCFile> files) {
+        Collections.sort(files, new Comparator<OCFile>() {
+            public int compare(OCFile o1, OCFile o2) {
+                if (o1.getIsFavorite() && o2.getIsFavorite()) {
+                    return 0;
+                } else if (o1.getIsFavorite()) {
+                    return -1;
+                } else if (o2.getIsFavorite()) {
+                    return 1;
+                }
+                return 0;
+            }
+        });
+
+        return files;
+    }
+}

+ 85 - 0
src/main/java/com/owncloud/android/utils/FileSortOrderByDate.java

@@ -0,0 +1,85 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Sven R. Kunze
+ * Copyright (C) 2017 Sven R. Kunze
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.utils;
+
+import com.owncloud.android.datamodel.OCFile;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Created by srkunze on 28.08.17.
+ */
+
+public class FileSortOrderByDate extends FileSortOrder {
+
+    public FileSortOrderByDate(String name, boolean ascending) {
+        super(name, ascending);
+    }
+
+    /**
+     * Sorts list by Date.
+     *
+     * @param files list of files to sort
+     */
+    public Vector<OCFile> sortCloudFiles(Vector<OCFile> files) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        Collections.sort(files, new Comparator<OCFile>() {
+            @SuppressFBWarnings(value = "Bx", justification = "Would require stepping up API level")
+            public int compare(OCFile o1, OCFile o2) {
+                Long obj1 = o1.getModificationTimestamp();
+                return multiplier * obj1.compareTo(o2.getModificationTimestamp());
+            }
+        });
+
+        return super.sortCloudFiles(files);
+    }
+
+    /**
+     * Sorts list by Date.
+     *
+     * @param filesArray list of files to sort
+     */
+    public File[] sortLocalFiles(File[] filesArray) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        List<File> files = new ArrayList<File>(Arrays.asList(filesArray));
+
+        Collections.sort(files, new Comparator<File>() {
+            @SuppressFBWarnings(value = "Bx")
+            public int compare(File o1, File o2) {
+                Long obj1 = o1.lastModified();
+                return multiplier * obj1.compareTo(o2.lastModified());
+            }
+        });
+
+        File[] returnArray = new File[files.size()];
+        return files.toArray(returnArray);
+    }
+}

+ 98 - 0
src/main/java/com/owncloud/android/utils/FileSortOrderByName.java

@@ -0,0 +1,98 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Sven R. Kunze
+ * Copyright (C) 2017 Sven R. Kunze
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.utils;
+
+import com.owncloud.android.datamodel.OCFile;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import third_parties.daveKoeller.AlphanumComparator;
+
+/**
+ * Created by srkunze on 28.08.17.
+ */
+
+public class FileSortOrderByName extends FileSortOrder {
+
+    public FileSortOrderByName(String name, boolean ascending) {
+        super(name, ascending);
+    }
+
+    /**
+     * Sorts list by Name.
+     *
+     * @param files files to sort
+     */
+    @SuppressFBWarnings(value = "Bx")
+    public Vector<OCFile> sortCloudFiles(Vector<OCFile> files) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        Collections.sort(files, new Comparator<OCFile>() {
+            public int compare(OCFile o1, OCFile o2) {
+                if (o1.isFolder() && o2.isFolder()) {
+                    return multiplier * new AlphanumComparator().compare(o1, o2);
+                } else if (o1.isFolder()) {
+                    return -1;
+                } else if (o2.isFolder()) {
+                    return 1;
+                }
+                return multiplier * new AlphanumComparator().compare(o1, o2);
+            }
+        });
+
+        return super.sortCloudFiles(files);
+    }
+
+    /**
+     * Sorts list by Name.
+     *
+     * @param filesArray files to sort
+     */
+    public File[] sortLocalFiles(File[] filesArray) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        List<File> files = new ArrayList<File>(Arrays.asList(filesArray));
+
+        Collections.sort(files, new Comparator<File>() {
+            public int compare(File o1, File o2) {
+                if (o1.isDirectory() && o2.isDirectory()) {
+                    return multiplier * o1.getPath().toLowerCase().compareTo(o2.getPath().toLowerCase());
+                } else if (o1.isDirectory()) {
+                    return -1;
+                } else if (o2.isDirectory()) {
+                    return 1;
+                }
+                return multiplier * new AlphanumComparator().compare(o1.getPath().toLowerCase(),
+                        o2.getPath().toLowerCase());
+            }
+        });
+
+        File[] returnArray = new File[files.size()];
+        return files.toArray(returnArray);
+    }
+}

+ 106 - 0
src/main/java/com/owncloud/android/utils/FileSortOrderBySize.java

@@ -0,0 +1,106 @@
+/**
+ * Nextcloud Android client application
+ *
+ * @author Sven R. Kunze
+ * Copyright (C) 2017 Sven R. Kunze
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.owncloud.android.utils;
+
+import com.owncloud.android.datamodel.OCFile;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Created by srkunze on 28.08.17.
+ */
+
+public class FileSortOrderBySize extends FileSortOrder {
+
+    public FileSortOrderBySize(String name, boolean ascending) {
+        super(name, ascending);
+    }
+
+    /**
+     * Sorts list by Size.
+     *
+     * @param files list of files to sort
+     */
+    public Vector<OCFile> sortCloudFiles(Vector<OCFile> files) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        Collections.sort(files, new Comparator<OCFile>() {
+            @SuppressFBWarnings(value = "Bx")
+            public int compare(OCFile o1, OCFile o2) {
+                if (o1.isFolder() && o2.isFolder()) {
+                    Long obj1 = o1.getFileLength();
+                    return multiplier * obj1.compareTo(o2.getFileLength());
+                } else if (o1.isFolder()) {
+                    return -1;
+
+                } else if (o2.isFolder()) {
+                    return 1;
+                } else {
+                    Long obj1 = o1.getFileLength();
+                    return multiplier * obj1.compareTo(o2.getFileLength());
+                }
+            }
+        });
+
+        return super.sortCloudFiles(files);
+    }
+
+    /**
+     * Sorts list by Size.
+     *
+     * @param filesArray list of files to sort
+     */
+    public File[] sortLocalFiles(File[] filesArray) {
+        final int multiplier = mAscending ? 1 : -1;
+
+        List<File> files = new ArrayList<File>(Arrays.asList(filesArray));
+
+        Collections.sort(files, new Comparator<File>() {
+            @SuppressFBWarnings(value = "Bx")
+            public int compare(File o1, File o2) {
+                if (o1.isDirectory() && o2.isDirectory()) {
+                    // Long obj1 = getFolderSize(o1);
+                    // return multiplier * obj1.compareTo(getFolderSize(o2));
+                    return o1.getPath().toLowerCase().compareTo(o2.getPath().toLowerCase());
+                } else if (o1.isDirectory()) {
+                    return -1;
+                } else if (o2.isDirectory()) {
+                    return 1;
+                } else {
+                    Long obj1 = o1.length();
+                    return multiplier * obj1.compareTo(o2.length());
+                }
+            }
+        });
+
+        File[] returnArray = new File[files.size()];
+        return files.toArray(returnArray);
+    }
+
+}

+ 1 - 228
src/main/java/com/owncloud/android/utils/FileStorageUtils.java

@@ -42,18 +42,14 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStream;
 import java.text.DateFormat;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.Date;
-import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.TimeZone;
 import java.util.TimeZone;
 import java.util.Vector;
 import java.util.Vector;
 
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import third_parties.daveKoeller.AlphanumComparator;
 
 
 
 
 /**
 /**
@@ -62,12 +58,7 @@ import third_parties.daveKoeller.AlphanumComparator;
 public class FileStorageUtils {
 public class FileStorageUtils {
     private static final String TAG = FileStorageUtils.class.getSimpleName();
     private static final String TAG = FileStorageUtils.class.getSimpleName();
 
 
-    public static final Integer SORT_NAME = 0;
-    public static final Integer SORT_DATE = 1;
-    public static final Integer SORT_SIZE = 2;
     public static final String PATTERN_YYYY_MM = "yyyy/MM/";
     public static final String PATTERN_YYYY_MM = "yyyy/MM/";
-    public static Integer mSortOrder = SORT_NAME;
-    public static Boolean mSortAscending = true;
 
 
     /**
     /**
      * Get local owncloud storage path for accountName.
      * Get local owncloud storage path for accountName.
@@ -258,227 +249,9 @@ public class FileStorageUtils {
             }
             }
         });
         });
 
 
-        return sortOCFilesByFavourite(files);
+        return FileSortOrder.sortCloudFilesByFavourite(files);
     }
     }
 
 
-    /**
-     * Sorts all filenames, regarding last user decision 
-     */
-    public static Vector<OCFile> sortOcFolder(Vector<OCFile> files) {
-        switch (mSortOrder) {
-            case 0:
-                files = FileStorageUtils.sortOCFilesByName(files);
-                break;
-            case 1:
-                files = FileStorageUtils.sortOCFilesByDate(files);
-                break;
-            case 2:
-                files = FileStorageUtils.sortOCFilesBySize(files);
-                break;
-        }
-
-        files = FileStorageUtils.sortOCFilesByFavourite(files);
-
-        return files;
-    }
-
-    /**
-     * Sorts all filenames, regarding last user decision.
-     *
-     * @param files of files to sort
-     */
-    public static File[] sortLocalFolder(File[] files) {
-        switch (mSortOrder) {
-            case 0:
-                files = FileStorageUtils.sortLocalFilesByName(files);
-                break;
-            case 1:
-                files = FileStorageUtils.sortLocalFilesByDate(files);
-                break;
-            case 2:
-                files = FileStorageUtils.sortLocalFilesBySize(files);
-                break;
-        }
-
-        return files;
-    }
-
-    /**
-     * Sorts list by Date.
-     *
-     * @param files list of files to sort
-     */
-    public static Vector<OCFile> sortOCFilesByDate(Vector<OCFile> files) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        Collections.sort(files, new Comparator<OCFile>() {
-            @SuppressFBWarnings(value = "Bx", justification = "Would require stepping up API level")
-            public int compare(OCFile o1, OCFile o2) {
-                Long obj1 = o1.getModificationTimestamp();
-                return multiplier * obj1.compareTo(o2.getModificationTimestamp());
-            }
-        });
-
-        return files;
-    }
-
-    /**
-     * Sorts list by Date.
-     *
-     * @param filesArray list of files to sort
-     */
-    public static File[] sortLocalFilesByDate(File[] filesArray) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        List<File> files = new ArrayList<File>(Arrays.asList(filesArray));
-
-        Collections.sort(files, new Comparator<File>() {
-            @SuppressFBWarnings(value = "Bx")
-            public int compare(File o1, File o2) {
-                Long obj1 = o1.lastModified();
-                return multiplier * obj1.compareTo(o2.lastModified());
-            }
-        });
-
-        File[] returnArray = new File[files.size()];
-        return files.toArray(returnArray);
-    }
-
-    /**
-     * Sorts list by Size.
-     *
-     * @param files list of files to sort
-     */
-    public static Vector<OCFile> sortOCFilesBySize(Vector<OCFile> files) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        Collections.sort(files, new Comparator<OCFile>() {
-            @SuppressFBWarnings(value = "Bx")
-            public int compare(OCFile o1, OCFile o2) {
-                if (o1.isFolder() && o2.isFolder()) {
-                    Long obj1 = o1.getFileLength();
-                    return multiplier * obj1.compareTo(o2.getFileLength());
-                } else if (o1.isFolder()) {
-                    return -1;
-
-                } else if (o2.isFolder()) {
-                    return 1;
-                } else {
-                    Long obj1 = o1.getFileLength();
-                    return multiplier * obj1.compareTo(o2.getFileLength());
-                }
-            }
-        });
-
-        return files;
-    }
-
-    /**
-     * Sorts list by Size.
-     *
-     * @param filesArray list of files to sort
-     */
-    public static File[] sortLocalFilesBySize(File[] filesArray) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        List<File> files = new ArrayList<>(Arrays.asList(filesArray));
-
-        Collections.sort(files, new Comparator<File>() {
-            @SuppressFBWarnings(value = "Bx")
-            public int compare(File o1, File o2) {
-                if (o1.isDirectory() && o2.isDirectory()) {
-                    // Long obj1 = getFolderSize(o1);
-                    // return multiplier * obj1.compareTo(getFolderSize(o2));
-                    return o1.getPath().toLowerCase().compareTo(o2.getPath().toLowerCase());
-                } else if (o1.isDirectory()) {
-                    return -1;
-                } else if (o2.isDirectory()) {
-                    return 1;
-                } else {
-                    Long obj1 = o1.length();
-                    return multiplier * obj1.compareTo(o2.length());
-                }
-            }
-        });
-
-        File[] returnArray = new File[files.size()];
-        return files.toArray(returnArray);
-    }
-
-    /**
-     * Sorts list by Name.
-     *
-     * @param files files to sort
-     */
-    @SuppressFBWarnings(value = "Bx")
-    public static Vector<OCFile> sortOCFilesByName(Vector<OCFile> files) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        Collections.sort(files, new Comparator<OCFile>() {
-            public int compare(OCFile o1, OCFile o2) {
-                if (o1.isFolder() && o2.isFolder()) {
-                    return multiplier * new AlphanumComparator().compare(o1, o2);
-                } else if (o1.isFolder()) {
-                    return -1;
-                } else if (o2.isFolder()) {
-                    return 1;
-                }
-                return multiplier * new AlphanumComparator().compare(o1, o2);
-            }
-        });
-
-        return files;
-    }
-
-    /**
-     * Sorts list by Name.
-     *
-     * @param filesArray files to sort
-     */
-    public static File[] sortLocalFilesByName(File[] filesArray) {
-        final int multiplier = mSortAscending ? 1 : -1;
-
-        List<File> files = new ArrayList<File>(Arrays.asList(filesArray));
-
-        Collections.sort(files, new Comparator<File>() {
-            public int compare(File o1, File o2) {
-                if (o1.isDirectory() && o2.isDirectory()) {
-                    return multiplier * o1.getPath().toLowerCase().compareTo(o2.getPath().toLowerCase());
-                } else if (o1.isDirectory()) {
-                    return -1;
-                } else if (o2.isDirectory()) {
-                    return 1;
-                }
-                return multiplier * new AlphanumComparator().compare(o1.getPath().toLowerCase(),
-                        o2.getPath().toLowerCase());
-            }
-        });
-
-        File[] returnArray = new File[files.size()];
-        return files.toArray(returnArray);
-    }
-
-    /**
-     * Sorts list by Favourites.
-     *
-     * @param files files to sort
-     */
-    public static Vector<OCFile> sortOCFilesByFavourite(Vector<OCFile> files) {
-        Collections.sort(files, new Comparator<OCFile>() {
-            public int compare(OCFile o1, OCFile o2) {
-                if (o1.getIsFavorite() && o2.getIsFavorite()) {
-                    return 0;
-                } else if (o1.getIsFavorite()) {
-                    return -1;
-                } else if (o2.getIsFavorite()) {
-                    return 1;
-                }
-                return 0;
-            }
-        });
-
-        return files;
-    }
 
 
     /**
     /**
      * Local Folder size.
      * Local Folder size.