Merge remote-tracking branch 'remotes/upstream/switchListVsGrid' into beta
authortobiasKaminsky <tobias@kaminsky.me>
Fri, 13 Nov 2015 16:42:02 +0000 (17:42 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Fri, 13 Nov 2015 16:42:02 +0000 (17:42 +0100)
1  2 
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.java
src/com/owncloud/android/ui/preview/PreviewTextFragment.java

@@@ -26,7 -26,6 +26,7 @@@ import android.accounts.Account
  import android.accounts.AccountManager;
  import android.accounts.AuthenticatorException;
  import android.annotation.TargetApi;
 +import android.os.Parcelable;
  import android.support.v7.app.AlertDialog;
  import android.content.BroadcastReceiver;
  import android.content.ComponentName;
@@@ -80,14 -79,13 +80,14 @@@ import com.owncloud.android.lib.common.
  import com.owncloud.android.lib.common.utils.Log_OC;
  import com.owncloud.android.operations.CopyFileOperation;
  import com.owncloud.android.operations.CreateFolderOperation;
 -import com.owncloud.android.operations.CreateShareOperation;
 +import com.owncloud.android.operations.CreateShareViaLinkOperation;
 +import com.owncloud.android.operations.CreateShareWithShareeOperation;
  import com.owncloud.android.operations.MoveFileOperation;
  import com.owncloud.android.operations.RefreshFolderOperation;
  import com.owncloud.android.operations.RemoveFileOperation;
  import com.owncloud.android.operations.RenameFileOperation;
  import com.owncloud.android.operations.SynchronizeFileOperation;
 -import com.owncloud.android.operations.UnshareLinkOperation;
 +import com.owncloud.android.operations.UnshareOperation;
  import com.owncloud.android.services.observer.FileObserverService;
  import com.owncloud.android.syncadapter.FileSyncAdapter;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@@ -109,8 -107,6 +109,8 @@@ import com.owncloud.android.utils.FileS
  import com.owncloud.android.utils.UriUtils;
  
  import java.io.File;
 +import java.util.ArrayList;
 +import java.util.Iterator;
  
  /**
   * Displays, what files the user has available in his ownCloud.
@@@ -120,6 -116,8 +120,6 @@@ public class FileDisplayActivity extend
          implements FileFragment.ContainerActivity,
          OnSslUntrustedCertListener, OnEnforceableRefreshListener {
  
 -
 -
      private SyncBroadcastReceiver mSyncBroadcastReceiver;
      private UploadFinishReceiver mUploadFinishReceiver;
      private DownloadFinishReceiver mDownloadFinishReceiver;
      private boolean mSyncInProgress = false;
  
      private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT";
 -    private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
 +    public static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER";
      private static String DIALOG_UPLOAD_SOURCE = "DIALOG_UPLOAD_SOURCE";
      private static String DIALOG_CERT_NOT_SAVED = "DIALOG_CERT_NOT_SAVED";
  
      }
  
      @Override
 +    protected void onStop() {
 +        Log_OC.v(TAG, "onStop() start");
 +        super.onStop();
 +        Log_OC.v(TAG, "onStop() end");
 +    }
 +
 +    @Override
      protected void onDestroy() {
          Log_OC.v(TAG, "onDestroy() start");
          super.onDestroy();
              setFile(file);
  
              if (mAccountWasSet) {
 -                RelativeLayout navigationDrawerLayout = (RelativeLayout) findViewById(R.id.left_drawer);
 -                if (navigationDrawerLayout != null && getAccount() != null) {
 -                    TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
 -                    int lastAtPos = getAccount().name.lastIndexOf("@");
 -                    username.setText(getAccount().name.substring(0, lastAtPos));
 -                }
 +                setUsernameInDrawer((RelativeLayout) findViewById(R.id.left_drawer), getAccount());
              }
  
              if (!stateWasRecovered) {
              /// First fragment
              OCFileListFragment listOfFiles = getListOfFilesFragment();
              if (listOfFiles != null) {
 -                listOfFiles.listDirectory(getCurrentDir());
 -                // TODO Enable when "On Device" is recovered
 -                // listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
 -
 +                listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
              } else {
                  Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
              }
                      startTextPreview(file);
              }
  
-             if (DisplayUtils.isGridView(getFile(), getStorageManager())){
-                 switchToGridView();
-             } else {
-                 switchToListView();
-             }
+             switchLayout(getFile());
  
          } else {
              Log_OC.wtf(TAG, "initFragments() called with invalid NULLs!");
          }
      }
  
+     private void switchLayout(OCFile file){
+         if (DisplayUtils.isGridView(file, getStorageManager())){
+             switchToGridView();
+         } else {
+             switchToListView();
+         }
+     }
      private Fragment chooseInitialSecondFragment(OCFile file) {
          Fragment secondFragment = null;
          if (file != null && !file.isFolder()) {
      protected void refreshListOfFilesFragment() {
          OCFileListFragment fileListFragment = getListOfFilesFragment();
          if (fileListFragment != null) {
 -            fileListFragment.listDirectory();
 -            // TODO Enable when "On Device" is recovered ?
 -            // fileListFragment.listDirectory(MainApp.getOnlyOnDevice());
 +            fileListFragment.listDirectory(MainApp.getOnlyOnDevice());
          }
      }
  
      @Override
      public boolean onPrepareOptionsMenu(Menu menu) {
          boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START);
 -        menu.findItem(R.id.action_upload).setVisible(!drawerOpen);
 -        menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen);
          menu.findItem(R.id.action_sort).setVisible(!drawerOpen);
          menu.findItem(R.id.action_sync_account).setVisible(!drawerOpen);
          menu.findItem(R.id.action_switch_view).setVisible(!drawerOpen);
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.main_menu, menu);
 +        menu.findItem(R.id.action_create_dir).setVisible(false);
          mOptionsMenu = menu;
  
          MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view);
      public boolean onOptionsItemSelected(MenuItem item) {
          boolean retval = true;
          switch (item.getItemId()) {
 -            case R.id.action_create_dir: {
 -                CreateFolderDialogFragment dialog =
 -                        CreateFolderDialogFragment.newInstance(getCurrentDir());
 -                dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER);
 -                break;
 -            }
 -
              case R.id.action_sync_account: {
                  startSynchronization();
                  break;
              }
 -            case R.id.action_upload: {
 -                UploadSourceDialogFragment dialog =
 -                        UploadSourceDialogFragment.newInstance(getAccount());
 -                dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE);
 -                break;
 -            }
              case android.R.id.home: {
                  FileFragment second = getSecondFragment();
                  OCFile currentDir = getCurrentDir();
          return retval;
      }
  
 +    public void createFolder() {
 +        CreateFolderDialogFragment dialog =
 +                CreateFolderDialogFragment.newInstance(getCurrentDir());
 +        dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER);
 +    }
 +
 +    public void uploadLocalFilesSelected() {
 +        Intent action = new Intent(this, UploadFilesActivity.class);
 +        action.putExtra(
 +                UploadFilesActivity.EXTRA_ACCOUNT,
 +                getAccount()
 +        );
 +        startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);
 +    }
 +
 +    public void uploadFromOtherAppsSelected() {
 +        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
 +        );
 +    }
 +
      private void startSynchronization() {
          Log_OC.d(TAG, "Got to start sync");
          if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
                              requestMoveOperation(fData, fResultCode);
                          }
                      },
 -                    DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
 +                    DELAY_TO_REQUEST_OPERATIONS_LATER
              );
  
          } else if (requestCode == ACTION_COPY_FILES && resultCode == RESULT_OK) {
                              requestCopyOperation(fData, fResultCode);
                          }
                      },
 -                    DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
 +                    DELAY_TO_REQUEST_OPERATIONS_LATER
              );
  
          } else {
       */
      private void requestMoveOperation(Intent data, int resultCode) {
          OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
 -        OCFile targetFile = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE);
 -        getFileOperationsHelper().moveFile(folderToMoveAt, targetFile);
 +
 +        ArrayList<OCFile> files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES);
 +
 +        for (Parcelable file : files) {
 +            getFileOperationsHelper().moveFile(folderToMoveAt, (OCFile) file);
 +        }
      }
  
      /**
       */
      private void requestCopyOperation(Intent data, int resultCode) {
          OCFile folderToMoveAt = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
 -        OCFile targetFile = data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE);
 -        getFileOperationsHelper().copyFile(folderToMoveAt, targetFile);
 +
 +        ArrayList<OCFile> files = data.getParcelableArrayListExtra(FolderPickerActivity.EXTRA_FILES);
 +
 +        for (Parcelable file : files) {
 +            getFileOperationsHelper().copyFile(folderToMoveAt, (OCFile) file);
 +        }
      }
  
      @Override
      public void onBackPressed() {
 -        if (!isDrawerOpen()){
 +        boolean isFabOpen = isFabOpen();
 +        boolean isDrawerOpen = isDrawerOpen();
 +
 +        /*
 +         * BackPressed priority/hierarchy:
 +         *    1. close drawer if opened
 +         *    2. close FAB if open (only if drawer isn't open)
 +         *    3. navigate up (only if drawer and FAB aren't open)
 +         */
 +        if(isDrawerOpen && isFabOpen) {
 +            // close drawer first
 +            super.onBackPressed();
 +        } else if(isDrawerOpen && !isFabOpen) {
 +            // close drawer
 +            super.onBackPressed();
 +        } else if (!isDrawerOpen && isFabOpen) {
 +            // close fab
 +            getListOfFilesFragment().getFabMain().collapse();
 +        } else {
 +            // all closed
              OCFileListFragment listOfFiles = getListOfFilesFragment();
              if (mDualPane || getSecondFragment() == null) {
                  OCFile currentDir = getCurrentDir();
                  setFile(listOfFiles.getCurrentFile());
              }
              cleanSecondFragment();
 -
              changeGridIcon();
 -        } else {
 -            super.onBackPressed();
          }
      }
  
          Log_OC.v(TAG, "onPause() end");
      }
  
 +    public boolean isFabOpen() {
 +        if(getListOfFilesFragment() != null && getListOfFilesFragment().getFabMain() != null && getListOfFilesFragment().getFabMain().isExpanded()) {
 +            return true;
 +        } else {
 +            return false;
 +        }
 +    }
 +
  
      private class SyncBroadcastReceiver extends BroadcastReceiver {
  
                                      currentDir.getRemotePath().equals(synchFolderRemotePath)) {
                                  OCFileListFragment fileListFragment = getListOfFilesFragment();
                                  if (fileListFragment != null) {
 -                                    fileListFragment.listDirectory();
 -                                    // TODO Enable when "On Device" is recovered ?
 -                                    // fileListFragment.listDirectory(currentDir,
 -                                    // MainApp.getOnlyOnDevice());
 +                                    fileListFragment.listDirectory(currentDir,
 +                                    MainApp.getOnlyOnDevice());
                                  }
                              }
                              setFile(currentFile);
                              }
  
                          }
 +
                      }
                      removeStickyBroadcast(intent);
                      Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress);
                          (uploadedRemotePath.startsWith(currentDir.getRemotePath()));
  
                  if (sameAccount && isDescendant) {
 -                    refreshListOfFilesFragment();
 +                    String linkedToRemotePath =
 +                            intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
 +                    if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
 +                        refreshListOfFilesFragment();
 +                    }
                  }
  
                  boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT,
  
          }
  
 +        // TODO refactor this receiver, and maybe DownloadFinishReceiver; this method is duplicated :S
 +        private boolean isAscendant(String linkedToRemotePath) {
 +            OCFile currentDir = getCurrentDir();
 +            return (
 +                    currentDir != null &&
 +                            currentDir.getRemotePath().startsWith(linkedToRemotePath)
 +            );
 +        }
 +
 +
      }
  
  
       */
      private class DownloadFinishReceiver extends BroadcastReceiver {
  
 -        //int refreshCounter = 0;
          @Override
          public void onReceive(Context context, Intent intent) {
              try {
 -                boolean sameAccount = isSameAccount(context, intent);
 +                boolean sameAccount = isSameAccount(intent);
                  String downloadedRemotePath =
                          intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
                  boolean isDescendant = isDescendant(downloadedRemotePath);
                      String linkedToRemotePath =
                              intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
                      if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
 -                        //Log_OC.v(TAG, "refresh #" + ++refreshCounter);
                          refreshListOfFilesFragment();
                      }
                      refreshSecondFragment(
              );
          }
  
 -        private boolean isSameAccount(Context context, Intent intent) {
 +        private boolean isSameAccount(Intent intent) {
              String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
              return (accountName != null && getAccount() != null &&
                      accountName.equals(getAccount().name));
          OCFileListFragment listOfFiles = getListOfFilesFragment();
          if (listOfFiles != null) {  // should never be null, indeed
              OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
 -            listOfFiles.listDirectory(root);
 -            // TODO Enable when "On Device" is recovered ?
 -            // listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
 +            listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
              setFile(listOfFiles.getCurrentFile());
              startSyncFolderOperation(root, false);
          }
          MenuItem menuItem = mOptionsMenu.findItem(R.id.action_switch_view);
  
          changeGridIcon();
-         if (DisplayUtils.isGridView(directory, getStorageManager())){
-             switchToGridView();
-         } else {
-             switchToListView();
-         }
+         switchLayout(directory);
      }
  
      /**
              // getFileDownloadBinder() - THIS IS A MESS
              OCFileListFragment listOfFiles = getListOfFilesFragment();
              if (listOfFiles != null) {
 -                listOfFiles.listDirectory();
 -                // TODO Enable when "On Device" is recovered ?
 -                // listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
 +                listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
              }
              FileFragment secondFragment = getSecondFragment();
              if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
          } else if (operation instanceof CreateFolderOperation) {
              onCreateFolderOperationFinish((CreateFolderOperation) operation, result);
  
 -        } else if (operation instanceof CreateShareOperation) {
 -            onCreateShareOperationFinish((CreateShareOperation) operation, result);
 +        } else if (operation instanceof CreateShareViaLinkOperation ||
 +                    operation instanceof CreateShareWithShareeOperation ) {
  
 -        } else if (operation instanceof UnshareLinkOperation) {
 -            onUnshareLinkOperationFinish((UnshareLinkOperation) operation, result);
 +            refreshShowDetails();
 +            refreshListOfFilesFragment();
 +
 +        } else if (operation instanceof UnshareOperation) {
 +            onUnshareLinkOperationFinish((UnshareOperation) operation, result);
  
          } else if (operation instanceof MoveFileOperation) {
              onMoveFileOperationFinish((MoveFileOperation) operation, result);
          }
  
      }
 -    private void onCreateShareOperationFinish(CreateShareOperation operation,
 -                                              RemoteOperationResult result) {
 -        if (result.isSuccess()) {
 -            refreshShowDetails();
 -            refreshListOfFilesFragment();
 -        }
 -    }
  
 -    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
 +    private void onUnshareLinkOperationFinish(UnshareOperation operation,
                                                RemoteOperationResult result) {
          if (result.isSuccess()) {
              refreshShowDetails();
       */
      private void onRemoveFileOperationFinish(RemoveFileOperation operation,
                                               RemoteOperationResult result) {
 -        dismissLoadingDialog();
 -
          Toast msg = Toast.makeText(this,
                  ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
                  Toast.LENGTH_LONG);
      private void onMoveFileOperationFinish(MoveFileOperation operation,
                                             RemoteOperationResult result) {
          if (result.isSuccess()) {
 -            dismissLoadingDialog();
              refreshListOfFilesFragment();
          } else {
 -            dismissLoadingDialog();
              try {
                  Toast msg = Toast.makeText(FileDisplayActivity.this,
                          ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
       */
      private void onCopyFileOperationFinish(CopyFileOperation operation, RemoteOperationResult result) {
          if (result.isSuccess()) {
 -            dismissLoadingDialog();
              refreshListOfFilesFragment();
          } else {
 -            dismissLoadingDialog();
              try {
                  Toast msg = Toast.makeText(FileDisplayActivity.this,
                          ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
       */
      private void onRenameFileOperationFinish(RenameFileOperation operation,
                                               RemoteOperationResult result) {
 -        dismissLoadingDialog();
          OCFile renamedFile = operation.getFile();
          if (result.isSuccess()) {
              FileFragment details = getSecondFragment();
      private void onCreateFolderOperationFinish(CreateFolderOperation operation,
                                                 RemoteOperationResult result) {
          if (result.isSuccess()) {
 -            dismissLoadingDialog();
              refreshListOfFilesFragment();
          } else {
 -            dismissLoadingDialog();
              try {
                  Toast msg = Toast.makeText(FileDisplayActivity.this,
                          ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
          return null;
      }
  
 -    public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) {
 -        long currentSyncTime = System.currentTimeMillis();
 -
 -        mSyncInProgress = true;
 -
 -        // perform folder synchronization
 -        RemoteOperation synchFolderOp = new RefreshFolderOperation( folder,
 -                currentSyncTime,
 -                false,
 -                getFileOperationsHelper().isSharedSupported(),
 -                ignoreETag,
 -                getStorageManager(),
 -                getAccount(),
 -                getApplicationContext()
 +    /**
 +     * Starts an operation to refresh the requested folder.
 +     *
 +     * The operation is run in a new background thread created on the fly.
 +     *
 +     * The refresh updates is a "light sync": properties of regular files in folder are updated (including
 +     * associated shares), but not their contents. Only the contents of files marked to be kept-in-sync are
 +     * synchronized too.
 +     *
 +     * @param folder        Folder to refresh.
 +     * @param ignoreETag    If 'true', the data from the server will be fetched and sync'ed even if the eTag
 +     *                      didn't change.
 +     */
 +    public void startSyncFolderOperation(final OCFile folder, final boolean ignoreETag) {
 +
 +        // the execution is slightly delayed to allow the activity get the window focus if it's being started
 +        // or if the method is called from a dialog that is being dismissed
 +        getHandler().postDelayed(
 +                new Runnable() {
 +                    @Override
 +                    public void run() {
 +                        if (hasWindowFocus()) {
 +                            long currentSyncTime = System.currentTimeMillis();
 +                            mSyncInProgress = true;
 +
 +                            // perform folder synchronization
 +                            RemoteOperation synchFolderOp = new RefreshFolderOperation(folder,
 +                                    currentSyncTime,
 +                                    false,
 +                                    getFileOperationsHelper().isSharedSupported(),
 +                                    ignoreETag,
 +                                    getStorageManager(),
 +                                    getAccount(),
 +                                    getApplicationContext()
 +                            );
 +                            synchFolderOp.execute(
 +                                    getAccount(),
 +                                    MainApp.getAppContext(),
 +                                    FileDisplayActivity.this,
 +                                    null,
 +                                    null
 +                            );
 +
 +                            mProgressBar.setIndeterminate(true);
 +
 +                            setBackgroundText();
 +
 +                        }   // else: NOTHING ; lets' not refresh when the user rotates the device but there is
 +                        // another window floating over
 +                    }
 +                },
 +                DELAY_TO_REQUEST_OPERATIONS_LATER
          );
 -        synchFolderOp.execute(getAccount(), MainApp.getAppContext(), this, null, null);
  
 -        mProgressBar.setIndeterminate(true);
 -
 -        setBackgroundText();
      }
  
      /**
     public void allFilesOption() {
         browseToRoot();
     }
 +
 +    public void refreshDirectory(){
 +        getListOfFilesFragment().refreshDirectory();
 +    }
  }
@@@ -217,6 -217,24 +217,24 @@@ public class FileDetailFragment extend
              item.setVisible(false);
              item.setEnabled(false);
          }
+         item = menu.findItem(R.id.action_switch_view);
+         if (item != null){
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_sync_account);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_sort);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
      }
  
  
                  mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile());
                  return true;
              }
 +            case R.id.action_share_with_users: {
 +                mContainerActivity.getFileOperationsHelper().showShareFile(getFile());
 +                return true;
 +            }
              case R.id.action_unshare_file: {
                  mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile());
                  return true;
              }
 +
              case R.id.action_open_file_with: {
                  mContainerActivity.getFileOperationsHelper().openFile(getFile());
                  return true;
                  dialog.show(getFragmentManager(), FTAG_RENAME_FILE);
                  return true;
              }
 -            case R.id.action_cancel_download:
 -            case R.id.action_cancel_upload: {
 -                ((FileDisplayActivity) mContainerActivity).cancelTransference(getFile());
 +            case R.id.action_cancel_sync: {
 +                ((FileDisplayActivity)mContainerActivity).cancelTransference(getFile());
                  return true;
              }
              case R.id.action_download_file:
                  if (!getFile().isDown()) {  // Download the file                    
                      Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded");
                      ((FileDisplayActivity) mContainerActivity).startDownloadForSending(getFile());
 -
                  }
                  else {
                      mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
          }
      }
  
 -
      /**
       * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be replaced.
       *
@@@ -290,6 -290,18 +290,18 @@@ public class PreviewTextFragment extend
              item.setVisible(false);
              item.setEnabled(false);
          }
+         item = menu.findItem(R.id.action_switch_view);
+         if (item != null){
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_sort);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
      }
  
      /**
                  mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile());
                  return true;
              }
 +            case R.id.action_share_with_users: {
 +                mContainerActivity.getFileOperationsHelper().showShareFile(getFile());
 +                return true;
 +            }
              case R.id.action_unshare_file: {
                  mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile());
                  return true;