Merge branch 'share_link__new_share' into share_link__unshare_file
authormasensio <masensio@solidgear.es>
Wed, 5 Feb 2014 10:25:39 +0000 (11:25 +0100)
committermasensio <masensio@solidgear.es>
Wed, 5 Feb 2014 10:25:39 +0000 (11:25 +0100)
1  2 
res/values/strings.xml
src/com/owncloud/android/datamodel/FileDataStorageManager.java
src/com/owncloud/android/files/FileOperationsHelper.java
src/com/owncloud/android/operations/GetSharesOperation.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java
src/com/owncloud/android/ui/preview/PreviewImageFragment.java
src/com/owncloud/android/ui/preview/PreviewMediaFragment.java

diff --combined res/values/strings.xml
@@@ -60,7 -60,6 +60,7 @@@
      <string name="filedetails_sync_file">Refresh file</string>
      <string name="filedetails_renamed_in_upload_msg">File was renamed to %1$s during upload</string>
      <string name="action_share_file">Share link</string>
 +    <string name="action_unshare_file">Unshare link</string>
      <string name="common_yes">Yes</string>
      <string name="common_no">No</string>
      <string name="common_ok">OK</string>
      <string name="wait_a_moment">Wait a moment</string>
      <string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>
      <string name="filedisplay_no_file_selected">No file was selected</string>
+     <string name="activity_chooser_title">Send link to &#8230;</string>
      
      <string name="oauth_check_onoff">Login with oAuth2</string> 
      <string name="oauth_login_connection">Connecting to oAuth2 server…</string>    
        
        <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your administrator.</string>
        <string name="share_link_file_no_exist">Unable to share this file or folder. Please, make sure it exists</string>
+       <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
  </resources>
@@@ -29,6 -29,7 +29,7 @@@ import com.owncloud.android.MainApp
  import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
  import com.owncloud.android.lib.operations.common.OCShare;
  import com.owncloud.android.lib.operations.common.ShareType;
+ import com.owncloud.android.lib.utils.FileUtils;
  import com.owncloud.android.utils.FileStorageUtils;
  import com.owncloud.android.utils.Log_OC;
  
@@@ -1099,19 -1100,30 +1100,44 @@@ public class FileDataStorageManager 
          }
          
      } 
 -
 -
 +    
 +    public void removeShare(OCShare share){
 +        Uri share_uri = ProviderTableMeta.CONTENT_URI_SHARE;
 +        String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
 +        String [] whereArgs = new String[]{mAccount.name, share.getPath()};
 +        if (getContentProviderClient() != null) {
 +            try {
 +                getContentProviderClient().delete(share_uri, where, whereArgs);
 +            } catch (RemoteException e) {
 +                e.printStackTrace();
 +            }
 +        } else {
 +            getContentResolver().delete(share_uri, where, whereArgs); 
 +        }
 +    }
++    
+     public void saveSharesDB(ArrayList<OCShare> shares) {
+         saveShares(shares);
+         ArrayList<OCFile> sharedFiles = new ArrayList<OCFile>();
+         for (OCShare share : shares) {
+             // Get the path
+             String path = share.getPath();
+             if (share.isDirectory()) {
+                 path = path + FileUtils.PATH_SEPARATOR;
+             }           
+             // Update OCFile with data from share: ShareByLink  ¿and publicLink?
+             OCFile file = getFileByPath(path);
+             if (file != null) {
+                 if (share.getShareType().equals(ShareType.PUBLIC_LINK)) {
+                     file.setShareByLink(true);
+                     sharedFiles.add(file);
+                 }
+             } 
+         }
+         
+         updateSharedFiles(sharedFiles);
+     }
  }
index 0000000,ab8395c..1c0db87
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,143 +1,165 @@@
+ /* ownCloud Android client application
+  *   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,
+  *   as published by the Free Software Foundation.
+  *
+  *   This program is distributed in the hope that it will be useful,
+  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *   GNU General Public License for more details.
+  *
+  *   You should have received a copy of the GNU General Public License
+  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  *
+  */
+ package com.owncloud.android.files;
+ import org.apache.http.protocol.HTTP;
+ import android.accounts.AccountManager;
+ import android.content.Intent;
+ import android.net.Uri;
+ import android.support.v4.app.DialogFragment;
+ import android.webkit.MimeTypeMap;
+ import android.widget.Toast;
+ import com.owncloud.android.R;
+ import com.owncloud.android.datamodel.OCFile;
+ import com.owncloud.android.lib.accounts.OwnCloudAccount;
+ import com.owncloud.android.lib.network.webdav.WebdavUtils;
+ import com.owncloud.android.lib.operations.common.ShareType;
+ import com.owncloud.android.operations.CreateShareOperation;
++import com.owncloud.android.operations.UnshareLinkOperation;
+ import com.owncloud.android.ui.activity.FileActivity;
+ import com.owncloud.android.ui.dialog.ActivityChooserDialog;
+ import com.owncloud.android.utils.Log_OC;
+ /**
+  * 
+  * @author masensio
+  * @author David A. Velasco
+  */
+ public class FileOperationsHelper {
+     private static final String TAG = FileOperationsHelper.class.getName();
+     
+     private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; 
+     
+     public void openFile(OCFile file, FileActivity callerActivity) {
+         if (file != null) {
+             String storagePath = file.getStoragePath();
+             String encodedStoragePath = WebdavUtils.encodePath(storagePath);
+             
+             Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
+             intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
+             intentForSavedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+             
+             Intent intentForGuessedMimeType = null;
+             if (storagePath.lastIndexOf('.') >= 0) {
+                 String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));
+                 if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
+                     intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
+                     intentForGuessedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), guessedMimeType);
+                     intentForGuessedMimeType.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+                 }
+             }
+             
+             Intent chooserIntent = null;
+             if (intentForGuessedMimeType != null) {
+                 chooserIntent = Intent.createChooser(intentForGuessedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+             } else {
+                 chooserIntent = Intent.createChooser(intentForSavedMimeType, callerActivity.getString(R.string.actionbar_open_with));
+             }
+             
+             callerActivity.startActivity(chooserIntent);
+             
+         } else {
+             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+         }
+     }
+     
+     public void shareFileWithLink(OCFile file, FileActivity callerActivity) {
+         
+         if (isSharedSupported(callerActivity)) {
+             if (file != null) {
+                 String link = "https://fake.url";
+                 Intent intent = createShareWithLinkIntent(link);
+                 String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
+                 DialogFragment chooserDialog = ActivityChooserDialog.newInstance(intent, packagesToExclude, file);
+                 chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
+                 
+             } else {
+                 Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
+             }
+             
+         } else {
+             // Show a Message
+             Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
+             t.show();
+         }
+     }
+     
+     
+     public void shareFileWithLinkToApp(OCFile file, Intent sendIntent, FileActivity callerActivity) {
+         
+         if (file != null) {
+             callerActivity.showLoadingDialog();
+             CreateShareOperation createShare = new CreateShareOperation(file.getRemotePath(), ShareType.PUBLIC_LINK, "", false, "", 1, sendIntent);
+             createShare.execute(callerActivity.getStorageManager(), 
+                                 callerActivity, 
+                                 callerActivity.getRemoteOperationListener(), 
+                                 callerActivity.getHandler(), 
+                                 callerActivity);
+             
+         } else {
+             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
+         }
+     }
+     
+     
+     private Intent createShareWithLinkIntent(String link) {
+         Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
+         intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
+         intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
+         return intentToShareLink; 
+     }
+     
+     
+     /**
+      *  @return 'True' if the server supports the Share API
+      */
+     public boolean isSharedSupported(FileActivity callerActivity) {
+         if (callerActivity.getAccount() != null) {
+             AccountManager accountManager = AccountManager.get(callerActivity);
+             return Boolean.parseBoolean(accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API));
+         }
+         return false;
+     }
++    
++    public void unshareFileWithLink(OCFile file, FileActivity callerActivity) {
++        
++        if (isSharedSupported(callerActivity)) {
++            // Unshare the file
++            UnshareLinkOperation unshare = new UnshareLinkOperation(file);
++            unshare.execute(callerActivity.getStorageManager(), 
++                    callerActivity, 
++                    callerActivity.getRemoteOperationListener(), 
++                    callerActivity.getHandler(), 
++                    callerActivity);
++         
++            callerActivity.showLoadingDialog();
++            
++        } else {
++            // Show a Message
++            Toast t = Toast.makeText(callerActivity, callerActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
++            t.show();
++            
++        }
++    }
+ }
@@@ -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,
@@@ -19,13 -19,10 +19,10 @@@ package com.owncloud.android.operations
  
  import java.util.ArrayList;
  
- import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.lib.network.OwnCloudClient;
  import com.owncloud.android.lib.operations.common.RemoteOperationResult;
  import com.owncloud.android.lib.operations.common.OCShare;
- import com.owncloud.android.lib.operations.common.ShareType;
  import com.owncloud.android.lib.operations.remote.GetRemoteSharesOperation;
- import com.owncloud.android.lib.utils.FileUtils;
  import com.owncloud.android.operations.common.SyncOperation;
  import com.owncloud.android.utils.Log_OC;
  
@@@ -55,36 -52,10 +52,10 @@@ public class GetSharesOperation extend
                  shares.add((OCShare) obj);
              }
  
-             saveSharesDB(shares);
+             getStorageManager().saveSharesDB(shares);
          }
  
          return result;
      }
  
-     private void saveSharesDB(ArrayList<OCShare> shares) {
-         // Save share file
-         getStorageManager().saveShares(shares);
-         ArrayList<OCFile> sharedFiles = new ArrayList<OCFile>();
-         for (OCShare share : shares) {
-             // Get the path
-             String path = share.getPath();
-             if (share.isDirectory()) {
-                 path = path + FileUtils.PATH_SEPARATOR;
-             }           
-             // Update OCFile with data from share: ShareByLink  ¿and publicLink?
-             OCFile file = getStorageManager().getFileByPath(path);
-             if (file != null) {
-                 if (share.getShareType().equals(ShareType.PUBLIC_LINK)) {
-                     file.setShareByLink(true);
-                     sharedFiles.add(file);
-                 }
-             } 
-         }
-         
-         getStorageManager().updateSharedFiles(sharedFiles);
-     }
  }
@@@ -38,12 -38,10 +38,10 @@@ import android.content.res.Resources.No
  import android.database.Cursor;
  import android.net.Uri;
  import android.os.Bundle;
- import android.os.Handler;
  import android.os.IBinder;
  import android.preference.PreferenceManager;
  import android.provider.MediaStore;
  import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
  import android.support.v4.app.FragmentTransaction;
  import android.support.v4.content.LocalBroadcastManager;
  import android.util.Log;
@@@ -61,7 -59,6 +59,6 @@@ import com.actionbarsherlock.view.MenuI
  import com.actionbarsherlock.view.Window;
  import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
- import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.files.services.FileDownloader;
  import com.owncloud.android.files.services.FileObserverService;
@@@ -70,21 -67,18 +67,19 @@@ import com.owncloud.android.files.servi
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
  import com.owncloud.android.operations.CreateFolderOperation;
  
- import com.owncloud.android.lib.operations.common.OnRemoteOperationListener;
  import com.owncloud.android.lib.operations.common.RemoteOperation;
  import com.owncloud.android.lib.operations.common.RemoteOperationResult;
  import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
+ import com.owncloud.android.operations.CreateShareOperation;
  import com.owncloud.android.operations.RemoveFileOperation;
  import com.owncloud.android.operations.RenameFileOperation;
  import com.owncloud.android.operations.SynchronizeFileOperation;
  import com.owncloud.android.operations.SynchronizeFolderOperation;
 +import com.owncloud.android.operations.UnshareLinkOperation;
  import com.owncloud.android.services.OperationsService;
  import com.owncloud.android.syncadapter.FileSyncAdapter;
  import com.owncloud.android.ui.dialog.EditNameDialog;
  import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener;
- import com.owncloud.android.ui.dialog.LoadingDialog;
  import com.owncloud.android.ui.dialog.SslValidatorDialog;
  import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;
  import com.owncloud.android.ui.fragment.FileDetailFragment;
@@@ -105,13 -99,10 +100,10 @@@ import com.owncloud.android.utils.Log_O
   */
  
  public class FileDisplayActivity extends FileActivity implements
- OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, OnRemoteOperationListener, EditNameDialogListener {
+ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, EditNameDialogListener {
  
      private ArrayAdapter<String> mDirectories;
  
-     /** Access point to the cached database for the current ownCloud {@link Account} */
-     private FileDataStorageManager mStorageManager = null;
      private SyncBroadcastReceiver mSyncBroadcastReceiver;
      private UploadFinishReceiver mUploadFinishReceiver;
      private DownloadFinishReceiver mDownloadFinishReceiver;
      private static final int DIALOG_SSL_VALIDATOR = 2;
      private static final int DIALOG_CERT_NOT_SAVED = 3;
      
-     private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
      public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS";
  
      private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1;
      private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
  
      private OCFile mWaitingToPreview;
-     private Handler mHandler;
      
      private boolean mSyncInProgress = false;
      private boolean mRefreshSharesInProgress = false;
  
          super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
  
-         mHandler = new Handler();
-         
          /// bindings to transference services
          mUploadConnection = new ListServiceConnection(); 
          mDownloadConnection = new ListServiceConnection();
       */ 
      @Override
      protected void onAccountSet(boolean stateWasRecovered) {
+         super.onAccountSet(stateWasRecovered);
          if (getAccount() != null) {
-             mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
-                 
              /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
              OCFile file = getFile();
              // get parent from path
                      // upload in progress - right now, files are not inserted in the local cache until the upload is successful
                      // get parent from path
                      parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
-                     if (mStorageManager.getFileByPath(parentPath) ==  null)
+                     if (getStorageManager().getFileByPath(parentPath) ==  null)
                          file = null; // not able to know the directory where the file is uploading
                  } else {
-                     file = mStorageManager.getFileByPath(file.getRemotePath());   // currentDir = null if not in the current Account
+                     file = getStorageManager().getFileByPath(file.getRemotePath());   // currentDir = null if not in the current Account
                  }
              }
              if (file == null) {
                  // fall back to root folder
-                 file = mStorageManager.getFileByPath(OCFile.ROOT_PATH);  // never returns null
+                 file = getStorageManager().getFileByPath(OCFile.ROOT_PATH);  // never returns null
              }
              setFile(file);
              setNavigationListWithFolder(file);
                  updateFragmentsVisibility(!file.isFolder());
                  updateNavigationElementsInActionBar(file.isFolder() ? null : file);
              }
-             
-             
-         } else {
-             Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
          }
      }
  
              if (fileIt.isFolder()) {
                  mDirectories.add(fileIt.getFileName());
              }
-             //fileIt = mStorageManager.getFileById(fileIt.getParentId());
              // get parent from path
              parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName()));
-             fileIt = mStorageManager.getFileByPath(parentPath);
+             fileIt = getStorageManager().getFileByPath(parentPath);
          }
          mDirectories.add(OCFile.PATH_SEPARATOR);
      }
                  boolean detailsFragmentChanged = false;
                  if (waitedPreview) {
                      if (success) {
-                         mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId());   // update the file from database, for the local storage path
+                         mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId());   // update the file from database, for the local storage path
                          if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
                              startMediaPreview(mWaitingToPreview, 0, true);
                              detailsFragmentChanged = true;
                          } else {
-                             openFile(mWaitingToPreview);
+                             getFileOperationsHelper().openFile(mWaitingToPreview, this);
                          }
                      }
                      mWaitingToPreview = null;
          }
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getSherlock().getMenuInflater();
                  targetPath = mDirectories.getItem(i) + OCFile.PATH_SEPARATOR + targetPath; 
              }
              targetPath = OCFile.PATH_SEPARATOR + targetPath;
-             OCFile targetFolder = mStorageManager.getFileByPath(targetPath);
+             OCFile targetFolder = getStorageManager().getFileByPath(targetPath);
              if (targetFolder != null) {
                  browseTo(targetFolder);
              }
  
  
      /**
-      * Show loading dialog 
-      */
-     public void showLoadingDialog() {
-         // Construct dialog
-         LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment));
-         FragmentManager fm = getSupportFragmentManager();
-         FragmentTransaction ft = fm.beginTransaction();
-         loading.show(ft, DIALOG_WAIT_TAG);
-         
-     }
-     
-     /**
-      * Dismiss loading dialog
-      */
-     public void dismissLoadingDialog(){
-         Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG);
-       if (frag != null) {
-           LoadingDialog loading = (LoadingDialog) frag;
-             loading.dismiss();
-         }
-     }
-     
-     
-     /**
       * Translates a content URI of an image to a physical path
       * on the disk
       * @param uri The URI to resolve
              String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME);
              String synchFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH); 
              RemoteOperationResult synchResult = (RemoteOperationResult)intent.getSerializableExtra(FileSyncAdapter.EXTRA_RESULT);
-             boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && mStorageManager != null); 
+             boolean sameAccount = (getAccount() != null && accountName.equals(getAccount().name) && getStorageManager() != null); 
  
              if (sameAccount) {
                  
                  if (!FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) {
-                     
-                     OCFile currentFile = (getFile() == null) ? null : mStorageManager.getFileByPath(getFile().getRemotePath());
-                     OCFile currentDir = (getCurrentDir() == null) ? null : mStorageManager.getFileByPath(getCurrentDir().getRemotePath());
+                     OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath());
+                     OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().getFileByPath(getCurrentDir().getRemotePath());
  
                      if (currentDir == null) {
                          // current folder was removed from the server 
                          setFile(currentFile);
                      }
                      
-                     mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event));
+                     mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && 
+                                         !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) &&
+                                         (synchResult == null || synchResult.isSuccess())) ;
                      
                      if (synchResult != null && 
                          synchResult.isSuccess() &&
                              (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SYNCED.equals(event) || 
                                  FileSyncAdapter.EVENT_FOLDER_CONTENTS_SYNCED.equals(event)
-                             )
+                             ) &&
+                             !mRefreshSharesInProgress &&
+                             getFileOperationsHelper().isSharedSupported(FileDisplayActivity.this)
                          ) {
                          startGetShares();
                      }
                  Account account = intent.getParcelableExtra(OperationsService.EXTRA_ACCOUNT);
                  RemoteOperationResult getSharesResult = (RemoteOperationResult)intent.getSerializableExtra(OperationsService.EXTRA_RESULT);
                  if (getAccount() != null && account.name.equals(getAccount().name)
-                         && mStorageManager != null
+                         && getStorageManager() != null
                          ) {
                      refeshListOfFilesFragment();
                  }
              
      }
  
-     /**
-      * {@inheritDoc}
-      */
-     @Override
-     public FileDataStorageManager getStorageManager() {
-         return mStorageManager;
-     }
      public void browseToRoot() {
          OCFileListFragment listOfFiles = getListOfFilesFragment(); 
          if (listOfFiles != null) {  // should never be null, indeed
              while (mDirectories.getCount() > 1) {
                  popDirname();
              }
-             OCFile root = mStorageManager.getFileByPath(OCFile.ROOT_PATH);
+             OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
              listOfFiles.listDirectory(root);
              setFile(listOfFiles.getCurrentFile());
              startSyncFolderOperation(root);
       */
      @Override
      public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
+         super.onRemoteOperationFinish(operation, result);
+         
          if (operation instanceof RemoveFileOperation) {
              onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
  
  
          } else if (operation instanceof CreateFolderOperation) {
              onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
 -        
 +            
+         } else if (operation instanceof CreateShareOperation) {
+             onCreateShareOperationFinish((CreateShareOperation) operation, result);
 -        }
++            
 +        } else if (operation instanceof UnshareLinkOperation) {
 +            onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result);
-         }
++        
++        } 
+         
      }
  
 +    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
 +        if (result.getCode() == ResultCode.FILE_NOT_FOUND) {
 +            // Show a Message
 +            Toast t = Toast.makeText(this, getString(R.string.share_link_file_no_exist), Toast.LENGTH_LONG);
 +            t.show();
 +        }
 +
 +        refeshListOfFilesFragment();
 +
 +        dismissLoadingDialog();
 +    }
  
+     private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+         if (result.isSuccess()) {
+             refeshListOfFilesFragment();
+         }
+     }
+     
      /**
       * Updates the view associated to the activity after the finish of an operation trying to remove a 
       * file. 
              if (second != null && removedFile.equals(second.getFile())) {
                  cleanSecondFragment();
              }
-             if (mStorageManager.getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
+             if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
                  refeshListOfFilesFragment();
              }
  
                      ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
                  }
              }
-             if (mStorageManager.getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
+             if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
                  refeshListOfFilesFragment();
              }
  
  
                  // Create directory
                  path += newDirectoryName + OCFile.PATH_SEPARATOR;
-                 RemoteOperation operation = new CreateFolderOperation(path, false, mStorageManager);
+                 RemoteOperation operation = new CreateFolderOperation(path, false, getStorageManager());
                  operation.execute(  getAccount(), 
                          FileDisplayActivity.this, 
                          FileDisplayActivity.this, 
-                         mHandler,
+                         getHandler(),
                          FileDisplayActivity.this);
  
                  showLoadingDialog();
          if (file != null) {
              if (file.isFolder()) {
                  return file;
-             } else if (mStorageManager != null) {
+             } else if (getStorageManager() != null) {
                  String parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName()));
-                 return mStorageManager.getFileByPath(parentPath);
+                 return getStorageManager().getFileByPath(parentPath);
              }
          }
          return null;
          
          mRefreshSharesInProgress = true;
      }
-     public void unshareFileWithLink(OCFile file) {
-         
-         if (isSharedSupported()) {
-             // Unshare the file
-             UnshareLinkOperation unshare = new UnshareLinkOperation(file);
-             unshare.execute(getStorageManager(), this, this, mHandler, this);
-          
-             showLoadingDialog();
-             
-         } else {
-             // Show a Message
-             Toast t = Toast.makeText(this, getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
-             t.show();
-             
-         }
-     }
 +    
 +    
++
  
  }
@@@ -310,12 -310,7 +310,12 @@@ public class FileDetailFragment extend
              toHide.add(R.id.action_remove_file);
              
          }
 -
 +        
 +        // Options shareLink
 +        if (!file.isShareByLink()) {
 +            toHide.add(R.id.action_unshare_file);
 +        }
 +        
          MenuItem item = null;
          for (int i : toHide) {
              item = menu.findItem(i);
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
+             case R.id.action_share_file: {
+                 FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+                 activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+                 return true;
+             }
              case R.id.action_open_file_with: {
-                 mContainerActivity.openFile(getFile());
+                 FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+                 activity.getFileOperationsHelper().openFile(getFile(), activity);
                  return true;
              }
              case R.id.action_remove_file: {
                  return false;
          }
      }
-     
      @Override
      public void onClick(View v) {
          switch (v.getId()) {
          }
      }
  
      private void removeFile() {
          OCFile file = getFile();
          ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
@@@ -25,7 -25,6 +25,6 @@@ import com.owncloud.android.R
  import com.owncloud.android.authentication.AccountUtils;
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
- import com.owncloud.android.files.FileHandler;
  import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
  import com.owncloud.android.lib.operations.common.OnRemoteOperationListener;
@@@ -183,8 -182,8 +182,8 @@@ public class OCFileListFragment extend
                          // media preview
                          mContainerActivity.startMediaPreview(file, 0, true);
                      } else {
-                         // open with
-                         mContainerActivity.openFile(file);
+                         FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+                         activity.getFileOperationsHelper().openFile(file, activity);
                      }
                      
                  } else {
      public boolean onContextItemSelected (MenuItem item) {
          AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();        
          mTargetFile = (OCFile) mAdapter.getItem(info.position);
--        switch (item.getItemId()) {
++        switch (item.getItemId()) {                
+             case R.id.action_share_file: {
+                 FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
+                 activity.getFileOperationsHelper().shareFileWithLink(mTargetFile, activity);
+                 return true;
+             }
 +            case R.id.action_unshare_file: {
-                 mContainerActivity.unshareFileWithLink(mTargetFile);
++                FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
++                activity.getFileOperationsHelper().unshareFileWithLink(mTargetFile, activity);
 +                return true;
 +            }
              case R.id.action_rename_file: {
                  String fileName = mTargetFile.getFileName();
                  int extensionStart = mTargetFile.isFolder() ? -1 : fileName.lastIndexOf(".");
                  return super.onContextItemSelected(item); 
          }
      }
 -    
 +
  
      /**
       * Use this to query the {@link OCFile} that is currently
       * 
       * @author David A. Velasco
       */
-     public interface ContainerActivity extends TransferServiceGetter, OnRemoteOperationListener, FileHandler {
+     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 unshareFileWithLink(OCFile mTargetFile);
 +
          public void startDownloadForPreview(OCFile file);
  
          public void startMediaPreview(OCFile file, int i, boolean b);
@@@ -57,6 -57,7 +57,7 @@@ import com.owncloud.android.lib.operati
  import com.owncloud.android.lib.operations.common.RemoteOperation;
  import com.owncloud.android.lib.operations.common.RemoteOperationResult;
  import com.owncloud.android.operations.RemoveFileOperation;
+ import com.owncloud.android.ui.activity.FileActivity;
  import com.owncloud.android.ui.fragment.ConfirmationDialogFragment;
  import com.owncloud.android.ui.fragment.FileFragment;
  import com.owncloud.android.utils.Log_OC;
@@@ -229,11 -230,6 +230,11 @@@ public class PreviewImageFragment exten
          toHide.add(R.id.action_cancel_upload);
          toHide.add(R.id.action_download_file);
          toHide.add(R.id.action_rename_file);    // by now
 +        
 +        // Options shareLink
 +        if (!getFile().isShareByLink()) {
 +            toHide.add(R.id.action_unshare_file);
 +        }
  
          for (int i : toHide) {
              item = menu.findItem(i);
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
+             case R.id.action_share_file: {
+                 FileActivity act = (FileActivity)getSherlockActivity();
+                 act.getFileOperationsHelper().shareFileWithLink(getFile(), act);
+                 return true;
+             }
              case R.id.action_open_file_with: {
                  openFile();
                  return true;
      }
  
      
 +    /**
 +     * {@inheritDoc}
 +     */
 +    @Override
 +    public void onPrepareOptionsMenu(Menu menu) {
 +        super.onPrepareOptionsMenu(menu);
 +    }
 +
 +
      private void seeDetails() {
          ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());        
      }
@@@ -289,12 -289,7 +289,12 @@@ public class PreviewMediaFragment exten
          toHide.add(R.id.action_download_file);
          toHide.add(R.id.action_sync_file);
          toHide.add(R.id.action_rename_file);    // by now
 -
 +        
 +        // Options shareLink
 +        if (!getFile().isShareByLink()) {
 +            toHide.add(R.id.action_unshare_file);
 +        }
 +        
          for (int i : toHide) {
              item = menu.findItem(i);
              if (item != null) {
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
+             case R.id.action_share_file: {
+                 shareFileWithLink();
+                 return true;
+             }
              case R.id.action_open_file_with: {
                  openFile();
                  return true;
                  return false;
          }
      }
 +    
 +    /**
 +     * {@inheritDoc}
 +     */
 +    @Override
 +    public void onPrepareOptionsMenu(Menu menu) {
 +        super.onPrepareOptionsMenu(menu);
 +    }
  
      
+     private void shareFileWithLink() {
+         stopPreview(false);
+         FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
+         activity.getFileOperationsHelper().shareFileWithLink(getFile(), activity);
+         
+     }
      private void seeDetails() {
          stopPreview(false);
          ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());