Merge commit 'refs/pr/707' into text_file_preview_pr_707_with
authormasensio <masensio@solidgear.es>
Wed, 5 Aug 2015 14:48:12 +0000 (16:48 +0200)
committermasensio <masensio@solidgear.es>
Wed, 5 Aug 2015 14:48:12 +0000 (16:48 +0200)
Conflicts:
src/com/owncloud/android/datamodel/OCFile.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

1  2 
build.gradle
res/layout/file_preview.xml
src/com/owncloud/android/datamodel/OCFile.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java
src/com/owncloud/android/ui/preview/PreviewTextFragment.java

diff --cc build.gradle
Simple merge
@@@ -1,8 -1,7 +1,7 @@@
- <?xml version="1.0" encoding="utf-8"?>
- <!--
+ <?xml version="1.0" encoding="utf-8"?><!--
    ownCloud Android client application
  
 -  Copyright (C) 2012-2013  ownCloud Inc.
 +  Copyright (C) 2015 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,
@@@ -289,11 -283,11 +289,13 @@@ public class OCFile implements Parcelab
      /**
       * Sets the name of the file
       * <p/>
--     * Does nothing if the new name is null, empty or includes "/" ; or if the file is the root directory
++     * Does nothing if the new name is null, empty or includes "/" ; or if the file is the root
++     * directory
       */
      public void setFileName(String name) {
          Log_OC.d(TAG, "OCFile name changin from " + mRemotePath);
--        if (name != null && name.length() > 0 && !name.contains(PATH_SEPARATOR) && !mRemotePath.equals(ROOT_PATH)) {
++        if (name != null && name.length() > 0 && !name.contains(PATH_SEPARATOR) &&
++                !mRemotePath.equals(ROOT_PATH)) {
              String parent = (new File(getRemotePath())).getParent();
              parent = (parent.endsWith(PATH_SEPARATOR)) ? parent : parent + PATH_SEPARATOR;
              mRemotePath = parent + name;
  
      @Override
      public String toString() {
-         String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, parentId=%s, favorite=%s etag=%s]";
-         asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mFavorite), mEtag);
 -        String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, parentId=%s, keepInSync=%s etag=%s]";
 -        asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mKeepInSync), mEtag);
++        String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, " +
++                "parentId=%s, favorite=%s etag=%s]";
++        asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(),
++                mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mFavorite),
++                mEtag);
          return asString;
      }
  
       */
      public boolean isImage() {
          return ((mMimeType != null && mMimeType.startsWith("image/")) ||
-                 FileStorageUtils.getMimeTypeFromName(mRemotePath).startsWith("image/"));
+                 getMimeTypeFromName().startsWith("image/"));
+     }
+     /**
+      * @return 'True' if the file is simple text (e.g. not application-dependent, like .doc or .docx)
+      */
+     public boolean isText() {
 -        return ((mMimeType != null && mMimeType.startsWith("text/")) || getMimeTypeFromName().startsWith("text/"));
++        return ((mMimeType != null && mMimeType.startsWith("text/")) ||
++                getMimeTypeFromName().startsWith("text/"));
+     }
+     public String getMimeTypeFromName() {
+         String extension = "";
+         int pos = mRemotePath.lastIndexOf('.');
+         if (pos >= 0) {
+             extension = mRemotePath.substring(pos + 1);
+         }
 -        String result = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
++        String result = MimeTypeMap.getSingleton().
++                getMimeTypeFromExtension(extension.toLowerCase());
+         return (result != null) ? result : "";
      }
  
      public String getPermissions() {
@@@ -102,16 -108,22 +103,21 @@@ import com.owncloud.android.utils.FileS
  import com.owncloud.android.utils.UriUtils;
  
  import java.io.File;
 +
+ import java.io.IOException;
 +
  /**
   * Displays, what files the user has available in his ownCloud.
 - *
 - * @author Bartek Przybylski
 - * @author David A. Velasco
   */
  
 -public class FileDisplayActivity extends HookActivity implements
 -        FileFragment.ContainerActivity, OnNavigationListener,
 +public class FileDisplayActivity extends HookActivity
 +        implements FileFragment.ContainerActivity,
          OnSslUntrustedCertListener, OnEnforceableRefreshListener {
  
 -    private ArrayAdapter<String> mDirectories;
++
      private SyncBroadcastReceiver mSyncBroadcastReceiver;
      private UploadFinishReceiver mUploadFinishReceiver;
      private DownloadFinishReceiver mDownloadFinishReceiver;
      private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
  
      private OCFile mWaitingToPreview;
-     
      private boolean mSyncInProgress = false;
  
 -    private String DIALOG_UNTRUSTED_CERT;
 +    private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT";
 +    private 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";
  
      private OCFile mWaitingToSend;
  
              Intent initObserversIntent = FileObserverService.makeInitIntent(this);
              startService(initObserversIntent);
          }
-         
          /// Load of saved instance state
 -        if (savedInstanceState != null) {
 -            mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
 +        if(savedInstanceState != null) {
 +            mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(
 +                    FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
              mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS);
 -            mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND);
 -
 +            mWaitingToSend = (OCFile) savedInstanceState.getParcelable(
 +                    FileDisplayActivity.KEY_WAITING_TO_SEND);
-            
          } else {
              mWaitingToPreview = null;
              mSyncInProgress = false;
  
          // Inflate and set the layout view
          setContentView(R.layout.files);
 +        
 +        // Navigation Drawer
 +        initDrawer();
          mDualPane = getResources().getBoolean(R.bool.large_land_layout);
          mLeftFragmentContainer = findViewById(R.id.left_fragment_container);
          mRightFragmentContainer = findViewById(R.id.right_fragment_container);
          }
  
          // Action bar setup
 -        mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
 -        getSupportActionBar().setHomeButtonEnabled(true);       // mandatory since Android ICS, according to the official documentation
 -        setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/);    // always AFTER setContentView(...) ; to work around bug in its implementation
 +        getSupportActionBar().setHomeButtonEnabled(true);       // mandatory since Android ICS,
 +                                                                // according to the official
 +                                                                // documentation
 +
 +        setSupportProgressBarIndeterminateVisibility(mSyncInProgress
 +        /*|| mRefreshSharesInProgress*/);
 +        // always AFTER setContentView(...) ; to work around bug in its implementation
-         
          setBackgroundText();
  
 -        Log_OC.d(TAG, "onCreate() end");
 +        Log_OC.v(TAG, "onCreate() end");
      }
  
      @Override
                  file = getStorageManager().getFileByPath(OCFile.ROOT_PATH);  // never returns null
              }
              setFile(file);
-             
 -            setNavigationListWithFolder(file);
              if (!stateWasRecovered) {
 -                Log_OC.e(TAG, "Initializing Fragments in onAccountChanged..");
 +                Log_OC.d(TAG, "Initializing Fragments in onAccountChanged..");
                  initFragmentsWithFile();
                  if (file.isFolder()) {
                      startSyncFolderOperation(file, false);
                  }
-                 
              } else {
                  updateFragmentsVisibility(!file.isFolder());
 -                updateNavigationElementsInActionBar(file.isFolder() ? null : file);
 -            }
 -        }
 -    }
 -
 -
 -    private void setNavigationListWithFolder(OCFile file) {
 -        mDirectories.clear();
 -        OCFile fileIt = file;
 -        String parentPath;
 -        while (fileIt != null && fileIt.getFileName() != OCFile.ROOT_PATH) {
 -            if (fileIt.isFolder()) {
 -                mDirectories.add(fileIt.getFileName());
 +                updateActionBarTitleAndHomeButton(file.isFolder() ? null : file);
              }
 -            // get parent from path
 -            parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName()));
 -            fileIt = getStorageManager().getFileByPath(parentPath);
          }
 -        mDirectories.add(OCFile.PATH_SEPARATOR);
      }
  
--
      private void createMinFragments() {
          OCFileListFragment listOfFiles = new OCFileListFragment();
          FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
      private void initFragmentsWithFile() {
          if (getAccount() != null && getFile() != null) {
              /// First fragment
-             OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+             OCFileListFragment listOfFiles = getListOfFilesFragment();
              if (listOfFiles != null) {
                  listOfFiles.listDirectory(getCurrentDir());
 +                // TODO Enable when "On Device" is recovered
 +                // listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice());
++
              } else {
                  Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >(");
              }
              if (secondFragment != null) {
                  setSecondFragment(secondFragment);
                  updateFragmentsVisibility(true);
 -                updateNavigationElementsInActionBar(file);
 +                updateActionBarTitleAndHomeButton(file);
-                 
              } else {
                  cleanSecondFragment();
+                 if (file.isDown() && PreviewTextFragment.canBePreviewed(file))
+                     startTextPreview(file);
              }
  
          } else {
      private Fragment chooseInitialSecondFragment(OCFile file) {
          Fragment secondFragment = null;
          if (file != null && !file.isFolder()) {
-             if (file.isDown() && PreviewMediaFragment.canBePreviewed(file) 
+             if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)
                      && file.getLastSyncDateForProperties() > 0  // temporal fix
                      ) {
 -                int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
 -                boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
 -                secondFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
 +                int startPlaybackPosition =
 +                        getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
 +                boolean autoplay =
 +                        getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
 +                secondFragment = new PreviewMediaFragment(file, getAccount(),
 +                        startPlaybackPosition, autoplay);
  
 -            } else secondFragment = new FileDetailFragment(file, getAccount());
+             } else if (file.isDown() && PreviewTextFragment.canBePreviewed(file)) {
+                 secondFragment = null;
-                 secondFragment = FileDetailFragment.newInstance(file, getAccount());
-             }
 +            } else {
++            secondFragment = FileDetailFragment.newInstance(file, getAccount());
++        }
          }
          return secondFragment;
      }
  
  
      private OCFileListFragment getListOfFilesFragment() {
 -        Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES);
 +        Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(
 +                FileDisplayActivity.TAG_LIST_OF_FILES);
          if (listOfFiles != null) {
-             return (OCFileListFragment)listOfFiles;
+             return (OCFileListFragment) listOfFiles;
          }
          Log_OC.wtf(TAG, "Access to unexisting list of files fragment!!");
          return null;
      }
  
      public FileFragment getSecondFragment() {
 -        Fragment second = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT);
 +        Fragment second = getSupportFragmentManager().findFragmentByTag(
 +                FileDisplayActivity.TAG_SECOND_FRAGMENT);
          if (second != null) {
-             return (FileFragment)second;
+             return (FileFragment) second;
          }
          return null;
      }
              case R.id.action_create_dir: {
                  CreateFolderDialogFragment dialog =
                          CreateFolderDialogFragment.newInstance(getCurrentDir());
 -                dialog.show(getSupportFragmentManager(), "createdirdialog");
 +                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();
 +                if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
 +                    mDrawerLayout.closeDrawer(GravityCompat.START);
 +                } else if((currentDir != null && currentDir.getParentId() != 0) ||
 +                        (second != null && second.getFile() != null)) {
 +                    onBackPressed();
 +
 +                } else {
 +                    mDrawerLayout.openDrawer(GravityCompat.START);
 +                }
                  break;
              }
              case R.id.action_sort: {
          }
      }
  
 -
 -    @Override
 -    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
 -        if (itemPosition != 0) {
 -            String targetPath = "";
 -            for (int i = itemPosition; i < mDirectories.getCount() - 1; i++) {
 -                targetPath = mDirectories.getItem(i) + OCFile.PATH_SEPARATOR + targetPath;
 -            }
 -            targetPath = OCFile.PATH_SEPARATOR + targetPath;
 -            OCFile targetFolder = getStorageManager().getFileByPath(targetPath);
 -            if (targetFolder != null) {
 -                browseTo(targetFolder);
 -            }
 -
 -            // the next operation triggers a new call to this method, but it's necessary to 
 -            // ensure that the name exposed in the action bar is the current directory when the 
 -            // user selected it in the navigation list
 -            if (getSupportActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST && itemPosition != 0)
 -                getSupportActionBar().setSelectedNavigationItem(0);
 -        }
 -        return true;
 -    }
 -
      /**
       * Called, when the user selected something for uploading
 +     *
       */
 +    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
 +    @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 -        super.onActivityResult(requestCode, resultCode, data);
 -
 -        if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
 -            requestSimpleUpload(data, resultCode);
  
 -        } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
 +        if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK ||
 +                resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
 +            //getClipData is only supported on api level 16+, Jelly Bean
 +            if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
 +                for( int i = 0; i < data.getClipData().getItemCount(); i++){
 +                    Intent intent = new Intent();
 +                    intent.setData(data.getClipData().getItemAt(i).getUri());
 +                    requestSimpleUpload(intent, resultCode);
 +                }
 +            }else {
 +                requestSimpleUpload(data, resultCode);
 +            }
 +        } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK ||
 +                resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
              requestMultipleUpload(data, resultCode);
  
-         } else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK){
+         } else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK) {
  
              final Intent fData = data;
-             final int fResultCode = resultCode; 
+             final int fResultCode = resultCode;
              getHandler().postDelayed(
-                 new Runnable() {
-                     @Override
-                     public void run() {
-                         requestMoveOperation(fData, fResultCode);
-                     }
-                 }, 
-                 DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
+                     new Runnable() {
+                         @Override
+                         public void run() {
+                             requestMoveOperation(fData, fResultCode);
+                         }
+                     },
+                     DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS
              );
 +
 +        } else {
 +            super.onActivityResult(requestCode, resultCode, data);
          }
 +
      }
  
      private void requestMultipleUpload(Intent data, int resultCode) {
  
      @Override
      public void onBackPressed() {
-         OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+         OCFileListFragment listOfFiles = getListOfFilesFragment();
          if (mDualPane || getSecondFragment() == null) {
 +            OCFile currentDir = getCurrentDir();
 +            if (currentDir == null || currentDir.getParentId() == FileDataStorageManager.ROOT_PARENT_ID) {
 +                finish();
 +                return;
 +            }
              if (listOfFiles != null) {  // should never be null, indeed
 -                if (mDirectories.getCount() <= 1) {
 -                    finish();
 -                    return;
 -                }
 -                int levelsUp = listOfFiles.onBrowseUp();
 -                for (int i = 0; i < levelsUp && mDirectories.getCount() > 1; i++) {
 -                    popDirname();
 -                }
 +                listOfFiles.onBrowseUp();
              }
          }
          if (listOfFiles != null) {  // should never be null, indeed
          super.onSaveInstanceState(outState);
          outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
          outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress);
 -        //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress);
 +        //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS,
 +        // mRefreshSharesInProgress);
          outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend);
  
 -        Log_OC.d(TAG, "onSaveInstanceState() end");
 +        Log_OC.v(TAG, "onSaveInstanceState() end");
      }
-     
  
  
      @Override
      protected void onResume() {
 +        Log_OC.v(TAG, "onResume() start");
          super.onResume();
 -        Log_OC.e(TAG, "onResume() start");
 +        // refresh Navigation Drawer account list
 +        mNavigationDrawerAdapter.updateAccountList();
  
          // refresh list of files
          refreshListOfFilesFragment();
  
          downloadIntentFilter.addAction(FileDownloader.getDownloadFinishMessage());
          mDownloadFinishReceiver = new DownloadFinishReceiver();
          registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);
-         
 +        Log_OC.v(TAG, "onResume() end");
 -        Log_OC.d(TAG, "onResume() end");
      }
  
  
              unregisterReceiver(mDownloadFinishReceiver);
              mDownloadFinishReceiver = null;
          }
-         
 -
 -        Log_OC.d(TAG, "onPause() end");
          super.onPause();
 +        Log_OC.v(TAG, "onPause() end");
      }
  
  
                  String event = intent.getAction();
                  Log_OC.d(TAG, "Received broadcast " + event);
                  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) && getStorageManager() != null);
 +                String synchFolderRemotePath =
 +                        intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH);
 +                RemoteOperationResult synchResult =
 +                        (RemoteOperationResult)intent.getSerializableExtra(
 +                                FileSyncAdapter.EXTRA_RESULT);
 +                boolean sameAccount = (getAccount() != null &&
 +                        accountName.equals(getAccount().name) && getStorageManager() != null);
-     
                  if (sameAccount) {
-                     
                      if (FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) {
                          mSyncInProgress = true;
-                         
                      } else {
 -                        OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath());
 -                        OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().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 
 -                            Toast.makeText(FileDisplayActivity.this,
 -                                    String.format(getString(R.string.sync_current_folder_was_removed), mDirectories.getItem(0)),
 -                                    Toast.LENGTH_LONG)
 -                                    .show();
 +                            Toast.makeText( FileDisplayActivity.this, 
 +                                            String.format(
 +                                                    getString(R.string.
 +                                                            sync_current_folder_was_removed),
 +                                                   synchFolderRemotePath),
 +                                            Toast.LENGTH_LONG)
 +                                .show();
++
                              browseToRoot();
-                             
                          } else {
                              if (currentFile == null && !getFile().isFolder()) {
 -                                // currently selected file was removed in the server, and now we know it
 +                                // currently selected file was removed in the server, and now we
 +                                // know it
                                  cleanSecondFragment();
                                  currentFile = currentDir;
                              }
                              }
                              setFile(currentFile);
                          }
-                         
 -                        mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event));
 -
 -                        if (SynchronizeFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.
 -                                equals(event) &&
 -                                /// TODO refactor and make common
 +                        mSyncInProgress = (!FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) &&
 +                                !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED
 +                                        .equals(event));
 +                                
 +                        if (RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.
-                                     equals(event) &&
-                                 /// TODO refactor and make common
-                                 synchResult != null && !synchResult.isSuccess() &&  
-                                 (synchResult.getCode() == ResultCode.UNAUTHORIZED   || 
-                                     synchResult.isIdPRedirection()                  ||
-                                     (synchResult.isException() && synchResult.getException() 
-                                             instanceof AuthenticatorException))) {
++                                    equals(event) &&/// TODO refactor and make common
+                                 synchResult != null && !synchResult.isSuccess() &&
+                                 (synchResult.getCode() == ResultCode.UNAUTHORIZED ||
+                                         synchResult.isIdPRedirection() ||
+                                         (synchResult.isException() && synchResult.getException()
+                                                 instanceof AuthenticatorException))) {
  
 -                            OwnCloudClient client = null;
 +
                              try {
 +                                OwnCloudClient client;
                                  OwnCloudAccount ocAccount =
                                          new OwnCloudAccount(getAccount(), context);
                                  client = (OwnCloudClientManagerFactory.getDefaultSingleton().
                                          removeClientFor(ocAccount));
 -                                // TODO get rid of these exceptions
 -                            } catch (AccountNotFoundException e) {
 -                                e.printStackTrace();
 -                            } catch (AuthenticatorException e) {
 -                                e.printStackTrace();
 -                            } catch (OperationCanceledException e) {
 -                                e.printStackTrace();
 -                            } catch (IOException e) {
 -                                e.printStackTrace();
 -                            }
--
 -                            if (client != null) {
 -                                OwnCloudCredentials cred = client.getCredentials();
 -                                if (cred != null) {
 -                                    AccountManager am = AccountManager.get(context);
 -                                    if (cred.authTokenExpires()) {
 -                                        am.invalidateAuthToken(
 -                                                getAccount().type,
 -                                                cred.getAuthToken()
 -                                        );
 -                                    } else {
 -                                        am.clearPassword(getAccount());
 +                                if (client != null) {
 +                                    OwnCloudCredentials cred = client.getCredentials();
 +                                    if (cred != null) {
 +                                        AccountManager am = AccountManager.get(context);
 +                                        if (cred.authTokenExpires()) {
 +                                            am.invalidateAuthToken(
 +                                                    getAccount().type,
 +                                                    cred.getAuthToken()
 +                                            );
 +                                        } else {
 +                                            am.clearPassword(getAccount());
 +                                        }
                                      }
                                  }
 -                            }
 +                                requestCredentialsUpdate();
  
 -                            requestCredentialsUpdate();
 +                            } catch (AccountNotFoundException e) {
 +                                Log_OC.e(TAG, "Account " + getAccount() + " was removed!", e);
 +                            }
  
                          }
                      }
                      removeStickyBroadcast(intent);
                      Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress);
 -                    setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/);
 +                    setSupportProgressBarIndeterminateVisibility(mSyncInProgress
 +                    /*|| mRefreshSharesInProgress*/);
  
                      setBackgroundText();
-                         
                  }
-                 
                  if (synchResult != null) {
 -                    if (synchResult.getCode().equals(RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
 +                    if (synchResult.getCode().equals(
 +                            RemoteOperationResult.ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED)) {
                          mLastSslUntrustedServerResult = synchResult;
                      }
                  }
                  if (sameAccount && isDescendant) {
                      refreshListOfFilesFragment();
                  }
-                 
 -
 -                boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false);
 +                boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT,
 +                        false);
                  boolean renamedInUpload = getFile().getRemotePath().
                          equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
-                 boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) || 
+                 boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) ||
                          renamedInUpload;
                  FileFragment details = getSecondFragment();
-                 boolean detailFragmentIsShown = (details != null && 
+                 boolean detailFragmentIsShown = (details != null &&
                          details instanceof FileDetailFragment);
-                 
                  if (sameAccount && sameFile && detailFragmentIsShown) {
                      if (uploadWasFine) {
                          setFile(getStorageManager().getFileByPath(uploadedRemotePath));
  
      /**
       * Class waiting for broadcast events from the {@link FileDownloader} service.
-      * 
 -     * <p/>
++     *
       * Updates the UI when a download is started or finished, provided that it is relevant for the
       * current folder.
       */
                  boolean isDescendant = isDescendant(downloadedRemotePath);
  
                  if (sameAccount && isDescendant) {
 -                    refreshListOfFilesFragment();
 -                    refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
 +                    String linkedToRemotePath =
 +                            intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
 +                    if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
 +                        //Log_OC.v(TAG, "refresh #" + ++refreshCounter);
 +                        refreshListOfFilesFragment();
 +                    }
 +                    refreshSecondFragment(
 +                            intent.getAction(),
 +                            downloadedRemotePath,
 +                            intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)
 +                    );
                  }
-     
                  if (mWaitingToSend != null) {
 -                    mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send
 +                    mWaitingToSend =
 +                            getStorageManager().getFileByPath(mWaitingToSend.getRemotePath());
-                     if (mWaitingToSend.isDown()) { 
+                     if (mWaitingToSend.isDown()) {
                          sendDownloadedFile();
                      }
                  }
  
          private boolean isSameAccount(Context context, Intent intent) {
              String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME);
 -            return (accountName != null && getAccount() != null && accountName.equals(getAccount().name));
 +            return (accountName != null && getAccount() != null &&
 +                    accountName.equals(getAccount().name));
          }
      }
-     
-     
      public void browseToRoot() {
-         OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+         OCFileListFragment listOfFiles = getListOfFilesFragment();
          if (listOfFiles != null) {  // should never be null, indeed
 -            while (mDirectories.getCount() > 1) {
 -                popDirname();
 -            }
              OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH);
              listOfFiles.listDirectory(root);
 +            // TODO Enable when "On Device" is recovered ?
 +            // listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice());
              setFile(listOfFiles.getCurrentFile());
              startSyncFolderOperation(root, false);
          }
      }
  
  
 -    public void browseTo(OCFile folder) {
 -        if (folder == null || !folder.isFolder()) {
 -            throw new IllegalArgumentException("Trying to browse to invalid folder " + folder);
 -        }
 -        OCFileListFragment listOfFiles = getListOfFilesFragment();
 -        if (listOfFiles != null) {
 -            setNavigationListWithFolder(folder);
 -            listOfFiles.listDirectory(folder);
 -            setFile(listOfFiles.getCurrentFile());
 -            startSyncFolderOperation(folder, false);
 -        } else {
 -            Log_OC.e(TAG, "Unexpected null when accessing list fragment");
 -        }
 -        cleanSecondFragment();
 -    }
 -
 -
      /**
       * {@inheritDoc}
-      * 
+      * <p/>
       * Updates action bar and second fragment, if in dual pane mode.
       */
      @Override
                          if (!mWaitingToPreview.isDown()) {
                              requestForDownload();
                          }
-                 }
+                     }
  
 -            } else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
 +            } else if (component.equals(new ComponentName(FileDisplayActivity.this,
 +                    FileUploader.class))) {
                  Log_OC.d(TAG, "Upload service connected");
                  mUploaderBinder = (FileUploaderBinder) service;
              } else {
                  return;
              }
 -            // a new chance to get the mDownloadBinder through getFileDownloadBinder() - THIS IS A MESS
 +            // a new chance to get the mDownloadBinder through
 +            // getFileDownloadBinder() - THIS IS A MESS
-             OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+             OCFileListFragment listOfFiles = getListOfFilesFragment();
              if (listOfFiles != null) {
                  listOfFiles.listDirectory();
 +                // TODO Enable when "On Device" is recovered ?
 +                // listOfFiles.listDirectory(MainApp.getOnlyOnDevice());
              }
              FileFragment secondFragment = getSecondFragment();
              if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
                  mUploaderBinder = null;
              }
          }
-     };    
+     }
  
 -    ;
 -
 -
 -    /**
 -     * Launch an intent to request the PIN code to the user before letting him use the app
 -     */
 -    private void requestPinCode() {
 -        boolean pinStart = false;
 -        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
 -        pinStart = appPrefs.getBoolean("set_pincode", false);
 -        if (pinStart) {
 -            Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
 -            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "FileDisplayActivity");
 -            startActivity(i);
 -        }
 -    }
 -
 -
      @Override
      public void onSavedCertificate() {
          startSyncFolderOperation(getCurrentDir(), false);
              onRemoveFileOperationFinish((RemoveFileOperation) operation, result);
  
          } else if (operation instanceof RenameFileOperation) {
-             onRenameFileOperationFinish((RenameFileOperation)operation, result);
+             onRenameFileOperationFinish((RenameFileOperation) operation, result);
  
          } else if (operation instanceof SynchronizeFileOperation) {
-             onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);
+             onSynchronizeFileOperationFinish((SynchronizeFileOperation) operation, result);
  
          } else if (operation instanceof CreateFolderOperation) {
-             onCreateFolderOperationFinish((CreateFolderOperation)operation, result);
-             
+             onCreateFolderOperationFinish((CreateFolderOperation) operation, result);
          } else if (operation instanceof CreateShareOperation) {
              onCreateShareOperationFinish((CreateShareOperation) operation, result);
-             
          } else if (operation instanceof UnshareLinkOperation) {
-             onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result);
-         
+             onUnshareLinkOperationFinish((UnshareLinkOperation) operation, result);
          } else if (operation instanceof MoveFileOperation) {
-             onMoveFileOperationFinish((MoveFileOperation)operation, result);
+             onMoveFileOperationFinish((MoveFileOperation) operation, result);
          }
-         
-     }
  
 -
 -
 -    private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) {
+     }
 +    
 +    private void onCreateShareOperationFinish(CreateShareOperation operation,
 +                                              RemoteOperationResult result) {
          if (result.isSuccess()) {
              refreshShowDetails();
              refreshListOfFilesFragment();
          }
      }
  
-     
 -
 -    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
 +    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
 +                                              RemoteOperationResult result) {
          if (result.isSuccess()) {
              refreshShowDetails();
              refreshListOfFilesFragment();
                  if (details instanceof PreviewMediaFragment) {
                      // Refresh  OCFile of the fragment
                      ((PreviewMediaFragment) details).updateFile(file);
-                 } else {
+                 } else if (details instanceof PreviewTextFragment) {
+                     // Refresh  OCFile of the fragment
+                     ((PreviewTextFragment) details).updateFile(file);
+                 } else
                      showDetails(file);
-                 } 
              }
              invalidateOptionsMenu();
-         } 
+         }
      }
-     
      /**
 -     * Updates the view associated to the activity after the finish of an operation trying to remove a
 -     * file.
 -     *
 -     * @param operation Removal operation performed.
 -     * @param result    Result of the removal.
 +     * Updates the view associated to the activity after the finish of an operation trying to
 +     * remove a file.
 +     * 
 +     * @param operation     Removal operation performed.
 +     * @param result        Result of the removal.
       */
 -    private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
 +    private void onRemoveFileOperationFinish(RemoveFileOperation operation,
 +                                             RemoteOperationResult result) {
          dismissLoadingDialog();
-         
 -
 -        Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
 +        Toast msg = Toast.makeText(this,
 +                ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
-                 Toast.LENGTH_LONG); 
+                 Toast.LENGTH_LONG);
          msg.show();
-         
          if (result.isSuccess()) {
              OCFile removedFile = operation.getFile();
              FileFragment second = getSecondFragment();
                  setFile(getStorageManager().getFileById(removedFile.getParentId()));
                  cleanSecondFragment();
              }
--            if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
++            if (getStorageManager().getFileById(removedFile.getParentId()).equals(getCurrentDir())){
                  refreshListOfFilesFragment();
              }
              invalidateOptionsMenu();
              }
          }
      }
-     
-     
      /**
-      * Updates the view associated to the activity after the finish of an operation trying to move a 
+      * Updates the view associated to the activity after the finish of an operation trying to move a
       * file.
-      * 
-      * @param operation     Move operation performed.
-      * @param result        Result of the move operation.
+      *
+      * @param operation Move operation performed.
+      * @param result    Result of the move operation.
       */
 -    private void onMoveFileOperationFinish(MoveFileOperation operation, RemoteOperationResult result) {
 +    private void onMoveFileOperationFinish(MoveFileOperation operation,
 +                                           RemoteOperationResult result) {
          if (result.isSuccess()) {
              dismissLoadingDialog();
              refreshListOfFilesFragment();
                      ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
                      showDetails(renamedFile);
  
 -                } else if (details instanceof PreviewMediaFragment && renamedFile.equals(details.getFile())) {
 +                } else if (details instanceof PreviewMediaFragment &&
 +                        renamedFile.equals(details.getFile())) {
                      ((PreviewMediaFragment) details).updateFile(renamedFile);
                      if (PreviewMediaFragment.canBePreviewed(renamedFile)) {
-                         int position = ((PreviewMediaFragment)details).getPosition();
+                         int position = ((PreviewMediaFragment) details).getPosition();
                          startMediaPreview(renamedFile, position, true);
                      } else {
                          getFileOperationsHelper().openFile(renamedFile);
                      }
 -                } else if (details instanceof PreviewTextFragment && renamedFile.equals(details.getFile())) {
++                } else if (details instanceof PreviewTextFragment &&
++                        renamedFile.equals(details.getFile())) {
+                     ((PreviewTextFragment) details).updateFile(renamedFile);
+                     if (PreviewTextFragment.canBePreviewed(renamedFile)) {
+                         startTextPreview(renamedFile);
+                     } else {
+                         getFileOperationsHelper().openFile(renamedFile);
+                     }
                  }
              }
 -
 -            if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
 +            
 +            if (getStorageManager().getFileById(renamedFile.getParentId()).equals(getCurrentDir())){
                  refreshListOfFilesFragment();
              }
  
          } else {
 -            Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
 +            Toast msg = Toast.makeText(this,
 +                    ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
-                     Toast.LENGTH_LONG); 
+                     Toast.LENGTH_LONG);
              msg.show();
-             
              if (result.isSslRecoverableException()) {
                  mLastSslUntrustedServerResult = result;
                  showUntrustedCertDialog(mLastSslUntrustedServerResult);
      public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
          refreshListOfFilesFragment();
          FileFragment details = getSecondFragment();
 -        if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile())) {
 +        if (details != null && details instanceof FileDetailFragment &&
 +                file.equals(details.getFile()) ) {
              if (downloading || uploading) {
-                 ((FileDetailFragment)details).updateFileDetails(file, getAccount());
+                 ((FileDetailFragment) details).updateFileDetails(file, getAccount());
              } else {
                  if (!file.fileExists()) {
                      cleanSecondFragment();
          }
          return null;
      }
-     
      public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) {
-         long currentSyncTime = System.currentTimeMillis(); 
-         
+         long currentSyncTime = System.currentTimeMillis();
          mSyncInProgress = true;
-                 
          // perform folder synchronization
 -        RemoteOperation synchFolderOp = new SynchronizeFolderOperation(folder,
 +        RemoteOperation synchFolderOp = new RefreshFolderOperation( folder,
                  currentSyncTime,
                  false,
                  getFileOperationsHelper().isSharedSupported(),
                  getAccount(),
                  getApplicationContext()
          );
 -        synchFolderOp.execute(getAccount(), this, null, null);
 +        synchFolderOp.execute(getAccount(), MainApp.getAppContext(), this, null, null);
-         
          setSupportProgressBarIndeterminateVisibility(true);
  
          setBackgroundText();
          FragmentTransaction ft = fm.beginTransaction();
          dialog.show(ft, DIALOG_UNTRUSTED_CERT);
      }
-     
      private void requestForDownload(OCFile file) {
          Account account = getAccount();
 -        if (!mDownloaderBinder.isDownloading(account, file)) {
 +        if (!mDownloaderBinder.isDownloading(account, mWaitingToPreview)) {
              Intent i = new Intent(this, FileDownloader.class);
              i.putExtra(FileDownloader.EXTRA_ACCOUNT, account);
              i.putExtra(FileDownloader.EXTRA_FILE, file);
      }
  
      /**
 -        Fragment textPreviewFragment = Fragment.instantiate(getApplicationContext(), PreviewTextFragment.class.getName(), args);
+      * Stars the preview of a text file {@link OCFile}.
+      *
+      * @param file Text {@link OCFile} to preview.
+      */
+     public void startTextPreview(OCFile file) {
+         Bundle args = new Bundle();
+         args.putParcelable(EXTRA_FILE, file);
+         args.putParcelable(EXTRA_ACCOUNT, getAccount());
 -        updateNavigationElementsInActionBar(file);
++        Fragment textPreviewFragment = Fragment.instantiate(getApplicationContext(),
++                PreviewTextFragment.class.getName(), args);
+         setSecondFragment(textPreviewFragment);
+         updateFragmentsVisibility(true);
++        //updateNavigationElementsInActionBar(file);
+         setFile(file);
+     }
+     /**
       * Requests the download of the received {@link OCFile} , updates the UI
       * to monitor the download progress and prepares the activity to preview
       * or open the file when the download finishes.
-      * 
-      * @param file          {@link OCFile} to download and preview.
+      *
+      * @param file {@link OCFile} to download and preview.
       */
      public void startDownloadForPreview(OCFile file) {
 -        Fragment detailFragment = new FileDetailFragment(file, getAccount());
 +        Fragment detailFragment = FileDetailFragment.newInstance(file, getAccount());
          setSecondFragment(detailFragment);
          mWaitingToPreview = file;
          requestForDownload();
          getListOfFilesFragment().sortBySize(ascending);
      }
  
-     private void sortByName(boolean ascending){
+     private void sortByName(boolean ascending) {
          getListOfFilesFragment().sortByName(ascending);
      }
 +
 +   public void allFilesOption() {
 +       browseToRoot();
 +   }
  }
@@@ -52,7 -48,7 +52,8 @@@ import com.owncloud.android.ui.dialog.R
  import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
  import com.owncloud.android.ui.preview.PreviewImageFragment;
  import com.owncloud.android.ui.preview.PreviewMediaFragment;
 +import com.owncloud.android.utils.FileStorageUtils;
+ import com.owncloud.android.ui.preview.PreviewTextFragment;
  
  /**
   * A Fragment that lists all files and folders in a given path.
index 0000000,bae32e1..b3384c0
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,409 +1,406 @@@
 -import com.actionbarsherlock.view.Menu;
 -import com.actionbarsherlock.view.MenuInflater;
 -import com.actionbarsherlock.view.MenuItem;
+ package com.owncloud.android.ui.preview;
+ import android.accounts.Account;
+ import android.os.AsyncTask;
+ import android.os.Bundle;
+ import android.support.v4.app.Fragment;
+ import android.support.v4.app.FragmentManager;
+ import android.support.v4.app.FragmentTransaction;
+ import android.view.LayoutInflater;
+ import android.view.View;
+ import android.view.ViewGroup;
+ import android.widget.TextView;
+ import com.owncloud.android.R;
+ import com.owncloud.android.datamodel.OCFile;
+ import com.owncloud.android.files.FileMenuFilter;
+ import com.owncloud.android.lib.common.utils.Log_OC;
+ import com.owncloud.android.ui.activity.FileDisplayActivity;
+ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
+ import com.owncloud.android.ui.dialog.LoadingDialog;
+ import com.owncloud.android.ui.dialog.RemoveFileDialogFragment;
+ import com.owncloud.android.ui.fragment.FileFragment;
+ import java.io.BufferedWriter;
+ import java.io.FileInputStream;
+ import java.io.IOException;
+ import java.io.StringWriter;
+ import java.lang.ref.WeakReference;
+ import java.util.Scanner;
+ public class PreviewTextFragment extends FileFragment {
+     private static final String EXTRA_FILE = "FILE";
+     private static final String EXTRA_ACCOUNT = "ACCOUNT";
+     private static final String TAG = PreviewTextFragment.class.getSimpleName();
+     private Account mAccount;
+     private TextView mTextPreview;
+     private TextLoadAsyncTask mTextLoadTask;
+     /**
+      * Creates an empty fragment for previews.
+      * <p/>
+      * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically
+      * (for instance, when the device is turned a aside).
+      * <p/>
+      * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful
+      * construction
+      */
+     public PreviewTextFragment() {
+         super();
+         mAccount = null;
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                              Bundle savedInstanceState) {
+         super.onCreateView(inflater, container, savedInstanceState);
+         Log_OC.e(TAG, "onCreateView");
+         View ret = inflater.inflate(R.layout.text_file_preview, container, false);
+         mTextPreview = (TextView) ret.findViewById(R.id.text_preview);
+         return ret;
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public void onCreate(Bundle savedInstanceState) {
+         super.onCreate(savedInstanceState);
+         OCFile file = getFile();
+         Bundle args = getArguments();
+         if (file == null) {
+             file = args.getParcelable(FileDisplayActivity.EXTRA_FILE);
+         }
+         if (mAccount == null) {
+             mAccount = args.getParcelable(FileDisplayActivity.EXTRA_ACCOUNT);
+         }
+         if (savedInstanceState == null) {
+             if (file == null) {
+                 throw new IllegalStateException("Instanced with a NULL OCFile");
+             }
+             if (mAccount == null) {
+                 throw new IllegalStateException("Instanced with a NULL ownCloud Account");
+             }
+         } else {
+             file = savedInstanceState.getParcelable(EXTRA_FILE);
+             mAccount = savedInstanceState.getParcelable(EXTRA_ACCOUNT);
+         }
+         setFile(file);
+         setHasOptionsMenu(true);
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public void onSaveInstanceState(Bundle outState) {
+         super.onSaveInstanceState(outState);
+         outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile());
+         outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount);
+     }
+     @Override
+     public void onStart() {
+         super.onStart();
+         Log_OC.e(TAG, "onStart");
+         loadAndShowTextPreview();
+     }
+     private void loadAndShowTextPreview() {
+         mTextLoadTask = new TextLoadAsyncTask(new WeakReference<TextView>(mTextPreview));
+         mTextLoadTask.execute(getFile().getStoragePath());
+     }
+     /**
+      * Reads the file to preview and shows its contents. Too critical to be anonymous.
+      */
+     private class TextLoadAsyncTask extends AsyncTask<Object, Void, StringWriter> {
+         private final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
+         private final WeakReference<TextView> mTextViewReference;
+         private TextLoadAsyncTask(WeakReference<TextView> textView) {
+             mTextViewReference = textView;
+         }
+         @Override
+         protected void onPreExecute() {
+             showLoadingDialog();
+         }
+         @Override
+         protected StringWriter doInBackground(java.lang.Object... params) {
+             if (params.length != 1) {
+                 throw new IllegalArgumentException("The parameter to " + TextLoadAsyncTask.class.getName() + " must be (1) the file location");
+             }
+             final String location = (String) params[0];
+             FileInputStream inputStream = null;
+             Scanner sc = null;
+             StringWriter source = new StringWriter();
+             BufferedWriter bufferedWriter = new BufferedWriter(source);
+             try {
+                 inputStream = new FileInputStream(location);
+                 sc = new Scanner(inputStream);
+                 while (sc.hasNextLine()) {
+                     bufferedWriter.append(sc.nextLine());
+                     if (sc.hasNextLine()) bufferedWriter.append("\n");
+                 }
+                 bufferedWriter.close();
+                 IOException exc = sc.ioException();
+                 if (exc != null) throw exc;
+             } catch (IOException e) {
+                 Log_OC.e(TAG, e.getMessage(), e);
+                 finish();
+             } finally {
+                 if (inputStream != null) {
+                     try {
+                         inputStream.close();
+                     } catch (IOException e) {
+                         Log_OC.e(TAG, e.getMessage(), e);
+                         finish();
+                     }
+                 }
+                 if (sc != null) {
+                     sc.close();
+                 }
+             }
+             return source;
+         }
+         @Override
+         protected void onPostExecute(final StringWriter stringWriter) {
+             final TextView textView = mTextViewReference.get();
+             if (textView != null) {
+                 textView.setText(new String(stringWriter.getBuffer()));
+                 textView.setVisibility(View.VISIBLE);
+             }
+             dismissLoadingDialog();
+         }
+         /**
+          * Show loading dialog
+          */
+         public void showLoadingDialog() {
+             // Construct dialog
+             LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment));
+             FragmentManager fm = getActivity().getSupportFragmentManager();
+             FragmentTransaction ft = fm.beginTransaction();
+             loading.show(ft, DIALOG_WAIT_TAG);
+         }
+         /**
+          * Dismiss loading dialog
+          */
+         public void dismissLoadingDialog() {
+             final Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG);
+             if (frag != null) {
+                 LoadingDialog loading = (LoadingDialog) frag;
+                 loading.dismiss();
+             }
+         }
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+         super.onCreateOptionsMenu(menu, inflater);
+         inflater.inflate(R.menu.file_actions_menu, menu);
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public void onPrepareOptionsMenu(Menu menu) {
+         super.onPrepareOptionsMenu(menu);
+         if (mContainerActivity.getStorageManager() != null) {
+             FileMenuFilter mf = new FileMenuFilter(
+                     getFile(),
+                     mContainerActivity.getStorageManager().getAccount(),
+                     mContainerActivity,
+                     getSherlockActivity()
+             );
+             mf.filter(menu);
+         }
+         // additional restriction for this fragment
+         MenuItem item = menu.findItem(R.id.action_rename_file);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         // additional restriction for this fragment
+         item = menu.findItem(R.id.action_move);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         // this one doesn't make sense since the file has to be down in order to be previewed
+         item = menu.findItem(R.id.action_download_file);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_settings);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_logger);
+         if (item != null) {
+             item.setVisible(false);
+             item.setEnabled(false);
+         }
+         item = menu.findItem(R.id.action_sync_file);
+         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);
+         }
+     }
+     /**
+      * {@inheritDoc}
+      */
+     @Override
+     public boolean onOptionsItemSelected(MenuItem item) {
+         switch (item.getItemId()) {
+             case R.id.action_share_file: {
+                 mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile());
+                 return true;
+             }
+             case R.id.action_unshare_file: {
+                 mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile());
+                 return true;
+             }
+             case R.id.action_open_file_with: {
+                 openFile();
+                 return true;
+             }
+             case R.id.action_remove_file: {
+                 RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(getFile());
+                 dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION);
+                 return true;
+             }
+             case R.id.action_see_details: {
+                 seeDetails();
+                 return true;
+             }
+             case R.id.action_send_file: {
+                 sendFile();
+                 return true;
+             }
+             case R.id.action_sync_file: {
+                 mContainerActivity.getFileOperationsHelper().syncFile(getFile());
+                 return true;
+             }
+             default:
+                 return false;
+         }
+     }
+     /**
+      * Update the file of the fragment with file value
+      *
+      * @param file The new file to set
+      */
+     public void updateFile(OCFile file) {
+         setFile(file);
+     }
+     private void sendFile() {
+         mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
+     }
+     private void seeDetails() {
+         mContainerActivity.showDetails(getFile());
+     }
+     @Override
+     public void onPause() {
+         Log_OC.e(TAG, "onPause");
+         super.onPause();
+     }
+     @Override
+     public void onResume() {
+         super.onResume();
+         Log_OC.e(TAG, "onResume");
+     }
+     @Override
+     public void onDestroy() {
+         Log_OC.e(TAG, "onDestroy");
+         super.onDestroy();
+     }
+     @Override
+     public void onStop() {
+         super.onStop();
+         Log_OC.e(TAG, "onStop");
+         if (mTextLoadTask != null)
+             mTextLoadTask.cancel(Boolean.TRUE);
+     }
+     /**
+      * Opens the previewed file with an external application.
+      */
+     private void openFile() {
+         mContainerActivity.getFileOperationsHelper().openFile(getFile());
+         finish();
+     }
+     /**
+      * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewTextFragment} to be previewed.
+      *
+      * @param file File to test if can be previewed.
+      * @return 'True' if the file can be handled by the fragment.
+      */
+     public static boolean canBePreviewed(OCFile file) {
+         return (file != null && file.isDown() && file.isText());
+     }
+     /**
+      * Finishes the preview
+      */
+     private void finish() {
+         getActivity().runOnUiThread(new Runnable() {
+             @Override
+             public void run() {
+                 getSherlockActivity().onBackPressed();
+             }
+         });
+     }
+ }