Merge remote-tracking branch 'origin/refactor_update_filelist_from_database' into...
authorDavid A. Velasco <dvelasco@solidgear.es>
Tue, 6 May 2014 08:58:19 +0000 (10:58 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Tue, 6 May 2014 08:58:19 +0000 (10:58 +0200)
1  2 
src/com/owncloud/android/ui/fragment/FileDetailFragment.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@@ -1,6 -1,6 +1,6 @@@
  /* ownCloud Android client application
   *   Copyright (C) 2011  Bartek Przybylski
-  *   Copyright (C) 2012-2013 ownCloud Inc.
+  *   Copyright (C) 2012-2014 ownCloud Inc.
   *
   *   This program is free software: you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License version 2,
@@@ -23,11 -23,13 +23,11 @@@ import java.util.ArrayList
  import java.util.List;
  
  import android.accounts.Account;
 -import android.app.Activity;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.os.Bundle;
 -import android.os.Handler;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.View.OnClickListener;
@@@ -49,6 -51,14 +49,6 @@@ import com.owncloud.android.files.servi
  import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
  import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
 -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 -import com.owncloud.android.lib.common.operations.RemoteOperation;
 -import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 -import com.owncloud.android.operations.RemoveFileOperation;
 -import com.owncloud.android.operations.RenameFileOperation;
 -import com.owncloud.android.operations.SynchronizeFileOperation;
 -import com.owncloud.android.ui.activity.ConflictsResolveActivity;
  import com.owncloud.android.ui.activity.FileActivity;
  import com.owncloud.android.ui.activity.FileDisplayActivity;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@@ -67,7 -77,7 +67,7 @@@ import com.owncloud.android.utils.Log_O
   */
  public class FileDetailFragment extends FileFragment implements
          OnClickListener, 
 -        ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener {
 +        ConfirmationDialogFragment.ConfirmationDialogFragmentListener, EditNameDialogListener {
  
      private FileFragment.ContainerActivity mContainerActivity;
      
@@@ -78,6 -88,9 +78,6 @@@
      private UploadFinishReceiver mUploadFinishReceiver;
      public ProgressListener mProgressListener;
      
 -    private Handler mHandler;
 -    private RemoteOperation mLastRemoteOperation;
 -    
      private static final String TAG = FileDetailFragment.class.getSimpleName();
      public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
 -        mHandler = new Handler();
          setHasOptionsMenu(true);
      }
      
          }
          
          View view = null;
 -        //view = inflater.inflate(mLayout, container, false);
          view = inflater.inflate(mLayout, null);
          mView = view;
          
       * {@inheritDoc}
       */
      @Override
 -    public void onAttach(Activity activity) {
 -        super.onAttach(activity);
 -        try {
 -            mContainerActivity = (ContainerActivity) activity;
 -            
 -        } catch (ClassCastException e) {
 -            throw new ClassCastException(activity.toString() + " must implement " + FileDetailFragment.ContainerActivity.class.getSimpleName());
 -        }
 -    }
 -    
 -    
 -    /**
 -     * {@inheritDoc}
 -     */
 -    @Override
      public void onActivityCreated(Bundle savedInstanceState) {
          super.onActivityCreated(savedInstanceState);
-         if (mAccount != null) {
-             OCFile file = mContainerActivity.getStorageManager().
-                     getFileByPath(getFile().getRemotePath());
-             if (file != null) {
-                 setFile(file);
-             }
-         }
+         // TODO: Remove this code. (Updated no needed)
+ //        if (mAccount != null) {
 -//            OCFile file = ((FileActivity)getActivity()).getStorageManager().
 -//                    getFileByPath(getFile().getRemotePath());
++//            OCFile file = mContainerActivity.getStorageManager().
++//              getFileByPath(getFile().getRemotePath());
+ //            if (file != null) {
+ //                setFile(file);
+ //            }
+ //        }
      }
          
  
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.action_share_file: {
 -                FileActivity activity = (FileActivity) getSherlockActivity();
 -                activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
 +                mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile());
                  return true;
              }
              case R.id.action_unshare_file: {
 -                FileActivity activity = (FileActivity) getSherlockActivity();
 -                activity.getFileOperationsHelper().unshareFileWithLink(getFile(), activity);
 +                mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile());
                  return true;
              }
              case R.id.action_open_file_with: {
 -                FileActivity activity = (FileActivity) getSherlockActivity();
 -                activity.getFileOperationsHelper().openFile(getFile(), activity);
 +                mContainerActivity.getFileOperationsHelper().openFile(getFile());
                  return true;
              }
              case R.id.action_remove_file: {
 -                removeFile();
 +                showDialogToRemoveFile();
                  return true;
              }
              case R.id.action_rename_file: {
 -                renameFile();
 +                showDialogToRenameFile();
                  return true;
              }
 -            case R.id.action_download_file: 
              case R.id.action_cancel_download:
 -            case R.id.action_cancel_upload:
 +            case R.id.action_cancel_upload: {
 +                ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile());
 +                return true;
 +            }
 +            case R.id.action_download_file: 
              case R.id.action_sync_file: {
 -                synchronizeFile();
 +                mContainerActivity.getFileOperationsHelper().syncFile(getFile());
                  return true;
              }
              case R.id.action_send_file: {
 -                FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
                  // Obtain the file
                  if (!getFile().isDown()) {  // Download the file                    
                      Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded");
 -                    activity.startDownloadForSending(getFile());
 +                    ((FileDisplayActivity)mContainerActivity).startDownloadForSending(getFile());
                      
                  } else {
 -                    activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity);
 +                    ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(getFile());
                  }
                  return true;
              }
                  break;
              }
              case R.id.fdCancelBtn: {
 -                synchronizeFile();
 +                ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile());
                  break;
              }
              default:
          CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);
          OCFile file = getFile();
          file.setKeepInSync(cb.isChecked());
 -        ((FileActivity)getActivity()).getStorageManager().saveFile(file);
 +        mContainerActivity.getStorageManager().saveFile(file);
          
          /// register the OCFile instance in the observer service to monitor local updates;
          /// if necessary, the file is download 
          getActivity().startService(intent);
          
          if (file.keepInSync()) {
 -            synchronizeFile();   // force an immediate synchronization
 +            mContainerActivity.getFileOperationsHelper().syncFile(getFile());
          }
      }
  
 -    private void removeFile() {
 +    private void showDialogToRemoveFile() {
          OCFile file = getFile();
          ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
                  R.string.confirmation_remove_alert,
      }
  
  
 -    private void renameFile() {
 +    private void showDialogToRenameFile() {
          OCFile file = getFile();
          String fileName = file.getFileName();
          int extensionStart = file.isFolder() ? -1 : fileName.lastIndexOf(".");
          dialog.show(getFragmentManager(), "nameeditdialog");
      }
  
 -    private void synchronizeFile() {
 -        OCFile file = getFile();
 -        FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
 -        FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
 -        if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {
 -            downloaderBinder.cancel(mAccount, file);
 -            if (file.isDown()) {
 -                setButtonsForDown();
 -            } else {
 -                setButtonsForRemote();
 -            }
 -
 -        } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) {
 -            uploaderBinder.cancel(mAccount, file);
 -            if (!file.fileExists()) {
 -                // TODO make something better
 -                ((FileDisplayActivity)getActivity()).cleanSecondFragment();
 -                
 -            } else if (file.isDown()) {
 -                setButtonsForDown();
 -            } else {
 -                setButtonsForRemote();
 -            }
 -            
 -        } else {
 -            mLastRemoteOperation = new SynchronizeFileOperation(
 -                    file, 
 -                    null, 
 -                    ((FileActivity)getActivity()).getStorageManager(), 
 -                    mAccount, 
 -                    true, 
 -                    getActivity());
 -            mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
 -            
 -            // update ui 
 -            ((FileActivity) getActivity()).showLoadingDialog();
 -            
 -        }
 -    }
 -
 +    
      @Override
      public void onConfirmation(String callerTag) {
          OCFile file = getFile();
          if (callerTag.equals(FTAG_CONFIRMATION)) {
 -            FileDataStorageManager storageManager =
 -                    ((FileActivity)getActivity()).getStorageManager();
 -            if (storageManager.getFileById(file.getFileId()) != null) {
 -                mLastRemoteOperation = new RemoveFileOperation( file, 
 -                                                                true, 
 -                                                                storageManager);
 -                mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
 -                                
 -                ((FileActivity) getActivity()).showLoadingDialog();
 +            if (mContainerActivity.getStorageManager().getFileById(file.getFileId()) != null) {
 +                mContainerActivity.getFileOperationsHelper().removeFile(file, true);
              }
          }
      }
      @Override
      public void onNeutral(String callerTag) {
          OCFile file = getFile();
 -        ((FileActivity)getActivity()).getStorageManager().removeFile(file, false, true);    // TODO perform in background task / new thread
 +        mContainerActivity.getStorageManager().removeFile(file, false, true);    // TODO perform in background task / new thread
          if (file.getStoragePath() != null) {
              file.setStoragePath(null);
              updateFileDetails(file, mAccount);
       */
      public void updateFileDetails(OCFile file, Account ocAccount) {
          setFile(file);
 -        FileDataStorageManager storageManager = ((FileActivity)getActivity()).getStorageManager();
 -        if (ocAccount != null && ( 
 -                storageManager == null || 
 -                (mAccount != null && !mAccount.equals(ocAccount))
 -           )) {
 -            storageManager = new FileDataStorageManager(ocAccount, getActivity().getApplicationContext().getContentResolver());
 -        }
          mAccount = ocAccount;
          updateFileDetails(false, false);
      }
       *                          although {@link FileDownloaderBinder#isDownloading(Account, OCFile)}  and 
       *                          {@link FileUploaderBinder#isUploading(Account, OCFile)} return false.
       *                          
 -     * @param refresh           If 'true', try to refresh the hold file from the database
 +     * @param refresh           If 'true', try to refresh the whole file from the database
       */
      public void updateFileDetails(boolean transferring, boolean refresh) {
  
          if (readyToShow()) {
 -            FileDataStorageManager storageManager = 
 -                    ((FileActivity)getActivity()).getStorageManager();
 +            FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
              if (refresh && storageManager != null) {
                  setFile(storageManager.getFileByPath(getFile().getRemotePath()));
              }
              cb.setChecked(file.keepInSync());
  
              // configure UI for depending upon local state of the file
 -            //if (FileDownloader.isDownloading(mAccount, mFile.getRemotePath()) || FileUploader.isUploading(mAccount, mFile.getRemotePath())) {
              FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
              FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
              if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) || (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file))) {
                  if (getFile().getRemotePath().equals(uploadRemotePath) ||
                      renamedInUpload) {
                      if (uploadWasFine) {
 -                        setFile(((FileActivity)getActivity()).getStorageManager().getFileByPath(uploadRemotePath));
 +                        setFile(mContainerActivity.getStorageManager().getFileByPath(uploadRemotePath));
                      }
                      if (renamedInUpload) {
                          String newName = (new File(uploadRemotePath)).getName();
                     
                      // Force the preview if the file is an image
                      if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) {
 -                        ((FileDisplayActivity) mContainerActivity).startImagePreview(getFile());
 +                        ((FileDisplayActivity)mContainerActivity).startImagePreview(getFile());
                      } 
                  }
              }
          if (dialog.getResult()) {
              String newFilename = dialog.getNewFilename();
              Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename);
 -            mLastRemoteOperation = new RenameFileOperation( getFile(), 
 -                                                            mAccount, 
 -                                                            newFilename, 
 -                                                            new FileDataStorageManager(mAccount, getActivity().getContentResolver()));
 -            mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
 -            ((FileActivity) getActivity()).showLoadingDialog();
 +            mContainerActivity.getFileOperationsHelper().renameFile(getFile(), newFilename);
          }
      }
      
      
 -    /**
 -     * {@inheritDoc}
 -     */
 -    @Override
 -    public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
 -        if (operation.equals(mLastRemoteOperation)) {
 -            if (operation instanceof RemoveFileOperation) {
 -                onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
 -                
 -            } else if (operation instanceof RenameFileOperation) {
 -                onRenameFileOperationFinish((RenameFileOperation)operation, result);
 -                
 -            } else if (operation instanceof SynchronizeFileOperation) {
 -                onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);
 -            }
 -        }
 -    }
 -    
 -    
 -    private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
 -        ((FileActivity) getActivity()).dismissLoadingDialog();
 -        if (result.isSuccess()) {
 -            Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
 -            msg.show();
 -            ((FileDisplayActivity)getActivity()).cleanSecondFragment();
 -
 -        } else {
 -            Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); 
 -            msg.show();
 -            if (result.isSslRecoverableException()) {
 -                // TODO show the SSL warning dialog
 -            }
 -        }
 -    }
 -    
 -    private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
 -        ((FileActivity) getActivity()).dismissLoadingDialog();
 -        
 -        if (result.isSuccess()) {
 -            updateFileDetails(((RenameFileOperation)operation).getFile(), mAccount);
 -            /* TODO WIP COMMENT 
 -            mContainerActivity.onFileStateChanged();
 -            */
 -            
 -        } else {
 -            if (result.getCode().equals(ResultCode.INVALID_LOCAL_FILE_NAME)) {
 -                Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG); 
 -                msg.show();
 -                // TODO throw again the new rename dialog
 -            } if (result.getCode().equals(ResultCode.INVALID_CHARACTER_IN_NAME)) {
 -                Toast msg = Toast.makeText(getActivity(), R.string.filename_forbidden_characters, Toast.LENGTH_LONG);
 -                msg.show();
 -            } else {
 -                Toast msg = Toast.makeText(getActivity(), R.string.rename_server_fail_msg, Toast.LENGTH_LONG); 
 -                msg.show();
 -                if (result.isSslRecoverableException()) {
 -                    // TODO show the SSL warning dialog
 -                }
 -            }
 -        }
 -    }
 -    
 -    private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {
 -        ((FileActivity) getActivity()).dismissLoadingDialog();
 -        OCFile file = getFile();
 -        if (!result.isSuccess()) {
 -            if (result.getCode() == ResultCode.SYNC_CONFLICT) {
 -                Intent i = new Intent(getActivity(), ConflictsResolveActivity.class);
 -                i.putExtra(ConflictsResolveActivity.EXTRA_FILE, file);
 -                i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, mAccount);
 -                startActivity(i);
 -                
 -            } 
 -            
 -            if (file.isDown()) {
 -                setButtonsForDown();
 -                
 -            } else {
 -                setButtonsForRemote();
 -            }
 -            
 -        } else {
 -            if (operation.transferWasRequested()) {
 -                setButtonsForTransferring();
 -                /* TODO WIP COMMENT 
 -                mContainerActivity.onFileStateChanged();    // this is not working; FileDownloader won't do NOTHING at all until this method finishes, so 
 -                                                            // checking the service to see if the file is downloading results in FALSE
 -                 */
 -            } else {
 -                Toast msg = Toast.makeText(getActivity(), R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG); 
 -                msg.show();
 -                if (file.isDown()) {
 -                    setButtonsForDown();
 -                    
 -                } else {
 -                    setButtonsForRemote();
 -                }
 -            }
 -        }
 -    }
 -    
 -
      public void listenForTransferProgress() {
          if (mProgressListener != null) {
              if (mContainerActivity.getFileDownloaderBinder() != null) {
@@@ -29,9 -29,15 +29,9 @@@ import com.owncloud.android.datamodel.O
  import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
  import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 -import com.owncloud.android.lib.common.operations.RemoteOperation;
 -import com.owncloud.android.operations.RemoveFileOperation;
 -import com.owncloud.android.operations.RenameFileOperation;
 -import com.owncloud.android.operations.SynchronizeFileOperation;
 -import com.owncloud.android.ui.activity.FileActivity;
  import com.owncloud.android.ui.ExtendedListView;
 -import com.owncloud.android.ui.activity.TransferServiceGetter;
  import com.owncloud.android.ui.adapter.FileListListAdapter;
 +import com.owncloud.android.ui.activity.FileDisplayActivity;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
  import com.owncloud.android.ui.dialog.EditNameDialog;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
@@@ -45,6 -51,7 +45,6 @@@ import android.app.Activity
  import android.database.Cursor;
  import android.net.Uri;
  import android.os.Bundle;
 -import android.os.Handler;
  import android.support.v4.app.LoaderManager;
  import android.support.v4.app.LoaderManager.LoaderCallbacks;
  import android.support.v4.content.Loader;
@@@ -58,11 -65,8 +58,11 @@@ import android.widget.AdapterView.Adapt
  /**
   * A Fragment that lists all files and folders in a given path.
   * 
 - * @author Bartek Przybylski
 + * TODO refactorize to get rid of direct dependency on FileDisplayActivity
   * 
 + * @author Bartek Przybylski
 + * @author masensio
 + * @author David A. Velasco
   */
  public class OCFileListFragment extends ExtendedListFragment 
          implements EditNameDialogListener, ConfirmationDialogFragmentListener, 
      
      private static final int LOADER_ID = 0;
      
 -    private OCFileListFragment.ContainerActivity mContainerActivity;
 +    private FileFragment.ContainerActivity mContainerActivity;
      
      private OCFile mFile = null;
      private FileListListAdapter mAdapter;
      private LoaderManager mLoaderManager;
      private FileListCursorLoader  mCursorLoader;
      
 -    private Handler mHandler;
      private OCFile mTargetFile;
  
      // Save the state of the scroll in browsing
          super.onAttach(activity);
          Log_OC.e(TAG, "onAttach");
          try {
 -            mContainerActivity = (ContainerActivity) activity;
 +            mContainerActivity = (FileFragment.ContainerActivity) activity;
          } catch (ClassCastException e) {
 -            throw new ClassCastException(activity.toString() + " must implement " + OCFileListFragment.ContainerActivity.class.getSimpleName());
 +            throw new ClassCastException(activity.toString() + " must implement " + 
 +                    FileFragment.ContainerActivity.class.getSimpleName());
          }
      }
  
 +    
 +    @Override
 +    public void onDetach() {
 +        mContainerActivity = null;
 +        super.onDetach();
 +    }
  
      /**
       * {@inheritDoc}
              mIndexes = savedInstanceState.getIntegerArrayList(KEY_INDEXES);
              mFirstPositions = savedInstanceState.getIntegerArrayList(KEY_FIRST_POSITIONS);
              mTops = savedInstanceState.getIntegerArrayList(KEY_TOPS);
-             mHeightCell = savedInstanceState.getInt(KEY_HEIGHT_CELL);
+             onCreateLoader(LOADER_ID, null);
              
          } else {
              mIndexes = new ArrayList<Integer>();
          registerForContextMenu(getListView());
          getListView().setOnCreateContextMenuListener(this);
          
 -        mHandler = new Handler();
 -        
 -
      }
      
      /**
          outState.putIntegerArrayList(KEY_FIRST_POSITIONS, mFirstPositions);
          outState.putIntegerArrayList(KEY_TOPS, mTops);
          outState.putInt(KEY_HEIGHT_CELL, mHeightCell);
+         
      }
      
      /**
          int moveCount = 0;
          
          if(mFile != null){
 -            FileDataStorageManager storageManager = 
 -                    ((FileActivity)getSherlockActivity()).getStorageManager();
 +            FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
              
              String parentPath = null;
              if (mFile.getParentId() != FileDataStorageManager.ROOT_PARENT_ID) {
          if (mFile != null) {
              listDirectory(mFile);
  
 -            mContainerActivity.startSyncFolderOperation(mFile);
 +            ((FileDisplayActivity)mContainerActivity).startSyncFolderOperation(mFile);
              
              // restore index and top position
              restoreIndexAndTopPosition();
      
      @Override
      public void onItemClick(AdapterView<?> l, View v, int position, long id) {
 -        OCFile file = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance(
 +        OCFile file = mContainerActivity.getStorageManager().createFileInstance(
                  (Cursor) mAdapter.getItem(position));
          if (file != null) {
              if (file.isFolder()) { 
              } else { /// Click on a file
                  if (PreviewImageFragment.canBePreviewed(file)) {
                      // preview image - it handles the download, if needed
 -                    mContainerActivity.startImagePreview(file);
 +                    ((FileDisplayActivity)mContainerActivity).startImagePreview(file);
                      
                  } else if (file.isDown()) {
                      if (PreviewMediaFragment.canBePreviewed(file)) {
                          // media preview
 -                        mContainerActivity.startMediaPreview(file, 0, true);
 +                        ((FileDisplayActivity)mContainerActivity).startMediaPreview(file, 0, true);
                      } else {
 -                        FileActivity activity = (FileActivity) getSherlockActivity();
 -                        activity.getFileOperationsHelper().openFile(file, activity);
 +                        ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().openFile(file);
                      }
                      
                  } else {
                      // automatic download, preview on finish
 -                    mContainerActivity.startDownloadForPreview(file);
 +                    ((FileDisplayActivity)mContainerActivity).startDownloadForPreview(file);
                  }
                      
              }
          MenuInflater inflater = getSherlockActivity().getMenuInflater();
          inflater.inflate(R.menu.file_actions_menu, menu);
          AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
 -        OCFile targetFile = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance(
 +        OCFile targetFile = mContainerActivity.getStorageManager().createFileInstance(
                  (Cursor) mAdapter.getItem(info.position));
          List<Integer> toHide = new ArrayList<Integer>();    
          List<Integer> toDisable = new ArrayList<Integer>();  
      @Override
      public boolean onContextItemSelected (MenuItem item) {
          AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();        
 -        mTargetFile = ((FileActivity)getSherlockActivity()).getStorageManager().createFileInstance(
 +        mTargetFile = mContainerActivity.getStorageManager().createFileInstance(
                  (Cursor) mAdapter.getItem(info.position));
          switch (item.getItemId()) {                
              case R.id.action_share_file: {
 -                FileActivity activity = (FileActivity) getSherlockActivity();
 -                activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity);
 +                mContainerActivity.getFileOperationsHelper().shareFileWithLink(mTargetFile);
                  return true;
              }
              case R.id.action_unshare_file: {
 -                FileActivity activity = (FileActivity) getSherlockActivity();
 -                activity.getFileOperationsHelper().unshareFileWithLink(mTargetFile, activity);
 +                mContainerActivity.getFileOperationsHelper().unshareFileWithLink(mTargetFile);
                  return true;
              }
              case R.id.action_rename_file: {
                  return true;
              }
              case R.id.action_sync_file: {
 -                Account account = AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity());
 -                RemoteOperation operation = new SynchronizeFileOperation(
 -                        mTargetFile, 
 -                        null, 
 -                        ((FileActivity)getSherlockActivity()).getStorageManager(), 
 -                        account, 
 -                        true, 
 -                        getSherlockActivity());
 -                operation.execute(account, getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
 -                ((FileActivity) getSherlockActivity()).showLoadingDialog();
 +                mContainerActivity.getFileOperationsHelper().syncFile(mTargetFile);
                  return true;
              }
              case R.id.action_cancel_download: {
                  return true;
              }
              case R.id.action_see_details: {
 -                ((FileFragment.ContainerActivity)getSherlockActivity()).showDetails(mTargetFile);
 +                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");
 -                    mContainerActivity.startDownloadForSending(mTargetFile);
 +                    ((FileDisplayActivity)mContainerActivity).startDownloadForSending(mTargetFile);
                      
                  } else {
 -                
 -                    FileActivity activity = (FileActivity) getSherlockActivity();
 -                    activity.getFileOperationsHelper().sendDownloadedFile(mTargetFile, activity);
 +                    ((FileDisplayActivity)mContainerActivity).getFileOperationsHelper().sendDownloadedFile(mTargetFile);
                  }
                  return true;
              }
       * @param directory File to be listed
       */
      public void listDirectory(OCFile directory) {
 -        FileDataStorageManager storageManager = ((FileActivity)getSherlockActivity()).getStorageManager();
 +        FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
          if (storageManager != null) {
  
              // Check input parameters for null
          if (storageManager != null) {
              mAdapter.setStorageManager(storageManager);
              mCursorLoader.setParentId(parentId);
+             mCursorLoader.setStorageManager(storageManager);
              newCursor = mCursorLoader.loadInBackground();//storageManager.getContent(folder.getFileId());
              Uri uri = Uri.withAppendedPath(
                      ProviderTableMeta.CONTENT_URI_DIR, 
      }
      
      
 -    /**
 -     * Interface to implement by any Activity that includes some instance of FileListFragment
 -     * 
 -     * @author David A. Velasco
 -     */
 -    public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener {
 -
 -        /**
 -         * Callback method invoked when a the user browsed into a different folder through the list of files
 -         *  
 -         * @param file
 -         */
 -        public void onBrowsedDownTo(OCFile folder);
 -
 -        public void startDownloadForPreview(OCFile file);
 -
 -        public void startMediaPreview(OCFile file, int i, boolean b);
 -
 -        public void startImagePreview(OCFile file);
 -        
 -        public void startSyncFolderOperation(OCFile folder);
 -
 -        /**
 -         * Callback method invoked when a the 'transfer state' of a file changes.
 -         * 
 -         * This happens when a download or upload is started or ended for a file.
 -         * 
 -         * This method is necessary by now to update the user interface of the double-pane layout in tablets
 -         * because methods {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and {@link FileUploaderBinder#isUploading(Account, OCFile)}
 -         * won't provide the needed response before the method where this is called finishes. 
 -         * 
 -         * TODO Remove this when the transfer state of a file is kept in the database (other thing TODO)
 -         * 
 -         * @param file          OCFile which state changed.
 -         * @param downloading   Flag signaling if the file is now downloading.
 -         * @param uploading     Flag signaling if the file is now uploading.
 -         */
 -        public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading);
 -
 -        public void startDownloadForSending(OCFile file);
 -        
 -    }
 -    
 -    
      @Override
      public void onDismiss(EditNameDialog dialog) {
          if (dialog.getResult()) {
              String newFilename = dialog.getNewFilename();
              Log_OC.d(TAG, "name edit dialog dismissed with new name " + newFilename);
 -            RemoteOperation operation = 
 -                    new RenameFileOperation(
 -                            mTargetFile, 
 -                            AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), 
 -                            newFilename, 
 -                            ((FileActivity)getSherlockActivity()).getStorageManager());
 -            operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
 -            ((FileActivity) getSherlockActivity()).showLoadingDialog();
 +            mContainerActivity.getFileOperationsHelper().renameFile(mTargetFile, newFilename);
          }
      }
  
      @Override
      public void onConfirmation(String callerTag) {
          if (callerTag.equals(FileDetailFragment.FTAG_CONFIRMATION)) {
 -            FileDataStorageManager storageManager = 
 -                    ((FileActivity)getSherlockActivity()).getStorageManager();
 +            FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
              if (storageManager.getFileById(mTargetFile.getFileId()) != null) {
 -                RemoteOperation operation = new RemoveFileOperation( mTargetFile, 
 -                                                                    true, 
 -                                                                    storageManager);
 -                operation.execute(AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity()), getSherlockActivity(), mContainerActivity, mHandler, getSherlockActivity());
 -                
 -                ((FileActivity) getSherlockActivity()).showLoadingDialog();
 +                mContainerActivity.getFileOperationsHelper().removeFile(mTargetFile, true);
              }
          }
      }
      
      @Override
      public void onNeutral(String callerTag) {
 -        ((FileActivity)getSherlockActivity()).getStorageManager().removeFile(mTargetFile, false, true);    // TODO perform in background task / new thread
 +        mContainerActivity.getStorageManager().removeFile(mTargetFile, false, true);    // TODO perform in background task / new thread
          listDirectory();
          mContainerActivity.onTransferStateChanged(mTargetFile, false, false);
      }
      @Override
      public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
          Log_OC.d(TAG, "onCreateLoader start");
 -        mCursorLoader = new FileListCursorLoader((FileActivity)getSherlockActivity(), 
 -                ((FileActivity)getSherlockActivity()).getStorageManager());
 +        mCursorLoader = new FileListCursorLoader(
 +                getSherlockActivity(), 
 +                mContainerActivity.getStorageManager());
          if (mFile != null) {
              mCursorLoader.setParentId(mFile.getFileId());
          } else {
      public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
          Log_OC.d(TAG, "onLoadFinished start");
          
 -        FileDataStorageManager storageManager = ((FileActivity)getSherlockActivity()).getStorageManager();
 +        FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
          if (storageManager != null)  {
              mCursorLoader.setStorageManager(storageManager);
              if (mFile != null) {
@@@ -1,5 -1,5 +1,5 @@@
  /* ownCloud Android client application
-  *   Copyright (C) 2012-2013 ownCloud Inc. 
+  *   Copyright (C) 2012-2014 ownCloud Inc. 
   *
   *   This program is free software: you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License version 2,
@@@ -24,21 -24,27 +24,21 @@@ import java.util.List
  import android.accounts.Account;
  import android.annotation.SuppressLint;
  import android.app.Activity;
 -import android.content.ActivityNotFoundException;
 -import android.content.Intent;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.graphics.BitmapFactory.Options;
  import android.graphics.Point;
 -import android.net.Uri;
  import android.os.AsyncTask;
  import android.os.Bundle;
 -import android.os.Handler;
  import android.support.v4.app.FragmentStatePagerAdapter;
  import android.view.Display;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.View.OnTouchListener;
  import android.view.ViewGroup;
 -import android.webkit.MimeTypeMap;
  import android.widget.ImageView;
  import android.widget.ProgressBar;
  import android.widget.TextView;
 -import android.widget.Toast;
  
  import com.actionbarsherlock.view.Menu;
  import com.actionbarsherlock.view.MenuInflater;
@@@ -46,6 -52,12 +46,6 @@@ import com.actionbarsherlock.view.MenuI
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.lib.common.network.WebdavUtils;
 -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 -import com.owncloud.android.lib.common.operations.RemoteOperation;
 -import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 -import com.owncloud.android.operations.RemoveFileOperation;
 -import com.owncloud.android.ui.activity.FileActivity;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
  import com.owncloud.android.ui.fragment.FileFragment;
  import com.owncloud.android.utils.Log_OC;
@@@ -60,8 -72,8 +60,8 @@@
   * 
   * @author David A. Velasco
   */
 -public class PreviewImageFragment extends FileFragment implements   OnRemoteOperationListener, 
 -                                                                        ConfirmationDialogFragment.ConfirmationDialogFragmentListener {
 +public class PreviewImageFragment extends FileFragment implements 
 +ConfirmationDialogFragment.ConfirmationDialogFragmentListener {
      public static final String EXTRA_FILE = "FILE";
      public static final String EXTRA_ACCOUNT = "ACCOUNT";
  
  
      public Bitmap mBitmap = null;
      
 -    private Handler mHandler;
 -    private RemoteOperation mLastRemoteOperation;
 -    
      private static final String TAG = PreviewImageFragment.class.getSimpleName();
  
      private boolean mIgnoreFirstSavedState;
  
 +    private FileFragment.ContainerActivity mContainerActivity;
 +
      
      /**
       * Creates a fragment to preview an image.
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
 -        mHandler = new Handler();
          setHasOptionsMenu(true);
      }
      
          mView = inflater.inflate(R.layout.preview_image_fragment, container, false);
          mImageView = (ImageView)mView.findViewById(R.id.image);
          mImageView.setVisibility(View.GONE);
 -        mView.setOnTouchListener((OnTouchListener)getActivity());   // WATCH OUT THAT CAST
 +        mView.setOnTouchListener((OnTouchListener)getActivity());
          mMessageView = (TextView)mView.findViewById(R.id.message);
          mMessageView.setVisibility(View.GONE);
          mProgressWheel = (ProgressBar)mView.findViewById(R.id.progressWheel);
      @Override
      public void onAttach(Activity activity) {
          super.onAttach(activity);
 -        if (!(activity instanceof FileFragment.ContainerActivity))
 -            throw new ClassCastException(activity.toString() + " must implement " + FileFragment.ContainerActivity.class.getSimpleName());
 +        if (!(activity instanceof OnTouchListener)) {
 +            throw new ClassCastException(activity.toString() + 
 +                    " must implement " + OnTouchListener.class.getSimpleName());
 +        }
      }
      
      
          if (savedInstanceState != null) {
              if (!mIgnoreFirstSavedState) {
                  OCFile file = (OCFile)savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_FILE);
+                 setFile(file);
                  mAccount = savedInstanceState.getParcelable(PreviewImageFragment.EXTRA_ACCOUNT);
-                 
-                 // Update the file
-                 if (mAccount!= null) {
-                     OCFile updatedFile = mContainerActivity.getStorageManager().getFileByPath(file.getRemotePath());
-                     if (updatedFile != null) {
-                         setFile(updatedFile);
-                     } else {
-                         setFile(file);
-                     }
-                 } else {
-                     setFile(file);
-                 }
+ // TODO remove this code: update file no needed               
+ //                // Update the file
+ ////                if (mAccount!= null) {
 -//                    OCFile updatedFile = ((FileActivity)getSherlockActivity()).
 -//                            getStorageManager().getFileByPath(file.getRemotePath());
++//                    OCFile updatedFile = 
++//                      mContainerActivity.getStorageManager().getFileByPath(file.getRemotePath());
+ //                    if (updatedFile != null) {
+ //                        setFile(updatedFile);
+ //                    } else {
+ //                        setFile(file);
+ //                    }
+ //                } else {
+ //                    setFile(file);
+ //                }
  
              } else {
                  mIgnoreFirstSavedState = false;
          
          MenuItem item = menu.findItem(R.id.action_unshare_file);
          // Options shareLink
 -        OCFile file = ((FileActivity) getSherlockActivity()).getFile();
 -        if (!file.isShareByLink()) {
 +        if (!getFile().isShareByLink()) {
              item.setVisible(false);
              item.setEnabled(false);
          } else {
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.action_share_file: {
 -                FileActivity act = (FileActivity)getSherlockActivity();
 -                act.getFileOperationsHelper().shareFileWithLink(getFile(), act);
 +                mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile());
                  return true;
              }
              case R.id.action_unshare_file: {
 -                FileActivity act = (FileActivity)getSherlockActivity();
 -                act.getFileOperationsHelper().unshareFileWithLink(getFile(), act);
 +                mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile());
                  return true;
              }
              case R.id.action_open_file_with: {
                  return true;
              }
              case R.id.action_send_file: {
 -                FileActivity act = (FileActivity)getSherlockActivity();
 -                act.getFileOperationsHelper().sendDownloadedFile(getFile(), act);
 +                mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
                  return true;
              }
              
      
  
      private void seeDetails() {
 -        ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());        
 +        mContainerActivity.showDetails(getFile());        
      }
  
  
      
      /**
       * Opens the previewed image with an external application.
 -     * 
 -     * TODO - improve this; instead of prioritize the actions available for the MIME type in the server, 
 -     * we should get a list of available apps for MIME tpye in the server and join it with the list of 
 -     * available apps for the MIME type known from the file extension, to let the user choose
       */
      private void openFile() {
 -        OCFile file = getFile();
 -        String storagePath = file.getStoragePath();
 -        String encodedStoragePath = WebdavUtils.encodePath(storagePath);
 -        try {
 -            Intent i = new Intent(Intent.ACTION_VIEW);
 -            i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
 -            i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 -            startActivity(i);
 -            
 -        } catch (Throwable t) {
 -            Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + file.getMimetype());
 -            boolean toastIt = true; 
 -            String mimeType = "";
 -            try {
 -                Intent i = new Intent(Intent.ACTION_VIEW);
 -                mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
 -                if (mimeType == null || !mimeType.equals(file.getMimetype())) {
 -                    if (mimeType != null) {
 -                        i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), mimeType);
 -                    } else {
 -                        // desperate try
 -                        i.setDataAndType(Uri.parse("file://"+ encodedStoragePath), "*-/*");
 -                    }
 -                    i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 -                    startActivity(i);
 -                    toastIt = false;
 -                }
 -                
 -            } catch (IndexOutOfBoundsException e) {
 -                Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);
 -                
 -            } catch (ActivityNotFoundException e) {
 -                Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");
 -                
 -            } catch (Throwable th) {
 -                Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th);
 -                
 -            } finally {
 -                if (toastIt) {
 -                    Toast.makeText(getActivity(), "There is no application to handle file " + file.getFileName(), Toast.LENGTH_SHORT).show();
 -                }
 -            }
 -            
 -        }
 +        mContainerActivity.getFileOperationsHelper().openFile(getFile());
          finish();
      }
      
       */
      @Override
      public void onConfirmation(String callerTag) {
 -        FileDataStorageManager storageManager = 
 -                ((FileActivity)getSherlockActivity()).getStorageManager();
 +        FileDataStorageManager storageManager = mContainerActivity.getStorageManager();
          if (storageManager.getFileById(getFile().getFileId()) != null) {   // check that the file is still there;
 -            mLastRemoteOperation = new RemoveFileOperation( getFile(),      // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
 -                                                            true, 
 -                                                            storageManager);
 -            mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity());
 -            
 -            ((FileActivity) getActivity()).showLoadingDialog();
 +            mContainerActivity.getFileOperationsHelper().removeFile(getFile(), true);
          }
      }
      
      @Override
      public void onNeutral(String callerTag) {
          OCFile file = getFile();
 -        ((FileActivity)getSherlockActivity()).getStorageManager().removeFile(file, false, true);    // TODO perform in background task / new thread
 +        mContainerActivity.getStorageManager().removeFile(file, false, true);    // TODO perform in background task / new thread
          finish();
      }
      
  
      
      /**
 -     * {@inheritDoc}
 -     */
 -    @Override
 -    public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
 -        if (operation.equals(mLastRemoteOperation) && operation instanceof RemoveFileOperation) {
 -            onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
 -        }
 -    }
 -    
 -    private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
 -        ((FileActivity) getActivity()).dismissLoadingDialog();
 -        
 -        if (result.isSuccess()) {
 -            Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
 -            msg.show();
 -            finish();
 -                
 -        } else {
 -            Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); 
 -            msg.show();
 -            if (result.isSslRecoverableException()) {
 -                // TODO show the SSL warning dialog
 -            }
 -        }
 -    }
 -
 -    /**
       * Finishes the preview
       */
      private void finish() {