Merge branch 'develop' into thumbnails_from_server
authorjabarros <jabarros@solidgear.es>
Mon, 27 Oct 2014 14:12:48 +0000 (15:12 +0100)
committerjabarros <jabarros@solidgear.es>
Mon, 27 Oct 2014 14:12:48 +0000 (15:12 +0100)
Conflicts:
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

1  2 
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

   */\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
@@@ -41,7 -48,8 +48,8 @@@ import com.owncloud.android.files.servi
  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
@@@ -51,7 -59,7 +59,7 @@@
   * @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