Merge remote-tracking branch 'upstream/develop' into imageGrid
authortobiasKaminsky <tobias@kaminsky.me>
Wed, 5 Nov 2014 21:07:11 +0000 (22:07 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Wed, 5 Nov 2014 21:07:11 +0000 (22:07 +0100)
Conflicts:
owncloud-android-library
res/layout/list_item.xml
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/fragment/LocalFileListFragment.java

1  2 
owncloud-android-library
res/layout/list_item.xml
src/com/owncloud/android/MainApp.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/fragment/ExtendedListFragment.java
src/com/owncloud/android/ui/fragment/LocalFileListFragment.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

index 0000000,4f315c7..5bd0d73
mode 000000,160000..160000
--- /dev/null
@@@ -1,0 -1,1 +1,1 @@@
 -Subproject commit 4f315c7e06f6eef48df246be0ee9252fdfccdf00
++Subproject commit 5bd0d7387712ce3f53869294761ac4d8537841cd
          android:focusableInTouchMode="false">\r
  \r
          <ImageView\r
 -            android:id="@+id/imageView2"\r
 +            android:id="@+id/localFileIndicator"\r
-             android:layout_width="32dp"\r
-             android:layout_height="32dp"\r
+             android:layout_width="@dimen/file_icon_size"\r
+             android:layout_height="@dimen/file_icon_size"\r
              android:layout_gravity="center_vertical"\r
              android:layout_marginLeft="22dp"\r
              android:src="@drawable/local_file_indicator" />\r
  \r
          <ImageView\r
 -            android:id="@+id/imageView1"\r
 +            android:id="@+id/thumbnail"\r
-             android:layout_width="32dp"\r
-             android:layout_height="32dp"\r
+             android:layout_width="@dimen/file_icon_size"\r
+             android:layout_height="@dimen/file_icon_size"\r
              android:layout_gravity="center_vertical"\r
              android:layout_marginLeft="9dp"\r
              android:src="@drawable/ic_menu_archive" />\r
   */
  package com.owncloud.android;
  
- import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
- import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
+ import android.app.Application;
+ import android.content.Context;
++import com.owncloud.android.authentication.AccountUtils;
++import com.owncloud.android.datamodel.ThumbnailsCacheManager;
++import android.app.Application;
++import android.content.Context;
++
++import com.owncloud.android.authentication.AccountUtils;
++import com.owncloud.android.datamodel.ThumbnailsCacheManager;
++import android.app.Application;
++import android.content.Context;
 +
++import com.owncloud.android.authentication.AccountUtils;
++import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 +import android.app.Application;
 +import android.content.Context;
++
++import com.owncloud.android.datamodel.ThumbnailsCacheManager;
++import android.app.Application;
++import android.content.Context;
++
++import com.owncloud.android.authentication.AccountUtils;
+ import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+ import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+ import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
+ import com.owncloud.android.lib.common.utils.Log_OC;
  /**
   * Main Application of the project
   * 
@@@ -53,7 -55,20 +75,20 @@@ public class MainApp extends Applicatio
          } else {
              OwnCloudClientManagerFactory.setDefaultPolicy(Policy.ALWAYS_NEW_CLIENT);
          }
 -        new ThumbnailsCacheManager.InitDiskCacheTask().execute();
+         // initialise thumbnails cache on background thread
++        new ThumbnailsCacheManager.InitDiskCacheTask(mContext).execute();
          
+         if (BuildConfig.DEBUG) {
+             String dataFolder = getDataFolder();
+             // Set folder for store logs
+             Log_OC.setLogDataFolder(dataFolder);
+             Log_OC.startLogging();
+             Log_OC.d("Debug", "start logging");
+         }
      }
  
      public static Context getAppContext() {
   */\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
++<<<<<<< HEAD
 +import android.graphics.Bitmap;\r
 +import android.graphics.BitmapFactory;\r
 +import android.media.ThumbnailUtils;\r
++=======
+ import android.content.SharedPreferences;\r
+ import android.graphics.Bitmap;\r
+ import android.preference.PreferenceManager;\r
++>>>>>>> upstream/develop
  import android.view.LayoutInflater;\r
  import android.view.View;\r
  import android.view.ViewGroup;\r
@@@ -42,8 -48,8 +55,13 @@@ 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
++<<<<<<< HEAD
 +import com.owncloud.android.utils.Log_OC;\r
 +\r
++=======
+ import com.owncloud.android.utils.FileStorageUtils;\r
++>>>>>>> upstream/develop
  \r
  /**\r
   * This Adapter populates a ListView with all files and folders in an ownCloud\r
@@@ -63,7 -70,12 +82,16 @@@ public class FileListListAdapter extend
      private FileDataStorageManager mStorageManager;
      private Account mAccount;
      private ComponentsGetter mTransferServiceGetter;\r
++<<<<<<< HEAD
 +    private enum ViewType {LIST_ITEM, GRID_IMAGE, GRID_ITEM };\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
++>>>>>>> upstream/develop
      \r
      public FileListListAdapter(\r
              boolean justFolders, \r
  \r
      @Override\r
      public View getView(int position, View convertView, ViewGroup parent) {\r
 +     // decide image vs. file view\r
 +        double count = 0;\r
 +        \r
 +        \r
 +        for (OCFile file : mFiles){\r
 +            if (file.isImage()){\r
 +                count++;\r
 +            }\r
 +        }\r
 +        \r
 +        // TODO threshold as constant in Preferences\r
 +        // > 50% Images --> image view\r
 +        boolean fileView = true;\r
 +        if ((count / mFiles.size()) >= 0.5){\r
 +            fileView = false;\r
 +        } else {\r
 +            fileView = true;\r
 +        }\r
 +        \r
          View view = convertView;\r
 -        if (view == null) {\r
 -            LayoutInflater inflator = (LayoutInflater) mContext\r
 -                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
 +        OCFile file = null;\r
 +        LayoutInflater inflator = (LayoutInflater) mContext\r
 +                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
 +        \r
 +        if (mFiles != null && mFiles.size() > position) {\r
 +            file = mFiles.get(position);\r
 +        }\r
 +        \r
 +        // Find out which layout should be displayed\r
 +        ViewType viewType;\r
 +        if (fileView){\r
 +            viewType = ViewType.LIST_ITEM;\r
 +        } else if (file.isImage()){\r
 +            viewType = ViewType.GRID_IMAGE;\r
 +        } else {\r
 +            viewType = ViewType.GRID_ITEM;\r
 +        }\r
 +\r
 +        // Create View\r
 +        switch (viewType){\r
 +        case GRID_IMAGE:\r
 +            view = inflator.inflate(R.layout.grid_image, null);\r
 +            break;\r
 +        case GRID_ITEM:\r
 +            view = inflator.inflate(R.layout.grid_item, null);\r
 +            break;\r
 +        case LIST_ITEM:\r
              view = inflator.inflate(R.layout.list_item, null);\r
 +            break;\r
          }\r
++<<<<<<< HEAD
 +\r
 +        view.invalidate();\r
 +\r
 +        if (file != null){\r
 +\r
 +            ImageView fileIcon = (ImageView) view.findViewById(R.id.thumbnail);\r
 +            TextView fileName;\r
 +            String name;\r
++=======
+          \r
+         if (mFiles != null && mFiles.size() > position) {\r
+             OCFile file = mFiles.get(position);\r
+             TextView fileName = (TextView) view.findViewById(R.id.Filename);           \r
+             String name = file.getFileName();\r
\r
+             fileName.setText(name);\r
+             ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1);\r
+             fileIcon.setTag(file.getFileId());\r
+             ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon);\r
+             ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon);\r
+             sharedWithMeIconV.setVisibility(View.GONE);\r
\r
+             ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2);\r
+             localStateView.bringToFront();\r
+             FileDownloaderBinder downloaderBinder = \r
+                     mTransferServiceGetter.getFileDownloaderBinder();\r
+             FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder();\r
+             if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {\r
+                 localStateView.setImageResource(R.drawable.downloading_file_indicator);\r
+                 localStateView.setVisibility(View.VISIBLE);\r
+             } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) {\r
+                 localStateView.setImageResource(R.drawable.uploading_file_indicator);\r
+                 localStateView.setVisibility(View.VISIBLE);\r
+             } else if (file.isDown()) {\r
+                 localStateView.setImageResource(R.drawable.local_file_indicator);\r
+                 localStateView.setVisibility(View.VISIBLE);\r
+             } else {\r
+                 localStateView.setVisibility(View.INVISIBLE);\r
+             }\r
+             \r
+             TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);\r
+             TextView lastModV = (TextView) view.findViewById(R.id.last_mod);\r
+             ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);\r
++>>>>>>> upstream/develop
              \r
 -            if (!file.isFolder()) {\r
 +            switch (viewType){\r
 +            case LIST_ITEM:\r
 +                fileName = (TextView) view.findViewById(R.id.Filename);\r
 +                name = file.getFileName();\r
 +                fileName.setText(name);\r
 +                \r
 +                TextView fileSizeV = (TextView) view.findViewById(R.id.file_size);\r
 +                TextView lastModV = (TextView) view.findViewById(R.id.last_mod);\r
 +                ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox);\r
 +                \r
 +                lastModV.setVisibility(View.VISIBLE);\r
++<<<<<<< HEAD
 +                lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));\r
 +                \r
 +                checkBoxV.setVisibility(View.GONE);\r
 +                \r
                  fileSizeV.setVisibility(View.VISIBLE);\r
                  fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
 -                lastModV.setVisibility(View.VISIBLE);\r
 +                \r
 +                ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon);\r
 +                \r
 +\r
 +                if (file.isShareByLink()) {\r
 +                    sharedIconV.setVisibility(View.VISIBLE);\r
++=======
+                 lastModV.setText(\r
+                         DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
+                 );\r
+                 // this if-else is needed even thoe fav icon is visible by default\r
+                 // because android reuses views in listview\r
+                 if (!file.keepInSync()) {\r
+                     view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
++>>>>>>> upstream/develop
                  } else {\r
 -                    view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE);\r
 +                    sharedIconV.setVisibility(View.GONE);\r
                  }\r
                  \r
 -                ListView parentList = (ListView)parent;\r
 -                if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { \r
 -                    checkBoxV.setVisibility(View.GONE);\r
 -                } else {\r
 -                    if (parentList.isItemChecked(position)) {\r
 -                        checkBoxV.setImageResource(android.R.drawable.checkbox_on_background);\r
 +                ImageView localStateView = (ImageView) view.findViewById(R.id.localFileIndicator);\r
 +                \r
 +                if (!file.isFolder()) {\r
 +                    GridView parentList = (GridView)parent;\r
 +                    if (parentList.getChoiceMode() == GridView.CHOICE_MODE_NONE) { \r
 +                        checkBoxV.setVisibility(View.GONE);\r
 +                    } else {\r
 +                        if (parentList.isItemChecked(position)) {\r
 +                            checkBoxV.setImageResource(android.R.drawable.checkbox_on_background);\r
 +                        } else {\r
 +                            checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);\r
 +                        }\r
 +                        checkBoxV.setVisibility(View.VISIBLE);\r
 +                    }\r
++<<<<<<< HEAD
 +                    \r
 +                    localStateView.bringToFront();\r
 +                    FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder();\r
 +                    FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder();\r
 +                    if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {\r
 +                        localStateView.setImageResource(R.drawable.downloading_file_indicator);\r
 +                        localStateView.setVisibility(View.VISIBLE);\r
 +                    } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) {\r
 +                        localStateView.setImageResource(R.drawable.uploading_file_indicator);\r
 +                        localStateView.setVisibility(View.VISIBLE);\r
 +                    } else if (file.isDown()) {\r
 +                        localStateView.setImageResource(R.drawable.local_file_indicator);\r
 +                        localStateView.setVisibility(View.VISIBLE);\r
 +                    } else {\r
 +                        localStateView.setVisibility(View.INVISIBLE);\r
 +                    }\r
 +                    \r
 +                    ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon);\r
 +                    if (checkIfFileIsSharedWithMe(file)) {\r
 +                        sharedWithMeIconV.setVisibility(View.VISIBLE);\r
                      } else {\r
 -                        checkBoxV.setImageResource(android.R.drawable.checkbox_off_background);\r
 +                        sharedWithMeIconV.setVisibility(View.GONE);\r
                      }\r
 +                } else {\r
 +                    localStateView.setVisibility(View.INVISIBLE);\r
 +                }\r
 +                break;\r
 +            case GRID_ITEM:\r
 +                fileName = (TextView) view.findViewById(R.id.Filename);\r
 +                name = file.getFileName();\r
 +                fileName.setText(name);\r
 +                break;\r
 +            case GRID_IMAGE:\r
 +                break;\r
 +            }\r
 +            \r
 +            // For all Views\r
 +            \r
 +            // this if-else is needed even though favorite icon is visible by default\r
 +            // because android reuses views in listview\r
 +            if (!file.keepInSync()) {\r
 +                view.findViewById(R.id.favoriteIcon).setVisibility(View.GONE);\r
 +            } else {\r
 +                view.findViewById(R.id.favoriteIcon).setVisibility(View.VISIBLE);\r
 +            }\r
 +            \r
 +            // No Folder\r
 +            if (!file.isFolder()) {\r
 +                if (file.isImage() && file.isDown()){\r
 +                    Bitmap bitmap = BitmapFactory.decodeFile(file.getStoragePath());\r
 +                    fileIcon.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 200, 200));\r
 +                } else {\r
 +                    fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));\r
 +                }\r
 +            } else {\r
 +                // Folder\r
++=======
+                     checkBoxV.setVisibility(View.VISIBLE);\r
+                 }               \r
+                 \r
+                 // get Thumbnail if file is image\r
+                 if (file.isImage() && file.getRemoteId() != null){\r
+                      // Thumbnail in Cache?\r
+                     Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(\r
+                             String.valueOf(file.getRemoteId())\r
+                     );\r
+                     if (thumbnail != null && !file.needsUpdateThumbnail()){\r
+                         fileIcon.setImageBitmap(thumbnail);\r
+                     } else {\r
+                         // generate new Thumbnail\r
+                         if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {\r
+                             final ThumbnailsCacheManager.ThumbnailGenerationTask task = \r
+                                     new ThumbnailsCacheManager.ThumbnailGenerationTask(\r
+                                             fileIcon, mStorageManager, mAccount\r
+                                     );\r
+                             if (thumbnail == null) {\r
+                                 thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
+                             }\r
+                             final AsyncDrawable asyncDrawable = new AsyncDrawable(\r
+                                     mContext.getResources(), \r
+                                     thumbnail, \r
+                                     task\r
+                             );\r
+                             fileIcon.setImageDrawable(asyncDrawable);\r
+                             task.execute(file);\r
+                         }\r
+                     }\r
+                 } else {\r
+                     fileIcon.setImageResource(\r
+                             DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
+                     );\r
+                 }\r
+                 if (checkIfFileIsSharedWithMe(file)) {\r
+                     sharedWithMeIconV.setVisibility(View.VISIBLE);\r
+                 }\r
+             } \r
+             else {\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
+                 checkBoxV.setVisibility(View.GONE);\r
+                 view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
\r
++>>>>>>> upstream/develop
                  if (checkIfFileIsSharedWithMe(file)) {\r
                      fileIcon.setImageResource(R.drawable.shared_with_me_folder);\r
 -                    sharedWithMeIconV.setVisibility(View.VISIBLE);\r
 +                } else if (file.isShareByLink()) {\r
 +                    // If folder is sharedByLink, icon folder must be changed to\r
 +                    // folder-public one\r
 +                    fileIcon.setImageResource(R.drawable.folder_public);\r
                  } else {\r
-                     fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()));\r
+                     fileIcon.setImageResource(\r
+                             DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())\r
+                     );\r
                  }\r
 -\r
 -                // If folder is sharedByLink, icon folder must be changed to\r
 -                // folder-public one\r
 -                if (file.isShareByLink()) {\r
 -                    fileIcon.setImageResource(R.drawable.folder_public);\r
 -                }\r
 -            }\r
 -\r
 -            if (file.isShareByLink()) {\r
 -                sharedIconV.setVisibility(View.VISIBLE);\r
 -            } else {\r
 -                sharedIconV.setVisibility(View.GONE);\r
 -            }\r
 +            }           \r
          }\r
  \r
          return view;\r
@@@ -64,27 -64,16 +65,27 @@@ implements OnItemClickListener, OnEnfor
      private ArrayList<Integer> mTops;
      private int mHeightCell = 0;
  
-     private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = null;
+     private OnEnforceableRefreshListener mOnRefreshListener = null;
      
 -    
 +    protected GridView imageView;
 +       
      public void setListAdapter(ListAdapter listAdapter) {
 -        mList.setAdapter(listAdapter);
 -        mList.invalidate();
 +        imageView.setAdapter(listAdapter);
 +        imageView.invalidate();
      }
  
 -    public ListView getListView() {
 -        return mList;
 +    public GridView getGridView() {
 +        return imageView;
 +    }
 +    
 +    protected void switchImageView(){
 +       imageView.setNumColumns(GridView.AUTO_FIT);
 +       imageView.invalidate();
 +    }
 +    
 +    protected void switchFileView(){
 +       imageView.setNumColumns(1);
 +       imageView.invalidate();
      }
      
      
@@@ -209,16 -230,18 +230,18 @@@ public class LocalFileListFragment exte
       * @return      File paths to the files checked by the user.
       */
      public String[] getCheckedFilePaths() {
-         String [] result = null;
+         ArrayList<String> result = new ArrayList<String>();
 -        SparseBooleanArray positions = mList.getCheckedItemPositions();
 +        SparseBooleanArray positions = imageView.getCheckedItemPositions();
          if (positions.size() > 0) {
-             Log_OC.d(TAG, "Returning " + positions.size() + " selected files");
-             result = new String[positions.size()];
-             for (int i=0; i<positions.size(); i++) {
-                 result[i] = ((File) imageView.getItemAtPosition(positions.keyAt(i))).getAbsolutePath();
+             for (int i = 0; i < positions.size(); i++) {
+                 if (positions.get(positions.keyAt(i)) == true) {
+                     result.add(((File) mList.getItemAtPosition(positions.keyAt(i))).getAbsolutePath());
+                 }
              }
+             Log_OC.d(TAG, "Returning " + result.size() + " selected files");
          }
-         return result;
+         return result.toArray(new String[result.size()]);
      }
  
      
@@@ -381,30 -381,22 +382,42 @@@ public class OCFileListFragment extend
  
              mAdapter.swapDirectory(directory, storageManager);
              if (mFile == null || !mFile.equals(directory)) {
 -                mList.setSelectionFromTop(0, 0);
 +                imageView.setSelection(0);
              }
              mFile = directory;
 +            
 +         // decide image vs. file view
 +            double count = 0;
 +            
 +            Vector<OCFile> files = storageManager.getFolderContent(directory);
 +            for (OCFile file : files){
 +                if (file.isImage()){
 +                    count++;
 +                }
 +            }
 +            
 +            // > 50% Images --> image view
 +            // TODO threshold as constant in Preferences
 +            if ((count / files.size()) >= 0.5){
 +                Log_OC.i(TAG, "Image View");
 +                switchImageView();
 +            } else {
 +                Log_OC.i(TAG, "Folder View");
 +                switchFileView();
 +            }
          }
      }
+     
+     public void sortByName(boolean descending) {
+         mAdapter.setSortOrder(FileListListAdapter.SORT_NAME, descending);
+     }
+     public void sortByDate(boolean descending) {
+         mAdapter.setSortOrder(FileListListAdapter.SORT_DATE, descending);
+     }
+     public void sortBySize(boolean descending) {
+         mAdapter.setSortOrder(FileListListAdapter.SORT_SIZE, descending);
+     }  
  
  }