*/\r
package com.owncloud.android.ui.adapter;\r
\r
+
+ import java.io.File;\r
+ import java.util.Collections;\r
+ import java.util.Comparator;\r
import java.util.Vector;\r
\r
+ import third_parties.daveKoeller.AlphanumComparator;\r
import android.accounts.Account;\r
import android.content.Context;\r
+ import android.content.SharedPreferences;\r
import android.graphics.Bitmap;\r
+ import android.preference.PreferenceManager;\r
import android.view.LayoutInflater;\r
import android.view.View;\r
import android.view.ViewGroup;\r
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
import com.owncloud.android.ui.activity.ComponentsGetter;\r
import com.owncloud.android.utils.DisplayUtils;\r
- \r
+ import com.owncloud.android.utils.FileStorageUtils;\r
+
\r
/**\r
* This Adapter populates a ListView with all files and folders in an ownCloud\r
* @author Tobias Kaminsky\r
* @author David A. Velasco\r
*/\r
- public class FileListListAdapter extends BaseAdapter implements ListAdapter {\r
+ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
private final static String PERMISSION_SHARED_WITH_ME = "S";\r
\r
private Context mContext;\r
private FileDataStorageManager mStorageManager;
private Account mAccount;
private ComponentsGetter mTransferServiceGetter;\r
+ private Integer mSortOrder;\r
+ public static final Integer SORT_NAME = 0;\r
+ public static final Integer SORT_DATE = 1;\r
+ public static final Integer SORT_SIZE = 2;\r
+ private Boolean mSortAscending;\r
+ private SharedPreferences mAppPreferences;\r
\r
public FileListListAdapter(\r
boolean justFolders, \r
Context context, \r
ComponentsGetter transferServiceGetter\r
) {\r
- \r
+\r
mJustFolders = justFolders;\r
mContext = context;\r
mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
- mTransferServiceGetter = transferServiceGetter;\r
- \r
++
+ mTransferServiceGetter = transferServiceGetter;
+ \r
+ mAppPreferences = PreferenceManager\r
+ .getDefaultSharedPreferences(mContext);\r
+ \r
+ // Read sorting order, default to sort by name ascending\r
+ mSortOrder = mAppPreferences\r
+ .getInt("sortOrder", 0);\r
+ mSortAscending = mAppPreferences.getBoolean("sortAscending", true);
+ \r
// initialise thumbnails cache on background thread\r
- new ThumbnailsCacheManager.InitDiskCacheTask().execute();\r
+ new ThumbnailsCacheManager.InitDiskCacheTask(mAccount, mContext).execute();\r
+\r
}\r
- \r
+
@Override\r
public boolean areAllItemsEnabled() {\r
return true;\r
}\r
} \r
else {\r
- fileSizeV.setVisibility(View.INVISIBLE);\r
- //fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
+ // TODO Re-enable when server supports folder-size calculation\r
+ // if (FileStorageUtils.getDefaultSavePathFor(mAccount.name, file) != null){\r
+ // fileSizeV.setVisibility(View.VISIBLE);\r
+ // fileSizeV.setText(getFolderSizeHuman(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file)));\r
+ // } else {\r
+ fileSizeV.setVisibility(View.INVISIBLE);\r
+ // }\r
+
lastModV.setVisibility(View.VISIBLE);\r
lastModV.setText(\r
DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
\r
return view;\r
}\r
- \r
+
+ /**\r
+ * Local Folder size in human readable format\r
+ * \r
+ * @param path\r
+ * String\r
+ * @return Size in human readable format\r
+ */\r
+ private String getFolderSizeHuman(String path) {\r
+ \r
+ File dir = new File(path);\r
+ \r
+ if (dir.exists()) {\r
+ long bytes = getFolderSize(dir);\r
+ return DisplayUtils.bytesToHumanReadable(bytes);\r
+ }\r
+ \r
+ return "0 B";\r
+ }\r
+ \r
+ /**\r
+ * Local Folder size\r
+ * @param dir File\r
+ * @return Size in bytes\r
+ */\r
+ private long getFolderSize(File dir) {\r
+ if (dir.exists()) {\r
+ long result = 0;\r
+ File[] fileList = dir.listFiles();\r
+ for(int i = 0; i < fileList.length; i++) {\r
+ if(fileList[i].isDirectory()) {\r
+ result += getFolderSize(fileList[i]);\r
+ } else {\r
+ result += fileList[i].length();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+ return 0;\r
+ }
+
@Override\r
public int getViewTypeCount() {\r
return 1;\r
} else {\r
mFiles = null;\r
}\r
+ \r
+ sortDirectory();\r
+ }\r
+ \r
+ /**\r
+ * Sorts all filenames, regarding last user decision \r
+ */\r
+ private void sortDirectory(){\r
+ switch (mSortOrder){\r
+ case 0:\r
+ sortByName(mSortAscending);\r
+ break;\r
+ case 1:\r
+ sortByDate(mSortAscending);\r
+ break;\r
+ case 2: \r
+ sortBySize(mSortAscending);\r
+ break;\r
+ }\r
+ \r
notifyDataSetChanged();\r
}\r
\r
&& file.getPermissions() != null \r
&& file.getPermissions().contains(PERMISSION_SHARED_WITH_ME));\r
}\r
+ \r
+ /**\r
+ * Sorts list by Date\r
+ * @param sortAscending true: ascending, false: descending\r
+ */\r
+ private void sortByDate(boolean sortAscending){\r
+ final Integer val;\r
+ if (sortAscending){\r
+ val = 1;\r
+ } else {\r
+ val = -1;\r
+ }\r
+ \r
+ Collections.sort(mFiles, new Comparator<OCFile>() {\r
+ public int compare(OCFile o1, OCFile o2) {\r
+ if (o1.isFolder() && o2.isFolder()) {\r
+ Long obj1 = o1.getModificationTimestamp();\r
+ return val * obj1.compareTo(o2.getModificationTimestamp());\r
+ }\r
+ else if (o1.isFolder()) {\r
+ return -1;\r
+ } else if (o2.isFolder()) {\r
+ return 1;\r
+ } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){\r
+ return 0;\r
+ } else {\r
+ Long obj1 = o1.getModificationTimestamp();\r
+ return val * obj1.compareTo(o2.getModificationTimestamp());\r
+ }\r
+ }\r
+ });\r
+ }\r
+ \r
+ /**\r
+ * Sorts list by Size\r
+ * @param sortAscending true: ascending, false: descending\r
+ */\r
+ private void sortBySize(boolean sortAscending){\r
+ final Integer val;\r
+ if (sortAscending){\r
+ val = 1;\r
+ } else {\r
+ val = -1;\r
+ }\r
+ \r
+ Collections.sort(mFiles, new Comparator<OCFile>() {\r
+ public int compare(OCFile o1, OCFile o2) {\r
+ if (o1.isFolder() && o2.isFolder()) {\r
+ Long obj1 = getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1)));\r
+ return val * obj1.compareTo(getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2))));\r
+ }\r
+ else if (o1.isFolder()) {\r
+ return -1;\r
+ } else if (o2.isFolder()) {\r
+ return 1;\r
+ } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){\r
+ return 0;\r
+ } else {\r
+ Long obj1 = o1.getFileLength();\r
+ return val * obj1.compareTo(o2.getFileLength());\r
+ }\r
+ }\r
+ });\r
+ }\r
+ \r
+ /**\r
+ * Sorts list by Name\r
+ * @param sortAscending true: ascending, false: descending\r
+ */\r
+ private void sortByName(boolean sortAscending){\r
+ final Integer val;\r
+ if (sortAscending){\r
+ val = 1;\r
+ } else {\r
+ val = -1;\r
+ }\r
+ \r
+ Collections.sort(mFiles, new Comparator<OCFile>() {\r
+ public int compare(OCFile o1, OCFile o2) {\r
+ if (o1.isFolder() && o2.isFolder()) {\r
+ return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase());\r
+ } else if (o1.isFolder()) {\r
+ return -1;\r
+ } else if (o2.isFolder()) {\r
+ return 1;\r
+ }\r
+ return val * new AlphanumComparator().compare(o1, o2);\r
+ }\r
+ });\r
+ }\r
+ \r
+ public void setSortOrder(Integer order, boolean ascending) {\r
+ SharedPreferences.Editor editor = mAppPreferences.edit();\r
+ editor.putInt("sortOrder", order);\r
+ editor.putBoolean("sortAscending", ascending);\r
+ editor.commit();\r
+ \r
+ mSortOrder = order;\r
+ mSortAscending = ascending;\r
+ \r
+ sortDirectory();\r
+ }
}\r