From b452c1711f6f4fad6255988b57ba935339addf94 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 10 Oct 2014 17:13:08 +0200 Subject: [PATCH 1/5] - removed german translation --- res/values-de/strings.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 3dd6a5a718..c20c88f22f 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -11,13 +11,6 @@ Einstellungen Details Senden - Sortieren - Sortieren nach - - A-Z - Neu - Alt - Groß - Klein - Allgemein Mehr Konten From 706a769e30086ffdb5d5c1ee06abdd782304beca Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sat, 11 Oct 2014 09:14:14 +0200 Subject: [PATCH 2/5] - disabled sort by size until server supports server-side folder size calculation --- res/values/strings.xml | 3 ++- .../owncloud/android/ui/activity/FileDisplayActivity.java | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index c4bea8108b..ce8cf9c49b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -17,7 +17,8 @@ A-Z Newest - Oldest - Biggest - Smallest + General More diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 2d10ab94b3..c24d88b632 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -511,9 +511,11 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener { case 1: sortByDate(false); break; - case 2: - sortBySize(false); - break; + +// TODO re-enable when server-side folder size calculation is available +// case 2: +// sortBySize(false); +// break; } dialog.dismiss(); From bc3f8b3354407da6990c1b396ae462ea321d1630 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 17 Oct 2014 21:28:48 +0200 Subject: [PATCH 3/5] - requested changes by review by davivel --- .../owncloud/android/datamodel/OCFile.java | 3 +- .../ui/activity/FileDisplayActivity.java | 2 +- .../ui/adapter/FileListListAdapter.java | 763 +++++++++--------- .../ui/fragment/OCFileListFragment.java | 655 ++++++++------- .../daveKoeller}/AlphanumComparator.java | 4 +- 5 files changed, 717 insertions(+), 710 deletions(-) rename src/{com/owncloud/android/datamodel => third_parties/daveKoeller}/AlphanumComparator.java (95%) diff --git a/src/com/owncloud/android/datamodel/OCFile.java b/src/com/owncloud/android/datamodel/OCFile.java index 03ec163253..c44638b296 100644 --- a/src/com/owncloud/android/datamodel/OCFile.java +++ b/src/com/owncloud/android/datamodel/OCFile.java @@ -20,8 +20,9 @@ package com.owncloud.android.datamodel; import java.io.File; -import com.owncloud.android.utils.Log_OC; +import third_parties.daveKoeller.AlphanumComparator; +import com.owncloud.android.utils.Log_OC; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index c24d88b632..12ea11840c 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -493,7 +493,7 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener { } case R.id.action_sort: { SharedPreferences appPreferences = PreferenceManager - .getDefaultSharedPreferences(getApplicationContext()); + .getDefaultSharedPreferences(this); // Read sorting order, default to sort by name ascending Integer sortOrder = appPreferences diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index a90773ef5f..a2cb3be516 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Vector; +import third_parties.daveKoeller.AlphanumComparator; import android.accounts.Account; import android.content.Context; import android.content.SharedPreferences; @@ -37,7 +38,6 @@ import android.widget.TextView; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; -import com.owncloud.android.datamodel.AlphanumComparator; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; @@ -45,8 +45,6 @@ import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.ui.activity.ComponentsGetter; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; -import com.owncloud.android.utils.Log_OC; - /** * This Adapter populates a ListView with all files and folders in an ownCloud @@ -56,409 +54,422 @@ import com.owncloud.android.utils.Log_OC; * */ public class FileListListAdapter extends BaseAdapter implements ListAdapter { - private final static String PERMISSION_SHARED_WITH_ME = "S"; + private final static String PERMISSION_SHARED_WITH_ME = "S"; - private Context mContext; - private OCFile mFile = null; - private Vector mFiles = null; - private boolean mJustFolders; + private final Context mContext; + private OCFile mFile = null; + private Vector mFiles = null; + private final boolean mJustFolders; - private FileDataStorageManager mStorageManager; - private Account mAccount; - private ComponentsGetter mTransferServiceGetter; - private Integer sortOrder; - private Boolean sortAscending; - private SharedPreferences appPreferences; - - public FileListListAdapter( - boolean justFolders, - Context context, - ComponentsGetter transferServiceGetter - ) { - mJustFolders = justFolders; - mContext = context; - mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - mTransferServiceGetter = transferServiceGetter; - - appPreferences = PreferenceManager - .getDefaultSharedPreferences(mContext); - - // Read sorting order, default to sort by name ascending - sortOrder = appPreferences - .getInt("sortOrder", 0); - sortAscending = appPreferences.getBoolean("sortAscending", true); - - } + private FileDataStorageManager mStorageManager; + private Account mAccount; + private final ComponentsGetter mTransferServiceGetter; + private Integer mSortOrder; + public static final Integer mSortName = 0; + public static final Integer mSortDate = 1; + public static final Integer mSortSize = 2; + private Boolean mSortAscending; + private final SharedPreferences mAppPreferences; - @Override - public boolean areAllItemsEnabled() { - return true; - } + public FileListListAdapter(boolean justFolders, Context context, ComponentsGetter transferServiceGetter) { + mJustFolders = justFolders; + mContext = context; + mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); + mTransferServiceGetter = transferServiceGetter; - @Override - public boolean isEnabled(int position) { - return true; - } + mAppPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); - @Override - public int getCount() { - return mFiles != null ? mFiles.size() : 0; - } + // Read sorting order, default to sort by name ascending + mSortOrder = mAppPreferences.getInt("sortOrder", mSortName); + mSortAscending = mAppPreferences.getBoolean("sortAscending", true); - @Override - public Object getItem(int position) { - if (mFiles == null || mFiles.size() <= position) - return null; - return mFiles.get(position); - } + } - @Override - public long getItemId(int position) { - if (mFiles == null || mFiles.size() <= position) - return 0; - return mFiles.get(position).getFileId(); - } + @Override + public boolean areAllItemsEnabled() { + return true; + } - @Override - public int getItemViewType(int position) { - return 0; - } + @Override + public boolean isEnabled(int position) { + return true; + } - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view = convertView; - if (view == null) { - LayoutInflater inflator = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = inflator.inflate(R.layout.list_item, null); - } - - if (mFiles != null && mFiles.size() > position) { - OCFile file = mFiles.get(position); - TextView fileName = (TextView) view.findViewById(R.id.Filename); - String name = file.getFileName(); + @Override + public int getCount() { + return mFiles != null ? mFiles.size() : 0; + } - fileName.setText(name); - ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); - ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon); - ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon); - sharedWithMeIconV.setVisibility(View.GONE); + @Override + public Object getItem(int position) { + if (mFiles == null || mFiles.size() <= position) + return null; + return mFiles.get(position); + } - ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); - localStateView.bringToFront(); - FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); - FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); - if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { - localStateView.setImageResource(R.drawable.downloading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { - localStateView.setImageResource(R.drawable.uploading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (file.isDown()) { - localStateView.setImageResource(R.drawable.local_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else { - localStateView.setVisibility(View.INVISIBLE); - } - - TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); - TextView lastModV = (TextView) view.findViewById(R.id.last_mod); - ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); - - if (!file.isFolder()) { - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); - lastModV.setVisibility(View.VISIBLE); - lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); - // this if-else is needed even thoe fav icon is visible by default - // because android reuses views in listview - if (!file.keepInSync()) { - view.findViewById(R.id.imageView3).setVisibility(View.GONE); - } else { - view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE); - } - - ListView parentList = (ListView)parent; - if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { - checkBoxV.setVisibility(View.GONE); - } else { - if (parentList.isItemChecked(position)) { - checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); - } else { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); - } - checkBoxV.setVisibility(View.VISIBLE); - } + @Override + public long getItemId(int position) { + if (mFiles == null || mFiles.size() <= position) + return 0; + return mFiles.get(position).getFileId(); + } - fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); + @Override + public int getItemViewType(int position) { + return 0; + } - if (checkIfFileIsSharedWithMe(file)) { - sharedWithMeIconV.setVisibility(View.VISIBLE); - } - } - else { - if (FileStorageUtils.getDefaultSavePathFor(mAccount.name, file) != null){ - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(getFolderSizeHuman(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file))); - } else { - fileSizeV.setVisibility(View.INVISIBLE); - } - - lastModV.setVisibility(View.VISIBLE); - lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); - checkBoxV.setVisibility(View.GONE); - view.findViewById(R.id.imageView3).setVisibility(View.GONE); + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = convertView; + if (view == null) { + LayoutInflater inflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = inflator.inflate(R.layout.list_item, null); + } - if (checkIfFileIsSharedWithMe(file)) { - fileIcon.setImageResource(R.drawable.shared_with_me_folder); - sharedWithMeIconV.setVisibility(View.VISIBLE); - } else { - fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); - } + if (mFiles != null && mFiles.size() > position) { + OCFile file = mFiles.get(position); + TextView fileName = (TextView) view.findViewById(R.id.Filename); + String name = file.getFileName(); - // If folder is sharedByLink, icon folder must be changed to - // folder-public one - if (file.isShareByLink()) { - fileIcon.setImageResource(R.drawable.folder_public); - } - } + fileName.setText(name); + ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); + ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon); + ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon); + sharedWithMeIconV.setVisibility(View.GONE); - if (file.isShareByLink()) { - sharedIconV.setVisibility(View.VISIBLE); - } else { - sharedIconV.setVisibility(View.GONE); - } - } + ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); + localStateView.bringToFront(); + FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); + FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); + if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { + localStateView.setImageResource(R.drawable.downloading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { + localStateView.setImageResource(R.drawable.uploading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (file.isDown()) { + localStateView.setImageResource(R.drawable.local_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else { + localStateView.setVisibility(View.INVISIBLE); + } - return view; - } - - /** - * Local Folder size in human readable format - * @param path String - * @return Size in human readable format - */ - private String getFolderSizeHuman(String path) { + TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); + TextView lastModV = (TextView) view.findViewById(R.id.last_mod); + ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); - File dir = new File(path); + if (!file.isFolder()) { + fileSizeV.setVisibility(View.VISIBLE); + fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); + lastModV.setVisibility(View.VISIBLE); + lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); + // this if-else is needed even thoe fav icon is visible by + // default + // because android reuses views in listview + if (!file.keepInSync()) { + view.findViewById(R.id.imageView3).setVisibility(View.GONE); + } else { + view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE); + } - if(dir.exists()) { - long bytes = getFolderSize(dir); - if (bytes < 1024) return bytes + " B"; - int exp = (int) (Math.log(bytes) / Math.log(1024)); - String pre = ("KMGTPE").charAt(exp-1) + ""; + ListView parentList = (ListView) parent; + if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); + } else { + if (parentList.isItemChecked(position)) { + checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); + } else { + checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + } + checkBoxV.setVisibility(View.VISIBLE); + } - return String.format("%.1f %sB", bytes / Math.pow(1024, exp), pre); - } + fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); - return "0 B"; - } + if (checkIfFileIsSharedWithMe(file)) { + sharedWithMeIconV.setVisibility(View.VISIBLE); + } + } else { + // TODO Re-enable when server supports folder-size calculation + // if (FileStorageUtils.getDefaultSavePathFor(mAccount.name, + // file) != null) { + // fileSizeV.setVisibility(View.VISIBLE); + // fileSizeV + // .setText(getFolderSizeHuman(FileStorageUtils.getDefaultSavePathFor(mAccount.name, + // file))); + // } else { + fileSizeV.setVisibility(View.INVISIBLE); + // } - /** - * Local Folder size - * @param dir File - * @return Size in bytes - */ - private long getFolderSize(File dir) { - if (dir.exists()) { - long result = 0; - File[] fileList = dir.listFiles(); - for(int i = 0; i < fileList.length; i++) { - if(fileList[i].isDirectory()) { - result += getFolderSize(fileList[i]); - } else { - result += fileList[i].length(); - } - } - return result; - } - return 0; - } + lastModV.setVisibility(View.VISIBLE); + lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); + checkBoxV.setVisibility(View.GONE); + view.findViewById(R.id.imageView3).setVisibility(View.GONE); - @Override - public int getViewTypeCount() { - return 1; - } + if (checkIfFileIsSharedWithMe(file)) { + fileIcon.setImageResource(R.drawable.shared_with_me_folder); + sharedWithMeIconV.setVisibility(View.VISIBLE); + } else { + fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); + } - @Override - public boolean hasStableIds() { - return true; - } + // If folder is sharedByLink, icon folder must be changed to + // folder-public one + if (file.isShareByLink()) { + fileIcon.setImageResource(R.drawable.folder_public); + } + } - @Override - public boolean isEmpty() { - return (mFiles == null || mFiles.isEmpty()); - } + if (file.isShareByLink()) { + sharedIconV.setVisibility(View.VISIBLE); + } else { + sharedIconV.setVisibility(View.GONE); + } + } - /** - * Change the adapted directory for a new one - * @param directory New file to adapt. Can be NULL, meaning "no content to adapt". - * @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL) - */ - public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) { - mFile = directory; - if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { - mStorageManager = updatedStorageManager; - mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - } - if (mStorageManager != null) { - mFiles = mStorageManager.getFolderContent(mFile); - if (mJustFolders) { - mFiles = getFolders(mFiles); - } - } else { - mFiles = null; - } + return view; + } - sortDirectory(); - } - - /** - * Sorts all filenames, regarding last user decision - */ - private void sortDirectory(){ - switch (sortOrder){ - case 0: - sortByName(sortAscending); - break; - case 1: - sortByDate(sortAscending); - break; - case 2: - sortBySize(sortAscending); - break; - } - - notifyDataSetChanged(); - } - - - /** - * Filter for getting only the folders - * @param files - * @return Vector - */ - public Vector getFolders(Vector files) { - Vector ret = new Vector(); - OCFile current = null; - for (int i=0; i() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - return val * 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 val * Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp()); - } - } - }); - } + File dir = new File(path); - /** - * Sorts list by Size - * @param sortAscending true: ascending, false: descending - */ - private void sortBySize(boolean sortAscending){ - final Integer val; - if (sortAscending){ - val = 1; - } else { - val = -1; - } - - Collections.sort(mFiles, new Comparator() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - return val * Long.compare(getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1))), - getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2)))); - } - else if (o1.isFolder()) { - return -1; - } else if (o2.isFolder()) { - return 1; - } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){ - return 0; - } else { - return val * Long.compare(o1.getFileLength(), o2.getFileLength()); - } - } - }); - } + if (dir.exists()) { + long bytes = getFolderSize(dir); + return DisplayUtils.bytesToHumanReadable(bytes); + } - /** - * Sorts list by Name - * @param sortAscending true: ascending, false: descending - */ - private void sortByName(boolean sortAscending){ - final Integer val; - if (sortAscending){ - val = 1; - } else { - val = -1; - } + return "0 B"; + } - Collections.sort(mFiles, new Comparator() { - public int compare(OCFile o1, OCFile o2) { - if (o1.isFolder() && o2.isFolder()) { - return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); - } else if (o1.isFolder()) { - return -1; - } else if (o2.isFolder()) { - return 1; - } - return val * new AlphanumComparator().compare(o1, o2); - } - }); - } + /** + * Local Folder size + * + * @param dir + * File + * @return Size in bytes + */ + private long getFolderSize(File dir) { + if (dir.exists()) { + long result = 0; + File[] fileList = dir.listFiles(); + for (int i = 0; i < fileList.length; i++) { + if (fileList[i].isDirectory()) { + result += getFolderSize(fileList[i]); + } else { + result += fileList[i].length(); + } + } + return result; + } + return 0; + } - public void setSortOrder(Integer order, boolean ascending) { - SharedPreferences.Editor editor = appPreferences.edit(); - editor.putInt("sortOrder", order); - editor.putBoolean("sortAscending", ascending); - editor.commit(); - - sortOrder = order; - sortAscending = ascending; - - sortDirectory(); - } + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public boolean isEmpty() { + return (mFiles == null || mFiles.isEmpty()); + } + + /** + * Change the adapted directory for a new one + * + * @param directory + * New file to adapt. Can be NULL, meaning "no content to adapt". + * @param updatedStorageManager + * Optional updated storage manager; used to replace + * mStorageManager if is different (and not NULL) + */ + public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) { + mFile = directory; + if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { + mStorageManager = updatedStorageManager; + mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); + } + if (mStorageManager != null) { + mFiles = mStorageManager.getFolderContent(mFile); + if (mJustFolders) { + mFiles = getFolders(mFiles); + } + } else { + mFiles = null; + } + + sortDirectory(); + } + + /** + * Sorts all filenames, regarding last user decision + */ + private void sortDirectory() { + switch (mSortOrder) { + case 0: + sortByName(mSortAscending); + break; + case 1: + sortByDate(mSortAscending); + break; + case 2: + sortBySize(mSortAscending); + break; + } + + notifyDataSetChanged(); + } + + /** + * Filter for getting only the folders + * + * @param files + * @return Vector + */ + public Vector getFolders(Vector files) { + Vector ret = new Vector(); + OCFile current = null; + for (int i = 0; i < files.size(); i++) { + current = files.get(i); + if (current.isFolder()) { + ret.add(current); + } + } + return ret; + } + + /** + * Check if parent folder does not include 'S' permission and if file/folder + * is shared with me + * + * @param file + * : OCFile + * @return boolean: True if it is shared with me and false if it is not + */ + private boolean checkIfFileIsSharedWithMe(OCFile file) { + return (mFile.getPermissions() != null && !mFile.getPermissions().contains(PERMISSION_SHARED_WITH_ME) + && file.getPermissions() != null && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME)); + } + + /** + * Sorts list by Date + * + * @param sortAscending + * true: ascending, false: descending + */ + private void sortByDate(boolean sortAscending) { + final Integer val; + if (sortAscending) { + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return val * 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 val * Long.compare(o1.getModificationTimestamp(), o2.getModificationTimestamp()); + } + } + }); + } + + /** + * Sorts list by Size + * + * @param sortAscending + * true: ascending, false: descending + */ + private void sortBySize(boolean sortAscending) { + final Integer val; + if (sortAscending) { + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return val + * Long.compare( + getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1))), + getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2)))); + } else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0) { + return 0; + } else { + return val * Long.compare(o1.getFileLength(), o2.getFileLength()); + } + } + }); + } + + /** + * Sorts list by Name + * + * @param sortAscending + * true: ascending, false: descending + */ + private void sortByName(boolean sortAscending) { + final Integer val; + if (sortAscending) { + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + @Override + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); + } else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } + return val * new AlphanumComparator().compare(o1, o2); + } + }); + } + + public void setSortOrder(Integer order, boolean ascending) { + SharedPreferences.Editor editor = mAppPreferences.edit(); + editor.putInt("sortOrder", order); + editor.putBoolean("sortAscending", ascending); + editor.commit(); + + mSortOrder = order; + mSortAscending = ascending; + + sortDirectory(); + } } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 7cac16e728..19829fa4fa 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -54,347 +54,340 @@ import com.owncloud.android.utils.Log_OC; * @author David A. Velasco */ public class OCFileListFragment extends ExtendedListFragment { - - private static final String TAG = OCFileListFragment.class.getSimpleName(); - private static final String MY_PACKAGE = OCFileListFragment.class.getPackage() != null ? - OCFileListFragment.class.getPackage().getName() : "com.owncloud.android.ui.fragment"; - - public final static String ARG_JUST_FOLDERS = MY_PACKAGE + ".JUST_FOLDERS"; - public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL"; - - private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE"; + private static final String TAG = OCFileListFragment.class.getSimpleName(); - private FileFragment.ContainerActivity mContainerActivity; - - private OCFile mFile = null; - private FileListListAdapter mAdapter; - - private OCFile mTargetFile; + private static final String MY_PACKAGE = OCFileListFragment.class.getPackage() != null ? OCFileListFragment.class + .getPackage().getName() : "com.owncloud.android.ui.fragment"; - - /** - * {@inheritDoc} - */ - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - Log_OC.e(TAG, "onAttach"); - try { - mContainerActivity = (FileFragment.ContainerActivity) activity; - - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + - FileFragment.ContainerActivity.class.getSimpleName()); - } - try { - setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) activity); - - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + - SwipeRefreshLayout.OnRefreshListener.class.getSimpleName()); - } - } + public final static String ARG_JUST_FOLDERS = MY_PACKAGE + ".JUST_FOLDERS"; + public final static String ARG_ALLOW_CONTEXTUAL_ACTIONS = MY_PACKAGE + ".ALLOW_CONTEXTUAL"; - - @Override - public void onDetach() { - setOnRefreshListener(null); - mContainerActivity = null; - super.onDetach(); - } + private static final String KEY_FILE = MY_PACKAGE + ".extra.FILE"; - /** - * {@inheritDoc} - */ - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - Log_OC.e(TAG, "onActivityCreated() start"); - - if (savedInstanceState != null) { - mFile = savedInstanceState.getParcelable(KEY_FILE); - } - - Bundle args = getArguments(); - boolean justFolders = (args == null) ? false : args.getBoolean(ARG_JUST_FOLDERS, false); - mAdapter = new FileListListAdapter( - justFolders, - getSherlockActivity(), - mContainerActivity - ); - setListAdapter(mAdapter); - - registerForContextMenu(getListView()); - getListView().setOnCreateContextMenuListener(this); - } - - /** - * Saves the current listed folder. - */ - @Override - public void onSaveInstanceState (Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(KEY_FILE, mFile); - } - - /** - * Call this, when the user presses the up button. - * - * Tries to move up the current folder one level. If the parent folder was removed from the - * database, it continues browsing up until finding an existing folders. - * - * return Count of folder levels browsed up. - */ - public int onBrowseUp() { - OCFile parentDir = null; - int moveCount = 0; - - if(mFile != null){ - FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); - - String parentPath = null; - if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) { - parentPath = new File(mFile.getRemotePath()).getParent(); - parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : - parentPath + OCFile.PATH_SEPARATOR; - parentDir = storageManager.getFileByPath(parentPath); - moveCount++; - } else { - parentDir = storageManager.getFileByPath(OCFile.ROOT_PATH); - } - while (parentDir == null) { - parentPath = new File(parentPath).getParent(); - parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : - parentPath + OCFile.PATH_SEPARATOR; - parentDir = storageManager.getFileByPath(parentPath); - moveCount++; - } // exit is granted because storageManager.getFileByPath("/") never returns null - mFile = parentDir; - - listDirectory(mFile); + private FileFragment.ContainerActivity mContainerActivity; - onRefresh(); - - // restore index and top position - restoreIndexAndTopPosition(); - - } // else - should never happen now - - return moveCount; - } - - @Override - public void onItemClick(AdapterView l, View v, int position, long id) { - OCFile file = (OCFile) mAdapter.getItem(position); - if (file != null) { - if (file.isFolder()) { - // update state and view of this fragment - listDirectory(file); - // then, notify parent activity to let it update its state and view - mContainerActivity.onBrowsedDownTo(file); - // save index and top position - saveIndexAndTopPosition(position); - - } else { /// Click on a file - if (PreviewImageFragment.canBePreviewed(file)) { - // preview image - it handles the download, if needed - ((FileDisplayActivity)mContainerActivity).startImagePreview(file); - - } else if (file.isDown()) { - if (PreviewMediaFragment.canBePreviewed(file)) { - // media preview - ((FileDisplayActivity)mContainerActivity).startMediaPreview(file, 0, true); - } else { - mContainerActivity.getFileOperationsHelper().openFile(file); - } - - } else { - // automatic download, preview on finish - ((FileDisplayActivity)mContainerActivity).startDownloadForPreview(file); - } - - } - - } else { - Log_OC.d(TAG, "Null object in ListAdapter!!"); - } - - } - - /** - * {@inheritDoc} - */ - @Override - public void onCreateContextMenu ( - ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - Bundle args = getArguments(); - boolean allowContextualActions = - (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); - if (allowContextualActions) { - MenuInflater inflater = getSherlockActivity().getMenuInflater(); - inflater.inflate(R.menu.file_actions_menu, menu); - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - OCFile targetFile = (OCFile) mAdapter.getItem(info.position); - - if (mContainerActivity.getStorageManager() != null) { - FileMenuFilter mf = new FileMenuFilter( - targetFile, - mContainerActivity.getStorageManager().getAccount(), - mContainerActivity, - getSherlockActivity() - ); - mf.filter(menu); - } - - /// additional restrictions for this fragment - // TODO allow in the future 'open with' for previewable files - MenuItem item = menu.findItem(R.id.action_open_file_with); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - /// TODO break this direct dependency on FileDisplayActivity... if possible - FileFragment frag = ((FileDisplayActivity)getSherlockActivity()).getSecondFragment(); - if (frag != null && frag instanceof FileDetailFragment && - frag.getFile().getFileId() == targetFile.getFileId()) { - item = menu.findItem(R.id.action_see_details); - if (item != null) { - item.setVisible(false); - item.setEnabled(false); - } - } - } - } - - - /** - * {@inhericDoc} - */ - @Override - public boolean onContextItemSelected (MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - mTargetFile = (OCFile) mAdapter.getItem(info.position); - switch (item.getItemId()) { - case R.id.action_share_file: { - mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); - return true; - } - case R.id.action_unshare_file: { - mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); - return true; - } - case R.id.action_rename_file: { - RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); - return true; - } - case R.id.action_remove_file: { - RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); - dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - return true; - } - case R.id.action_download_file: - case R.id.action_sync_file: { - mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); - return true; - } - case R.id.action_cancel_download: - case R.id.action_cancel_upload: { - ((FileDisplayActivity)mContainerActivity).cancelTransference(mTargetFile); - return true; - } - case R.id.action_see_details: { - mContainerActivity.showDetails(mTargetFile); - return true; - } - case R.id.action_send_file: { - // Obtain the file - if (!mTargetFile.isDown()) { // Download the file - Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); - ((FileDisplayActivity)mContainerActivity).startDownloadForSending(mTargetFile); - - } else { - mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); - } - return true; - } - case R.id.action_move: { - Intent action = new Intent(getActivity(), MoveActivity.class); + private OCFile mFile = null; + private FileListListAdapter mAdapter; - // Pass mTargetFile that contains info of selected file/folder - action.putExtra(MoveActivity.EXTRA_TARGET_FILE, mTargetFile); - getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); - return true; - } - default: - return super.onContextItemSelected(item); - } - } + private OCFile mTargetFile; + /** + * {@inheritDoc} + */ + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + Log_OC.e(TAG, "onAttach"); + try { + mContainerActivity = (FileFragment.ContainerActivity) activity; - /** - * Use this to query the {@link OCFile} that is currently - * being displayed by this fragment - * @return The currently viewed OCFile - */ - public OCFile getCurrentFile(){ - return mFile; - } - - /** - * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter - */ - public void listDirectory(){ - listDirectory(null); - } - - /** - * Lists the given directory on the view. When the input parameter is null, - * it will either refresh the last known directory. list the root - * if there never was a directory. - * - * @param directory File to be listed - */ - public void listDirectory(OCFile directory) { - FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); - if (storageManager != null) { + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + " must implement " + + FileFragment.ContainerActivity.class.getSimpleName()); + } + try { + setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) activity); - // Check input parameters for null - if(directory == null){ - if(mFile != null){ - directory = mFile; - } else { - directory = storageManager.getFileByPath("/"); - if (directory == null) return; // no files, wait for sync - } - } - - - // If that's not a directory -> List its parent - if(!directory.isFolder()){ - Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString()); - directory = storageManager.getFileById(directory.getParentId()); - } + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + " must implement " + + SwipeRefreshLayout.OnRefreshListener.class.getSimpleName()); + } + } - mAdapter.swapDirectory(directory, storageManager); - if (mFile == null || !mFile.equals(directory)) { - mList.setSelectionFromTop(0, 0); - } - mFile = directory; - } - } - - public void sortByName(boolean descending){ - mAdapter.setSortOrder(0, descending); - } - - public void sortByDate(boolean descending){ - mAdapter.setSortOrder(1, descending); - } + @Override + public void onDetach() { + setOnRefreshListener(null); + mContainerActivity = null; + super.onDetach(); + } - public void sortBySize(boolean descending){ - mAdapter.setSortOrder(2, descending); - } + /** + * {@inheritDoc} + */ + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + Log_OC.e(TAG, "onActivityCreated() start"); + + if (savedInstanceState != null) { + mFile = savedInstanceState.getParcelable(KEY_FILE); + } + + Bundle args = getArguments(); + boolean justFolders = (args == null) ? false : args.getBoolean(ARG_JUST_FOLDERS, false); + mAdapter = new FileListListAdapter(justFolders, getSherlockActivity(), mContainerActivity); + setListAdapter(mAdapter); + + registerForContextMenu(getListView()); + getListView().setOnCreateContextMenuListener(this); + } + + /** + * Saves the current listed folder. + */ + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(KEY_FILE, mFile); + } + + /** + * Call this, when the user presses the up button. + * + * Tries to move up the current folder one level. If the parent folder was + * removed from the database, it continues browsing up until finding an + * existing folders. + * + * return Count of folder levels browsed up. + */ + public int onBrowseUp() { + OCFile parentDir = null; + int moveCount = 0; + + if (mFile != null) { + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); + + String parentPath = null; + if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) { + parentPath = new File(mFile.getRemotePath()).getParent(); + parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + + OCFile.PATH_SEPARATOR; + parentDir = storageManager.getFileByPath(parentPath); + moveCount++; + } else { + parentDir = storageManager.getFileByPath(OCFile.ROOT_PATH); + } + while (parentDir == null) { + parentPath = new File(parentPath).getParent(); + parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ? parentPath : parentPath + + OCFile.PATH_SEPARATOR; + parentDir = storageManager.getFileByPath(parentPath); + moveCount++; + } // exit is granted because storageManager.getFileByPath("/") never + // returns null + mFile = parentDir; + + listDirectory(mFile); + + onRefresh(); + + // restore index and top position + restoreIndexAndTopPosition(); + + } // else - should never happen now + + return moveCount; + } + + @Override + public void onItemClick(AdapterView l, View v, int position, long id) { + OCFile file = (OCFile) mAdapter.getItem(position); + if (file != null) { + if (file.isFolder()) { + // update state and view of this fragment + listDirectory(file); + // then, notify parent activity to let it update its state and + // view + mContainerActivity.onBrowsedDownTo(file); + // save index and top position + saveIndexAndTopPosition(position); + + } else { // / Click on a file + if (PreviewImageFragment.canBePreviewed(file)) { + // preview image - it handles the download, if needed + ((FileDisplayActivity) mContainerActivity).startImagePreview(file); + + } else if (file.isDown()) { + if (PreviewMediaFragment.canBePreviewed(file)) { + // media preview + ((FileDisplayActivity) mContainerActivity).startMediaPreview(file, 0, true); + } else { + mContainerActivity.getFileOperationsHelper().openFile(file); + } + + } else { + // automatic download, preview on finish + ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file); + } + + } + + } else { + Log_OC.d(TAG, "Null object in ListAdapter!!"); + } + + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + Bundle args = getArguments(); + boolean allowContextualActions = (args == null) ? true : args.getBoolean(ARG_ALLOW_CONTEXTUAL_ACTIONS, true); + if (allowContextualActions) { + MenuInflater inflater = getSherlockActivity().getMenuInflater(); + inflater.inflate(R.menu.file_actions_menu, menu); + AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; + OCFile targetFile = (OCFile) mAdapter.getItem(info.position); + + if (mContainerActivity.getStorageManager() != null) { + FileMenuFilter mf = new FileMenuFilter(targetFile, mContainerActivity.getStorageManager() + .getAccount(), mContainerActivity, getSherlockActivity()); + mf.filter(menu); + } + + // / additional restrictions for this fragment + // TODO allow in the future 'open with' for previewable files + MenuItem item = menu.findItem(R.id.action_open_file_with); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + // / TODO break this direct dependency on FileDisplayActivity... if + // possible + FileFragment frag = ((FileDisplayActivity) getSherlockActivity()).getSecondFragment(); + if (frag != null && frag instanceof FileDetailFragment + && frag.getFile().getFileId() == targetFile.getFileId()) { + item = menu.findItem(R.id.action_see_details); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + } + } + } + + /** + * {@inhericDoc} + */ + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + mTargetFile = (OCFile) mAdapter.getItem(info.position); + switch (item.getItemId()) { + case R.id.action_share_file: { + mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile); + return true; + } + case R.id.action_unshare_file: { + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile); + return true; + } + case R.id.action_rename_file: { + RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), FileDetailFragment.FTAG_RENAME_FILE); + return true; + } + case R.id.action_remove_file: { + RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(mTargetFile); + dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + return true; + } + case R.id.action_download_file: + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile); + return true; + } + case R.id.action_cancel_download: + case R.id.action_cancel_upload: { + ((FileDisplayActivity) mContainerActivity).cancelTransference(mTargetFile); + return true; + } + case R.id.action_see_details: { + mContainerActivity.showDetails(mTargetFile); + return true; + } + case R.id.action_send_file: { + // Obtain the file + if (!mTargetFile.isDown()) { // Download the file + Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded"); + ((FileDisplayActivity) mContainerActivity).startDownloadForSending(mTargetFile); + + } else { + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(mTargetFile); + } + return true; + } + case R.id.action_move: { + Intent action = new Intent(getActivity(), MoveActivity.class); + + // Pass mTargetFile that contains info of selected file/folder + action.putExtra(MoveActivity.EXTRA_TARGET_FILE, mTargetFile); + getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES); + return true; + } + default: + return super.onContextItemSelected(item); + } + } + + /** + * Use this to query the {@link OCFile} that is currently being displayed by + * this fragment + * + * @return The currently viewed OCFile + */ + public OCFile getCurrentFile() { + return mFile; + } + + /** + * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null + * parameter + */ + public void listDirectory() { + listDirectory(null); + } + + /** + * Lists the given directory on the view. When the input parameter is null, + * it will either refresh the last known directory. list the root if there + * never was a directory. + * + * @param directory + * File to be listed + */ + public void listDirectory(OCFile directory) { + FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); + if (storageManager != null) { + + // Check input parameters for null + if (directory == null) { + if (mFile != null) { + directory = mFile; + } else { + directory = storageManager.getFileByPath("/"); + if (directory == null) + return; // no files, wait for sync + } + } + + // If that's not a directory -> List its parent + if (!directory.isFolder()) { + Log_OC.w(TAG, "You see, that is not a directory -> " + directory.toString()); + directory = storageManager.getFileById(directory.getParentId()); + } + + mAdapter.swapDirectory(directory, storageManager); + if (mFile == null || !mFile.equals(directory)) { + mList.setSelectionFromTop(0, 0); + } + mFile = directory; + } + } + + public void sortByName(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.mSortName, descending); + } + + public void sortByDate(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.mSortDate, descending); + } + + public void sortBySize(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.mSortSize, descending); + } } diff --git a/src/com/owncloud/android/datamodel/AlphanumComparator.java b/src/third_parties/daveKoeller/AlphanumComparator.java similarity index 95% rename from src/com/owncloud/android/datamodel/AlphanumComparator.java rename to src/third_parties/daveKoeller/AlphanumComparator.java index f78ef25a6a..e6bd6f3824 100644 --- a/src/com/owncloud/android/datamodel/AlphanumComparator.java +++ b/src/third_parties/daveKoeller/AlphanumComparator.java @@ -22,9 +22,11 @@ * */ -package com.owncloud.android.datamodel; +package third_parties.daveKoeller; import java.util.Comparator; +import com.owncloud.android.datamodel.OCFile; + /** * This is an updated version with enhancements made by Daniel Migowski, * Andre Bogus, and David Koelle From 524a6e2bdd230742807de3b01cf414e8e62e1920 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Sat, 18 Oct 2014 10:47:36 +0200 Subject: [PATCH 4/5] - added lgpgl --- src/third_parties/daveKoeller/lgpl-2.1.txt | 502 +++++++++++++++++++++ 1 file changed, 502 insertions(+) create mode 100644 src/third_parties/daveKoeller/lgpl-2.1.txt diff --git a/src/third_parties/daveKoeller/lgpl-2.1.txt b/src/third_parties/daveKoeller/lgpl-2.1.txt new file mode 100644 index 0000000000..4362b49151 --- /dev/null +++ b/src/third_parties/daveKoeller/lgpl-2.1.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! From bc4a7bfe43cd48e8242ec38897874f1eb2a6c47a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 20 Oct 2014 19:52:12 +0200 Subject: [PATCH 5/5] - added requested changes --- .../owncloud/android/ui/activity/FileDisplayActivity.java | 3 ++- .../owncloud/android/ui/adapter/FileListListAdapter.java | 8 ++++---- .../owncloud/android/ui/fragment/OCFileListFragment.java | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 12ea11840c..cd37563ead 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -90,6 +90,7 @@ import com.owncloud.android.operations.SynchronizeFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; +import com.owncloud.android.ui.adapter.FileListListAdapter; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; @@ -497,7 +498,7 @@ OnSslUntrustedCertListener, SwipeRefreshLayout.OnRefreshListener { // Read sorting order, default to sort by name ascending Integer sortOrder = appPreferences - .getInt("sortOrder", 0); + .getInt("sortOrder", FileListListAdapter.SORT_NAME); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.actionbar_sort_title) diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index a2cb3be516..5945531d4a 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -65,9 +65,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { private Account mAccount; private final ComponentsGetter mTransferServiceGetter; private Integer mSortOrder; - public static final Integer mSortName = 0; - public static final Integer mSortDate = 1; - public static final Integer mSortSize = 2; + public static final Integer SORT_NAME = 0; + public static final Integer SORT_DATE = 1; + public static final Integer SORT_SIZE = 2; private Boolean mSortAscending; private final SharedPreferences mAppPreferences; @@ -80,7 +80,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { mAppPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); // Read sorting order, default to sort by name ascending - mSortOrder = mAppPreferences.getInt("sortOrder", mSortName); + mSortOrder = mAppPreferences.getInt("sortOrder", SORT_NAME); mSortAscending = mAppPreferences.getBoolean("sortAscending", true); } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 19829fa4fa..caba72b7ac 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -380,14 +380,14 @@ public class OCFileListFragment extends ExtendedListFragment { } public void sortByName(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.mSortName, descending); + mAdapter.setSortOrder(FileListListAdapter.SORT_NAME, descending); } public void sortByDate(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.mSortDate, descending); + mAdapter.setSortOrder(FileListListAdapter.SORT_DATE, descending); } public void sortBySize(boolean descending) { - mAdapter.setSortOrder(FileListListAdapter.mSortSize, descending); + mAdapter.setSortOrder(FileListListAdapter.SORT_SIZE, descending); } }