From: tobiasKaminsky Date: Sun, 14 Sep 2014 13:51:09 +0000 (+0200) Subject: Added sorting by name, date or size ascending/descending X-Git-Tag: oc-android-1.7.0_signed~134^2~5^2~6 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/20cd00b22c86ef0ab03ae0b8cd8eedd63844981f?ds=inline Added sorting by name, date or size ascending/descending --- diff --git a/res/menu/main_menu.xml b/res/menu/main_menu.xml index 979d7309..506ed15c 100644 --- a/res/menu/main_menu.xml +++ b/res/menu/main_menu.xml @@ -43,6 +43,11 @@ android:orderInCategory="2" android:showAsAction="never" android:title="@string/actionbar_settings"/> + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index c20c88f2..bc9313d2 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -11,6 +11,16 @@ Einstellungen Details Senden + Sortieren + Sortieren nach + + Dateiname - aufsteigend + Dateiname - absteigend + Datum - aufsteigend + Datum - absteigend + Dateigröße - aufsteigend + Dateigröße - absteigend + Allgemein Mehr Konten diff --git a/res/values/strings.xml b/res/values/strings.xml index 40910804..d9cd374c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12,6 +12,16 @@ Settings Details Send + Sort + Sort by + + Filename - ascending + Filename - descending + Date - ascending + Date - descending + Filesize - ascending + Filesize - descending + General More Accounts diff --git a/src/com/owncloud/android/datamodel/OCFile.java b/src/com/owncloud/android/datamodel/OCFile.java index 92168ff5..03ec1632 100644 --- a/src/com/owncloud/android/datamodel/OCFile.java +++ b/src/com/owncloud/android/datamodel/OCFile.java @@ -446,7 +446,7 @@ public class OCFile implements Parcelable, Comparable { } else if (another.isFolder()) { return 1; } - return getRemotePath().toLowerCase().compareTo(another.getRemotePath().toLowerCase()); + return new AlphanumComparator().compare(this, another); } @Override diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 63298334..c86380d6 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -491,6 +491,38 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener { } 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); } @@ -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); + } } diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 65a9c83c..bab3d858 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -17,6 +17,8 @@ */ package com.owncloud.android.ui.adapter; +import java.util.Collections; +import java.util.Comparator; import java.util.Vector; import android.accounts.Account; @@ -58,6 +60,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { private FileDataStorageManager mStorageManager; private Account mAccount; private ComponentsGetter mTransferServiceGetter; + public enum sortOrders { NAME, DATE, SIZE } + private sortOrders sort = sortOrders.NAME; + private boolean sortAscending = true; public FileListListAdapter( boolean justFolders, @@ -243,6 +248,32 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { } else { mFiles = null; } + + sortDirectory(); + } + + /** + * Sorts all filenames, regarding last user decision + */ + private void sortDirectory(){ + switch (sort){ + case NAME: + sortByName(); + break; + + case SIZE: + sortBySize(); + break; + + case DATE: + sortByDate(); + break; + } + + if (!sortAscending){ + Collections.reverse(mFiles); + } + notifyDataSetChanged(); } @@ -276,4 +307,53 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME) && file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME)); } + + private void sortByDate(){ + Collections.sort(mFiles, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp()); + } + else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){ + return 0; + } else { + return Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp()); + } + } + }); + } + + private void sortBySize(){ + Collections.sort(mFiles, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); + } + else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){ + return 0; + } else { + return Long.compare(o1.getFileLength(), o2.getFileLength()); + } + } + }); + } + + private void sortByName(){ + Collections.sort(mFiles); + } + + public void setSortOrder(sortOrders order, boolean descending) { + sort = order; + sortAscending = descending; + + sortDirectory(); + } } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index c11e864e..72d9fb4c 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -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.adapter.FileListListAdapter.sortOrders; 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; } } + + 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); + } }