Merge branch 'develop' into obeySortOrder_fixmerge
authorjabarros <jabarros@solidgear.es>
Fri, 26 Dec 2014 10:10:22 +0000 (11:10 +0100)
committerjabarros <jabarros@solidgear.es>
Fri, 26 Dec 2014 10:10:22 +0000 (11:10 +0100)
1  2 
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java
src/com/owncloud/android/utils/FileStorageUtils.java

@@@ -25,12 -25,15 +25,15 @@@ import android.accounts.Account
  import android.accounts.AccountManager;
  import android.accounts.AuthenticatorException;
  import android.accounts.OperationCanceledException;
+ import android.annotation.SuppressLint;
+ import android.annotation.TargetApi;
  import android.app.AlertDialog;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.content.BroadcastReceiver;
  import android.content.ComponentName;
  import android.content.ContentResolver;
+ import android.content.ContentUris;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
@@@ -41,13 -44,18 +44,18 @@@ import android.content.SyncRequest
  import android.content.res.Resources.NotFoundException;
  import android.database.Cursor;
  import android.net.Uri;
+ import android.os.Build;
  import android.os.Bundle;
+ import android.os.Environment;
  import android.os.IBinder;
  import android.preference.PreferenceManager;
+ import android.provider.DocumentsContract;
  import android.provider.MediaStore;
+ import android.provider.OpenableColumns;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentManager;
  import android.support.v4.app.FragmentTransaction;
+ import android.util.Log;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.ArrayAdapter;
@@@ -101,7 -109,7 +109,8 @@@ import com.owncloud.android.ui.preview.
  import com.owncloud.android.ui.preview.PreviewVideoActivity;
  import com.owncloud.android.utils.DisplayUtils;
  import com.owncloud.android.utils.ErrorMessageAdapter;
 +import com.owncloud.android.utils.FileStorageUtils;
+ import com.owncloud.android.utils.UriUtils;
  
  
  /**
@@@ -152,7 -160,7 +161,7 @@@ OnSslUntrustedCertListener, OnEnforceab
      private String DIALOG_UNTRUSTED_CERT;
      
      private OCFile mWaitingToSend;
-     
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          Log_OC.d(TAG, "onCreate() start");
              
              // Read sorting order, default to sort by name ascending
              Integer sortOrder = appPreferences
 -                    .getInt("sortOrder", FileListListAdapter.SORT_NAME);
 +                    .getInt("sortOrder", FileStorageUtils.SORT_NAME);
              
              AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setTitle(R.string.actionbar_sort_title)
              builder.setExpedited(true);
              builder.setManual(true);
              builder.syncOnce();
+             // Fix bug in Android Lollipop when you click on refresh the whole account
+             Bundle extras = new Bundle();
+             builder.setExtras(extras);
              SyncRequest request = builder.build();
              ContentResolver.requestSync(request);
          }
  
      /**
       * Called, when the user selected something for uploading
+      *
       */
+     @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
  
          if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
-             requestSimpleUpload(data, resultCode);
+             //getClipData is only supported on api level 16+, Jelly Bean
+             if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
+                 for( int i = 0; i < data.getClipData().getItemCount(); i++){
+                     Intent intent = new Intent();
+                     intent.setData(data.getClipData().getItemAt(i).getUri());
+                     requestSimpleUpload(intent, resultCode);
+                 }
+             }else {
+                 requestSimpleUpload(data, resultCode);
+             }
          } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
              requestMultipleUpload(data, resultCode);
  
-         } else if (requestCode == ACTION_MOVE_FILES && (resultCode == RESULT_OK || 
-                 resultCode == MoveActivity.RESULT_OK_AND_MOVE)){
+         } else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK){
  
              final Intent fData = data;
              final int fResultCode = resultCode; 
  
      private void requestSimpleUpload(Intent data, int resultCode) {
          String filepath = null;
+         String mimeType = null;
+         Uri selectedImageUri = data.getData();
          try {
-             Uri selectedImageUri = data.getData();
+             mimeType = getContentResolver().getType(selectedImageUri);
  
              String filemanagerstring = selectedImageUri.getPath();
              String selectedImagePath = getPath(selectedImageUri);
          }
          if (!remotepath.endsWith(OCFile.PATH_SEPARATOR))
              remotepath += OCFile.PATH_SEPARATOR;
-         remotepath += new File(filepath).getName();
+         if (filepath.startsWith(UriUtils.URI_CONTENT_SCHEME)) {
+             Cursor cursor = MainApp.getAppContext().getContentResolver()
+                     .query(Uri.parse(filepath), null, null, null, null, null);
+             try {
+                 if (cursor != null && cursor.moveToFirst()) {
+                     String displayName = cursor.getString(
+                             cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
+                     Log.i(TAG, "Display Name: " + displayName + "; mimeType: " + mimeType);
+                     displayName.replace(File.separatorChar, '_');
+                     displayName.replace(File.pathSeparatorChar, '_');
+                     remotepath += displayName + DisplayUtils.getComposedFileExtension(filepath);
+                 }
+             } finally {
+                 cursor.close();
+             }
+         } else {
+             remotepath += new File(filepath).getName();
+         }
  
          i.putExtra(FileUploader.KEY_LOCAL_FILE, filepath);
          i.putExtra(FileUploader.KEY_REMOTE_FILE, remotepath);
+         i.putExtra(FileUploader.KEY_MIME_TYPE, mimeType);
          i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
          if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)
              i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);
       * @param resultCode        Result code received
       */
      private void requestMoveOperation(Intent data, int resultCode) {
-         OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(MoveActivity.EXTRA_CURRENT_FOLDER);
-         OCFile targetFile = (OCFile) data.getParcelableExtra(MoveActivity.EXTRA_TARGET_FILE);
+         OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
+         OCFile targetFile = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE);
          getFileOperationsHelper().moveFile(folderToMoveAt, targetFile);
      }
  
                      } else if (item == 1) {
                          Intent action = new Intent(Intent.ACTION_GET_CONTENT);
                          action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
+                         //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
+                         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+                             action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+                         }
                          startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)),
                                  ACTION_SELECT_CONTENT_FROM_APPS);
                      }
          return dialog;
      }
  
      /**
-      * Translates a content URI of an image to a physical path
-      * on the disk
+      * Translates a content URI of an content to a physical path on the disk
+      * 
       * @param uri The URI to resolve
-      * @return The path to the image or null if it could not be found
+      * @return The path to the content or null if it could not be found
       */
      public String getPath(Uri uri) {
-         String[] projection = { MediaStore.Images.Media.DATA };
-         Cursor cursor = managedQuery(uri, projection, null, null, null);
-         if (cursor != null) {
-             int column_index = cursor
-                     .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
-             cursor.moveToFirst();
-             return cursor.getString(column_index);
-         } 
+         final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+         // DocumentProvider
+         if (isKitKatOrLater && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) {
+             // ExternalStorageProvider
+             if (UriUtils.isExternalStorageDocument(uri)) {
+                 final String docId = DocumentsContract.getDocumentId(uri);
+                 final String[] split = docId.split(":");
+                 final String type = split[0];
+                 if ("primary".equalsIgnoreCase(type)) {
+                     return Environment.getExternalStorageDirectory() + "/" + split[1];
+                 }
+             }
+             // DownloadsProvider
+             else if (UriUtils.isDownloadsDocument(uri)) {
+                 final String id = DocumentsContract.getDocumentId(uri);
+                 final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
+                         Long.valueOf(id));
+                 return UriUtils.getDataColumn(getApplicationContext(), contentUri, null, null);
+             }
+             // MediaProvider
+             else if (UriUtils.isMediaDocument(uri)) {
+                 final String docId = DocumentsContract.getDocumentId(uri);
+                 final String[] split = docId.split(":");
+                 final String type = split[0];
+                 Uri contentUri = null;
+                 if ("image".equals(type)) {
+                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+                 } else if ("video".equals(type)) {
+                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+                 } else if ("audio".equals(type)) {
+                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+                 }
+                 final String selection = "_id=?";
+                 final String[] selectionArgs = new String[] { split[1] };
+                 return UriUtils.getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs);
+             }
+             // Documents providers returned as content://...
+             else if (UriUtils.isContentDocument(uri)) {
+                 return uri.toString();
+             }
+         }
+         // MediaStore (and general)
+         else if ("content".equalsIgnoreCase(uri.getScheme())) {
+             // Return the remote address
+             if (UriUtils.isGooglePhotosUri(uri))
+                 return uri.getLastPathSegment();
+             return UriUtils.getDataColumn(getApplicationContext(), uri, null, null);
+         }
+         // File
+         else if ("file".equalsIgnoreCase(uri.getScheme())) {
+             return uri.getPath();
+         }
          return null;
      }
  
@@@ -29,6 -29,7 +29,7 @@@ import android.content.Context
  import android.content.SharedPreferences;\r
  import android.graphics.Bitmap;\r
  import android.preference.PreferenceManager;\r
+ import android.text.format.DateUtils;\r
  import android.view.LayoutInflater;\r
  import android.view.View;\r
  import android.view.ViewGroup;\r
@@@ -70,7 -71,11 +71,7 @@@ public class FileListListAdapter extend
      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
 +    \r
      private SharedPreferences mAppPreferences;\r
      \r
      public FileListListAdapter(\r
              Context context, \r
              ComponentsGetter transferServiceGetter\r
              ) {\r
-         \r
\r
          mJustFolders = justFolders;\r
          mContext = context;\r
          mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);\r
          mTransferServiceGetter = transferServiceGetter;
          \r
          mAppPreferences = PreferenceManager\r
                  .getDefaultSharedPreferences(mContext);\r
          \r
          // Read sorting order, default to sort by name ascending\r
 -        mSortOrder = mAppPreferences\r
 +        FileStorageUtils.mSortOrder = mAppPreferences\r
                  .getInt("sortOrder", 0);\r
 -        mSortAscending = mAppPreferences.getBoolean("sortAscending", true);
 +        FileStorageUtils.mSortAscending = mAppPreferences.getBoolean("sortAscending", true);
          \r
          // initialise thumbnails cache on background thread\r
          new ThumbnailsCacheManager.InitDiskCacheTask().execute();\r
\r
      }\r
      
      @Override\r
                  fileSizeV.setVisibility(View.VISIBLE);\r
                  fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
                  lastModV.setVisibility(View.VISIBLE);\r
-                 lastModV.setText(\r
-                         DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
-                 );\r
+                 lastModV.setText(showRelativeTimestamp(file));\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
                          if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {\r
                              final ThumbnailsCacheManager.ThumbnailGenerationTask task = \r
                                      new ThumbnailsCacheManager.ThumbnailGenerationTask(\r
-                                             fileIcon, mStorageManager\r
+                                             fileIcon, mStorageManager, mAccount\r
                                      );\r
                              if (thumbnail == null) {\r
                                  thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
  //                }\r
  
                  lastModV.setVisibility(View.VISIBLE);\r
-                 lastModV.setText(\r
-                         DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())\r
-                 );\r
+                 lastModV.setText(showRelativeTimestamp(file));\r
                  checkBoxV.setVisibility(View.GONE);\r
                  view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
  \r
          File dir = new File(path);\r
  \r
          if (dir.exists()) {\r
 -            long bytes = getFolderSize(dir);\r
 +            long bytes = FileStorageUtils.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
              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
 +        mFiles = FileStorageUtils.sortFolder(mFiles);\r
          notifyDataSetChanged();\r
      }\r
      \r
 -    \r
 +\r
      /**\r
       * Filter for getting only the folders\r
       * @param files\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
 +        FileStorageUtils.mSortOrder = order;\r
 +        FileStorageUtils.mSortAscending = ascending;\r
          \r
 -        sortDirectory();\r
++
 +        mFiles = FileStorageUtils.sortFolder(mFiles);\r
 +        notifyDataSetChanged();\r
-     }    
++\r
+     }    \r
+     \r
+     private CharSequence showRelativeTimestamp(OCFile file){\r
+         return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(),\r
+                 DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);\r
+     }
++
  }\r
  package com.owncloud.android.ui.fragment;
  
  import java.io.File;
+ import java.util.Vector;
  
  import android.app.Activity;
+ import android.content.Context;
  import android.content.Intent;
  import android.os.Bundle;
  import android.support.v4.widget.SwipeRefreshLayout;
@@@ -29,6 -31,8 +31,8 @@@ import android.view.MenuItem
  import android.view.View;
  import android.widget.AdapterView;
  import android.widget.AdapterView.AdapterContextMenuInfo;
+ import android.widget.TextView;
+ import android.view.LayoutInflater;
  
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.FileDataStorageManager;
@@@ -36,7 -40,7 +40,7 @@@ import com.owncloud.android.datamodel.O
  import com.owncloud.android.files.FileMenuFilter;
  import com.owncloud.android.lib.common.utils.Log_OC;
  import com.owncloud.android.ui.activity.FileDisplayActivity;
- import com.owncloud.android.ui.activity.MoveActivity;
+ import com.owncloud.android.ui.activity.FolderPickerActivity;
  import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
  import com.owncloud.android.ui.adapter.FileListListAdapter;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@@ -44,7 -48,6 +48,7 @@@ import com.owncloud.android.ui.dialog.R
  import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
  import com.owncloud.android.ui.preview.PreviewImageFragment;
  import com.owncloud.android.ui.preview.PreviewMediaFragment;
 +import com.owncloud.android.utils.FileStorageUtils;
  
  /**
   * A Fragment that lists all files and folders in a given path.
@@@ -71,6 -74,7 +75,7 @@@ public class OCFileListFragment extend
     
      private OCFile mFile = null;
      private FileListListAdapter mAdapter;
+     private View mFooterView;
      
      private OCFile mTargetFile;
  
      public void onActivityCreated(Bundle savedInstanceState) {
          super.onActivityCreated(savedInstanceState);
          Log_OC.e(TAG, "onActivityCreated() start");
-         
          if (savedInstanceState != null) {
              mFile = savedInstanceState.getParcelable(KEY_FILE);
          }
-         
+         mFooterView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
+                         R.layout.list_footer, null, false);
+         setFooterView(mFooterView);
          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.
       */
                  );
                  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
+             MenuItem item = menu.findItem(R.id.action_open_file_with);
              FileFragment frag = ((FileDisplayActivity)getSherlockActivity()).getSecondFragment();
              if (frag != null && frag instanceof FileDetailFragment && 
                      frag.getFile().getFileId() == targetFile.getFileId()) {
                  mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile);
                  return true;
              }
+             case R.id.action_open_file_with: {
+                 mContainerActivity.getFileOperationsHelper().openFile(mTargetFile);
+                 return true;
+             }
              case R.id.action_unshare_file: {
                  mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile);
                  return true;
                  return true;
              }
              case R.id.action_move: {
-                 Intent action = new Intent(getActivity(), MoveActivity.class);
+                 Intent action = new Intent(getActivity(), FolderPickerActivity.class);
  
                  // Pass mTargetFile that contains info of selected file/folder
-                 action.putExtra(MoveActivity.EXTRA_TARGET_FILE, mTargetFile);
+                 action.putExtra(FolderPickerActivity.EXTRA_FILE, mTargetFile);
                  getActivity().startActivityForResult(action, FileDisplayActivity.ACTION_MOVE_FILES);
                  return true;
              }
                  mList.setSelectionFromTop(0, 0);
              }
              mFile = directory;
+             
+             // Update Footer
+             TextView footerText = (TextView) mFooterView.findViewById(R.id.footerText);
+             Log_OC.d("footer", String.valueOf(System.currentTimeMillis()));
+             footerText.setText(generateFooterText(directory));
+             Log_OC.d("footer", String.valueOf(System.currentTimeMillis()));
+         }
+     }
+     
+     private String generateFooterText(OCFile directory) {
+         Integer files = 0;
+         Integer folders = 0;
+         FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
+         Vector<OCFile> mFiles = storageManager.getFolderContent(mFile);
+         for (OCFile ocFile : mFiles) {
+             if (ocFile.isFolder()) {
+                 folders++;
+             } else {
+                 files++;
+             }
+         }
+         String output = "";
+        
+         if (files > 0){
+             if (files == 1) {
+                 output = output + files.toString() + " " + getResources().getString(R.string.file_list_file);
+             } else {
+                 output = output + files.toString() + " " + getResources().getString(R.string.file_list_files);
+             }
+         }
+         if (folders > 0 && files > 0){
+             output = output + ", ";
          }
+         if (folders == 1) {
+             output = output + folders.toString() + " " + getResources().getString(R.string.file_list_folder);
+         } else if (folders > 1) {
+             output = output + folders.toString() + " " + getResources().getString(R.string.file_list_folders);
+         }
+         
+         return output;
      }
      
      public void sortByName(boolean descending) {
 -        mAdapter.setSortOrder(FileListListAdapter.SORT_NAME, descending);
 +        mAdapter.setSortOrder(FileStorageUtils.SORT_NAME, descending);
      }
  
      public void sortByDate(boolean descending) {
 -        mAdapter.setSortOrder(FileListListAdapter.SORT_DATE, descending);
 +        mAdapter.setSortOrder(FileStorageUtils.SORT_DATE, descending);
      }
  
      public void sortBySize(boolean descending) {
 -        mAdapter.setSortOrder(FileListListAdapter.SORT_SIZE, descending);
 +        mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending);
      }  
  
  }
  package com.owncloud.android.utils;
  
  import java.io.File;
 +import java.util.Collections;
 +import java.util.Comparator;
 +import java.util.Vector;
 +
 +import third_parties.daveKoeller.AlphanumComparator;
  
  import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
@@@ -44,13 -39,6 +44,13 @@@ import android.os.StatFs
   * @author David A. Velasco
   */
  public class FileStorageUtils {
 +    public static Integer mSortOrder;
 +    public static Boolean mSortAscending;
 +    public static final Integer SORT_NAME = 0;
 +    public static final Integer SORT_DATE = 1;
 +    public static final Integer SORT_SIZE = 2;
 +  
 +    
      //private static final String LOG_TAG = "FileStorageUtils";
  
      public static final String getSavePath(String accountName) {
          String value = uploadPath + OCFile.PATH_SEPARATOR +  (fileName == null ? "" : fileName);
          return value;
      }
+     /**
+      * Gets the composed path when video is or must be stored
+      * @param context
+      * @param fileName: video file name
+      * @return String: video file path composed
+      */
+     public static String getInstantVideoUploadFilePath(Context context, String fileName) {
+         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
+         String uploadVideoPathdef = context.getString(R.string.instant_upload_path);
+         String uploadVideoPath = pref.getString("instant_video_upload_path", uploadVideoPathdef);
+         String value = uploadVideoPath + OCFile.PATH_SEPARATOR +  (fileName == null ? "" : fileName);
+         return value;
+     }
      
      public static String getParentPath(String remotePath) {
          String parentPath = new File(remotePath).getParent();
          file.setRemoteId(ocFile.getRemoteId());
          return file;
      }
 +    
 +    /**
 +     * Sorts all filenames, regarding last user decision 
 +     */
 +    public static Vector<OCFile> sortFolder(Vector<OCFile> files){
 +        switch (mSortOrder){
 +        case 0:
 +            files = FileStorageUtils.sortByName(files);
 +            break;
 +        case 1:
 +            files = FileStorageUtils.sortByDate(files);
 +            break;
 +        case 2: 
 +           // mFiles = FileStorageUtils.sortBySize(mSortAscending);
 +            break;
 +        }
 +       
 +        return files;
 +    }
 +    
 +    /**
 +     * Sorts list by Date
 +     * @param sortAscending true: ascending, false: descending
 +     */
 +    public static Vector<OCFile> sortByDate(Vector<OCFile> files){
 +        final Integer val;
 +        if (mSortAscending){
 +            val = 1;
 +        } else {
 +            val = -1;
 +        }
 +        
 +        Collections.sort(files, new Comparator<OCFile>() {
 +            public int compare(OCFile o1, OCFile o2) {
 +                if (o1.isFolder() && o2.isFolder()) {
 +                    Long obj1 = o1.getModificationTimestamp();
 +                    return val * obj1.compareTo(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 {
 +                    Long obj1 = o1.getModificationTimestamp();
 +                    return val * obj1.compareTo(o2.getModificationTimestamp());
 +                }
 +            }
 +        });
 +        
 +        return files;
 +    }
 +
 +//    /**
 +//     * Sorts list by Size
 +//     * @param sortAscending true: ascending, false: descending
 +//     */
 +//    public static Vector<OCFile> sortBySize(Vector<OCFile> files){
 +//        final Integer val;
 +//        if (mSortAscending){
 +//            val = 1;
 +//        } else {
 +//            val = -1;
 +//        }
 +//        
 +//        Collections.sort(files, new Comparator<OCFile>() {
 +//            public int compare(OCFile o1, OCFile o2) {
 +//                if (o1.isFolder() && o2.isFolder()) {
 +//                    Long obj1 = getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1)));
 +//                    return val * obj1.compareTo(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 {
 +//                    Long obj1 = o1.getFileLength();
 +//                    return val * obj1.compareTo(o2.getFileLength());
 +//                }
 +//            }
 +//        });
 +//        
 +//        return files;
 +//    }
 +
 +    /**
 +     * Sorts list by Name
 +     * @param sortAscending true: ascending, false: descending
 +     */
 +    public static Vector<OCFile> sortByName(Vector<OCFile> files){
 +        final Integer val;
 +        if (mSortAscending){
 +            val = 1;
 +        } else {
 +            val = -1;
 +        }
 +
 +        Collections.sort(files, new Comparator<OCFile>() {
 +            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);
 +            }
 +        });
 +        
 +        return files;
 +    }
 +    
 +    /**
 +     * Local Folder size
 +     * @param dir File
 +     * @return Size in bytes
 +     */
 +    public static 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;
 +    } 
    
  }